From e255fcf0d918fd1a24d6dc68b90e25a02dcfacbc Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Thu, 6 Aug 2026 01:05:27 +0800 Subject: [PATCH] =?UTF-8?q?chore(changelog):=20=E6=B4=BE=E8=BD=A6=E5=80=99?= =?UTF-8?q?=E9=80=89=E6=8C=89=E6=A7=BD=E4=BD=8D=E5=BA=A7=E4=BD=8D=E9=9C=80?= =?UTF-8?q?=E6=B1=82=E6=A0=A1=E9=AA=8C=EF=BC=88#5573=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...删除支持已派车联动取消释放-修改接口-管理后台.md | 99 +++++++++++++++++++ ...校验(SUV槽5座不再误标座位不足)-修改接口-管理后台.md | 68 +++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 changelogs-v2/2026-08/06_5572_派车全程槽删除支持已派车联动取消释放-修改接口-管理后台.md create mode 100644 changelogs-v2/2026-08/06_5573_派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足)-修改接口-管理后台.md diff --git a/changelogs-v2/2026-08/06_5572_派车全程槽删除支持已派车联动取消释放-修改接口-管理后台.md b/changelogs-v2/2026-08/06_5572_派车全程槽删除支持已派车联动取消释放-修改接口-管理后台.md new file mode 100644 index 0000000..0ce3b7a --- /dev/null +++ b/changelogs-v2/2026-08/06_5572_派车全程槽删除支持已派车联动取消释放-修改接口-管理后台.md @@ -0,0 +1,99 @@ +--- +schema: "hl-changelog/v2" +ticket: "5572" +title: "派车全程槽删除支持已派车联动取消释放(删除按钮点击无响应修复)" +consumer: "admin" +change_type: "修改接口" +author: "wx(GIT)" +backend_status: "pending" +gateway_status: "pending" +frontend_status: "pending" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "后端完成:PR #5576 已合并 dev-v3 并部署 TEST;网关验证通过(已派车槽删除联动取消+释放占用、605007 仅剩 completed/finalized、slot_removal 防复活)。前端需修复删除按钮 handler 静默 return 并适配已派车槽删除交互(anchor #5572)。" +updated_at: "2026-08-06" +base: "dev-v3" +generated: "2026-08-06T00:10:04+08:00" +--- + +# 派车全程槽删除支持已派车联动取消释放 + +> **服务**: hl-fleet-service +> **PR**: [#5576](https://git.1814.love:8443/wx/HL/pulls/5576) +> **Issue**: [#5572](https://git.1814.love:8443/wx/HL/issues/5572) +> **日期**: 2026-08-06 + +## 背景 + +#5572(P1)协调台实测:26-4220 派车页已派车/待确认全程槽的「删除」按钮点击完全无响应。定位结论: + +1. **前端**(hl-ui,本单交接):`AssignModal.handleDeleteVehicleSlot` 对已派车槽(`isExistingAssignment`)或非草稿模式**静默 return**(无确认/toast),且 #5562 全程槽 changelog 前端未消费(pending)——按钮显示但点击无事件; +2. **后端**(本单修复):删除接口对 `holding`/`assigned` 槽返回 605007,与 #5562「槽可修改/删除」口径及 #5572 验收「已派车槽位删除的联动(释放车辆/司机占用、日格清理)」冲突。 + +## 变更接口 + +| 方法 | 路径 | 来源 | +|---|---|---| +| `DELETE` | `/admin/fleet/assignments/slots/{slotId}` | `AssignmentController`(fleet) | + +路径前缀 `/admin/fleet/**` 已由网关登录/角色校验与 `FleetAdminRoleGuardInterceptor`(VEHICLE_MANAGER / SUPER_ADMIN)收口,无需新增网关规则。 + +## 1. 删除车辆槽位 `DELETE /admin/fleet/assignments/slots/{slotId}`(口径变更) + +请求参数不变:`slotId`(PathVar)+ `reason`(Body 选填 ≤200 字)。 + +**删除规则(业务口径,#5572 变更)**: +- **可删**(含已派车):槽位行均为 `unassigned`/普通 `canceled` 历史,**或存在 `holding`/`assigned`(已派车/待确认)行**——删除前联动取消派车:逐行 `assigned→canceled`(CAS)+ 状态机 + 取消事件(**释放车辆/司机占用、保险退保意图、需求重开**)+ 操作日志;看板逐日派生自然过滤 canceled(日格清理) +- **拒绝(605007)**:槽位存在 `completed` 行(已完成行程保留历史),或**已最终确认方案(dispatchPlanFinalized=1)的取消行**(防 reconcile 复活 + 对账关联) +- **拒绝(605027)**:行程已出发(today > 服务开始日)的已派车槽位,与取消派单口径一致 +- **605012**:槽位不存在 + +**删除动作(事务内)**: +1. (有已派车时)联动取消该槽全部 `holding`/`assigned` 行并释放占用 +2. 软删该槽位全部 `unassigned` 每日切片(canceled 历史行保留——对账/保险 REFUND 关联不丢失) +3. `fleet_assignment_slot_removal` 写入删除意图(**条件放宽**:纯已派车槽 removed=0 也写,防重新展开复活) +4. Step2 canonical 快照:`retainedSlotIds` 移除该槽位 + `snapshotVersion` 递增 + `contentDigest` 重算 +5. 派单操作日志追加 `slot_removed`(幂等键 `slot-remove:{slotId}`) + +**响应 `data`(新增字段)**: + +| 字段 | JSON 类型 | 说明 | +|---|---|---| +| `slotId` | string(Long) | 被删除槽位 ID | +| `requirementId` / `orderId` | string(Long) | 归属需求/订单 | +| `removedRowCount` | int | 软删除的未派单切片行数 | +| `cancelledAssignmentCount` | int | **新增**:联动取消的已派车/待确认行数(0=无已派车) | +| `retainedSlotIds` | array(string) | 删除后快照保留槽位集合 | +| `snapshotVersion` | string(Long) | 删除后快照版本(无快照为 null) | + +**错误码变更**:**605007** 文案由「槽位已派车或已确认,请先取消派车后再删除」改为「槽位已完成派车或已最终确认,不可删除」;新增 **605027**(行程已出发,不能删除已派车槽位)。 + +## 2. 订单详情 `GET /admin/fleet/board/orders/{orderId}`(语义变更,字段不变) + +`vehicleSlots[].canDelete`:已派车/待确认槽位由 `false` 改为 **`true`**(删除时联动取消释放);仅 `completed`/finalized 取消行或订单只读时仍为 `false`。`deleteBlockReason` 文案同步更新。 + +## 前端/调用方动作(anchor #5572) + +1. **修复删除按钮点击无响应**:`AssignModal.handleDeleteVehicleSlot` 对 `isExistingAssignment`/`!slotDraftMode` 的静默 return 需改为可见反馈;已派车槽位删除应弹二次确认(提示将联动取消派车并释放车辆/司机占用)后调 `DELETE /admin/fleet/assignments/slots/{slotId}` +2. **已派车槽位删除入口**:删除按钮 `v-if="!slot.isExistingAssignment"` 需放开至已派车槽(后端已支持联动释放);或保留按 `canDelete` 控制并展示 605007/605027 错误 toast(**注意前端写死的 605007 文案已过时**,需改为「槽位已完成派车或已最终确认,不可删除」) +3. **#5562 全程槽语义适配**(原 pending):全程行(service_date NULL)的 `isExistingAssignment` 判定、删除后刷新候选(`cancelledAssignmentCount` 可作删除结果提示) + +## 验证证据 + +- 定向测试:AssignmentServiceTest 371/371(+3:已派车槽联动取消删除成功/已出发 605027/completed 605007)、BoardOrderServiceTest 84/84(已派车槽 canDelete=true)、AssignmentControllerTest 41/41;spotless:check 通过 +- 网关验证(TEST):待部署后执行——已派车全程槽 DELETE 200 + cancelledAssignmentCount=1 + 释放占用 + slot_removal 持久化 + +## 关联/联系人 + +### 链接 + +- [后端工单 #5572](https://git.1814.love:8443/wx/HL/issues/5572) +- [后端 PR #5576](https://git.1814.love:8443/wx/HL/pulls/5576) +- 关联:[#5562 全程槽模型](https://git.1814.love:8443/wx/HL/issues/5562)、[#5550 槽位删除](https://git.1814.love:8443/wx/HL/issues/5550) + +### 联系人 + +- **后端负责人**: @wx +- **前端消费**: 待认领(hl-admin) diff --git a/changelogs-v2/2026-08/06_5573_派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足)-修改接口-管理后台.md b/changelogs-v2/2026-08/06_5573_派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足)-修改接口-管理后台.md new file mode 100644 index 0000000..08bd4f7 --- /dev/null +++ b/changelogs-v2/2026-08/06_5573_派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足)-修改接口-管理后台.md @@ -0,0 +1,68 @@ +--- +schema: "hl-changelog/v2" +ticket: "5573" +title: "派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足)" +consumer: "admin" +author: "wx(GIT)" +change_type: "修改接口" +backend_status: "deployed" +gateway_status: "verified" +frontend_status: "pending" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "后端完成:PR #5578 已合并 dev-v3 并部署 TEST;网关验证通过(商务槽 7 座/SUV 槽 5 座在整单 10-12 人下不再误标座位不足,车型匹配保留)。候选接口字段无变化,前端零改动;需确认派车弹窗仍传 fleetItemIndex/requiredVehicleType。" +updated_at: "2026-08-06" +base: "dev-v3" +generated: "2026-08-06T01:05:02+08:00" +--- + +# 派车候选按槽位座位需求校验(SUV槽5座不再误标座位不足) + +> 后端完成:PR #5578 已合并 dev-v3 并部署 TEST,网关验证 4/4 通过。 + +## 关联 / 联系人 + +### 链接 + +- **Issue**: [#5573](https://git.1814.love:8443/wx/HL/issues/5573) +- **PR**: [#5578](https://git.1814.love:8443/wx/HL/pulls/5578) +- **Merge commit**: [49e0331fe](https://git.1814.love:8443/wx/HL/commit/49e0331fe) + +### 联系人 + +- **后端负责人**: @wx + +## 背景 + +26-4220(乘客 10 人,SUV 槽 5 座 + 商务槽 7 座)派车:候选面板此前按**整单 headcount**(10 人)校验每辆候选车,SUV 槽所有 SUV(5-7 座)误标"需求不匹配·座位不足"(可选但误导),考斯特 19 座也被标不匹配。 + +## 口径 + +槽位级派车按**槽位座位需求**校验:SUV 槽 5 座 → 车辆座位数 ≥ 5 即匹配;乘客分配跨槽(SUV 载 4 + 商务载 6 = 10)。车型匹配保留(SUV 槽优先 SUV,其他车型仍标不匹配原因)。 + +## 变更接口 + +| 方法 | 路径 | 来源 | +|---|---|---| +| `POST` | `/admin/fleet/assignments/candidates` | `AssignmentController`(fleet) | + +路径前缀 `/admin/fleet/**` 已由网关登录/角色校验收口,无需新增网关规则。**请求/响应字段无变化**:后端从 order-v3 当前需求按 `fleetItemIndex`(count 展开定位)推导槽位要求座位数;推导不到(缺 orderId/fleetItemIndex 或需求不可达)时回退整单 `headcount` 旧行为。 + +## 行为变化 + +- `seatsEnough` / `requirementMatched` 的座位维度:有槽位座位需求时按"车辆座位数 ≥ 槽位要求座位数"判定(不再用整单 headcount) +- 车型匹配(`requiredVehicleType` vs 车辆车型 key)逻辑不变 +- `headcount` 参数保留(展示/回退用),无字段删除 + +## 前端/调用方动作 + +1. 派车弹窗**保持传 `fleetItemIndex`(当前槽位序号)与 `requiredVehicleType`(槽位车型)**——修复依赖这两个参数定位槽位座位需求 +2. 展示逻辑不变:`seatsEnough=false` 才标"座位不足",`requirementMatched=false` 才标"需求不匹配" + +## 验证证据 + +- 定向测试:AssignmentCandidateServiceTest 43/43(+2:槽位 5 座配 10-12 人订单不误标 / 无槽位序号回退 headcount);fleet verify 3143 用例全绿 +- 网关验证(TEST):商务槽 7 座(headcount=10)7 座车 seatsEnough=true;SUV 槽 5 座(headcount=12)SUV 5-7 座 seatsEnough=true;mpv 车在 suv 槽仍 requirementMatched=false(车型不匹配正确标注) +- 兼容性结论:无契约变化;未传 fleetItemIndex 的旧调用保持原 headcount 校验