Files
huachuang/docs/superpowers/plans/2026-07-16-transport-task-api-query.md

253 lines
9.4 KiB
Markdown
Raw Normal View History

2026-07-16 14:11:30 +08:00
# TransportTaskApi RPC 查询接口 实现计划
> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development推荐或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。
**目标:** 补全 `TransportTaskApi` 两个 todo——根据 taskId / taskCode 查询任务,返回 `TaskInfoDTO`,自动过滤逻辑删除。
**架构:** ApiFeign GET→ ApiImpl委托→ TransportTaskService查询 + MapStruct 转换,查不到返回 null→ TransportTaskMapperselectById / selectByTaskCode`@TableLogic` 自动滤删)。新建 `TransportTaskConvert`MapStruct字段同名零配置
**技术栈:** Java 17 / Spring Boot / MyBatis-PlusBaseMapperX/ MapStruct 1.6.3(经 nl-common 传递依赖,无需改 pom
**规格:** `docs/superpowers/specs/2026-07-16-transport-task-api-query-design.md`
**约定:** 注释/日志中文;`@Resource` 注入;不写测试;不频繁 commit最后统一一次需用户同意
---
## 文件结构
| 文件 | 操作 | 职责 |
|---|---|---|
| `nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java` | 修改 | 新增两个 Feign GET 查询方法,删除两行 todo |
| `nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/convert/transporttask/TransportTaskConvert.java` | 创建 | DO→TaskInfoDTO MapStruct 转换 |
| `nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/dal/mysql/transporttask/TransportTaskMapper.java` | 修改 | 新增 selectByTaskCode |
| `nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java` | 修改 | 接口新增 getTaskInfoById / getTaskInfoByCode |
| `nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java` | 修改 | 实现两个查询方法 |
| `nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java` | 修改 | 实现两个 Api 方法(委托 service |
---
### 任务 1`TransportTaskApi` 新增两个查询方法
**文件:**
- 修改:`nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java`
- [ ] **步骤 1补充 import**
在现有 import 区追加:
```java
import cn.code.nl.module.task.dto.TaskInfoDTO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
```
- [ ] **步骤 2删除两行 todo替换为两个方法声明**
将文件末尾的:
```java
// todo 根据taskId查找任务返回TaskInfoDTO、过滤删除
// todo 根据taskCode获取任务返回TaskInfoDTO、过滤删除
```
替换为:
```java
@GetMapping(PREFIX + "/getTaskById")
@Operation(summary = "根据 taskId 查询任务LMS/WMS 调用)")
CommonResult<TaskInfoDTO> getTaskById(@RequestParam("taskId") Long taskId);
@GetMapping(PREFIX + "/getTaskByCode")
@Operation(summary = "根据 taskCode 查询任务LMS/WMS 调用)")
CommonResult<TaskInfoDTO> getTaskByCode(@RequestParam("taskCode") String taskCode);
```
---
### 任务 2新建 `TransportTaskConvert`
**文件:**
- 创建:`nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/convert/transporttask/TransportTaskConvert.java`
- [ ] **步骤 1创建文件**
```java
package cn.code.nl.module.task.convert.transporttask;
import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
import cn.code.nl.module.task.dto.TaskInfoDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 搬运任务 Convert
*
* @Author: liyongde
* @Date: 2026/7/16
*/
@Mapper
public interface TransportTaskConvert {
TransportTaskConvert INSTANCE = Mappers.getMapper(TransportTaskConvert.class);
/**
* DO 转 RPC 全量信息 DTO字段同名零配置映射
*/
TaskInfoDTO convert(TransportTaskDO bean);
}
```
---
### 任务 3`TransportTaskMapper` 新增 `selectByTaskCode`
**文件:**
- 修改:`nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/dal/mysql/transporttask/TransportTaskMapper.java`
- [ ] **步骤 1在 `selectUnfinishedByBiz` 方法之前新增**
```java
/**
* 根据任务编码查询任务taskCode 业务唯一)
*/
default TransportTaskDO selectByTaskCode(String taskCode) {
return selectOne(TransportTaskDO::getTaskCode, taskCode);
}
```
说明:`selectOne(SFunction, Object)``BaseMapperX` 现有重载BaseMapperX.java:105`@TableLogic` 自动过滤 `deleted=1`
---
### 任务 4`TransportTaskService` 接口与实现新增查询方法
**文件:**
- 修改:`nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java`
- 修改:`nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java`
- [ ] **步骤 1接口补充 import 并新增两个声明**
import 区追加(`AcsFeedbackReqDTO` 等已存在,勿重复):
```java
import cn.code.nl.module.task.dto.TaskInfoDTO;
```
`dispatchOperation` 声明之后新增:
```java
/**
* 根据 taskId 查询任务全量信息RPC 用,自动过滤逻辑删除,查不到返回 null
*
* @param taskId 任务ID
* @return 任务全量信息
*/
TaskInfoDTO getTaskInfoById(Long taskId);
/**
* 根据 taskCode 查询任务全量信息RPC 用,自动过滤逻辑删除,查不到返回 null
*
* @param taskCode 任务编码
* @return 任务全量信息
*/
TaskInfoDTO getTaskInfoByCode(String taskCode);
```
- [ ] **步骤 2实现类补充 import 并新增两个实现(放在 `dispatchOperation` 方法之后)**
import 区追加:
```java
import cn.code.nl.module.task.convert.transporttask.TransportTaskConvert;
import cn.code.nl.module.task.dto.TaskInfoDTO;
```
新增实现:
```java
/**
* 根据 taskId 查询任务全量信息:查不到返回 null由调用方判断
*/
@Override
public TaskInfoDTO getTaskInfoById(Long taskId) {
TransportTaskDO task = transportTaskMapper.selectById(taskId);
return task != null ? TransportTaskConvert.INSTANCE.convert(task) : null;
}
/**
* 根据 taskCode 查询任务全量信息:查不到返回 null由调用方判断
*/
@Override
public TaskInfoDTO getTaskInfoByCode(String taskCode) {
TransportTaskDO task = transportTaskMapper.selectByTaskCode(taskCode);
return task != null ? TransportTaskConvert.INSTANCE.convert(task) : null;
}
```
---
### 任务 5`TransportTaskApiImpl` 实现两个方法
**文件:**
- 修改:`nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java`
- [ ] **步骤 1补充 import**
```java
import cn.code.nl.module.task.dto.TaskInfoDTO;
```
- [ ] **步骤 2在 `receiveCallbackResult` 方法之后新增**
```java
@Override
public CommonResult<TaskInfoDTO> getTaskById(Long taskId) {
return success(transportTaskService.getTaskInfoById(taskId));
}
@Override
public CommonResult<TaskInfoDTO> getTaskByCode(String taskCode) {
return success(transportTaskService.getTaskInfoByCode(taskCode));
}
```
---
### 任务 6编译验证
- [ ] **步骤 1编译仓库根目录**
```bash
mvn -pl nl-module-task/nl-module-task-server -am compile
```
预期:`BUILD SUCCESS`(同时验证 MapStruct 注解处理器生成 `TransportTaskConvertImpl` 无报错)。
---
### 任务 7统一提交可选需用户同意
- [ ] **步骤 1确认用户同意后提交仅本次相关文件**
```bash
git add docs/superpowers/specs/2026-07-16-transport-task-api-query-design.md \
docs/superpowers/plans/2026-07-16-transport-task-api-query.md \
nl-module-task/nl-module-task-api/src/main/java/cn/code/nl/module/task/api/TransportTaskApi.java \
nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/api/TransportTaskApiImpl.java \
nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/convert/transporttask/TransportTaskConvert.java \
nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/dal/mysql/transporttask/TransportTaskMapper.java \
nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskService.java \
nl-module-task/nl-module-task-server/src/main/java/cn/code/nl/module/task/service/transporttask/TransportTaskServiceImpl.java
git commit -m "featTransportTaskApi 新增按 taskId/taskCode 查询任务 RPC 接口"
```
---
## 风险与注意事项
1. **工作区有未提交改动**`TransportTaskService(Impl)``TransportTaskMapper` 均已有本地改动(含上一需求的路由表代码),实现时在现有基础上叠加,不要回退。
2. **MapStruct 与 Lombok 顺序**:模块继承的编译配置已被 infra 等模块的 Convert 验证可用,若编译报 MapStruct 处理器缺失,检查是否误改了 pom本计划不改 pom
3. **`TransportTaskServiceImplTest`**test 目录引用了 `TransportTaskApi``compile` 阶段不编译测试代码,不受影响。