From a066ec3637e071df5a189f02e21ef72aa18672dd Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Wed, 15 Jul 2026 10:10:17 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BB=BB=E5=8A=A1=E5=88=9B?= =?UTF-8?q?=E5=BB=BA/=E4=BF=AE=E6=94=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nl/module/task/api/TransportTaskApi.java | 5 ++ .../task/enums/TransportTaskStatusEnum.java | 28 ++++----- .../module/task/api/TransportTaskApiImpl.java | 11 ++++ .../transporttask/TaskCallbackController.java | 37 ------------ .../task/framework/common/package-info.java | 6 ++ .../task/framework/common/util/TaskUtil.java | 20 +++++++ .../TransportTaskFeedbackServiceImpl.java | 59 ++++++------------- .../TransportTaskServiceImpl.java | 8 +-- .../src/main/resources/application.yaml | 4 +- 9 files changed, 80 insertions(+), 98 deletions(-) delete mode 100644 nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/controller/admin/transporttask/TaskCallbackController.java create mode 100644 nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/package-info.java create mode 100644 nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/util/TaskUtil.java 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 0fcc085f..adc8f652 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 @@ -2,6 +2,7 @@ package cn.code.nl.module.task.api; import cn.code.nl.framework.common.pojo.CommonResult; import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO; +import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO; import cn.code.nl.module.task.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -25,4 +26,8 @@ public interface TransportTaskApi { @PostMapping(PREFIX + "/create") @Operation(summary = "创建搬运任务(LMS/WMS 调用)") CommonResult createTransportTask(@Valid @RequestBody TransportTaskCreateReqDTO reqDTO); + + @PostMapping(PREFIX + "/callback-result") + @Operation(summary = "接收 LMS/WMS 业务处理结果") + CommonResult receiveCallbackResult(@Valid @RequestBody TaskCallbackResultReqDTO reqDTO); } diff --git a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TransportTaskStatusEnum.java b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TransportTaskStatusEnum.java index e5b49c5f..7cb148c6 100644 --- a/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TransportTaskStatusEnum.java +++ b/nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/enums/TransportTaskStatusEnum.java @@ -10,34 +10,34 @@ import lombok.Getter; @Getter public enum TransportTaskStatusEnum { - CREATED(10, "生成"), + CREATED("10", "生成"), - READY(40, "待下发-起点终点确认"), + READY("40", "待下发-起点终点确认"), - ISSUING(45, "下发中"), + ISSUING("45", "下发中"), - ISSUED(50, "已下发"), + ISSUED("50", "已下发"), - EXECUTING(60, "执行中"), + EXECUTING("60", "执行中"), - PICKED(61, "已取货搬运中"), + PICKED("61", "已取货搬运中"), - FINISHED_CALLBACK_PENDING(67, "外部完成待业务处理"), + FINISHED_CALLBACK_PENDING("67", "外部完成待业务处理"), - CANCEL_EXTERNAL_PENDING(68, "外部取消中"), + CANCEL_EXTERNAL_PENDING("68", "外部取消中"), - CANCEL_CALLBACK_PENDING(69, "外部取消待业务处理"), + CANCEL_CALLBACK_PENDING("69", "外部取消待业务处理"), - FINISHED(70, "完成"), + FINISHED("70", "完成"), - CANCELLED(80, "取消"), + CANCELLED("80", "取消"), - FAILED(90, "失败"); + FAILED("90", "失败"); - private final Integer code; + private final String code; private final String name; - TransportTaskStatusEnum(Integer code, String name) { + TransportTaskStatusEnum(String code, String name) { this.code = code; this.name = name; } 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 b2a59da3..0d5f2d7c 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 @@ -2,6 +2,8 @@ package cn.code.nl.module.task.api; import cn.code.nl.framework.common.pojo.CommonResult; import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO; +import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO; +import cn.code.nl.module.task.service.transporttask.TransportTaskCallbackService; import cn.code.nl.module.task.service.transporttask.TransportTaskService; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -19,8 +21,17 @@ public class TransportTaskApiImpl implements TransportTaskApi { @Resource private TransportTaskService transportTaskService; + @Resource + private TransportTaskCallbackService callbackService; + @Override public CommonResult createTransportTask(TransportTaskCreateReqDTO reqDTO) { return success(transportTaskService.createTransportTaskByRpc(reqDTO)); } + + @Override + public CommonResult receiveCallbackResult(TaskCallbackResultReqDTO reqDTO) { + callbackService.receiveCallbackResult(reqDTO); + return success(true); + } } diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/controller/admin/transporttask/TaskCallbackController.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/controller/admin/transporttask/TaskCallbackController.java deleted file mode 100644 index dc7840d8..00000000 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/controller/admin/transporttask/TaskCallbackController.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.code.nl.module.task.controller.admin.transporttask; - -import cn.code.nl.framework.common.pojo.CommonResult; -import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO; -import cn.code.nl.module.task.enums.ApiConstants; -import cn.code.nl.module.task.service.transporttask.TransportTaskCallbackService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static cn.code.nl.framework.common.pojo.CommonResult.success; - -/** - * LMS/WMS 业务回调结果接口 - */ -@Tag(name = "业务回调") -@RestController -@RequestMapping(ApiConstants.PREFIX) -@Validated -public class TaskCallbackController { - - @Resource - private TransportTaskCallbackService callbackService; - - @PostMapping("/transport/callback-result") - @Operation(summary = "接收 LMS/WMS 业务处理结果") - public CommonResult receiveCallbackResult(@Valid @RequestBody TaskCallbackResultReqDTO reqDTO) { - callbackService.receiveCallbackResult(reqDTO); - return success(true); - } -} diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/package-info.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/package-info.java new file mode 100644 index 00000000..1c1a0850 --- /dev/null +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/package-info.java @@ -0,0 +1,6 @@ +/** + * 任务模块的通用包 + * @Author: liyongde + * @Date: 2026/7/15 9:59 + */ +package cn.code.nl.module.task.framework.common; \ No newline at end of file diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/util/TaskUtil.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/util/TaskUtil.java new file mode 100644 index 00000000..572ae384 --- /dev/null +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/framework/common/util/TaskUtil.java @@ -0,0 +1,20 @@ +package cn.code.nl.module.task.framework.common.util; + +/** + * 任务工具类 + * @Author: liyongde + * @Date: 2026/7/15 9:59 + */ +public class TaskUtil { + /** + * 判断当前状态是否在允许的前置状态列表中 + */ + public static boolean isAllowedFrom(String current, String... allowed) { + for (String s : allowed) { + if (s.equals(current)) { + return true; + } + } + return false; + } +} diff --git a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java index 94d4df46..531871b3 100644 --- a/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java +++ b/nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskFeedbackServiceImpl.java @@ -15,11 +15,14 @@ import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import jakarta.annotation.Resource; import java.util.Map; +import static cn.code.nl.module.task.framework.common.util.TaskUtil.isAllowedFrom; + /** * ACS 反馈处理服务实现 * @@ -42,6 +45,7 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @Override + @Transactional(rollbackFor = Exception.class) public void receiveAcsFeedback(AcsFeedbackReqDTO reqDTO) { // 1. 查询任务 TransportTaskDO task = transportTaskMapper.selectById(reqDTO.getTaskId()); @@ -52,7 +56,8 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe // 2. 幂等判断:已经是终态(完成/取消)则不重复处理 String currentStatus = task.getTaskStatus(); - if (isFinalStatus(currentStatus)) { + if (TransportTaskStatusEnum.FINISHED.getCode().equals(currentStatus) + || TransportTaskStatusEnum.CANCELLED.getCode().equals(currentStatus)) { log.info("任务已处终态, taskId={}, currentStatus={}, 忽略反馈", reqDTO.getTaskId(), currentStatus); return; @@ -88,12 +93,12 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe * 处理执行中(60):直接更新状态,不做业务回调 */ private void handleExecuting(TransportTaskDO task) { - if (!isAllowedFrom(task.getTaskStatus(), "040", "050", "060")) { + if (!isAllowedFrom(task.getTaskStatus(), "40", "50")) { log.warn("执行中反馈状态校验不通过, taskId={}, currentStatus={}", task.getTaskId(), task.getTaskStatus()); return; } - task.setTaskStatus(statusCode(TransportTaskStatusEnum.EXECUTING)); + task.setTaskStatus(TransportTaskStatusEnum.EXECUTING.getCode()); transportTaskMapper.updateById(task); log.info("任务执行中, taskId={}", task.getTaskId()); } @@ -102,16 +107,17 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe * 处理取货完成(61):更新状态 + 同步 HTTP 回调 LMS/WMS */ private void handlePicked(TransportTaskDO task, AcsFeedbackReqDTO reqDTO) { - if (!isAllowedFrom(task.getTaskStatus(), "060", "061")) { + if (!isAllowedFrom(task.getTaskStatus(), "60", "61")) { log.warn("取货完成反馈状态校验不通过, taskId={}, currentStatus={}", task.getTaskId(), task.getTaskStatus()); return; } // 更新状态 - task.setTaskStatus(statusCode(TransportTaskStatusEnum.PICKED)); + task.setTaskStatus(TransportTaskStatusEnum.PICKED.getCode()); transportTaskMapper.updateById(task); log.info("任务已取货, taskId={}", task.getTaskId()); + // todo: 改成 feign 的 rpc 调用 // 同步 HTTP 回调 LMS/WMS TaskStatusCallbackReqDTO callbackReq = buildCallbackReq(task, reqDTO); TaskStatusCallbackRespDTO resp = transportTaskStatusClient.notifyStatus(callbackReq); @@ -132,14 +138,14 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe * 处理完成(67):更新状态 + 异步 MQ 通知 LMS/WMS */ private void handleFinished(TransportTaskDO task, AcsFeedbackReqDTO reqDTO) { - if (!isAllowedFrom(task.getTaskStatus(), "050", "060", "061", "067")) { + if (!isAllowedFrom(task.getTaskStatus(), "10", "40", "45", "50", "60", "61", "67")) { log.warn("完成反馈状态校验不通过, taskId={}, currentStatus={}", task.getTaskId(), task.getTaskStatus()); return; } - // 已是 067 则只发 MQ,不改状态 - if (!statusCode(TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING).equals(task.getTaskStatus())) { - task.setTaskStatus(statusCode(TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING)); + // 已是 67 则只发 MQ,不改状态 + if (!TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING.getCode().equals(task.getTaskStatus())) { + task.setTaskStatus(TransportTaskStatusEnum.FINISHED_CALLBACK_PENDING.getCode()); } task.setCallbackStatus(CallbackStatusEnum.PENDING.getCode()); transportTaskMapper.updateById(task); @@ -151,13 +157,13 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe * 处理取消(69):更新状态 + 异步 MQ 通知 LMS/WMS */ private void handleCancelled(TransportTaskDO task, AcsFeedbackReqDTO reqDTO) { - if (!isAllowedFrom(task.getTaskStatus(), "040", "050", "060", "061", "069")) { + if (!isAllowedFrom(task.getTaskStatus(), "10", "40", "45", "50", "60", "61", "67", "69")) { log.warn("取消反馈状态校验不通过, taskId={}, currentStatus={}", task.getTaskId(), task.getTaskStatus()); return; } - if (!statusCode(TransportTaskStatusEnum.CANCEL_CALLBACK_PENDING).equals(task.getTaskStatus())) { - task.setTaskStatus(statusCode(TransportTaskStatusEnum.CANCEL_CALLBACK_PENDING)); + if (!TransportTaskStatusEnum.CANCEL_CALLBACK_PENDING.getCode().equals(task.getTaskStatus())) { + task.setTaskStatus(TransportTaskStatusEnum.CANCEL_CALLBACK_PENDING.getCode()); } task.setCallbackStatus(CallbackStatusEnum.PENDING.getCode()); transportTaskMapper.updateById(task); @@ -201,7 +207,7 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe TaskStatusCallbackReqDTO req = new TaskStatusCallbackReqDTO(); req.setTaskId(task.getTaskId()); req.setTaskCode(task.getTaskCode()); - req.setStatus(statusCode(TransportTaskStatusEnum.PICKED)); + req.setStatus(TransportTaskStatusEnum.PICKED.getCode()); req.setOwnerService(task.getOwnerService()); req.setBizType(task.getBizType()); req.setBizId(task.getBizId()); @@ -209,31 +215,4 @@ public class TransportTaskFeedbackServiceImpl implements TransportTaskFeedbackSe req.setPayload(reqDTO.getPayload()); return req; } - - /** - * 判断是否已是终态(已完成/已取消) - */ - private boolean isFinalStatus(String status) { - return statusCode(TransportTaskStatusEnum.FINISHED).equals(status) - || statusCode(TransportTaskStatusEnum.CANCELLED).equals(status); - } - - /** - * 判断当前状态是否在允许的前置状态列表中 - */ - private boolean isAllowedFrom(String current, String... allowed) { - for (String s : allowed) { - if (s.equals(current)) { - return true; - } - } - return false; - } - - /** - * 获取枚举对应的三位状态码字符串 - */ - private String statusCode(TransportTaskStatusEnum statusEnum) { - return String.format("%03d", statusEnum.getCode()); - } } 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 f4fa2e49..73cb10b4 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 @@ -1,6 +1,5 @@ package cn.code.nl.module.task.service.transporttask; -import cn.code.nl.framework.common.exception.ServiceException; import cn.code.nl.framework.common.pojo.PageResult; import cn.code.nl.framework.common.util.object.BeanUtils; import cn.code.nl.module.task.controller.admin.transporttask.vo.TransportTaskPageReqVO; @@ -10,7 +9,6 @@ import cn.code.nl.module.task.dal.mysql.transporttask.TransportTaskMapper; import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO; import cn.code.nl.module.task.enums.CallbackStatusEnum; import cn.code.nl.module.task.enums.TransportTaskStatusEnum; -import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -18,7 +16,7 @@ import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.code.nl.module.task.enums.ErrorCodeConstants.*; +import static cn.code.nl.module.task.enums.ErrorCodeConstants.TRANSPORT_TASK_NOT_EXISTS; /** * 搬运任务 Service 实现类 @@ -48,8 +46,8 @@ public class TransportTaskServiceImpl implements TransportTaskService { TransportTaskDO task = BeanUtils.toBean(reqDTO, TransportTaskDO.class); // 参数完整 → 待下发(040),否则 → 生成(010) task.setTaskStatus(reqDTO.getIsCreateFinish() - ? String.valueOf(TransportTaskStatusEnum.READY.getCode()) - : String.valueOf(TransportTaskStatusEnum.CREATED.getCode())); + ? TransportTaskStatusEnum.READY.getCode() + : TransportTaskStatusEnum.CREATED.getCode()); task.setCallbackStatus(CallbackStatusEnum.PENDING.getCode()); task.setCallbackRetryCount(0); task.setCreateMode("RPC"); diff --git a/nl-module-task/nl-module-task-server/src/main/resources/application.yaml b/nl-module-task/nl-module-task-server/src/main/resources/application.yaml index 6787012b..a51ce1d9 100644 --- a/nl-module-task/nl-module-task-server/src/main/resources/application.yaml +++ b/nl-module-task/nl-module-task-server/src/main/resources/application.yaml @@ -136,8 +136,8 @@ nl: enable: false ignore-urls: ignore-visit-urls: - - /admin-api/system/user/profile/** - - /admin-api/system/auth/** + - /admin-api/task/user/profile/** + - /admin-api/task/auth/** ignore-tables: ignore-caches: sms-code: # 短信验证码相关的配置项