gaoluyang
2 天以前 feedd62ec46b9faada80505387526acf914cf4c5
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -7,6 +7,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO;
@@ -15,7 +16,6 @@
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO;
import cn.iocoder.yudao.module.mdm.dal.mysql.category.MdmItemCategoryMapper;
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.unit.MdmUnitMeasureMapper;
@@ -27,6 +27,7 @@
import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO;
import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemTypeRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mzt.logapi.starter.annotation.LogRecord;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
@@ -40,6 +41,7 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mdm.enums.LogRecordConstants.*;
/**
 * MDM 物料主数据 Service 实现类
@@ -65,9 +67,6 @@
    private MesMdItemApi mesMdItemApi;
    @Resource
    private MdmItemBatchConfigMapper itemBatchConfigMapper;
    @Resource
    private MdmItemCategoryMapper itemCategoryMapper;
    @Resource
    private MdmUnitMeasureMapper unitMeasureMapper;
@@ -435,6 +434,8 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    @LogRecord(type = MDM_ITEM_TYPE, subType = MDM_ITEM_IMPORT_SUB_TYPE, bizNo = "0",
            success = MDM_ITEM_IMPORT_SUCCESS)
    public MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport) {
        if (CollUtil.isEmpty(importList)) {
            throw exception(MDM_ITEM_IMPORT_LIST_IS_EMPTY);
@@ -443,11 +444,13 @@
                .createList(new ArrayList<>()).updateList(new ArrayList<>())
                .failureList(new LinkedHashMap<>()).build();
        // 1. 预热:分类编码 -> ID、单位编码 -> ID
        // 1. 预热:分类编码 -> ID(MES 物料分类,与物料表单下拉数据源一致)、单位编码 -> ID
        Map<String, Long> categoryCodeIdMap = new HashMap<>();
        for (MdmItemCategoryDO category : itemCategoryMapper.selectList()) {
            if (category.getCode() != null) {
                categoryCodeIdMap.put(category.getCode(), category.getId());
        for (String categoryCode : importList.stream()
                .map(MdmItemImportExcelVO::getCategoryCode).filter(StrUtil::isNotBlank).distinct().toList()) {
            CommonResult<MesMdItemTypeRespDTO> categoryResult = mesMdItemTypeApi.getItemTypeByCode(categoryCode);
            if (categoryResult != null && categoryResult.getData() != null) {
                categoryCodeIdMap.put(categoryCode, categoryResult.getData().getId());
            }
        }
        Map<String, Long> unitCodeIdMap = new HashMap<>();
@@ -459,7 +462,9 @@
        for (MdmItemImportExcelVO importVO : importList) {
            // 2.1 基础校验
            if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) {
                respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "物料编码和物料名称不能为空");
                String failKey = StrUtil.isNotBlank(importVO.getName()) ? importVO.getName()
                        : (StrUtil.isNotBlank(importVO.getCode()) ? importVO.getCode() : "(名称和编码为空的行)");
                respVO.getFailureList().put(failKey, "物料编码和物料名称不能为空");
                continue;
            }
            // 2.2 解析分类
@@ -467,7 +472,7 @@
            if (StrUtil.isNotBlank(importVO.getCategoryCode())) {
                categoryId = categoryCodeIdMap.get(importVO.getCategoryCode());
                if (categoryId == null) {
                    respVO.getFailureList().put(importVO.getName(), "物料分类编码不存在:" + importVO.getCategoryCode());
                    respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "物料分类编码不存在:" + importVO.getCategoryCode());
                    continue;
                }
            }
@@ -476,7 +481,7 @@
            if (StrUtil.isNotBlank(importVO.getUnitMeasureCode())) {
                unitMeasureId = unitCodeIdMap.get(importVO.getUnitMeasureCode());
                if (unitMeasureId == null) {
                    respVO.getFailureList().put(importVO.getName(), "计量单位编码不存在:" + importVO.getUnitMeasureCode());
                    respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "计量单位编码不存在:" + importVO.getUnitMeasureCode());
                    continue;
                }
            }
@@ -485,7 +490,7 @@
            if (StrUtil.isNotBlank(importVO.getUnitMeasureCode2())) {
                unitMeasureId2 = unitCodeIdMap.get(importVO.getUnitMeasureCode2());
                if (unitMeasureId2 == null) {
                    respVO.getFailureList().put(importVO.getName(), "辅单位1编码不存在:" + importVO.getUnitMeasureCode2());
                    respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "辅单位1编码不存在:" + importVO.getUnitMeasureCode2());
                    continue;
                }
            }
@@ -494,7 +499,7 @@
            if (StrUtil.isNotBlank(importVO.getUnitMeasureCode3())) {
                unitMeasureId3 = unitCodeIdMap.get(importVO.getUnitMeasureCode3());
                if (unitMeasureId3 == null) {
                    respVO.getFailureList().put(importVO.getName(), "辅单位2编码不存在:" + importVO.getUnitMeasureCode3());
                    respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "辅单位2编码不存在:" + importVO.getUnitMeasureCode3());
                    continue;
                }
            }
@@ -529,7 +534,7 @@
            try {
                if (existByCode != null) {
                    if (!Boolean.TRUE.equals(isUpdateSupport)) {
                        respVO.getFailureList().put(importVO.getName(), "物料编码已存在");
                        respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "物料编码已存在");
                        continue;
                    }
                    saveReqVO.setId(existByCode.getId());
@@ -544,9 +549,11 @@
                String reason = ex instanceof cn.iocoder.yudao.framework.common.exception.ServiceException
                        ? ((cn.iocoder.yudao.framework.common.exception.ServiceException) ex).getMessage()
                        : ex.getMessage();
                respVO.getFailureList().put(importVO.getName(), reason == null ? "导入失败" : reason);
                respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), reason == null ? "导入失败" : reason);
            }
        }
        // 记录导入结果汇总,供 @LogRecord 的 success 文案引用
        OperateLogUtils.putImportSummary(respVO.getCreateList(), respVO.getUpdateList(), respVO.getFailureList());
        return respVO;
    }