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