9 小时以前 757c7e03bee3560bb4d7766fddd03673e2c2e611
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
@@ -5,8 +5,11 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderProcessMapper;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
@@ -44,6 +47,11 @@
    private MesProProcessService processService;
    @Resource
    private MesProRouteProcessService routeProcessService;
    @Resource
    @Lazy
    private MesProWorkOrderBomService workOrderBomService;
    @Resource
    private MesProWorkOrderBomMapper workOrderBomMapper;
    @Override
    public Long createWorkOrderProcess(MesProWorkOrderProcessSaveReqVO createReqVO) {
@@ -175,10 +183,44 @@
            }
        }
        // 4. 重建工序链
        // 4. 保存工单 BOM 投料(合并所有工序的 bomItems,按 itemId 去重)
        saveWorkOrderBomFromProcesses(workOrderId, list);
        // 5. 重建工序链
        rebuildProcessChain(workOrderId);
    }
    /**
     * 从工序列表中提取 BOM 投料,合并去重后保存到工单 BOM 表
     */
    private void saveWorkOrderBomFromProcesses(Long workOrderId, List<MesProWorkOrderProcessSaveReqVO> list) {
        // 收集所有工序的 bomItems,按 itemId 去重(保留第一个出现的 quantity)
        java.util.Map<Long, MesProWorkOrderProcessSaveReqVO.BomItem> merged = new java.util.LinkedHashMap<>();
        for (MesProWorkOrderProcessSaveReqVO item : list) {
            if (CollUtil.isNotEmpty(item.getBomItems())) {
                for (MesProWorkOrderProcessSaveReqVO.BomItem bomItem : item.getBomItems()) {
                    if (bomItem.getItemId() != null) {
                        merged.putIfAbsent(bomItem.getItemId(), bomItem);
                    }
                }
            }
        }
        // 删除旧 BOM,批量插入新 BOM
        workOrderBomService.deleteWorkOrderBomByWorkOrderId(workOrderId);
        if (CollUtil.isNotEmpty(merged)) {
            List<MesProWorkOrderBomDO> bomList = new ArrayList<>(merged.size());
            for (MesProWorkOrderProcessSaveReqVO.BomItem bomItem : merged.values()) {
                bomList.add(MesProWorkOrderBomDO.builder()
                        .workOrderId(workOrderId)
                        .itemId(bomItem.getItemId())
                        .quantity(bomItem.getQuantity())
                        .remark(bomItem.getRemark())
                        .build());
            }
            workOrderBomMapper.insertBatch(bomList);
        }
    }
    // ==================== 私有方法 ====================
    private MesProWorkOrderProcessDO validateWorkOrderProcessExists(Long id) {