hl-api-changelog/changelogs-v2/2026-06/06_3556_终止行程接口改造-修改接口-管理后台.md
yaosutu 2106e5be43 新增终止行程退款 changelog(预览新接口 + 终止接口改造,#3556 / PR #3557)
- 终止退款预览:新增 POST /v3/admin/order/{id}/terminate/refund-preview,返回资源清单+行程信息
- 终止行程接口改造:入参改资源已用判定+调整额,出参补退款明细字段(破坏性,前端必改)
2026-06-06 23:29:56 +08:00

9.1 KiB

⚠️修改接口·管理后台】终止行程接口改造(资源级退款计算) (#3556)

PR: #3557 | 服务: hl-order-service-v3 | 更新时间: 2026-06-06 ⚠️ 破坏性变更:入参 / 出参结构均调整,前端必须同步改造。

1. 接口背景

终止行程原先只让定制师手填一个返还金额,既不准确也没真正进入核单结算。现改为资源级退款计算:定制师在弹框里选择「停在第几天」并逐项标记资源是否已用,提交时后端按实际成交价重新核算退款额并写入核单返还。

2. 变更清单

# 接口 方法 路径 变更类型 说明
1 终止行程 POST /v3/admin/order/{id}/terminate 修改接口 入参从「手填返还额」改为「资源已用判定 + 调整额」;出参补退款明细字段

3. 接口详情

3.1 终止行程

  • 使用场景:出行中订单提前终止时调用,配合「终止退款预览」接口(见同日新增接口 changelog使用
  • 认证:需要管理端 JWTAuthorization 头)
  • 幂等性:是(同一订单二次调用因状态已变为「已完成」返回 581018
  • 限流:无

4. 接口入参

4.1 路径参数

字段 类型 必填 说明
id String 订单 ID

4.2 请求体字段

字段 类型 必填 说明 校验规则
cancelReason String 终止原因(调整金额的说明也写在此处,不再单列字段) 非空
endDayNumber Integer 停在第几天 1 ≤ 值 ≤ 行程总天数
rooms Array<{refId, used}> 住宿各行已用判定
tickets Array<{refId, used}> 门票各行已用判定
vehicles Array<{refId, dayNumber, used}> 用车各行已用判定(同车跨天靠 dayNumber 区分)
adjustAmount BigDecimal 人工调整额(正=多退,负=少退),默认 0

rooms[].refId / tickets[].refId / vehicles[].refId 取自「终止退款预览」接口返回的 refId。 请求只需传资源是否已用(used+ 调整额,不传任何金额单价——退款额由后端按预览同源的成交价重新核算(防篡改)。保险不在入参,由后端自动按锁定不退处理。

4.2.1 rooms / tickets 行ResourceUsedItem

字段 类型 必填 说明
refId String 资源记录 ID
used Boolean 该项是否已使用true=已用不退 / false=未用可退)

4.2.2 vehicles 行VehicleUsedItem

字段 类型 必填 说明
refId String 用车记录 ID
dayNumber Integer 第几天
used Boolean 当天该车是否已使用

5. 出参(响应)

5.1 响应字段(data

字段 类型 说明
terminateRefundId String 终止退款记录 ID
baselineRefund BigDecimal 系统按已用资源算出的建议退款额
adjustAmount BigDecimal 人工调整额(回显入参)
finalRefund BigDecimal 最终退款额(= baselineRefund + adjustAmount,最低 0
settlementRefundId String 核单返还记录 ID已写入核单 Step5 返还,供财务复核展示)
newStatus String 终止后订单状态(COMPLETED=已完成)
newFlowStatus String 终止后流程状态(PENDING_REVIEW=待核单)

6. 枚举 / 数据字典

6.1 newStatus订单状态

所属字段newStatus | 类型String

中文 说明
COMPLETED 已完成 终止后订单进入完成态,转入核单流程

6.2 newFlowStatus流程状态

所属字段newFlowStatus | 类型String

中文 说明
PENDING_REVIEW 待核单 终止后等待核单录入与结算复核

7. 错误码

code 含义 触发场景
581018 出行中取消仅适用于出行中订单 订单当前状态非「出行中」时调用(含二次终止)

8. 示例

8.1 典型成功

请求

POST /v3/admin/order/60001234567890/terminate
Authorization: Bearer {token}
{
  "cancelReason": "客户中途高反送医终止;林芝段酒店已付全款不可退,调整 -300",
  "endDayNumber": 3,
  "rooms": [
    {"refId": "96011", "used": true},
    {"refId": "96014", "used": false}
  ],
  "tickets": [
    {"refId": "97001", "used": true}
  ],
  "vehicles": [
    {"refId": "98001", "dayNumber": 1, "used": true},
    {"refId": "98001", "dayNumber": 2, "used": true},
    {"refId": "98001", "dayNumber": 3, "used": true}
  ],
  "adjustAmount": -300.00
}

响应

{
  "code": 200,
  "message": "ok",
  "success": true,
  "data": {
    "terminateRefundId": "9610000001",
    "baselineRefund": 2264.00,
    "adjustAmount": -300.00,
    "finalRefund": 1964.00,
    "settlementRefundId": "9620000001",
    "newStatus": "COMPLETED",
    "newFlowStatus": "PENDING_REVIEW"
  }
}

8.2 边界情况

场景说明:不填调整额(默认 0,退款额 = 基线额。

请求(片段)

{ "cancelReason": "客户主动终止", "endDayNumber": 5, "rooms": [], "tickets": [], "vehicles": [] }

响应(片段)

{ "code": 200, "data": { "baselineRefund": 0.00, "adjustAmount": 0.00, "finalRefund": 0.00, "newStatus": "COMPLETED", "newFlowStatus": "PENDING_REVIEW" } }

8.3 业务失败(异常)

场景说明:订单非出行中(如已确认待出发或已终止过)。

响应

{ "code": 581018, "message": "出行中取消仅适用于出行中订单", "success": false }

9. 业务边界

  • 适用场景:订单当前状态 = 出行中TRAVELLING
  • 不适用场景:未出发订单请走「取消订单」流程;已终止/已完成订单二次调用返回 581018
  • ⚠️ 特殊边界
    • finalRefund 最低为 0,不会出现负数
    • 退款额最终进入核单返还,由财务复核环节确认放款
    • 保险恒不退,无需在入参体现

10. 修改前后对比

10.1 字段级对比

入参

字段 改前 改后
cancelReason 终止原因 终止原因(+ 调整说明并入此处)
returnAmount 手填返还金额(必填) 删除(改由后端按资源核算)
returnRemark 返还备注(必填) 删除(说明并入 cancelReason
endDayNumber 新增,停在第几天
rooms / tickets / vehicles 新增,各资源行已用判定
adjustAmount 新增(可选),人工调整额

出参

字段 改前 改后
settlementRefundId (此前恒为 null 真实核单返还记录 ID
returnAmount 返还额(回显入参) 删除
newStatus (不变)
terminateRefundId 新增
baselineRefund / adjustAmount / finalRefund 新增,退款明细金额
newFlowStatus 新增

10.2 行为级对比

行为 改前 改后
退款额来源 定制师手填一个数 按已用资源 + 实际成交价由后端核算
退款是否进核单 否(仅记录,未落账) 是(写入核单返还,财务复核放款)
配合接口 需先调「终止退款预览」拿资源清单

11. 影响评估 / 回滚

11.1 影响评估

  • 是否破坏向后兼容:是。入参删除 returnAmount / returnRemark,新增多个必填字段;出参删除 returnAmount。前端按旧契约调用会校验失败。
  • 前端是否必须同步上线:是。终止行程页面需改造为「预览拉清单 → 选结束天 + 勾选已用 → 提交」流程。
  • 前端 workaround 清理点:若此前有「手填返还额」输入框,应替换为资源勾选界面;旧的 returnAmount/returnRemark 入参与回显逻辑可删除。

11.2 回滚方案

  • 回滚方式revert PR #3557
  • 回滚后清理:无需数据迁移(新功能,无历史数据依赖)

12. 注意事项

  • ⚠️ 本接口为破坏性改动,前端务必在后端上线同期改造,否则终止行程功能不可用。
  • 必须配合同日「终止退款预览」新增接口使用:预览拿全部资源清单 → 前端本地按结束天标已用/可退 → 提交时只回传 used 判定与 adjustAmount

13. 关联 / 联系人

13.1 链接

  • Issue: #3556
  • PR: #3557
  • Merge commit: 773dcdacf
  • 配套新增接口: 终止退款预览(同日 changelog

13.2 联系人

  • 后端负责人: @yst
  • 前端对接(管理后台): 终止行程弹框页面