From 05ab6e3f69a5e73624b2573db043f5923e8f7d8b Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期四, 05 十一月 2026 14:17:19 +0800
Subject: [PATCH] fix 修复bug

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java |  234 ++++++++++++++++++++++++++++++---------------------------
 1 files changed, 123 insertions(+), 111 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
index 9067574..0ad9119 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -3,7 +3,6 @@
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportExcelVO;
@@ -16,8 +15,9 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper;
+import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO;
 import cn.iocoder.yudao.module.mes.enums.md.MesMdItemTypeEnum;
-import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
+
 import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
@@ -31,7 +31,6 @@
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -42,7 +41,7 @@
  *
  * 鏀寔 MES 鍜� MDM 鐗╂枡鏁版嵁鍙屽悜鍚屾
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
@@ -77,9 +76,27 @@
         // 鏍¢獙鏁版嵁
         validateItemSaveData(createReqVO);
 
+        // 濡傛灉鎸囧畾浜� ID锛屾鏌ヨ ID 鏄惁宸插瓨鍦紙鐢ㄤ簬 MDM 鍚屾鏃朵繚鎸� ID 涓�鑷达級
+        if (createReqVO.getId() != null) {
+            MesMdItemDO existItem = itemMapper.selectById(createReqVO.getId());
+            if (existItem != null) {
+                // ID 宸插瓨鍦紝杞负鏇存柊
+                updateItem(createReqVO);
+                return createReqVO.getId();
+            }
+            // 瀛樺湪閫昏緫鍒犻櫎璁板綍锛堝彇娑堝悓姝ュ悗閲嶆柊鍚屾锛夛細鎭㈠璇ヨ褰曞悗璧版洿鏂帮紝閬垮厤涓婚敭鍐茬獊
+            if (itemMapper.selectAnyById(createReqVO.getId()) != null) {
+                itemMapper.restoreById(createReqVO.getId());
+                updateItem(createReqVO);
+                return createReqVO.getId();
+            }
+        }
+
         // 鎻掑叆
         MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class);
-        item.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 榛樿绂佺敤銆備俊鎭畬鎴愬悗锛屽啀鍚敤
+        // 鐘舵�佸彧鑳界敱鍩虹鏁版嵁锛圡DM锛夋帶鍒讹細MDM 鍚屾鏃舵部鐢ㄥ叾鐘舵�侊紱MES 鏈湴鏂板榛樿绂佺敤
+        item.setStatus(createReqVO.getMdmItemId() != null && createReqVO.getStatus() != null
+                ? createReqVO.getStatus() : CommonStatusEnum.DISABLE.getStatus());
         clearStockIfNotSafe(item); // 濡傛灉鏈惎鐢ㄥ畨鍏ㄥ簱瀛橈紝娓呴浂搴撳瓨涓婁笅闄�
         itemMapper.insert(item);
 
@@ -106,6 +123,10 @@
         // 鏇存柊
         MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class);
         clearStockIfNotSafe(updateObj); // 濡傛灉鏈惎鐢ㄥ畨鍏ㄥ簱瀛橈紝娓呴浂搴撳瓨涓婁笅闄�
+        // 鐘舵�佸彧鑳界敱鍩虹鏁版嵁锛圡DM锛夋帶鍒讹紝MES 鏈湴鏇存柊涓嶅厑璁镐慨鏀圭姸鎬�
+        if (updateReqVO.getMdmItemId() == null) {
+            updateObj.setStatus(null);
+        }
         itemMapper.updateById(updateObj);
 
         // 鍚屾鍒� MDM锛堝嬀閫� syncMdm 鏃讹級
