From 87733eb3623593da247c051593d64b8ff9e1d3a4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 06 十一月 2026 19:00:39 +0800
Subject: [PATCH] feat(crm,mes): 扩展客户字段与重构批次号生成逻辑

---
 yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityGroupTest.java |   56 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityGroupTest.java b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityGroupTest.java
index 5189d27..50aff13 100644
--- a/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityGroupTest.java
+++ b/yudao-module-mes/src/test/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/SeedQualityGroupTest.java
@@ -4,6 +4,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedIndicatorRangeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityIndicatorDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
@@ -17,6 +18,7 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService;
 import cn.iocoder.yudao.module.mes.service.qc.approver.MesQcApproverService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
@@ -40,11 +42,19 @@
     private final MesWmMaterialStockMapper stocks=mock(MesWmMaterialStockMapper.class);
     private final MesWmWarehouseService warehouses=mock(MesWmWarehouseService.class);
     private final MesQcApproverService approvers=mock(MesQcApproverService.class);
+    private final MesQcSeedIndicatorRangeService ranges=mock(MesQcSeedIndicatorRangeService.class);
+    private final MesMdmItemService items=mock(MesMdmItemService.class);
     private final MesProBagCodeDO first=bag(1L),second=bag(2L),canceled=bag(3L).setStatus(30);
     private MesQcSeedQualityGroupSubmitReqVO req;
     private MesProBagCodeDO bag(Long id) {return new MesProBagCodeDO().setId(id).setCode("B"+id).setBatchId(10L).setPalletId(20L).setStatus(20).setInboundEventId(9L);}
     private List<MesQcSeedQualitySubmitReqVO.Indicator> validIndicators() {
         return List.of(indicator("purity"), indicator("cleanliness"), indicator("germination_rate"), indicator("moisture"));
+    }
+    private MesQcSeedIndicatorRangeDO range(String code) {
+        var range = new MesQcSeedIndicatorRangeDO();
+        range.setIndicatorCode(code); range.setIndicatorName(code); range.setUnit("%");
+        range.setMinValue(java.math.BigDecimal.ZERO); range.setMaxValue(java.math.BigDecimal.TEN);
+        return range;
     }
     private MesQcSeedQualitySubmitReqVO.Indicator indicator(String code) {
         var item = new MesQcSeedQualitySubmitReqVO.Indicator(); item.setCode(code);
@@ -65,6 +75,11 @@
         ReflectionTestUtils.setField(service,"proBatchService",batchService);ReflectionTestUtils.setField(service,"mesWmBatchMapper",wmBatches);
         ReflectionTestUtils.setField(service,"materialStockMapper",stocks);ReflectionTestUtils.setField(service,"warehouseService",warehouses);
         ReflectionTestUtils.setField(service,"approverService",approvers);
+        ReflectionTestUtils.setField(service,"rangeService",ranges);
+        ReflectionTestUtils.setField(service,"mdmItemService",items);
+        when(ranges.getEffectiveRanges(any())).thenReturn(List.of(range("purity"),range("cleanliness"),range("germination_rate"),range("moisture")));
+        when(ranges.getEffectiveMap(any())).thenReturn(java.util.Map.of());
+        when(items.getItem(any())).thenReturn(null);
         var batch=new MesProBatchDO().setId(10L).setCode("BATCH").setBusinessCode("BATCH-BUS").setItemId(99L).setStatus(30);
         when(batches.selectByScanCode(anyString())).thenReturn(batch);when(batches.selectByScanCodeForUpdate(anyString())).thenReturn(batch);
         when(batchService.getBatch(10L)).thenReturn(batch);
@@ -84,24 +99,27 @@
             java.util.Collection<Long> ids = invocation.getArgument(0);
             return List.of(first, second).stream().filter(bag -> ids.contains(bag.getId())).toList();
         });
