云
9 小时以前 c215f6c20445b973ff730dcdf4206426992da81d
yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImplTest.java
@@ -2,6 +2,7 @@
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcRetestReqVO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
@@ -11,6 +12,9 @@
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService;
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService;
import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
@@ -55,6 +59,12 @@
    private AdminUserApi adminUserApi;
    @MockitoBean
    private MesQcIndicatorResultService indicatorResultService;
    @MockitoBean
    private MesQcNcrService ncrService;
    @MockitoBean
    private MdmItemApi mdmItemApi;
    @MockitoBean
    private CrmCustomerApi customerApi;
    @Test
    public void testFinishOqc_writeBack_productSales() {
@@ -66,6 +76,9 @@
            o.setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES);
            o.setSourceLineId(sourceLineId);
            o.setCheckResult(checkResult);
            o.setUnqualifiedQuantity(java.math.BigDecimal.ZERO);
            o.setQualifiedQuantity(java.math.BigDecimal.TEN);
            o.setCheckQuantity(java.math.BigDecimal.TEN);
        });
        oqcMapper.insert(oqc);
@@ -75,9 +88,83 @@
        // 断言:验证状态更新为已完成
        MesQcOqcDO updatedOqc = oqcMapper.selectById(oqc.getId());
        assertEquals(MesQcStatusEnum.FINISHED.getStatus(), updatedOqc.getStatus());
        // 断言:验证回写销售出库单行
        assertEquals(20, updatedOqc.getWorkflowStatus());
        // 初检完成不放行;销售部和公司质检均审批后才回写。
        verify(productSalesLineService, never()).updateProductSalesLineWhenOqcFinish(anyLong(), anyLong(), anyInt());
        oqcService.salesApprove(oqc.getId(), true, "销售部同意");
        oqcService.companyApprove(oqc.getId(), true, "公司质检同意");
        verify(productSalesLineService).updateProductSalesLineWhenOqcFinish(
                eq(sourceLineId), eq(oqc.getId()), eq(checkResult));
    }
    @Test
    public void testFailedInitialRetestPassOnlyReleasesAfterBothApprovals() {
        Long sourceLineId = randomLongId();
        MesQcOqcDO oqc = randomPojo(MesQcOqcDO.class, o -> {
            o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
            o.setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES);
            o.setSourceLineId(sourceLineId);
            o.setOutQuantity(java.math.BigDecimal.valueOf(100));
            o.setCheckQuantity(java.math.BigDecimal.TEN);
            o.setQualifiedQuantity(java.math.BigDecimal.valueOf(9));
            o.setUnqualifiedQuantity(java.math.BigDecimal.ONE);
            o.setCheckResult(2);
        });
        oqcMapper.insert(oqc);
        oqcService.finishOqc(oqc.getId());
        assertEquals(10, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verifyNoInteractions(ncrService);
        verify(productSalesLineService, never()).updateProductSalesLineWhenOqcFinish(anyLong(), anyLong(), anyInt());
        MesQcOqcRetestReqVO retest = new MesQcOqcRetestReqVO();
        retest.setId(oqc.getId());
        retest.setCheckQuantity(java.math.BigDecimal.TEN);
        retest.setQualifiedQuantity(java.math.BigDecimal.TEN);
        retest.setUnqualifiedQuantity(java.math.BigDecimal.ZERO);
        retest.setCheckResult(1);
        oqcService.retestOqc(retest);
        assertEquals(20, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        oqcService.salesApprove(oqc.getId(), true, "销售部通过");
        assertEquals(30, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verify(productSalesLineService, never()).updateProductSalesLineWhenOqcFinish(anyLong(), anyLong(), anyInt());
        oqcService.companyApprove(oqc.getId(), true, "公司质检通过");
        assertEquals(40, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verify(productSalesLineService).updateProductSalesLineWhenOqcFinish(sourceLineId, oqc.getId(), 1);
        verifyNoInteractions(ncrService);
    }
    @Test
    public void testFailedRetestCreatesNcrOnlyAfterCompanyApproval() {
        Long sourceLineId = randomLongId();
        MesQcOqcDO oqc = randomPojo(MesQcOqcDO.class, o -> {
            o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
            o.setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES);
            o.setSourceLineId(sourceLineId);
            o.setOutQuantity(java.math.BigDecimal.valueOf(100));
            o.setCheckQuantity(java.math.BigDecimal.TEN);
            o.setQualifiedQuantity(java.math.BigDecimal.valueOf(9));
            o.setUnqualifiedQuantity(java.math.BigDecimal.ONE);
            o.setCheckResult(2);
        });
        oqcMapper.insert(oqc);
        oqcService.finishOqc(oqc.getId());
        MesQcOqcRetestReqVO retest = new MesQcOqcRetestReqVO();
        retest.setId(oqc.getId());
        retest.setCheckQuantity(java.math.BigDecimal.TEN);
        retest.setQualifiedQuantity(java.math.BigDecimal.valueOf(8));
        retest.setUnqualifiedQuantity(java.math.BigDecimal.valueOf(2));
        retest.setCheckResult(2);
        retest.setOpinion("复检仍不合格");
        oqcService.retestOqc(retest);
        assertEquals(50, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verifyNoInteractions(ncrService);
        oqcService.salesApprove(oqc.getId(), true, "销售部确认不合格");
        assertEquals(60, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verifyNoInteractions(ncrService);
        oqcService.companyApprove(oqc.getId(), true, "公司质检确认不合格");
        assertEquals(70, oqcMapper.selectById(oqc.getId()).getWorkflowStatus());
        verify(ncrService).createNcr(any());
        verify(productSalesLineService).updateProductSalesLineWhenOqcFinish(sourceLineId, oqc.getId(), 2);
    }
    @Test
@@ -86,6 +173,9 @@
        MesQcOqcDO oqc = randomPojo(MesQcOqcDO.class, o -> {
            o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
            o.setCheckResult(1);
            o.setUnqualifiedQuantity(java.math.BigDecimal.ZERO);
            o.setQualifiedQuantity(java.math.BigDecimal.TEN);
            o.setCheckQuantity(java.math.BigDecimal.TEN);
            o.setSourceDocType(null);
            o.setSourceLineId(null);
        });
@@ -108,13 +198,17 @@
        MesQcOqcDO oqc = randomPojo(MesQcOqcDO.class, o -> {
            o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
            o.setCheckResult(1);
            o.setUnqualifiedQuantity(java.math.BigDecimal.ZERO);
            o.setQualifiedQuantity(java.math.BigDecimal.TEN);
            o.setCheckQuantity(java.math.BigDecimal.TEN);
            o.setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES);
            o.setSourceLineId(null); // 脏数据
        });
        oqcMapper.insert(oqc);
        // 调用,并断言异常
        assertThrows(IllegalArgumentException.class, () -> oqcService.finishOqc(oqc.getId()));
        oqcService.finishOqc(oqc.getId());
        oqcService.salesApprove(oqc.getId(), true, "销售部同意");
        assertThrows(IllegalArgumentException.class, () -> oqcService.companyApprove(oqc.getId(), true, "公司质检同意"));
    }
    @Test
@@ -123,13 +217,17 @@
        MesQcOqcDO oqc = randomPojo(MesQcOqcDO.class, o -> {
            o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
            o.setCheckResult(1);
            o.setUnqualifiedQuantity(java.math.BigDecimal.ZERO);
            o.setQualifiedQuantity(java.math.BigDecimal.TEN);
            o.setCheckQuantity(java.math.BigDecimal.TEN);
            o.setSourceDocType(99999); // 无法识别的类型
            o.setSourceLineId(randomLongId());
        });
        oqcMapper.insert(oqc);
        // 调用,并断言异常
        assertThrows(IllegalArgumentException.class, () -> oqcService.finishOqc(oqc.getId()));
        oqcService.finishOqc(oqc.getId());
        oqcService.salesApprove(oqc.getId(), true, "销售部同意");
        assertThrows(IllegalArgumentException.class, () -> oqcService.companyApprove(oqc.getId(), true, "公司质检同意"));
    }
    @Test