docs(changelog): #5379 preview refundLines 补齐完整响应契约(15 字段+旧分组保留说明)
所有检测均成功
changelog-filename-gate / validate (push) Successful in 2s

这个提交包含在:
API Changelog Bot 2026-08-04 09:41:00 +08:00
父节点 5c24db01c5
当前提交 2c0c2367db

查看文件

@ -13,7 +13,7 @@ frontend_ref: ""
target_release: "" target_release: ""
verified_at: "2026-08-03" verified_at: "2026-08-03"
status_note: "后端实现完成:双模块 verify 通过order 7402 全绿 / fleet 3010 仅 Docker 环境型 1 error,本单新增代码行覆盖率 91.7%,PR #5417+#5445 已合并 dev-v3 并部署 TESTfleet→order-v3 顺序,网关已验证预览成功路径15 行 VEHICLE+terminateDate wire key、终止提交成功COMPLETED+PENDING_REVIEW+settlement refund 落库)、幂等重放(同 terminateRefundId、阻断路径581018 COMPLETED 拒绝/584100 费用不可用 fail-closed、空集路径无需求允许空车辆成本;管理后台已由 Pi 领取并开始兼容适配。" status_note: "后端实现完成:双模块 verify 通过order 7402 全绿 / fleet 3010 仅 Docker 环境型 1 error,本单新增代码行覆盖率 91.7%,PR #5417+#5445 已合并 dev-v3 并部署 TESTfleet→order-v3 顺序,网关已验证预览成功路径15 行 VEHICLE+terminateDate wire key、终止提交成功COMPLETED+PENDING_REVIEW+settlement refund 落库)、幂等重放(同 terminateRefundId、阻断路径581018 COMPLETED 拒绝/584100 费用不可用 fail-closed、空集路径无需求允许空车辆成本;管理后台已由 Pi 领取并开始兼容适配。"
updated_at: "2026-08-03" updated_at: "2026-08-04"
base: "dev-v3" base: "dev-v3"
--- ---
@ -44,10 +44,47 @@ base: "dev-v3"
**出参**: `Result<OrderTerminateRefundPreviewRespVO>` **出参**: `Result<OrderTerminateRefundPreviewRespVO>`
### refundLines[] 统一资源行(新逻辑主用,提交 `lineUsages``lineKey` 回传)
`refundLines``List<TerminateRefundItemVO>`,住宿/门票/活动/服务/交通/备品/用车/保险全部资源统一展平为行,已按 `dayNumber` 展开(用车每天一行)。
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `refundLines[].lineKey` | String | 统一退款资源行 key,提交 `lineUsages` 时原样回传 | `ITINERARY_NODE:97010:2` |
| `refundLines[].categoryCode` | String | **资源类型 discriminator**`ROOM`/`TICKET`/`ACTIVITY`/`SERVICE`/`TRANSPORT`/`SUPPLIES`/`VEHICLE`/`INSURANCE`,前端据此判断每行资源类型 | `SERVICE` |
| `refundLines[].categoryName` | String | 资源分类名称(与 categoryCode 对应) | `服务` |
| `refundLines[].sourceType` | String | **资源来源类型 discriminator**`HOTEL_ASSIGNMENT`/`ITINERARY_NODE`/`BATCH_SUPPLIES`/`PRODUCT_SUPPLIES`/`VEHICLE_ASSIGNMENT`/`INSURANCE_ORDER`,决定 `sourceId` 语义 | `ITINERARY_NODE` |
| `refundLines[].sourceId` | String(Long) | 资源来源 ID,语义由 `sourceType` 决定Long 序列化为 String 防 JS 精度丢失) | `97010` |
| `refundLines[].refId` | String(Long) | 资源配单记录 IDString 防 JS 精度丢失) | `96011` |
| `refundLines[].name` | String | 资源名称快照(酒店名/景点名/车型) | `拉萨瑞吉·大床房` |
| `refundLines[].dayNumber` | Integer | 第几天(住宿/门票/用车每天行有值;保险为 null | `1` |
| `refundLines[].dealPrice` | String(BigDecimal) | 结算单价(住宿=settlementPrice/间·晚;门票按节点价格口径;用车=dailyFee | `1280.00` |
| `refundLines[].quantity` | Integer | 数量(住宿=间数;门票=张数;用车=车辆数;保险=1 | `1` |
| `refundLines[].billingType` | String | 计费方式快照,备品等资源使用 | `PER_QUANTITY` |
| `refundLines[].totalAmount` | String(BigDecimal) | 行金额合计 = dealPrice × quantity | `1280.00` |
| `refundLines[].defaultUsed` | Boolean | 前端初始化展示值;车辆行最终是否已发生由提交时 Fleet `serviceDate` 与终止日重新判定,非车辆行按提交 `used` 重算 | `false` |
| `refundLines[].locked` | Boolean | 是否锁定不退true=保险等不可退资源) | `false` |
| `refundLines[].lockedReason` | String | 锁定原因(`locked=true` 时有值) | `保险已生效不退` |
### 旧分组字段(兼容保留,与 refundLines 并存)
`rooms`/`tickets`/`services`/`supplies`/`vehicles`/`insurance` **继续返回**,类型均为 `List<TerminateRefundItemVO>`(与 `refundLines` 同构,字段集完全一致):
| 字段 | 类型 | 说明 |
|------|------|------|
| `rooms` | List&lt;TerminateRefundItemVO&gt; | 住宿清单(每晚×每组房一行) |
| `tickets` | List&lt;TerminateRefundItemVO&gt; | 门票/活动清单(景点/活动节点,含套餐内) |
| `services` | List&lt;TerminateRefundItemVO&gt; | 服务清单SERVICE/TRANSPORT 节点) |
| `supplies` | List&lt;TerminateRefundItemVO&gt; | 备品清单hasCost=true 的备品,无天维度整单一行) |
| `vehicles` | List&lt;TerminateRefundItemVO&gt; | 用车清单(每段车按 totalDays 展开成每天一行) |
| `insurance` | List&lt;TerminateRefundItemVO&gt; | 保险(整单 1 行,locked=true 不可退) |
> 前端可任选一种渲染:新逻辑按 `refundLines[]` + `categoryCode`/`sourceType` 区分资源;旧分组字段不会删除,兼容期可继续使用。
### days 与其余顶层字段
| 字段 | 类型 | 说明 | | 字段 | 类型 | 说明 |
|------|------|------| |------|------|------|
| `refundLines[].defaultUsed` | Boolean | 前端初始化展示值;车辆行最终是否已发生由提交时 Fleet `serviceDate` 与终止日重新判定 |
| `refundLines[].lineKey` | String | 提交 `lineUsages` 时原样回传 |
| `days[].terminateDate` | String(date) | 结束日期选项 wire key 固定为 `terminateDate`(原 `date` 字段改名),值 = departDate + (dayNumber-1);`dayNumber`/`label`/`isCurrent` 不变 | | `days[].terminateDate` | String(date) | 结束日期选项 wire key 固定为 `terminateDate`(原 `date` 字段改名),值 = departDate + (dayNumber-1);`dayNumber`/`label`/`isCurrent` 不变 |
### 2. 终止行程 `POST /v3/admin/order/:id/terminate` ### 2. 终止行程 `POST /v3/admin/order/:id/terminate`