@@ -118,8 +139,7 @@
     private void validateItemSaveData(MesMdItemSaveReqVO reqVO) {
         // 鏍¢獙鐗╂枡缂栫爜鐨勫敮涓�鎬�
         validateItemCodeUnique(reqVO.getId(), reqVO.getCode());
-        // 鏍¢獙鐗╂枡鍚嶇О鐨勫敮涓�鎬�
-        validateItemNameUnique(reqVO.getId(), reqVO.getName());
+        // 涓嶅啀鏍¢獙鐗╂枡鍚嶇О鐨勫敮涓�鎬э細鍏佽鍚屽悕涓嶅悓缂栫爜鐨勭墿鏂欙紙涓� MDM 鐗╂枡瑙勫垯淇濇寔涓�鑷达級
         // 鏍¢獙鐗╂枡鍒嗙被瀛樺湪
         validateItemTypeExists(reqVO.getItemTypeId());
         // 鏍¢獙璁¢噺鍗曚綅瀛樺湪
@@ -194,24 +214,9 @@
         }
     }
 
-    private void validateItemNameUnique(Long id, String name) {
-        MesMdItemDO item = itemMapper.selectByName(name);
-        if (item == null) {
-            return;
-        }
-        if (ObjUtil.notEqual(item.getId(), id)) {
-            throw exception(MD_ITEM_NAME_DUPLICATE);
-        }
-    }
-
     private void validateItemTypeExists(Long itemTypeId) {
         if (itemTypeService.getItemType(itemTypeId) == null) {
             throw exception(MD_ITEM_TYPE_NOT_EXISTS);
-        }
-        // 鏍¢獙蹇呴』鏄彾瀛愬垎绫伙紙娌℃湁瀛愬垎绫伙級
-        List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(itemTypeId);
-        if (CollUtil.isNotEmpty(children)) {
-            throw exception(MD_ITEM_TYPE_NOT_LEAF);
         }
     }
 
