| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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() { |
| | |
| | | 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); |
| | | |
| | |
| | | // 断言:验证状态更新为已完成 |
| | | 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 |
| | |
| | | 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); |
| | | }); |
| | |
| | | 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 |
| | |
| | | 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 |