---
schema: "hl-changelog/v2"
ticket: "5338"
title: "Fleet 按订单分窗保持路由状态集合守恒"
consumer: "admin"
change_type: "修改接口"
backend_status: "deployed"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_owner: "hl-ui-pi"
frontend_ref: "868739d793aff1ca265296a7bf2cd681fcb557bd"
target_release: ""
verified_at: ""
status_note: "frontend-only：复用 #4760 grid/unassigned 与 #5301 coarse status 已部署契约；#5338 无后端 diff、PR、测试或部署要求。前端代码已有 implemented 证据，但尚无 target_release 或页面验证证据，不上调 released/verified"
updated_at: "2026-07-31"
base: "dev-v3"
---

# Fleet：按订单分窗保持路由状态集合守恒

> **Tracking Issue**：[wx/HL#5338](https://git.1814.love:8443/wx/HL/issues/5338)
> **责任端**：`mmg/hl-ui` Fleet Matrix 分窗前端
> **前端基线**：`v2.1@18daf2a03e9946c46d7bf31c7577adcb05d3c168`
> **性质**：frontend-only；不是后端缺陷，不新增后端接口、字段、错误码或部署

## 问题与根因

修复前，`matrix-solo?solo=byOrder&status=assigned` 已把 route status 传给 grid，且 coarse assigned 正确映射为 `holding/holding_urgent/assigned`；但共享 composable 会继续合并不带 status 的 `unassigned-orders`，`SoloByOrderView.visibleOrders` 又只排除 canceled，未按 route status 最终收口。

这会令 assigned 分窗混入无车的 `unassigned/unassigned_urgent` rows。主矩阵原本已使用共享 `matchesMatrixStatusFilter`；#5338 只补齐 byOrder 分窗的同一保护，不归因于后端 grid 或 coarse status 契约。

## 变更接口

### `GET /admin/fleet/matrix/grid`

### `GET /admin/fleet/matrix/unassigned-orders`

接口契约保持不变，继续沿用 `#4760/#5301`：

- coarse `assigned` = `holding + holding_urgent + assigned`。
- coarse `unassigned` = `unassigned + unassigned_urgent`。
- 只有 route `all` 的最终显示集合可以同时包含已派与未派两侧。
- `backend_status=deployed` 仅表示上述既有接口契约已部署，不表示 #5338 有后端代码发布。
- `gateway_status=not_required`：根因是前端将两个成功响应合并后缺少 view-level route filter，fresh API probe 不能证明页面集合守恒。

## 前端实现结果（implemented，不代表 released/verified）

1. `SoloByOrderView` 最终展示复用共享 `matchesMatrixStatusFilter`，未维护第二套状态映射。
2. route query、grid/unassigned 请求、visibleOrders 与跨窗口 drag source 使用同一筛选 identity。
3. `assigned` 只显示 `holding/holding_urgent/assigned`，排除全部无车未派 rows。
4. `unassigned` 只显示 `unassigned/unassigned_urgent`，排除已绑车 rows；仅 `all` 合并两侧。
5. 最终过滤后的同一数组同时用于渲染与拖拽，drag source 不再绕过 visibleOrders。

## 前端实现验收（6/6；不代表页面发布/验证）

- [x] 组件挂载测试覆盖 route `all/unassigned/assigned`，显示集合与主矩阵同筛选口径守恒。
- [x] `assigned` 样本同时包含 `holding/holding_urgent/assigned`，并排除 `unassigned/unassigned_urgent` 无车 rows。
- [x] `unassigned` 只含未派 rows 并排除所有已绑车 rows；只有 `all` 合并两侧。
- [x] 最终展示与 drag source 都复用 `matchesMatrixStatusFilter` 的同一过滤结果。
- [x] year/month/fleetTeamIds/typeKeys/status 从 route、请求到 visible/drag 集合保持同一身份。
- [x] 不改变 grid、unassigned-orders、statuses[] 或 coarse status 后端契约。

## 验证证据

- 前端业务提交：[`mmg/hl-ui@868739d793aff1ca265296a7bf2cd681fcb557bd`](https://git.1814.love:8443/mmg/hl-ui/commit/868739d793aff1ca265296a7bf2cd681fcb557bd)，仅修改 `SoloByOrderView.vue` 并新增 `SoloByOrderView.spec.js`；没有后端文件。
- 前端任务账本：`mmg/hl-ui:.claude/tasks/done/changelog-5338-3c335437bf.md`，记录 `status=done`、`source_status=implemented`、6 个 mount tests、21 个 composable tests、source 46 tests、ESLint/Prettier/Stylelint 与 production build 通过。
- Changelog 领取/完成提交：`wx/hl-api-changelog@4ad3a92f66741651b60d6d1c6f3d12983e96ea56` / `@73c4daab04bf094507698d9ab814cdbdd711bf73`。
- 2026-07-31 只读复核时，当前 `v2.1@6b3b04c58da5126f922cdaea52caeb13ab343444` 仍保留共享 `matchesMatrixStatusFilter`、`visibleOrders` 最终过滤与 `setupCrossWindowDrag(() => visibleOrders.value)`；实现提交已在当前分支祖先链中。
- Deploy Panel 测试环境任务 `a44ef795` 已把当前 `v2.1@6b3b04c58da5` 构建部署成功，但本条目没有 `target_release` 或浏览器页面验证证据；因此 `frontend_status` 保持 `implemented`，不得表述为 `released` 或 `verified`。
- 前端仓库没有关联 PR，交付形态为直接提交；本记录不追建事后 PR。

## 后端独立闭环证据

- #5338 是 frontend-only 集合过滤，后端 contract review 结论为 **no contract change**：Controller、DTO/VO、Feign、字段、枚举、错误码与数据库均无 diff；故 #5338 的后端 merge/test/deploy 均为 `not_required`，不伪造 PR、测试或发布。
- 既有 `grid + unassigned-orders` 契约已由 #4760 完成：PR #4761/#4772 已合并，Fleet/User 定向测试、Fleet reactor、Spotless、测试部署及独立账号真实 API 回归证据均持久记录在 [wx/HL#4760](https://git.1814.love:8443/wx/HL/issues/4760)。
- coarse/精确状态契约已由 #5301 完成：PR #5304 squash 合并到 `dev-v3@ed56bec1fa466f92e0d41d7b92de3ad4756517b3`；51 个定向测试、Fleet reactor 2474 tests、Spotless、Fleet 双实例部署及真实网关验证记录在 [wx/HL#5301](https://git.1814.love:8443/wx/HL/issues/5301)。
- 当前 `dev-v3` 源码仍明确实现 coarse `assigned = holding + holding_urgent + assigned`，并保留 grid/unassigned-orders 契约；#5338 不需要 fresh gateway probe，因为 API 成功不能证明前端合并后的页面集合。

## 关联与去重

- `#4760` 规定 byOrder 使用 grid + unassigned-orders 并携带 route status；本条目补充最终显示集合守恒，不修改其历史文件。
- `#5301` 规定 coarse assigned 与精确 statuses[]；本条目不改变该契约。
- D-03 的 `todayDay` 未消费仍归 `#4760` existing-follow-up，不在 #5338 创建重复验收。
- D-01 day-orders 陈旧失败隔离由独立 `#5337` 跟踪。
