Files
shanxia2.0/docs/superpowers/plans/2026-06-20-pl-arrange-dibang.md
T
2026-06-21 09:19:07 +08:00

10 KiB
Raw Blame History

安排运输 + 司机免登录页 + 地磅联动 Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: 改造安排运输弹窗(上下布局 + Tab 对照 + 地磅勾选 + 复制能力),实现司机免登录 H5 公共页,并在勾选时按产品行联动地磅计划与出入库单。

Architecture: 后端在 arrange_transport 同事务内生成 driver_access_token、可选调用 pl_dibang_bridge_service;公共 API 挂载 /api/public/pl/transport 且免 JWT/加密;前端公共路由懒加载 Vant,管理端继续 Element Plus。

Tech Stack: FastAPI + SQLAlchemy + Vue 3 + Element Plus + Vant 4(仅 public 路由)+ MySQL 5.7

设计文档: docs/superpowers/specs/2026-06-20-pl-arrange-dibang-design.md


文件清单

操作 路径 职责
Create docs/sql/20260620_pl_arrange_dibang.sql DDL:driver_access_token、pl_transport_db_link
Modify docs/sql/pl_tables.sql 基线同步
Modify docs/sql/shanxia2.0.sql 全量快照同步(driver_access_token、pl_transport_db_link)
Modify backend/app/models/pl_models.py 新字段/关联表 ORM
Create backend/app/services/pl_dibang_bridge_service.py 地磅查建 + 出入库创建
Create backend/app/api/pl/public_transport.py 司机免登录 API
Modify backend/app/api/pl/transport.py arrange 扩展
Modify backend/app/schemas/pl/transport.py 请求/响应 Schema
Modify backend/app/main.py 注册 public 路由、加密白名单
Modify backend/app/core/config.py PUBLIC_WEB_ORIGIN
Create web-admin/src/components/business/pl-plan-view-tabs/index.vue 三 Tab 只读区
Modify web-admin/src/components/business/pl-plan-view-dialog/index.vue 引用 Tabs
Modify web-admin/src/components/business/pl-plan-arrange-dialog/index.vue 上下布局 + 成功态
Create web-admin/src/components/business/db/DbPoundSlipQrcodeDialog.vue 磅单二维码
Create web-admin/src/layouts/PublicMobileShell.vue 移动壳
Create web-admin/src/views/public/pl/transport/index.vue 司机 Vant 页
Create web-admin/src/utils/http/public-pl.ts 无鉴权 HTTP
Create web-admin/src/api/pl/public-transport.ts 公共 API 类型
Modify web-admin/src/api/pl/index.ts arrange 类型扩展
Modify web-admin/src/router/routes/staticRoutes.ts 公共路由
Modify web-admin/vite.config.ts Vant resolver(可选独立 chunk)
Modify web-admin/package.json 添加 vant

Task 1: 数据库 DDL

Files:

  • Create: docs/sql/20260620_pl_arrange_dibang.sql

  • Modify: docs/sql/pl_tables.sql

  • Modify: backend/app/models/pl_models.py

  • Step 1: 编写增量 SQL

ALTER TABLE pl_transport
  ADD COLUMN driver_access_token VARCHAR(64) NULL COMMENT '司机免登录访问令牌' AFTER qr_expire_date;

CREATE UNIQUE INDEX uk_pl_transport_driver_token ON pl_transport(driver_access_token);

CREATE TABLE pl_transport_db_link (
  id VARCHAR(64) NOT NULL PRIMARY KEY,
  transport_id VARCHAR(64) NOT NULL,
  plan_id VARCHAR(64) NOT NULL,
  plan_product_id VARCHAR(64) NOT NULL,
  db_purchase_plan_id VARCHAR(64) NOT NULL,
  db_inventory_id VARCHAR(64) NOT NULL,
  tenant_no VARCHAR(64) NOT NULL DEFAULT 'shanxia2.0',
  order_num INT NULL,
  remark VARCHAR(512) NULL,
  create_by VARCHAR(64) NULL,
  create_dept_id VARCHAR(64) NOT NULL DEFAULT '',
  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  update_by VARCHAR(64) NULL,
  update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  del_flag TINYINT NOT NULL DEFAULT 0
) COMMENT='运输-地磅出入库关联';
  • Step 2: ORM 增加 PlTransport.driver_access_token、PlTransportDbLink

  • Step 3: 开发库执行 DDL(本地环境)


Task 2: 地磅桥接服务

Files:

  • Create: backend/app/services/pl_dibang_bridge_service.py

  • Step 1: 实现 resolve_partner_company(plan, plan_type)

入库 → supplier_name or party_a;出库 → customer_name or party_b。

  • Step 2: 实现 find_monthly_db_plan(db, tenant_no, plan_date, business_type, customer_name, product_id, specification)

  • Step 3: 实现 ensure_db_plan_and_inventory(...) — 每产品行调用,返回 InventoryLinkResult

复用 backend/app/api/db/plans.py 创建计划逻辑与 inventory 批次号生成(抽内部函数,避免 HTTP 自调用)。


Task 3: 扩展 arrange API

Files:

  • Modify: backend/app/schemas/pl/transport.py

  • Modify: backend/app/api/pl/transport.py

  • Step 1: TransportArrange 增加 generate_dibang_plan: bool = False

  • Step 2: 新增 TransportArrangeResult 响应模型(含 driverAccessToken, driverUrl, inventoryRecords)

  • Step 3: arrange 内:创建 transport 时若 driver_access_token 为空则 uuid4()

  • Step 4: 若 generate_dibang_plan 且 plan_type in inbound/outbound,循环 products 调 bridge

  • Step 5: driver_url = f"{settings.PUBLIC_WEB_ORIGIN}/#/public/pl/transport/{token}"


