diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java index e6567d05..c9579ac9 100644 --- a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java +++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java @@ -39,6 +39,10 @@ public interface TransportTaskApi { @Operation(summary = "根据 taskId 下发搬运任务") CommonResult issueTransportTask(@RequestParam("taskId") Long taskId); + @PostMapping(PREFIX + "/issue-rollback") + @Operation(summary = "根据 taskId 下发搬运任务可回滚") + CommonResult issueTransportTaskRollBack(@RequestParam("taskId") Long taskId); + @GetMapping(PREFIX + "/getTaskById") @Operation(summary = "根据 taskId 查询任务") CommonResult getTaskById(@RequestParam("taskId") Long taskId); diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java index bd873ea6..707e80c1 100644 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java @@ -44,6 +44,12 @@ public class TransportTaskApiImpl implements TransportTaskApi { return success(true); } + @Override + public CommonResult issueTransportTaskRollBack(Long taskId) { + transportTaskService.issueTransportTaskRollBack(taskId); + return success(true); + } + @Override public CommonResult getTaskById(Long taskId) { return success(transportTaskService.getTaskInfoById(taskId)); diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java index 53af8afe..b59ead12 100644 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/manage/TransportTaskIssueManager.java @@ -57,6 +57,29 @@ public class TransportTaskIssueManager { taskMap.forEach(this::issueProductAreaTasks); } + /** + * 下发单个任务到 ACS,失败时直接抛出异常 + * + * @param task 待下发任务 + */ + public void issueTask(TransportTaskDO task) { + if (StrUtil.isBlank(task.getProductArea())) { + throw new ServiceException(500, buildIssueFailedMessage("生产区域为空,无法获取 ACS 服务地址")); + } + List acsTasks = List.of(AcsTaskUtil.buildAcsTaskDTO(task)); + String requestJson = JsonUtils.toJsonString(acsTasks); + try { + String serverAddress = getAcsServerAddress(task.getProductArea()); + AcsIssueResultRespDTO result = AcsUtil.post(serverAddress, ACS_TASK_API, acsTasks, AcsIssueResultRespDTO.class); + handleSingleIssueResult(task, result); + } catch (ServiceException ex) { + throw ex; + } catch (Exception ex) { + log.error("下发单个任务失败,productArea={},tasks={}", task.getProductArea(), requestJson, ex); + throw new ServiceException(500, buildIssueFailedMessage(ex.getMessage())); + } + } + /** * 下发单个生产区域的任务 * @@ -125,6 +148,37 @@ public class TransportTaskIssueManager { } } + /** + * 处理单个任务的 ACS 下发响应 + * + * @param task 本次下发任务 + * @param result ACS 响应 + */ + private void handleSingleIssueResult(TransportTaskDO task, AcsIssueResultRespDTO result) { + if (result == null) { + throw new ServiceException(500, buildIssueFailedMessage("ACS 返回为空")); + } + String resultJson = JsonUtils.toJsonString(result); + if (Boolean.TRUE.equals(result.getSuccess())) { + transportTaskMapper.updateIssueResult(task.getTaskId(), TransportTaskStatusEnum.ISSUED.getCode(), resultJson, null); + return; + } + String errorMessage = CollUtil.isNotEmpty(result.getFailedTasks()) + ? result.getFailedTasks().get(0).getErrorMessage() + : result.getMsg(); + throw new ServiceException(500, buildIssueFailedMessage(StrUtil.blankToDefault(errorMessage, "ACS 下发失败"))); + } + + /** + * 构建单个任务下发失败提示 + * + * @param reason 失败原因 + * @return 失败提示 + */ + private String buildIssueFailedMessage(String reason) { + return "任务下发失败,失败原因:" + reason; + } + /** * 更新任务为下发失败 * diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java index 92d41856..27057427 100644 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java @@ -82,6 +82,12 @@ public interface TransportTaskService { * @param taskId 任务ID */ void issueTransportTask(Long taskId); + /** + * 根据任务ID下发搬运任务到 ACS 报错回滚 + * + * @param taskId 任务ID + */ + void issueTransportTaskRollBack(Long taskId); /** * 根据 taskId 查询任务全量信息(RPC 用,自动过滤逻辑删除,查不到返回 null) diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java index 8181a758..5a3a48df 100644 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java @@ -184,6 +184,15 @@ public class TransportTaskServiceImpl implements TransportTaskService { transportTaskOperationManager.dispatchOperation(task, TaskOperationTypeEnum.ISSUE, reqDTO); } + @Override + public void issueTransportTaskRollBack(Long taskId) { + TransportTaskDO task = transportTaskMapper.selectById(taskId); + if (task == null) { + throw exception(TRANSPORT_TASK_NOT_EXISTS); + } + transportTaskIssueManager.issueTask(task); + } + @Override public TaskInfoDTO getTaskInfoById(Long taskId) { TransportTaskDO task = transportTaskMapper.selectById(taskId);