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/wm/productproduce/MesWmProductProduceServiceImplTest.java |   52 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
index a5d44f0..d4bfc85 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java
@@ -3,17 +3,25 @@
 import cn.hutool.core.collection.ListUtil;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+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.MesWmProductProduceDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductProduceStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
+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.wm.batch.MesWmBatchService;
+import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -51,7 +59,19 @@
     @MockitoBean
     private MesWmProductProduceDetailService productProduceDetailService;
     @MockitoBean
+    private MesWmProductProduceLineMapper produceLineMapper;
+    @MockitoBean
     private MesProWorkOrderService workOrderService;
+    @MockitoBean
+    private MesProWorkOrderProcessService workOrderProcessService;
+    @MockitoBean
+    private MesProRouteProductService routeProductService;
+    @MockitoBean
+    private MesProRouteProcessService routeProcessService;
+    @MockitoBean
+    private MesWmProductReceiptService productReceiptService;
+    @MockitoBean
+    private MesMdItemService itemService;
     @MockitoBean
     private MesWmBatchService batchService;
     @MockitoBean
@@ -86,6 +106,11 @@
         when(warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE)).thenReturn(wh);
         when(locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION)).thenReturn(loc);
         when(areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA)).thenReturn(area);
+        mockNotLastProcess();
+        MesMdItemDO item = new MesMdItemDO();
+        item.setId(itemId);
+        item.setMdmItemId(itemId);
+        when(itemService.validateItemExists(any())).thenReturn(item);
 
         // mock: 閫氳繃 sourceLineId 鐩存帴瀹氫綅 PENDING 浜у嚭琛�
         MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder()
@@ -94,8 +119,7 @@
                 .batchId(batchId).batchCode(batchCode)
                 .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
                 .build();
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
-                .thenReturn(pendingLine);
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(pendingLine);
 
         // mock: finishProductProduce 鍐呴儴鏌ヨ鍜屾槑缁嗭紙鐢ㄤ簬鍒涘缓搴撳瓨浜嬪姟锛�
         MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
@@ -113,9 +137,9 @@
 
         // mock: finishProductProduce 涓寜琛屾煡鏄庣粏
         MesWmProductProduceDetailDO qualifiedDetail = MesWmProductProduceDetailDO.builder()
-                .lineId(100L).quantity(BigDecimal.valueOf(80)).build();
+                .lineId(100L).quantity(BigDecimal.valueOf(80)).warehouseId(whId).build();
         MesWmProductProduceDetailDO unqualifiedDetail = MesWmProductProduceDetailDO.builder()
-                .lineId(101L).quantity(BigDecimal.valueOf(20)).build();
+                .lineId(101L).quantity(BigDecimal.valueOf(20)).warehouseId(whId).build();
         when(productProduceDetailService.getProductProduceDetailListByLineId(100L))
                 .thenReturn(ListUtil.of(qualifiedDetail));
         when(productProduceDetailService.getProductProduceDetailListByLineId(101L))
@@ -147,8 +171,8 @@
         MesWmProductProduceDO updatedProduce = productProduceMapper.selectById(produce.getId());
         assertEquals(MesWmProductProduceStatusEnum.FINISHED.getStatus(), updatedProduce.getStatus());
 
-        // 鏂█ 5锛氬垱寤轰簡搴撳瓨浜嬪姟
-        verify(wmTransactionService, times(2)).createTransaction(any());
+        // 鏂█ 5锛氬彧涓哄悎鏍煎搧琛屽垱寤哄簱瀛樹簨鍔★紙涓嶅悎鏍煎搧涓嶈鍏ュ彲鐢ㄥ簱瀛橈級
+        verify(wmTransactionService, times(1)).createTransaction(any());
     }
 
     @Test
@@ -172,6 +196,7 @@
         when(warehouseService.getWarehouseByCode(any())).thenReturn(wh);
         when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc);
         when(areaService.getWarehouseAreaByCode(any())).thenReturn(area);
+        mockNotLastProcess();
 
         // mock: 閫氳繃 sourceLineId 鐩存帴瀹氫綅 PENDING 浜у嚭琛�
         MesWmProductProduceLineDO pendingLine = MesWmProductProduceLineDO.builder()
@@ -179,8 +204,7 @@
                 .itemId(itemId).quantity(BigDecimal.valueOf(50))
                 .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
                 .build();
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
-                .thenReturn(pendingLine);
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(pendingLine);
 
         // mock: finishProductProduce 鏌ヨ鍜屾槑缁�
         MesWmProductProduceLineDO qualifiedLine = MesWmProductProduceLineDO.builder()
@@ -245,9 +269,8 @@
         when(locationService.getWarehouseLocationByCode(any())).thenReturn(loc);
         when(areaService.getWarehouseAreaByCode(any())).thenReturn(area);
 
-        // mock: validateProductProduceLineExists 鎶涘紓甯�
-        when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
-                .thenThrow(new ServiceException(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS));
+        // mock: 浜у嚭琛屼笉瀛樺湪
+        when(produceLineMapper.selectByIdForUpdate(sourceLineId)).thenReturn(null);
 
         // 璋冪敤锛屽簲璇ユ姏寮傚父
         ServiceException ex = assertThrows(ServiceException.class, () ->
@@ -256,4 +279,11 @@
         assertEquals(WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS.getCode(), ex.getCode());
     }
 
+    /** 鏈亾宸ュ簭杩斿洖闈炲綋鍓嶅伐搴忥紝閬垮厤娴嬭瘯璧板埌纭垏鏈亾宸ュ簭鐨勪粨搴撴牎楠屽垎鏀� */
+    private void mockNotLastProcess() {
+        MesProWorkOrderProcessDO lastProcess = new MesProWorkOrderProcessDO();
+        lastProcess.setProcessId(-1L);
+        when(workOrderProcessService.getLastWorkOrderProcessByWorkOrderId(any())).thenReturn(lastProcess);
+    }
+
 }

--
Gitblit v1.9.3