Task 4: 司机公共 API

Files:

  • Create: backend/app/api/pl/public_transport.py

  • Modify: backend/app/main.py

  • Modify: backend/app/core/config.py

  • Step 1: GET /api/public/pl/transport/{token} — 计划摘要 + transport + feedback

  • Step 2: POST /api/public/pl/transport/{token}/feedback — 更新 remark/images

  • Step 3: POST /api/public/pl/transport/{token}/attachments — multipart 上传 MinIO

  • Step 4: 注册 router;API_ENCRYPT_EXCLUDE_PATHS 增加 /api/public/pl/transport


Task 5: PlPlanViewTabs 组件

Files:

  • Create: web-admin/src/components/business/pl-plan-view-tabs/index.vue

  • Modify: web-admin/src/components/business/pl-plan-view-dialog/index.vue

  • Step 1: 从 view-dialog 抽取三 Tab 模板与 script(props: planId 或 plan+products 预加载)

  • Step 2: view-dialog 改为 <PlPlanViewTabs :plan-id="planId" />


Task 6: 安排运输弹窗改造

Files:

  • Modify: web-admin/src/components/business/pl-plan-arrange-dialog/index.vue

  • Modify: web-admin/src/api/pl/index.ts

  • Step 1: 模板拆为 .arrange-top(表单)+ .arrange-bottom(PlPlanViewTabs)

  • Step 2: 增加 generateDibangPlan checkbox(direct 禁用)

  • Step 3: 提交 payload 带 generateDibangPlan;解析扩展响应

  • Step 4: 成功态:司机链接、复制简述、复制磅单二维码(多产品选择)

  • Step 5: 抽取 DbPoundSlipQrcodeDialog,inventory 页改用该组件


Task 7: 司机公共 H5 页

Files:

  • Modify: web-admin/package.json

  • Modify: web-admin/vite.config.ts

  • Create: web-admin/src/utils/http/public-pl.ts

  • Create: web-admin/src/api/pl/public-transport.ts

  • Create: web-admin/src/layouts/PublicMobileShell.vue

  • Create: web-admin/src/views/public/pl/transport/index.vue

  • Modify: web-admin/src/router/routes/staticRoutes.ts

  • Step 1: pnpm add vant @vant/use;vite 配置 VantResolver(仅 public 入口按需)

  • Step 2: public-pl.ts — axios baseURL /api/public/pl/transport,无 token/加密

  • Step 3: 司机页:加载 GET、展示摘要、Vant Uploader + Field、POST feedback

  • Step 4: staticRoutes 注册 /public/pl/transport/:token


Task 8: 验收

  • V1–V9 按下方 checklist 手工走查(设计文档 §七 + 再安排场景)
  • 开发库已执行 docs/sql/20260620_pl_arrange_dibang.sql(或从已同步的 shanxia2.0.sql 建库)
  • 生产环境配置 PUBLIC_WEB_ORIGIN(司机链接域名)
  • pnpm build:typecheck(web-admin,允许关注本模块相关报错)
  • ./scripts/update-graph.sh backend + frontend

验收 Checklist(2026-06-20)

前置

# 检查项 通过
P1 开发库存在 pl_transport.driver_access_token 与唯一索引 uk_pl_transport_driver_token ☐
P2 开发库存在表 pl_transport_db_link ☐
P3 .env / .env.local 配置 PUBLIC_WEB_ORIGIN(如 http://localhost:3006) ☐

功能(设计 §七 + 扩展)

# 场景 操作步骤 预期 通过
V1 入库不勾地磅 入库计划 → 安排运输,不勾选地磅 安排成功;可复制司机链接;db_purchase_plan / db_inbound_outbound 无新增 ☐
V2 出库勾地磅多产品 出库计划 ≥2 个产品 → 勾选地磅 → 安排 每个产品各 1 条出入库单;当月无地磅计划则新建 ☐
V3 复用地磅月计划 同月、同往来单位、同产品+规格已有地磅计划 不重复建 db_purchase_plan,仅新建出入库单 ☐
V4 直销单 直销计划打开安排弹窗 地磅勾选禁用;司机链接仍生成 ☐
V5 司机 H5 手机浏览器打开 /#/public/pl/transport/{token} 免登录查看摘要;可上传回执;刷新仍可见 ☐
V6 复制简述 安排成功后点「复制计划简述」 剪贴板含计划号、车牌、产品、路线、司机链接 ☐
V7 复制磅单二维码 勾地磅且多产品 → 复制二维码 与 /#/db/inventory 磅单二维码弹窗一致 ☐
V8 弹窗三 Tab 安排弹窗下半区切换 Tab 与「查看」弹窗三 Tab 信息一致 ☐
V9 再安排 + 地磅 已安排且曾勾地磅 → 修改计划/安排信息后再次勾选地磅并确认 弹窗提示「将作废…再重建」;待处理出入库单软删后按当前计划重建;已关联磅单时后端 400 明确提示 ☐

回归

# 场景 预期 通过
R1 点击「安排运输」打开弹窗 不再出现「加载运输计划失败」;上半表单 + 下半三 Tab 正常 ☐
R2 自有车辆安排 承运商自动带出「安庆市山峡化工有限公司」 ☐

Spec 覆盖自检

Spec 条目 Task
上下布局 + Tab Task 5, 6
地磅勾选 + 多产品 Task 2, 3, 6
司机免登录链接 Task 3, 4, 7
复制简述/二维码 Task 6
planDate 当月 Task 2
Vant 公共页 Task 7