10 KiB
安排运输 + 司机免登录页 + 地磅联动 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: 增加
generateDibangPlancheckbox(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 |