| | |
| | | public class MesProTaskServiceImpl implements MesProTaskService { |
| | | |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackEquipmentService equipmentService; |
| | | |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.pro.task.schedule.MesProScheduleGuardService scheduleGuard; |
| | | |
| | | @Resource |
| | |
| | | if (itemId == null) { |
| | | MesProRouteProcessDO routeProcess = routeProcessService |
| | | .getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId()); |
| | | if (routeProcess != null && routeProcess.getOutputItemId() != null) { |
| | | itemId = Long.valueOf(routeProcess.getOutputItemId().split(",")[0].trim()); |
| | | } else { |
| | | itemId = workOrder.getProductId(); |
| | | } |
| | | itemId = resolveTaskItemId(routeProcess, workOrder.getProductId()); |
| | | } |
| | | MesMdItemDO item = itemService.validateItemExists(itemId); |
| | | |
| | |
| | | return routeProcesses; |
| | | } |
| | | |
| | | /** 当前产品的任务产出,优先使用工序的产品归属配置。 */ |
| | | private Long resolveTaskItemId(MesProRouteProcessDO routeProcess, Long productId) { |
| | | if (routeProcess == null) { |
| | | return productId; |
| | | } |
| | | if (routeProcess.getId() != null) { |
| | | List<Long> outputIds = routeProcessService |
| | | .getOutputItemIdsByRouteProcessId(routeProcess.getId(), productId); |
| | | if (outputIds != null) { |
| | | return CollUtil.isNotEmpty(outputIds) ? outputIds.get(0) : productId; |
| | | } |
| | | } |
| | | String outputItemId = routeProcess.getOutputItemId(); |
| | | if (outputItemId != null && !outputItemId.isBlank()) { |
| | | return Long.valueOf(outputItemId.split(",")[0].trim()); |
| | | } |
| | | return productId; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteTask(Long id) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void finishTaskByOrderId(Long workOrderId) { |
| | | equipmentService.lock(); |
| | | // 1. 读取工单下所有任务,过滤掉已完成/已取消的 |
| | | List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(workOrderId); |
| | | LocalDateTime now = LocalDateTime.now(); |
| | |
| | | if (CollUtil.isNotEmpty(updateList)) { |
| | | taskMapper.updateBatch(updateList); |
| | | } |
| | | equipmentService.afterTaskStateChanged(tasks); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancelTaskByOrderId(Long workOrderId) { |
| | | equipmentService.lock(); |
| | | // 1. 读取工单下所有任务,过滤掉已完成/已取消的 |
| | | List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(workOrderId); |
| | | LocalDateTime now = LocalDateTime.now(); |
| | |
| | | if (CollUtil.isNotEmpty(updateList)) { |
| | | taskMapper.updateBatch(updateList); |
| | | } |
| | | equipmentService.afterTaskStateChanged(tasks); |
| | | } |
| | | |
| | | @Override |
| | |
| | | List<Long> taskIds = new java.util.ArrayList<>(); |
| | | for (MesProRouteProcessDO rp : routeProcesses) { |
| | | cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO proc = procMap.get(rp.getProcessId()); |
| | | Long itemId = rp.getOutputItemId() != null ? Long.valueOf(rp.getOutputItemId().split(",")[0].trim()) : workOrder.getProductId(); |
| | | Long itemId = resolveTaskItemId(rp, workOrder.getProductId()); |
| | | cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.validateItemExists(itemId); |
| | | MesProTaskDO task = new MesProTaskDO() |
| | | .setWorkOrderId(workOrder.getId()) |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void pauseTask(MesProTaskPauseReqVO pauseReqVO) { |
| | | equipmentService.lock(); |
| | | // 1. 校验任务存在 |
| | | MesProTaskDO task = validateTaskExists(pauseReqVO.getId()); |
| | | // 2. 校验状态是否允许停工(如必须是 生产中 或 部分完成) |
| | | if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus())) { |
| | | if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus(), |
| | | MesProTaskStatusEnum.PRODUCING.getStatus(), MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus())) { |
| | | throw exception(PRO_TASK_CANNOT_PAUSE); |
| | | } |
| | | |
| | |
| | | .setPauseTime(LocalDateTime.now()) |
| | | .setPauseUserId(SecurityFrameworkUtils.getLoginUserId()); |
| | | taskPauseRecordMapper.insert(pauseRecord); |
| | | equipmentService.afterTaskStateChanged(List.of(task)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void resumeTask(MesProTaskResumeReqVO resumeReqVO) { |
| | | equipmentService.lock(); |
| | | // 1. 校验任务存在 |
| | | MesProTaskDO task = validateTaskExists(resumeReqVO.getId()); |
| | | // 2. 校验状态必须是已停工 |
| | |
| | | } |
| | | |
| | | // 3. 恢复任务状态 |
| | | Integer resumeStatus = MesProTaskStatusEnum.PREPARE.getStatus(); |
| | | Integer resumeStatus = task.getProducedQuantity() != null && task.getProducedQuantity().signum() > 0 |
| | | ? MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus() : MesProTaskStatusEnum.PREPARE.getStatus(); |
| | | taskMapper.updateById(new MesProTaskDO().setId(task.getId()).setStatus(resumeStatus)); |
| | | equipmentService.validateResume(task); |
| | | equipmentService.afterTaskStateChanged(List.of(task)); |
| | | |
| | | // 4. 更新最新的一条停工记录 |
| | | MesProTaskPauseRecordDO pauseRecord = taskPauseRecordMapper.selectLastUnresumedByTaskId(task.getId()); |