From 5072520172e8f45e3ccb8afc26cf0c8186ba4cdd Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 19 十月 2026 16:31:42 +0800
Subject: [PATCH] refactor(mes): 重构质量管理和批次绑定功能

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityWorkflowTest.java |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityWorkflowTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityWorkflowTest.java
index 45659c9..7e92e63 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityWorkflowTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityWorkflowTest.java
@@ -1,13 +1,17 @@
 package cn.iocoder.yudao.module.mes.service.qc.seedquality;
 
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityRetestReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityBatchRetestReqVO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedQualityActionMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedQualityMapper;
+import cn.iocoder.yudao.module.mes.service.qc.approver.MesQcApproverService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.springframework.test.util.ReflectionTestUtils;
+import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
@@ -17,30 +21,76 @@
     private final MesQcSeedQualityMapper qualityMapper = mock(MesQcSeedQualityMapper.class);
     private final MesQcSeedQualityActionMapper actionMapper = mock(MesQcSeedQualityActionMapper.class);
     private final MesWmTransactionService transactionService = mock(MesWmTransactionService.class);
+    private final MesQcApproverService approverService = mock(MesQcApproverService.class);
 
     @BeforeEach
     void setUp() {
         ReflectionTestUtils.setField(service, "qualityMapper", qualityMapper);
         ReflectionTestUtils.setField(service, "actionMapper", actionMapper);
         ReflectionTestUtils.setField(service, "wmTransactionService", transactionService);
+        ReflectionTestUtils.setField(service, "approverService", approverService);
     }
 
     @Test
-    void failedRetestNeedsBothApprovalsBeforeDisposal() {
+    void initialApprovalOnlyQueuesRetestAndFailedRetestCanReturnToRetest() {
         when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
-                MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(50).build(),
+                MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(20).build(),
                 MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(60).build());
-        service.processApprove(1L, true, "纭涓嶅悎鏍硷紝閫佸叕鍙歌川妫�瀹℃壒");
+        service.processApprove(1L, true, "");
         verifyNoInteractions(transactionService);
-        service.companyApprove(1L, false, "杩斿洖澶嶆");
+        service.companyApprove(1L, false, "澶嶆涓嶅悎鏍硷紝閲嶆柊鍙栨牱");
         ArgumentCaptor<MesQcSeedQualityDO> update = ArgumentCaptor.forClass(MesQcSeedQualityDO.class);
         verify(qualityMapper, times(2)).updateById(update.capture());
-        assertEquals(60, update.getAllValues().get(0).getWorkflowStatus());
+        assertEquals(10, update.getAllValues().get(0).getWorkflowStatus());
         assertEquals(10, update.getAllValues().get(1).getWorkflowStatus());
         verifyNoInteractions(transactionService);
     }
 
     @Test
+    void rejectedInitialInspectionNeedsRecheck() {
+        when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
+                MesQcSeedQualityDO.builder().id(1L).code("B1").result(2).workflowStatus(25).build());
+        service.processApprove(1L, false, "鍒濇鏍锋湰鏃犳晥锛岄噸鏂版娴�");
+        ArgumentCaptor<MesQcSeedQualityDO> update = ArgumentCaptor.forClass(MesQcSeedQualityDO.class);
+        verify(qualityMapper).updateById(update.capture());
+        assertEquals(50, update.getValue().getWorkflowStatus());
+        verifyNoInteractions(transactionService);
+    }
+
+    @Test
+    void rejectionRequiresOpinion() {
+        when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
+                MesQcSeedQualityDO.builder().id(1L).workflowStatus(20).build());
+        assertEquals("椹冲洖鏃惰濉啓瀹℃壒鎰忚", assertThrows(IllegalArgumentException.class,
+                () -> service.processApprove(1L, false, " ")).getMessage());
+        verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class));
+        verifyNoInteractions(actionMapper, transactionService);
+    }
+
+    @Test
+    void cannotRetestBeforeInitialReview() {
+        when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
+                MesQcSeedQualityDO.builder().id(1L).code("B1").workflowStatus(25).build());
+        assertThrows(IllegalArgumentException.class,
+                () -> service.retest(1L, new MesQcSeedQualityRetestReqVO()));
+        verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class));
+        verifyNoInteractions(transactionService, actionMapper);
+    }
+
+    @Test
+    void batchRetestRejectsDifferentProductionBatchesBeforeAnyWrite() {
+        when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
+                MesQcSeedQualityDO.builder().id(1L).code("B1").batchCode("A").workflowStatus(10).build());
+        when(qualityMapper.selectByIdForUpdate(2L)).thenReturn(
+                MesQcSeedQualityDO.builder().id(2L).code("B2").batchCode("B").workflowStatus(10).build());
+        MesQcSeedQualityBatchRetestReqVO request = new MesQcSeedQualityBatchRetestReqVO();
+        request.setIds(List.of(1L, 2L));
+        assertThrows(IllegalArgumentException.class, () -> service.retestBatch(request));
+        verify(qualityMapper, never()).updateById(any(MesQcSeedQualityDO.class));
+        verifyNoInteractions(transactionService, actionMapper);
+    }
+
+    @Test
     void skipsApprovalWhenStatusChanged() {
         when(qualityMapper.selectByIdForUpdate(1L)).thenReturn(
                 MesQcSeedQualityDO.builder().id(1L).workflowStatus(40).build());

--
Gitblit v1.9.3