liu
2026-10-19 152cd504b3c6dff0cf6f98ea2111c455264d92de
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/maintenanceplan/MesProMaintenancePlanServiceImpl.java
@@ -2,10 +2,14 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
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.erp.api.purchase.PurchasePlanApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchasePlanCreateReqDTO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.maintenanceplan.vo.MesProMaintenancePlanImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.maintenanceplan.vo.MesProMaintenancePlanImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.maintenanceplan.vo.MesProMaintenancePlanPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.maintenanceplan.vo.MesProMaintenancePlanSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO;
@@ -29,7 +33,9 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -238,6 +244,70 @@
        return workOrderId;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public MesProMaintenancePlanImportRespVO importPlanList(List<MesProMaintenancePlanImportExcelVO> importList,
                                                            boolean updateSupport) {
        if (CollUtil.isEmpty(importList)) {
            throw exception(MES_PRO_MAINTENANCE_PLAN_IMPORT_LIST_IS_EMPTY);
        }
        MesProMaintenancePlanImportRespVO respVO = MesProMaintenancePlanImportRespVO.builder()
                .createNames(new ArrayList<>()).updateNames(new ArrayList<>())
                .failureNames(new LinkedHashMap<>()).build();
        // 1. 按计划名称分组(同一计划名称的多行合并为一个计划,每行一条备件/物资明细)
        int rowIndex = 1;
        Map<String, List<MesProMaintenancePlanImportExcelVO>> groupMap = new LinkedHashMap<>();
        for (MesProMaintenancePlanImportExcelVO item : importList) {
            if (StrUtil.isBlank(item.getName())) {
                respVO.getFailureNames().put("第 " + rowIndex + " 行", "计划名称不能为空");
                rowIndex++;
                continue;
            }
            groupMap.computeIfAbsent(item.getName(), k -> new ArrayList<>()).add(item);
            rowIndex++;
        }
        // 2. 逐组处理
        groupMap.forEach((name, rows) -> {
            MesProMaintenancePlanImportExcelVO main = rows.get(0);
            List<MesProMaintenancePlanSaveReqVO.Item> items = new ArrayList<>();
            for (MesProMaintenancePlanImportExcelVO row : rows) {
                if (StrUtil.isBlank(row.getItemCode())) {
                    respVO.getFailureNames().put(name, "物料/备件编码不能为空");
                    return;
                }
                MesMdItemDO item = itemService.getItemByCode(row.getItemCode().trim());
                if (item == null) {
                    respVO.getFailureNames().put(name, "物料/备件编码[" + row.getItemCode() + "]不存在");
                    return;
                }
                MesProMaintenancePlanSaveReqVO.Item it = new MesProMaintenancePlanSaveReqVO.Item();
                it.setItemId(item.getId());
                it.setQuantity(row.getItemQuantity());
                it.setRemark(row.getItemRemark());
                items.add(it);
            }
            MesProMaintenancePlanSaveReqVO reqVO = BeanUtils.toBean(main, MesProMaintenancePlanSaveReqVO.class);
            reqVO.setItems(items);
            MesProMaintenancePlanDO existPlan = planMapper.selectByName(name);
            try {
                if (existPlan == null) {
                    reqVO.setId(null);
                    createPlan(reqVO);
                    respVO.getCreateNames().add(name);
                } else if (updateSupport) {
                    reqVO.setId(existPlan.getId());
                    updatePlan(reqVO);
                    respVO.getUpdateNames().add(name);
                } else {
                    respVO.getFailureNames().put(name, "计划名称已存在");
                }
            } catch (ServiceException e) {
                respVO.getFailureNames().put(name, e.getMessage());
            }
        });
        return respVO;
    }
    /**
     * 计划类型 -> 工单类型映射
     */