| | |
| | | * 根据 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(); |
| | |
| | | |
| | | 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); |