docs(changelog): #6079 终止行程按勾选未用行释放房车资源(releaseLines 双通道解耦)
所有检测均成功
changelog-filename-gate / validate (push) Successful in 1s

Co-Authored-By: Claude <noreply@anthropic.com>
这个提交包含在:
API Changelog Bot 2026-08-19 08:42:20 +00:00
父节点 020076ec47
当前提交 cdffec0f00

查看文件

@ -0,0 +1,78 @@
---
schema: "hl-changelog/v2"
ticket: "6079"
title: "终止行程按勾选「未用」行释放房车资源——金额/释放双通道解耦,替代按日期截断"
consumer: "admin"
author: "wx"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "pending"
frontend_owner: "mmg"
frontend_ref: ""
target_release: ""
verified_at: "2026-08-19"
status_note: "后端完成PR #6083 已合并 dev-v36c30bc50c9d1并部署 TESThl-order-service-v3 双实例 16:24 滚动重启成功)。测试服端到端实测两单通过(勾未用释放/无释放行兼容)。目标单测 556 + ArchTest 44 + IT 101 全绿。"
updated_at: "2026-08-19"
base: "dev-v3"
generated: "2026-08-19T16:50:00+08:00"
---
# 终止行程按勾选「未用」行释放房车资源(#6079
## ⚠️ 关键变化
- **以前**:终止行程的房车资源释放按 `endDayNumber` 日期截断——车侧把「出发日+(endDayNumber-1)」及之后的派单整段取消,房侧自动释放该日及之后的未确认候选库存。
- **现在**:释放完全由前端**逐行勾选的「未用」项**驱动。请求新增可选字段 `releaseLines`(与金额用的 `lineUsages` 完全独立、互不影响):
- **车**`releaseLines``used=false` 的车行把 fleet 截断边界**提前到最早勾选未用车行的服务日**fleet 协议上终止日终身唯一、做不到真正逐行,勾选只能把边界提前——请按「尾部连续段」勾选未用天)。不传/空 → 仍按 `endDayNumber` 日期截断(兼容)。
- **房**`releaseLines``used=false` 的房行按「哪晚哪间」精确释放未确认INQUIRING候选库存;**已确认CONFIRMED的房行即使勾了未用也不自动删**,由房务在异常桶手动处置。不传/空 → 不自动释放任何候选(旧按日期整段释放已下线)。
- **退款金额不变**:仍只按 `lineUsages[].used` 权威重算,与 `releaseLines` 无关;车行勾「未用」**不影响退款**(车辆退款按服务日权威判定),只影响资源释放。
## 变更接口
### `POST /v3/admin/order/{id}/terminate` 终止行程(出行中)
请求体新增可选字段(其余字段不变):
| 字段 | 类型 | 必填 | 说明 |
|---|---|:---:|---|
| `releaseLines` | `List<LineUsageItem>` | ❌ | 资源释放行。只取 `used=false` 且 lineKey 前缀为 `VEHICLE_ASSIGNMENT:`/`HOTEL_ASSIGNMENT:` 的行驱动释放;其它来源行忽略。与 `lineUsages` 不做一致性比对。`lineKey` 取值与退款预览 `refundLines[].lineKey` 一致 |
`LineUsageItem` 结构:`{ "lineKey": "VEHICLE_ASSIGNMENT:348303531385688064:2", "used": false }`
请求示例(勾第 2 天车未用 + 第 2 晚房未住):
```json
{
"cancelReason": "客户高反送医终止",
"endDayNumber": 2,
"lineUsages": [
{"lineKey": "HOTEL_ASSIGNMENT:2089913001904680962:1", "used": true},
{"lineKey": "HOTEL_ASSIGNMENT:2089913001917263874:2", "used": false}
],
"releaseLines": [
{"lineKey": "VEHICLE_ASSIGNMENT:348303531385688064:2", "used": false},
{"lineKey": "HOTEL_ASSIGNMENT:2089913001917263874:2", "used": false}
]
}
```
## 前端动作
- 终止弹窗里「逐行勾选已用/未用」的房车行,**未用行同时放进 `lineUsages`used=false,驱动退款`releaseLines`used=false,驱动释放**;两个数组都要传,职责不同。
- 车辆未用天请按**尾部连续段**勾选(如 3 天行程勾第 2、3 天未用);断档勾法(勾第 2 天不勾第 3 天)会把第 3 天也一并截断释放fleet 协议限制,terminateDate 只能取最早未用日)。
- 房行勾「未住」的已确认CONFIRMED行不会自动释放——房务会在「异常桶」看到该终止需求 + REFUND 待办,手动取消未入住部分。
## 验证证据(测试服实测)
- 单测:目标套件 9 类 556 用例全绿(新增 TerminateReleasePlanParserTest 6 用例 + OrderServiceTest 真提前场景/事件透传/兼容回退 + HouseTodo/HouseAssignment 按行释放与 CONFIRMED 跳过计数;ArchTest 44 绿;IT 101 跑 0 失败。CR Workflow 25 agents 对抗复核确认 2 个 P2 已收口。
- 实测 1订单 HL20260819110439216,3 天行程当前第 2 天):`endDayNumber=2` + `releaseLines` 勾车 day2/房 day2 未用 → 退款 6504 按 lineUsages 独立重算;fleet outbox `terminateDate=2026-08-19`=day2 服务日,**边界提前生效**,day2/day3 派单 canceled、day1 保留 assigned;房侧需求转 EXCEPTION + 产 REFUND 待办,勾的 CONFIRMED 房行保留未删(`skippedConfirmed=1`,符合设计)。
- 实测 2订单 HL20260819110313216,不传 releaseLinesfleet 按 `endDayNumber=2` 日期截断兼容路径,day2/day3 canceled;房侧不自动释放候选、需求转 EXCEPTION + REFUND 待办。
- 部署PR #6083 squash 合并 dev-v3merge 6c30bc50c9d1,Deploy Panel 滚动部署双实例 UP8186/8086 均 16:24 重启健康)。
## 关联 / 联系人
- Issuehttps://git.1814.love:8443/wx/HL/issues/6079
- PRhttps://git.1814.love:8443/wx/HL/pulls/6083
- Commitmergehttps://git.1814.love:8443/wx/HL/commit/6c30bc50c9d1
- 后端负责人wx