Files
huachuang/docs/superpowers/specs/2026-07-14-task-core-design.md

309 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Task 服务核心业务设计文档
> 日期: 2026-07-14
> 分支: feature/20260713/task-module
> 参考: doc/task-service-technical-development.md
## 1. 概述
Task 服务是搬运任务生命周期中台,负责接收 LMS/WMS 创建的任务、接收 ACS 状态反馈、维护任务状态机、以及通过 HTTP/MQ 将状态变更通知回 LMS/WMS。
### 1.1 本期范围
| 本期做 | 本期不做 |
|--------|----------|
| LMS/WMS 创建任务 (RPC) | 定时器自动下发 ACS |
| ACS 反馈:执行中、取货完成、完成、取消 | ACS 下发接口调用 |
| 取货完成同步 HTTP 回调 LMS/WMS | 下发中超时补偿 |
| 完成/取消 MQ 异步通知 LMS/WMS | 回调超时重试补偿 |
| 业务回调结果接收 + 状态更新 | AcsTaskDto 转换器 |
| 幂等控制(创建、反馈、回调) | 人工完成/取消 |
| 管理后台 CRUD已有 | 任务过程日志表 |
## 2. 整体交互流程
```
LMS/WMS Task 服务 ACS
│ │ │
│── POST /rpc-api/task/transport/create ──→│ │
│ │ 保存任务(status=040) │
│←── 返回 taskId ───────────────│ │
│ │ │
│ │ (后续: 定时器下发ACS) │
│ │ │
│ │←── ACS 反馈 执行中(60) ───────│
│ │ 更新状态, 直接返回成功 │
│ │ │
│ │←── ACS 反馈 取货完成(61) ─────│
│ │ 更新状态 │
│←── POST /rpc-api/{service}/transport-task/status-callback ──│ │
│── 同步执行业务处理 ──────────→│ │
│←── 返回业务结果 ─────────────│ │
│ │──── 返回成功给 ACS ───────────→│
│ │ (AGV 可继续) │
│ │ │
│ │←── ACS 反馈 完成 ─────────────│
│ │ status=067, callback=PENDING │
│←── MQ: TASK_EVENT:LMS ───────│ (异步) │
│ 业务处理 → 回调 Task ───────→│ status=070, callback=SUCCESS │
│ │ │
│ │←── ACS 反馈 取消 ─────────────│
│ │ status=069, callback=PENDING │
│←── MQ: TASK_EVENT:LMS ───────│ (异步) │
│ 业务处理 → 回调 Task ───────→│ status=080, callback=SUCCESS │
```
### 2.1 回调策略总结
| ACS 状态 | Task 动作 | 通知方式 | 说明 |
|----------|----------|----------|------|
| 执行中(60) | 更新 status=060 | 无 | 直接改状态 |
| 取货完成(61) | 更新 status=061 | HTTP 同步 | 调 LMS/WMS等业务完成再回 ACS |
| 完成 | status=067, callback=PENDING | MQ 异步 | 通知后不等待LMS/WMS 处理完回调 |
| 取消 | status=069, callback=PENDING | MQ 异步 | 同上 |
## 3. 状态机
### 3.1 状态枚举
```java
CREATED(10, "生成")
READY(40, "待下发")
ISSUING(45, "下发中")
ISSUED(50, "已下发")
EXECUTING(60, "执行中")
PICKED(61, "已取货搬运中")
FINISHED_CALLBACK_PENDING(67, "外部完成待业务处理")
CANCEL_EXTERNAL_PENDING(68, "外部取消中")
CANCEL_CALLBACK_PENDING(69, "外部取消待业务处理")
FINISHED(70, "完成")
CANCELLED(80, "取消")
FAILED(90, "失败")
```
### 3.2 本期状态流转
```
010(生成) → 040(待下发)
040(待下发) → 060(执行中) → 061(取货完成) → 067(外部完成待业务处理) → 070(完成)
→ 069(外部取消待业务处理) → 080(取消)
```
### 3.3 状态前置校验
| 目标状态 | 允许的前置状态 |
|----------|---------------|
| EXECUTING(60) | 040, 050, 060 |
| PICKED(61) | 060, 061 |
| FINISHED_CALLBACK_PENDING(67) | 050, 060, 061, 067 |
| CANCEL_CALLBACK_PENDING(69) | 040, 050, 060, 061, 069 |
## 4. 接口设计
### 4.1 LMS/WMS → Task创建任务
```
POST /rpc-api/task/transport/create
```
请求 DTO位于 `nl-module-task-api` 模块):
```java
public class TransportTaskCreateReqDTO {
@NotEmpty String taskName;
@NotEmpty String ownerService; // LMS / WMS路由键
@NotEmpty String bizType; // 业务类型
@NotEmpty String bizId; // 业务侧单据ID幂等
@NotEmpty String handleCode; // LMS/WMS内部handler编码
@NotEmpty String acsTaskType; // ACS任务类型
@NotEmpty String agvSystemType;
String pointCode1, pointCode2, pointCode3, pointCode4;
String vehicleCode, vehicleCode2;
String priority;
String productArea;
String isAutoIssue; // 是否自动下发
Map<String, Object> requestParam; // 扩展参数
}
```
创建逻辑:
1. 参数校验
2. 幂等检查:同 bizType + bizId 下是否有未完结任务 (status < 067)有则返回已有 taskId
3. 生成 taskId / taskCode
4. 参数完整 status=040否则 status=010
5. 保存并返回 taskId
### 4.2 ACS → Task状态反馈
```
POST /api/task/transport/acs-feedback
```
```java
public class AcsFeedbackReqDTO {
@NotNull Long taskId;
@NotEmpty String status; // EXECUTING / PICKED / FINISHED / CANCELLED
String eventId; // 幂等键
Map<String, Object> payload; // 保存到 resultParam
}
```
### 4.3 Task → LMS/WMS同步回调取货完成
```
POST /rpc-api/transport-task/status-callback
```
LMS/WMS 需实现此端点路由方式根据 `ownerService` 通过 Nacos 服务发现 + HTTP 调用对应服务
```java
// 请求
public class TaskStatusCallbackReqDTO {
Long taskId;
String taskCode;
String status; // PICKED(61)
String ownerService;
String bizType;
String bizId;
String handleCode; // LMS/WMS内部通过此字段路由到具体handler
Map<String, Object> payload;
}
// 响应
public class TaskStatusCallbackRespDTO {
Boolean success;
String message;
}
```
### 4.4 Task → LMS/WMSMQ 异步通知(完成/取消)
```
Topic: TASK_EVENT_TOPIC
Tag: LMS 或 WMS (即 ownerService)
```
```java
public class TaskEventMessage {
String eventId;
String eventType; // TASK_FINISHED / TASK_CANCELLED
Long taskId;
String taskCode;
String ownerService;
String bizType;
String bizId;
String handleCode;
Map<String, Object> payload;
}
```
### 4.5 LMS/WMS → Task业务处理结果回调
```
POST /rpc-api/task/transport/callback-result
```
```java
public class TaskCallbackResultReqDTO {
@NotNull Long taskId;
@NotEmpty String eventId;
@NotEmpty String result; // SUCCESS / FAILED
String message;
}
```
回调后状态更新
| 场景 | taskStatus | callbackStatus |
|------|-----------|----------------|
| 完成业务成功 | 070 | SUCCESS |
| 完成业务失败 | 067 | FAILED |
| 取消业务成功 | 080 | SUCCESS |
| 取消业务失败 | 069 | FAILED |
## 5. 服务层设计
### 5.1 模块结构
```
nl-module-task-server/
controller/
TransportTaskController ← 已有,管理后台 CRUD
AcsFeedbackController ← 新增:接收 ACS 状态反馈
api/
TransportTaskApiImpl ← 新增:实现 rpc-api 创建任务接口
service/
TransportTaskService ← 已有,扩展创建方法
TransportTaskFeedbackService ← 新增:处理 ACS 状态反馈
TransportTaskCallbackService ← 新增:处理 LMS/WMS 业务回调结果
mq/
TaskEventProducer ← 新增:发送完成/取消 MQ
client/
TransportTaskStatusClient ← 新增:同步 HTTP 调 LMS/WMS
nl-module-task-api/
dto/
TransportTaskCreateReqDTO ← 新增
AcsFeedbackReqDTO ← 新增
TaskStatusCallbackReqDTO ← 新增LMS/WMS 依赖此 DTO 实现端点)
TaskStatusCallbackRespDTO ← 新增
TaskCallbackResultReqDTO ← 新增
TaskEventMessage ← 新增
enums/
TransportTaskStatusEnum ← 已有(需对齐状态码)
CallbackStatusEnum ← 新增
TaskEventTypeEnum ← 新增
```
### 5.2 TransportTaskFeedbackService核心
```
receiveAcsFeedback(AcsFeedbackReqDTO req):
1. 查询任务,校验存在
2. eventId 幂等判断
3. 前置状态校验(不合法则记日志并返回成功)
4. 保存 resultParam
5. 按 status 路由:
EXECUTING:
→ 更新 taskStatus=060
PICKED:
→ 更新 taskStatus=061
→ 同步 HTTP 调 LMS/WMS status-callback
→ 回调失败:记 callbackStatus=FAILED仍返回成功给 ACS
FINISHED:
→ 更新 taskStatus=067, callbackStatus=PENDING
→ 发送 MQ (TASK_FINISHED)
→ MQ 失败:记 callbackStatus=FAILED, callbackErrorMsg
CANCELLED:
→ 更新 taskStatus=069, callbackStatus=PENDING
→ 发送 MQ (TASK_CANCELLED)
→ MQ 失败:记 callbackStatus=FAILED, callbackErrorMsg
```
### 5.3 TransportTaskStatusClientHTTP 同步路由)
```java
// 根据 ownerService → Nacos 服务名 → 构造 URL 调用
// LMS/WMS 通过 handleCode 路由到内部 handler
```
## 6. 错误处理与幂等
| 场景 | 处理 |
|------|------|
| 创建时参数校验失败 | 返回参数错误码 |
| 创建时同名未完结任务已存在 | 返回已有 taskId |
| ACS 反馈 taskId 不存在 | 记录日志返回成功 ACS 重试报错 |
| 反馈状态前置校验不通过 | 记录日志返回成功 |
| 取货完成同步回调 LMS/WMS 失败 | callbackStatus=FAILED仍返回 ACS 成功不阻塞 AGV |
| MQ 发送失败 | callbackStatus=FAILED + callbackErrorMsg |
| 业务回调结果已终态(070/080) | 直接返回成功 |
| 重复 eventId 反馈 | 直接返回成功 |
| 重复创建 bizType+bizId | 返回已有 taskId |
## 7. 测试策略
- **单元测试**TransportTaskFeedbackService 各状态分支状态机约束
- **集成测试**创建 执行中 取货完成 完成 业务回调 终态 完整链路
- **幂等测试**重复创建重复 ACS 反馈重复业务回调