docs: specify enriched driver plan copy-to-group text format

Capture the confirmed WeChat paste layout (vehicle, compact product lines, load/delivery sections by customer) so implementation can follow a single source of truth.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzilongandCursor committed 2026-10-12 22:10:47 +08:00
1 parent 6a8cd90b98
commit 272dfc0d5e
1 file changed
+106
@@ -0,0 +1,106 @@
# 小程序 · 司机运输计划单「复制发群」文案 enrichment
> **日期**: 2026-10-12
> **状态**: 已确认
> **范围**: 仅 `miniprogram/utils/plDriverPlanCopy.js` 的 `buildDriverPlanCopyText`
> **前置**:
> - `docs/superpowers/specs/2026-09-28-mini-pl-driver-plan-copy-wechat-design.md`(入口与剪贴板模式)
> - `docs/superpowers/specs/2026-10-09-pl-plan-copy-seq-design.md`(序号 ensure)
> **关系**: 本设计**替换**上述前置文档中的「复制文案模板 / 装送货量行格式」;入口交互、序号发号、不含附件等决策仍有效。
## 1. 目标
客户要求群聊文案更易扫读:增加车牌与产品明细(名称、规格型号、包装规格、计划数量、实际数量),装/送货区块改名为「装货信息 / 送货信息」,并按客户分段列出产品。
## 2. 已确认决策
| # | 项 | 决策 |
|---|-----|------|
| D1 | 实现路径 | **方案 1**:只改 `buildDriverPlanCopyText`;不改后端、不改详情 UI、不加单测文件 |
| D2 | 头信息 | 保留 `序号`、`计划编号`;增加 `车辆`(车牌 `licensePlate`);**不再**在头信息输出装货方/送货方#N 列表 |
| D3 | 区块顺序 | 先 `送货信息:`,后 `装货信息:` |
| D4 | 分段 | 按 stop 客户名分段:先写 `{客户名}:`,再列该站产品;装货与送货对称 |
| D5 | 产品行 | 紧凑单行:`产品名称 规格型号 包装规格 计划数量:… 实际数量:…`(字段间两个空格) |
| D6 | 空值 | 统一 `—` |
| D7 | 附件 | 仍不包含 |
| D8 | 数据来源 | 仍用详情 `GET`(列表复制先拉详情);字段已在详情中存在 |
## 3. 非目标
- 不修改 `driver-plan/list.vue` / `detail.vue` 的按钮与弹窗流程(除非工具函数签名被迫变更——本设计不变更签名)
- 不修改后端 API / schema
- 不改详情页展示文案(「计划 / 规格型号」等 UI)
- 不改加油登记、ETC 等其它「复制发群」
- 不新增测试文件
## 4. 复制文案模板(定稿)
```
序号:128
计划编号:YSJH20260409001
车辆:沪A12345
送货信息:
甲客户:
- 工业酒精 95% 吨桶 计划数量:12 吨 实际数量:11.9 吨
乙客户:
- 工业酒精 95% 吨桶 计划数量:8 吨 实际数量:7.9 吨
- 甲醇 99.9% 吨桶 计划数量:2 吨 实际数量:2 吨
装货信息:
某某化工厂:
- 工业酒精 95% 吨桶 计划数量:20 吨 实际数量:19.8 吨
- 甲醇 99.9% 吨桶 计划数量:2 吨 实际数量:2 吨
```
### 4.1 字段映射
| 文案 | 来源 |
|------|------|
| 序号 | `copySeqNo` / `copy_seq_no`(调用方 ensure 后传入) |
| 计划编号 | `planNo` / `plan_no` |
| 车辆 | `licensePlate` / `license_plate` |
| 客户名 | stop.`customerName` / `customer_name` |
| 产品名称 | product.`productName` / `product_name` |
| 规格型号 | product.`model` |
| 包装规格 | product.`packageSpec` / `package_spec` |
| 计划数量 | product.`planQty`,缺省则 `quantity`;附 `unit` |
| 实际数量 | product.`actualQty` / `actual_qty`;附 `unit` |
### 4.2 产品行格式
```
- {产品名称} {规格型号} {包装规格} 计划数量:{数量}[ {单位}] 实际数量:{数量}[ {单位}]
```
- 数量与单位之间一个空格(有单位时);无单位只写数字或 `—`
- 数量为空 → 该侧写 `—`(可带或不带单位:统一为 `—`,不拼单位)
### 4.3 边界
| 情况 | 行为 |
|------|------|
| 无 delivery stop | 输出 `送货信息:` + 下一行 `—` |
| 无 load stop | 输出 `装货信息:` + 下一行 `—` |
| 某站无产品 | 保留 `{客户名}:`,下一行 `- —` |
| 客户名为空 | 写 `—:` |
| 多装货站 | 与送货相同,按详情顺序分段 |
| stop 顺序 | 以详情返回的 `stops` 数组顺序为准(delivery / load 各自过滤后保持相对顺序) |
## 5. 实现结构
| 文件 | 职责 |
|------|------|
| `miniprogram/utils/plDriverPlanCopy.js` | 重写 `buildDriverPlanCopyText`;`copyDriverPlanToClipboard` 不变 |
列表 / 详情继续调用现有 `copyDriverPlanToClipboard`;列表仍:`get` → `ensureCopySeq` → 合并 `copySeqNo` → 复制。
## 6. 验收
1. 一装两送多产品:与 §4 定稿示例结构一致
2. 列表「复制发群」与详情保存后弹窗复制文案一致
3. 缺车牌 / 缺规格 / 未填实际数量 → 对应位置 `—`
4. 无送货或无装货 → 对应区块标题下为 `—`
5. 剪贴板不含附件 URL
## 7. 风险
纯前端字符串拼接;字段缺失只影响展示为 `—`,不影响回执保存。