--- schema: "hl-changelog/v2" ticket: "frontend-fleet-clear-cancelled-occupancy-row" title: "行级「释放占用」对已取消全程槽行误报「缺少该派单的服务日期」" consumer: "admin" author: "kimi(wx)" change_type: "前端缺陷" backend_status: "not_required" gateway_status: "not_required" frontend_status: "verified" frontend_owner: "mmg" frontend_ref: "9871cbb1" target_release: "" verified_at: "2026-08-22" status_note: "前端缺陷:已取消的全程槽派单行(整单取消场景)行级「释放占用」解析服务日失败被误拦截,报「缺少该派单的服务日期,请刷新详情后重试」且刷新无效。建议解析为空时降级整单级释放(后端向后兼容)或该行隐藏行级按钮。根治在 #6152(后端详情将给已取消行补返起止日期)。临时绕路:用卡片顶「释放车辆/司机占用」整单级入口,功能正常。" updated_at: "2026-08-22" base: "dev-v3" generated: "2026-08-22T18:30:00+08:00" --- # 行级「释放占用」对已取消全程槽行误报「缺少该派单的服务日期」 > 前端缺陷,待前端修复。后端无问题(整单级释放入口功能正常,接口本身向后兼容)。 ## 现象(TEST 实测,订单 26-9250) 订单行程中中止(整单取消),派单看板 → 订单详情 → 车辆执行段 → 已取消行内点「**释放占用**」(行级,#6114): - 报错「缺少该派单的服务日期,请刷新详情后重试」,刷新详情后重试仍报同样错误(用户连点 4 次均失败)。 - 卡片顶部「**释放车辆/司机占用**」(整单级,#6107)**功能正常**,可作为临时绕路。 ## 根因(前端) `src/views/fleet/board/index.vue` `onClearCancelledOccupancyRow`:行级释放必须先解析该行的服务日期数组(先取 `assignment.serviceDate`,否则走 `resolveVehicleFeeServiceDates` 的 7 种来源:dailyVehiclePlan / dailyVehicleFees / chargeable+freeServiceDates / serviceDates / serviceDateSegments / itinerary.days / startDate~endDate),解析为空则拦截不发请求。 本条已取消派单是**全程槽行**(`service_date` 为 NULL),且已取消行按 #5828 读侧精简(身份字段置空、仅回显 `cancelled*` 快照,快照不含日期)——7 种日期来源在该行全部为空,于是误拦截。 #6114 实现时只覆盖了「终止勾选未用天」场景(行上带 serviceDates),未覆盖「整单取消的全程槽行」场景。 ## 后端事实(无需改动) `POST /admin/fleet/assignments/clear-cancelled-occupancy`: - 不传 `serviceDates`(或传空数组)= 整单级释放该订单全部已取消派单占用,**向后兼容且幂等**(`intentsWritten=0` 视为成功)。 - 传 `serviceDates` 时后端对全程行按 startDate~endDate 自动展开为天(`coveredServiceDates`),即后端本身能处理全程槽行——缺的只是前端解析不出日期。 ## 修复建议(前端二选一) 1. **降级整单级**:行级解析服务日为空时,确认弹窗文案改为整单级口径(「将释放该订单下已取消派单占用的车辆/司机」),请求不带 `serviceDates` 直接发——后端即整单级释放。 2. **隐藏行级按钮**:`canClearCancelledOccupancyRow` 增加「能解析出服务日」前置条件,解析不出的行不显示行级「释放占用」,保留卡片顶整单级入口。 推荐方案 1(操作路径不变,用户无感)。 ## 根治跟踪 后端工单 **#6152**(feat(fleet): 已派车后取消进异常桶对标房务)验收项包含「已取消行补返起止日期字段」,落地后行级释放可恢复逐天精确语义;本前端降级修复与其不冲突(解析得到日期时仍走行级)。