From f02d0df2f1dfc7a8b775cf50d45375e57628a5ef Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 10 十一月 2026 11:26:22 +0800
Subject: [PATCH] feat(ncr): 完善NCR处置联动逻辑与关闭校验

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcAutoCreateTest.java |   28 ++++++++++++++++++++++------
 1 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcAutoCreateTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcAutoCreateTest.java
index 432e8b9..afb8ace 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcAutoCreateTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcAutoCreateTest.java
@@ -1,11 +1,12 @@
 package cn.iocoder.yudao.module.mes.service.qc.oqc;
 
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
+import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
+import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcMapper;
-import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService;
 import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -25,18 +26,19 @@
 class MesQcOqcAutoCreateTest {
     @InjectMocks private MesQcOqcServiceImpl service;
     @Mock private MesQcOqcMapper mapper;
-    @Mock private MesQcTemplateItemService templates;
     @Mock private MesQcOqcLineService lines;
     @Mock private MesWmProductSalesService sales;
+    @Mock private ErpSaleOrderApi saleOrderApi;
 
     @Test
     void generatedInspectionUsesHistoricalShipmentDateAndPreservesPendingQuantities() {
         LocalDateTime date = LocalDateTime.of(2026, 9, 23, 15, 30);
-        when(templates.getRequiredTemplateByItemIdAndType(10L, 3))
-                .thenReturn(new MesQcTemplateItemDO().setTemplateId(20L));
         when(sales.getProductSales(30L)).thenReturn(new MesWmProductSalesDO().setSalesDate(date));
         MesWmProductSalesLineDO line = new MesWmProductSalesLineDO().setId(40L)
-                .setItemId(10L).setQuantity(BigDecimal.valueOf(200)).setBatchCode("B001");
+                .setItemId(10L).setSaleOrderItemId(60L).setQuantity(BigDecimal.valueOf(200)).setBatchCode("B001");
+        ErpSaleOrderItemRespDTO saleItem = new ErpSaleOrderItemRespDTO();
+        saleItem.setReelNo("PAN-001");
+        when(saleOrderApi.getSaleOrderItem(60L)).thenReturn(CommonResult.success(saleItem));
         service.createOqcFromProductSales(30L, line, "SL001", 50L);
         ArgumentCaptor<MesQcOqcDO> captor = ArgumentCaptor.forClass(MesQcOqcDO.class);
         verify(mapper).insert(captor.capture());
@@ -48,5 +50,19 @@
         assertEquals(BigDecimal.ZERO, row.getQualifiedQuantity());
         assertEquals(30L, row.getSourceDocId());
         assertEquals(40L, row.getSourceLineId());
+        assertEquals("PAN-001", row.getReelNo());
+    }
+
+    @Test
+    void historicalShipmentWithoutSaleItemDoesNotGuessReel() {
+        MesWmProductSalesLineDO line = new MesWmProductSalesLineDO().setId(40L)
+                .setItemId(10L).setQuantity(BigDecimal.ONE);
+
+        service.createOqcFromProductSales(30L, line, "SL001", 50L);
+
+        ArgumentCaptor<MesQcOqcDO> captor = ArgumentCaptor.forClass(MesQcOqcDO.class);
+        verify(mapper).insert(captor.capture());
+        assertNull(captor.getValue().getReelNo());
+        verifyNoInteractions(saleOrderApi);
     }
 }

--
Gitblit v1.9.3