hl-api-changelog/changelogs-v2/2026-07/42_4803_定制师订单待办-新增接口-管理后台.md

422 行
16 KiB
Markdown

此文件含有不可见的 Unicode 字符

此文件含有人类无法区分的不可见的 Unicode 字符,但可以由计算机进行不同的处理。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# 定制师订单待办 — 新增接口 — 管理后台
> 涉及 PR#4805 / #4814 / #4819 Issue#4803 / #4811 / #4817
> 日期2026-07-07 责任人腰苏图
---
## ① 接口背景
为管理后台定制师角色新增「订单待办」功能模块。
系统在订单关键节点(补全出行人、提交房型需求、提交用车需求、确认行程、退款/取消/终止审核等)自动生成待办,定制师亦可手动创建自定义提醒事项。
本次共新增 7 个管理端接口,涵盖:分页查询、手动新增/修改/完成/重开/取消,以及手动待办时订单下拉选项。
---
## ② 变更清单
| # | 方法 | 路径 | 名称 | 变更类型 |
|---|------|------|------|----------|
| 1 | GET | `/v3/admin/order-todos/my/page` | 我的待办分页 | ✨ 新增 |
| 2 | POST | `/v3/admin/order-todos/manual` | 手动新增待办 | ✨ 新增 |
| 3 | PUT | `/v3/admin/order-todos/{todoId}` | 修改手动待办 | ✨ 新增 |
| 4 | PUT | `/v3/admin/order-todos/{todoId}/complete` | 完成手动待办 | ✨ 新增 |
| 5 | PUT | `/v3/admin/order-todos/{todoId}/reopen` | 重开手动待办 | ✨ 新增 |
| 6 | DELETE | `/v3/admin/order-todos/{todoId}` | 取消手动待办 | ✨ 新增 |
| 7 | GET | `/v3/admin/order-todos/order-options` | 手动待办订单下拉 | ✨ 新增 |
---
## ③ 接口详情
**认证**:所有接口均需管理后台 JWT,从 token 中自动解析当前管理员 ID`assigneeAdminId`),无需前端传入。
**幂等性**
- 接口 2手动新增同一 (adminId, orderId, MANUAL type) 并发写有乐观锁防重(报 581708 冲突让前端重试)。
- 接口 4/5/6状态操作对已是目标状态的待办调用无副作用,返回当前状态。
**限流**:无特殊限流,走全局网关限流。
**操作范围**:接口 2-6 仅能操作来源为 `MANUAL` 的待办;`SYSTEM` 待办由订单业务流自动管理,前端调接口 2-6 均会返回错误码 581703。
---
## ④ 入参
### 4.1 接口 1GET /v3/admin/order-todos/my/pageQuery 参数)
继承分页基类字段 `pageNo`(默认 1`pageSize`(默认 10
| 字段 | 类型 | 必填 | 说明 | 示例 |
|------|------|------|------|------|
| pageNo | Integer | 否 | 页码,默认 1 | 1 |
| pageSize | Integer | 否 | 每页条数,默认 10 | 20 |
| status | String | 否 | 待办状态,见枚举 TodoStatus | PENDING |
| todoSource | String | 否 | 待办来源,见枚举 TodoSource | MANUAL |
| orderId | Long字符串 | 否 | 精确匹配订单 ID | "2073707641535696898" |
| fromDate | String | 否 | 待办日期起(含,格式 yyyy-MM-dd | 2026-07-01 |
| toDate | String | 否 | 待办日期止(含,格式 yyyy-MM-dd | 2026-07-31 |
| keyword | String | 否 | 模糊搜索:标题 或 订单号 | 护照 |
**排序固定**`todoDate asc → sequence asc → createTime desc`,不接受前端自定义排序。
### 4.2 接口 2POST /v3/admin/order-todos/manual请求体 JSON
| 字段 | 类型 | 必填 | 校验 | 说明 | 示例 |
|------|------|------|------|------|------|
| orderId | Long字符串 | 是 | 非空;须为当前定制师名下订单 | 关联订单 ID | "2073707641535696898" |
| todoLabel | String | 是 | 非空,最多 50 字符 | 待办标题 | "跟进客户护照信息" |
| todoDate | String | 是 | 非空,格式 yyyy-MM-dd | 待办日期 | "2026-07-20" |
### 4.3 接口 3PUT /v3/admin/order-todos/{todoId}(路径参数 + 请求体 JSON
路径参数:`todoId`Long,字符串形式
| 字段 | 类型 | 必填 | 校验 | 说明 |
|------|------|------|------|------|
| todoLabel | String | 否 | 最多 50 字符;不传则保持原值 | 修改标题 |
| todoDate | String | 否 | 格式 yyyy-MM-dd;不传则保持原值 | 修改日期 |
> 两个字段均可选,至少传一个有意义(全不传返回原数据不报错)。
### 4.4 接口 4PUT /v3/admin/order-todos/{todoId}/complete
无请求体。路径参数:`todoId`Long,字符串形式
### 4.5 接口 5PUT /v3/admin/order-todos/{todoId}/reopen
无请求体。路径参数:`todoId`Long,字符串形式
### 4.6 接口 6DELETE /v3/admin/order-todos/{todoId}
无请求体。路径参数:`todoId`Long,字符串形式
### 4.7 接口 7GET /v3/admin/order-todos/order-optionsQuery 参数)
| 字段 | 类型 | 必填 | 说明 | 示例 |
|------|------|------|------|------|
| keyword | String | 否 | 订单号/团号/产品名 LIKE 模糊搜索 | 草原 |
不分页,返回当前定制师名下(排除已取消订单)全量,按 orderId 倒序。
---
## ⑤ 出参字段
### 5.1 OrderTodoRespVO接口 1-5 出参单项)
| 字段 | 类型 | 说明 | 来源备注 |
|------|------|------|----------|
| todoId | String | 待办 IDLong 序列化为字符串) | |
| orderId | String | 关联订单 IDLong 序列化为字符串) | |
| orderNo | String | 订单号,如 HL202607070001 | |
| teamNo | String | 团号(可为 null | **仅接口 1 分页连表查询有值;接口 2-5 单表转换,该字段恒为 null** |
| productName | String | 产品名称(可为 null | **仅接口 1 有值** |
| departDate | String | 出发日期 yyyy-MM-dd可为 null | **仅接口 1 有值** |
| todoType | String | 待办类型 code,见枚举 TodoType | |
| todoTypeName | String | 待办类型中文名 | |
| todoLabel | String | 标题/描述 | |
| todoSource | String | 来源 codeSYSTEM / MANUAL | |
| todoSourceName | String | 来源中文名(系统生成 / 手动添加) | |
| todoDate | String | 待办日期 yyyy-MM-dd | |
| actionType | String | 前端跳转动作类型,见枚举 ActionType | |
| status | String | 状态 code,见枚举 TodoStatus | |
| statusName | String | 状态中文名 | |
| assigneeAdminId | String | 指派定制师管理员 IDLong 序列化为字符串) | |
| completedBy | String | 完成人管理员 ID未完成时为 null | |
| completedAt | String | 完成时间ISO 8601,未完成时为 null | |
| relatedBizType | String | 关联业务类型(仅系统待办有值,如 REFUND_APPLICATION;手动待办为 null | |
| relatedBizId | String | 关联业务 IDLong 序列化为字符串;无时为 null | |
| createTime | String | 创建时间 ISO 8601 | |
**重要**`teamNo` / `productName` / `departDate` 三字段**只有分页接口 1 通过连表查询填充**。接口 2-5 返回的 OrderTodoRespVO 中这三个字段恒为 null。建议前端操作成功后直接重拉分页列表接口 1,不依赖操作返回值渲染这三个字段。
### 5.2 接口 1 响应结构(分页)
```json
{
"code": 200,
"data": {
"list": [],
"total": 42
}
}
```
### 5.3 接口 6DELETE 取消)响应
返回 `Result<Boolean>`,data 为 `true` 表示取消成功。
### 5.4 OrderTodoOrderOptionVO接口 7 出参单项)
| 字段 | 类型 | 说明 |
|------|------|------|
| orderId | String | 订单 IDLong 序列化为字符串) |
| orderNo | String | 订单号 |
| teamNo | String | 团号(无团期时为 null |
| productName | String | 产品名称(可为 null |
| departDate | String | 出发日期 yyyy-MM-dd可为 null |
接口 7 响应结构:
```json
{
"code": 200,
"data": []
}
```
---
## ⑥ 枚举 / 数据字典
### TodoStatus — 待办状态
| code | 中文名 | 说明 |
|------|--------|------|
| PENDING | 待处理 | 初始状态 |
| COMPLETED | 已处理 | 手动完成或系统自动关闭 |
| CANCELLED | 已取消 | 仅手动待办可取消(软取消,不物理删除) |
### TodoSource — 待办来源
| code | 中文名 | 说明 |
|------|--------|------|
| SYSTEM | 系统生成 | 由订单业务流自动创建,前端只读 |
| MANUAL | 手动添加 | 定制师手动创建,可增删改 |
### TodoType — 待办类型
| code | 中文名 | 系统自动触发 | 可手动创建 |
|------|--------|----------|-------|
| FILL_TRAVELER | 补全出行人 | 是 | 否 |
| ASSIGN_ROOM | 房型需求 | 是 | 否 |
| ASSIGN_VEHICLE | 用车需求 | 是 | 否 |
| CONFIRM_ORDER | 确认行程 | 是 | 否 |
| PRE_TRIP_REFUND | 出行前退款 | 是 | 否 |
| CANCEL_ORDER | 取消订单 | 是 | 否 |
| TERMINATE_TRIP | 终止行程 | 是 | 否 |
| CONFIRM_CHECKLIST | 确认失败兜底 | 是 | 否 |
| FINANCE_REVIEW | 财务审核 | 预留未启用 | 否 |
| BUY_INSURANCE | 购买保险 | 预留未启用 | 否 |
| SIGN_CONTRACT | 签署合同 | 预留未启用 | 否 |
| MANUAL | 手动待办 | 否 | 是 |
> `FINANCE_REVIEW` / `BUY_INSURANCE` / `SIGN_CONTRACT` 当前预留未启用,**不会出现在实际待办数据中**。
### ActionType — 前端跳转动作(字符串字面量)
| 值 | 对应待办类型 | 建议跳转 |
|----|-------------|--------|
| info | FILL_TRAVELER | 订单出行人详情页 |
| room | ASSIGN_ROOM | 房型需求模块 |
| vehicle | ASSIGN_VEHICLE | 用车需求模块 |
| confirm | CONFIRM_ORDER | 确认行程操作 |
| refund | PRE_TRIP_REFUND | 退款申请详情 |
| cancel | CANCEL_ORDER | 取消订单操作 |
| terminate | TERMINATE_TRIP | 终止行程操作 |
| manual | MANUAL | 无固定跳转,前端可展示标题或无操作 |
---
## ⑦ 错误码
| 错误码 | 中文描述 | 触发场景 |
|--------|---------|--------|
| 581700 | 待办不存在 | todoId 无对应记录 |
| 581701 | 无权操作该待办 | 操作他人的待办 |
| 581702 | 待办必须关联订单 | 内部校验,前端正常调用不触发 |
| 581703 | 系统待办不允许手动完成或重开 | 对 SYSTEM 来源待办调接口 3/4/5/6 |
| 581704 | 待办标题不能为空 | 接口 2 的 todoLabel 为空 |
| 581705 | 待办日期不能为空 | 接口 2 的 todoDate 为空 |
| 581706 | 待办业务事件不支持 | 内部 SYSTEM 同步逻辑,前端不直接触发 |
| 581707 | 仅订单定制师可维护该订单待办 | 接口 2 传入的 orderId 不属于当前管理员名下订单 |
| 581708 | 手动待办创建冲突,请重试 | 并发新增触发乐观锁,前端重试一次即可 |
---
## ⑧ 示例
### 8.1 典型成功 — 分页查询我的待办(接口 1
请求:
```
GET /v3/admin/order-todos/my/page?status=PENDING&pageNo=1&pageSize=10
Authorization: Bearer <admin-jwt>
```
响应:
```json
{
"code": 200,
"data": {
"list": [
{
"todoId": "2073707641535696900",
"orderId": "2073707641535696898",
"orderNo": "HL202607070001",
"teamNo": "T202607070001",
"productName": "夏季草原行",
"departDate": "2026-07-20",
"todoType": "ASSIGN_ROOM",
"todoTypeName": "房型需求",
"todoLabel": "房型需求 · 待提交",
"todoSource": "SYSTEM",
"todoSourceName": "系统生成",
"todoDate": "2026-07-15",
"actionType": "room",
"status": "PENDING",
"statusName": "待处理",
"assigneeAdminId": "10001",
"completedBy": null,
"completedAt": null,
"relatedBizType": null,
"relatedBizId": null,
"createTime": "2026-07-07T11:00:00"
}
],
"total": 1
}
}
```
### 8.2 边界情况 — 手动新增待办后 teamNo 等字段为 null接口 2
请求:
```
POST /v3/admin/order-todos/manual
Authorization: Bearer <admin-jwt>
Content-Type: application/json
{
"orderId": "2073707641535696898",
"todoLabel": "跟进客户护照信息",
"todoDate": "2026-07-20"
}
```
响应teamNo / productName / departDate 为 null,操作成功后建议重拉分页接口 1 获取完整上下文):
```json
{
"code": 200,
"data": {
"todoId": "2073707641535696901",
"orderId": "2073707641535696898",
"orderNo": "HL202607070001",
"teamNo": null,
"productName": null,
"departDate": null,
"todoType": "MANUAL",
"todoTypeName": "手动待办",
"todoLabel": "跟进客户护照信息",
"todoSource": "MANUAL",
"todoSourceName": "手动添加",
"todoDate": "2026-07-20",
"actionType": "manual",
"status": "PENDING",
"statusName": "待处理",
"assigneeAdminId": "10001",
"completedBy": null,
"completedAt": null,
"relatedBizType": null,
"relatedBizId": null,
"createTime": "2026-07-07T14:00:00"
}
}
```
### 8.3 业务失败 — 对系统待办调完成接口(接口 4,最小复现
请求todoId 对应 SYSTEM 来源待办):
```
PUT /v3/admin/order-todos/2073707641535696900/complete
Authorization: Bearer <admin-jwt>
```
响应:
```json
{
"code": 581703,
"msg": "系统待办不允许手动完成或重开"
}
```
另一业务失败 — 订单不属于当前定制师(接口 2 传入他人订单 orderId
```json
{
"code": 581707,
"msg": "仅订单定制师可维护该订单待办"
}
```
---
## ⑨ 业务边界
**适用**
- 当前登录管理员为某订单的指派定制师(`assigneeAdminId` 即当前 admin ID
- 待办分页(接口 1只返回属于当前定制师的待办
- 手动操作(接口 2-6只能操作当前定制师名下的 MANUAL 来源待办
**不适用**
- 查看全部定制师的待办(暂无此接口,当前版本只支持我的)
- 对系统待办SYSTEM做完成/重开/取消/修改操作
- 删除已取消CANCELLED的待办取消后为软删除,不提供物理删除接口
**特殊边界**
- 接口 7 订单下拉的过滤条件:订单状态非 CANCELLED注意是订单状态,不是待办状态
- 系统待办由订单流程自动生灭,FINANCE_REVIEW / BUY_INSURANCE / SIGN_CONTRACT 三类待办预留不会出现
- 房型/用车需求被打回时系统更新已有待办标题为已打回,待办 ID 不变
---
## ⑩ 修改前后对比
本次全部为新增接口,无修改前状态。
---
## ⑪ 影响评估 / 回滚
全新增接口,对现有接口零影响。如需回滚,停止调用以上 7 个接口即可,无破坏性变更。
---
## ⑫ 注意事项
1. **Long 型 ID 均序列化为字符串**`todoId` / `orderId` / `assigneeAdminId` / `completedBy` / `relatedBizId` 在 JSON 中均为字符串类型(如 "2073707641535696898"),防止 JS 精度丢失。
2. **操作返回值中 teamNo / productName / departDate 恒为 null**:仅分页接口 1 通过连表查询填充这三个字段;接口 2-5 的返回值是单表转换结果。建议前端操作成功后重拉分页列表,不从操作返回值取这三字段。
3. **SYSTEM 待办只读**:对 `todoSource === "MANUAL"` 的待办才显示修改/完成/重开/取消按钮,系统待办只展示不操作。
4. **分页排序固定**`todoDate asc → sequence asc → createTime desc`,无需也不支持前端传排序参数。
5. **接口 7 订单下拉不分页**:返回当前定制师名下排除已取消订单的全量列表,数量通常不超过数十条。
6. **并发新增防抖**:请求发出后禁用提交按钮,收到 581708 时提示用户重试。
---
## ⑬ 关联 / 联系人
| 类型 | 链接 |
|------|------|
| Issue初始需求 | https://git.1814.love:8443/wx/HL/issues/4803 |
| Issue列表字段+打回追溯) | https://git.1814.love:8443/wx/HL/issues/4811 |
| Issue订单下拉选项 | https://git.1814.love:8443/wx/HL/issues/4817 |
| PR #48056 个管理接口 + 系统待办落库) | https://git.1814.love:8443/wx/HL/pulls/4805 |
| PR #4814(列表出参补 teamNo/productName/departDate + 打回追溯修复) | https://git.1814.love:8443/wx/HL/pulls/4814 |
| PR #4819(新增 order-options 下拉接口) | https://git.1814.love:8443/wx/HL/pulls/4819 |
| CommitPR #4805 | https://git.1814.love:8443/wx/HL/commit/405ea69f0a96b1624a0a10f86663f6664c2d283d |
| CommitPR #4814 | https://git.1814.love:8443/wx/HL/commit/de0c92b12049628c2c3d1c7bc43c01d9afe2fe0f |
| CommitPR #4819 | https://git.1814.love:8443/wx/HL/commit/8c6ad153d9699e001f058321744a570b2bd60fc6 |
| 后端负责人 | 腰苏图 |