- 需求 v1.1 + 2026-09-29 需求方确认的 Q7~Q19 决议(含 BR-07/BR-09/6.7/6.9 矛盾表述修订) - 测试点 159 个、测试用例 164 条(P0 55/P1 81/P2 23/P3 5),需求→测试点→用例三级追溯覆盖率 100% - 质量裁决 PASS(首轮 PASS_WITH_FIX,13 项待确认确认后复裁决升级);评审原始 2 阻断项+9 建议项+3 优化项已全部修复 - 确认单:与 4 个历史需求均为并行关系、0 冲突、0 回写 - 附导出 v1/v2 版本快照、Playwright/Appium 脚本骨架、覆盖率审计脚本与指标、评审修复脚本
79 lines
6.0 KiB
Python
79 lines
6.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""把 2026-09-29 需求方确认结论回写标准化需求文档(含矛盾表述修订)。"""
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
REPO = Path(__file__).resolve().parent.parent
|
||
sys.stdout.reconfigure(encoding="utf-8")
|
||
REQ = REPO / "output" / "normalized_inputs" / "物流公司管理需求" / "requirement.md"
|
||
|
||
text = REQ.read_text(encoding="utf-8")
|
||
orig = text
|
||
|
||
REPLACEMENTS = [
|
||
# 1) BR-07.2 —— 澄清"货源维度"与"运单维度"
|
||
(
|
||
"2. 所选物流公司仅作为**该货源及其关联运单的记录信息**展示与追溯,不参与货源、运单、结算的任何流程判断与计费(见 1.4 设计原则)。",
|
||
"2. 所选物流公司记录于**货源维度**并随货源展示;核算时作为修改核算弹窗的**默认带入值**(弹窗初始无值),核算保存后写入运单表(**运单维度**)。两者均仅作记录展示与追溯,不参与货源、运单、结算的任何流程判断与计费(见 1.4 设计原则,Q8 决议)。",
|
||
),
|
||
# 2) 6.7.3
|
||
(
|
||
"3. 保存货源时写入所选公司信息快照;该信息随货源展示,并作为其关联运单的记录信息。",
|
||
"3. 保存货源时写入所选公司信息快照;该信息随货源展示,并在核算时作为修改核算弹窗的默认带入值(运单侧的记录以核算保存写入运单表为准,见 Q8 决议)。",
|
||
),
|
||
# 3) BR-09.2 —— 修订与 6.6 矛盾的表述
|
||
(
|
||
"2. **运单管理**:显示运单关联货源上记录的物流公司(随货源带入);未关联的显示\"无外协公司\"。",
|
||
"2. **运单管理**:显示**运单表**记录的物流公司(核算保存时写入;货源所选公司由核算弹窗默认带入);未核算或未关联的显示\"无外协公司\",不联表实时取货源当前值(Q8 决议)。",
|
||
),
|
||
# 4) 6.9 表格行
|
||
(
|
||
"| 运单管理(整车运输 → 运输管理 → 运单管理) | 关联货源上记录的物流公司 | 无外协公司 |",
|
||
"| 运单管理(整车运输 → 运输管理 → 运单管理) | 运单表记录的物流公司(核算保存写入;未核算不取货源当前值) | 无外协公司 |",
|
||
),
|
||
# 5) Q7 待确认标记 → 已确认
|
||
(
|
||
"> ⚠️ 待确认 Q7:**批量核算**是否需要支持批量填充物流公司/客户收货地址?当前口径:仅单笔\"修改核算\"弹窗中填写,批量核算逻辑不变。",
|
||
"> ✅ 已确认 Q7(2026-09-29):**批量核算不支持**批量填充物流公司/客户收货地址;批量核算逻辑不变,两个字段仅单笔\"修改核算\"弹窗中填写。",
|
||
),
|
||
]
|
||
|
||
for old, new in REPLACEMENTS:
|
||
cnt = text.count(old)
|
||
if cnt != 1:
|
||
raise SystemExit(f"❌ 命中 {cnt} 次(期望 1):{old[:50]!r}")
|
||
text = text.replace(old, new)
|
||
print(f"✅ 已修订:{old[:32]}...")
|
||
|
||
# 6) 追加 2026-09-29 确认决议块
|
||
ANCHOR = "4. 货源列表、运单管理、打款列表都要显示物流公司 → 已纳入 FR-10 / BR-09 / 6.9。"
|
||
if ANCHOR not in text:
|
||
raise SystemExit("❌ 未找到决议块插入锚点")
|
||
BLOCK = ANCHOR + """
|
||
|
||
**补充确认(2026-09-29,需求方逐项确认,QE Fleet 流水线记录)**:
|
||
|
||
| 编号 | 问题 | 决议 |
|
||
|:---:|:---|:---|
|
||
| Q8 | 运单管理列/打款筛选/导出的"物流公司"取值口径(BR-09/6.9 与 6.6 表述不一致) | **显示一律以运单表为准**。货源所选物流公司为**货源维度**记录;核算时自动带入"修改核算"弹窗(弹窗初始无值,**未核算的运单没有值**),确认核算后写入运单表(**运单维度**)。列表/筛选/导出取运单表快照,未核算或未关联显示"无外协公司",**不联表实时取货源当前值**。BR-09.2 / 6.9 / BR-07.2 / 6.7 已同步修订。 |
|
||
| Q9 | BR-04 删除保护是否覆盖"仅被货源引用、无运单"的公司 | **不覆盖**。仍仅"存在生效中合同"与"被任一运单引用"两条件阻断删除;货源列表按快照展示名称,不受影响。 |
|
||
| Q10 | 合同附件扩展名大小写(.PDF/.Jpg 是否放行) | **大小写不敏感**:.PDF/.Jpg 等同 .pdf/.jpg 放行(白名单按扩展名小写归一后判定)。 |
|
||
| Q11 | 联系方式是否允许座机/国际前缀 | **仅手机号**(`1[3-9]\\d{9}`);座机(0871-…)与国际前缀(+86…)不支持。 |
|
||
| Q12 | 简称码是否仅接受大写字母 | **不做限制**(该字段仅做记录、不参与任何流程):大小写均不阻断,行为需确定、可解释。 |
|
||
| Q13 | 唯一性判重是否对首尾空格 trim | **提交前 trim 后判重**:"甲公司 "与"甲公司"视为重复。 |
|
||
| Q14 | 统一社会信用代码是否校验第 18 位国标校验位 | **仅按 BR-01 正则校验**字符集与长度,不额外校验校验位(校验位错误但格式合法的号码可保存)。 |
|
||
| Q15 | 纯空格/空白字符在必填文本字段的处理 | **trim 后为空视为未填**,按空值阻断(必填字段)。 |
|
||
| Q16 | 简称码空值与"排除自身"校验范围 | 简称码空值**不参与**全平台唯一(多家公司可同时留空);编辑时**名称/统一社会信用代码/简称码/合同编号均排除自身**。 |
|
||
| Q17 | 垫资-货主打款 / 垫资-财务打款两页是否同口径改造 | **本期不改造**(两页保持原样);需回归验证其查询与打款功能不受本次改造影响。 |
|
||
| Q18 | 平台两个"运费核算"菜单的处理范围 | **仅改造 整车运输 → 承运结算 → 运费核算**;"运单认证核算 → 运费核算"不处理。 |
|
||
| Q19 | "客户收货地址"的展示载体 | 以**运单详情只读展示**为验收基线;**不加入运单管理列表列**;导出暂不要求包含该列。 |
|
||
"""
|
||
text = text.replace(ANCHOR, BLOCK)
|
||
print("✅ 已追加 Q8~Q19 补充确认决议块(12 项)")
|
||
|
||
REQ.write_text(text, encoding="utf-8")
|
||
print(f"\n需求文档已更新:{REQ}")
|
||
print(f"行数 {len(orig.splitlines())} -> {len(text.splitlines())}")
|