# 【修改接口·管理后台】费用明细已收款拆分 (#5022) > **PR**: #5025 | **服务**: hl-order-service-v3 | **更新时间**: 2026-07-18 00:00 ## 1. 接口背景 管理后台订单费用明细需要区分展示已收订金、已收尾款、已收全款。原接口只返回 `paidAmount` 已收总额,无法直接区分不同收款类型。本次在订单费用接口响应 `data` 内新增 3 个拆分金额字段,`paidAmount` 仍表示已收总额。 ## 2. 变更清单 | # | 接口 | 方法 | 路径 | 变更类型 | 说明 | |---|------|------|------|----------|------| | 1 | 订单费用信息 | GET | `/v3/admin/order/{id}/finance` | 修改接口 | 响应 `data` 新增 `depositPaidAmount`、`balancePaidAmount`、`fullPaidAmount` | ## 3. 接口详情 ### 3.1 订单费用信息 - **使用场景**: 查询单个订单的费用汇总、优惠、加价、退款、线上支付交易明细。 - **认证**: 需要管理后台登录态 JWT。 - **幂等性**: 查询接口,幂等。 - **限流**: 无新增限流规则。 ## 4. 接口入参 ### 4.1 路径参数 / Query 参数 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `id` | String | 是 | 订单 ID,路径参数。示例:`2077233785174179841` | ### 4.2 请求体字段 GET 请求,无请求体。 ## 5. 出参字段 ### 5.1 顶层响应字段 | 字段 | 类型 | 说明 | |------|------|------| | `code` | Integer | 业务状态码,`200` 表示成功 | | `message` | String | 响应消息 | | `data` | Object | 订单费用信息 | | `traceId` | String / null | 链路追踪 ID,可能为 `null` | | `success` | Boolean | 请求是否成功 | ### 5.2 data 字段 | 字段 | 类型 | 说明 | |------|------|------| | `totalAmount` | String | 订单总金额,金额字符串,单位元 | | `payableAmount` | String | 应付金额,金额字符串,单位元 | | `paidAmount` | String | 已收总额,包含成功线上收款和未撤销线下收款 | | `depositPaidAmount` | String | 新增。实际已收订金金额,成功线上订金 + 未撤销线下订金 | | `balancePaidAmount` | String | 新增。实际已收尾款金额,成功线上尾款 + 未撤销线下尾款 | | `fullPaidAmount` | String | 新增。实际已收全款金额,成功线上全款 + 未撤销线下全款 | | `balanceAmount` | String | 待收余额,金额字符串,单位元 | | `discountAmount` | String | 优惠总额,金额字符串,单位元 | | `surchargeAmount` | String | 加价总额,金额字符串,单位元 | | `refundAmount` | String | 已退金额,金额字符串,单位元 | | `payments` | Array | 线上支付交易明细;仍只表示线上交易,不包含线下收款明细 | | `discounts` | Array | 优惠明细 | | `surcharges` | Array | 加价明细 | ### 5.3 payments 字段项 | 字段 | 类型 | 说明 | |------|------|------| | `id` | String | 支付交易 ID | | `paymentNo` | String | 支付流水号 | | `amount` | String | 支付金额,单位元 | | `paymentType` | String | 支付类型 | | `status` | String | 支付状态 | | `paidAt` | String / null | 支付成功时间,格式 `yyyy-MM-dd HH:mm:ss` | > 本次未改变 `payments` 语义:它仍只表示线上支付交易明细。线下收款明细仍通过 `GET /v3/admin/order/{orderId}/payment/manual-receipt` 获取;线下金额已聚合进 `depositPaidAmount`、`balancePaidAmount`、`fullPaidAmount` 和 `paidAmount`。 ### 5.4 discounts 字段项 | 字段 | 类型 | 说明 | |------|------|------| | `id` | String | 优惠明细 ID | | `name` | String | 优惠名称 | | `amount` | String | 优惠金额,单位元 | | `type` | String | 优惠类型 | | `source` | String | 优惠来源 | | `createdAt` | String | 创建时间,格式 `yyyy-MM-dd HH:mm:ss` | ### 5.5 surcharges 字段项 | 字段 | 类型 | 说明 | |------|------|------| | `id` | String | 加价明细 ID | | `name` | String | 加价名称 | | `amount` | String | 加价金额,单位元 | | `type` | String | 加价类型 | | `createdAt` | String | 创建时间,格式 `yyyy-MM-dd HH:mm:ss` | ## 6. 枚举 / 数据字典 ### 6.1 paymentType **所属字段**: `payments[].paymentType` | **类型**: String | 值 | 中文 | 说明 | |----|------|------| | `DEPOSIT` | 订金 | 订金支付 | | `BALANCE` | 尾款 | 尾款支付 | | `FULL` | 全款 | 全款支付 | ### 6.2 status **所属字段**: `payments[].status` | **类型**: String | 值 | 中文 | 说明 | |----|------|------| | `SUCCESS` | 支付成功 | 计入对应已收金额 | | `PENDING` | 待支付 | 不计入对应已收金额 | | `CLOSED` | 已关闭 | 不计入对应已收金额 | | `FAILED` | 支付失败 | 不计入对应已收金额 | ### 6.3 type **所属字段**: `discounts[].type`、`surcharges[].type` | **类型**: String | 值 | 中文 | 说明 | |----|------|------| | `EARLY_BIRD` | 早鸟优惠 | 早鸟规则产生的优惠 | | `MANUAL` | 手工调整 | 人工录入的优惠或加价 | | `OTHER` | 其他 | 其他类型 | ### 6.4 source **所属字段**: `discounts[].source` | **类型**: String | 值 | 中文 | 说明 | |----|------|------| | `EARLY_BIRD_PLAN` | 早鸟方案 | 来源于早鸟优惠方案 | | `MANUAL` | 手工录入 | 来源于人工录入 | ## 7. 错误码 | code | 含义 | 触发场景 | |------|------|----------| | `200` | 成功 | 订单费用信息查询成功 | | `401` | 未登录或登录失效 | 未携带有效管理后台 JWT | | `403` | 无权限 | 当前账号无权访问该订单费用信息 | | `404` | 订单不存在 | 路径参数 `id` 对应订单不存在 | | `500` | 系统异常 | 服务端处理异常 | ## 8. 示例 ### 8.1 典型成功 **请求**: ```http GET /v3/admin/order/2077233785174179841/finance HTTP/1.1 Authorization: Bearer ``` 无请求体。 **响应**: ```json { "code": 200, "message": "成功", "data": { "totalAmount": "3105.00", "payableAmount": "2955.00", "paidAmount": "2500.00", "depositPaidAmount": "2000.00", "balancePaidAmount": "500.00", "fullPaidAmount": "0", "balanceAmount": "455.00", "discountAmount": "150.00", "surchargeAmount": "0.00", "refundAmount": "0.00", "payments": [], "discounts": [ { "id": "2077233785199345666", "name": "早鸟优惠:早鸟-小团减150(适用人群:成人/儿童/小童)", "amount": "150.00", "type": "EARLY_BIRD", "source": "EARLY_BIRD_PLAN", "createdAt": "2026-07-15 11:28:22" } ], "surcharges": [] }, "traceId": null, "success": true } ``` ### 8.2 边界情况 **场景说明**: 订单暂无任何成功线上收款和未撤销线下收款时,所有已收拆分金额均返回 0 金额;明细数组可为空数组。 **请求**: ```http GET /v3/admin/order/2077233785174179841/finance HTTP/1.1 Authorization: Bearer ``` 无请求体。 **响应**: ```json { "code": 200, "message": "成功", "data": { "totalAmount": "3105.00", "payableAmount": "2955.00", "paidAmount": "0", "depositPaidAmount": "0", "balancePaidAmount": "0", "fullPaidAmount": "0", "balanceAmount": "2955.00", "discountAmount": "150.00", "surchargeAmount": "0.00", "refundAmount": "0.00", "payments": [], "discounts": [], "surcharges": [] }, "traceId": null, "success": true } ``` ### 8.3 业务失败 **场景说明**: 订单 ID 不存在。 **请求**: ```http GET /v3/admin/order/9999999999999999999/finance HTTP/1.1 Authorization: Bearer ``` 无请求体。 **响应**: ```json { "code": 404, "message": "订单不存在", "data": null, "traceId": null, "success": false } ``` ## 9. 业务边界 - **适用场景**: 管理后台查询订单费用明细时调用,订单存在且当前账号有访问权限。 - **不适用场景**: 用该接口获取线下收款明细列表;线下收款明细仍由 `GET /v3/admin/order/{orderId}/payment/manual-receipt` 返回。 - **特殊边界**: `payments` 为空不代表订单没有已收金额;可能存在未撤销线下收款,已聚合到本次新增的拆分金额和 `paidAmount`。 - **金额口径**: `paidAmount` 为已收总额;`depositPaidAmount`、`balancePaidAmount`、`fullPaidAmount` 为按收款类型拆分后的已收金额。 ## 10. 修改前后对比 ### 10.1 字段级对比 | 字段 | 改前 | 改后 | |------|------|------| | `data.depositPaidAmount` | 不返回 | 返回实际已收订金金额 | | `data.balancePaidAmount` | 不返回 | 返回实际已收尾款金额 | | `data.fullPaidAmount` | 不返回 | 返回实际已收全款金额 | | `data.paidAmount` | 返回已收总额 | 继续返回已收总额,语义不变 | | `data.payments` | 返回线上支付交易明细 | 继续只返回线上支付交易明细,语义不变 | ### 10.2 行为级对比 | 行为 | 改前 | 改后 | |------|------|------| | 已收金额拆分 | 只能读取 `paidAmount` 总额 | 可读取订金、尾款、全款 3 类已收金额 | | 线下收款聚合 | `paidAmount` 中包含线下收款,无法按类型拆分 | 线下收款按类型聚合进新增拆分字段和 `paidAmount` | | 线上支付明细 | `payments` 表示线上支付交易明细 | 保持不变,仍不包含线下收款明细 | ## 11. 影响评估 / 回滚 ### 11.1 影响评估 - **是否破坏向后兼容**: 否。本次只新增响应字段,未删除或改名已有字段。 - **前端是否必须同步上线**: 否。旧前端继续读取 `paidAmount` 不受影响;需要区分已收订金、已收尾款、已收全款时读取新增字段。 - **影响已有数据**: 否。历史订单按成功线上收款和未撤销线下收款聚合返回。 ### 11.2 回滚方案 - **回滚方式**: 回滚 PR #5025 后,接口不再返回 3 个新增字段。 - **回滚后兼容**: 只依赖 `paidAmount` 的旧逻辑不受影响;依赖新增字段的消费方需要兼容字段缺失。 - **回滚后清理**: 无需清理前端侧数据。 ## 12. 注意事项 - `depositPaidAmount`、`balancePaidAmount`、`fullPaidAmount` 是金额字符串,单位元。 - 金额为 0 时可能返回 `"0"` 或 `"0.00"`,消费方不要依赖固定小数位判断金额语义。 - `payments` 为空时仍可能存在已收金额,因为线下收款不进入 `payments`。 - 线下收款明细列表仍由 `GET /v3/admin/order/{orderId}/payment/manual-receipt` 获取。 ## 13. 关联 / 联系人 ### 13.1 链接 - **Issue**: [#5022](https://git.1814.love:8443/wx/HL/issues/5022) - **PR**: [#5025](https://git.1814.love:8443/wx/HL/pulls/5025) - **Merge commit**: [aeb2d6d24](https://git.1814.love:8443/wx/HL/commit/aeb2d6d248fcc0fe49a540bfb3b864f06bc00123) ### 13.2 联系人 - **后端负责人**: 腰苏图