From 48ee7c963f29f5614a8f86c08608620cc6310793 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 26 十月 2026 17:11:33 +0800
Subject: [PATCH] feat: 完善产品编码与技术文件管理

---
 yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java |   55 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
index cfbc790..1780521 100644
--- a/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
+++ b/yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -19,6 +19,7 @@
 import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO;
 import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper;
 import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper;
+import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemCodeSequenceMapper;
 import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper;
 import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService;
 import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService;
@@ -60,6 +61,9 @@
     private MdmItemMapper itemMapper;
 
     @Resource
+    private MdmItemCodeSequenceMapper itemCodeSequenceMapper;
+
+    @Resource
     private MdmItemCategoryService itemCategoryService;
     @Resource
     private MdmUnitMeasureService unitMeasureService;
@@ -85,6 +89,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createItem(MdmItemSaveReqVO createReqVO) {
+        createReqVO.setCode(generateItemCode(createReqVO.getItemType()));
         // 鏍¢獙鏁版嵁
         validateItemSaveData(createReqVO);
 
@@ -107,7 +112,10 @@
     @Transactional(rollbackFor = Exception.class)
     public void updateItem(MdmItemSaveReqVO updateReqVO) {
         // 鏍¢獙瀛樺湪
-        validateItemExists(updateReqVO.getId());
+        MdmItemDO existingItem = validateItemExists(updateReqVO.getId());
+        // 缂栧彿鐢辩郴缁熺敓鎴愶紝淇敼浜у搧鏃朵繚鎸佸師缂栧彿涓嶅彉銆�
+        updateReqVO.setCode(existingItem.getCode());
+        updateReqVO.setItemType(existingItem.getItemType());
         // 鏍¢獙鏁版嵁
         validateItemSaveData(updateReqVO);
 
@@ -127,8 +135,41 @@
     }
 
     private void validateItemSaveData(MdmItemSaveReqVO reqVO) {
+        if (reqVO.getItemType() == null || reqVO.getItemType() < 1 || reqVO.getItemType() > 5) {
+            throw exception(MDM_ITEM_TYPE_INVALID);
+        }
         // 鏍¢獙鐗╂枡缂栫爜鐨勫敮涓�鎬�
         validateItemCodeUnique(reqVO.getId(), reqVO.getCode());
+    }
+
+    /** 鐢熸垚鍥涗綅绫诲瀷鍓嶇紑 + 浜斾綅娴佹按鍙凤紝鍏变節浣嶃�傛祦姘磋鍦ㄤ簨鍔″唴鍔犻攣锛岄伩鍏嶅苟鍙戦噸澶嶃�� */
+    private String generateItemCode(Integer itemType) {
+        String prefix = switch (itemType == null ? 0 : itemType) {
+            case 1 -> "1001";
+            case 2 -> "1002";
+            case 3 -> "1003";
+            case 4 -> "1004";
+            case 5 -> "1005";
+            default -> throw exception(MDM_ITEM_TYPE_INVALID);
+        };
+        itemCodeSequenceMapper.insertIfAbsent(prefix);
+        Integer current = itemCodeSequenceMapper.selectCurrentValueForUpdate(prefix);
+        if (current == null) {
+            current = itemMapper.selectMaxSequenceByPrefix(prefix);
+            itemCodeSequenceMapper.insertIfAbsent(prefix);
+            itemCodeSequenceMapper.updateCurrentValue(prefix, current);
+        }
+        int maxExisting = itemMapper.selectMaxSequenceByPrefix(prefix);
+        if (current < maxExisting) {
+            current = maxExisting;
+            itemCodeSequenceMapper.updateCurrentValue(prefix, current);
+        }
+        if (current >= 99_999) {
+            throw exception(MDM_ITEM_CODE_SEQUENCE_EXHAUSTED);
+        }
+        itemCodeSequenceMapper.increment(prefix);
+        int next = current + 1;
+        return prefix + String.format("%05d", next);
     }
 
     /**
@@ -468,8 +509,8 @@
         TransactionTemplate importTxTemplate = new TransactionTemplate(transactionManager);
         for (MdmItemImportExcelVO importVO : importList) {
             // 2.1 鍩虹鏍¢獙
-            if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) {
-                respVO.getFailureList().put(buildFailKey(importVO), "鐗╂枡缂栫爜鍜岀墿鏂欏悕绉颁笉鑳戒负绌�");
+            if (StrUtil.isBlank(importVO.getName())) {
+                respVO.getFailureList().put(buildFailKey(importVO), "鐗╂枡鍚嶇О涓嶈兘涓虹┖");
                 continue;
             }
             // 2.2 瑙f瀽鍒嗙被
@@ -511,10 +552,12 @@
 
             // 2.6 缁勮 SaveReqVO锛堝鐢� create/update 閫昏緫锛�
             MdmItemSaveReqVO saveReqVO = new MdmItemSaveReqVO();
+            // 鏂板鏃跺拷鐣� Excel 涓殑鐗╂枡缂栫爜锛岀敱 MDM 鎸変骇鍝佺被鍨嬭嚜鍔ㄧ敓鎴愩��
             saveReqVO.setCode(importVO.getCode());
             saveReqVO.setName(importVO.getName());
             saveReqVO.setBarCode(importVO.getBarCode());
             saveReqVO.setSpecification(importVO.getSpecification());
+            saveReqVO.setTechnicalParameters(importVO.getTechnicalParameters());
             saveReqVO.setCategoryId(categoryId);
             saveReqVO.setUnitMeasureId(unitMeasureId);
             saveReqVO.setUnitMeasureId2(unitMeasureId2);
@@ -532,10 +575,10 @@
             saveReqVO.setStatus(importVO.getStatus() != null ? importVO.getStatus() : cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus());
             saveReqVO.setSyncMes(importVO.getSyncMes() != null ? importVO.getSyncMes() : false);
             saveReqVO.setRemark(importVO.getRemark());
-            saveReqVO.setItemType(1); // 榛樿鐗╂枡绫诲瀷锛氱墿鏂�
+            saveReqVO.setItemType(importVO.getItemType() != null ? importVO.getItemType() : 1); // 鏈彁渚涚被鍨嬫椂榛樿涓哄師鏉愭枡
 
             // 2.7 宸插瓨鍦紙鎸夌紪鐮佸垽鏂級
-            MdmItemDO existByCode = itemMapper.selectByCode(importVO.getCode());
+            MdmItemDO existByCode = StrUtil.isBlank(importVO.getCode()) ? null : itemMapper.selectByCode(importVO.getCode());
             if (existByCode != null && !Boolean.TRUE.equals(isUpdateSupport)) {
                 respVO.getFailureList().put(buildFailKey(importVO), "鐗╂枡缂栫爜宸插瓨鍦�");
                 continue;
@@ -587,4 +630,4 @@
                 StrUtil.blankToDefault(importVO.getName(), "锛堝悕绉板拰缂栫爜涓虹┖鐨勮锛�"));
     }
 
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3