gaoluyang
21 小时以前 3fa88d03676ec8b62c80fc50636d2c8e973c0470
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemTypeServiceImpl.java
@@ -2,14 +2,19 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi;
import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemTypeMapper;
import com.mzt.logapi.starter.annotation.LogRecord;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -19,6 +24,7 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
/**
 * MES 物料产品分类 Service 实现类
@@ -230,4 +236,81 @@
        return mesDO;
    }
    @Override
    @org.springframework.transaction.annotation.Transactional(rollbackFor = Exception.class)
    @LogRecord(type = MES_MD_ITEM_TYPE_TYPE, subType = MES_MD_ITEM_TYPE_IMPORT_SUB_TYPE, bizNo = "0",
            success = MES_MD_ITEM_TYPE_IMPORT_SUCCESS)
    public MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport) {
        if (CollUtil.isEmpty(importList)) {
            throw exception(MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY);
        }
        MesMdItemTypeImportRespVO respVO = MesMdItemTypeImportRespVO.builder()
                .createList(new ArrayList<>()).updateList(new ArrayList<>())
                .failureList(new LinkedHashMap<>()).build();
        // 1. 建立编码 -> ID 映射(现有分类 + 本次新建分类),用于解析"父分类编码"列
        Map<String, Long> codeIdMap = new HashMap<>();
        for (MesMdItemTypeDO itemType : itemTypeMapper.selectList()) {
            codeIdMap.put(itemType.getCode(), itemType.getId());
        }
        Map<String, Long> importedCodeIdMap = new HashMap<>();
        // 2. 遍历导入
        for (MesMdItemTypeImportExcelVO importVO : importList) {
            // 2.1 基础校验
            if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) {
                respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "分类编码和分类名称不能为空");
                continue;
            }
            // 2.2 解析父分类 ID
            Long parentId = MesMdItemTypeDO.PARENT_ID_ROOT;
            if (StrUtil.isNotBlank(importVO.getParentCode())) {
                Long pid = importedCodeIdMap.get(importVO.getParentCode()) != null
                        ? importedCodeIdMap.get(importVO.getParentCode())
                        : codeIdMap.get(importVO.getParentCode());
                if (pid == null) {
                    respVO.getFailureList().put(importVO.getName(), "父分类编码不存在:" + importVO.getParentCode());
                    continue;
                }
                parentId = pid;
            }
            // 2.3 已存在(按编码判断)
            MesMdItemTypeDO existByCode = itemTypeMapper.selectByCode(importVO.getCode());
            if (existByCode != null) {
                if (!Boolean.TRUE.equals(isUpdateSupport)) {
                    respVO.getFailureList().put(importVO.getName(), "分类编码已存在");
                    continue;
                }
                MesMdItemTypeDO updateObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class);
                updateObj.setId(existByCode.getId());
                updateObj.setParentId(parentId);
                itemTypeMapper.updateById(updateObj);
                respVO.getUpdateList().add(importVO.getName());
            } else {
                // 2.4 校验同一父分类下名称唯一
                MesMdItemTypeDO existByName = itemTypeMapper.selectByParentIdAndName(parentId, importVO.getName());
                if (existByName != null) {
                    respVO.getFailureList().put(importVO.getName(), "同一父分类下已存在该名称的分类");
                    continue;
                }
                // 2.5 校验同一父分类下编码唯一
                MesMdItemTypeDO existByParentCode = itemTypeMapper.selectByParentIdAndCode(parentId, importVO.getCode());
                if (existByParentCode != null) {
                    respVO.getFailureList().put(importVO.getName(), "同一父分类下已存在该编码的分类");
                    continue;
                }
                // 2.6 新增
                MesMdItemTypeDO newObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class);
                newObj.setParentId(parentId);
                itemTypeMapper.insert(newObj);
                respVO.getCreateList().add(importVO.getName());
                importedCodeIdMap.put(importVO.getCode(), newObj.getId());
            }
        }
        // 记录导入结果汇总,供 @LogRecord 的 success 文案引用
        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
        return respVO;
    }
}