fix:任务创建/修改状态

This commit is contained in:
2026-07-15 10:10:17 +08:00
parent 63994ef588
commit a066ec3637
9 changed files with 80 additions and 98 deletions

View File

@@ -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<Long> createTransportTask(@Valid @RequestBody TransportTaskCreateReqDTO reqDTO);
@PostMapping(PREFIX + "/callback-result")
@Operation(summary = "接收 LMS/WMS 业务处理结果")
CommonResult<Boolean> receiveCallbackResult(@Valid @RequestBody TaskCallbackResultReqDTO reqDTO);
}

View File

@@ -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;
}

View File

@@ -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<Long> createTransportTask(TransportTaskCreateReqDTO reqDTO) {
return success(transportTaskService.createTransportTaskByRpc(reqDTO));
}
@Override
public CommonResult<Boolean> receiveCallbackResult(TaskCallbackResultReqDTO reqDTO) {
callbackService.receiveCallbackResult(reqDTO);
return success(true);
}
}

View File

@@ -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<Boolean> receiveCallbackResult(@Valid @RequestBody TaskCallbackResultReqDTO reqDTO) {
callbackService.receiveCallbackResult(reqDTO);
return success(true);
}
}

View File

@@ -0,0 +1,6 @@
/**
* 任务模块的通用包
* @Author: liyongde
* @Date: 2026/7/15 9:59
*/
package cn.code.nl.module.task.framework.common;

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -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");

View File

@@ -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: # 短信验证码相关的配置项