fix:任务创建/修改状态
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* 任务模块的通用包
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/7/15 9:59
|
||||
*/
|
||||
package cn.code.nl.module.task.framework.common;
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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: # 短信验证码相关的配置项
|
||||
|
||||
Reference in New Issue
Block a user