--- schema: "hl-changelog/v2" ticket: "5633" title: "订单详情补核单状态字段" consumer: "admin" change_type: "修改接口" author: "yst(GIT)" backend_status: "implemented" gateway_status: "pending" frontend_status: "implemented" frontend_owner: "mmg" frontend_ref: "hl-admin@18f8e23b9b2c77a81fed3de87fe9a7b94ff3b201" target_release: "v2.1" verified_at: "" status_note: "PR #5635 已合并 dev-v3(merge commit c378061b08);管理后台待接入 reviewStatus/reviewStatusName。" updated_at: "2026-08-07" base: "dev-v3" --- # 🔧【修改接口·管理后台】订单详情补核单状态字段 (#5633) > **PR**:[#5635](https://git.1814.love:8443/wx/HL/pulls/5635) | **服务**:`hl-order-service-v3` | **更新时间**:2026-08-07 | **消费端**:管理后台 ## 1. 接口背景 订单详情页原有的「核单中」徽标取自 `flowStatus=REVIEWING`(订单流程状态),而核单列表页按 `review_status`(核单任务状态)分 tab,两者是**两个不同字段**:详情文案「核单中」与列表 tab 文案「核算中」字序不一致,导致用户在详情看到「核单中」后到核单列表找不到对应 tab,产生「单丢了」的误判。 本次在订单详情出参 `main` 段补齐 `reviewStatus` / `reviewStatusName` 两个字段,与核单列表 tab 使用**同一枚举、同一文案**,消除详情与列表的口径歧义。 ## 2. 变更清单 | # | 接口名 | 方法 | 路径 | 变更类型 | 说明 | |---|---|---|---|---|---| | 1 | 订单详情 | `GET` | `/v3/admin/order/{id}` | 修改 | 出参 `data.main` 段新增 `reviewStatus`、`reviewStatusName` 两个字段;其余字段与行为不变 | ## 3. 接口详情 ### 3.1 订单详情 - **接口说明**:查询单个订单的详情聚合数据(主单 + 各 Tab 数据段),本次变更只涉及 `data.main` 段。 - **使用场景**:管理后台打开订单详情页。 - **认证**:需要管理后台登录态和订单查看权限。 - **幂等性**:是,只读查询。 - **限流**:未声明接口级独立限流规则。 ## 4. 接口入参 ### 4.1 路径参数 / Query 参数 | 字段 | 位置 | 类型 | 必填 | 说明与校验 | |---|---|---|---|---| | `id` | Path | String(Long) | 是 | 订单 ID,必须为正整数;按字符串传递,避免大整数精度损失 | 无 Query 参数。 ### 4.2 请求体字段 GET 请求无请求体。 ## 5. 出参字段 响应类型:`Result`。本次变更集中在 `data.main`(`OrderMainVO`)段,下表只列出与本次变更相关的主单状态字段簇;`main` 段其余字段及 `tags` / `overview` 等其他数据段均不变。 ### 5.1 统一响应外层 | 字段 | 类型 | 可空 | 说明 | |---|---|---|---| | `code` | Integer | 否 | 成功为 `200`;失败见 §7 | | `message` | String | 否 | 结果说明 | | `data` | Object/null | 失败时为空 | 成功时为订单详情聚合数据 | | `traceId` | String | 是 | 链路追踪 ID | | `success` | Boolean | 否 | `code=200` 时为 `true` | ### 5.2 `data.main` 状态字段簇 | 字段 | 类型 | 可空 | 说明 | |---|---|---|---| | `id` | String(Long) | 否 | 订单 ID,按字符串返回 | | `orderNo` | String | 否 | 订单号 | | `orderStatus` | String | 否 | 订单主状态枚举值(6 主状态) | | `orderStatusName` | String | 否 | 订单主状态中文名 | | `flowStatus` | String | 是 | 订单流程细状态枚举值;`REVIEWING` 表示流程处于核单环节,**不等于**核单任务状态 | | `flowStatusName` | String | 是 | 订单流程细状态中文名(如「核单中」) | | `reviewStatus` | String/null | 是 | **本次新增**。核单任务状态枚举值,对应 `order_main.review_status`,与核单列表 tab 同枚举;取值见 §6 | | `reviewStatusName` | String/null | 是 | **本次新增**。核单任务状态中文名,与核单列表 tab 文案一字不差;取值见 §6 | | `flowStep` | Integer/null | 是 | 线性 6 步当前步序号(1-6=进行中各步;null=已取消终态) | | `flowStepTotal` | Integer | 否 | 线性步骤总数,固定 `6` | | `flowStepName` | String/null | 是 | 当前步中文名 | | `flowStepCode` | String/null | 是 | 当前步编码 | | `flowStepStatus` | String/null | 是 | 当前步状态 | > `main` 段其余字段(金额、日期、来源、合同/保险/退款状态徽标等)本次无变化,沿用既有契约。 ## 6. 枚举 / 数据字典 ### 6.1 `main.reviewStatus` / `main.reviewStatusName` **所属字段**:`data.main.reviewStatus`、`data.main.reviewStatusName` | **类型**:String/null | **可空**:是 | `reviewStatus` 值 | `reviewStatusName` 值 | 说明 | |---|---|---| | `NONE` | `待核算` | 尚未生成核单任务;对齐核单列表归一逻辑,与 `PENDING` **同显「待核算」**,不单独显示「未核单」 | | `PENDING` | `待核算` | 核单任务待处理 | | `IN_PROGRESS` | `核算中` | 核单任务进行中 | | `COMPLETED` | `已完成` | 核单任务已完成 | | `null` | `null` | 订单尚无 `review_status` 值(如未进入核单流程的订单);此时两字段均为 JSON 空值,不是字符串 `"null"` | **容错规则**: - `reviewStatus` 为 `null` 时,`reviewStatusName` 也为 `null`,不报错。 - `reviewStatus` 为无法识别的值时,`reviewStatusName` **原样返回该值**,接口不抛错。 **与 `flowStatus` 的关系**:`flowStatus=REVIEWING` 表示订单流程走到核单环节(中文名「核单中」),是流程维度;`reviewStatus` 是核单任务自身的状态机维度,与核单列表 tab 同源。两者并存、语义不同,前端展示核单任务状态时以 `reviewStatus` / `reviewStatusName` 为准。 ## 7. 错误码 | code | 含义 | 触发场景 | |---|---|---| | `200` | 查询成功 | 正常返回订单详情 | | `400` | 请求参数错误 | `id` 不是正整数 | | `401` | 未登录或登录态失效 | 缺少或携带无效的管理后台访问令牌 | | `403` | 无访问权限 | 登录态、角色或权限不允许访问 | | `581007` | 订单不存在 | `id` 对应订单不存在(含已软删除) | ## 8. 示例 ### 8.1 典型成功:核单任务进行中 **请求**: ```http GET /v3/admin/order/9223372036854775000 Authorization: Bearer <管理后台访问令牌> ``` 无请求体。 **响应**(只截取 `data.main` 状态字段簇,其余字段省略): ```json { "code": 200, "message": "成功", "data": { "main": { "id": "9223372036854775000", "orderNo": "HL20260801000001", "orderStatus": "CONFIRMED", "orderStatusName": "已确认", "flowStatus": "REVIEWING", "flowStatusName": "核单中", "reviewStatus": "IN_PROGRESS", "reviewStatusName": "核算中", "flowStep": 5, "flowStepTotal": 6, "flowStepName": "核单结算", "flowStepCode": "SETTLEMENT", "flowStepStatus": "IN_PROGRESS" } }, "traceId": null, "success": true } ``` ### 8.2 边界情况:尚无核单任务状态(reviewStatus 为 null) **场景说明**:订单尚未进入核单流程,`order_main.review_status` 为 NULL,两字段均返回 JSON 空值;前端按「无核单任务状态」处理,不要按字符串 `"null"` 判断。 **请求**: ```http GET /v3/admin/order/900000000002 Authorization: Bearer <管理后台访问令牌> ``` 无请求体。 **响应**(只截取 `data.main` 状态字段簇): ```json { "code": 200, "message": "成功", "data": { "main": { "id": "900000000002", "orderNo": "HL20260802000002", "orderStatus": "PENDING", "orderStatusName": "待确认", "flowStatus": "AWAITING_CONFIRM", "flowStatusName": "待确认", "reviewStatus": null, "reviewStatusName": null, "flowStep": 2, "flowStepTotal": 6, "flowStepName": "待确认", "flowStepCode": "CONFIRM", "flowStepStatus": "IN_PROGRESS" } }, "traceId": null, "success": true } ``` 另:`reviewStatus=NONE` 时 `reviewStatusName` 返回「待核算」(与 `PENDING` 同文案,对齐核单列表归一逻辑),见 §6。 ### 8.3 业务失败:订单不存在 **请求**: ```http GET /v3/admin/order/999999999999 Authorization: Bearer <管理后台访问令牌> ``` 无请求体。 **响应**: ```json { "code": 581007, "message": "订单不存在", "data": null, "traceId": null, "success": false } ``` ## 9. 业务边界 - **适用**:所有 v3 订单的详情查询;需要展示「核单任务状态」(与核单列表 tab 口径一致)的场景。 - **不适用**:判断订单流程进度仍用 `flowStatus` / `flowStep` 等流程字段,`reviewStatus` 只表达核单任务自身状态,不能替代流程状态。 - **特殊边界**: - 未进入核单流程的订单 `reviewStatus` 为 `null`,属正常数据,不是异常。 - `NONE` 与 `PENDING` 展示文案同为「待核算」,与核单列表 tab 完全一致;需要区分「未生成任务」与「任务待处理」时用 `reviewStatus` 枚举值判断,不要用中文名判断。 ## 10. 修改前后对比 ### 10.1 字段级对比(`data.main` 段) | 字段 | 修改前 | 修改后 | |---|---|---| | `reviewStatus` | 不存在 | 新增,String/null,核单任务状态枚举值 | | `reviewStatusName` | 不存在 | 新增,String/null,核单任务状态中文名(与核单列表 tab 同文案) | | 其余字段 | 不变 | 不变 | ### 10.2 行为级对比 | 维度 | 修改前 | 修改后 | |---|---|---| | 详情页核单状态来源 | 只有 `flowStatus=REVIEWING`(文案「核单中」),与核单列表 tab 口径不一致 | 新增 `reviewStatus` / `reviewStatusName`,与核单列表 tab 同枚举、同文案 | | 接口签名 | `Result` | 不变,仅出参多 2 个字段 | | 入参 / 错误码 | 不变 | 不变 | ## 11. 影响评估 / 回滚 - **兼容性**:纯新增出参字段,向后兼容;未接入新字段的前端版本不受影响,可继续按原字段渲染。 - **破坏兼容**:无。 - **前端同步上线**:不要求同步上线;详情页核单徽标切换到 `reviewStatusName` 可在后端发布后任意时间进行。 - **回滚方案**:还原 PR #5635 对应提交即可,`main` 段不再返回这两个字段;前端读取不到时按字段缺失处理(`undefined`),不会解析报错。 ## 12. 注意事项 - `reviewStatusName` 文案与核单列表 tab **一字不差**:「待核算 / 核算中 / 已完成」;不要在前端自行映射文案,直接使用该字段,避免再次出现字序不一致。 - `NONE` 与 `PENDING` 同显「待核算」是**有意对齐**核单列表的归一逻辑,不是 bug。 - `reviewStatus` 为 `null` 时 `reviewStatusName` 必为 `null`;`reviewStatus` 为非法值时 `reviewStatusName` 原样返回该值,接口不抛错。 - `main.id` 等 Long 型 ID 按字符串序列化,前端按字符串处理,避免大整数精度丢失。 ## 13. 关联 / 联系人 - **Issue**:[#5633](https://git.1814.love:8443/wx/HL/issues/5633) - **PR**:[#5635](https://git.1814.love:8443/wx/HL/pulls/5635) - **Commit**:[c378061b08](https://git.1814.love:8443/wx/HL/commit/c378061b08e85cc7794b23c2a49691ad4f8eb01e) - **后端负责人**:腰苏图