一些检查失败了
changelog-filename-gate / validate (push) Failing after 2s
前端复核:changelog 所指 candidateServiceDate 仅单日根因属实,但致障链已被 08-11 候选证据门禁放宽盖过(validateDailyVehiclePlan 默认 requireCandidateEvidence=false, 三调用方均未开启),多日置灰不复现。frontend_status 翻 not_required,frontend_ref=0e5a0277。
79 行
7.0 KiB
Markdown
79 行
7.0 KiB
Markdown
---
|
||
schema: "hl-changelog/v2"
|
||
ticket: "frontend"
|
||
title: "派单 Step2「下一步」多日行程被误拦:候选证据只支持单日,多日每格判「未通过候选校验」置灰"
|
||
consumer: "admin"
|
||
change_type: "前端缺陷"
|
||
author: "wx(GIT)"
|
||
backend_status: "not_required"
|
||
gateway_status: "not_required"
|
||
frontend_status: "not_required"
|
||
frontend_owner: "mmg"
|
||
frontend_ref: "0e5a0277"
|
||
target_release: ""
|
||
verified_at: "2026-08-12"
|
||
status_note: "后端零改动。后端提交校验口径已满足业务要求(工单 #5849):车型/座位/数量与当前需求不符不拦截、降级为提示(AssignmentService.java:3038 创建链、assertFinalConfirmationBaseline:4676 baseline 均已定稿,#5810/#5824 一脉);真实资源冲突与日期越窗仍为硬拦(605001/605003/605062),该保留。26-5067 被卡的根因在前端:useVehicleDriverPicker.js 的 candidateServiceDate 只在 startDate===endDate(单日行程)才返回日期,多日行程返回空串 → candidateEvidence 为 null → daily-vehicle-plan.js 的 dailyVehiclePlanCandidateEvidenceMatches 要求 evidence.serviceDate===cell.serviceDate 永不匹配 → 每个用车日格都判「未通过候选校验」→ 槽位 selectionReady=false → 「已完成 0/1」、按钮置灰。后端候选接口已返回 availabilityWindows(按请求日期范围扣除阻断冲突后的可用窗口),数据足够前端判断「车/司机覆盖整个服务期」,无需新增接口。前端 2026-08-12 复核 not_required:candidateServiceDate 仅单日、candidateEvidence 多日为空属实,但致障链已被 2026-08-11 候选证据门禁放宽盖过——validateDailyVehiclePlan 默认 requireCandidateEvidence=false 且三调用方(daily-vehicle-plan.js:616 / useAssignFlow.js:534 / AssignModal.vue:1698)均未开启,证据匹配分支不执行;Step2「下一步」disabled 只读 selectionReady(batch=selectedSlots>0 且无 selectionBlockedReason/dailyPlanValidationError),「已完成 N/M」走 isDailyVehiclePlanCellComplete 不查 _candidateEvidence;日格 scope 恒单日 order、槽位 scope 逐日格手工造证据(applySlotResourceSelection)绕过 picker evidence,多日置灰不复现,前端零改动。"
|
||
updated_at: "2026-08-12"
|
||
base: "dev-v3"
|
||
---
|
||
|
||
# 派单 Step2「下一步」多日行程被误拦(#5849,前端修复)
|
||
|
||
> **页面**:车务管理 → 派单看板 → 订单派车弹窗 → Step2「排车」→「下一步 · 发送给司机」按钮
|
||
> **后端**:本条**零改动**。后端口径已满足,根因在前端候选证据只支持单日。
|
||
> **业务口径**(wx 2026-08-11,#5849):只要槽位有车+有司机、且日期在行程窗内,就可以下一步;定制师换版改需求不等于车务必须改派车。
|
||
|
||
---
|
||
|
||
## 一、现象
|
||
|
||
订单 26-5067(三日行程 08/20~08/22):车辆槽位 1 已有车(蒙A-E5555)+司机(阿木古愣),三天全部「已规划用车」、日历价派车价都填了,但仍被拦——
|
||
|
||
- 8月21日 行挂橙条「2026-08-21 车辆槽位1 尚未通过当前日期、车辆和司机的候选校验」
|
||
- 底部「已完成 **0/1** 个最终方案槽位」
|
||
- 「下一步 · 发送给司机(1 辆)」按钮置灰
|
||
|
||
## 二、根因(前端)
|
||
|
||
按钮置灰链路:`AssignModalFooter.vue:108` `:disabled="!selectionReady"` ← `AssignModal.vue:2401-2416` `syncSlotCompletion` 把 `slot.selectionReady = cells.every(isDailyVehiclePlanCellComplete)` ← `daily-vehicle-plan.js:571-577` 要求每格 `dailyVehiclePlanCandidateEvidenceMatches(cell)` ← 该函数要求 `evidence.serviceDate === cell.serviceDate`。
|
||
|
||
而证据来源 `useVehicleDriverPicker.js:68-71`:
|
||
|
||
```js
|
||
function candidateServiceDate(order = {}) {
|
||
const startDate = String(order.startDate || '')
|
||
return startDate && startDate === String(order.endDate || '') ? startDate : ''
|
||
}
|
||
```
|
||
|
||
**只在单日行程返回日期,多日行程返回空串** → `candidateEvidence`(`useVehicleDriverPicker.js:313-323`)为 `null` → `dailyVehiclePlanCandidateEvidenceMatches` 永不匹配 → 多日行程下每个用车日格都判「未通过候选校验」→ 整槽 selectionReady=false → 0/1、置灰。
|
||
|
||
单日行程不触发此 bug(serviceDate 非空、能匹配),所以只在多日行程复发。
|
||
|
||
## 三、后端口径现状(已满足,勿再拦)
|
||
|
||
后端提交链对「车型/座位/数量与当前需求不符」**已经不拦截**,与 #5810/#5824 一脉:
|
||
|
||
- `AssignmentService.java:3038`:「车型与座位差异不再阻断:车务可按现场调度选择任意车辆,候选接口返回匹配标记供醒目提示」
|
||
- `assertFinalConfirmationBaseline`(`AssignmentService.java:4676-4680`):「车型/数量/人数不符一律不拦截、降级为看板提示语句,日期是唯一硬门禁」
|
||
- 候选接口 `requirementMatched`/`requirementMismatchReasonCode`/`requirementMismatchMessage` 只作提示,不影响 `selectable`
|
||
|
||
**必须保留的硬拦**(前端不要用候选证据把它们也放行):真实资源冲突(同车/同司机同日被别单占用,605001/605003)、资源状态不可用(维保/停用/休假/黑名单,605037/605038/605006/605013)、跨常驻未确认(605014)、日期越出行程窗(605062)。
|
||
|
||
**前端可用的数据**:候选接口每个车辆/司机候选已返回 `availabilityWindows`(按请求日期范围扣除阻断冲突后的可用窗口区间列表)+ `selectable`。前端据此即可判断「车/司机组合覆盖整个服务期且无阻断冲突」,无需新增接口。
|
||
|
||
## 四、前端修复点(mmg)
|
||
|
||
1. **`useVehicleDriverPicker.js:68-71` `candidateServiceDate`**:多日/整段行程也要能给出证据日期范围。建议返回 `{ startDate, endDate }` 或服务期日期列表,而非单日或空串。
|
||
2. **`useVehicleDriverPicker.js:313-323` `candidateEvidence`**:证据携带服务期(起止日期或日期数组),不再只带单日 `serviceDate`。
|
||
3. **`daily-vehicle-plan.js:81-90` `dailyVehiclePlanCandidateEvidenceMatches`**:匹配口径由「`evidence.serviceDate === cell.serviceDate`」放宽为「`cell.serviceDate` 落在证据服务期范围内」(车/司机/跨常驻确认仍精确比对)。
|
||
4. **`daily-vehicle-plan.js:443-466` `isDailyVehiclePlanCellComplete` 与 `AssignModal.vue:2401-2416` `syncSlotCompletion`**:完成口径对齐业务口径——槽位内所有服务日已决策(用车/不用车)、用车日有车+司机、价格/跨常驻合规、候选证据覆盖整个服务期,即视为完成、可下一步。已 finalized 的只读行保持 `preservedFinalized` 短路。
|
||
5. 完成度文案「已完成 N/M 个最终方案槽位」随之正确(不再「三天已规划却 0/1」)。
|
||
|
||
## 五、验收
|
||
|
||
- 多日行程(≥2 天)下:槽位有车+有司机+日期在行程窗内 → 「下一步」可点,不再被「候选校验」误拦
|
||
- 车型/座位/数量与当前需求不符 → 只提示不拦
|
||
- 真实资源冲突 / 日期越出行程窗 → 仍硬拦(沿用候选接口 selectable/availabilityWindows 的阻断冲突判定)
|
||
- 「已完成 N/M」口径与放宽后一致
|