---
schema: "hl-changelog/v2"
ticket: "5751"
title: "车务管理员查看订单详情/打印行程单误拦修复（OrderViewGuard 读接口放行 VEHICLE_MANAGER）"
consumer: "admin"
change_type: "修改接口"
author: "wx(GIT)"
backend_status: "deployed"
gateway_status: "verified"
frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: ""
status_note: "后端完成：PR #5765 已合并 dev-v3 并部署 TEST（18:31 滚动 DONE）。网关角色切换链路探针 ALL PASS：admin 切车务管理员后详情/行程/打印行程单/发票/支付流水/预支候选/状态日志全部 200（修复前 581008）；房务仍 581045、定制师非本单仍 581008。前端无需配合。"
updated_at: "2026-08-09"
base: "dev-v3"
generated: "2026-08-09T18:50:00+08:00"
---

# 车务管理员查看订单详情/打印行程单误拦修复

> **服务**: hl-order-service-v3
> **PR**: [#5765](https://git.1814.love:8443/wx/HL/pulls/5765)
> **Issue**: [#5751](https://git.1814.love:8443/wx/HL/issues/5751)
> **日期**: 2026-08-09
> **影响**: 🟢 **缺陷修复**，无契约结构变更（角色守卫口径修正，接口/字段/错误码均不变）。前端无需改代码。

## 背景

#5751（P1）实证：admin 账号切「车务管理员」（VEHICLE_MANAGER）角色在派单看板点「打印行程单」报 **581008 无权查看此订单**。#5504 读接口越权收口（#5512/#5513）把订单详情/行程/打印/签单/发票/预支/支付/调整单/推送记录等读端点从「放行非房务角色」收紧为「必须本单定制师」，**漏放行 VEHICLE_MANAGER**——车务管理员是派车作业角色（跨订单），本就不是定制师，被误拦。

## 修复内容（守卫口径修正，无接口变化）

`OrderViewGuard` 新增 **`assertOrderReadable(order)`**：放行 `ADMIN`/`SUPER_ADMIN`/`VEHICLE_MANAGER`，其余后台角色仍须本单定制师（否则 581008）；房务（ROOM_MANAGER/house_keeper_lead）仍 581045。

#5504 收口的**读接口**全部切换至 `assertOrderReadable`：
- 订单详情 / 行程 / 状态日志 / 发票（OrderDetailService）
- 取消预览（OrderService.getCancelPreview）
- 打印行程单（PrintItineraryService）/ 签单预览（SignVoucherService）
- 预支查询与候选（OrderAdvanceService）
- 发票管理（InvoiceAdminService）/ 调整单（AdjustmentAdminController）/ 推送记录（OrderPushRecordService）
- 支付流水 / 线下收款列表与选项（AdminOrderPaymentController / ManualReceiptService）

**财务写域保持收紧**（仍 `assertOrderAccessible`，车务管理员不得执行）：终止退款（prepareTermination）、核单（settlement 全部）、收款登记写操作。

## 变更接口

| 方法 | 路径 | 变更 |
|---|---|---|
| GET | /v3/admin/order/:id（详情）/itinerary/print-itinerary/invoices/status-log | VEHICLE_MANAGER 可访问（修复前 581008） |
| GET | /v3/admin/order/:id/advance/payee-candidates、/adjustment-record、/payment/list、推送记录等 #5504 收口读端点 | VEHICLE_MANAGER 可访问 |
| — | 终止退款/核单/收款登记等财务写接口 | 不变（车务管理员仍无权） |

## 验证证据

- 受影响面定向测试全绿：OrderViewGuardTest 16、OrderDetailServiceTest 84、OrderServiceTest 178、两控制器测试 5+6、Advance 5、Invoice 3、PushRecord 5。
- order-v3 全量 verify 7561 tests：2 Failures（#5599 H2 schema 漂移，基线既有）+ 24 Errors（Testcontainers 3306 端口争用/loadbalancer 环境，基线实证同失败），与本改动无关。
- 部署 TEST 18:31 滚动 DONE。
- 网关探针 ALL PASS（订单 2086341233369616386）：车务管理员 7 个读端点全部 200；ROOM_MANAGER 仍 581045；CUSTOMIZER 非本单仍 581008（越权收口不回退）。

## 前端配合

无需配合。前端调用链不变，角色权限由后端守卫恢复；车务管理员账号（当前角色 VEHICLE_MANAGER）的订单详情/行程单功能自然恢复。

---

## 后续补充 (#5777 审查扫尾，2026-08-10)

审查发现同族读端点漏切一个：**优惠/附加费清单** `GET /v3/admin/order/{orderId}/discount-surcharge/list`（`DiscountService.listDiscountSurcharge`）此前仍走 `assertOrderAccessible`，车务管理员打开订单详情「优惠」Tab 会复现 581008。本次守卫切到读侧 `assertOrderReadable`，与支付流水/发票等读端点同口径：VEHICLE_MANAGER 可读，房务/组长 581045、非本单定制师 581008 不变。定向用例 DiscountServiceAccessGuardTest 16 绿，已部署 TEST。前端无需配合。
