8.8 KiB
schema, ticket, title, consumer, author, change_type, backend_status, gateway_status, frontend_status, frontend_owner, frontend_ref, target_release, verified_at, status_note, updated_at, base
| schema | ticket | title | consumer | author | change_type | backend_status | gateway_status | frontend_status | frontend_owner | frontend_ref | target_release | verified_at | status_note | updated_at | base |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hl-changelog/v2 | 5788 | 换版保留派单可改派:候选排除放行 superseded 行 + vehicleSlots 新增标旧字段 | admin | wx(GIT) | 修改接口 | deployed | not_required | implemented | mmg | b31ac7c3 | 2026-08-10 | 前端已实现(范围:槽位标旧+撞号过滤+可改派放开):#5788 返工4项。(1)数据源遮蔽修正:派单弹窗 order 上下文 assignmentSlots 会遮蔽 vehicleSlots,explicitAssignmentSlots 改以 vehicleSlots 为源按 assignmentSlotId 合并 superseded/canDelete/deleteBlockReason 并追加其独有 superseded 保留行(此前 assignmentSlots 恒遮蔽致 supersededSlots 恒空、canDelete 丢失误显锁定);(2)候选排除同源:buildAssignmentCandidateRequest excludeAssignmentId 优先 order.excludeAssignmentId、回退 order.assignmentId,AssignModal assignmentOrder 传本槽位 excludeAssignmentId 字符串;(3)放开统一选择:去除已派槽「已锁定」禁用,已派槽同样走候选接口选车;(4)放开删除:slotDeletionAllowed/slotChangeRowDeletionAllowed 不再因 canDelete 缺失/false 前端拦截,superseded 旧行例外仍禁删(走改派/取消),已完结/已关账由后端 605007/605027 拒并透传 message。spec 全绿 438/438,checkpoint 全过。【取舍说明】一键清空 clearableExistingSlots 仍要求 canDelete===true 未动(返工#4 未点名批量清空,批量放开风险大,保守保留)。【fleetItemIndex 同源修正押后】:#5798 后端已放宽校验兜底非阻塞,另开工单深扣。 | 2026-08-10 | dev-v3 |
车务: 需求换版保留派单可改派 + 槽位视图标旧(#5788)
服务: hl-fleet-service (8087/8187) PR: #5796 Issue: #5788 日期: 2026-08-10 影响范围: 派单看板订单详情 vehicleSlots 结构(新增 3 字段)、派单候选查询排除校验语义 背景: #5784 换版保留行此前点「重新配置车辆」必报「参数非法: 排除派单不属于当前订单、当前用车需求或当前车型项」(26-9313 实测),改派通路被拦死;且槽位视图无法区分新旧行。
变更接口
1. 详情接口 vehicleSlots 新增 3 字段
GET /admin/fleet/board/orders/{orderId} 的 vehicleSlots[] 每行新增:
| 字段 | 类型 | 说明 |
|---|---|---|
requirementId |
string(Long) | 槽位行所属用车需求ID;与顶层 requirementId 不等且 superseded=true 时为换版保留的旧需求行 |
superseded |
boolean | 是否换版保留的旧派单行。true=旧数据,仅供人工核对后改派/取消,不参与当前方案日格进度与车费计数 |
supersededByRequirementId |
string(Long) | 取代该行的新需求ID;superseded=true 时非空 |
排序约定: 当前需求槽位行在前(顺序不变),换版保留行追加在尾部。保留行固定 canDelete=false,deleteBlockReason="需求已改版保留行,请改派或取消,不支持直接删除槽位"。
前端要做: 保留行渲染「旧数据/需求已改版」标识(区别于当前槽位),操作只留「改派 / 取消」;顶部黄条(supersededAssignments)保持现状作提醒入口。注意保留行的 fleetItemIndex 是旧版展开序,可能与当前需求槽位撞号,渲染分组请以 superseded 标志区分,勿再单靠 fleetItemIndex。
2. 候选查询排除校验放宽(保留行改派入口打通)
POST /admin/fleet/assignments/candidates:
excludeAssignmentId现在允许两类:①当前需求本身的派单(原口径,仍须 requirementId+fleetItemIndex 精确匹配);②换版保留派单(supersededByRequirementId 非空,属当前订单即可)。- 排除保留行时
fleetItemIndex可不传(旧版序号在新需求下无语义,后端不再校验);座位匹配自动锚保留行自身座位快照(requiredSeats),不再按新需求车型项定位。 - 保留行自身占用会被正确排除:实测 exclude 后原车 available=true、conflicts=。
- 防护不回归:非本订单/不存在的 assignmentId、普通行 fleetItemIndex 不匹配 → 仍报「参数非法」。
2.5 跟进(PR #5798,2026-08-10):排除未派车占位行也不校验序号
现版前端槽位上下文缺 fleetItemIndex 时回退 0(useAssignFlow.js:294),排除 SUV 占位行(实际序号 1)时被后端精确匹配拒绝(26-9313 复现)。后端已放宽:排除当前需求的 unassigned 占位行时不校验 fleetItemIndex(需求归属仍校验),座位按占位行自身 requiredSeats 快照。现版前端不改也能选车,但仍建议槽位上下文与 vehicleSlots[].fleetItemIndex/assignmentId 同源取值,消除序号错位。
2.6 展示布局建议(wx 2026-08-10 口径)
场景:原需求商务车×2(两辆均已派),改为商务×1+SUV×1。期望车务再派车时看到:
- 商务槽(当前): 沿用原车回显(换版时签名匹配自动沿用,如 26-9313 的蒙A-E5555)——可加「沿用」小徽标(判定见 #5784 changelog);
- SUV 槽(当前): 待选车,点选车走候选接口(本次已修通);
- 旧数据行: 被取代的原商务车(蒙A-S6666)从
vehicleSlots里superseded=true的行渲染,标「旧数据/需求已改版」。操作能力与普通行一致(可改派/取消),不要禁用——旧数据与新数据无本质区别,只要日期对得上;仅改出发日期场景下旧车/司机日期不符时,车务需先取消旧行再进行下一步(此时给出引导提示)。
即"原来的两辆商务车都可见(一辆沿用在新槽、一辆标旧),新需求两个槽位齐全"。
2.7 ⚠️ a75efc05 复测未过·前端需返工(wx 2026-08-10 现场实测 26-9313,浏览器抓包实证)
标旧行没渲染、选车仍报错、槽位误显锁定,根因共 4 项(前 2 项同一根因):
- 数据源遮蔽(根因):
explicitAssignmentSlots(batchAssignmentSlots.js)只要order.assignmentSlots是数组就直接返回,永远读不到 detail 的vehicleSlots。实测本单列表行assignmentSlots有 2 个普通槽(不含 superseded 行、无 superseded/canDelete 字段)→ ①supersededSlots 恒空,「旧数据·需求已改版」行一次都没渲染过;②槽位对象丢失canDelete=true(detail 有、列表无)→ 误显"当前槽位不可删除,请刷新详情后重试"。修法: superseded 标旧行与 canDelete/deleteBlockReason 必须以 detailvehicleSlots为源(合并或优先)。 - candidates 排除同源缺陷阻塞实锤: 槽位2 选车请求实抓
fleetItemIndex=1, excludeAssignmentId=2086270154022285313(=槽位1 E5555 已派行)——picker 上下文的 excludeAssignmentId 取了订单级行而非本槽位行,被后端精确匹配拒绝报"参数非法"。后端已再兜底(PR #5802:同订单上下文不一致的排除改为忽略并 WARN,不再报错),现版前端已可正常选车,但同源修正仍需落地:excludeAssignmentId/fleetItemIndex 一律取本槽位行(vehicleSlots 同行的 assignmentId+fleetItemIndex),否则被误传行会在候选里如实显示冲突(略影响体验不阻塞)。 - 去除"已锁定"(wx 2026-08-10 口径):
isExistingAssignment槽位的「统一选择车辆/司机」按钮禁用+显示"已锁定"——去除该锁定;已有槽位同样允许统一选车(走候选接口,后端排除口径已放开)。 - 任何槽位车务都可删除(wx 2026-08-10 口径): 删除按钮不再因 canDelete 缺失/false 隐藏或拦截——后端 #5572 本就允许删除一切未完结槽位(已派/待确认删除时联动取消释放),仅已完结/已关账行后端会拒并给原因,前端直接放开按钮、失败时展示后端 message 即可(换版保留旧行例外:仍走改派/取消不走删除)。
⚖️ 形态定稿(wx 2026-08-10 终审): 当前「旧数据·需求已改版」窄条置于槽位区上方的展示形态已被 wx 接受,无需改为槽位同构样式;上面第 3/4 条(去除锁定/任何槽位可删)按现状核对,已生效则忽略。仍需完成的只剩:第 1 条数据源遮蔽(保证标旧条在任何数据形态下稳定渲染)与第 2 条 exclude 同源(后端已兜底,非阻塞、顺手修)。
验证证据:实测数据样例(测试服 26-9313)
// vehicleSlots 尾部保留行
{"fleetItemIndex":1, "requiredVehicleType":"mpv", "slotStatus":"assigned",
"vehiclePlate":"蒙A-S6666", "superseded":true,
"requirementId":"2086270153913225218",
"supersededByRequirementId":"2086700635972915201",
"canDelete":false, "deleteBlockReason":"需求已改版保留行,请改派或取消,不支持直接删除槽位"}