云
2026-10-25 d54fbc9d4f8981fa0f7f613b33a28a8cd4f764ea
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java
@@ -1,11 +1,17 @@
package cn.iocoder.yudao.module.mes.service.pro.card;
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.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardMapper;
@@ -19,6 +25,11 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -130,6 +141,67 @@
                .setId(id).setStatus(MesProWorkOrderStatusEnum.CANCELED.getStatus()));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public MesProCardImportRespVO importCardList(List<MesProCardImportExcelVO> importList, boolean updateSupport) {
        if (CollUtil.isEmpty(importList)) {
            throw exception(MES_PRO_CARD_IMPORT_LIST_IS_EMPTY);
        }
        MesProCardImportRespVO respVO = MesProCardImportRespVO.builder()
                .createCodes(new ArrayList<>()).updateCodes(new ArrayList<>())
                .failureCodes(new LinkedHashMap<>()).build();
        AtomicInteger index = new AtomicInteger(1);
        importList.forEach(importItem -> {
            int currentIndex = index.getAndIncrement();
            String key = StrUtil.blankToDefault(importItem.getCode(), "第 " + currentIndex + " 行");
            if (StrUtil.isBlank(importItem.getCode())) {
                respVO.getFailureCodes().put(key, "流转卡编码不能为空");
                return;
            }
            // 1. 解析生产工单
            Long workOrderId = null;
            if (StrUtil.isNotBlank(importItem.getWorkOrderCode())) {
                MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(importItem.getWorkOrderCode().trim());
                if (workOrder == null) {
                    respVO.getFailureCodes().put(key, "生产工单编码[" + importItem.getWorkOrderCode() + "]不存在");
                    return;
                }
                workOrderId = workOrder.getId();
            }
            // 2. 解析产品物料
            Long itemId = null;
            if (StrUtil.isNotBlank(importItem.getItemCode())) {
                MesMdItemDO item = itemService.getItemByCode(importItem.getItemCode().trim());
                if (item == null) {
                    respVO.getFailureCodes().put(key, "产品物料编码[" + importItem.getItemCode() + "]不存在");
                    return;
                }
                itemId = item.getId();
            }
            // 3. 构建请求并创建/更新(复用现有 create/update 服务,保留条码生成逻辑)
            MesProCardSaveReqVO reqVO = BeanUtils.toBean(importItem, MesProCardSaveReqVO.class);
            reqVO.setWorkOrderId(workOrderId);
            reqVO.setItemId(itemId);
            MesProCardDO existCard = cardMapper.selectByCode(importItem.getCode());
            try {
                if (existCard == null) {
                    reqVO.setId(null);
                    createCard(reqVO);
                    respVO.getCreateCodes().add(importItem.getCode());
                } else if (updateSupport) {
                    reqVO.setId(existCard.getId());
                    updateCard(reqVO);
                    respVO.getUpdateCodes().add(importItem.getCode());
                } else {
                    respVO.getFailureCodes().put(key, "流转卡编码已存在");
                }
            } catch (ServiceException e) {
                respVO.getFailureCodes().put(key, e.getMessage());
            }
        });
        return respVO;
    }
    // ==================== 校验方法 ====================
    @Override