gaoluyang
7 天以前 e1590017b716d77f88f075364c55cfbdb480286f
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -676,19 +676,12 @@
     * 根据 MPS 创建生产工单
     */
    private Long createWorkOrderFromMps(MesProMpsDO mps, BigDecimal quantity) {
        // 1. 校验产品是否存在工艺路线
        // 1. 查找产品工艺路线;未配置时不阻断,按单工序生产处理
        MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(mps.getProductId());
        if (routeProduct == null) {
            throw exception(PRO_ROUTE_NOT_EXISTS);
        }
        Long routeId = routeProduct.getRouteId();
        // 2. 校验工艺路线是否有工序(按产品过滤其它产品的产出物料)
        List<MesProRouteProcessDO> routeProcesses = routeProcessService
                .getRouteProcessListByProductId(mps.getProductId());
        if (CollUtil.isEmpty(routeProcesses)) {
            throw exception(PRO_ROUTE_ENABLE_NO_PROCESS);
        }
        Long routeId = routeProduct != null ? routeProduct.getRouteId() : null;
        List<MesProRouteProcessDO> routeProcesses = routeProduct != null
                ? routeProcessService.getRouteProcessListByProductId(mps.getProductId())
                : Collections.emptyList();
        // 3. 创建生产工单
        MesProWorkOrderSaveReqVO workOrderReq = new MesProWorkOrderSaveReqVO();
@@ -705,46 +698,50 @@
        Long workOrderId = workOrderService.createWorkOrder(workOrderReq);
        // 4. 更新工单工艺路线
        workOrderMapper.updateById(new MesProWorkOrderDO().setId(workOrderId).setRouteId(routeId));
        // 5. 保存工单工序(从工艺路线工序带入,含投料BOM)
        Map<Long, List<MesProRouteProductBomDO>> bomMap = routeProcessService.getRouteProcessBomMapByProductId(mps.getProductId());
        List<MesProWorkOrderProcessSaveReqVO> processList = new ArrayList<>();
        for (MesProRouteProcessDO rp : routeProcesses) {
            MesProWorkOrderProcessSaveReqVO process = new MesProWorkOrderProcessSaveReqVO();
            process.setWorkOrderId(workOrderId);
            process.setProcessId(rp.getProcessId());
            process.setSort(rp.getSort());
            process.setKeyFlag(rp.getKeyFlag());
            process.setCheckFlag(rp.getCheckFlag());
            process.setBackflushFlag(rp.getBackflushFlag());
            if (rp.getOutputItemId() != null && !rp.getOutputItemId().isBlank()) {
                process.setOutputItemIds(Arrays.stream(rp.getOutputItemId().split(","))
                        .map(String::trim).filter(s -> !s.isEmpty())
                        .map(Long::valueOf).collect(Collectors.toList()));
            }
            process.setColorCode(rp.getColorCode());
            // 带入工艺路线产品配置的报工仓库
            process.setWarehouseId(routeProduct.getWarehouseId());
            process.setLocationId(routeProduct.getLocationId());
            process.setAreaId(routeProduct.getAreaId());
            // 带入工序投料BOM
            List<MesProRouteProductBomDO> routeBomItems = bomMap != null ? bomMap.get(rp.getProcessId()) : null;
            if (CollUtil.isNotEmpty(routeBomItems)) {
                List<MesProWorkOrderProcessSaveReqVO.BomItem> bomItems = new ArrayList<>();
                for (MesProRouteProductBomDO bomDO : routeBomItems) {
                    MesProWorkOrderProcessSaveReqVO.BomItem bomItem = new MesProWorkOrderProcessSaveReqVO.BomItem();
                    bomItem.setItemId(bomDO.getItemId());
                    bomItem.setQuantity(bomDO.getQuantity());
                    bomItem.setRemark(bomDO.getRemark());
                    bomItems.add(bomItem);
                }
                process.setBomItems(bomItems);
            }
            processList.add(process);
        // 4. 更新工单工艺路线(未配置路线时保持为空,按单工序生产)
        if (routeId != null) {
            workOrderMapper.updateById(new MesProWorkOrderDO().setId(workOrderId).setRouteId(routeId));
        }
        workOrderProcessService.batchSaveWorkOrderProcess(processList);
        // 5. 保存工单工序(仅配置了工艺路线工序时带入,含投料BOM)
        if (CollUtil.isNotEmpty(routeProcesses)) {
            Map<Long, List<MesProRouteProductBomDO>> bomMap = routeProcessService.getRouteProcessBomMapByProductId(mps.getProductId());
            List<MesProWorkOrderProcessSaveReqVO> processList = new ArrayList<>();
            for (MesProRouteProcessDO rp : routeProcesses) {
                MesProWorkOrderProcessSaveReqVO process = new MesProWorkOrderProcessSaveReqVO();
                process.setWorkOrderId(workOrderId);
                process.setProcessId(rp.getProcessId());
                process.setSort(rp.getSort());
                process.setKeyFlag(rp.getKeyFlag());
                process.setCheckFlag(rp.getCheckFlag());
                process.setBackflushFlag(rp.getBackflushFlag());
                if (rp.getOutputItemId() != null && !rp.getOutputItemId().isBlank()) {
                    process.setOutputItemIds(Arrays.stream(rp.getOutputItemId().split(","))
                            .map(String::trim).filter(s -> !s.isEmpty())
                            .map(Long::valueOf).collect(Collectors.toList()));
                }
                process.setColorCode(rp.getColorCode());
                // 带入工艺路线产品配置的报工仓库
                process.setWarehouseId(routeProduct.getWarehouseId());
                process.setLocationId(routeProduct.getLocationId());
                process.setAreaId(routeProduct.getAreaId());
                // 带入工序投料BOM
                List<MesProRouteProductBomDO> routeBomItems = bomMap != null ? bomMap.get(rp.getProcessId()) : null;
                if (CollUtil.isNotEmpty(routeBomItems)) {
                    List<MesProWorkOrderProcessSaveReqVO.BomItem> bomItems = new ArrayList<>();
                    for (MesProRouteProductBomDO bomDO : routeBomItems) {
                        MesProWorkOrderProcessSaveReqVO.BomItem bomItem = new MesProWorkOrderProcessSaveReqVO.BomItem();
                        bomItem.setItemId(bomDO.getItemId());
                        bomItem.setQuantity(bomDO.getQuantity());
                        bomItem.setRemark(bomDO.getRemark());
                        bomItems.add(bomItem);
                    }
                    process.setBomItems(bomItems);
                }
                processList.add(process);
            }
            workOrderProcessService.batchSaveWorkOrderProcess(processList);
        }
        // 6. 工单直接确认为已确认状态
        workOrderService.confirmWorkOrder(workOrderId);