-        req=new MesQcSeedQualityGroupSubmitReqVO();req.setCode("BATCH-BUS");req.setScanType("BATCH");req.setBagIds(List.of(1L,2L));
+        req=new MesQcSeedQualityGroupSubmitReqVO();req.setCode("BATCH-BUS");req.setQcLine(1);req.setScanType("BATCH");req.setBagIds(List.of(1L,2L));
         req.setQualifiedWarehouseId(8L);req.setIndicators(validIndicators());
     }
     @Test void batchPreviewCountsEffectiveInspectedAndPendingBags() {
-        when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").build()));
+        when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").qcLine(1).build()));
         var result=service.resolveScan("BATCH-BUS","BATCH");assertEquals(2,result.get("totalCount"));
         assertEquals(List.of(1L),result.get("completedBagIds"));assertEquals(List.of(2L),result.get("pendingBagIds"));
         verify(qualities,never()).insertBatch(anyCollection(),anyInt());
     }
     @Test void palletProcessesOnlyConfirmedUninspectedBags() {
         req.setScanType("PALLET");req.setCode("PALLET-BUS");req.setBagIds(List.of(2L));
-        when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").build()));
+        when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").qcLine(1).build()));
         when(qualities.selectListByCodesForUpdate(List.of("B2"))).thenReturn(List.of());
         assertEquals(1,service.submitGroup(req).get("processedCount"));
-        verify(qualities).insertBatch(argThat(rows -> rows.size() == 1 && rows.iterator().next().getCode().equals("B2")
-                && rows.iterator().next().getQualifiedWarehouseId().equals(8L)),eq(100));
-        verify(indicators).insertBatch(argThat(rows -> rows.size() == 4),eq(400));
-        verify(actions).insertBatch(argThat(rows -> rows.size() == 1),eq(100));
+        // 涓�娆℃彁浜ゅ悓鏃剁敓鎴愬姞宸ラ儴銆侀攢鍞儴涓ゆ潯璁板綍锛屾寚鏍囦笌缁撹涓�鑷淬��
+        verify(qualities).insertBatch(argThat(rows -> rows.size() == 2 && rows.stream().allMatch(row -> row.getCode().equals("B2")
+                && row.getQualifiedWarehouseId().equals(8L))
+                && rows.stream().map(MesQcSeedQualityDO::getQcLine).collect(java.util.stream.Collectors.toSet())
+                .equals(java.util.Set.of(1, 2))),eq(100));
+        verify(indicators).insertBatch(argThat(rows -> rows.size() == 8),eq(400));
+        verify(actions).insertBatch(argThat(rows -> rows.size() == 2),eq(100));
     }
     @Test void changedConfirmedListDoesNotSubmitAnyBag() {
         req.setBagIds(List.of(1L));assertThrows(IllegalArgumentException.class,()->service.submitGroup(req));verify(qualities,never()).insertBatch(anyCollection(),anyInt());
@@ -138,8 +156,8 @@
     }
     @Test void retestScopePreviewSeparatesWorkflowStages() {
         when(qualities.selectListByCodes(any())).thenReturn(List.of(
-                MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(),
-                MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(50).build()));
+                MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(),
+                MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(50).build()));
         var result = service.resolveRetestScope("PALLET-BUS", "PALLET");
         assertEquals(List.of(11L), result.get("retestIds"));
         assertEquals(List.of(12L), result.get("initialRecheckIds"));
@@ -148,10 +166,10 @@
         var third = bag(3L); var fourth = bag(4L);
         when(bags.selectListByPalletId(20L)).thenReturn(List.of(first, second, third, fourth));
         when(qualities.selectListByCodes(any())).thenReturn(List.of(
-                MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(20).build(),
-                MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(25).build(),
-                MesQcSeedQualityDO.builder().id(13L).code("B3").workflowStatus(30).build(),
-                MesQcSeedQualityDO.builder().id(14L).code("B4").workflowStatus(60).build()));
+                MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(20).build(),
+                MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(25).build(),
+                MesQcSeedQualityDO.builder().id(13L).code("B3").qcLine(1).workflowStatus(30).build(),
+                MesQcSeedQualityDO.builder().id(14L).code("B4").qcLine(1).workflowStatus(60).build()));
         var result = service.resolveRetestScope("PALLET-BUS", "PALLET");
         assertEquals(List.of(11L), result.get("pendingProcessIds"));
         assertEquals(List.of(12L), result.get("pendingInitialFailIds"));
@@ -162,22 +180,22 @@
     }
     @Test void retestScopeRejectsStaleConfirmedList() {
         when(qualities.selectListByCodes(any())).thenReturn(List.of(
-                MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(),
-                MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(10).build()));
+                MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(),
+                MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(10).build()));
         var request = new MesQcSeedQualityScopeRetestReqVO();
-        request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setWorkflowStatus(10);
+        request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setQcLine(1); request.setWorkflowStatus(10);
         request.setQualityIds(List.of(11L)); request.setIndicators(validIndicators());
         assertThrows(IllegalArgumentException.class, () -> service.retestScope(request));
         verify(indicators, never()).updateBatch(anyCollection(), anyInt());
     }
     @Test void retestScopeProcessesAllConfirmedBags() {
-        var pending = List.of(MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(),
-                MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(10).build());
+        var pending = List.of(MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(),
+                MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(10).build());
         when(qualities.selectListByCodes(any())).thenReturn(pending);
         when(qualities.selectListByIdsForUpdate(List.of(11L, 12L))).thenReturn(pending);
         when(indicators.selectListByQualityIds(any())).thenReturn(storedIndicators(11L, 12L));
         var request = new MesQcSeedQualityScopeRetestReqVO();
-        request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setWorkflowStatus(10);
+        request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setQcLine(1); request.setWorkflowStatus(10);
         request.setQualityIds(List.of(11L, 12L)); request.setIndicators(validIndicators());
         assertEquals(2, service.retestScope(request).get("processedCount"));
         verify(indicators).selectListByQualityIds(List.of(11L, 12L));

--
Gitblit v1.9.3