@@ -298,94 +303,6 @@
     @Override
     public Long getItemCountByUnitMeasureId(Long unitMeasureId) {
         return itemMapper.selectCountByUnitMeasureId(unitMeasureId);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public MesMdItemImportRespVO importItemList(List<MesMdItemImportExcelVO> importItems, boolean updateSupport) {
-        // 1. 鍙傛暟鏍¢獙
-        if (CollUtil.isEmpty(importItems)) {
-            throw exception(MD_ITEM_IMPORT_LIST_IS_EMPTY);
-        }
-
-        // 2. 閬嶅巻锛岄�愪釜鍒涘缓 or 鏇存柊
-        MesMdItemImportRespVO respVO = MesMdItemImportRespVO.builder()
-                .createCodes(new ArrayList<>()).updateCodes(new ArrayList<>())
-                .failureCodes(new LinkedHashMap<>()).build();
-        AtomicInteger index = new AtomicInteger(1);
-        importItems.forEach(importItem -> {
-            int currentIndex = index.getAndIncrement();
-            // 2.1 鏍¢獙瀛楁
-            if (StrUtil.isBlank(importItem.getCode())) {
-                // 绌虹紪鐮佹椂鑷姩鐢熸垚
-                importItem.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.MD_ITEM_CODE.getCode()));
-            }
-            String key = importItem.getCode();
-            if (StrUtil.isBlank(importItem.getName())) {
-                respVO.getFailureCodes().put(key, "鐗╂枡鍚嶇О涓嶈兘涓虹┖");
-                return;
-            }
-            if (StrUtil.isBlank(importItem.getUnitMeasureCode())) {
-                respVO.getFailureCodes().put(key, "鍗曚綅缂栫爜涓嶈兘涓虹┖");
-                return;
-            }
-            // 灏嗗崟浣嶇紪鐮佽浆鎹负鍗曚綅 ID
-            MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasureByCode(importItem.getUnitMeasureCode());
-            if (unitMeasure == null) {
-                respVO.getFailureCodes().put(key, "鍗曚綅缂栫爜[" + importItem.getUnitMeasureCode() + "]涓嶅瓨鍦�");
-                return;
-            }
-            if (importItem.getItemTypeId() == null) {
-                respVO.getFailureCodes().put(key, "鐗╂枡鍒嗙被缂栧彿涓嶈兘涓虹┖");
-                return;
-            }
-            // 2.2 鏍¢獙鍒嗙被鏄惁瀛樺湪
-            try {
-                validateItemTypeExists(importItem.getItemTypeId());
-            } catch (ServiceException ex) {
-                respVO.getFailureCodes().put(key, ex.getMessage());
-                return;
-            }
-
-            // 2.3 鍒ゆ柇锛氬垱寤� or 鏇存柊
-            MesMdItemDO existItem = itemMapper.selectByCode(importItem.getCode());
-            if (existItem == null) {
-                // 2.3.1 鍒涘缓
-                try {
-                    validateItemNameUnique(null, importItem.getName());
-                } catch (ServiceException ex) {
-                    respVO.getFailureCodes().put(key, ex.getMessage());
-                    return;
-                }
-                MesMdItemDO item = BeanUtils.toBean(importItem, MesMdItemDO.class);
-                item.setUnitMeasureId(unitMeasure.getId());
-                item.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 榛樿绂佺敤銆備俊鎭畬鎴愬悗锛屽啀鍚敤
-                clearStockIfNotSafe(item);
-                itemMapper.insert(item);
-                // 鑷姩鐢熸垚鏉$爜
-                barcodeService.autoGenerateBarcode(BarcodeBizTypeEnum.ITEM.getValue(),
-                        item.getId(), item.getCode(), item.getName());
-                respVO.getCreateCodes().add(importItem.getCode());
-            } else if (updateSupport) {
-                // 2.3.2 鏇存柊
-                try {
-                    validateItemNameUnique(existItem.getId(), importItem.getName());
-                } catch (ServiceException ex) {
-                    respVO.getFailureCodes().put(key, ex.getMessage());
-                    return;
-                }
-                MesMdItemDO updateObj = BeanUtils.toBean(importItem, MesMdItemDO.class);
-                updateObj.setId(existItem.getId());
-                updateObj.setUnitMeasureId(unitMeasure.getId());
-                clearStockIfNotSafe(updateObj);
-                itemMapper.updateById(updateObj);
-                respVO.getUpdateCodes().add(importItem.getCode());
-            } else {
-                // 涓嶆敮鎸佹洿鏂�
-                respVO.getFailureCodes().put(key, "鐗╂枡缂栫爜宸插瓨鍦�");
-            }
-        });
-        return respVO;
     }
 
     /**
@@ -478,4 +395,99 @@
         return 1; // 榛樿鍘熸枡
     }
 
-}
\ No newline at end of file
+    @Override
+    public MesMdItemDO getItemByMdmItemId(Long mdmItemId) {
+        if (mdmItemId == null) {
+            return null;
+        }
+        return itemMapper.selectByMdmItemId(mdmItemId);
+    }
+
+    @Override
+    public MesMdItemDO validateItemExistsByMdmItemId(Long mdmItemId) {
+        MesMdItemDO item = getItemByMdmItemId(mdmItemId);
+        if (item == null) {
+            throw exception(MD_ITEM_NOT_EXISTS);
+        }
+        return item;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MesMdItemImportRespVO importItemList(List<MesMdItemImportExcelVO> importList, Boolean updateSupport) {
+        MesMdItemImportRespVO respVO = MesMdItemImportRespVO.empty();
+        if (CollUtil.isEmpty(importList)) {
+            return respVO;
+        }
+        // 棰勫姞杞借閲忓崟浣嶃�佺墿鏂欏垎绫伙紝鎸夊悕绉板缓绱㈠紩锛岄伩鍏嶉�愯鏌ュ簱
+        Map<String, Long> unitMeasureMap = new HashMap<>();
+        unitMeasureService.getUnitMeasureListByStatus(CommonStatusEnum.ENABLE.getStatus())
+                .forEach(unit -> unitMeasureMap.put(unit.getName().trim(), unit.getId()));
+        Map<String, Long> itemTypeMap = new HashMap<>();
+        itemTypeService.getItemTypeList(new MesMdItemTypeListReqVO())
+                .forEach(type -> itemTypeMap.put(type.getName().trim(), type.getId()));
+
+        int index = 0;
+        for (MesMdItemImportExcelVO row : importList) {
+            index++;
+            String key = StrUtil.isNotBlank(row.getCode()) ? row.getCode().trim() : "绗� " + index + " 琛�";
+            // 1. 鍩虹鏍¢獙
+            if (StrUtil.isBlank(row.getCode())) {
+                respVO.getFailureCodes().put(key, "鐗╂枡缂栫爜涓嶈兘涓虹┖");
+                continue;
+            }
+            if (StrUtil.isBlank(row.getName())) {
+                respVO.getFailureCodes().put(key, "鐗╂枡鍚嶇О涓嶈兘涓虹┖");
+                continue;
+            }
+            String code = row.getCode().trim();
+            String unitName = StrUtil.trim(row.getUnitMeasureName());
+            Long unitMeasureId = unitName == null ? null : unitMeasureMap.get(unitName);
+            if (unitMeasureId == null) {
+                respVO.getFailureCodes().put(key, "璁¢噺鍗曚綅[" + unitName + "]涓嶅瓨鍦�");
+                continue;
+            }
+            String typeName = StrUtil.trim(row.getItemTypeName());
+            Long itemTypeId = typeName == null ? null : itemTypeMap.get(typeName);
+            if (itemTypeId == null) {
+                respVO.getFailureCodes().put(key, "鐗╂枡鍒嗙被[" + typeName + "]涓嶅瓨鍦�");
+                continue;
+            }
+
+            // 2. 缁勮淇濆瓨瀵硅薄锛堥鑹蹭竴骞跺啓鍏ワ級
+            MesMdItemSaveReqVO saveReqVO = new MesMdItemSaveReqVO();
+            saveReqVO.setCode(code);
+            saveReqVO.setName(row.getName().trim());
+            saveReqVO.setSpecification(StrUtil.trim(row.getSpecification()));
+            saveReqVO.setColor(StrUtil.trim(row.getColor()));
+            saveReqVO.setUnitMeasureId(unitMeasureId);
+            saveReqVO.setItemTypeId(itemTypeId);
+            saveReqVO.setSafeStockFlag(row.getSafeStockFlag());
+            saveReqVO.setMinStock(row.getMinStock());
+            saveReqVO.setMaxStock(row.getMaxStock());
+            saveReqVO.setHighValue(row.getHighValue());
+            saveReqVO.setBatchFlag(row.getBatchFlag());
+            saveReqVO.setRemark(StrUtil.trim(row.getRemark()));
+
+            // 3. 鏂板鎴栨洿鏂帮紝鍗曡澶辫触涓嶅奖鍝嶆暣鎵�
+            MesMdItemDO existItem = itemMapper.selectByCode(code);
+            try {
+                if (existItem == null) {
+                    createItem(saveReqVO);
+                    respVO.getCreateCodes().add(code);
+                } else if (!Boolean.TRUE.equals(updateSupport)) {
+                    respVO.getFailureCodes().put(key, "鐗╂枡缂栫爜宸插瓨鍦紙鍕鹃�夈�屾槸鍚﹁鐩栥�嶅彲鏇存柊锛�");
+                } else {
+                    saveReqVO.setId(existItem.getId());
+                    saveReqVO.setMdmItemId(existItem.getMdmItemId());
+                    updateItem(saveReqVO);
+                    respVO.getUpdateCodes().add(code);
+                }
+            } catch (Exception e) {
+                respVO.getFailureCodes().put(key, e.getMessage() == null ? "瀵煎叆澶辫触" : e.getMessage());
+            }
+        }
+        return respVO;
+    }
+
+}

--
Gitblit v1.9.3