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/pro/feedback/MesProFeedbackServiceImplTest.java |   83 +++++++++++++++++++++++++++++++++++------
 1 files changed, 71 insertions(+), 12 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
index c7e74c5..40d8c84 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImplTest.java
@@ -2,20 +2,30 @@
 
 import cn.hutool.core.collection.ListUtil;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackApproveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
+import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
+import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService;
 import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeService;
+import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceService;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi;
 import jakarta.annotation.Resource;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;
@@ -31,7 +41,7 @@
 /**
  * {@link MesProFeedbackServiceImpl} 鐨勫崟鍏冩祴璇�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Import(MesProFeedbackServiceImpl.class)
 public class MesProFeedbackServiceImplTest extends BaseDbUnitTest {
@@ -43,9 +53,15 @@
     private MesProFeedbackMapper feedbackMapper;
 
     @MockitoBean
+    private MesFeedbackParamService feedbackParamService;
+    @MockitoBean
     private MesProWorkOrderService workOrderService;
     @MockitoBean
     private MesProRouteProcessService routeProcessService;
+    @MockitoBean
+    private MesProWorkOrderBomService workOrderBomService;
+    @MockitoBean
+    private MesProWorkOrderProcessService workOrderProcessService;
     @MockitoBean
     private MesMdWorkstationService workstationService;
     @MockitoBean
@@ -53,9 +69,21 @@
     @MockitoBean
     private MesWmItemConsumeService itemConsumeService;
     @MockitoBean
+    private MesWmProductIssueService productIssueService;
+    @MockitoBean
     private MesWmProductProduceService productProduceService;
     @MockitoBean
     private MesWmProductProduceLineService produceLineService;
+    @MockitoBean
+    private MesProMpsApi mpsApi;
+    @MockitoBean
+    private MesMdAutoCodeRecordService autoCodeRecordService;
+    @MockitoBean
+    private MesMdmItemService mdmItemService;
+    @MockitoBean
+    private MdmItemBatchConfigApi itemBatchConfigApi;
+    @MockitoBean
+    private MesQcTemplateItemService templateItemService;
 
     @Test
     public void testUpdateProFeedbackWhenIpqcFinish_success_withUnqualified() {
@@ -68,6 +96,7 @@
             o.setTaskId(taskId);
             o.setWorkOrderId(workOrderId);
             o.setFeedbackQuantity(BigDecimal.valueOf(100));
+            resetFeedbackQuantities(o);
         });
         feedbackMapper.insert(feedback);
 
@@ -82,6 +111,7 @@
                 .build();
         when(produceLineService.getProductProduceLineListByFeedbackId(feedback.getId()))
                 .thenReturn(ListUtil.of(qualifiedLine, unqualifiedLine));
+        mockLastProcess(feedback.getProcessId());
 
         // 璋冪敤
         BigDecimal qualifiedQty = BigDecimal.valueOf(80);
@@ -126,6 +156,7 @@
             o.setTaskId(taskId);
             o.setWorkOrderId(workOrderId);
             o.setFeedbackQuantity(BigDecimal.valueOf(50));
+            resetFeedbackQuantities(o);
         });
         feedbackMapper.insert(feedback);
 
@@ -136,6 +167,7 @@
                 .build();
         when(produceLineService.getProductProduceLineListByFeedbackId(feedback.getId()))
                 .thenReturn(ListUtil.of(qualifiedLine));
+        mockLastProcess(feedback.getProcessId());
 
         // 璋冪敤
         feedbackService.updateProFeedbackWhenIpqcFinish(feedback.getId(), randomLongId(),
@@ -222,7 +254,7 @@
 
         // mock: 浜у搧浜у嚭鍗�
         MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class);
-        when(productProduceService.generateProductProduce(any(), eq(false))).thenReturn(produce);
+        when(productProduceService.generateProductProduce(any(), eq(false), any())).thenReturn(produce);
 
         // mock: 浜у嚭琛岋紙鐢ㄤ簬 updateTaskAndWorkOrderByFeedback锛�
         MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
@@ -232,7 +264,9 @@
                 .thenReturn(ListUtil.of(qualifiedLine));
 
         // 璋冪敤
-        boolean result = feedbackService.approveFeedback(feedback.getId());
+        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
+        reqVO.setId(feedback.getId());
+        boolean result = feedbackService.approveFeedback(reqVO);
 
         // 鏂█ 1锛氳繑鍥� true锛堝凡瀹屾垚锛�
         assertTrue(result);
@@ -243,7 +277,7 @@
         assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity()));
 
         // 鏂█ 3锛氳皟鐢ㄤ簡浜у嚭鍗曠敓鎴� + 鍏ュ簱 + 浠诲姟/宸ュ崟鏇存柊
-        verify(productProduceService).generateProductProduce(any(), eq(false));
+        verify(productProduceService).generateProductProduce(any(), eq(false), any());
         verify(productProduceService).finishProductProduce(produce.getId());
         verify(taskService).updateProducedQuantity(eq(feedback.getTaskId()),
                 any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class));
@@ -273,7 +307,9 @@
                 .thenReturn(routeProcess);
 
         // 璋冪敤
-        boolean result = feedbackService.approveFeedback(feedback.getId());
+        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
+        reqVO.setId(feedback.getId());
+        boolean result = feedbackService.approveFeedback(reqVO);
 
         // 鏂█ 1锛氳繑鍥� false锛堝緟妫�楠岋級
         assertFalse(result);
@@ -283,7 +319,7 @@
         assertEquals(MesProFeedbackStatusEnum.UNCHECK.getStatus(), updated.getStatus());
 
         // 鏂█ 3锛氱敓鎴愪簡寰呮浜у嚭鍗曪紝浣嗘病鏈� finishProductProduce
-        verify(productProduceService).generateProductProduce(any(), eq(true));
+        verify(productProduceService).generateProductProduce(any(), eq(true), any());
         verify(productProduceService, never()).finishProductProduce(anyLong());
 
         // 鏂█ 4锛氭病鏈夋洿鏂颁换鍔�/宸ュ崟鏁伴噺锛堢瓑 IPQC 鍥炶皟锛�
@@ -313,7 +349,9 @@
                 .thenReturn(routeProcess);
 
         // 璋冪敤
-        boolean result = feedbackService.approveFeedback(feedback.getId());
+        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
+        reqVO.setId(feedback.getId());
+        boolean result = feedbackService.approveFeedback(reqVO);
 
         // 鏂█ 1锛氳繑鍥� true锛堝凡瀹屾垚锛�
         assertTrue(result);
@@ -323,7 +361,7 @@
         assertEquals(MesProFeedbackStatusEnum.FINISHED.getStatus(), updated.getStatus());
 
         // 鏂█ 3锛氫笉鐢熸垚浜у嚭鍗曪紝涓嶆洿鏂颁换鍔�/宸ュ崟
-        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean());
+        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
         verify(taskService, never()).updateProducedQuantity(anyLong(), any(), any(), any());
     }
 
@@ -349,11 +387,13 @@
                 .thenReturn(routeProcess);
 
         // 璋冪敤锛屽簲璇ユ姏寮傚父
+        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
+        reqVO.setId(feedback.getId());
         assertThrows(Exception.class, () ->
-                feedbackService.approveFeedback(feedback.getId()));
+                feedbackService.approveFeedback(reqVO));
 
         // 鏂█锛氫笉搴旇鎵ц浠讳綍鍚庣画鎿嶄綔
-        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean());
+        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
         verify(itemConsumeService, never()).generateItemConsume(any());
     }
 
@@ -380,7 +420,9 @@
                 .thenReturn(routeProcess);
 
         // 璋冪敤
-        boolean result = feedbackService.approveFeedback(feedback.getId());
+        MesProFeedbackApproveReqVO reqVO = new MesProFeedbackApproveReqVO();
+        reqVO.setId(feedback.getId());
+        boolean result = feedbackService.approveFeedback(reqVO);
 
         // 鏂█ 1锛氳繑鍥� true锛堢洿鎺ュ畬鎴愶紝涓嶈蛋 UNCHECK锛�
         assertTrue(result);
@@ -391,7 +433,24 @@
         assertEquals(0, BigDecimal.ZERO.compareTo(updated.getUncheckQuantity()));
 
         // 鏂█ 3锛氶潪鍏抽敭宸ュ簭涓嶇敓鎴愪骇鍑哄崟
-        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean());
+        verify(productProduceService, never()).generateProductProduce(any(), anyBoolean(), any());
+    }
+
+    /** 娓呴櫎闅忔満鐢熸垚鐨勭疮璁℃暟閲忥紝渚夸簬鏂█鏈妫�楠岀殑鍥炲啓缁撴灉 */
+    private void resetFeedbackQuantities(MesProFeedbackDO feedback) {
+        feedback.setQualifiedQuantity(BigDecimal.ZERO);
+        feedback.setUnqualifiedQuantity(BigDecimal.ZERO);
+        feedback.setLaborScrapQuantity(BigDecimal.ZERO);
+        feedback.setMaterialScrapQuantity(BigDecimal.ZERO);
+        feedback.setOtherScrapQuantity(BigDecimal.ZERO);
+        feedback.setUncheckQuantity(BigDecimal.ZERO);
+    }
+
+    /** 鏈亾宸ュ簭杩斿洖褰撳墠鎶ュ伐宸ュ簭锛岄獙璇佷换鍔′笌宸ュ崟鐨勮繘搴﹀洖鍐� */
+    private void mockLastProcess(Long processId) {
+        MesProWorkOrderProcessDO lastProcess = new MesProWorkOrderProcessDO();
+        lastProcess.setProcessId(processId);
+        when(workOrderProcessService.getLastWorkOrderProcessByWorkOrderId(any())).thenReturn(lastProcess);
     }
 
 }

--
Gitblit v1.9.3