From ffca46b39d25439a06a27cafda2ec523a3fb67cf Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 17:53:02 +0800
Subject: [PATCH] feat(mes): 增加盘号字段支持和优化报工质检流程

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImplTest.java |   75 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 72 insertions(+), 3 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..dc968fc 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
@@ -4,6 +4,8 @@
 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.wm.productproduce.MesWmProductProduceDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 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;
@@ -13,6 +15,8 @@
 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.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -53,6 +57,10 @@
     @MockitoBean
     private MesProWorkOrderService workOrderService;
     @MockitoBean
+    private MesProWorkOrderProcessService workOrderProcessService;
+    @MockitoBean
+    private MesProRouteProductService routeProductService;
+    @MockitoBean
     private MesWmBatchService batchService;
     @MockitoBean
     private MesWmTransactionService wmTransactionService;
@@ -62,6 +70,63 @@
     private MesWmWarehouseLocationService locationService;
     @MockitoBean
     private MesWmWarehouseAreaService areaService;
+
+    @Test
+    public void testGeneratePendingProduceCopiesOrderReel() {
+        MesProFeedbackDO feedback = new MesProFeedbackDO().setId(2L).setWorkOrderId(3L)
+                .setTaskId(4L).setItemId(5L).setFeedbackQuantity(BigDecimal.TEN);
+        when(workOrderService.getWorkOrder(3L)).thenReturn(new MesProWorkOrderDO().setReelNo("PAN-001"));
+
+        productProduceService.generateProductProduce(feedback, true, null);
+
+        ArgumentCaptor<MesWmProductProduceLineDO> captor = ArgumentCaptor.forClass(MesWmProductProduceLineDO.class);
+        verify(productProduceLineService).createProductProduceLine(captor.capture());
+        assertEquals("PAN-001", captor.getValue().getReelNo());
+        assertEquals(MesWmQualityStatusEnum.PENDING.getStatus(), captor.getValue().getQualityStatus());
+    }
+
+    @Test
+    public void testGenerateProduceRejectsDirectInbound() {
+        ServiceException ex = assertThrows(ServiceException.class,
+                () -> productProduceService.generateProductProduce(new MesProFeedbackDO(), false, null));
+        assertEquals(WM_PRODUCT_PRODUCE_QUALITY_PENDING.getCode(), ex.getCode());
+        verifyNoInteractions(wmTransactionService);
+    }
+
+    @Test
+    public void testFinishProductProduceRejectsPendingInspection() {
+        MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class,
+                o -> o.setStatus(MesWmProductProduceStatusEnum.PREPARE.getStatus()));
+        productProduceMapper.insert(produce);
+        MesWmProductProduceLineDO pending = MesWmProductProduceLineDO.builder()
+                .id(1L).produceId(produce.getId()).quantity(BigDecimal.TEN)
+                .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()).build();
+        when(productProduceLineService.getProductProduceLineListByProduceId(produce.getId()))
+                .thenReturn(ListUtil.of(pending));
+
+        ServiceException ex = assertThrows(ServiceException.class,
+                () -> productProduceService.finishProductProduce(produce.getId()));
+        assertEquals(WM_PRODUCT_PRODUCE_QUALITY_PENDING.getCode(), ex.getCode());
+        verify(wmTransactionService, never()).createTransaction(any());
+    }
+
+    @Test
+    public void testSplitPendingRejectsWrongQuantity() {
+        Long feedbackId = randomLongId();
+        MesWmProductProduceDO produce = randomPojo(MesWmProductProduceDO.class,
+                o -> o.setFeedbackId(feedbackId).setStatus(MesWmProductProduceStatusEnum.PREPARE.getStatus()));
+        productProduceMapper.insert(produce);
+        MesWmProductProduceLineDO pending = MesWmProductProduceLineDO.builder()
+                .id(1L).produceId(produce.getId()).feedbackId(feedbackId).quantity(BigDecimal.TEN)
+                .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus()).build();
+        when(productProduceLineService.validateProductProduceLineExists(1L)).thenReturn(pending);
+
+        ServiceException ex = assertThrows(ServiceException.class,
+                () -> productProduceService.splitPendingAndFinishProduce(feedbackId, 1L,
+                        BigDecimal.valueOf(9), BigDecimal.ZERO));
+        assertEquals(WM_PRODUCT_PRODUCE_INSPECTION_INVALID.getCode(), ex.getCode());
+        verify(wmTransactionService, never()).createTransaction(any());
+    }
 
     @Test
     public void testSplitPendingAndFinishProduce_withUnqualified() {
@@ -92,6 +157,7 @@
                 .id(sourceLineId).produceId(produce.getId()).feedbackId(feedbackId)
                 .itemId(itemId).quantity(BigDecimal.valueOf(100))
                 .batchId(batchId).batchCode(batchCode)
+                .reelNo("PAN-001")
                 .qualityStatus(MesWmQualityStatusEnum.PENDING.getStatus())
                 .build();
         when(productProduceLineService.validateProductProduceLineExists(sourceLineId))
@@ -132,6 +198,7 @@
         assertEquals(MesWmQualityStatusEnum.FAIL.getStatus(), createdLine.getQualityStatus());
         assertEquals(0, BigDecimal.valueOf(20).compareTo(createdLine.getQuantity()));
         assertEquals(itemId, createdLine.getItemId());
+        assertEquals("PAN-001", createdLine.getReelNo());
 
         // 鏂█ 2锛氬師寰呮琛� - 鏇存柊涓哄悎鏍煎搧
         ArgumentCaptor<MesWmProductProduceLineDO> updateCaptor = ArgumentCaptor.forClass(MesWmProductProduceLineDO.class);
@@ -141,14 +208,16 @@
         assertEquals(0, BigDecimal.valueOf(80).compareTo(updatedLine.getQuantity()));
 
         // 鏂█ 3锛氱敓鎴愪簡 2 鏉℃槑缁嗭紙涓嶅悎鏍煎搧鏄庣粏 + 鍚堟牸鍝佹槑缁嗭級
-        verify(productProduceDetailService, times(2)).createProductProduceDetail(any());
+        ArgumentCaptor<MesWmProductProduceDetailDO> detailCaptor = ArgumentCaptor.forClass(MesWmProductProduceDetailDO.class);
+        verify(productProduceDetailService, times(2)).createProductProduceDetail(detailCaptor.capture());
+        assertTrue(detailCaptor.getAllValues().stream().allMatch(d -> "PAN-001".equals(d.getReelNo())));
 
         // 鏂█ 4锛氫骇鍑哄崟鐘舵�佹洿鏂颁负宸插畬鎴�
         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

--
Gitblit v1.9.3