| | |
| | | scheduleGuard.lock(); |
| | | // 1. 校验关联数据存在 |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(createReqVO.getWorkOrderId()); |
| | | var station = workstationService.validateWorkstationExistsAndEnable(createReqVO.getWorkstationId()); |
| | | if (!java.util.Objects.equals(station.getProcessId(), createReqVO.getProcessId())) { |
| | | throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_SCHEDULE_INVALID, "工作站与工序不匹配"); |
| | | } |
| | | routeService.validateRouteExists(createReqVO.getRouteId()); |
| | | processService.validateProcessExistsAndEnable(createReqVO.getProcessId()); |
| | | workstationService.validateWorkstationExistsAndEnable(createReqVO.getWorkstationId()); |
| | | |
| | | // 2. 自动确定 itemId:优先前端传入 → 工艺路线工序的产出产品 → 工单成品 |
| | | // 未配置工序/工艺路线时,任务直接按工单成品产出 |
| | | Long itemId = createReqVO.getItemId(); |
| | | if (itemId == null) { |
| | | if (itemId == null && createReqVO.getRouteId() != null && createReqVO.getProcessId() != null) { |
| | | MesProRouteProcessDO routeProcess = routeProcessService |
| | | .getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId()); |
| | | itemId = resolveTaskItemId(routeProcess, workOrder.getProductId()); |
| | | } |
| | | if (itemId == null) { |
| | | itemId = workOrder.getProductId(); |
| | | } |
| | | MesMdItemDO item = itemService.validateItemExists(itemId); |
| | | |
| | |
| | | if (updateReqVO.getWorkstationId() != null) { |
| | | workstationService.validateWorkstationExists(updateReqVO.getWorkstationId()); |
| | | } |
| | | if (updateReqVO.getRouteId() != null) { |
| | | routeService.validateRouteExists(updateReqVO.getRouteId()); |
| | | } |
| | | if (updateReqVO.getProcessId() != null) { |
| | | processService.validateProcessExistsAndEnable(updateReqVO.getProcessId()); |
| | | } |
| | | MesMdItemDO item; |
| | | if (updateReqVO.getItemId() != null) { |
| | | item = itemService.validateItemExists(updateReqVO.getItemId()); |
| | |
| | | .setQuantity(quantity) |
| | | .setStartTime(updateReqVO.getStartTime() != null ? updateReqVO.getStartTime() : task.getStartTime()) |
| | | .setEndTime(updateReqVO.getEndTime() != null ? updateReqVO.getEndTime() : task.getEndTime()); |
| | | var station = workstationService.validateWorkstationExistsAndEnable(candidate.getWorkstationId()); |
| | | if (!java.util.Objects.equals(station.getProcessId(), candidate.getProcessId())) { |
| | | throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_SCHEDULE_INVALID, "工作站与工序不匹配"); |
| | | } |
| | | scheduleGuard.validate(workOrderService.validateWorkOrderConfirmed(candidate.getWorkOrderId()), candidate, task.getId()); |
| | | |
| | | // 2. 更新 |
| | |
| | | private void synchronizeScheduledQuantity(MesProWorkOrderDO order, Long routeId) { |
| | | List<MesProRouteProcessDO> required = buildRouteProcessList(routeId, order.getId()); |
| | | List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(order.getId()); |
| | | BigDecimal scheduled = order.getQuantity(); |
| | | BigDecimal orderQuantity = order.getQuantity() == null ? BigDecimal.ZERO : order.getQuantity(); |
| | | BigDecimal scheduled; |
| | | if (CollUtil.isEmpty(required)) { |
| | | // 未配置工序/工艺路线:整张工单只有一个生产步骤,已排产量按任务数量合计 |
| | | scheduled = tasks.stream() |
| | | .filter(task -> !java.util.Objects.equals(task.getStatus(), MesProTaskStatusEnum.CANCELED.getStatus())) |
| | | .map(task -> task.getQuantity() == null ? BigDecimal.ZERO : task.getQuantity()) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add) |
| | | .min(orderQuantity); |
| | | } else { |
| | | scheduled = orderQuantity; |
| | | for (var process : required) { |
| | | BigDecimal amount = tasks.stream().filter(task -> java.util.Objects.equals(task.getProcessId(), process.getProcessId()) |
| | | && !java.util.Objects.equals(task.getStatus(), MesProTaskStatusEnum.CANCELED.getStatus())) |
| | | .map(task -> task.getQuantity() == null ? BigDecimal.ZERO : task.getQuantity()) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | scheduled = scheduled.min(amount); |
| | | } |
| | | } |
| | | scheduleWorkOrderMapper.updateById(new MesProWorkOrderDO().setId(order.getId()).setQuantityScheduled(scheduled)); |
| | | } |
| | |
| | | } |
| | | return result; |
| | | } |
| | | // 2. 回退到工艺路线模板工序 |
| | | // 2. 回退到工艺路线模板工序;未配置工艺路线时视为单工序生产 |
| | | if (routeId == null) { |
| | | return new java.util.ArrayList<>(); |
| | | } |
| | | List<MesProRouteProcessDO> routeProcesses = routeProcessService.getRouteProcessListByRouteId(routeId); |
| | | if (CollUtil.isEmpty(routeProcesses)) { |
| | | throw exception(cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_ROUTE_ENABLE_NO_PROCESS); |