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/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedIndicatorRangeService.java |  126 +++++++++++++++++++++++++++++++++--------
 1 files changed, 101 insertions(+), 25 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedIndicatorRangeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedIndicatorRangeService.java
index 0318ac7..80fe407 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedIndicatorRangeService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedIndicatorRangeService.java
@@ -1,45 +1,121 @@
 package cn.iocoder.yudao.module.mes.service.qc.seedquality;
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedIndicatorRangeSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedIndicatorRangeDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.MesQcSeedIndicatorRangeMapper;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Set;
-import java.math.BigDecimal;
-import java.util.stream.Collectors;
+import java.util.Map;
 
 @Service
 public class MesQcSeedIndicatorRangeService {
-    private static final Set<String> CODES = Set.of("purity", "cleanliness", "germination_rate", "moisture");
-    @Resource private MesQcSeedIndicatorRangeMapper mapper;
 
-    public List<MesQcSeedIndicatorRangeDO> getRanges() {
-        return mapper.selectList().stream().filter(item -> CODES.contains(item.getIndicatorCode())).toList();
+    @Resource
+    private MesQcSeedIndicatorRangeMapper mapper;
+    @Resource
+    private MesMdmItemService mdmItemService;
+
+    /** 閰嶇疆椤垫煡璇細itemId 涓虹┖琛ㄧず閫氱敤榛樿椤� */
+    public List<MesQcSeedIndicatorRangeDO> getRanges(Long itemId, String keyword, Integer status) {
+        return mapper.selectListByItemId(itemId, keyword, status);
+    }
+
+    /**
+     * 鐢熸晥鎸囨爣锛氫骇鍝佷笓灞為厤缃紭鍏堬紝鏈厤缃椂鍥為��閫氱敤榛樿椤广��
+     */
+    public List<MesQcSeedIndicatorRangeDO> getEffectiveRanges(Long itemId) {
+        List<MesQcSeedIndicatorRangeDO> productRanges = itemId == null ? List.of() : mapper.selectEnabledByItemId(itemId);
+        return productRanges.isEmpty() ? mapper.selectEnabledDefaults() : productRanges;
+    }
+
+    public Map<String, MesQcSeedIndicatorRangeDO> getEffectiveMap(Long itemId) {
+        Map<String, MesQcSeedIndicatorRangeDO> result = new LinkedHashMap<>();
+        for (MesQcSeedIndicatorRangeDO range : getEffectiveRanges(itemId)) {
+            result.put(range.getIndicatorCode(), range);
+        }
+        return result;
     }
 
     @Transactional(rollbackFor = Exception.class)
-    public void saveRanges(MesQcSeedIndicatorRangeSaveReqVO request) {
-        List<MesQcSeedIndicatorRangeSaveReqVO.Item> items = request.getRanges();
-        if (items == null || items.size() != CODES.size() || items.stream().anyMatch(item -> item == null || item.getIndicatorCode() == null
-                || item.getMinValue() == null || item.getMaxValue() == null)
-                || !items.stream().map(MesQcSeedIndicatorRangeSaveReqVO.Item::getIndicatorCode)
-                .collect(Collectors.toSet()).equals(CODES))
-            throw new IllegalArgumentException("蹇呴』瀹屾暣閰嶇疆绾害銆佸噣搴︺�佸彂鑺界巼銆佹按鍒嗗洓椤规寚鏍�");
-        for (MesQcSeedIndicatorRangeSaveReqVO.Item item : items) {
-            if (item.getMinValue().compareTo(BigDecimal.ZERO) < 0 || item.getMaxValue().compareTo(new BigDecimal("100")) > 0
-                    || item.getMinValue().compareTo(item.getMaxValue()) > 0)
-                throw new IllegalArgumentException("鎸囨爣鍚堟牸鑼冨洿蹇呴』澶勪簬 0鈥�100 涓斾笅闄愪笉澶т簬涓婇檺锛�" + item.getIndicatorCode());
-            MesQcSeedIndicatorRangeDO row = new MesQcSeedIndicatorRangeDO();
-            row.setIndicatorCode(item.getIndicatorCode());
-            row.setMinValue(item.getMinValue());
-            row.setMaxValue(item.getMaxValue());
-            if (mapper.selectById(item.getIndicatorCode()) == null) mapper.insert(row);
-            else mapper.updateById(row);
-        }
+    public Long create(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
+        validateProduct(reqVO.getItemId());
+        validateRange(reqVO);
+        if (mapper.selectByItemIdAndCode(reqVO.getItemId(), reqVO.getIndicatorCode()) != null)
+            throw new IllegalArgumentException("璇ヤ骇鍝佸凡瀛樺湪鐩稿悓缂栫爜鐨勮川妫�椤癸細" + reqVO.getIndicatorCode());
+        MesQcSeedIndicatorRangeDO row = buildRow(reqVO);
+        mapper.insert(row);
+        return row.getId();
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void update(Long id, MesQcSeedIndicatorRangeSaveReqVO reqVO) {
+        MesQcSeedIndicatorRangeDO existing = mapper.selectById(id);
+        if (existing == null) throw new IllegalArgumentException("璐ㄦ椤逛笉瀛樺湪鎴栧凡鍒犻櫎");
+        validateProduct(reqVO.getItemId());
+        validateRange(reqVO);
+        MesQcSeedIndicatorRangeDO sameCode = mapper.selectByItemIdAndCode(reqVO.getItemId(), reqVO.getIndicatorCode());
+        if (sameCode != null && !sameCode.getId().equals(id))
+            throw new IllegalArgumentException("璇ヤ骇鍝佸凡瀛樺湪鐩稿悓缂栫爜鐨勮川妫�椤癸細" + reqVO.getIndicatorCode());
+        MesQcSeedIndicatorRangeDO update = buildRow(reqVO);
+        update.setId(id);
+        mapper.updateById(update);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(Long id) {
+        MesQcSeedIndicatorRangeDO existing = mapper.selectById(id);
+        if (existing == null) throw new IllegalArgumentException("璐ㄦ椤逛笉瀛樺湪鎴栧凡鍒犻櫎");
+        mapper.deleteById(id);
+    }
+
+    /** 灏嗛�氱敤榛樿椤瑰鍒跺埌鎸囧畾浜у搧锛屽凡瀛樺湪鐨勭紪鐮佽烦杩� */
+    @Transactional(rollbackFor = Exception.class)
+    public int copyDefaults(Long itemId) {
+        validateProduct(itemId);
+        int copied = 0;
+        for (MesQcSeedIndicatorRangeDO source : mapper.selectEnabledDefaults()) {
+            if (mapper.selectByItemIdAndCode(itemId, source.getIndicatorCode()) != null) continue;
+            MesQcSeedIndicatorRangeDO row = new MesQcSeedIndicatorRangeDO();
+            row.setItemId(itemId);
+            row.setIndicatorCode(source.getIndicatorCode());
+            row.setIndicatorName(source.getIndicatorName());
+            row.setUnit(source.getUnit());
+            row.setMinValue(source.getMinValue());
+            row.setMaxValue(source.getMaxValue());
+            row.setSort(source.getSort());
+            row.setStatus(0);
+            mapper.insert(row);
+            copied++;
+        }
+        return copied;
+    }
+
+    private void validateProduct(Long itemId) {
+        if (itemId == null) throw new IllegalArgumentException("璇峰厛閫夋嫨浜у搧");
+        if (mdmItemService.getItem(itemId) == null) throw new IllegalArgumentException("浜у搧涓嶅瓨鍦紝璇烽噸鏂伴�夋嫨");
+    }
+
+    private void validateRange(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
+        if (reqVO.getMinValue().compareTo(reqVO.getMaxValue()) > 0)
+            throw new IllegalArgumentException("鍚堟牸涓嬮檺涓嶈兘澶т簬涓婇檺锛�" + reqVO.getIndicatorName());
+    }
+
+    private MesQcSeedIndicatorRangeDO buildRow(MesQcSeedIndicatorRangeSaveReqVO reqVO) {
+        MesQcSeedIndicatorRangeDO row = new MesQcSeedIndicatorRangeDO();
+        row.setItemId(reqVO.getItemId());
+        row.setIndicatorCode(reqVO.getIndicatorCode().trim());
+        row.setIndicatorName(reqVO.getIndicatorName().trim());
+        row.setUnit(StrUtil.blankToDefault(reqVO.getUnit(), "%"));
+        row.setMinValue(reqVO.getMinValue());
+        row.setMaxValue(reqVO.getMaxValue());
+        row.setSort(reqVO.getSort() == null ? 0 : reqVO.getSort());
+        row.setStatus(reqVO.getStatus() == null ? 0 : reqVO.getStatus());
+        return row;
+    }
 }

--
Gitblit v1.9.3