日期: 2026-09-13
状态: 待实现
方案: 方案 1 — 小程序原生页 + 登录态 API(复用现有司机公开页业务逻辑)
对齐: H5 司机链接「运输记录 / 司机回执」;顶栏对齐小程序「备用金申请」;实现路径对齐「运输计划单」(现场)
司机 / 押运员此前通过管理端「复制司机链接」在微信中打开 H5 免登录页完成查看与回执。现已有微信小程序,需在小程序内提供同等能力:
| # | 项 | 决策 |
|---|---|---|
| D1 | 实现路径 | 原生列表 + 原生回执 + 登录态 API;不复用公开 token 混调;不 web-view |
| D2 | 列表对齐 | H5「运输记录」:日历按日;正文样式一致;顶栏对齐备用金 |
| D3 | 详情对齐 | H5「司机回执」功能/正文一致;顶栏对齐备用金 |
| D4 | 可见性 | 登录用户关联的驾押人员 = 计划当前司机或当前押运;改安排后旧人立刻不可见 |
| D5 | 押运字段 | 安排运输增加「选择押运员」(可选、可模糊检索;车辆已绑定则自动带出) |
| D6 | 押运选项 | 优先该车已绑定押运;可从驾押人员库选押运(filterable + remote) |
| D7 | 账号关联 | 【驾押人员】增加「关联用户账号」(本需求一并做) |
| D8 | 菜单权限 | 仅系统角色「司机」「押运员」(测试库若无则创建;生产已有则复用并绑菜单) |
| D9 | 公开链接 | Web 司机链接 H5 / 公开 API 全部保留;公开「运输记录」仍按单车牌过滤 |
| D10 | 列表标题 | 司机运输计划单(与菜单名一致) |
| D11 | 详情标题 | 司机回执 |
pl_vehicle_personnel 车辆任职单独过滤(不以「挂在车上」为准)/api/public/pl/transport/{token}/...【账号绑定】
驾押人员 pl_personnel.sys_user_id ←→ sys_user
↓
【安排运输】
选车 → 自动带出司机 / 押运(可改、可空)
→ pl_transport.driver_id + escort_id(新增)
→ resource_snapshot.selectedDriverId / selectedEscortId
→ 公开司机链接仍生成 driver_access_token(不变)
【小程序】
登录 JWT
→ 工作台 perms: mini:pl:driverPlan:list
→ 列表 pages/pl/driver-plan/list
GET /api/transport/driver-plan/history?date=YYYY-MM-DD
过滤:tenant + arranged + 日匹配
AND (driver_id OR escort_id) ∈ 当前用户关联的 personnel_id
→ 详情 pages/pl/driver-plan/detail?planId=
GET/POST /api/transport/driver-plan/{planId}/...
(复用公开司机回执同一套 service)
【公开 H5 保留】
/#/public/pl/transport/{token}[/history]
→ /api/public/pl/transport/{token}/...
登录态与公开 API 共用 回执页构建 / 反馈保存 / 附件等 service 逻辑:
公开链路为 token → transport → tenant/plan;登录态为 current_user → personnel → 校验 plan 当前司机/押运命中。
列表过滤与公开 history 不同:公开 history 按 token 解析出的单车牌;登录态按当前用户命中的司机/押运(可多计划、多车牌)。日期 OR 逻辑(取货日或送货日)保持一致。
pl_personnel| 字段 | 类型 | 说明 |
|---|---|---|
sys_user_id |
VARCHAR(64) NULL | 关联系统用户 ID |
sys_user_id 最多绑一条未删除人员(应用层校验)pl_transport / pl_plan(与司机字段对称)| 字段 | 类型 | 说明 |
|---|---|---|
escort_id |
VARCHAR(64) NULL | 当前选中押运员人员 ID |
escort_name |
VARCHAR(100) NULL | 押运员姓名冗余 |
escort_phone |
VARCHAR(32) NULL | 押运员电话冗余 |
resource_snapshot JSON 增加 selectedEscortId(与现有 selectedDriverId 对称)。
设当前用户关联人员 ID 为 P:
transport_status = arranged 且(driver_id = P 或 escort_id = P)且命中所选日日期匹配与公开运输记录一致:
date(pickup_time) = day 或 date(delivery_time) = dayplan_date 作为登录态司机列表日条件(与公开 driver history 对齐)移动端根 (id=1)
└─ 运输管理 (MINI_PL_ROOT) ← 已存在则复用
├─ 加油登记 (MINI_PL_FUEL_REG) ← 不动
├─ 运输计划单 (MINI_PL_TRANSPORT_PLAN) ← 不动(现场人员)
└─ 司机运输计划单 (MINI_PL_DRIVER_PLAN) ← 新建
| 字段 | 值 |
|---|---|
| id | MINI_PL_DRIVER_PLAN |
| menu_name | 司机运输计划单 |
| parent_id | MINI_PL_ROOT |
| menu_type | C |
| path | driver-plan |
| perms | mini:pl:driverPlan:list |
| order_num | 3(在运输计划单之后;若冲突以迁移 SQL 为准) |
sys_role.role_name IN ('司机', '押运员') AND del_flag = 0 匹配(不写死 role id)sys_role_menu 绑定1、MINI_PL_ROOT、MINI_PL_DRIVER_PLANdocs/sql/migrations/2026-09-13-mini-pl-driver-plan-menus.sql(菜单 + 角色补齐 + 授权)pl_personnel.sys_user_id、pl_transport/pl_plan 押运字段miniprogram/config/workbench-menus.js:运输管理下增加菜单项miniprogram/config/api.js:PAGE_PATHS + WORKBENCH_ROUTE_MAP(code:pl-driver-plan)miniprogram/pages.json:分包注册 list / detailel-select,filterable + remote + clearable,未选车时禁用(与司机一致)personnelList 中 role=escort 自动带出(多个取默认或第一个);可改选人员库押运escort_id/name/phone,快照写入 selectedEscortId前缀:/api/transport/driver-plan(挂入现有 pl_router,JWT + 租户隔离)。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /history?date=YYYY-MM-DD |
我的运输记录列表 |
| GET | /{planId} |
司机回执详情 |
| POST | /{planId}/feedback |
对齐公开 POST /public/pl/transport/{token}/feedback |
| POST | /{planId}/driver-feedback |
对齐公开 POST /public/pl/transport/{token}/driver-feedback |
| POST | /{planId}/attachments |
对齐公开附件上传 |
Depends(get_current_user);读写强制当前用户 tenant_nopl_personnel:sys_user_id = current_user.id 且同租户、未删除;无关联则 history 返回空列表,详情 403/404arranged、日期 OR 逻辑同公开 driver history,且 driver_id 或 escort_id 等于关联人员API_ENCRYPT_EXCLUDE_PATHSplanId、车牌、stops、statusLabel 等);小程序用 planId 跳详情,不依赖 URL tokenbackend/app/api/pl/site_plan.py + pl_site_plan_service.py 与 public_transport_site 的关系| 页面 | 路径 | 顶栏标题 |
|---|---|---|
| 列表 | miniprogram/pages/pl/driver-plan/list.vue |
司机运输计划单 |
| 详情 | miniprogram/pages/pl/driver-plan/detail.vue |
司机回执 |
与备用金申请 / 运输计划单相同结构:
class="bx-page"(复用 bx-theme 顶栏样式)topbar + safeAreaStyletopbar-back(←)+ topbar-titlevan-nav-bar 绿顶栏transport/history.vuedetail?planId=...uni.chooseImage + uni.uploadFile(Bearer + folder)正文使用小程序三墙体系(如 #0a9f6d / #059669),不混用 web-admin Fresh Mint #10b981 作为主色。
| 场景 | 行为 |
|---|---|
| 未登录 | 既有登录拦截 |
| 无「司机/押运员」菜单权限 | 工作台不展示入口 |
| 用户未关联驾押人员 | 列表空态「暂无运输记录」;详情拒绝 |
| 当日无命中计划 | 空态「暂无运输记录」 |
| planId 无效 / 跨租户 / 已不是当前司机或押运 | 详情错误空态或提示后回列表 |
| 作废 / 归档写操作 | 业务错误 toast |
| 网络失败 | toast,不静默失败 |
| 风险 | 缓解 |
|---|---|
| 公开与登录态逻辑分叉 | 共用 service |
| 生产角色名不一致 | SQL 按 role_name 匹配,执行前核对 |
历史单无 escort_id |
仅司机可见;补安排后再给押运 |
| 用户未绑人员 | 空态 + 管理端引导关联 |
| 小程序日历与 Vant 月历差异 | 交互对齐验收对照 H5;可复用运输计划单日历组件 |
| 附件加密网关 | 上传路径按约定排除加解密 |
| 用途 | 路径 |
|---|---|
| H5 运输记录 | web-admin/src/views/public/pl/transport/history.vue |
| H5 司机回执 | web-admin/src/views/public/pl/transport/index.vue |
| 公开司机 API | backend/app/api/pl/public_transport.py |
| 现场小程序先例 | miniprogram/pages/pl/transport-plan/*、backend/app/api/pl/site_plan.py |
| 现场设计文档 | docs/superpowers/specs/2026-09-13-mini-pl-transport-plan-site-design.md |
| 顶栏参考 | miniprogram/pages/bx/advance/list.vue |
| 安排运输司机选择 | web-admin/src/components/business/pl-plan-form-dialog/index.vue |
| 驾押人员页 | web-admin/src/views/pl/personnel/index.vue |
| 菜单 SQL 参考 | docs/sql/migrations/2026-09-13-mini-pl-transport-plan-menus.sql |