From ac2e2b5af3726ee64dc37c3ebf26989a0346f22a Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 07 十一月 2026 19:16:05 +0800
Subject: [PATCH] feat(feedback): 优化报工审批流程并增加报工人校验

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java |   54 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java
index 7207edb..307167c 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java
@@ -13,6 +13,9 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.ipqc.MesQcIpqcMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
+import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
@@ -81,6 +84,12 @@
     private MesQcIndicatorResultService indicatorResultService;
     @MockitoBean
     private MesWmProductProduceLineService productProduceLineService;
+    @MockitoBean
+    private MesWmProductProduceLineMapper produceLineMapper;
+    @MockitoBean
+    private MesProFeedbackMapper feedbackMapper;
+    @MockitoBean
+    private MesQcNcrService ncrService;
 
     @Test
     public void testFinishIpqc_writeBack_feedback() {
@@ -101,11 +110,17 @@
             o.setSourceLineId(sourceLineId);
             o.setQualifiedQuantity(qualifiedQty);
             o.setUnqualifiedQuantity(unqualifiedQty);
+            o.setCheckQuantity(qualifiedQty.add(unqualifiedQty));
             o.setLaborScrapQuantity(laborScrapQty);
             o.setMaterialScrapQuantity(materialScrapQty);
             o.setOtherScrapQuantity(otherScrapQty);
         });
         ipqcMapper.insert(ipqc);
+
+        when(feedbackMapper.selectOne(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))).thenReturn(new MesProFeedbackDO());
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(MesWmProductProduceLineDO.builder()
+                .feedbackId(sourceDocId).qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
+                .quantity(BigDecimal.valueOf(100)).build());
 
         // 璋冪敤
         ipqcService.finishIpqc(ipqc.getId());
@@ -145,18 +160,9 @@
         });
         ipqcMapper.insert(ipqc);
 
-        // 璋冪敤
-        ipqcService.finishIpqc(ipqc.getId());
-
-        // 鏂█锛氭墍鏈夋暟閲忓弬鏁伴兘鏄� BigDecimal.ZERO锛坉efaultIfNull 澶勭悊锛�
-        verify(feedbackService).updateProFeedbackWhenIpqcFinish(
-                eq(sourceDocId),
-                eq(sourceLineId),
-                eq(BigDecimal.ZERO),
-                eq(BigDecimal.ZERO),
-                eq(BigDecimal.ZERO),
-                eq(BigDecimal.ZERO),
-                eq(BigDecimal.ZERO));
+        when(feedbackMapper.selectOne(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))).thenReturn(new MesProFeedbackDO());
+        assertEquals(QC_IPQC_QUANTITY_INVALID.getCode(),
+                assertThrows(ServiceException.class, () -> ipqcService.finishIpqc(ipqc.getId())).getCode());
     }
 
     @Test
@@ -168,6 +174,12 @@
             o.setSourceDocType(null);
             o.setSourceDocId(null);
             o.setSourceLineId(null);
+            o.setCheckQuantity(BigDecimal.ONE);
+            o.setQualifiedQuantity(BigDecimal.ONE);
+            o.setUnqualifiedQuantity(BigDecimal.ZERO);
+            o.setLaborScrapQuantity(BigDecimal.ZERO);
+            o.setMaterialScrapQuantity(BigDecimal.ZERO);
+            o.setOtherScrapQuantity(BigDecimal.ZERO);
         });
         ipqcMapper.insert(ipqc);
 
@@ -196,7 +208,7 @@
         ipqcMapper.insert(ipqc);
 
         // 璋冪敤锛屽苟鏂█寮傚父
-        assertThrows(IllegalArgumentException.class, () -> ipqcService.finishIpqc(ipqc.getId()));
+        assertThrows(ServiceException.class, () -> ipqcService.finishIpqc(ipqc.getId()));
     }
 
     @Test
@@ -212,7 +224,7 @@
         ipqcMapper.insert(ipqc);
 
         // 璋冪敤锛屽苟鏂█寮傚父
-        assertThrows(IllegalArgumentException.class, () -> ipqcService.finishIpqc(ipqc.getId()));
+        assertThrows(ServiceException.class, () -> ipqcService.finishIpqc(ipqc.getId()));
     }
 
     @Test
@@ -437,7 +449,7 @@
 
         // 璋冪敤锛屾柇瑷�寮傚父
         ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO));
-        assertEquals(QC_IPQC_SOURCE_LINE_REQUIRED.getCode(), ex.getCode());
+        assertEquals(QC_IPQC_SOURCE_INCOMPLETE.getCode(), ex.getCode());
     }
 
     /**
@@ -481,7 +493,8 @@
         line.setId(sourceLineId);
         line.setFeedbackId(randomLongId()); // 涓嶅悓鐨� feedbackId
         line.setQualityStatus(MesWmQualityStatusEnum.PENDING.getStatus());
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line);
+        when(feedbackMapper.selectOne(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))).thenReturn(new MesProFeedbackDO());
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(line);
 
         // 璋冪敤锛屾柇瑷�寮傚父
         ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO));
@@ -529,7 +542,8 @@
         line.setId(sourceLineId);
         line.setFeedbackId(feedbackId);
         line.setQualityStatus(MesWmQualityStatusEnum.PASS.getStatus()); // 宸插悎鏍硷紝闈炲緟妫�
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line);
+        when(feedbackMapper.selectOne(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))).thenReturn(new MesProFeedbackDO());
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(line);
 
         // 璋冪敤锛屾柇瑷�寮傚父
         ServiceException ex = assertThrows(ServiceException.class, () -> ipqcService.createIpqc(reqVO));
@@ -574,13 +588,17 @@
         MesProFeedbackDO feedback = new MesProFeedbackDO();
         feedback.setId(feedbackId);
         feedback.setCode("FB-001");
+        feedback.setWorkOrderId(workOrderId);
+        feedback.setItemId(productId);
         when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(feedback);
+        when(feedbackMapper.selectOne(any(com.baomidou.mybatisplus.core.conditions.Wrapper.class))).thenReturn(feedback);
         // mock锛氫骇鍑鸿瀛樺湪銆佸綊灞炴纭�丳ENDING 鐘舵��
         MesWmProductProduceLineDO line = new MesWmProductProduceLineDO();
         line.setId(sourceLineId);
         line.setFeedbackId(feedbackId);
+        line.setItemId(productId);
         line.setQualityStatus(MesWmQualityStatusEnum.PENDING.getStatus());
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId)).thenReturn(line);
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(line);
 
         // 璋冪敤
         Long ipqcId = ipqcService.createIpqc(reqVO);

--
Gitblit v1.9.3