From cccbfadcb6e96c23a33c40c0687a27c2f6efa1db Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 09 十一月 2026 13:16:42 +0800
Subject: [PATCH] feat(seal): 添加印章详情及图片预览功能

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImplTest.java |   59 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 46 insertions(+), 13 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..9f62951 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
@@ -23,12 +23,14 @@
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
 import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.mes.service.qc.MesQcCompletionHelper;
 import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService;
 import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
 import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import jakarta.annotation.Resource;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;
 import org.springframework.test.context.bean.override.mockito.MockitoBean;
@@ -39,6 +41,7 @@
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 /**
@@ -48,6 +51,11 @@
  */
 @Import(MesQcIpqcServiceImpl.class)
 public class MesQcIpqcServiceImplTest extends BaseDbUnitTest {
+
+    @MockitoBean
+    private cn.iocoder.yudao.module.mes.service.qc.imports.MesQcImportHelper qcImportHelper;
+    @MockitoBean
+    private cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService ncrService;
 
     @Resource
     private MesQcIpqcServiceImpl ipqcService;
@@ -81,6 +89,13 @@
     private MesQcIndicatorResultService indicatorResultService;
     @MockitoBean
     private MesWmProductProduceLineService productProduceLineService;
+    @MockitoBean
+    private MesQcCompletionHelper completionHelper;
+
+    @BeforeEach
+    void stubCompletionHelper() {
+        when(completionHelper.validateAndGetResult(anyString(), anyLong(), any(), any(), any())).thenReturn(1);
+    }
 
     @Test
     public void testFinishIpqc_writeBack_feedback() {
@@ -216,17 +231,27 @@
     }
 
     @Test
-    public void testFinishIpqc_checkResultEmpty() {
-        // 鍑嗗鏁版嵁锛歝heckResult 涓虹┖锛屽簲璇ユ姤閿�
+    public void testFinishIpqc_checkResultAutoComputed() {
+        // 鍑嗗鏁版嵁锛氭娴嬬粨璁轰笉鍐嶇敱鐢ㄦ埛濉啓锛屽畬鎴愭椂鎸夊悎鏍�/涓嶅悎鏍兼暟閲忚嚜鍔ㄥ垽瀹�
         MesQcIpqcDO ipqc = randomPojo(MesQcIpqcDO.class, o -> {
             o.setStatus(MesQcStatusEnum.DRAFT.getStatus());
-            o.setCheckResult(null); // 妫�娴嬬粨璁轰负绌�
+            o.setCheckResult(null);
             o.setSourceDocType(null);
+            o.setSourceDocId(null);
+            o.setSourceLineId(null);
+            o.setCheckQuantity(BigDecimal.valueOf(100));
+            o.setQualifiedQuantity(BigDecimal.valueOf(100));
+            o.setUnqualifiedQuantity(BigDecimal.ZERO);
         });
         ipqcMapper.insert(ipqc);
 
-        // 璋冪敤锛屽簲璇ユ姏寮傚父锛堟娴嬬粨璁哄繀濉級
-        assertThrows(Exception.class, () -> ipqcService.finishIpqc(ipqc.getId()));
+        // 璋冪敤
+        ipqcService.finishIpqc(ipqc.getId());
+
+        // 鏂█锛氭娴嬬粨璁虹敱绯荤粺鍒ゅ畾骞跺洖鍐�
+        MesQcIpqcDO updatedIpqc = ipqcMapper.selectById(ipqc.getId());
+        assertEquals(MesQcStatusEnum.FINISHED.getStatus(), updatedIpqc.getStatus());
+        assertEquals(1, updatedIpqc.getCheckResult());
     }
 
     @Test
@@ -272,12 +297,14 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        // 鐢熶骇瀹屾垚鍚庝粛鍙墜宸ヨˉ褰曡川妫�銆�
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.FINISHED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         // mock 妯℃澘鍖归厤
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         // mock 宸ヨ壓璺嚎
         MesProRouteProductDO routeProduct = new MesProRouteProductDO();
         routeProduct.setRouteId(routeId);
@@ -322,6 +349,7 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         // mock 浠诲姟
@@ -330,11 +358,11 @@
         task.setWorkOrderId(workOrderId);
         task.setWorkstationId(workstationId);
         task.setItemId(productId);
-        when(taskService.validateTaskNotFinished(taskId)).thenReturn(task);
+        when(taskService.validateTaskExists(taskId)).thenReturn(task);
         // mock 妯℃澘鍖归厤
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
 
         // 璋冪敤
         Long ipqcId = ipqcService.createIpqc(reqVO);
@@ -375,12 +403,13 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         // mock 妯℃澘鍖归厤
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         // mock 宸ヨ壓璺嚎瀛樺湪
         MesProRouteProductDO routeProduct = new MesProRouteProductDO();
         routeProduct.setRouteId(routeId);
@@ -428,11 +457,12 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO());
 
         // 璋冪敤锛屾柇瑷�寮傚父
@@ -470,11 +500,12 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO());
         // mock锛氫骇鍑鸿瀛樺湪浣� feedbackId 涓嶅尮閰�
         MesWmProductProduceLineDO line = new MesWmProductProduceLineDO();
@@ -518,11 +549,12 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         when(feedbackService.validateFeedbackExists(feedbackId)).thenReturn(new MesProFeedbackDO());
         // mock锛氫骇鍑鸿瀛樺湪涓斿綊灞炴纭紝浣嗕笉鏄� PENDING 鐘舵��
         MesWmProductProduceLineDO line = new MesWmProductProduceLineDO();
@@ -566,11 +598,12 @@
         MesProWorkOrderDO workOrder = new MesProWorkOrderDO();
         workOrder.setId(workOrderId);
         workOrder.setProductId(productId);
+        workOrder.setStatus(cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum.CONFIRMED.getStatus());
         when(workOrderService.validateWorkOrderExists(workOrderId)).thenReturn(workOrder);
         when(workOrderService.validateWorkOrderConfirmed(workOrderId)).thenReturn(workOrder);
         MesQcTemplateItemDO templateItem = new MesQcTemplateItemDO();
         templateItem.setTemplateId(templateId);
-        when(templateItemService.getRequiredTemplateByItemIdAndType(eq(productId), anyInt())).thenReturn(templateItem);
+        when(templateItemService.getTemplateItemList(eq(productId), anyInt(), isNull(), isNull())).thenReturn(java.util.List.of(templateItem));
         MesProFeedbackDO feedback = new MesProFeedbackDO();
         feedback.setId(feedbackId);
         feedback.setCode("FB-001");

--
Gitblit v1.9.3