feat:取消完成通过配置决定是否使用mq或者feign

This commit is contained in:
2026-08-03 19:30:54 +08:00
parent 1e3f95eace
commit d9f21147aa
26 changed files with 841 additions and 88 deletions

View File

@@ -47,6 +47,13 @@
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<scope>provided</scope> <!-- 设置为 provided主要是 PageParam 使用到 -->
</dependency>
<!-- Test 测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
</project>

View File

@@ -22,6 +22,29 @@ public abstract class AbstractTaskCommonApiImpl implements TaskCommonApi {
@Resource
private TaskFactory taskFactory;
/**
* 处理任务完成
*/
@Override
public CommonResult<AcsApplyActionRespVO> doHandleFinished(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
return execute(taskStatusCallApiReqDTO, (task, taskExecuteDTO) -> {
task.doHandleFinish(taskExecuteDTO);
return null;
});
}
/**
* 处理任务取消
*/
@Override
public CommonResult<AcsApplyActionRespVO> doHandleCancelled(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
return execute(taskStatusCallApiReqDTO, (task, taskExecuteDTO) -> {
task.doHandleCancel(taskExecuteDTO);
return null;
});
}
/**
* 处理取货完成
*/
@@ -97,6 +120,8 @@ public abstract class AbstractTaskCommonApiImpl implements TaskCommonApi {
private TaskExecuteDTO buildTaskExecuteDTO(TaskStatusCallApiReqDTO taskStatusCallApiReqDTO) {
return TaskExecuteDTO.builder()
.taskId(taskStatusCallApiReqDTO.getTaskId())
.eventId(taskStatusCallApiReqDTO.getEventId())
.eventType(taskStatusCallApiReqDTO.getStatus())
.payload(taskStatusCallApiReqDTO.getPayload())
.build();
}

View File

@@ -14,6 +14,14 @@ import org.springframework.web.bind.annotation.RequestBody;
*/
public interface TaskCommonApi {
@Operation(summary = "处理任务完成")
@PostMapping("/doHandleFinished")
CommonResult<AcsApplyActionRespVO> doHandleFinished(@RequestBody TaskStatusCallApiReqDTO taskStatusCallApiReqDTO);
@Operation(summary = "处理任务取消")
@PostMapping("/doHandleCancelled")
CommonResult<AcsApplyActionRespVO> doHandleCancelled(@RequestBody TaskStatusCallApiReqDTO taskStatusCallApiReqDTO);
@Operation(summary = "请求取货")
@PostMapping("/do-handle-picked")
CommonResult<AcsApplyActionRespVO> doHandlePicked(@RequestBody TaskStatusCallApiReqDTO taskStatusCallApiReqDTO);

View File

@@ -15,6 +15,9 @@ public class TaskStatusCallApiReqDTO implements Serializable {
/** 任务ID */
private Long taskId;
/** 任务事件唯一标识 */
private String eventId;
/** 任务编码 */
private String taskCode;

View File

@@ -23,6 +23,12 @@ import java.util.Map;
@Component
public class TaskCommonApiFactory {
/** LMS 业务归属编码 */
private static final String LMS_OWNER_SERVICE = "LMS";
/** WMS 业务归属编码 */
private static final String WMS_OWNER_SERVICE = "WMS";
@Autowired(required = false)
private LmsTaskCommonApi lmsTaskCommonApi;
@@ -41,9 +47,11 @@ public class TaskCommonApiFactory {
public void init() {
if (lmsTaskCommonApi != null) {
apiMap.put(RpcConstants.LMS_NAME, lmsTaskCommonApi);
apiMap.put(LMS_OWNER_SERVICE, lmsTaskCommonApi);
}
if (wmsTaskCommonApi != null) {
apiMap.put(RpcConstants.WMS_NAME, wmsTaskCommonApi);
apiMap.put(WMS_OWNER_SERVICE, wmsTaskCommonApi);
}
}

View File

@@ -24,6 +24,12 @@ public class TaskExecuteDTO {
@NotNull(message = "任务ID不能为空")
private Long taskId;
@Schema(description = "任务事件唯一标识")
private String eventId;
@Schema(description = "任务事件类型")
private String eventType;
@Schema(description = "ACS反馈扩展数据")
private Map<String, Object> payload;
}

View File

@@ -53,7 +53,7 @@ public class AcsUtil {
String response;
try {
response = HttpUtils.post(url, headers(), JsonUtils.toJsonString(request));
log.info("ACS 返回值:{}", JSON.toJSONString(response));
log.info("ACS 返回值:{}", response);
} catch (RuntimeException ex) {
if (isNetworkException(ex)) {
log.error("ACS 服务网络不通url={}request={}", url, JsonUtils.toJsonString(request), ex);

View File

@@ -0,0 +1,126 @@
package cn.code.nl.framework.execute.biz.api;
import cn.code.nl.framework.execute.biz.dto.TaskStatusCallApiReqDTO;
import cn.code.nl.framework.execute.core.AbstractTask;
import cn.code.nl.framework.execute.core.TaskFactory;
import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 任务通用 Feign 接口本地 Spring 集成测试
*/
@SpringBootTest(classes = {
TaskFactory.class,
AbstractTaskCommonApiImplLocalSpringTest.TestTaskCommonApi.class,
AbstractTaskCommonApiImplLocalSpringTest.TestTask.class
})
class AbstractTaskCommonApiImplLocalSpringTest {
@Resource
private TestTaskCommonApi testTaskCommonApi;
@Resource
private TestTask testTask;
/**
* 验证完成接口按 handleCode 路由并传递任务参数
*/
@Test
void doHandleFinishedShouldRouteTask() {
TaskStatusCallApiReqDTO reqDTO = buildReqDTO();
testTaskCommonApi.doHandleFinished(reqDTO).getCheckedData();
Assertions.assertNotNull(testTask.getFinishedDTO());
Assertions.assertEquals(1001L, testTask.getFinishedDTO().getTaskId());
Assertions.assertEquals("1001_TASK_FINISHED", testTask.getFinishedDTO().getEventId());
Assertions.assertEquals("TASK_FINISHED", testTask.getFinishedDTO().getEventType());
Assertions.assertEquals("value", testTask.getFinishedDTO().getPayload().get("key"));
}
/**
* 验证取消接口按 handleCode 路由并传递任务参数
*/
@Test
void doHandleCancelledShouldRouteTask() {
TaskStatusCallApiReqDTO reqDTO = buildReqDTO();
reqDTO.setEventId("1001_TASK_CANCELLED");
reqDTO.setStatus("TASK_CANCELLED");
testTaskCommonApi.doHandleCancelled(reqDTO).getCheckedData();
Assertions.assertNotNull(testTask.getCancelledDTO());
Assertions.assertEquals(1001L, testTask.getCancelledDTO().getTaskId());
Assertions.assertEquals("1001_TASK_CANCELLED", testTask.getCancelledDTO().getEventId());
Assertions.assertEquals("TASK_CANCELLED", testTask.getCancelledDTO().getEventType());
Assertions.assertEquals("value", testTask.getCancelledDTO().getPayload().get("key"));
}
/**
* 构建任务状态调用参数
*/
private TaskStatusCallApiReqDTO buildReqDTO() {
TaskStatusCallApiReqDTO reqDTO = new TaskStatusCallApiReqDTO();
reqDTO.setTaskId(1001L);
reqDTO.setTaskCode("TASK-1001");
reqDTO.setEventId("1001_TASK_FINISHED");
reqDTO.setStatus("TASK_FINISHED");
reqDTO.setHandleCode("testTask");
reqDTO.setPayload(Map.of("key", "value"));
return reqDTO;
}
/**
* 测试任务通用接口实现
*/
@Component
static class TestTaskCommonApi extends AbstractTaskCommonApiImpl {
}
/**
* 测试任务处理器
*/
@Component("testTask")
static class TestTask extends AbstractTask {
private TaskExecuteDTO finishedDTO;
private TaskExecuteDTO cancelledDTO;
/**
* 记录完成任务参数
*/
@Override
public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) {
this.finishedDTO = taskExecuteDTO;
}
/**
* 记录取消任务参数
*/
@Override
public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) {
this.cancelledDTO = taskExecuteDTO;
}
/**
* 获取完成任务参数
*/
public TaskExecuteDTO getFinishedDTO() {
return finishedDTO;
}
/**
* 获取取消任务参数
*/
public TaskExecuteDTO getCancelledDTO() {
return cancelledDTO;
}
}
}

View File

@@ -0,0 +1,61 @@
package cn.code.nl.framework.execute.core;
import cn.code.nl.framework.execute.biz.api.AbstractTaskCommonApiImpl;
import cn.code.nl.framework.execute.biz.api.lms.LmsTaskCommonApi;
import cn.code.nl.framework.execute.biz.api.wms.WmsTaskCommonApi;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
/**
* 任务通用 API 工厂本地 Spring 集成测试
*/
@SpringBootTest(classes = {
TaskFactory.class,
TaskCommonApiFactory.class,
TaskCommonApiFactoryLocalSpringTest.TestLmsTaskCommonApi.class,
TaskCommonApiFactoryLocalSpringTest.TestWmsTaskCommonApi.class
})
class TaskCommonApiFactoryLocalSpringTest {
@Resource
private TaskCommonApiFactory taskCommonApiFactory;
@Resource
private TestLmsTaskCommonApi testLmsTaskCommonApi;
@Resource
private TestWmsTaskCommonApi testWmsTaskCommonApi;
/**
* 验证业务归属编码 LMS 能定位 Feign 接口
*/
@Test
void getByServerNameShouldSupportLmsOwnerService() {
Assertions.assertSame(testLmsTaskCommonApi, taskCommonApiFactory.getByServerName("LMS"));
}
/**
* 验证业务归属编码 WMS 能定位 Feign 接口
*/
@Test
void getByServerNameShouldSupportWmsOwnerService() {
Assertions.assertSame(testWmsTaskCommonApi, taskCommonApiFactory.getByServerName("WMS"));
}
/**
* 测试 LMS Feign 接口
*/
@Component
static class TestLmsTaskCommonApi extends AbstractTaskCommonApiImpl implements LmsTaskCommonApi {
}
/**
* 测试 WMS Feign 接口
*/
@Component
static class TestWmsTaskCommonApi extends AbstractTaskCommonApiImpl implements WmsTaskCommonApi {
}
}