| | |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.MesQcCompletionHelper; |
| | | import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.junit.jupiter.api.BeforeEach; |
| | | import org.junit.jupiter.api.Test; |
| | | import org.springframework.context.annotation.Import; |
| | | import org.springframework.test.context.bean.override.mockito.MockitoBean; |
| | |
| | | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | import static org.junit.jupiter.api.Assertions.*; |
| | | import static org.mockito.ArgumentMatchers.*; |
| | | import static org.mockito.Mockito.*; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Import(MesQcIpqcServiceImpl.class) |
| | | public class MesQcIpqcServiceImplTest extends BaseDbUnitTest { |
| | | |
| | | @MockitoBean |
| | | private cn.iocoder.yudao.module.mes.service.qc.imports.MesQcImportHelper qcImportHelper; |
| | | @MockitoBean |
| | | private cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService ncrService; |
| | | |
| | | @Resource |
| | | private MesQcIpqcServiceImpl ipqcService; |
| | |
| | | private MesQcIndicatorResultService indicatorResultService; |
| | | @MockitoBean |
| | | private MesWmProductProduceLineService productProduceLineService; |
| | | @MockitoBean |
| | | private MesQcCompletionHelper completionHelper; |
| | | |
| | | @BeforeEach |
| | | void stubCompletionHelper() { |
| | | when(completionHelper.validateAndGetResult(anyString(), anyLong(), any(), any(), any())).thenReturn(1); |
| | | } |
| | | |
| | | @Test |
| | | public void testFinishIpqc_writeBack_feedback() { |
| | |
| | | } |
| | | |
| | | @Test |
| | | public void testFinishIpqc_checkResultEmpty() { |
| | | // 准备数据:checkResult 为空,应该报错 |
| | | public void testFinishIpqc_checkResultAutoComputed() { |
| | | // 准备数据:检测结论不再由用户填写,完成时按合格/不合格数量自动判定 |
| | | MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> { |
| | | o.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | o.setCheckResult(null); // 检测结论为空 |
| | | o.setCheckResult(null); |
| | | o.setSourceDocType(null); |
| | | o.setSourceDocId(null); |
| | | o.setSourceLineId(null); |
| | | o.setCheckQuantity(BigDecimal.valueOf(100)); |
| | | o.setQualifiedQuantity(BigDecimal.valueOf(100)); |
| | | o.setUnqualifiedQuantity(BigDecimal.ZERO); |
| | | }); |
| | | ipqcMapper.insert(ipqc); |
| | | |
| | | // 调用,应该抛异常(检测结论必填) |
| | | assertThrows(Exception.class, () -> ipqcService.finishIpqc(ipqc.getId())); |
| | | // 调用 |
| | | ipqcService.finishIpqc(ipqc.getId()); |
| | | |
| | | // 断言:检测结论由系统判定并回写 |
| | | MesQcIpqcDO updatedIpqc = ipqcMapper.selectById(ipqc.getId()); |
| | | assertEquals(MesQcStatusEnum.FINISHED.getStatus(), updatedIpqc.getStatus()); |
| | | assertEquals(1, updatedIpqc.getCheckResult()); |
| | | } |
| | | |
| | | @Test |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | // 生产完成后仍可手工补录质检。 |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.FINISHED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock 模板匹配 |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | // mock 工艺路线 |
| | | MesProRouteProductDO routeProduct = new MesProRouteProductDO(); |
| | | routeProduct.setRouteId(routeId); |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock 任务 |
| | |
| | | task.setWorkOrderId(workOrderId); |
| | | task.setWorkstationId(workstationId); |
| | | task.setItemId(productId); |
| | | when(taskService.validateTaskNotFinished(taskId)).thenReturn(task); |
| | | when(taskService.validateTaskExists(taskId)).thenReturn(task); |
| | | // mock 模板匹配 |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | |
| | | // 调用 |
| | | Long ipqcId = ipqcService.createIpqc(reqVO); |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | // mock 模板匹配 |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | // mock 工艺路线存在 |
| | | MesProRouteProductDO routeProduct = new MesProRouteProductDO(); |
| | | routeProduct.setRouteId(routeId); |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | |
| | | // 调用,断言异常 |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | // mock:产出行存在但 feedbackId 不匹配 |
| | | MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO()); |
| | | // mock:产出行存在且归属正确,但不是 PENDING 状态 |
| | | MesWmProductProduceLineDO line = new MesWmProductProduceLineDO(); |
| | |
| | | MesProWorkOrderDO workOrder = new MesProWorkOrderDO(); |
| | | workOrder.setId(workOrderId); |
| | | workOrder.setProductId(productId); |
| | | workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus()); |
| | | when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder); |
| | | when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder); |
| | | MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO(); |
| | | templateItem.setTemplateId(templateId); |
| | | when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem); |
| | | when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem)); |
| | | MesProFeedbackDO feedback = new MesProFeedbackDO(); |
| | | feedback.setId(feedbackId); |
| | | feedback.setCode("FB-001"); |