# -*- 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())}")