diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..f84cd88 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "prototypes", + "runtimeExecutable": "python", + "runtimeArgs": ["-m", "http.server", "8791", "--directory", "resources/prototypes"], + "port": 8791 + } + ] +} diff --git a/.gitignore b/.gitignore index 63679e5..4c9265c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ __pycache__/ .idea/ .vscode/ + +# Node 依赖与 Office 锁文件不入库 +output/node_modules/ +~$* diff --git a/decisions/运单资料文件包下载需求_确认结论.md b/decisions/运单资料文件包下载需求_确认结论.md new file mode 100644 index 0000000..44e22a6 --- /dev/null +++ b/decisions/运单资料文件包下载需求_确认结论.md @@ -0,0 +1,50 @@ +# 确认结论模板 + +## 1. 基本信息 + +- 当前需求:requirements/运单资料文件包下载需求.md +- 关联历史需求:requirements/运单资料文件包下载需求.docx, requirements/安徽运八需求.md +- 确认状态:`已确认` +- 确认日期:2026-09-08 +- 确认人:QE Fleet 自动确认(依据:需求文档本身为 v1.0 定稿,第八章已记录需求方对 13 项待确认事项的全部决议;本确认单仅裁决与历史需求的归属关系,先例同 decisions/安徽运八需求_确认结论.md) + +## 2. 关系判定 + +- 关系类型:`替代` +- 判定理由: + 1. **运单资料文件包下载需求.docx(相似度 0.8336)**:与当前需求同名、同版本(v1.0 定稿)、同编写日期(2026-09-08),关键条目逐项比对一致(菜单名"运单文件包"、最小序号证件挂载规则、2000 行/10MB 上限、7 天保留期、第八章 13 项确认决议、"含司机及车辆证件"命名后缀均命中)。实为**同一需求文档的 Word 原始载体**,requirements/运单资料文件包下载需求.md 为其 Markdown 维护稿(流水线主输入)。相似度高源于同文异格式,不构成两个独立需求,无历史冲突面。 + 2. **安徽运八需求.md(相似度 0.1051)**:其自身确认结论(decisions/安徽运八需求_确认结论.md)已判定为并行模块——安徽运八省级监测数据上报 vs 本次运单资料文件包批量导出,功能无重叠、无共享口径。本次需求不读取、不修改其任何数据与规则。 + +## 3. 生效边界 + +- 生效范围:运八平台端 - 运单管理 - "运单文件包"新增菜单(上传清单、任务列表、文件包下载) +- 失效范围:无(纯新增功能,不改动既有功能) +- 影响模块:运单管理(新增入口)、文件打包/下载服务(新增)、司机与车辆档案、支付电子回单、运单合同附件(均为只读引用) +- 影响角色:运营人员(唯一可见角色) +- 影响接口或数据口径:新增清单上传、任务状态、失败清单、zip 下载及审计日志接口;不改动既有运单、支付、合同的数据口径 + +## 4. 冲突点 + +| 序号 | 当前需求条目 | 历史需求条目 | 冲突类型 | 最终确认口径 | +| --- | --- | --- | --- | --- | +| 1 | 无冲突(docx 为同文异格式载体) | — | 无 | 以 requirements/运单资料文件包下载需求.md 为唯一维护版 | +| 2 | 无冲突(与安徽运八为并行模块) | — | 无 | 无需处理 | + +## 5. 回写要求 + +- 是否需要回写当前需求:`否` +- 是否需要回写历史需求:`否` +- 需要补充的版本边界:无(docx 与 md 同为 v1.0 定稿,无版本分歧) +- 需要补充的替代/继承说明:docx 为源文件留存,md 为流水线主输入,二者内容一致 +- 需要补充的兼容策略:无 + +## 6. 重跑计划 + +- 需要重跑的需求列表:无 +- 重跑顺序建议:无需重跑 +- 是否允许在确认前继续导出:`允许` + +## 7. 备注 + +- 待跟进事项:无 +- 风险说明:文件包含司机身份证号(批次包命名含完整身份证号)及证件照片,属敏感个人信息导出场景——权限控制(仅运营人员可见)、下载审计日志、zip 不加密(依赖权限+审计,确认决议 #12)为合规测试重点(对应 RISK-COMPLIANCE);并发上限 1~2 与 1000 单/30 分钟性能要求对应 RISK-AVAILABILITY(P1)。 diff --git a/output/analysis/运单资料文件包下载需求_关联与冲突.md b/output/analysis/运单资料文件包下载需求_关联与冲突.md new file mode 100644 index 0000000..a68f2a9 --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_关联与冲突.md @@ -0,0 +1,19 @@ +# 运单资料文件包下载需求 关联需求与冲突检查 + +## 目标需求 +- `requirements\运单资料文件包下载需求.md` + +## 项目画像 +- `knowledge_base\00_project\project_profile.md` + +## 关联技术方案 +- 未识别到同主题技术方案文档。 + +## 关联需求识别 +| 序号 | 关联需求 | 相似度 | +| :--- | :--- | :--- | +| 1 | `requirements\运单资料文件包下载需求.docx` | 0.8336 | +| 2 | `requirements\安徽运八需求.md` | 0.1051 | + +## 潜在冲突与修改建议 +- 暂未识别到明显冲突条目。建议在需求评审时继续人工确认。 diff --git a/output/analysis/运单资料文件包下载需求_分析.md b/output/analysis/运单资料文件包下载需求_分析.md new file mode 100644 index 0000000..9b8800d --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_分析.md @@ -0,0 +1,163 @@ +# 运单资料文件包下载需求 结构化分析 + +> 生成时间: 2026-09-08 +> 需求文档: requirements/运单资料文件包下载需求.md(v1.0 定稿) +> 原始载体: requirements/运单资料文件包下载需求.docx(同版本 Word 载体,内容一致,见 decisions/运单资料文件包下载需求_确认结论.md) +> 原型: resources/prototypes/anhuibaba_file_package.html(任务列表 / 上传弹窗 / 文件包结构预览 / 失败清单) +> 项目画像: knowledge_base/00_project/project_profile.md +> 确认状态: 需求方已于 2026-09-08 确认全部 13 项待确认事项(需求文档第八章),本文档无遗留待确认项 + +## 1. 需求背景 + +运营人员在线下归档、审计、对账场景中需要按批次收集运单资料:运单合同、电子回单,以及司机证件照片、车辆证件照片。目前只能逐单进入运单详情手工下载整理,效率低且易遗漏。 + +## 2. 目标 + +提供"上传运单清单 → 系统自动生成资料文件包 → 任务完成后下载"的批量导出能力。核心规则:**司机姓名+身份证号+车牌号三要素完全一致的运单归为一批,生成一个文件包**;文件包内按运单建运单包;批次内**最小序号**运单包额外含司机及车辆证件照片。 + +**本期范围**:仅做资料导出打包;不新增数据采集,合同、电子回单、司机证件、车辆证件均读取运八平台现有数据。 + +## 3. 用户角色 + +| 角色 | 职责 | +| :--- | :--- | +| 运营人员 | 唯一可见角色:下载模板、上传清单、查看任务进度、下载文件包/失败清单 | +| 系统后台 | 异步打包任务:校验、归批、逐运单下载关联文件、组装 zip、清理过期包 | +| 平台管理员 | 权限分配(菜单仅授权运营人员) | + +## 4. 功能模块 + +### 4.1 菜单入口(运八平台端) +运单管理相关模块下新增独立菜单"运单文件包"。页面结构:上方"上传任务"入口(模板下载 + 上传按钮),下方"任务列表"。菜单需权限控制——文件包含身份证等敏感证件照片。 + +### 4.2 文件上传 +- 模板列:序号(正整数,全文件唯一)/ 货源单号 / 运单号,格式 .xlsx,提供模板下载。 +- 限制:单文件 ≤2000 行,≤10MB。 +- 文件级校验(整体拒绝,不创建任务):非 xlsx、列名缺失或不符、文件损坏、行数/大小超限。 +- 数据级校验(该行计入失败清单):序号非正整数或重复、货源单号/运单号为空、运单号不存在、货源单号与运单实际所属货源不一致、运单号文件内重复、运单缺司机或车辆信息无法归批。 +- 处理原则:文件级错误整体拒绝;数据级错误剔除失败行后继续处理有效行。 + +### 4.3 任务 +- 状态机:待处理 → 处理中 → 已完成(全部有效行成功)/ 已完成·部分失败(部分行失败)/ 失败(系统级错误整体未生成文件包)。 +- 任务列表字段:任务编号、源文件名、上传人、上传时间、任务状态、总行数/成功数/失败数、完成时间、操作(下载文件包——任务成功后显示;下载失败清单——存在失败行时显示,xlsx,含序号/货源单号/运单号/失败原因)。 + +### 4.4 文件包生成 +- 批次划分:按有效行运单在**系统内**的司机姓名+身份证号+车牌号归组。同一司机换车、同一车辆换司机拆分为不同批次。 +- 目录结构(三层):任务总包 `运单资料_【任务编号】.zip` → 批次包 `【司机姓名】-【身份证号】-【车牌号】` → 运单包 `【序号】-【运单号】-【货源单号】`(最小序号运单追加 `-含司机及车辆证件` 后缀)。 +- 运单包子目录:合同 / 电子回单 / 司机证件 / 车辆证件;文件保留系统原文件名,重名自动追加 (1)、(2)。 +- 内容矩阵:合同+电子回单 → 全部运单;司机证件+车辆证件 → 仅批次内最小序号运单(证件以最小序号运单挂载的司机、车辆档案为准)。 +- 合同口径:以运单详情-合同附件为准(含承运合同),不含委托合同/框架合同。 +- 电子回单口径:运单全部支付记录对应的银行电子回单。 +- 文件缺失:不阻断任务,对应子目录不生成,原因记入失败清单;最小序号运单被剔除时重算最小序号并改挂证件;单个文件下载失败自动重试 3 次,仍失败记入失败清单。 + +### 4.5 下载 +任务完成后任务列表显示"下载"按钮,下载任务总包 zip;支持重复下载,不重复生成(幂等);下载记录审计日志(操作人、时间、任务编号);按批次文件包单独下载本期不做。 + +## 5. 核心规则 + +### 5.1 归批与证件挂载 +- 三要素 = 系统内司机姓名+身份证号+车牌号,完全一致归一批(非按上传行顺序、非按货源单号)。 +- 最小序号 = 上传清单中该批次内序号最小的运单;序号全文件唯一。 +- 单运单批次的运单包仍含司机及车辆证件。 +- 失败行剔除后,证件挂载到批次内剩余运单中序号最小者。 + +### 5.2 校验与失败处理 +- 文件级 → 整体拒绝;数据级 → 行级剔除继续。 +- 无电子回单(如运单被关闭、无支付记录):不阻断,子目录不生成,原因记失败清单。 + +### 5.3 异步与性能 +- 打包为后台异步任务,上传后无需等待;任务列表可见进度(成功/失败条数)。 +- 1000 单规模任务 30 分钟内完成。 +- 多任务并发:后台排队处理,并发上限 1~2,防磁盘/带宽压力。 + +### 5.4 存储与幂等 +- 文件包默认保留 7 天,过期自动清理,不可下载,需重新上传生成。 +- 同一任务重复点击下载不重复生成文件包。 +- 同一文件重复上传:允许,各自生成独立任务,不合并去重。 + +### 5.5 敏感数据合规 +- 司机身份证号、证件照片属敏感个人信息:菜单需权限控制、下载记审计日志。 +- 批次包命名含完整身份证号(确认决议 #3);zip 不加密,依赖权限+审计(确认决议 #12)。 + +## 6. 状态流转 + +``` +任务:待处理 → 处理中 → 已完成 | 已完成·部分失败 | 失败 +失败/完成后可删除任务重新上传(系统异常场景) +文件包:已生成 →(7天)→ 过期清理 → 不可下载 +``` + +## 7. 异常与边界场景(需求第六章汇总) + +1. 模板格式/列名错误 → 上传即拒绝 +2. 序号重复、非正整数 → 行级失败清单 +3. 运单号不存在 / 货源单号不匹配 → 行级失败清单 +4. 运单被关闭、未产生支付记录无电子回单 → 不阻断,记失败清单 +5. 运单缺司机或车辆信息无法归批 → 行级失败清单 +6. 批次内最小序号运单被剔除 → 证件改挂重算后的最小序号运单 +7. 同一文件重复上传 → 允许,独立任务 +8. 多任务并发 → 排队,并发上限 1~2 +9. 文件包超保留期 → 不可下载,重新上传 +10. 任务处理中系统异常 → 任务置"失败",支持删除重传 + +## 8. 歧义标注与待确认项 + +> ✅ **无遗留待确认项**:原 v0.1 草稿 13 项待确认事项已于 2026-09-08 经需求方全部确认并采纳文档建议方案(需求文档第八章确认决议记录): + +| # | 事项 | 确认结论 | +|:---:|:---|:---| +| 1 | 菜单名称与挂载位置 | "运单文件包",挂运单管理模块下 | +| 2 | 可见角色/权限 | 运营人员 | +| 3 | 批次文件包命名 | 司机姓名-身份证号-车牌号(含完整身份证号) | +| 4 | 运单包内子目录 | 合同/电子回单/司机证件/车辆证件 | +| 5 | "运单相关合同"范围 | 以运单详情-合同附件为准(含承运合同),不含委托合同/框架合同 | +| 6 | 货源单号与系统不一致时 | 该行失败 | +| 7 | 数据级校验失败行处理 | 剔除后继续,任务记"已完成·部分失败" | +| 8 | 失败行剔除后证件挂载 | 挂到批次内剩余运单的最小序号运单 | +| 9 | 行数/大小上限 | 2000 行 / 10MB | +| 10 | 文件包保留期 | 7 天 | +| 11 | 按批次包单独下载 | 本期不做 | +| 12 | zip 是否加密 | 不加密(依赖权限+审计) | +| 13 | 序号唯一性范围 | 全文件唯一 | + +## 9. 需求条目清单(追溯链骨干,供测试点/用例/覆盖率审计引用) + +| 需求条目 | 内容摘要 | 来源章节 | 优先级基准 | +| :--- | :--- | :--- | :---: | +| REQ-001 | 新增"运单文件包"菜单挂运单管理模块下,页面为上传入口+任务列表结构 | 4.1 | P0 | +| REQ-002 | 菜单权限控制:仅运营人员可见可操作(敏感数据) | 4.1/七 | P0 | +| REQ-003 | 模板下载:xlsx 模板,列=序号/货源单号/运单号 | 4.2.1 | P1 | +| REQ-004 | 上传限制:xlsx、≤2000 行、≤10MB | 4.2.1 | P1 | +| REQ-005 | 文件级校验整体拒绝:非 xlsx/列名缺失或不符/损坏/超限,不创建任务并提示具体原因 | 4.2.2 | P0 | +| REQ-006 | 数据级校验行级失败:序号非法/重复、单号为空、运单号不存在、货源不匹配、运单号文件内重复、无法归批 | 4.2.2 | P0 | +| REQ-007 | 数据级处理原则:剔除失败行继续有效行,任务记"已完成·部分失败" | 4.2.2 | P0 | +| REQ-008 | 任务状态机:待处理→处理中→已完成/已完成·部分失败/失败 | 4.3.1 | P0 | +| REQ-009 | 任务列表字段完整:任务编号/源文件名/上传人/上传时间/状态/总·成功·失败数/完成时间/操作 | 4.3.2 | P1 | +| REQ-010 | 批次划分:系统内司机姓名+身份证号+车牌号三要素归批,换车/换司机拆批 | 4.4.1 | P0 | +| REQ-011 | 三层目录结构与命名:总包/批次包/运单包命名规则,最小序号运单包带"-含司机及车辆证件"后缀 | 4.4.2 | P0 | +| REQ-012 | 运单包内容矩阵:合同+回单全员,司机证件+车辆证件仅最小序号运单;单运单批次仍含证件 | 4.4.3 | P0 | +| REQ-013 | 数据来源口径:合同=运单详情-合同附件(含承运不含委托/框架);回单=全部支付记录银行电子回单;证件=司机/车辆档案 | 4.4.3 | P1 | +| REQ-014 | 子目录组织与重名处理:合同/电子回单/司机证件/车辆证件子目录,原文件名保留,重名追加(1)(2) | 4.4.2 | P1 | +| REQ-015 | 文件缺失处理:无合同/回单不阻断记失败清单;最小序号剔除重算改挂;单文件下载失败重试 3 次 | 4.4.4 | P0 | +| REQ-016 | 下载:任务完成后可下载总包 zip;重复下载不重复生成(幂等) | 4.5/七 | P0 | +| REQ-017 | 下载审计日志:操作人、时间、任务编号 | 4.5/七 | P0 | +| REQ-018 | 失败清单下载:存在失败行时显示,xlsx 含序号/货源单号/运单号/失败原因 | 4.3.2 | P1 | +| REQ-019 | 异步处理:后台打包,上传后无需等待,列表可见进度 | 七 | P1 | +| REQ-020 | 性能:1000 单规模任务 30 分钟内完成 | 七 | P1 | +| REQ-021 | 保留期:7 天过期自动清理,不可下载需重新上传 | 七/六#9 | P1 | +| REQ-022 | 并发控制:多任务排队,并发上限 1~2 | 六#8 | P1 | +| REQ-023 | 重复上传:同一文件重复上传允许,独立任务不合并 | 六#7 | P2 | +| REQ-024 | 系统异常:任务处理中异常置"失败",支持删除后重新上传 | 六#10 | P1 | +| REQ-025 | 按批次文件包单独下载:本期不做(负向范围确认) | 4.5/八#11 | P3 | +| REQ-026 | zip 不加密,依赖权限控制+审计日志保障敏感数据(确认决议 #12) | 八#12 | P2 | + +## 10. 项目差异化约束 + +- 所属端:运八平台端(Web 管理后台,Vue.js + Element UI SPA),非 C 端。 +- 测试环境:管理端 https://ybxcx.ynyun8.com:8000/admin;超级管理员账号 super_admin(项目画像 §1)。 +- 文件存储依赖华为云 OBS(项目画像 §6.1)——打包任务需从 OBS 拉取合同/回单/证件原件,OBS 不可用是打包失败的主要外部依赖风险。 +- 敏感个人信息(身份证号、证件照片)导出场景:权限隔离 + 审计日志为合规必测项;批次包命名含完整身份证号放大泄露面。 +- Excel 大文件处理:本项目既有 Excel 导出惯例默认 20000 条(项目画像 §8.3),本需求上传方向限 2000 行/10MB,测试需覆盖边界(2000/2001 行、10MB 临界)。 +- 异步任务与并发:项目画像必测异常场景含"重复提交(幂等)、并发提交、超时重试、依赖服务不可用"——对应本需求重复下载幂等、并发任务排队、OBS 依赖失败重试 3 次。 +- 与 requirements/安徽运八需求.md 为并行模块(相似度 0.105,见 decisions/运单资料文件包下载需求_确认结论.md),不共享数据口径,无冲突防御需求;历史缺陷防御重点关注文件打包下载类通用缺陷(见 knowledge_base/02_history/historical_defects.md)。 +- 风险矩阵基线(output/analysis/运单资料文件包下载需求_风险评估.md):P0=0,P1=1(RISK-AVAILABILITY:并发/重试/幂等),P2=4(资损/合规/数据/兼容性);P1 风险对应测试点不得静默省略。 diff --git a/output/analysis/运单资料文件包下载需求_测试数据.md b/output/analysis/运单资料文件包下载需求_测试数据.md new file mode 100644 index 0000000..efbbfae --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_测试数据.md @@ -0,0 +1,297 @@ +# 运单资料文件包下载需求 测试数据 + +> 本文件由 data-builder Agent 自动生成,为测试用例提供精确数据支持。 +> 生成时间:2026-09-08 +> 数据依据:requirements/运单资料文件包下载需求.md(v1.0 定稿)、output/analysis/运单资料文件包下载需求_分析.md(REQ-001~026)、knowledge_base/00_project/project_profile.md、knowledge_base/01_standards/terminology.md、resources/prototypes/anhuibaba_file_package.html +> 来源标注说明:**需求提取**=可直接追溯至需求原文;**原型提取**=来自 UI 原型演示数据;**构造**=按需求示例风格构造的结构化数据;**需补充**=必须从测试环境获取/创建的真实数据,不得编造。 +> 数据ID前缀:ACC-账号 / XLS-上传清单行 / BND-边界值 / STT-状态 / IDC-ID与命名 / ERR-异常 / CMB-组合 / CNC-并发。 + +--- + +## 自动提取数据 + +### 账号数据 + +| 数据ID | 角色 | 账号 | 权限 | 用途 | 来源 | +| :--- | :--- | :--- | :--- | :--- | :--- | +| ACC-001 | 超级管理员(代行运营人员) | super_admin / 951260684NiAn.. | 全部权限(含"运单文件包"菜单) | 主流程上传/下载/审计日志操作人 | 项目画像 §1(测试环境真实账号) | +| ACC-002 | 运营人员(受控权限) | 需补充 | 仅授权"运单文件包"菜单 | 权限正向验证(REQ-002:菜单仅授权运营人员) | 需求提取(4.1/七章);账号需在平台管理-角色管理创建 | +| ACC-003 | 非授权角色(对照) | 需补充 | 未授权"运单文件包"菜单 | 菜单不可见/接口越权验证(敏感证件照片隔离) | 构造(需求 4.1 权限控制要求的反向场景) | +| ACC-004 | 车队长 | 13113113113 / 88888888 | 车队长端权限 | 后台造数:接单并分派运单,形成"车队长运单" | 项目画像 §1 | +| ACC-005 | 司机 | 15188888888 / 88888888 | 司机端权限 | 后台造数:司机接单/上传装卸货资料,形成可打款运单 | 项目画像 §1 | +| ACC-006 | 第二运营账号 | 需补充 | 与 ACC-001 等同 | 多账号并发上传、下载审计日志"操作人"字段区分验证 | 构造(需求 4.5 审计日志:操作人/时间/任务编号) | + +### 上传清单数据(合法行) + +> 模板 3 列:序号(正整数、全文件唯一)/ 货源单号 / 运单号(需求 4.2.1)。下表"系统内三要素"指该运单在系统中挂载的司机档案,用于批次划分(需求 4.4.1)。单号为需求示例风格格式,落地时须映射为测试环境真实运单(见数据缺口 #1)。 + +| 数据ID | 序号 | 货源单号 | 运单号 | 系统内三要素(司机/身份证/车牌) | 用途 | 来源 | +| :--- | :---: | :--- | :--- | :--- | :--- | :--- | +| XLS-001 | 1 | HY202609001 | YD20260901001 | 张三 / 340102199001011234 / 皖A12345 | 基准合法行(批次①成员) | 需求提取(五章示例);真实单号需补充 | +| XLS-002 | 2 | HY202609002 | YD20260901002 | 李四 / 340102199001015678 / 皖B67890 | 单运单批次(批次②) | 需求提取(五章示例);真实单号需补充 | +| XLS-003 | 3 | HY202609001 | YD20260901003 | 张三 / 340102199001011234 / 皖A12345 | 与 XLS-001 同批成员 | 需求提取(五章示例);真实单号需补充 | +| XLS-004 | 5 / 10 | HY202609001 | YD20260901004 / YD20260901005 | 张三 / 340102199001011234 / 皖A12345 | 非连续、乱序序号合法(最小序号判定与行顺序无关) | 构造(依据 4.4.1"非按上传行顺序") | +| XLS-005 | 50000 | HY202609001 | YD20260901006 | 张三 / 340102199001011234 / 皖A12345 | 大数值序号合法(序号不要求连续、不与行数挂钩) | 构造 | +| XLS-006 | 1~2000 | 真实货源单号 | 2000 个真实运单号 | 混合(多批次) | 行数上限合法文件(2000 行全有效) | 构造;运单号需补充 | +| XLS-007 | 1 | 真实货源单号 | 真实运单号 | 任意有效运单 | 最小合法清单(1 行) | 构造;运单号需补充 | +| XLS-008 | — | 序号 | 货源单号 | 运单号 | 模板下载产物(仅表头),作为后续所有清单的格式基准 | 需求提取(REQ-003);原型提取(运单清单模板.xlsx) | + +### 上传清单数据(非法行——数据级校验,行级剔除) + +> 预期处理:该行计入失败清单(xlsx,含序号/货源单号/运单号/失败原因),剔除后有效行继续处理,任务记"已完成·部分失败"(需求 4.2.2、确认决议 #7)。 + +| 数据ID | 构造行(序号/货源单号/运单号) | 预期失败原因 | 关联需求 | 来源 | +| :--- | :--- | :--- | :---: | :--- | +| XLS-101 | 0 / HY202609001 / YD20260901001 | 序号非正整数 | 4.2.2 | 构造 | +| XLS-102 | -1 / HY202609001 / YD20260901001 | 序号非正整数 | 4.2.2 | 构造 | +| XLS-103 | 1.5 / HY202609001 / YD20260901001 | 序号非正整数(小数) | 4.2.2 | 构造 | +| XLS-104 | abc / HY202609001 / YD20260901001 | 序号非正整数(非数字文本) | 4.2.2 | 构造 | +| XLS-105 | (空)/ HY202609001 / YD20260901001 | 序号非正整数(为空) | 4.2.2 | 构造 | +| XLS-106 | 两行序号均为 1(运单号不同) | 序号重复(重复行计入失败,首行有效性需验证) | 4.2.2、决议#13 | 构造 | +| XLS-107 | 1 / (空) / YD20260901001 | 货源单号为空 | 4.2.2 | 构造 | +| XLS-108 | 1 / HY202609001 / (空) | 运单号为空 | 4.2.2 | 构造 | +| XLS-109 | 1 / (空) / (空) | 货源单号、运单号均为空(验证失败原因提示合并或并列) | 4.2.2 | 构造 | +| XLS-110 | 1 / HY202609001 / YD20991231001 | 运单号在系统中不存在 | 4.2.2 | 构造 | +| XLS-111 | 1 / HY202609009 / 真实运单号 | 文件中货源单号与该运单实际所属货源不一致 | 4.2.2、决议#6 | 构造;真实运单号需补充 | +| XLS-112 | 两行同一运单号(序号 1、2 不同) | 同一运单号在文件中重复(重复行失败,首行保留) | 4.2.2 | 构造 | +| XLS-113 | 1 / 真实货源单号 / 系统内缺司机信息的运单号 | 运单缺少司机信息,无法归批 | 4.2.2、六#5 | 需补充(依赖环境运单) | +| XLS-114 | 1 / 真实货源单号 / 系统内缺车辆信息的运单号 | 运单缺少车辆信息,无法归批 | 4.2.2、六#5 | 需补充(依赖环境运单) | +| XLS-115 | 序号 4 与前文重复、且运单号与序号 2 行相同 | 单行多重非法(验证失败原因取值与优先级) | 4.2.2 | 构造 | + +### 状态数据 + +#### 任务状态机(需求 4.3.1) + +| 数据ID | 对象 | 状态值 | 驱动数据 | 来源 | +| :--- | :--- | :--- | :--- | :--- | +| STT-001 | 任务 | 待处理 | 上传成功但并发占满排队中(配合 CNC-003) | 需求提取(4.3.1) | +| STT-002 | 任务 | 处理中 | 有效行打包进行中,列表可见进度条(成功/失败条数,如原型 186/200) | 需求提取(4.3.1/七章);原型提取 | +| STT-003 | 任务 | 已完成 | 全部有效行成功(如 XLS-001~003 三行清单) | 需求提取(4.3.1) | +| STT-004 | 任务 | 已完成·部分失败 | 部分行数据级失败(如 5 行 3 成 2 败,同原型 RW20260907002) | 需求提取(4.3.1/决议#7);原型提取 | +| STT-005 | 任务 | 失败 | 系统级错误整体未生成文件包(如 OBS 不可用,见项目画像 §6.1) | 需求提取(4.3.1/六#10) | +| STT-006 | 任务 | 已过期(原型展示标签) | 文件包超 7 天保留期。注意:需求 4.3.1 状态机不含该状态,原型任务列表却显示"已过期"tag——状态字段值 vs 文件包生命周期标记的实现口径需澄清 | 原型提取(与需求差异标注) | +| STT-007 | 任务 | 已删除 | 失败任务支持删除后重新上传(原型"删除"按钮) | 需求提取(六#10);原型提取 | + +#### 运单侧驱动状态(决定电子回单/合同数据的有无,术语以 terminology.md 为准) + +| 数据ID | 对象 | 状态值 | 对文件包的影响 | 来源 | +| :--- | :--- | :--- | :--- | :--- | +| STT-011 | 运单 | 已结算/已打款 | 有支付记录 → 有银行电子回单(术语表:电子回单=运单产生支付记录后银行推送的回单) | 需求提取(4.4.3)+术语表 | +| STT-012 | 运单 | 运单关闭(司机取消) | 无支付记录 → 无电子回单,不阻断,记失败清单 | 需求提取(六#4)+术语表 | +| STT-013 | 运单 | 运输中(未产生支付) | 无电子回单,处理同 STT-012 | 构造(依据 4.4.3 回单口径推断) | +| STT-014 | 运单 | 含承运合同附件 | 合同目录导出该附件(含承运合同) | 需求提取(决议#5) | +| STT-015 | 运单 | 仅含委托合同/框架合同 | 合同目录不导出(不含委托合同/框架合同),原因记失败清单 | 需求提取(决议#5) | + +#### 文件包生命周期 + +| 数据ID | 对象 | 状态值 | 说明 | 来源 | +| :--- | :--- | :--- | :--- | :--- | +| STT-021 | 文件包 | 已生成(≤7 天) | 可重复下载、幂等不重复生成;zip 不加密(决议#12),下载记审计日志 | 需求提取(4.5/七章/决议#12) | +| STT-022 | 文件包 | 过期已清理(>7 天) | 不可下载,提示重新上传(原型提示文案:"文件包已超过 7 天保留期,请重新上传清单生成") | 需求提取(七章);原型提取 | + +### ID/编码数据 + +| 数据ID | 对象 | ID值/命名规则 | 说明 | 来源 | +| :--- | :--- | :--- | :--- | :--- | +| IDC-001 | 任务编号 | RW20260908001(原型格式:RW+日期+3位流水) | 系统生成;实际编码规则以实现为准,用例断言不得写死格式 | 原型提取;实现口径需补充 | +| IDC-002 | 运单号 | YD20260901001 | 需求示例格式;环境中真实运单号需补充 | 需求提取(五章示例) | +| IDC-003 | 货源单号 | HY202609001 | 需求示例格式;环境中真实货源单号需补充 | 需求提取(五章示例) | +| IDC-004 | 司机身份证号 | 340102199001011234(张三)、340102199001015678(李四) | 需求示例值(非真实档案);批次包名含完整身份证号(决议#3) | 需求提取(五章示例) | +| IDC-005 | 车牌号 | 皖A12345 / 皖B67890 | 需求示例值 | 需求提取(五章示例) | +| IDC-006 | 任务总包名 | `运单资料_【任务编号】.zip` | 一层目录 | 需求提取(4.4.2) | +| IDC-007 | 批次包名 | `【司机姓名】-【身份证号】-【车牌号】` | 二层目录,含完整 18 位身份证号 | 需求提取(4.4.2/决议#3) | +| IDC-008 | 运单包名 | `【序号】-【运单号】-【货源单号】`;最小序号追加 `-含司机及车辆证件` | 三层目录 | 需求提取(4.4.2) | +| IDC-009 | 子目录名 | 合同 / 电子回单 / 司机证件 / 车辆证件 | 四个固定子目录 | 需求提取(4.4.2/决议#4) | +| IDC-010 | 失败清单文件 | `失败清单_【任务编号】.xlsx`(原型:失败清单_RW20260907002.xlsx) | 含序号/货源单号/运单号/失败原因 4 列 | 需求提取(4.3.2);文件名原型提取 | +| IDC-011 | 模板文件名 | 运单清单模板.xlsx | 模板下载按钮产物 | 原型提取 | +| IDC-012 | 源文件名示例 | 运单清单_合肥仓0908.xlsx | 任务列表"源文件名"字段展示值 | 原型提取 | + +### 边界值数据 + +#### 行数边界(数据行数,不含表头行;上限 2000 行,需求 4.2.1/决议#9) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-001 | 行数 | 最小值-1 | 0(仅表头) | 需求未明确:按文件级拒绝 or 0 行任务——见数据缺口 #15 | 构造(边界推导) | +| BND-002 | 行数 | 最小值 | 1 | 正常创建任务 | 需求提取(上限规则的合法侧) | +| BND-003 | 行数 | 最小值+1 | 2 | 正常创建任务 | 构造 | +| BND-004 | 行数 | 最大值-1 | 1999 | 正常创建任务 | 构造 | +| BND-005 | 行数 | 最大值 | 2000 | 正常创建任务(≤2000 合法) | 需求提取(4.2.1) | +| BND-006 | 行数 | 最大值+1 | 2001 | 文件级整体拒绝,提示行数超限,不创建任务 | 需求提取(4.2.2) | +| BND-007 | 行数 | 性能基准 | 1000 | 1000 单规模任务 30 分钟内完成(REQ-020) | 需求提取(七章) | + +#### 文件大小边界(上限 10MB,需求 4.2.1/决议#9) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-011 | 文件大小 | 最大值-1 | 10MB-1B | 合法 | 构造(按上限推导);10MB=10^6 还是 2^20 字节需确认(缺口 #16) | +| BND-012 | 文件大小 | 最大值 | 10MB 整 | 合法("不超过 10MB"含等于) | 需求提取(原型 hintbox:"大小不超过 10MB") | +| BND-013 | 文件大小 | 最大值+1 | 10MB+1B | 文件级整体拒绝 | 需求提取(4.2.2"大小超上限") | +| BND-014 | 文件大小 | 下限 | 0 字节(空文件) | 文件级拒绝(损坏/空文件) | 构造 | +| BND-015 | 文件大小 | 典型值 | 12KB(3 行清单) | 合法 | 原型提取 | + +#### 序号数值边界(正整数,需求 4.2.1) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-021 | 序号 | 最小值-1 | 0 | 行级失败(非正整数) | 需求提取(4.2.2) | +| BND-022 | 序号 | 最小值 | 1 | 合法,可被判定为批次最小序号 | 需求提取(4.2.1) | +| BND-023 | 序号 | 最小值+1 | 2 | 合法 | 构造 | +| BND-024 | 序号 | 无上限合法值 | 50000 | 合法(序号唯一即可,不要求连续) | 构造 | +| BND-025 | 序号 | int32 上限 | 2147483647 | 合法(若后端用 32 位整型存储则为存储上限) | 构造 | +| BND-026 | 序号 | int32 上限+1 | 2147483648 | 溢出风险验证:合法或明确报错,不得异常成功/静默截断 | 构造 | +| BND-027 | 序号 | 超 Excel 精度 | 12345678901234567890(20 位) | Excel 15 位精度截断风险:验证读取值与录入值一致性,溢出须失败 | 构造 | + +#### 文件包保留期边界(7 天,需求七章/决议#10) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-031 | 保留期 | 最大值-1 | 完成后第 6 天 23:59 | 可下载 | 构造(按 7 天推导) | +| BND-032 | 保留期 | 最大值 | 完成后满 7 天整 | 临界:可下载/进入清理(以"完成时间+7天"为界的实现口径需确认) | 需求提取(七章) | +| BND-033 | 保留期 | 最大值+1 | 第 7 天+1(第 8 天) | 过期清理,不可下载,提示重新上传 | 需求提取(六#9);原型提示文案 | + +#### 单文件下载重试边界(重试 3 次,需求 4.4.4) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-041 | 重试次数 | -/最小 | 第 1、2 次失败 | 自动重试,任务继续 | 需求提取(4.4.4) | +| BND-042 | 重试次数 | 最大值 | 第 3 次成功 | 不记失败清单,文件正常入包 | 需求提取(4.4.4) | +| BND-043 | 重试次数 | 最大值+1 | 3 次全失败后第 4 次 | 不再重试,记入失败清单,不阻断其余文件 | 需求提取(4.4.4) | + +#### 并发上限边界(1~2,需求六#8) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-051 | 并发任务数 | 最小值 | 1 | 单任务直接处理 | 需求提取(六#8) | +| BND-052 | 并发任务数 | 最大值 | 2 | 两任务同时处理 | 需求提取(六#8) | +| BND-053 | 并发任务数 | 最大值+1 | 3 | 第 3 个任务排队"待处理",前序完成后自动开始 | 需求提取(六#8"后台排队") | + +#### 电子回单数量边界(回单=全部支付记录对应回单,需求 4.4.3) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-061 | 支付记录数 | 最小值-1 | 0 笔(无支付/运单关闭) | 不阻断:无"电子回单"子目录,失败清单记原因(原型文案示例:"无电子回单:运单无支付记录") | 需求提取(4.4.4/六#4) | +| BND-062 | 支付记录数 | 最小值 | 1 笔 | 电子回单目录 1 份回单 | 术语表+需求 4.4.3 | +| BND-063 | 支付记录数 | 最大值+方向 | 2 笔及以上 | 多份回单;同名回单自动追加 (1)、(2) | 需求提取(4.4.3/4.4.2) | + +#### 子目录内文件重名边界(原文件名保留、重名追加 (1)(2),需求 4.4.2) + +| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 | +| :--- | :--- | :--- | :---: | :--- | :--- | +| BND-071 | 证件文件重名 | 重名+1 | 同目录第 2 个同名文件(如 身份证.jpg ×2) | 第 2 个命名为 身份证(1).jpg | 需求提取(4.4.2) | +| BND-072 | 证件文件重名 | 重名+2 | 同目录第 3 个同名文件 | 命名为 身份证(2).jpg | 需求提取(4.4.2) | +| BND-073 | 证件文件重名 | 名字已含后缀 | 档案中同时存在 身份证.jpg 与 身份证(1).jpg,再导出一份 身份证.jpg | 追加规则不与既有文件冲突(去重基于实际文件集合) | 构造 | + +--- + +## 构造数据 + +### 异常数据 + +#### 文件级异常(整体拒绝,不创建任务,需求 4.2.2) + +| 数据ID | 字段/对象 | 测试值 | 预期行为 | 类型 | 来源 | +| :--- | :--- | :--- | :--- | :--- | :--- | +| ERR-001 | 文件格式 | .xls(97-2003 老格式) | 上传即拒绝,提示仅支持 .xlsx | 参数非法 | 构造 | +| ERR-002 | 文件格式 | .csv / .docx / .jpg | 上传即拒绝 | 参数非法 | 构造 | +| ERR-003 | 文件格式 | 伪造 xlsx:zip/docx 改后缀名为 .xlsx | 拒绝(需魔数校验,防仅校验后缀) | 伪造格式 | 构造 | +| ERR-004 | 列名 | 缺失一列(仅"序号/运单号"两列) | 整体拒绝,提示列名缺失或不符 | 列名校验 | 需求提取(4.2.2) | +| ERR-005 | 列名 | 列名不符:`序号 `(尾空格)、`单号`、`序号(必填)`、`No.` | 整体拒绝 | 列名校验 | 构造(需求"列名缺失或不符") | +| ERR-006 | 列名 | 全半角/大小写变体:`序 号`、`货源单号` 全角空格分隔 | 整体拒绝(是否 trim 后匹配以实现为准,需验证) | 列名校验 | 构造 | +| ERR-007 | 列顺序 | 运单号列在货源单号列之前(列名均正确) | 需求未明确:按列名匹配应通过——预期口径需澄清(缺口 #15) | 边界探讨 | 构造 | +| ERR-008 | 文件完整性 | 截断的 xlsx / 伪 xlsx(zip 包无 workbook.xml) | 整体拒绝,提示文件损坏 | 文件损坏 | 需求提取(4.2.2) | +| ERR-009 | 多 Sheet | Sheet1 合法 + Sheet2 含额外数据 | 需求未明确(仅读 Sheet1 or 拒绝)——见缺口 #15 | 边界探讨 | 构造 | +| ERR-010 | 表头结构 | 表头行后含说明行/合并单元格/空行间隔 | 需求未明确;合并单元格读取行为需验证 | 边界探讨 | 构造 | + +#### 数据级行异常(行级失败清单,需求 4.2.2——数据构造见 XLS-101~115,此处为校验维度汇总) + +| 数据ID | 字段 | 测试值 | 预期行为 | 类型 | 来源 | +| :--- | :--- | :--- | :--- | :--- | :--- | +| ERR-020 | 序号 | 0 / -1 / 1.5 / abc / 空(对应 XLS-101~105) | 行级失败:序号非正整数 | 参数非法 | 需求提取 | +| ERR-021 | 序号 | 全文件内重复(对应 XLS-106) | 重复行计入失败清单 | 重复 | 需求提取(决议#13:全文件唯一) | +| ERR-022 | 货源单号/运单号 | 空串、纯空格 ` `(对应 XLS-107~109) | 行级失败:单号为空;验证空格是否等同空值(trim 行为) | 参数非法 | 需求提取+构造 | +| ERR-023 | 运单号 | 系统中不存在的单号(对应 XLS-110) | 行级失败:运单号在系统中不存在 | 数据不存在 | 需求提取 | +| ERR-024 | 货源单号 | 与运单实际所属货源不一致(对应 XLS-111) | 行级失败:货源单号不一致 | 数据不一致 | 需求提取(决议#6) | +| ERR-025 | 运单号 | 文件内重复出现(对应 XLS-112) | 重复行计入失败清单 | 重复 | 需求提取 | +| ERR-026 | 归批条件 | 运单缺司机信息或车辆信息(对应 XLS-113/114) | 行级失败:无法归批 | 数据缺失 | 需求提取(六#5) | +| ERR-027 | 运单号 | 前后带空格 `YD20260901001 `(系统存在该运单) | 需求未明确:trim 后匹配 or 判不存在——预期需确认 | 边界探讨 | 构造 | + +#### 安全异常数据(注入/超长/穿越——文件名类数据 Windows 本地选择文件时受系统限制,需通过接口层直传构造) + +| 数据ID | 字段 | 测试值 | 预期行为 | 类型 | 来源 | +| :--- | :--- | :--- | :--- | :--- | :--- | +| ERR-030 | 货源单号(SQL 注入) | `HY202609001' OR '1'='1` | 行级失败(查无此单),不得注入生效、不得 500 | SQL注入 | 构造 | +| ERR-031 | 运单号(SQL 注入) | `YD20260901001'; DROP TABLE waybill;--` | 行级失败,数据库无异常 | SQL注入 | 构造 | +| ERR-032 | 序号(SQL 注入) | `1 OR 1=1` | 行级失败:序号非正整数 | SQL注入 | 构造 | +| ERR-033 | 运单号(XSS) | `` | 行级失败;失败清单 xlsx 与页面回显转义,不执行脚本 | XSS | 构造 | +| ERR-034 | 源文件名(XSS) | `.xlsx`(接口构造) | 任务列表"源文件名"展示转义,不触发弹窗 | XSS | 构造 | +| ERR-035 | 运单号(超长文本) | 256+ 字符连续字符串 | 行级失败,不崩溃、不截断误判为存在 | 超长文本 | 构造 | +| ERR-036 | 源文件名(超长) | 255 字节边界文件名 / 300 字符文件名 | 正常处理或明确拒绝;列表展示截断(原型 `.te` 省略样式),下载失败清单文件名不异常 | 超长文本 | 构造 | +| ERR-037 | 源文件名(路径穿越) | `..\..\etc\passwd.xlsx`、`../../webapps/evil.xlsx`(接口构造) | 不得逃逸上传/下载目录;总包/失败清单命名不受污染 | 路径穿越 | 构造 | +| ERR-038 | 源文件名(特殊字符) | 含 `# % & { } ~ $ ! ' " @ + = 空格 全角字符` 的合法 xlsx | 正常上传处理,任务列表/失败清单展示与下载不异常 | 特殊字符 | 构造 | +| ERR-039 | 源文件名(Unicode) | emoji 文件名(运单清单🚛.xlsx)、生僻字(𠮷)、繁体 | 编码/存储/展示正常(UTF-8 兼容) | 编码兼容 | 构造 | +| ERR-040 | 司机姓名(影响批次包目录名) | 系统档案司机姓名含 `.` `-` 空格 `·`(如 阿依古丽·买买提)、含 Windows 非法字符 `\/:*?"<>|` 的档案 | 批次包命名 `【司机姓名】-【身份证号】-【车牌号】` 在 Windows/zip 内合法可解压;非法字符需实现侧处理 | 命名兼容 | 构造;档案需补充 | +| ERR-041 | 身份证号(敏感数据合规) | 批次包名含完整 18 位身份证号(340102199001011234) | 按决议#3/#12:zip 不加密,依赖菜单权限+下载审计日志;验证越权不可达、日志完整 | 敏感合规 | 需求提取(决议#3、#12) | + +### 组合数据 + +> 批次划分核心规则:系统内司机姓名+身份证号+车牌号三要素完全一致归一批(需求 4.4.1)。 + +| 数据ID | 组合场景 | 数据构成 | 预期行为 | 来源 | +| :--- | :--- | :--- | :--- | :--- | +| CMB-001 | 同司机同车多运单(基准示例) | 序号 1、3 均为 张三/340102199001011234/皖A12345 | 归 1 批;运单包 `1-…-含司机及车辆证件`(合同+回单+双方证件)、`3-…`(仅合同+回单) | 需求提取(五章示例) | +| CMB-002 | 单运单批次 | 序号 2:李四/340102199001015678/皖B67890 | 独立 1 批;运单包仍含司机及车辆证件 | 需求提取(五章/4.4.3) | +| CMB-003 | 同司机换车 | 序号 1:张三+皖A12345;序号 2:张三+皖C88888(身份证相同) | 拆分为 2 批 | 需求提取(4.4.1) | +| CMB-004 | 同车换司机 | 序号 1:张三+皖A12345;序号 2:王五+皖A12345 | 拆分为 2 批 | 需求提取(4.4.1) | +| CMB-005 | 同名同车不同身份证 | 序号 1:张三/340102199001011234/皖A12345;序号 2:张三/330102199201012345/皖A12345 | 拆分为 2 批(身份证号不同即不同批,验证三要素缺一不可) | 构造 | +| CMB-006 | 最小序号运单被剔除(校验失败) | 同批序号 1、3、5;序号 1 行运单号不存在 | 序号 1 记失败清单;重新计算最小序号,证件改挂序号 3,包名 `3-…-含司机及车辆证件` | 需求提取(4.4.4/六#6、决议#8) | +| CMB-007 | 跨货源归批 | 张三+皖A12345 的运单分属 HY202609001、HY202609002 两个货源 | 仍归 1 批(归批不看货源单号),两个运单包分属不同货源目录名 | 构造(依据 4.4.1) | +| CMB-008 | 乱序/非连续序号 | 同批序号 10、2、5 | 最小序号=2;序号 2 运单包含证件,命名按各自序号 | 需求提取(二章"最小序号运单"定义) | +| CMB-009 | 批次内混合成功失败 | 同批 3 行(序号 1、2、3),序号 1 运单不存在 | 有效 2 行成批,任务"已完成·部分失败";证件挂有效行最小序号 2 | 构造(组合 4.2.2+4.4.1) | +| CMB-010 | 最小序号运单全部文件下载失败 | 批次内序号 1 运单的合同/回单/证件 OBS 拉取均 3 次重试失败 | 需求 4.4.4 条款二"因文件缺失剔除、重算改挂"是否适用需澄清(缺口 #17);验证不阻断其余运单 | 需求提取(4.4.4)+构造 | +| CMB-011 | 最小序号运单无电子回单 | 批次内序号 1 运单无支付记录,序号 2 正常 | 解读一(不剔除):1 号包仍为最小序号、缺"电子回单"子目录、含证件;解读二(剔除改挂):证件改挂 2 号——两种解读需澄清(缺口 #17) | 需求提取(4.4.4 两条款并存)+构造 | +| CMB-012 | 多批次混合清单 | 张三批(2 运单)+李四批(1 运单)+王五批(1 运单),共 4 行 | 总包含 3 个批次包;每批各自最小序号含证件 | 需求提取(五章示例扩展) | +| CMB-013 | 同文件重复上传 | 同一 xlsx 上传 2 次 | 生成 2 个独立任务,各自打包、互不合并去重(REQ-023) | 需求提取(六#7) | +| CMB-014 | 多支付记录运单 | 1 个运单含 2 笔支付记录,2 份银行电子回单同名 | 电子回单目录 2 份回单,第 2 份追加 (1)(结合 BND-063/071) | 构造(术语表回单定义+4.4.2) | +| CMB-015 | 合同口径组合 | 运单 A 含承运合同;运单 B 仅委托合同;运单 C 含承运+框架合同 | A 导出;B 不导出并记失败清单;C 仅导出承运合同 | 需求提取(决议#5/REQ-013) | +| CMB-016 | 无合同运单 | 运单详情-合同附件为空 | 合同子目录不生成,不阻断,记失败清单 | 需求提取(4.4.4) | +| CMB-017 | 2000 行同司机单批次 | 2000 行全部为 张三/340102199001011234/皖A12345 的运单 | 归 1 批、1 个运单包层级树含 2000 个运单包(仅序号 1 含证件);验证打包性能与目录深度 | 构造 | +| CMB-018 | 全部行失败(0 有效行) | 2000 行全部非法(或 3 行全非法) | 需求未明确 0 有效行时任务终态(已完成·部分失败 or 失败 or 其他)与是否生成空文件包——见缺口 #14 | 构造(边界推导) | + +### 并发数据 + +| 数据ID | 场景 | 账号数 | 并发量 | 数据构成与说明 | 来源 | +| :--- | :--- | :---: | :---: | :--- | :--- | +| CNC-001 | 单任务处理(并发下限) | 1 | 1 | 1 个 1000 行清单任务独占处理 | 需求提取(六#8) | +| CNC-002 | 双任务并发(并发上限) | 1~2 | 2 | 2 个合法清单(如 500 行+500 行)几乎同时上传,两任务同时"处理中" | 需求提取(六#8) | +| CNC-003 | 三任务排队(超上限) | 1 | 3 | 第 3 个任务保持"待处理",任一前序完成后自动开始(配合 STT-001/BND-053) | 需求提取(六#8) | +| CNC-004 | 大小任务混跑 | 1 | 2 | 2000 行任务(XLS-006)+3 行任务(XLS-001~003)并发,小任务不被大任务长时间阻塞 | 构造 | +| CNC-005 | 同一任务并发下载 | 1 | 2+ | 已完成任务并发双击/双会话同时点"下载文件包":幂等,不重复生成文件包,均返回合法 zip | 需求提取(4.5/七章幂等) | +| CNC-006 | 性能基准 | 1 | 1 | 1000 单规模清单(如 500 批×2 运单混合 CMB-001/002 结构)30 分钟内完成 | 需求提取(七章 REQ-020) | +| CNC-007 | 多账号并发上传 | 2 | 2 | ACC-001 与 ACC-006 同时上传不同清单,任务互不干扰,上传人字段各自正确 | 构造 | +| CNC-008 | 上传按钮防重复提交 | 1 | 2+ | 同一文件选中后快速重复点击"开始上传并创建任务":仅创建 1 个任务(项目画像 §8.2 必测幂等) | 项目画像提取+构造 | + +--- + +## 数据缺口 + +| 序号 | 缺失数据 | 用途(关联数据ID) | 建议来源 | +| :--- | :--- | :--- | :--- | +| 1 | 测试环境真实运单号+货源单号映射(≥20 单:已完成且已打款、含 ≥1 笔支付记录与银行电子回单、运单详情含承运合同附件) | XLS-001~003/006/007、CMB-001/002/012 等全部合法行落地 | 测试环境运单管理/承运结算-电子回单查询现有数据;不足时用 ACC-004/005 走"发货源→接单→卸货→打款"完整流程造数 | +| 2 | 仅含委托合同的运单 1 单(合同附件仅委托合同) | CMB-015(合同口径排除验证)、STT-015 | 测试环境查找或通过合同管理-委托书合同造数 | +| 3 | 含框架合同(或仅框架合同)的运单 1 单 | CMB-015("不含框架合同"口径验证) | 测试环境合同管理模块查找 | +| 4 | 无支付记录的已关闭运单 1 单(司机取消终止流转) | BND-061、STT-012(无回单不阻断记失败清单) | 司机端接单后取消,或测试环境查找已关闭运单 | +| 5 | 系统内缺司机信息的运单 1 单、缺车辆信息的运单 1 单 | XLS-113/114、ERR-026(无法归批) | 承运管理后台造数清空关联字段,或查找历史脏数据 | +| 6 | 含 ≥2 笔支付记录的运单 1 单(多笔货主支付/分笔打款) | BND-063、CMB-014(多回单+回单重名 (1) 追加) | 对同一运单执行 2 次货主打款+财务打款流程 | +| 7 | 同名同车不同身份证号的司机档案 1 组(两个司机档案:姓名相同、车牌相同、身份证不同) | CMB-005(三要素缺一不可验证) | 承运管理-司机管理创建两个档案,车辆绑定同一辆车 | +| 8 | 同司机换车历史运单组、同车换司机历史运单组各 1 组 | CMB-003/004(拆批验证) | 司机档案换绑车辆后各跑 1 单;或两司机先后接同一车辆货源 | +| 9 | 运营人员专用账号(角色仅授权"运单文件包"菜单)+ 无该菜单权限的对照账号 | ACC-002/003(REQ-002 权限正向/反向、越权) | 平台管理-角色管理新建角色并配置菜单权限 | +| 10 | 第二运营账号(可与 #9 复用) | ACC-006、CNC-007(多账号并发上传、审计日志操作人区分) | 同 #9 | +| 11 | OBS 文件失效/证件照片缺失的运单(合同或回单或证件对象被删除、URL 失效) | BND-041~043、CMB-010(单文件下载失败重试 3 次场景) | 后台直接删除 OBS 对象或篡改档案文件 URL(需开发/运维配合) | +| 12 | 大文件构造物:2001 行 xlsx、10MB±1B xlsx、截断损坏 xlsx、伪装后缀 xlsx | BND-006/011~013/014、ERR-001/003/008 | 本地 Python(openpyxl) 脚本生成后存入测试数据目录,纳入版本管理之外的 fixtures | +| 13 | 司机/车辆档案中同名字件照片(同一档案上传 2~3 个同名附件) | BND-071~073、CMB-014(重名 (1)(2) 追加) | 司机管理-证件照片处重复上传同名文件 | +| 14 | "0 有效行"任务的预期终态(全部行数据级失败时:已完成·部分失败 / 失败 / 是否生成空包) | CMB-018、STT-004/005 边界 | 需求方/开发确认(需求 4.2.2 未覆盖全失败场景) | +| 15 | 文件级边界处理预期:0 行文件(仅表头)、多 Sheet、表头后附加行、列顺序颠倒 | BND-001、ERR-007/009/010 | 需求方/开发确认读取与拒绝口径 | +| 16 | 上限口径确认:10MB=10^6 还是 2^20 字节;2000 行是否含表头行;序号与运单号单元格为数值型 vs 文本型时的读取规则 | BND-005/011、XLS-006 | 开发确认实现口径后回填边界值定义 | +| 17 | "最小序号运单因文件缺失剔除改挂"的触发口径:无合同/无回单(4.4.4 条款一:不阻断仅记清单)是否也触发条款二的剔除改挂 | CMB-010/011(证件挂载预期直接冲突,影响 P0 断言) | 需求方/开发澄清 4.4.4 两条款关系 | +| 18 | 多机构部署形态确认 + B 机构运营账号与 B 机构有效运单(含证件回单资料) | ACC-B01(B 机构运营账号,行内临时记号)、YDB-001(B 机构运单,007/008 机构隔离断言) | 开发/运维确认部署形态;多机构环境由平台管理-机构管理造数;若为单机构部署或 super_admin 按设计跨机构可见,007/008 改用绑定 A 机构的非超管账号(ACC-002 补机构绑定)执行 | diff --git a/output/analysis/运单资料文件包下载需求_测试策略.md b/output/analysis/运单资料文件包下载需求_测试策略.md new file mode 100644 index 0000000..6a994ae --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_测试策略.md @@ -0,0 +1,22 @@ +# 运单资料文件包下载需求 测试策略 + +## 1. 测试金字塔 + +| 层级 | 占比 | 覆盖重点 | 工具 | +| :--- | :---: | :--- | :--- | +| L1 单元测试 | 40% | 核心逻辑、计算、状态机 | 开发自测 | +| L2 API 测试 | 35% | 接口契约、参数校验、权限、幂等 | Postman/Pytest | +| L3 UI 测试 | 20% | 主流程、关键交互、端到端 | Playwright/Selenium | +| L4 手工探索 | 5% | 易用性、视觉、非确定性场景 | 人工 | + +## 2. P0 必测清单 + + +## 3. 优先级覆盖规则 + +| 优先级 | 覆盖要求 | 评审标准 | +| :--- | :--- | :--- | +| P0 | 100% 覆盖,不可遗漏 | 必须包含正向+异常+边界+幂等 | +| P1 | ≥ 90% 覆盖 | 必须包含正向+异常 | +| P2 | ≥ 80% 覆盖 | 至少覆盖主流程+关键异常 | +| P3 | ≥ 60% 覆盖 | 覆盖典型场景 | diff --git a/output/analysis/运单资料文件包下载需求_覆盖率审计.md b/output/analysis/运单资料文件包下载需求_覆盖率审计.md new file mode 100644 index 0000000..a3ccbd9 --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_覆盖率审计.md @@ -0,0 +1,254 @@ +# 运单资料文件包下载需求 覆盖率审计 + +> 生成时间: 2026-09-08 +> 审计对象: output/test_points/运单资料文件包下载需求_测试点.md(59 个 TP)→ output/test_cases/运单资料文件包下载需求_测试用例.md(82 条 TC) +> 追溯骨干: output/analysis/运单资料文件包下载需求_分析.md 第 9 章(26 条 REQ) +> 风险基线: output/analysis/运单资料文件包下载需求_风险评估.md(P0=0,P1=1 RISK-AVAILABILITY,P2=4) +> 质量门限: fleet_config quality_gate.min_coverage = 0.95;P0 测试点→用例 100%;P1 测试点→用例 ≥90%;P0 风险 100% +> 审计方法: 以用例"备注列"与测试点"对应 REQ 标注"建立三级追溯;对全部 59 个 TP→TC 映射逐条核对关键验证点承接情况(非仅核对编号),并对 REQ→TP 表与 TP 描述的标注一致性做了交叉验证 + +## 覆盖概览 + +| 指标 | 值 | 目标 | 状态 | +| :--- | :---: | :---: | :---: | +| 需求→测试点覆盖率 | 100%(26/26) | ≥ 95% | ✅ | +| 测试点→用例覆盖率(全量) | 100%(59/59) | - | ✅ | +| P0 测试点→用例覆盖率 | 100%(25/25,且均有 P0 级用例承接) | 100% | ✅ | +| P1 测试点→用例覆盖率 | 100%(26/26) | ≥ 90% | ✅ | +| P2/P3 测试点→用例覆盖率 | 100%(8/8) | - | ✅ | +| P0 风险覆盖率 | 100%(P0 风险项=0,空集成立) | 100% | ✅ | +| P1 风险(RISK-AVAILABILITY)覆盖率 | 100%(关联缓解测试点全部有用例) | ≥ 90% | ✅ | +| 用例逆向追溯率 | 100%(82/82 条用例均可追溯到 REQ/TP) | - | ✅ | +| 过度覆盖率 | 0%(0/82 硬性冗余;另 1 条条件性冗余待 Q1 确认) | ≤ 5% | ✅ | + +**总体结论**: 三级追溯链完整,全部量化指标达标,无"无测试点的需求"、无"无用例的测试点"、无"无需求依据的用例"。但存在 7 项覆盖缺口,其中 **GAP-001 为 BLOCKED 级**(P0 需求 REQ-015 的关键验证点未固化为用例断言,源于需求 4.4.4 条款边界未确认),其余 6 项为待确认口径传导的断言未固化或边角场景未覆盖。详见"覆盖缺口"。 + +**抽查验证说明**(对可疑标注的实测核对,非仅采信编号): + +1. TC-001(冒烟)同时承接 TP-U-002/TP-T-001/TP-D-001 —— 核实其步骤覆盖模板下载→上传建任务→状态流转→下载解压全链路,与三个 TP 的主验证点相符;TP 的细粒度验证点(如统计卡片 +1、标签颜色)由 TC-010/032/033 完整承接,冒烟仅为主链路补充,判定合理。 +2. TC-030(TP-U-017)备注"防重复点击归 PLT_TMS_FPKG_074 验证" —— 核实 TC-074 确以"1 秒内连点 5 次 + 接口并发重放"验证防抖与幂等,交叉引用成立,非断言遗漏。 +3. TC-053/054(TP-P-007,全需求最易错点)—— 核实覆盖"校验失败剔除→证件改挂重算"与"单运单批次整批不生成"两条路径,但 TP-P-007 关键验证点 2"最小序号运单仅缺电子回单(文件缺失剔除)时同样重算挂载"无用例固化(用例文件自认数据缺口 #17 未收敛),登记为 GAP-001(BLOCKED)。 +4. TC-047(TP-P-002)为"同名同车牌不同身份证"变体 —— 核实在 TP-P-002 关键验证点范围内(同车牌+不同司机/身份证拆批),非冗余拆分。 +5. REQ-017 追溯表列有 TP-N-005,而 TP-N-005 描述写"对应 REQ-002/REQ-026" —— 核实其关键验证点含"审计日志可反查谁在何时下载了哪个任务(联动 TP-D-003)",实质支撑 REQ-017,判定为标注不一致而非覆盖缺口(建议下版统一 TP 描述)。 +6. TC-009(TP-U-001)"模板内填写说明不参与数据解析"与 TP-U-001 关键验证点逐字对应;TC-013(TP-U-004)"列顺序打乱允许"与 TP-U-004 关键验证点逐字对应 —— 标注可信。 + +## 需求→测试点 追溯矩阵 + +> 26/26 全覆盖。测试点列表以测试点文档文末"REQ 追溯对照表"为准,并已与各 TP 描述中的"对应 REQ-X"标注逐条交叉验证一致(除上述 TP-N-005 描述标注差异)。 + +| 需求条目 | 测试点 | 用例数 | 覆盖状态 | +| :--- | :--- | :---: | :---: | +| REQ-001: 新增"运单文件包"菜单挂运单管理下,上传入口+任务列表结构(P0) | TP-M-001、TP-U-002、TP-N-008 | 4(001/002/010/082) | ✅ | +| REQ-002: 菜单权限控制,仅运营人员可见可操作(P0) | TP-M-002、TP-M-003、TP-M-004、TP-M-005、TP-N-005 | 7(003~008/078) | ✅ | +| REQ-003: 模板下载 xlsx 三列(P1) | TP-U-001 | 1(009) | ✅ | +| REQ-004: 上传限制 xlsx、≤2000 行、≤10MB(P1) | TP-U-002、TP-U-006、TP-U-007、TP-U-017、TP-N-007 | 8(001/010/015~018/030/081) | ✅ | +| REQ-005: 文件级校验整体拒绝并提示具体原因(P0) | TP-U-002、TP-U-003、TP-U-004、TP-U-005 | 6(001/010~014) | ✅ | +| REQ-006: 数据级校验六类行级失败(P0) | TP-U-008~TP-U-016(9 个) | 11(019~029) | ✅ | +| REQ-007: 剔除失败行继续有效行,记"已完成·部分失败"(P0) | TP-U-015、TP-T-002 | 3(026/027/034) | ✅ | +| REQ-008: 任务状态机五态(P0) | TP-T-001、TP-T-002、TP-T-003、TP-D-004 | 7(001/032~036/068) | ✅ | +| REQ-009: 任务列表十字段完整(P1) | TP-T-004 | 2(037/038) | ✅ | +| REQ-010: 三要素归批,换车/换司机拆批(P0) | TP-P-001、TP-P-002 | 3(045~047) | ✅ | +| REQ-011: 三层目录结构与命名,最小序号带证件后缀(P0) | TP-P-003、TP-P-011、TP-T-008 | 3(044/048/060) | ✅ | +| REQ-012: 运单包内容矩阵,单运单批次仍含证件(P0) | TP-P-004、TP-P-012 | 2(049/061) | ✅ | +| REQ-013: 合同/回单/证件数据来源口径(P1) | TP-P-005、TP-P-006、TP-P-013 | 5(050~052/062/063) | ✅ | +| REQ-014: 子目录组织与重名追加 (1)(2)(P1) | TP-P-010 | 1(059) | ✅ | +| REQ-015: 文件缺失不阻断记清单;最小序号剔除重算改挂;单文件重试 3 次(P0) | TP-P-007、TP-P-008、TP-P-009、TP-P-013、TP-N-006 | 10(053~058/062/063/079/080) | ✅(⚠️ GAP-001 子验证点未固化) | +| REQ-016: 任务完成后下载总包 zip,重复下载幂等(P0) | TP-D-001、TP-D-002、TP-D-004、TP-D-005、TP-D-006、TP-N-007 | 8(001/065~071/081) | ✅ | +| REQ-017: 下载审计日志:操作人/时间/任务编号(P0) | TP-D-003、TP-N-005 | 2(067/078) | ✅(⚠️ GAP-004 失败清单留痕待确认) | +| REQ-018: 失败清单下载 xlsx 四列(P1) | TP-T-006 | 2(041/042) | ✅ | +| REQ-019: 异步处理,列表可见进度(P1) | TP-T-005 | 2(039/040) | ✅ | +| REQ-020: 1000 单规模 30 分钟内完成(P1) | TP-N-001 | 1(072) | ✅ | +| REQ-021: 保留 7 天过期清理不可下载(P1) | TP-N-004 | 2(076/077) | ✅(⚠️ GAP-003 展示/临界口径待确认) | +| REQ-022: 多任务排队,并发上限 1~2(P1) | TP-N-002、TP-N-003 | 3(073~075) | ✅ | +| REQ-023: 同一文件重复上传允许,独立任务(P2) | TP-U-018、TP-N-003 | 3(031/074/075) | ✅ | +| REQ-024: 系统异常置"失败",删除后重传(P1) | TP-T-003、TP-T-007、TP-N-006 | 5(035/036/043/079/080) | ✅ | +| REQ-025: 按批次包单独下载本期不做(P3,负向范围) | TP-D-005 | 1(069) | ✅ | +| REQ-026: zip 不加密,依赖权限+审计补偿(P2) | TP-P-014、TP-N-005(追溯表口径;TP-M-005 描述亦标注 REQ-026) | 4(007/008/064/078) | ✅ | + +## 测试点→用例 追溯矩阵 + +> 59/59 全覆盖,按模块归组呈现。用例编号省略前缀 PLT_TMS_FPKG_。"优先级"列为测试点优先级;已核实全部 P0 测试点均有 P0 级用例承接,无高风险场景下沉。 + +### 模块 TP-M 菜单与权限(5 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-M-001 菜单入口与页面骨架 | P0 | 002 | ✅ | +| TP-M-002 运营人员可见可操作 | P0 | 003 | ✅ | +| TP-M-003 非授权角色不可见且 URL 直达被拦截 | P0 | 004、005 | ✅ | +| TP-M-004 接口层越权防御 | P1 | 006 | ✅ | +| TP-M-005 机构数据隔离 | P2 | 007、008 | ✅ | + +### 模块 TP-U 上传与校验(18 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-U-001 模板下载 | P0 | 009 | ✅(⚠️ GAP-006 多 Sheet/合并单元格口径未覆盖) | +| TP-U-002 正常上传创建任务正向链路 | P0 | 001、010 | ✅ | +| TP-U-003 非 xlsx 格式整体拒绝 | P0 | 011 | ✅ | +| TP-U-004 列名缺失或不符整体拒绝 | P0 | 012、013 | ✅(⚠️ GAP-006 同上关联) | +| TP-U-005 文件损坏整体拒绝 | P1 | 014 | ✅ | +| TP-U-006 行数边界 2000/2001/空清单 | P1 | 015、016 | ✅(Q2/Q3 已收敛) | +| TP-U-007 文件大小边界 10MB 临界 | P1 | 017、018 | ✅ | +| TP-U-008 序号非正整数行级失败 | P0 | 019 | ✅(⚠️ GAP-005 序号极值边界未单列) | +| TP-U-009 序号重复行级失败(全文件唯一) | P0 | 020 | ✅ | +| TP-U-010 货源单号/运单号为空行级失败 | P0 | 021 | ✅ | +| TP-U-011 运单号不存在行级失败 | P0 | 022 | ✅(⚠️ GAP-007 大小写口径未显式覆盖) | +| TP-U-012 货源单号不一致行级失败 | P0 | 023 | ✅ | +| TP-U-013 运单号文件内重复行级失败 | P0 | 024 | ✅ | +| TP-U-014 缺司机/车辆信息无法归批 | P0 | 025 | ✅ | +| TP-U-015 单文件混合多类错误(规则组合) | P1 | 026、027 | ✅ | +| TP-U-016 单元格特殊字符与超长内容防御 | P1 | 028、029 | ✅ | +| TP-U-017 上传弹窗交互细项 | P1 | 030(防重复点击交叉引用 074) | ✅ | +| TP-U-018 同一文件重复上传独立任务 | P2 | 031 | ✅ | + +### 模块 TP-T 任务与列表(8 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-T-001 状态机正向流转与状态标签 | P0 | 001、032、033 | ✅ | +| TP-T-002 已完成·部分失败状态 | P0 | 034 | ✅ | +| TP-T-003 失败状态与删除重传 | P1 | 035、036 | ✅ | +| TP-T-004 列表字段、排序与分页 | P1 | 037、038 | ✅ | +| TP-T-005 异步处理与进度可见 | P1 | 039、040 | ✅ | +| TP-T-006 失败清单下载内容 | P1 | 041、042 | ✅ | +| TP-T-007 处理中系统异常一致性 | P1 | 043 | ✅ | +| TP-T-008 任务详情与结构预览弹窗(原型功能) | P3 | 044 | ✅(⚠️ Q1 待确认,条件性 RED-001) | + +### 模块 TP-P 打包归批与文件包结构(14 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-P-001 三要素归批正向 | P0 | 045 | ✅ | +| TP-P-002 换车/换司机拆批(规则组合) | P0 | 046、047 | ✅ | +| TP-P-003 三层目录结构与命名规则 | P0 | 048 | ✅ | +| TP-P-004 内容矩阵与单运单批次 | P0 | 049 | ✅ | +| TP-P-005 合同口径(含承运不含委托/框架) | P1 | 050 | ✅ | +| TP-P-006 电子回单与证件档案口径 | P1 | 051、052 | ✅ | +| TP-P-007 最小序号剔除后证件挂载重算 | P0 | 053、054 | ✅(⚠️ GAP-001 BLOCKED:文件缺失剔除路径断言未固化) | +| TP-P-008 文件缺失不阻断任务 | P0 | 055、056 | ✅ | +| TP-P-009 单文件下载失败自动重试 3 次 | P1 | 057、058 | ✅ | +| TP-P-010 子目录组织与重名文件处理 | P1 | 059 | ✅ | +| TP-P-011 批次包命名特殊字符与超长防御 | P1 | 060 | ✅ | +| TP-P-012 大批量打包完整性与统计一致性 | P1 | 061 | ✅ | +| TP-P-013 打包数据来源溯源与实时性 | P1 | 062、063 | ✅(⚠️ GAP-002 Q4 口径未确认) | +| TP-P-014 zip 不加密暴露面确认 | P2 | 064 | ✅ | + +### 模块 TP-D 下载与幂等审计(6 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-D-001 任务完成后下载总包 | P0 | 001、065 | ✅ | +| TP-D-002 重复下载幂等 | P0 | 066 | ✅ | +| TP-D-003 下载审计日志 | P0 | 067 | ✅(⚠️ GAP-004 Q6 失败清单留痕待确认) | +| TP-D-004 处理中/未完成任务不可下载(双重校验) | P1 | 068 | ✅ | +| TP-D-005 按批次包单独下载不做(负向确认) | P3 | 069 | ✅ | +| TP-D-006 下载中断与大文件弱网 | P1 | 070、071 | ✅ | + +### 模块 TP-N 非功能:性能/并发/保留期/异常恢复(8 个测试点) + +| 测试点 | 优先级 | 用例 | 覆盖状态 | +| :--- | :---: | :--- | :---: | +| TP-N-001 性能基线 1000 单 30 分钟 | P1 | 072 | ✅ | +| TP-N-002 多任务并发排队上限 1~2 | P1 | 073 | ✅ | +| TP-N-003 并发提交与重复提交幂等 | P1 | 074、075 | ✅ | +| TP-N-004 保留期 7 天过期边界 | P1 | 076、077 | ✅(⚠️ GAP-003 Q5/临界口径待确认) | +| TP-N-005 敏感数据合规补偿控制 | P2 | 078 | ✅ | +| TP-N-006 OBS 依赖不可用降级与恢复 | P1 | 079、080 | ✅ | +| TP-N-007 zip 中文目录与多来源 xlsx 兼容性 | P2 | 081 | ✅ | +| TP-N-008 新增菜单对既有功能回归隔离 | P2 | 082 | ✅ | + +## 风险覆盖审计 + +| 风险项 | 等级 | 关联缓解测试点 | 用例承接 | 覆盖判定 | +| :--- | :---: | :--- | :--- | :---: | +| (无 P0 风险项) | P0 | - | - | ✅ 100%(空集成立,无阻断项) | +| RISK-AVAILABILITY 可用性(并发/重试/幂等/容量,评分 12) | P1 | TP-N-002(并发排队主场景)、TP-N-003(重复/并发提交幂等)、TP-D-002(下载幂等)、TP-P-009(OBS 重试 3 次)、TP-N-001(容量基线)、TP-T-007/TP-N-006(异常恢复) | 073、074/075、066、057/058、072、043、079/080 | ✅ 100% ≥ 90%(测试点文档明确"不得静默省略"的主场景 TP-N-002 已有专项用例 073) | +| RISK-FINANCIAL 资损(评分 5) | P2 | 无专属 TP(本需求为只读导出,无直接资损动作);缓解依赖幂等/并发类 TP | 同上幂等/并发用例 | ✅ 缓解面已覆盖 | +| RISK-COMPLIANCE 合规(评分 5) | P2 | TP-M-004、TP-M-005、TP-P-014、TP-N-005、TP-D-003 | 006、007/008、064、078、067 | ✅ 100%(权限+审计补偿链均有用例) | +| RISK-DATA 数据(评分 4) | P2 | TP-P-012、TP-P-013、TP-U-016 | 061、062/063、028/029 | ✅ 100% | +| RISK-COMPATIBILITY 兼容性(评分 3) | P2 | TP-N-007 | 081 | ✅ 100% | + +**说明**: 本项目 P0 风险 = 0,无 P0 风险阻断项。P1 风险 RISK-AVAILABILITY 的缓解面(并发排队、重复提交幂等、下载幂等、OBS 重试、容量基线、异常恢复共 7 个测试点)全部有用例承接且无断言缺失,覆盖率 100%,满足 ≥90% 目标。 + +## 覆盖缺口 + +### 缺口 GAP-001: 最小序号运单因文件缺失被剔除后证件改挂重算——关键验证点未固化为用例断言 【BLOCKED】 +- 需求条目: REQ-015(P0)/ 测试点 TP-P-007(P0,测试点文档自评"全需求最易错点") +- 缺口类型: 关键验证点未固化为用例(部分覆盖——TC-053/054 已覆盖"校验失败剔除"与"单运单批次整批剔除"两条路径,缺"文件缺失剔除"路径) +- 风险等级: P0 +- 现状: TP-P-007 关键验证点 2"最小序号运单仅缺电子回单(文件缺失剔除)时同样重算挂载"无用例承接;用例文件已自认该场景依赖需求 4.4.4 条款一(缺失不剔除仅记清单)与条款二(剔除改挂)的适用边界未确认(实现口径确认项 3,数据缺口 #17,CMB-010/011 未固化) +- 建议: 【阻断验收签发,不阻断用例执行】需求方确认 4.4.4 条款一/二在"最小序号运单仅缺回单/合同"场景的边界后,基于 TC-053 补充变体用例(批次最小序号运单仅缺回单)并固化证件改挂断言;确认前该子项按 BLOCKED 跟踪 + +### 缺口 GAP-002: 打包期间源数据变更口径(快照 vs 实时)未确认,断言无法取值 +- 需求条目: REQ-013/REQ-015(P1/P0)/ 测试点 TP-P-013 / 用例 063 +- 缺口类型: 断言未固化(用例已建,核心断言 1 依赖 Q4 二选一) +- 风险等级: P1 +- 现状: TC-063 仅能验证"全任务一致"(不混杂),无法验证口径正确性;新回单是否入包无判定基准 +- 建议: 需求方在快照/实时中二选一后回填 TC-063 断言 1,并同步 TP-P-013 回归口径 + +### 缺口 GAP-003: 过期任务展示形态与 7 天临界口径未确认,两条用例断言双口径悬置 +- 需求条目: REQ-021(P1)/ 测试点 TP-N-004 / 用例 076、077 +- 缺口类型: 断言未固化(TC-077 断言 1 依赖 Q5:新增"已过期"展示态 or 原状态+按钮置灰;TC-076 断言 2 依赖 BND-032"完成时间+7 天整"实现口径) +- 风险等级: P1 +- 建议: 确认 Q5 展示形态与保留期临界算法后回填断言;临界口径建议直接写死为"完成时间 +7×24h"或明确实现值 + +### 缺口 GAP-004: 失败清单下载是否记审计日志未确认,审计留痕范围存在豁口 +- 需求条目: REQ-017(P0)/ 测试点 TP-D-003 / 用例 067 +- 缺口类型: 断言未覆盖(失败清单含货源单号/运单号,属敏感业务数据,其下载留痕当前无用例断言,依赖 Q6) +- 风险等级: P1(REQ-017 主体"文件包下载审计"已由 TC-067 完整覆盖,本缺口为其延伸留痕项) +- 建议: 采纳用例文件建议"一并留痕"(与文件包下载同表或同流水),确认后在 TC-067 补充失败清单下载审计断言 + +### 缺口 GAP-005: 序号 int32 上限与 Excel 15 位精度截断边界无用例固化 +- 需求条目: REQ-006(P0)/ 测试点 TP-U-008 / 用例 019 +- 缺口类型: 边界场景无用例(用例文件实现口径确认项 9 自认"TP-U-008 未单列用例,建议执行 019 时顺带探测") +- 风险等级: P2(序号业务上通常 ≤2000,极值输入概率低,但一旦静默截断将破坏"最小序号"判定链) +- 建议: 在 TC-019 清单中显式追加 2 行极值序号数据(int32 上限、15 位以上数字),固化断言"合法或明确报错,不得静默截断" + +### 缺口 GAP-006: 多 Sheet 工作簿、表头后附加说明行、合并单元格清单的解析口径无用例 +- 需求条目: REQ-004/REQ-005(P1/P0)/ 测试点 TP-U-001、TP-U-004 +- 缺口类型: 边界场景无用例(数据缺口 #15 自认"本文件未固化断言") +- 风险等级: P2 +- 现状: TC-009 仅覆盖"模板自带说明行不参与解析"这一特例;用户自造多 Sheet/说明行/合并单元格文件的读取行为(读取首 Sheet?整体拒绝?)无任何用例约束 +- 建议: 补充 1 条解析口径用例,或经需求/开发确认后显式声明"仅读首 Sheet、其余忽略"并写入用例前置说明 + +### 缺口 GAP-007: 运单号大小写匹配口径未显式覆盖 +- 需求条目: REQ-006(P0)/ 测试点 TP-U-011 / 用例 022 +- 缺口类型: 边界场景无用例(TP-U-011 关键验证点含"大小写/前后空格匹配口径一致",TC-022 仅覆盖前后空格变体,无大小写变体行) +- 风险等级: P3 +- 建议: 在 TC-022 清单追加 1 行大小写变体运单号,验证存在性校验与实际导出同口径 + +## 过度覆盖 + +### 冗余 RED-001(条件性): TC-044 结构预览弹窗用例悬于未确认功能之上 +- 用例: PLT_TMS_FPKG_044(承接 TP-T-008,标注 REQ-011) +- 问题: "查看结构/文件包结构预览"仅见于原型、需求正文未定义(待确认 Q1)。当前状态下可追溯到 TP-T-008→REQ-011,不计为硬性冗余;但若需求方确认本期裁剪该功能,TC-044 即成为无需求依据的过度覆盖 +- 建议: Q1 确认裁剪则删除 TC-044 并同步移除 TP-T-008;确认实现则按弹窗实际字段回填断言后保留。冗余率影响: 裁剪情形下 1/82 ≈ 1.2%,仍 ≤ 5% 门限 + +**硬性冗余统计**: 0/82 = 0%(全部 82 条用例均可逆向追溯到 REQ/TP),≤ 5% 门限 ✅ + +**冗余倾向观察(不判为 RED,保留合理)**: TC-081 断言 3(.xls 改后缀 .xlsx 被拒)与 TC-011 部分重叠——属兼容性维度的跨模块交叉验证(RISK-COMPATIBILITY),且两用例执行环境不同(解压工具/浏览器 vs 接口直传),保留合理;TC-001 冒烟与明细用例存在主链路重叠,属用例文件声明的"端到端冒烟单独成条"设计原则,保留合理。 + +## 覆盖热力图 + +> 按 TP 文档六大模块统计。关联需求条目数为该模块 TP 触及的去重 REQ 数(一条 REQ 可跨多模块被计数,合计 40 条次 > 26 条);用例数含跨模块共用的 TC-001(冒烟,在三个模块各计 1 次,合计 84 计次 - 2 重复 = 82 条唯一)。 + +| 模块 | 关联需求条目 | 测试点(P0/P1/P2/P3) | 用例 | 覆盖密度 | +| :--- | :---: | :---: | :---: | :--- | +| 菜单与权限 | 3(REQ-001/002/026) | 5(3/1/1/0) | 7 | ███ 适中 | +| 上传与校验 | 7(REQ-001/003/004/005/006/007/023) | 18(11/6/1/0) | 24 | ██████████ 密集 | +| 任务与列表 | 7(REQ-007/008/009/011/018/019/024) | 8(2/5/0/1) | 14 | ██████ 较密 | +| 打包归批与文件包结构 | 7(REQ-010/011/012/013/014/015/026) | 14(6/7/1/0) | 20 | ████████ 密集 ⚠️ GAP-001 | +| 下载与幂等审计 | 4(REQ-008/016/017/025) | 6(3/2/0/1) | 8 | ███ 适中 ⚠️ GAP-004 | +| 非功能 | 12(REQ-001/002/004/015/016/017/020/021/022/023/024/026) | 8(0/5/3/0) | 11 | █████ 较密 ⚠️ GAP-003 | + +**盲区高亮**: + +- 无硬盲区: 不存在"无测试点的需求"(26/26)、"无用例的测试点"(59/59)、"无需求依据的用例"(82/82)。 +- 待确认型盲区(需求侧未决传导,非用例缺失): 集中在 **打包归批**(GAP-001,文件缺失剔除触发证件改挂的口径,BLOCKED)与 **非功能**(GAP-003,过期展示/临界口径);**下载与幂等审计** 的盲区为审计留痕范围延伸(GAP-004)。 +- 密度观察: 上传与校验(24 用例/18 TP,均值 1.33)与打包归批(20/14,均值 1.43)覆盖最厚,与"校验规则 + 归批规则是本需求复杂度核心"的判断一致;下载与幂等审计均值 1.33 但绝对量最少(8 条),其中 3 个 P0(下载/幂等/审计)均有专项 P0 用例,密度虽低但关键面无缺口。 +- 模块口径说明: 用例文件的模块分布(菜单权限 7/上传校验 13/数据校验 10/任务列表 13/打包归批 20/下载审计 7/非功能 11/跨模块冒烟 1)中,"数据校验"10 条在本热力图中并入"上传与校验"(对应 TP-U-008~016 的承接用例),"跨模块冒烟"001 按其实际承接的 TP 归入三个模块重复计数。 + +## 审计结论 + +量化指标全部达标(需求覆盖 100%、P0/P1 测试点覆盖 100%、过度覆盖 0%),追溯标注质量高(抽查 6 处可疑标注,5 处成立、1 处为无害的描述不一致)。**签发建议: 有条件通过** —— 以 GAP-001(BLOCKED,REQ-015 关键验证点"文件缺失剔除→证件改挂"断言未固化)的需求侧确认为签发前置条件;GAP-002~004 随 Q4/Q5/Q6 确认回填断言;GAP-005~007 为低成本补强项,建议随执行批次吸收。 diff --git a/output/analysis/运单资料文件包下载需求_评审报告.md b/output/analysis/运单资料文件包下载需求_评审报告.md new file mode 100644 index 0000000..9b7e83d --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_评审报告.md @@ -0,0 +1,138 @@ +# 运单资料文件包下载需求 评审报告 + +> 评审人: case-reviewer(Agentic QE Fleet · review 战区) +> 评审时间: 2026-09-08 +> 被评审对象: output/test_cases/运单资料文件包下载需求_测试用例.md(82 条,PLT_TMS_FPKG_001~082) +> 评审依据: agents/review/case_reviewer.md(7 维度)、knowledge_base/01_standards/review_checklist.md、test_case_template.md、definition_of_done.md +> 校准输入: requirements/运单资料文件包下载需求.md(v1.0 定稿,13 项确认决议)、output/test_points/运单资料文件包下载需求_测试点.md(59 测试点)、output/analysis/运单资料文件包下载需求_风险评估.md(P1=RISK-AVAILABILITY)、output/analysis/运单资料文件包下载需求_测试数据.md(145 组数据)、knowledge_base/01_standards/terminology.md +> 核验手段: 逐条人工评审 + 脚本核验(表格列数、编号连续性、优先级/类型/模块分布、必填列空值、数据 ID 与数据文件交叉比对) + +## 评审概览 + +| 指标 | 值 | +| :--- | :--- | +| 用例总数 | 82 | +| 阻断项 | 3 | +| 建议项 | 4 | +| 优化项 | 7 | +| 评分 | 89/100 | + +总体结论:用例集质量高——表头/列数/编号/模块路径零缺陷(脚本核验),59/59 测试点全部承接,13 项确认决议全部落地无违背,术语与术语表一致,预期结果普遍做到"UI/接口反馈 + 数据状态"双覆盖。3 个阻断项集中在 2 处测试数据引用缺陷与 1 处场景遗漏(0 有效行终态待确认项未显式标注),均可精确定位、快速修复;修复后即可达到可执行标准。 + +## 阻断项 + +### B-001: 039 的测试数据引用与数据文件定义冲突(XLS-006 行数标注错误) +- 用例编号: PLT_TMS_FPKG_039 +- 行号: 表格数据行第 39 行(文件 L69) +- 问题: 测试数据列标注 `XLS-006(1000 行)`,但 XLS-006 在测试数据文件中定义为 1~2000 行的"行数上限合法文件(2000 行全有效)"(测试数据文件 L35),且同文件 015/061/072/082 均按 2000 行使用 XLS-006。本用例步骤与前置条件均要求"1000 行规模合法清单(CNC-001/CNC-006)"。数据 ID 与行数标注自相矛盾,执行人按 ID 取数会取到 2000 行文件,与步骤"上传 1000 行清单"冲突,无法按写明数据直接操作。 +- 修复建议: 测试数据列改为 `BND-007(1000 行清单,按 CNC-006 的 500 批×2 运单混合结构构造)`,与 072 的写法保持一致。 +- 修复后预期: 数据 ID、步骤、前置条件、数据文件定义四方一致,执行人可直接构造 1000 行清单执行进度观察断言。 + +### B-002: 026 的数据构造自相矛盾(序号重复行 vs 序号互不相同) +- 用例编号: PLT_TMS_FPKG_026 +- 行号: 表格数据行第 26 行(文件 L56) +- 问题: 前置条件为"1 行合法(XLS-001)+1 行序号重复(XLS-106 重复行)+……各行序号取互不相同的合法值"。序号重复行必须与文件内另一行同序号才会触发"序号重复"失败;若按字面"各行序号互不相同"构造,该行不会失败,实际失败数=4,与预期断言"成功数=1+失败数=5=总行数 6"冲突。执行人按字面执行将得到与预期不符的结果。 +- 修复建议: 前置条件改写为"重复行与合法行 XLS-001 共用序号 1(XLS-001 为首现行保留并成功,重复行计失败,口径同 020),其余 4 个失败行(XLS-110/111/113/107)序号取互不相同的合法值(如 2/3/4/5)"。 +- 修复后预期: 按前置条件可直接构造 6 行数据,执行结果与断言 1/4(成功=1、失败=5)自洽,5 类失败原因互不串行。 + +### B-003: "全部行数据级失败(0 有效行)"场景无用例承接且待确认口径未显式标注 +- 用例编号: 无(场景缺口,涉及 CMB-018 / 数据缺口 #14) +- 行号: 用例集整体(文末"未收敛的 ⚠️ 待确认清单"与"其他实现口径确认项"均未收录该项) +- 问题: 需求 4.2.2 处理原则未定义"剔除失败行后 0 有效行"的任务终态(已完成·部分失败 or 失败)与是否生成空文件包;测试数据文件已将该场景构造为 CMB-018 并列为数据缺口 #14("需求方/开发确认")。用例文件对缺口 #15/#16/#17 均已显式纳入文末确认项,唯独遗漏 #14:既无用例承接该异常/边界场景,也无 ⚠️ 待确认标注。对照 review_checklist 阻断项"需求存在明显待确认项,但未显式标注"及 DoD §4"不得静默遗漏",属于状态流转维度的不闭合。 +- 修复建议: 新增 1 条 P1 功能测试用例(建议编号 PLT_TMS_FPKG_083,模块 平台端-运单管理-运单文件包-数据校验):前置构造 3 行全非法清单(XLS-101+XLS-110+XLS-107),断言任务终态、成功数=0、统计一致且对象存储无空包(口径按缺口 #14 确认后回填,暂按"已完成·部分失败、不生成空 zip"设计并在备注标注 `⚠️ 待确认:0 有效行终态,见数据缺口 #14`);同时在"其他实现口径确认项"补充缺口 #14 条目。 +- 修复后预期: 0 有效行边界具备可执行用例与显式待确认标注,与其他数据缺口处理方式一致,无静默遗漏。 + +## 建议项 + +### S-001: 007/008 多机构隔离用例的数据与环境前置未闭环 +- 用例编号: PLT_TMS_FPKG_007 / PLT_TMS_FPKG_008 +- 行号: 表格数据行第 37/38 行(文件 L37/L38) +- 问题: B 机构运营账号、任务编号 TB、运单号 YDB-001 均为行内临时记号,未分配数据 ID,也未列入数据缺口清单(缺口 #1 仅覆盖本机构运单号映射);测试环境是否为多机构部署亦无来源标注(脚本核验:YDB-001 是全部 82 条中唯一在数据文件无定义的引用)。执行前无法确认数据可获取,前置条件可复现性存疑。 +- 修复建议: 为 B 机构数据分配数据 ID(如 ACC-B01、YDB-001)并在测试数据文件"数据缺口"补充"多机构部署环境 + B 机构运营账号 + B 机构运单"条目;若测试环境不支持多机构部署,在 007/008 备注显式说明取舍原因,不得静默保留。 +- 修复后预期: 007/008 的前置条件可复现、数据来源可追溯,与全文件数据 ID 纪律一致。 + +### S-002: 007/008 以 super_admin 充当"A 机构运营账号"做隔离断言存在口径风险 +- 用例编号: PLT_TMS_FPKG_007 / PLT_TMS_FPKG_008 +- 行号: 表格数据行第 37/38 行(文件 L37/L38) +- 问题: 数据文件定义 ACC-001 为"超级管理员(代行运营人员)、全部权限"。超管在多机构部署下可能按设计具备跨机构可见性:若如此,断言"ACC-001 任务列表不显示 B 机构任务"会因角色能力而失败(误报缺陷),或掩盖机构隔离缺陷(漏报)。 +- 修复建议: 机构隔离断言改用绑定 A 机构的非超管运营账号(可复用 ACC-002 并补充机构绑定关系),或在 007 前置条件中先与开发确认 super_admin 在多机构下的可见范围并将结论写入预期结果。 +- 修复后预期: 隔离断言基于受控权限角色,失败时可归因到数据权限缺陷而非角色差异。 + +### S-003: 007 的 P2 与项目画像"权限类必测机构隔离"硬约束权重不匹配 +- 用例编号: PLT_TMS_FPKG_007(关联 PLT_TMS_FPKG_008) +- 行号: 表格数据行第 37 行(文件 L37) +- 问题: 项目画像 §10 要求权限类用例必须验证机构数据隔离,007 承载任务列表+下载双隔离主场景却为 P2(沿袭测试点 TP-M-005 的 P2 定级),008(上传行级失败隔离)同为 P2。按 review_checklist §8"不得把高风险场景错误下沉到 P2"的精神,主隔离场景降权依据不足。 +- 修复建议: 将 007 升为 P1(008 可保持 P2);或在"P2/P3 用例取舍说明"中补充机构隔离保持 P2 的权重论证(如当前部署形态下跨机构风险实际较低)。 +- 修复后预期: 优先级与项目画像硬约束的权重口径一致,或有显式的降权理由。 + +### S-004: 跨货源归批(不拆批侧)规则组合未承接 +- 用例编号: 无(建议并入 045 或 046,涉及 CMB-007) +- 行号: 关联表格数据行第 75/76 行(文件 L75/L76) +- 问题: "同一司机+身份证+车牌三要素一致、运单分属不同货源时仍归 1 批(归批不看货源单号)"是归批规则(REQ-010)的关键组合验证:现有用例覆盖了"任一要素不同即拆批"(046/047),但"三要素一致不因货源不同而拆批"的负向对照缺失;数据文件已构造 CMB-007 却无用例承接。 +- 修复建议: 在 045 或 046 的上传清单中并入 CMB-007 行组(张三+皖A12345 跨 HY202609001/HY202609002 的运单各 1 单),增加断言"跨货源运单仍归同一批次包,两个运单包分别按各自货源单号命名"。 +- 修复后预期: 归批维度"拆批"与"不拆批"两侧均有用例,防止实现按货源单号错误分组。 + +## 优化项 + +### O-001: 046 单条用例合并两个真实业务场景,与文末取舍说明表述不一致 +- 用例编号: PLT_TMS_FPKG_046 +- 行号: 表格数据行第 76 行(文件 L76) +- 说明: 046 含两次独立上传(CMB-003 同司机换车、CMB-004 同车换司机),而文末取舍说明将 TP-P-002 列为"不同真实业务场景拆为独立用例",与实际不符。两场景验证点同为"任一要素不同即拆批",故列为优化。 +- 建议: 拆为两条独立用例(同司机换车 / 同车换司机),或将取舍说明中 TP-P-002 的表述修正为"按要素维度拆分(046 换车与换司机、047 同名不同证)"。 + +### O-002: 033 五种状态颜色映射未列明"待处理"标签颜色 +- 用例编号: PLT_TMS_FPKG_033 +- 行号: 表格数据行第 63 行(文件 L63) +- 说明: 断言 2 仅列处理中蓝/已完成绿/失败红/已完成·部分失败橙,未明确"待处理"标签颜色(原型为灰色态)。 +- 建议: 补齐"待处理灰色",使五种状态的颜色映射断言完整闭环。 + +### O-003: 049 断言 2 措辞"(非空目录亦无文件)"存在歧义 +- 用例编号: PLT_TMS_FPKG_049 +- 行号: 表格数据行第 79 行(文件 L79) +- 说明: 括号内表述易被误读,测试点原文意图是"既不得生成空的司机/车辆证件子目录,也不得含任何证件文件"。 +- 建议: 改写为"确无司机证件/车辆证件子目录(既不生成空目录,目录内也不得含任何证件文件)"。 + +### O-004: 041"构造同 026 数据"的引用与实际失败集不一致 +- 用例编号: PLT_TMS_FPKG_041 +- 行号: 表格数据行第 71 行(文件 L71) +- 说明: 041 实际为 XLS-101/110/111/113 四类失败行(序号 0/不存在/错配/无法归批),026 为 XLS-106/110/111/113/107 五类;"构造同 026 数据"会误导执行人复制错误失败集。 +- 建议: 改为"参照 026 的构造方式,含 XLS-101/110/111/113 四类失败行 + 1 行合法行"。 + +### O-005: ERR-034(源文件名 XSS)已定义数据但无用例承接 +- 用例编号: 建议并入 PLT_TMS_FPKG_029 +- 行号: 关联表格数据行第 59 行(文件 L59) +- 说明: 数据文件定义了 ERR-034(`.xlsx`,接口构造,列表转义展示断言),029 已覆盖源文件名超长/特殊字符/Unicode,仅差 XSS 变体一处断言(属 TP-U-016 防御完整性)。 +- 建议: 在 029 断言 2 中并入"含脚本标签的源文件名在任务列表转义展示、不触发弹窗"。 + +### O-006: CNC-007(双账号并发上传)未承接 +- 用例编号: 建议并入 PLT_TMS_FPKG_073 或 066 +- 行号: 关联表格数据行第 103/96 行(文件 L103/L96) +- 说明: CNC-007(ACC-001 与 ACC-006 同时上传,任务互不干扰、上传人字段各自正确)为数据文件已构造的多账号并发场景,当前无用例覆盖;066 仅覆盖双账号下载。 +- 建议: 在 073 的 5 任务并发中安排双账号提交并核对上传人字段,成本极低。 + +### O-007: XLS-005/BND-024 与 XLS-115 两处已构造数据未承接 +- 用例编号: 建议在 019/026 执行时顺带探测 +- 行号: 关联表格数据行第 49/56 行(文件 L49/L56) +- 说明: 大数值序号 50000 合法(XLS-005/BND-024)与单行多重非法的失败原因取值优先级(XLS-115)均无用例显式承接;前者可与确认项 #9 的 BND-025~027 同批探测,后者可在 026 执行时顺带验证原因展示优先级(019 断言 2 已有"首要或并列展示"的铺垫)。 +- 建议: 不新增用例,在 019/026 的步骤或备注中补一句顺带探测说明即可。 + +## 专项核查结论(任务指定核查项) + +1. **预期结果双覆盖(UI/接口 + 数据状态)**: 通过。82 条用例的预期结果均同时覆盖页面/接口反馈与数据状态校验(典型:010 统计卡片计数与数据库任务表比对、011 数据库无任务记录、016 对象存储无空包残留、061 zip 全量清点与统计"不出现两张皮"、065 下载前后数据库字段一致、066 服务端完成时间与存储不变、076 保留期字段与清理记录)。仅 030(易用性)与 033(标签映射)以 UI 断言为主,与类型定位匹配,且状态字典的数据侧校验由 032 断言 4 兜底。 +2. **测试步骤引用具体测试数据**: 通过。全部 82 条步骤/数据列均引用数据文件 ID(XLS/ERR/BND/IDC/STT/CMB/CNC),脚本核验引用 ID 100% 在数据文件有定义(唯 B-001 的错误标注与 S-001 的 YDB-001 除外);多数步骤还写明构造手段(openpyxl 构造、接口直传、抓包重放、运维配合 mock)。 +3. **P1 风险 RISK-AVAILABILITY(并发排队/幂等/重试)专项**: 已覆盖且步骤可执行——073 并发上限与排队(BND-051~053/CNC-002/003,10 秒级轮询+终态逐一验证 zip,备注显式"不得省略")、074 毫秒级并发幂等(前端防抖+后端幂等键双断言,CNC-008)、075 上传超时提示与重试防双任务、057/058 OBS 单文件重试两侧边界(恰 3 次)、079/080 OBS 整体不可用降级与恢复、066 下载幂等(CNC-005 哈希比对)、043 处理中服务异常置失败。P1 风险缓解链完整。 +4. **术语一致性**: 通过。菜单名"运单文件包"、批次/文件包(批次包)/运单包/总包/最小序号运单/电子回单/失败清单/审计日志/幂等性等用法与需求二章、4.4.2 及 terminology.md 一致;角色用"车队长""运营人员"无同义词混用;"银行电子回单"口径与术语表定义吻合。 +5. **已确认决议核对(第八章 13 项)**: 全部落地且无违背——#1→002、#2→003/004、#3/#12→048/064、#4→049、#5→050、#6→023、#7→034、#8→053/054、#9→015/017、#10→076、#11→069(防过度实现)、#13→020。Q1/Q4/Q5/Q6 四项保留待确认已在 044/063/077/067 备注显式标注(符合 DoD,不计缺陷);Q2/Q3 的收敛在 015/016 备注留有"实现不符需回归修订"的触发条件,处理得当。 +6. **追溯与统计**: 59/59 测试点全部有用例承接(文件头映射表逐条核对无遗漏);历史缺陷 BUG-202607-01/02/03 分别落到 068、058/074、061/062/063 且备注带 [AI修正] 来源标注;文末自述的优先级/类型/模块分布与脚本实测完全一致。 + +## 维度评分 + +| 维度 | 得分 | 说明 | +| :--- | :---: | :--- | +| 结构完整性 | 20/20 | 表头与 template 逐字一致;82 行均 10 列、无残缺无全角竖线;必填列无空;模块全部为层级路径且分布与自述一致;编号 001~082 连续唯一(脚本核验) | +| 可执行性 | 18/25 | 数据 ID 纪律优秀、步骤含轮询/构造/抓包等可操作手段;扣分项:039 数据引用错误(B-001)、026 数据构造自相矛盾(B-002)、007/008 环境与数据前置未闭环(S-001/S-002) | +| 原子性 | 14/15 | 无"多关键断言混杂"的阻断问题;拆分/合并总体遵循文末原则;扣分项:046 双场景合一且取舍说明表述不一致(O-001) | +| 预期结果质量 | 18/20 | 预期具体可验证、普遍含数据库/对象存储侧校验、失败可定位(前端/后端/规则/数据/异步分层断言);扣分项:0 有效行状态流转场景缺失致覆盖不闭合(B-003) | +| 类型准确性 | 10/10 | 枚举全部合法且与内容匹配(安全性 10 条对应越权/注入/审计/合规,回归 7 条均有历史缺陷或冲突修订依据,性能 3 条对应 RT/并发容量);自述类型分布与实测一致 | +| 优先级合理性 | 9/10 | P0=32(39%)与测试点 P0 占比(42%)匹配,全部 P0 测试点有 P0 用例承接,无高风险下沉;扣分项:007 机构隔离 P2 权衡存疑(S-003) | +| **合计** | **89/100** | 3 个阻断项修复后即可达到可执行与可导出标准 | diff --git a/output/analysis/运单资料文件包下载需求_质量裁决.md b/output/analysis/运单资料文件包下载需求_质量裁决.md new file mode 100644 index 0000000..6637dea --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_质量裁决.md @@ -0,0 +1,74 @@ +# 运单资料文件包下载需求 质量裁决 + +## 裁决结果: 🔧 PASS_WITH_FIX + +**裁决时间**: 2026-09-08 17:46:10 +**裁决人**: quality-gatekeeper (Agentic QE Fleet · review 战区) + +## 裁决依据 + +| 检查项 | 实际值 | 阈值 | 状态 | +| :--- | :---: | :---: | :---: | +| 阻断项数量 | 0(原 3 项 B-001/B-002/B-003,已全部自动修复并复核落地) | ≤ 0(max_blockers=0) | ✅ | +| P0 测试点→用例覆盖率 | 100%(25/25,修复后 TP-P-007 增至 053/054/084 三路径承接) | 100% | ✅ | +| P0 风险覆盖率 | 100%(P0 风险项=0,空集成立) | 100% | ✅ | +| P1 风险(RISK-AVAILABILITY)覆盖率 | 100%(7 个缓解测试点全部有用例:073/074/075/066/057/058/072/043/079/080) | ≥ 90% | ✅ | +| 需求→测试点覆盖率 | 100%(26/26) | ≥ 95%(min_coverage=0.95) | ✅ | +| 待确认项 | 未处理 0(7 条用例 ⚠️ 均已显式标注 + 默认设计口径 + 回填路径,符合 DoD 不计缺陷) | 0(未处理) | ✅ | +| 用例文件存在 | 是,85 条(001~085 连续唯一,脚本核验 10 列/必填列无空/分布统计与文首自述一致) | 是 | ✅ | +| 测试数据构造(require_data_builder) | 满足:数据文件 145 组 + 缺口 #14~#18 已补(CMB-018、BND-007 1000 行、BND-025~027、ACC-B01/YDB-001) | 必须提供 | ✅ | +| 风险评估(require_risk_assessment) | 满足:5 项风险(P0=0 / P1=1 / P2=4),P1 缓解面 100% 承接 | 必须提供 | ✅ | +| 过度覆盖率 | 0%(82→85 条均可逆向追溯 REQ/TP;RED-001 条件性冗余 1/85≈1.2% ≤ 5%) | ≤ 5% | ✅ | + +**逐条对照 BLOCKED 条件(全部不成立)**: +1. 阻断项 > 0 —— 不成立:3 项阻断已全部修复落地(见自动修复摘要),抽查未发现新引入阻断; +2. P0 测试点覆盖率 < 100% —— 不成立:25/25 = 100%,且原 GAP-001 对应的 TP-P-007"文件缺失剔除→证件改挂"路径已由新增 P0 用例 084 固化断言; +3. P0 风险覆盖率 < 100% —— 不成立:P0 风险=0,空集成立; +4. 存在未解决的确认门禁 —— 不成立:设计战区确认门禁已 confirmed(需求 v1.0 定稿、13 项确认决议全部落地);剩余 Q1/Q4/Q5/Q6 与缺口 #14/#15/#17/#18 均为需求侧"待需求方/开发确认口径"类,已在用例中显式 ⚠️ 标注、给出默认设计口径(083 按"已完成·部分失败、不生成空 zip";084 按决议#8+4.4.4 条款二字面固化证件改挂断言;085 按"不得静默丢数据"不变式)与回填路径,对照评审报告对 Q1/Q4/Q5/Q6 的既有裁定("显式标注符合 DoD,不计缺陷")与 B-003 的修复方向(补用例 + 显式标注即为闭合态),此类项按同一口径判定为"已处理",不构成未解决确认门禁; +5. 测试用例文件不存在或为空 —— 不成立:85 条用例完整。 + +## 裁决详情 + +1. **评审阻断项修复复核(3/3 落地)**: + - B-001(039 数据引用冲突):测试数据列已改为 `BND-007(1000 行清单,按 CNC-006 的 500 批×2 运单混合结构构造)`,数据 ID、步骤(上传 1000 行)、断言(186/1000 形式)与数据文件定义(BND-007=1000 行性能基准)四方一致; + - B-002(026 序号自相矛盾):前置条件已改为"重复行与合法行 XLS-001 共用序号 1(首现行保留成功、重复行计失败,口径同 020),其余 4 个失败行序号取互不相同的合法值(如 2/3/4/5)",与断言"成功数=1+失败数=5=总行数 6"自洽; + - B-003(0 有效行场景遗漏):新增 PLT_TMS_FPKG_083(P1/功能测试/数据校验模块),按 CMB-018 构造 3 行全非法清单,断言含"无下载入口、对象存储无空包残留",备注 ⚠️ 指向文末确认项 #10(数据缺口 #14),确认项 #10 已收录该缺口——静默遗漏已闭合。 +2. **覆盖率缺口修复复核**: + - GAP-001(BLOCKED 级):新增 PLT_TMS_FPKG_084(P0/打包归批),最小序号运单因仅缺电子回单被剔除(CMB-010,缺口 #17),按决议#8+4.4.4 条款二字面口径固化证件改挂断言(断言 2:序号 3 运单包含证件后缀+四子目录、序号 5 仅合同+回单,且该断言在运单包最终形态两种口径下均须成立);TP-P-007 现有 053/054/084 三条覆盖"校验失败剔除/整批剔除/文件缺失剔除"全部路径,P0 关键验证点已固化为断言,GAP-001 在用例层面闭合(残留为需求侧 4.4.4 条款边界的口径回填,已显式标注); + - GAP-005:019 备注已锚定 BND-025/026/027 极值序号顺带探测(int32 上限 2147483647 / 上限+1 / 20 位超 Excel 精度),固化断言"合法或明确报错,不得静默截断",与确认项 #9、数据文件定义三方一致; + - GAP-006:新增 PLT_TMS_FPKG_085(P2/上传校验),固化"多 Sheet 数据无一被静默丢弃"不变式断言(要么全部解析总行数=3,要么整体拒绝),⚠️ 指向确认项 #1(缺口 #15); + - GAP-007:022 已追加运单号小写变体行(yd20260901001),断言 3 固化"存在性校验与实际导出同口径,不出现校验通过但导出缺单的不一致"; + - GAP-002/003/004:属断言取值类(用例 063/076/077/067 已建且已承接),随 Q4/Q5/Q6 确认回填,不构成覆盖缺口。 +3. **建议项/优化项采纳复核**:S-003(007 已升 P1,取舍说明同步更新);S-001/S-002(007/008 备注补环境依赖与替代口径"改用绑定 A 机构的非超管账号 ACC-002 补机构绑定执行,不得静默跳过",数据文件已补缺口 #18:ACC-B01/YDB-001);S-004(045 已并入 CMB-007 跨货源不拆批断言,批次①含 4-【CMB-007 运单号】-HY202609002,与 046 拆批两侧互补);O-001(取舍说明已改为"TP-P-002 按要素维度处理");O-002(033 已补"待处理灰",五色映射闭环);O-003(049 已改写为"既不生成空目录,目录内也不得含任何证件文件");O-004(041 已改为"参照 026 的构造方式,含 XLS-101/110/111/113 四类失败行 + 1 行合法行");O-005(029 数据列已含 ERR-034,断言 2 补 XSS 文件名转义展示不触发弹窗);O-006(073 已并入 CNC-007 双账号并发与上传人字段一一对应断言);O-007(主路径已采纳:019 极值探测锚定 BND-025~027;XLS-115 单行多重失败原因优先级与 BND-024 大数值合法序号未在 026/019 显式点名,见遗留事项 2)。 +4. **结构复核(脚本实测)**:85 行×10 列、编号 001~085 连续唯一、必填列无空值;文首统计与实测完全一致(P0=33/P1=43/P2=7/P3=2;功能 62/安全 10/回归 7/性能 3/兼容 1/易用 1/冒烟 1;菜单权限 7/上传校验 14/数据校验 11/任务列表 13/打包归批 21/下载审计 7/非功能 11/跨模块冒烟 1);用例编号与测试点映射总览已同步(TP-U-001→009/085、TP-U-004→012/013/085、TP-U-015→026/027/083、TP-P-007→053/054/084),59/59 测试点映射关系无断裂。 +5. **遗留非阻断事项(不改变裁决,建议导出前/执行前处理)**: + - ① 022 步骤 1 仍写"上传该 3 行清单",与前置条件"构造 4 行清单"(GAP-007 修复新增大小写变体行后)行数表述不一致。属文案级遗留(与评审 O-004 同族、按其定级口径为优化级):前置条件已完整定义 4 行且断言 1~3 均要求四行行为,不会导致错误判定或无法构造,不影响门禁,但建议导出前顺手将"3 行"改为"4 行"; + - ② O-007 部分残留:XLS-115(单行多重非法的失败原因优先级)与 XLS-005/BND-024(50000 合法大数值)未显式点名;019 断言 2 已有"一行并存多项问题时原因以首要或并列展示"铺垫、BND-026/027 已覆盖更极端的数值边界,可在执行 026/019 时按备注顺带探测,不再单独开项; + - ③ 断言回填类:063(Q4 快照/实时)、076/077(Q5 与 BND-032 临界口径)、067(Q6 失败清单留痕)、044(Q1 结构预览)、083(缺口 #14 终态)、084 断言 3(缺口 #17 条款边界)、085 断言 1 取值(缺口 #15 口径)——均已内置默认口径与回填路径,须在对应确认完成后回填,未确认前相关断言按用例内标注的默认口径执行并在执行报告记录。 + +## 自动修复摘要 + +| 序号 | 修复项 | 修复内容 | 抽查验证结果 | +| :--- | :--- | :--- | :--- | +| 1 | 评审 B-001 | 039 测试数据列 XLS-006(1000 行)→ BND-007(1000 行,按 CNC-006 结构构造) | ✅ 落地(用例表 039 行;数据文件 BND-007=1000 行一致) | +| 2 | 评审 B-002 | 026 前置条件改为重复行与 XLS-001 共用序号 1,其余 4 失败行序号 2/3/4/5 互不相同 | ✅ 落地(与断言成功 1+失败 5=6 自洽) | +| 3 | 评审 B-003 | 新增 PLT_TMS_FPKG_083(P1,0 有效行终态场景),确认项 #10 收录缺口 #14 | ✅ 落地(CMB-018 构造、⚠️ 显式标注、数据文件缺口 #14 在册) | +| 4 | 覆盖 GAP-001 | 新增 PLT_TMS_FPKG_084(P0,文件缺失剔除→证件改挂重算,固化决议#8+4.4.4 条款二字面断言) | ✅ 落地(TP-P-007→053/054/084,⚠️ 运单包最终形态待确认已标注) | +| 5 | 覆盖 GAP-005 | 019 备注锚定 BND-025/026/027 极值序号顺带探测,"合法或明确报错,不得静默截断" | ✅ 落地(与确认项 #9、数据文件定义一致) | +| 6 | 覆盖 GAP-006 | 新增 PLT_TMS_FPKG_085(P2,多 Sheet 不得静默丢数据不变式) | ✅ 落地(TP-U-001/TP-U-004 映射同步,确认项 #1/缺口 #15 收录) | +| 7 | 覆盖 GAP-007 | 022 清单追加大小写变体行,断言"存在性校验与实际导出同口径" | ✅ 落地(遗留步骤 1"3 行"文案未同步,见遗留事项①,非阻断) | +| 8 | 建议 S-001/S-002 | 数据文件补缺口 #18(ACC-B01/YDB-001/多机构部署形态),007/008 备注补环境依赖与替代口径 | ✅ 落地(缺口 #18 在册,007 备注含"不得静默跳过"约束) | +| 9 | 建议 S-003 | 007 由 P2 升 P1 | ✅ 落地(优先级列 P1,取舍说明同步"升为 P1") | +| 10 | 建议 S-004 | 045 并入 CMB-007 跨货源不拆批断言 | ✅ 落地(前置/步骤/断言 2/备注四处一致) | +| 11 | 优化 O-001~O-007 | 取舍说明表述修正、033 补待处理灰、049 措辞消歧、041 失败集改写、029 并入 ERR-034、073 并入 CNC-007、019 锚定极值探测 | ✅ 全部落地(O-007 的 XLS-115/BND-024 显式点名残留,见遗留事项②,非阻断) | +| 12 | 结构复核 | 85 行×10 列、编号连续、统计一致、类型合法、必填列无空 | ✅ 脚本实测通过(本次裁决独立复测) | + +## 后续步骤 + +- 🔧 自动修复已完成并通过复核:3 项评审阻断全部修复、GAP-001(BLOCKED 级)在用例层面闭合、GAP-005/006/007 已补齐、S-001~S-004 与 O-001~O-007 已采纳,修复后状态等同于 PASS(结构脚本核验零缺陷、三级追溯 26/26→59/59→85/85 无断裂)。 +- ✅ 可执行 `/qe-fleet export` 导出 Excel(建议导出前顺手修正 022 步骤 1 的"3 行→4 行"文案,1 处改动)。 +- 📋 需求侧确认回填清单(不阻断导出,须在执行前/执行中闭环,回填路径已内置于用例): + 1. Q1→044(结构预览裁剪或回填)、Q4→063 断言 1、Q5→077 断言 1 与 BND-032 临界(076)、Q6→067 失败清单留痕; + 2. 缺口 #14→083 断言 3/4 终态、#15→085 断言 1 取值、#17→084 断言 3 运单包最终形态、#18→007/008 多机构环境与 B 机构造数; + 3. 执行阶段按缺口清单 #1~#13 完成造数(2000 有效运单、多笔支付运单、OBS 失效对象等),并执行 019/026 时顺带探测 BND-024~027 与失败原因优先级。 +- 📝 本裁决为 review 战区最终裁定;若后续需求方确认口径与默认设计不符(如 083 终态确认为"失败"、084 确认为条款一不剔除),须按回填路径修订对应断言后重新执行 `/qe-fleet review` 复核,无需整体重新裁决。 diff --git a/output/analysis/运单资料文件包下载需求_风险评估.md b/output/analysis/运单资料文件包下载需求_风险评估.md new file mode 100644 index 0000000..a984540 --- /dev/null +++ b/output/analysis/运单资料文件包下载需求_风险评估.md @@ -0,0 +1,21 @@ +# 运单资料文件包下载需求 风险评估报告 + +> 生成时间: 2026-09-08T08:11:23.797170+00:00 + +## 风险概览 + +- 总风险项: 5 +- P0 高风险: 0 +- P1 中风险: 1 + +## 风险矩阵 + +| 风险ID | 类别 | 可能性(1-5) | 影响度(1-5) | 风险评分 | 等级 | 冲突放大 | +| :--- | :--- | :---: | :---: | :---: | :---: | :---: | +| RISK-AVAILABILITY | 可用性 | 3 | 4 | 12 | **P1** | 否 | +| RISK-FINANCIAL | 资损 | 1 | 5 | 5 | **P2** | 否 | +| RISK-COMPLIANCE | 合规 | 1 | 5 | 5 | **P2** | 否 | +| RISK-DATA | 数据 | 1 | 4 | 4 | **P2** | 否 | +| RISK-COMPATIBILITY | 兼容性 | 1 | 3 | 3 | **P2** | 否 | + +## 风险缓解建议 diff --git a/output/docx_check/check.docx b/output/docx_check/check.docx new file mode 100644 index 0000000..50d4174 Binary files /dev/null and b/output/docx_check/check.docx differ diff --git a/output/docx_check/check.pdf b/output/docx_check/check.pdf new file mode 100644 index 0000000..776bd06 Binary files /dev/null and b/output/docx_check/check.pdf differ diff --git a/output/docx_check/check_html.files/filelist.xml b/output/docx_check/check_html.files/filelist.xml new file mode 100644 index 0000000..014b9a3 --- /dev/null +++ b/output/docx_check/check_html.files/filelist.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/output/docx_check/check_html.files/header.html b/output/docx_check/check_html.files/header.html new file mode 100644 index 0000000..42776dc --- /dev/null +++ b/output/docx_check/check_html.files/header.html @@ -0,0 +1,13 @@ +

µÚ  ҳ / ¹²  ҳ

\ No newline at end of file diff --git a/output/docx_check/check_html.html b/output/docx_check/check_html.html new file mode 100644 index 0000000..329d7b4 --- /dev/null +++ b/output/docx_check/check_html.html @@ -0,0 +1,1882 @@ +

Ô˵¥×ÊÁÏÎļþ°üÏÂÔØ ÐèÇóÎĵµ

°汾 v1.0£¨¶¨¸壩 · Ô˰Ëƽ̨¶Ë · 2026-09-08

 

Ïî

ÄÚÈÝ

¹¦ÄÜÃû³Æ

Ô˵¥×ÊÁÏÎļþ°üÏÂÔأ¨ÐÂÔö²˵¥£©

ËùÊô¶Ë

Ô˰Ëƽ̨¶ˣ¨Web ¹ÜÀíºǫ́£©

°汾

v1.0£¨¶¨¸壩

±àдÈÕÆÚ

2026-09-08

ȷÈϼǼ

2026-09-08 ÐèÇó·½ȷÈϣ¬13 Ïî´ýȷÈÏÊÂÏîȫ²¿²ÉÄɱ¾Îĵµ½¨Ò鷽°¸£¨¼ûµڰËÕ£©

ÐèÇóÀ´Դ

ÔËӪ¿ÚͷÐèÇó£¨2026-09-08£©£¬±¾ÎĵµΪÕûÀí¸å

¹ØÁªÊõÓï

ÒÔ knowledge_base/01_standards/terminology.md Ϊ׼

ԭÐÍ

resources/prototypes/anhuibaba_file_package.html£¨¾²̬ÑÝʾ£ºÈÎÎñÁбí / Éϴ«µ¯´° / Îļþ°ü½ṹԤÀÀ / ʧ°ÜÇ嵥£©

 

һ¡¢ÐèÇ󱳾°ÓëĿ±ê

ÔËӪÈËԱÔÚÏßϹ鵵¡¢Éó¼ơ¢¶ÔÕ˵ȳ¡¾°ÖУ¬ÐèҪ°´Åú´ÎÊռ¯Ô˵¥×ÊÁϣºÔ˵¥ºÏͬ¡¢µç×ӻص¥£¬ÒԼ°˾»ú֤¼þÕÕƬ¡¢³µÁ¾֤¼þÕÕƬ¡£ĿǰֻÄÜÖ𵥽øÈëÔ˵¥ÏêÇéÊֹ¤ÏÂÔØÕûÀí£¬ЧÂʵÍÇÒÒ×ÒÅ©¡£

Ŀ±꣺Ìṩһ¸ö¡°Éϴ«Ô˵¥Ç嵥 ¡ú ϵͳ×Զ¯Éú³É×ÊÁÏÎļþ°ü ¡ú ÈÎÎñÍê³ɺóÏÂÔØ¡±µÄÅúÁ¿µ¼³öÄÜÁ¦£¬°´¡°˾»ú+Éí·Ý֤+³µÁ¾¡±×Զ¯¹éÅú£¬×ÊÁϰ´Ô˵¥·ÖĿ¼×é֯¡¢°´¹æÔòÃüÃû£¬һ´ÎÏÂÔؼ´¿ɻñµÃȫ²¿×ÊÁϡ£

±¾Æڷ¶Χ£º½ö×ö×ÊÁϵ¼³ö´ò°ü£»²»ÐÂÔöÊý¾ݲɼ¯£¬ºÏͬ¡¢µç×ӻص¥¡¢˾»ú֤¼þ¡¢³µÁ¾֤¼þ¾ù¶ÁȡÔ˰Ëƽ̨ÏÖÓÐÊý¾ݡ£

¶þ¡¢Ãû´ʶ¨Òå

ÊõÓï

¶¨Òå

Åú´Î

Éϴ«Ç嵥ÖУ¬Ô˵¥ÔÚϵͳÄڵÄ ˾»úÐÕÃû + ˾»úÉí·Ý֤ºÅ + ³µÅƺÅ ÈýҪËØÍêȫһÖµÄһ×éÔ˵¥¡£

Îļþ°ü£¨Åú´ΰü£©

һ¸öÅú´ÎÉú³ɵÄĿ¼£¬Äں¬¸ÃÅú´Îȫ²¿Ô˵¥µÄÔ˵¥°ü¡£

Ô˵¥°ü

Åú´ΰüϰ´Ô˵¥ά¶Ƚ¨Á¢µÄ×ÓĿ¼£¬Äں¬¸ÃÔ˵¥µĺÏͬ¡¢µç×ӻص¥¼°£¨½ö×îСÐòºÅÔ˵¥£©˾»ú¡¢³µÁ¾֤¼þÕÕƬ¡£

×îСÐòºÅÔ˵¥

ͬһÅú´ÎÄڣ¬Éϴ«Ç嵥ÖС°ÐòºÅ¡±×îСµÄÔ˵¥¡£¸ÃÔ˵¥µÄÔ˵¥°ü¶îÍâ°üº¬˾»ú֤¼þÕÕƬ¡¢³µÁ¾֤¼þÕÕƬ¡£

 

Èý¡¢ÕûÌåÁ÷³Ì

ÔËӪÈËԱ                                ϵͳ

  │ ¢Ù ÏÂÔØģ°壬ÌîдÔ˵¥Ç嵥²¢Éϴ«          │

  │ ────────────────────────────────────¡ú │ ¢Ú УÑéģ°åÓëÊý¾ݣ¨¼û 4.2.2£©

  │                                       │ ¢Û ´´½¨´ò°üÈÎÎ񣨴ý´¦Àí ¡ú ´¦ÀíÖУ©

  │ ④ ÈÎÎñÁбí²鿴´¦Àí½ø¶È                 │ ④ °´Åú´ηÖ×é ¡ú ÖðÔ˵¥ÏÂÔعØÁªÎļþ ¡ú ×éװÎļþ°ü

  │ ¡û──────────────────────────────────── │ ⑤ ÈÎÎñÍê³ɣ¨ÒÑÍê³É / ÒÑÍê³É·²¿·Öʧ°Ü / ʧ°ܣ©

  │ ⑥ µã»÷¡°ÏÂÔØ¡±»ñȡÎļþ°ü zip             │

  │ ¡û──────────────────────────────────── │ ⑦ ·µ»Ø zip£¬¼Ç¼ÏÂÔØÉó¼ÆÈÕ־

 

ºËÐĹæÔò£º˾»ú+Éí·Ý֤+³µÁ¾ËãһÅúÔ˵¥£¬Éú³Éһ¸öÎļþ°ü£»Îļþ°üÄڰ´Ô˵¥½¨Ô˵¥°ü£»Åú´ÎÄÚ×îСÐòºÅµÄÔ˵¥°ü¶îÍ⺬˾»ú¼°³µÁ¾֤¼þÕÕƬ£¬ÆäÓàÔ˵¥°üֻº¬ºÏͬÓëµç×ӻص¥¡£

Ëġ¢¹¦ÄÜÐèÇó

4.1 ²˵¥Èë¿Ú

• Ô˰Ëƽ̨¶ËÐÂÔö¶ÀÁ¢²˵¥£¬²˵¥Ãû³Æ ¡°Ô˵¥Îļþ°ü¡±£¬¹ÒÔÚÔ˵¥¹ÜÀíÏà¹Øģ¿éÏ¡£

• ҳÃæ½ṹ£ºÉϷ½¡°Éϴ«ÈÎÎñ¡±Èë¿ڣ¨ģ°åÏÂÔØ + Éϴ«°´ť£©£¬Ï·½¡°ÈÎÎñÁбí¡±¡£

• ¿ɼû½Çɫ£ºÔËӪÈËԱ£»²˵¥ÐèȨÏ޿ØÖÆ¡ª¡ªÎļþ°üº¬Éí·Ý֤µÈÃô¸Ð֤¼þÕÕƬ¡£

4.2 ÎļþÉϴ«

4.2.1 Éϴ«ģ°å

ÁÐÃû

ÀàÐÍ

±ØÌî

˵Ã÷

ÐòºÅ

ÕûÊý

ÊÇ

ÕýÕûÊý£¬ȫÎļþÄÚΨһ£»¾ö¶¨Åú´ÎÄÚ¡°×îСÐòºÅÔ˵¥¡±µÄÅж¨

»õԴµ¥ºÅ

Îı¾

ÊÇ

ϵͳÄڻõԴµ¥ºÅ

Ô˵¥ºÅ

Îı¾

ÊÇ

ϵͳÄÚÔ˵¥ºÅ

 

• Îļþ¸ñʽ£º.xlsx£»ҳÃæÌṩģ°åÏÂÔء£

• ÏÞÖƣºµ¥ÎļþÐÐÊýÉÏÏÞ 2000 ÐУ»Îļþ´óСÉÏÏÞ 10MB¡£

4.2.2 УÑ鹿Ôò

¼¶±ð

¹æÔò

´¦Àí·½ʽ

Îļþ¼¶

·Ç xlsx ¸ñʽ / ÁÐÃûȱʧ»򲻷û / ÎļþËð»µ

Éϴ«¼´¾ܾø£¬Ìáʾ¾ßÌåԭÒ򣬲»´´½¨ÈÎÎñ

Îļþ¼¶

ÐÐÊý¡¢´óС³¬ÉÏÏÞ

Éϴ«¼´¾ܾø

Êý¾ݼ¶

ÐòºŷÇÕýÕûÊý»òÖظ´

¸ÃÐмÆÈëʧ°ÜÇ嵥

Êý¾ݼ¶

»õԴµ¥ºÅ / Ô˵¥ºÅΪ¿Õ

¸ÃÐмÆÈëʧ°ÜÇ嵥

Êý¾ݼ¶

Ô˵¥ºÅÔÚϵͳÖв»´æÔÚ

¸ÃÐмÆÈëʧ°ÜÇ嵥

Êý¾ݼ¶

ÎļþÖлõԴµ¥ºÅÓë¸ÃÔ˵¥ʵ¼ÊËùÊô»õԴ²»һÖÂ

¸ÃÐмÆÈëʧ°ÜÇ嵥

Êý¾ݼ¶

ͬһÔ˵¥ºÅÔÚÎļþÖÐÖظ´³öÏÖ

Öظ´ÐмÆÈëʧ°ÜÇ嵥

Êý¾ݼ¶

Ô˵¥ȱÉÙ˾»ú»ò³µÁ¾ÐÅϢ£¬Î޷¨¹éÅú

¸ÃÐмÆÈëʧ°ÜÇ嵥£¨ԭÒò£ºÎ޷¨¹éÅú£©

 

´¦ÀíԭÔò£ºÎļþ¼¶´íÎóÕûÌå¾ܾø£»Êý¾ݼ¶´íÎóÌ޳ýʧ°ÜÐкó¼ÌÐø´¦ÀíÓÐЧÐУ¬ÈÎÎñ״̬¼ÇΪ¡°ÒÑÍê³É·²¿·Öʧ°Ü¡±¡£

4.3 ÈÎÎñ

4.3.1 ÈÎÎñ״̬

´ý´¦Àí ¡ú ´¦ÀíÖÐ ¡ú ÒÑÍê³É          £¨ȫ²¿ÓÐЧÐгɹ¦£©

              ¡ú ÒÑÍê³É·²¿·Öʧ°Ü    £¨²¿·ÖÐÐʧ°ܣ¬¿ÉÏÂÔØʧ°ÜÇ嵥£©

              ¡ú ʧ°Ü              £¨ϵͳ¼¶´íÎóµ¼ÖÂÕûÌåδÉú³ÉÎļþ°ü£©

 

4.3.2 ÈÎÎñÁбí

×ֶÎ

˵Ã÷

ÈÎÎñ±àºÅ

ϵͳÉú³É

ԴÎļþÃû

Éϴ«µÄÇ嵥ÎļþÃû

Éϴ«ÈË / Éϴ«ʱ¼ä

¡ª

ÈÎÎñ״̬

´ý´¦Àí / ´¦ÀíÖÐ / ÒÑÍê³É / ÒÑÍê³É·²¿·Öʧ°Ü / ʧ°Ü

×ÜÐÐÊý / ³ɹ¦Êý / ʧ°ÜÊý

´¦Àí½ø¶ÈÓë½á¹ûͳ¼Æ

Íê³Éʱ¼ä

¡ª

²Ù×÷

ÏÂÔØÎļþ°ü£¨ÈÎÎñ³ɹ¦ºóÏÔʾ£©¡¢ÏÂÔØʧ°ÜÇ嵥£¨´æÔÚʧ°ÜÐÐʱÏÔʾ£¬xlsx£¬º¬ÐòºÅ/»õԴµ¥ºÅ/Ô˵¥ºÅ/ʧ°ÜԭÒò£©

 

4.4 Îļþ°üÉú³ɹæÔò

4.4.1 Åú´λ®·Ö

°´ÓÐЧÐÐÔ˵¥ÔÚϵͳÄÚµÄ ˾»úÐÕÃû + ˾»úÉí·Ý֤ºÅ + ³µÅƺÅ ÈýҪËعé×飬ÈýҪËØÍêȫһÖ¹éΪһÅú£¬ÿÅúÉú³Éһ¸öÎļþ°ü¡£ͬһ˾»ú»»³µ¡¢ͬһ³µÁ¾»»˾»ú¶¼»á²ð·ÖΪ²»ͬÅú´Ρ£

4.4.2 Ŀ¼½ṹÓëÃüÃû

Ô˵¥×ÊÁÏ_¡¾ÈÎÎñ±àºš¿.zip                            ¡û ÈÎÎñÏÂÔØ×ܰü

├─ ¡¾˾»úÐÕÃû¡¿-¡¾Éí·Ý֤ºš¿-¡¾³µÅƺš¿/              ¡û Åú´ÎÎļþ°ü¢Ù

│   ├─ 1-YD20260901001-HY202609001-º¬˾»ú¼°³µÁ¾֤¼þ/   ¡û Åú´ÎÄÚ×îСÐòºÅÔ˵¥°ü

│   │   ├─ ºÏͬ/£¨¸ÃÔ˵¥ȫ²¿ºÏͬÎļþ£©

│   │   ├─ µç×ӻص¥/£¨¸ÃÔ˵¥ȫ²¿֧¸¶¼Ç¼¶ÔӦ»ص¥£©

│   │   ├─ ˾»ú֤¼þ/£¨Éí·Ý֤¡¢¼Ýʻ֤¡¢´Óҵ×ʸñ֤µÈÕÕƬ£©

│   │   └─ ³µÁ¾֤¼þ/£¨ÐÐʻ֤¡¢µÀ·ÔËÊä֤µÈÕÕƬ£©

│   └─ 3-YD20260901003-HY202609001/                   ¡û Åú´ÎÄÚÆäÓàÔ˵¥°ü

│       ├─ ºÏͬ/

│       └─ µç×ӻص¥/

└─ ¡¾˾»úÐÕÃû¡¿-¡¾Éí·Ý֤ºš¿-¡¾³µÅƺš¿/              ¡û Åú´ÎÎļþ°ü¢Ú

    └─ 2-YD20260901002-HY202609002-º¬˾»ú¼°³µÁ¾֤¼þ/   ¡û µ¥Ô˵¥Åú´Σ¬ÈԺ¬֤¼þ

 

• ÈÎÎñÏÂÔØ×ܰüÃüÃû£ºÔ˵¥×ÊÁÏ_¡¾ÈÎÎñ±àºš¿.zip¡£

• Åú´ÎÎļþ°üÃüÃû£º¡¾˾»úÐÕÃû¡¿-¡¾Éí·Ý֤ºš¿-¡¾³µÅƺš¿¡£

• Ô˵¥°üÃüÃû£¨ÐèÇóÃ÷ȷ£©£º×îСÐòºÅÔ˵¥ ¡¾Ðòºš¿-¡¾Ô˵¥ºš¿-¡¾»õԴµ¥ºš¿-º¬˾»ú¼°³µÁ¾֤¼þ£»ÆäÓàÔ˵¥ ¡¾Ðòºš¿-¡¾Ô˵¥ºš¿-¡¾»õԴµ¥ºš¿¡£

• Ô˵¥°üÄڰ´ ºÏͬ / µç×ӻص¥ / ˾»ú֤¼þ / ³µÁ¾֤¼þ ½¨×ÓĿ¼£»Îļþ±£ÁôϵͳԭÎļþÃû£¬ÖØÃûʱ×Զ¯׷¼Ó (1)¡¢(2)¡£

4.4.3 ¸÷Ô˵¥°üÄÚÈÝ

ÄÚÈÝ

×îСÐòºÅÔ˵¥

ÆäÓàÔ˵¥

Êý¾ÝÀ´Դ

Ô˵¥Ïà¹غÏͬ

¡Ì

¡Ì

Ô˵¥¹ØÁªµĺÏͬ¸½¼þ£¨ÒÔÔ˵¥ÏêÇé-ºÏͬ¸½¼þΪ׼£¬º¬³ÐÔ˺Ïͬ£»²»º¬ίÍкÏͬ/¿ò¼ܺÏͬ£©

µç×ӻص¥

¡Ì

¡Ì

Ô˵¥ȫ²¿֧¸¶¼Ç¼¶ÔӦµÄÒøÐеç×ӻص¥

˾»ú֤¼þÕÕƬ

¡Ì

¡Á

¸ÃÔ˵¥˾»úµµ°¸£ºÉí·Ý֤£¨ÈËÏñÃæ/¹ú»ÕÃ棩¡¢¼Ýʻ֤¡¢´Óҵ×ʸñ֤µÈ

³µÁ¾֤¼þÕÕƬ

¡Ì

¡Á

¸ÃÔ˵¥³µÁ¾µµ°¸£ºÐÐʻ֤¡¢µÀ·ÔËÊä֤¡¢³µÁ¾ÕÕƬµÈ

 

֤¼þÕÕƬÒÔÅú´ÎÄÚ×îСÐòºÅÔ˵¥¹ÒÔصÄ˾»ú¡¢³µÁ¾µµ°¸Ϊ׼£¨ͬÅú´ÎÈýҪËØһÖ£¬֤¼þÏàͬ£¬¹ÊֻËæ×îСÐòºÅÔ˵¥µ¼³öһ·ݣ©¡£

4.4.4 Îļþȱʧ´¦Àí

• ijÔ˵¥Î޺Ïͬ»òÎ޵ç×ӻص¥£º²»×è¶ÏÈÎÎ񣬶ÔӦ×ÓĿ¼²»Éú³ɣ¬ԭÒò¼ÇÈëʧ°ÜÇ嵥£¨Èç¡°Î޵ç×ӻص¥£ºÔ˵¥ÎÞ֧¸¶¼Ç¼¡±£©¡£

• Åú´ÎÄÚ×îСÐòºÅÔ˵¥Òò¹ÊÌ޳ý£¨УÑéʧ°Ü/Îļþȱʧ£©£ºÖØÐ¼ÆËãÅú´ÎÄÚ×îСÐòºţ¬֤¼þÕÕƬ¸Ĺҵ½ÐµÄ×îСÐòºÅÔ˵¥¡£

• µ¥¸öÎļþÏÂÔØʧ°Ü×Զ¯ÖØÊÔ 3 ´Σ¬ÈÔʧ°ÜÔò¼ÇÈëʧ°ÜÇ嵥£¬²»×è¶ÏÆäÓàÎļþ¡£

4.5 ÏÂÔØ

• ÈÎÎñÍê³ɺó£¬ÈÎÎñÁбí¸ÃÐÐÏÔʾ¡°ÏÂÔØ¡±°´ť£¬ÏÂÔØÄÚÈÝΪÈÎÎñ×ܰü zip£¨º¬ȫ²¿Åú´ÎÎļþ°ü£©¡£

• ֧³ÖÖظ´ÏÂÔأ¬²»Öظ´Éú³ɡ£

• ÏÂÔØÐÐΪ¼Ç¼Éó¼ÆÈÕ־£¨²Ù×÷Èˡ¢ʱ¼䡢ÈÎÎñ±àºţ©¡ª¡ªÎļþ°üº¬Éí·Ý֤µÈÃô¸иöÈËÐÅϢ¡£

• °´Åú´ÎÎļþ°üµ¥¶ÀÏÂÔأº±¾Æڲ»×ö¡£

Î塢Éϴ«ʾÀýÓëÉú³ɽá¹û

Éϴ«Ç嵥£º

ÐòºÅ

»õԴµ¥ºÅ

Ô˵¥ºÅ

˾»ú£¨ϵͳÄڣ©

³µÅƣ¨ϵͳÄڣ©

1

HY202609001

YD20260901001

ÕÅÈý

ÍîA12345

2

HY202609002

YD20260901002

ÀîËÄ

ÍîB67890

3

HY202609001

YD20260901003

ÕÅÈý

ÍîA12345

 

Éú³ɽá¹û£º

• Åú´Î¢Ù = ÐòºÅ 1¡¢3£¨ÕÅÈý+ͬһÉí·Ý֤+ÍîA12345£©¡ú Îļþ°ü¡°ÕÅÈý-340102199001011234-ÍîA12345¡±£¬Äں¬Ô˵¥°ü 1-¡­-º¬˾»ú¼°³µÁ¾֤¼þ£¨ºÏͬ+»ص¥+ÕÅÈý֤¼þ+ÍîA12345 ֤¼þ£©ºÍ 3-¡­£¨½öºÏͬ+»ص¥£©¡£

• Åú´Î¢Ú = ÐòºÅ 2£¨ÀîËģ©¡ú Îļþ°ü¡°ÀîËÄ-340102199001015678-ÍîB67890¡±£¬Ô˵¥°ü 2-¡­-º¬˾»ú¼°³µÁ¾֤¼þ£¨µ¥Ô˵¥Åú´Σ¬ÈԺ¬˾»ú¼°³µÁ¾֤¼þ£©¡£

Áù¡¢Ò쳣Óë±߽糡¾°»ã×Ü

#

³¡¾°

´¦Àí

1

ģ°å¸ñʽ/ÁÐÃû´íÎó

Éϴ«¼´¾ܾø

2

ÐòºÅÖظ´¡¢·ÇÕýÕûÊý

Ðм¶ʧ°ÜÇ嵥

3

Ô˵¥ºŲ»´æÔÚ / »õԴµ¥ºŲ»ƥÅä

Ðм¶ʧ°ÜÇ嵥

4

Ô˵¥±»¹رա¢δ²úÉú֧¸¶¼Ç¼µ¼ÖÂÎ޵ç×ӻص¥

²»×è¶ϣ¬¼Çʧ°ÜÇ嵥

5

Ô˵¥ȱ˾»ú»ò³µÁ¾ÐÅϢÎ޷¨¹éÅú

Ðм¶ʧ°ÜÇ嵥

6

Åú´ÎÄÚ×îСÐòºÅÔ˵¥±»Ì޳ý

֤¼þ¸ĹÒÖØÐ¼ÆËãºóµÄ×îСÐòºÅÔ˵¥

7

ͬһÎļþÖظ´Éϴ«

ÔÊÐí£¬¸÷×ÔÉú³ɶÀÁ¢ÈÎÎ񣬲»ºϲ¢ȥÖØ

8

¶àÈÎÎ񲢷¢

ºǫ́ÅŶӴ¦Àí£¨²¢·¢ÉÏÏÞ 1~2£©£¬·À´ÅÅÌ/´ø¿íѹÁ¦

9

Îļþ°ü³¬¹ý±£ÁôÆÚ

²»¿ÉÏÂÔأ¬ÐèÖØÐÂÉϴ«Éú³É

10

ÈÎÎñ´¦ÀíÖÐϵͳÒ쳣

ÈÎÎñÖá°ʧ°Ü¡±£¬֧³Öɾ³ýºóÖØÐÂÉϴ«

 

Æߡ¢·ǹ¦ÄÜÐèÇó

Ïî

ҪÇó

Ò첽´¦Àí

´ò°üΪºǫ́Ò첽ÈÎÎñ£¬ÈÎÎñÁбí¿ɼû½ø¶ȣ¨³ɹ¦/ʧ°ÜÌõÊý£©£»Éϴ«ºóÎÞÐèµȴý

ÐÔÄÜ

1000 µ¥¹æģÈÎÎñ 30 ·ÖÖÓÄÚÍê³É

±£ÁôÆÚ

Éú³ɵÄÎļþ°üĬÈϱ£Áô 7 Ì죬¹ýÆÚ×Զ¯ÇåÀí

Ãô¸ÐÊý¾Ý

˾»úÉí·Ý֤ºš¢֤¼þÕÕƬÊôÃô¸иöÈËÐÅϢ£º²˵¥ÐèȨÏ޿ØÖơ¢ÏÂÔؼÇÉó¼ÆÈÕ־£»Åú´ΰüÃüÃûº¬ÍêÕûÉí·Ý֤ºţ¬°üÄÚÊý¾ݽöÏÞÊÚȨÈËԱ»ñȡ

ÃݵÈ

ͬһÈÎÎñÖظ´µã»÷ÏÂÔز»Öظ´Éú³ÉÎļþ°ü

 

°ˡ¢ȷÈϾöÒé¼Ç¼£¨2026-09-08£©

ԭ v0.1 ²ݸå 13 Ïî´ýȷÈÏÊÂÏ¾­ÐèÇó·½ȷÈÏȫ²¿²ÉÄÉÎĵµ½¨Ò鷽°¸£¬ÖðÏî¼Ç¼ÈçÏ£º

#

ÊÂÏî

ȷÈϽáÂÛ

1

²˵¥Ãû³ÆÓë¹ÒÔØλÖÃ

¡°Ô˵¥Îļþ°ü¡±£¬¹ÒÔÚÔ˵¥¹ÜÀíģ¿éÏÂ

2

¿ɼû½Çɫ/ȨÏÞ

ÔËӪÈËԱ

3

Åú´ÎÎļþ°üÃüÃû

˾»úÐÕÃû-Éí·Ý֤ºÅ-³µÅƺţ¨º¬ÍêÕûÉí·Ý֤ºţ©

4

Ô˵¥°üÄÚ×ÓĿ¼

°´ ºÏͬ/µç×ӻص¥/˾»ú֤¼þ/³µÁ¾֤¼þ ½¨×ÓĿ¼

5

¡°Ô˵¥Ïà¹غÏͬ¡±·¶Χ

ÒÔÔ˵¥ÏêÇé-ºÏͬ¸½¼þΪ׼£¨º¬³ÐÔ˺Ïͬ£©£¬²»º¬ίÍкÏͬ/¿ò¼ܺÏͬ

6

»õԴµ¥ºÅÓëϵͳ²»һÖÂʱ

¸ÃÐÐʧ°Ü

7

Êý¾ݼ¶УÑéʧ°ÜÐд¦Àí

Ì޳ýºó¼ÌÐø£¬ÈÎÎñ¼Ç¡°ÒÑÍê³É·²¿·Öʧ°Ü¡±

8

ʧ°ÜÐÐÌ޳ýºó֤¼þ¹ÒÔØ

¹ҵ½Åú´ÎÄÚʣÓàÔ˵¥µÄ×îСÐòºÅÔ˵¥

9

ÐÐÊý/´óСÉÏÏÞ

2000 ÐÐ / 10MB

10

Îļþ°ü±£ÁôÆÚ

7 Ìì

11

°´Åú´ΰüµ¥¶ÀÏÂÔØ

±¾Æڲ»×ö

12

zip ÊǷñ¼ÓÃÜ

²»¼ÓÃܣ¨ÒÀÀµȨÏÞ+Éó¼ƣ©

13

ÐòºÅΨһÐԷ¶Χ

ȫÎļþΨһ

 

¾š¢ÑéÊÕҪµã

1. Éϴ«ºϷ¨Ç嵥ºóÈÎÎ񴴽¨³ɹ¦£¬Íê³ɺó¿ÉÏÂÔØ zip£»zip ÄÚÅú´λ®·ÖÓëĿ¼ÃüÃû·ûºÏ 4.4 ¹æÔò¡£

2. ͬһÅú´ÎÄڽö×îСÐòºÅÔ˵¥°üº¬˾»ú¡¢³µÁ¾֤¼þÕÕƬ£¬ÆäÓàÔ˵¥½öº¬ºÏͬÓëµç×ӻص¥¡£

3. µ¥Ô˵¥Åú´εÄÔ˵¥°üÈ԰üº¬˾»ú¼°³µÁ¾֤¼þÕÕƬ¡£

4. ¸÷Àà·Ƿ¨Êý¾ݰ´ 4.2.2 ´¦Àí£¬ʧ°ÜÇ嵥ÄÚÈÝ׼ȷ¿ÉÏÂÔء£

5. ÈÎÎñʧ°ܡ¢²¿·Öʧ°ܡ¢Öظ´ÏÂÔء¢±£ÁôÆڹýÆڵȱ߽çÐÐΪ·ûºϵÚÎ塢ÁùÕ¶¨Ò塣

\ No newline at end of file diff --git a/output/docx_check/convert.ps1 b/output/docx_check/convert.ps1 new file mode 100644 index 0000000..c723bc5 --- /dev/null +++ b/output/docx_check/convert.ps1 @@ -0,0 +1,13 @@ +$ErrorActionPreference = 'Stop' +$word = New-Object -ComObject Word.Application +$word.Visible = $false +try { + $doc = $word.Documents.Open('E:\Desktop\xst_files\test\QaAutomationHub\output\docx_check\check.docx', $false, $true) + $pages = $doc.ComputeStatistics(2) + Write-Output "PAGES=$pages" + $doc.SaveAs2('E:\Desktop\xst_files\test\QaAutomationHub\output\docx_check\check.pdf', 17) + $doc.Close($false) + Write-Output 'PDF-OK' +} finally { + $word.Quit() +} diff --git a/output/docx_check/convert_html.ps1 b/output/docx_check/convert_html.ps1 new file mode 100644 index 0000000..da8f6ba --- /dev/null +++ b/output/docx_check/convert_html.ps1 @@ -0,0 +1,11 @@ +$ErrorActionPreference = 'Stop' +$word = New-Object -ComObject Word.Application +$word.Visible = $false +try { + $doc = $word.Documents.Open('E:\Desktop\xst_files\test\QaAutomationHub\output\docx_check\check.docx', $false, $true) + $doc.SaveAs2('E:\Desktop\xst_files\test\QaAutomationHub\output\docx_check\check_html.html', 10) + $doc.Close($false) + Write-Output 'HTML-OK' +} finally { + $word.Quit() +} diff --git a/output/excel_reports/运单资料文件包下载需求_测试用例.xlsx b/output/excel_reports/运单资料文件包下载需求_测试用例.xlsx new file mode 100644 index 0000000..f3fa5e4 Binary files /dev/null and b/output/excel_reports/运单资料文件包下载需求_测试用例.xlsx differ diff --git a/output/execution/运单资料文件包下载需求/appium_tests.py b/output/execution/运单资料文件包下载需求/appium_tests.py new file mode 100644 index 0000000..d033b3c --- /dev/null +++ b/output/execution/运单资料文件包下载需求/appium_tests.py @@ -0,0 +1,151 @@ +""" +Agentic QE Fleet — Appium 移动端自动化测试脚本 +需求: 运单资料文件包下载需求 +生成时间: 2026-09-08T08:11:23.806208+00:00 +目标平台: android, ios +对应测试用例: E:\Desktop\xst_files\test\QaAutomationHub\output\test_cases\运单资料文件包下载需求_测试用例.md +""" + +import time +from pathlib import Path +from datetime import datetime + +# Appium 客户端 (需要 pip install Appium-Python-Client) +try: + from appium import webdriver + from appium.options.android import UiAutomator2Options + from appium.options.ios import XCUITestOptions + APPIUM_AVAILABLE = True +except ImportError: + APPIUM_AVAILABLE = False + print("⚠️ Appium-Python-Client 未安装,请执行: pip install Appium-Python-Client") + +SCREENSHOTS_DIR = Path(r"E:\Desktop\xst_files\test\QaAutomationHub\output\screenshots\运单资料文件包下载需求") +SCREENSHOT_ON_FAILURE = True + +# Appium Server 配置 +APPIUM_HOST = "http://localhost:4723" + +# 设备配置模板(请根据实际测试设备修改) +ANDROID_CAPS = { + "platformName": "Android", + "automationName": "UiAutomator2", + "deviceName": "Android Emulator", + "appPackage": "com.example.app", # ⚠️ 修改为实际包名 + "appActivity": ".MainActivity", # ⚠️ 修改为实际 Activity + "noReset": True, + "newCommandTimeout": 120, +} + +IOS_CAPS = { + "platformName": "iOS", + "automationName": "XCUITest", + "deviceName": "iPhone 15", + "bundleId": "com.example.app", # ⚠️ 修改为实际 Bundle ID + "noReset": True, + "newCommandTimeout": 120, +} + + +def screenshot_path(name: str, platform: str) -> str: + SCREENSHOTS_DIR.mkdir(parents=True, exist_ok=True) + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + return str(SCREENSHOTS_DIR / f"{name}_{platform}_{ts}.png") + + +def run_android_test(): + """Android APP 自动化测试。""" + if not APPIUM_AVAILABLE: + print("❌ Appium 不可用,跳过 Android 测试") + return {"passed": 0, "failed": 0, "screenshots": [], "skipped": True} + + results = {"passed": 0, "failed": 0, "screenshots": [], "errors": []} + driver = None + + try: + options = UiAutomator2Options() + for key, value in ANDROID_CAPS.items(): + if key not in ("platformName", "automationName"): + setattr(options, key, value) + driver = webdriver.Remote(APPIUM_HOST, options=options) + print("✅ Android 设备已连接") + + # ── 自动生成测试步骤 ── + results["passed"] += 1 + + except Exception as exc: + results["failed"] += 1 + results["errors"].append(str(exc)) + if SCREENSHOT_ON_FAILURE and driver: + path = screenshot_path("failure", "android") + driver.save_screenshot(path) + results["screenshots"].append(path) + + finally: + if driver: + driver.quit() + + return results + + +def run_ios_test(): + """iOS APP 自动化测试。""" + if not APPIUM_AVAILABLE: + return {"passed": 0, "failed": 0, "screenshots": [], "skipped": True} + + results = {"passed": 0, "failed": 0, "screenshots": [], "errors": []} + driver = None + + try: + options = XCUITestOptions() + for key, value in IOS_CAPS.items(): + if key not in ("platformName", "automationName"): + setattr(options, key, value) + driver = webdriver.Remote(APPIUM_HOST, options=options) + print("✅ iOS 设备已连接") + + # ── iOS 测试步骤 (同 Android 逻辑,适配 XCTest) ── + results["passed"] += 1 + + except Exception as exc: + results["failed"] += 1 + results["errors"].append(str(exc)) + if SCREENSHOT_ON_FAILURE and driver: + path = screenshot_path("failure", "ios") + driver.save_screenshot(path) + results["screenshots"].append(path) + + finally: + if driver: + driver.quit() + + return results + + +def main(): + """主入口。""" + all_results = {} + for platform in ['android', 'ios']: + print(f"\n📱 启动平台: {platform}") + if platform == "android": + results = run_android_test() + elif platform == "ios": + results = run_ios_test() + else: + continue + all_results[platform] = results + if results.get("skipped"): + print(" ⏭️ 跳过(Appium 不可用)") + else: + print(f" ✅ {results['passed']} 通过, ❌ {results['failed']} 失败") + + total_passed = sum(r["passed"] for r in all_results.values()) + total_failed = sum(r["failed"] for r in all_results.values()) + total_screenshots = sum(len(r["screenshots"]) for r in all_results.values()) + print(f"\n🏁 移动端执行完成: 总通过 {total_passed}, 总失败 {total_failed}, 截图 {total_screenshots}") + + return all_results + + +if __name__ == "__main__": + main() diff --git a/output/execution/运单资料文件包下载需求/playwright_tests.py b/output/execution/运单资料文件包下载需求/playwright_tests.py new file mode 100644 index 0000000..67643e3 --- /dev/null +++ b/output/execution/运单资料文件包下载需求/playwright_tests.py @@ -0,0 +1,90 @@ +""" +Agentic QE Fleet — Playwright 自动化测试脚本 +需求: 运单资料文件包下载需求 +生成时间: 2026-09-08T08:11:23.805208+00:00 +目标浏览器: chromium, firefox, webkit +对应测试用例: E:\Desktop\xst_files\test\QaAutomationHub\output\test_cases\运单资料文件包下载需求_测试用例.md +用例数量: 0 +""" + +import asyncio +from pathlib import Path +from datetime import datetime + +from playwright.async_api import async_playwright + +SCREENSHOTS_DIR = Path(r"E:\Desktop\xst_files\test\QaAutomationHub\output\screenshots\运单资料文件包下载需求") +SCREENSHOT_ON_FAILURE = True +SCREENSHOT_ON_STEP = False +TIMEOUT = 120000 + + +def screenshot_path(name: str, browser: str) -> str: + """生成截图路径。""" + SCREENSHOTS_DIR.mkdir(parents=True, exist_ok=True) + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + return str(SCREENSHOTS_DIR / f"{name}_{browser}_{ts}.png") + + +async def run_test(browser_type: str, browser_name: str): + """执行单个浏览器的测试。""" + results = {"passed": 0, "failed": 0, "screenshots": [], "errors": []} + + async with async_playwright() as p: + browser_launcher = getattr(p, browser_type) + browser = await browser_launcher.launch(headless=True) + context = await browser.new_context( + viewport={"width": 1920, "height": 1080}, + locale="zh-CN", + ) + page = await context.new_page() + page.set_default_timeout(TIMEOUT) + + # ============================================================ + # 以下为测试用例骨架,请根据实际测试环境配置 BASE_URL 和测试数据 + # ============================================================ + BASE_URL = "http://localhost:3000" # ⚠️ 请修改为实际测试环境地址 + + try: + # ── 测试准备: 登录 ── + # await page.goto(f"{BASE_URL}/login") + # await page.screenshot(path=screenshot_path('01_login', browser_name)) + + # ── 从测试用例自动生成的测试步骤 ── + results["passed"] += 1 + + except Exception as exc: + results["failed"] += 1 + results["errors"].append(str(exc)) + if SCREENSHOT_ON_FAILURE: + path = screenshot_path('failure', browser_name) + await page.screenshot(path=path) + results["screenshots"].append(path) + print(f"📸 失败截图: {path}") + + finally: + await browser.close() + + return results + + +async def main(): + """主执行入口。""" + all_results = {} + for browser_type in ['chromium', 'firefox', 'webkit']: + print(f"\n🚀 启动浏览器: {browser_type}") + results = await run_test(browser_type, browser_type) + all_results[browser_type] = results + print(f" ✅ {results['passed']} 通过, ❌ {results['failed']} 失败") + + # 汇总 + total_passed = sum(r["passed"] for r in all_results.values()) + total_failed = sum(r["failed"] for r in all_results.values()) + total_screenshots = sum(len(r["screenshots"]) for r in all_results.values()) + print(f"\n🏁 执行完成: 总通过 {{total_passed}}, 总失败 {{total_failed}}, 截图 {{total_screenshots}}") + + return all_results + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/output/execution/运单资料文件包下载需求_执行报告.md b/output/execution/运单资料文件包下载需求_执行报告.md new file mode 100644 index 0000000..e30c3e7 --- /dev/null +++ b/output/execution/运单资料文件包下载需求_执行报告.md @@ -0,0 +1,161 @@ +# 运单资料文件包下载需求 自动化测试执行报告 + +> 生成时间: 2026-09-08T08:11:23.806208+00:00 +> 生成引擎: Agentic QE Fleet v2.1.0 — Execute 战区 + +--- + +## 📊 执行概览 + +| 指标 | 值 | +| :--- | :--- | +| 测试用例总数 | 0 | +| P0 用例 | 0 | +| P1 用例 | 0 | +| 执行平台 | PC Web (Playwright) + 移动端 (Appium) | +| 目标浏览器 | Chromium / Firefox / WebKit | +| 目标移动端 | Android / iOS | + +--- + +## 🖥️ PC Web 自动化测试 + +**测试脚本**: `E:\Desktop\xst_files\test\QaAutomationHub\output\execution\运单资料文件包下载需求\playwright_tests.py` + +### 执行方式 + +```bash +# 安装 Playwright +pip install playwright +playwright install chromium firefox webkit + +# 运行测试 +python E:\Desktop\xst_files\test\QaAutomationHub\output\execution\运单资料文件包下载需求\playwright_tests.py +``` + +### 执行内容 + +Playwright 脚本会自动: +1. 启动目标浏览器(Chromium/Firefox/WebKit) +2. 按测试用例中的 P0/P1 场景逐步骤执行 +3. 每步/失败时自动截图 → `output/screenshots/{BASE_NAME}/` +4. 超时自动重试(默认 1 次) +5. 汇总通过/失败数 + +### 截图策略 + +| 策略 | 配置 | +| :--- | :--- | +| 每步截图 | `screenshot_on_step: false`(默认关闭,减少截图量)| +| 失败截图 | `screenshot_on_failure: true`(默认开启)| +| 截图目录 | `E:\Desktop\xst_files\test\QaAutomationHub\output\screenshots\运单资料文件包下载需求` | + +--- + +## 📱 移动端 APP 自动化测试 + +**测试脚本**: `E:\Desktop\xst_files\test\QaAutomationHub\output\execution\运单资料文件包下载需求\appium_tests.py` + +### 前置依赖 + +```bash +# 安装 Appium +npm install -g appium +appium driver install uiautomator2 # Android +appium driver install xcuitest # iOS + +# 安装 Python 客户端 +pip install Appium-Python-Client + +# 启动 Appium Server +appium & + +# 运行测试 +python E:\Desktop\xst_files\test\QaAutomationHub\output\execution\运单资料文件包下载需求\appium_tests.py +``` + +### 设备配置 + +执行前需要修改脚本中的设备配置: +- **Android**: `appPackage` / `appActivity` +- **iOS**: `bundleId` +- **Appium Server**: `APPIUM_HOST` + +--- + +## 📸 截图证据 + +所有截图统一存放在: `E:\Desktop\xst_files\test\QaAutomationHub\output\screenshots\运单资料文件包下载需求` + +截图命名规则: `{用例编号}_{浏览器/平台}_{时间戳}.png` + +| 截图类型 | 触发条件 | 命名示例 | +| :--- | :--- | :--- | +| 步骤截图 | `screenshot_on_step: true` | `TC-001_chromium_20260709_143025.png` | +| 失败截图 | 断言/异常 | `failure_android_20260709_143025.png` | +| 自定义截图 | 用例中显式调用 | 自定义名称 | + +--- + +## 🧪 测试结论模板 + +(执行后自动填充) + +```markdown +## 测试结论 + +### 执行摘要 +- 执行时间: YYYY-MM-DD HH:MM +- 执行人: [执行人] +- 测试环境: [环境地址] + +### 结果统计 +| 平台 | 总用例 | 通过 | 失败 | 跳过 | 通过率 | +| :--- | :---: | :---: | :---: | :---: | :---: | +| PC Chromium | N | N | N | N | X% | +| PC Firefox | N | N | N | N | X% | +| PC WebKit | N | N | N | N | X% | +| Android APP | N | N | N | N | X% | +| iOS APP | N | N | N | N | X% | + +### 失败用例明细 +| 用例编号 | 平台 | 失败原因 | 截图 | 分类 | +| :--- | :--- | :--- | :--- | :--- | + +### AI 视觉验证结果 +(由 result-reporter Agent 自动比对截图与预期) +| 截图 | 基准 | 差异度 | 判定 | +| :--- | :--- | :---: | :---: | + +### 整体结论 +- [ ] 通过 — 所有 P0/P1 用例通过,截图无异常 +- [ ] 有条件通过 — 存在非阻断性问题,详见失败明细 +- [ ] 不通过 — 存在阻断性缺陷 +``` + +--- + +## 🔄 AI 视觉验证 (result-reporter Agent) + +Execute 战区的 result-reporter Agent 提供 AI 驱动的截图对比能力: + +1. **截图采集**: 执行过程中自动采集截图 +2. **基准对比**: 与预期效果图/上次通过的截图对比 +3. **差异检测**: AI 识别 UI 布局、文字、颜色等差异 +4. **结论生成**: 综合通过率和截图对比 → 输出测试结论 + +### 使用方式 + +```text +# 在 CLI 中运行 Execute 战区 +/qe-fleet execute source_docs/requirements_raw/{需求}.docx + +# 或查看执行报告 +/qe-fleet status source_docs/requirements_raw/{需求}.docx +``` + +--- + +> ⚠️ **重要提示**: 本报告由 Agentic QE Fleet 自动生成。 +> 测试脚本为骨架代码,需要根据实际测试环境配置 BASE_URL、测试账号、设备信息等参数。 +> 执行前请确认 Playwright/Appium 环境已正确安装配置。 diff --git a/output/make_docx_waybill_package.js b/output/make_docx_waybill_package.js new file mode 100644 index 0000000..0a06347 --- /dev/null +++ b/output/make_docx_waybill_package.js @@ -0,0 +1,377 @@ +// 生成《运单资料文件包下载需求文档》Word 版 +const fs = require("fs"); +const path = require("path"); +const { + Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, + WidthType, AlignmentType, HeadingLevel, ShadingType, BorderStyle, + LevelFormat, VerticalAlign, Footer, PageNumber, +} = require("docx"); + +const FONT_BODY = { ascii: "Times New Roman", hAnsi: "Times New Roman", eastAsia: "宋体" }; +const FONT_HEAD = { ascii: "Arial", hAnsi: "Arial", eastAsia: "黑体" }; +const FONT_MONO = { ascii: "Consolas", hAnsi: "Consolas", eastAsia: "宋体" }; + +const T = (t, o = {}) => new TextRun({ text: t, ...o }); +const B = (t, o = {}) => new TextRun({ text: t, bold: true, ...o }); + +function para(children, opts = {}) { + return new Paragraph({ spacing: { after: 140, line: 312 }, children: Array.isArray(children) ? children : [T(children)], ...opts }); +} +function bullet(children) { + return new Paragraph({ numbering: { reference: "bul", level: 0 }, spacing: { after: 80, line: 300 }, children: Array.isArray(children) ? children : [T(children)] }); +} +function numItem(children) { + return new Paragraph({ numbering: { reference: "num", level: 0 }, spacing: { after: 80, line: 300 }, children: Array.isArray(children) ? children : [T(children)] }); +} +const h1 = (t) => new Paragraph({ heading: HeadingLevel.HEADING_1, children: [T(t)] }); +const h2 = (t) => new Paragraph({ heading: HeadingLevel.HEADING_2, children: [T(t)] }); +const h3 = (t) => new Paragraph({ heading: HeadingLevel.HEADING_3, children: [T(t)] }); +const spacer = (after = 120) => new Paragraph({ spacing: { after }, children: [] }); + +function noteP(children) { + return new Paragraph({ + spacing: { after: 160, line: 300 }, indent: { left: 200 }, + shading: { type: ShadingType.CLEAR, fill: "F0F7FF" }, + border: { left: { style: BorderStyle.SINGLE, size: 18, color: "1677FF", space: 6 } }, + children: Array.isArray(children) ? children : [T(children)], + }); +} + +function monoBlock(lines) { + return lines.map((l) => new Paragraph({ + spacing: { after: 0, line: 264 }, indent: { left: 240, right: 240 }, + shading: { type: ShadingType.CLEAR, fill: "F7F7F7" }, + children: [new TextRun({ text: l, font: FONT_MONO, size: 17 })], + })).concat([spacer(140)]); +} + +function makeTable(headers, rows, widths, { size = 18, centerCols = [] } = {}) { + const cellPara = (txt, center, bold, fsize) => new Paragraph({ + alignment: center ? AlignmentType.CENTER : AlignmentType.LEFT, + spacing: { after: 0, line: 264 }, + children: [new TextRun({ text: txt, bold, size: fsize })], + }); + const headerRow = new TableRow({ + tableHeader: true, + children: headers.map((h, i) => new TableCell({ + width: { size: widths[i], type: WidthType.DXA }, + shading: { type: ShadingType.CLEAR, fill: "DCE6F1" }, + verticalAlign: VerticalAlign.CENTER, + margins: { top: 70, bottom: 70, left: 110, right: 110 }, + children: [cellPara(h, true, true, size)], + })), + }); + const bodyRows = rows.map((r) => new TableRow({ + children: r.map((c, i) => new TableCell({ + width: { size: widths[i], type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + margins: { top: 60, bottom: 60, left: 110, right: 110 }, + children: (Array.isArray(c) ? c : [String(c)]).map((line) => cellPara(line, centerCols.includes(i), false, size)), + })), + })); + return new Table({ + width: { size: widths.reduce((a, b) => a + b, 0), type: WidthType.DXA }, + columnWidths: widths, + rows: [headerRow, ...bodyRows], + }); +} + +const kids = []; + +// ── 标题区 ── +kids.push(new Paragraph({ + alignment: AlignmentType.CENTER, spacing: { before: 200, after: 80 }, + children: [new TextRun({ text: "运单资料文件包下载 需求文档", bold: true, size: 36, font: FONT_HEAD, color: "1F3864" })], +})); +kids.push(new Paragraph({ + alignment: AlignmentType.CENTER, spacing: { after: 60 }, + children: [new TextRun({ text: "版本 v1.0(定稿) · 运八平台端 · 2026-09-08", size: 18, color: "888888" })], +})); +kids.push(new Paragraph({ spacing: { after: 240 }, border: { bottom: { style: BorderStyle.SINGLE, size: 8, color: "1677FF", space: 4 } }, children: [] })); + +// ── 文档信息 ── +kids.push(makeTable( + ["项", "内容"], + [ + ["功能名称", "运单资料文件包下载(新增菜单)"], + ["所属端", "运八平台端(Web 管理后台)"], + ["版本", "v1.0(定稿)"], + ["编写日期", "2026-09-08"], + ["确认记录", "2026-09-08 需求方确认,13 项待确认事项全部采纳本文档建议方案(见第八章)"], + ["需求来源", "运营口头需求(2026-09-08),本文档为整理稿"], + ["关联术语", "以 knowledge_base/01_standards/terminology.md 为准"], + ["原型", "resources/prototypes/anhuibaba_file_package.html(静态演示:任务列表 / 上传弹窗 / 文件包结构预览 / 失败清单)"], + ], + [1800, 7226] +)); +kids.push(spacer()); + +// ── 一、需求背景与目标 ── +kids.push(h1("一、需求背景与目标")); +kids.push(para("运营人员在线下归档、审计、对账等场景中,需要按批次收集运单资料:运单合同、电子回单,以及司机证件照片、车辆证件照片。目前只能逐单进入运单详情手工下载整理,效率低且易遗漏。")); +kids.push(para([B("目标:"), T("提供一个“上传运单清单 → 系统自动生成资料文件包 → 任务完成后下载”的批量导出能力,按“司机+身份证+车辆”自动归批,资料按运单分目录组织、按规则命名,一次下载即可获得全部资料。")])); +kids.push(para([B("本期范围:"), T("仅做资料导出打包;不新增数据采集,合同、电子回单、司机证件、车辆证件均读取运八平台现有数据。")])); + +// ── 二、名词定义 ── +kids.push(h1("二、名词定义")); +kids.push(makeTable( + ["术语", "定义"], + [ + ["批次", "上传清单中,运单在系统内的 司机姓名 + 司机身份证号 + 车牌号 三要素完全一致的一组运单。"], + ["文件包(批次包)", "一个批次生成的目录,内含该批次全部运单的运单包。"], + ["运单包", "批次包下按运单维度建立的子目录,内含该运单的合同、电子回单及(仅最小序号运单)司机、车辆证件照片。"], + ["最小序号运单", "同一批次内,上传清单中“序号”最小的运单。该运单的运单包额外包含司机证件照片、车辆证件照片。"], + ], + [1900, 7126] +)); +kids.push(spacer()); + +// ── 三、整体流程 ── +kids.push(h1("三、整体流程")); +kids.push(...monoBlock([ + "运营人员 系统", + " │ ① 下载模板,填写运单清单并上传 │", + " │ ────────────────────────────────────→ │ ② 校验模板与数据(见 4.2.2)", + " │ │ ③ 创建打包任务(待处理 → 处理中)", + " │ ④ 任务列表查看处理进度 │ ④ 按批次分组 → 逐运单下载关联文件 → 组装文件包", + " │ ←──────────────────────────────────── │ ⑤ 任务完成(已完成 / 已完成·部分失败 / 失败)", + " │ ⑥ 点击“下载”获取文件包 zip │", + " │ ←──────────────────────────────────── │ ⑦ 返回 zip,记录下载审计日志", +])); +kids.push(para([T("核心规则:", { bold: true }), B("司机+身份证+车辆算一批运单,生成一个文件包"), T(";文件包内按运单建运单包;批次内"), B("最小序号"), T("的运单包额外含司机及车辆证件照片,其余运单包只含合同与电子回单。")])); + +// ── 四、功能需求 ── +kids.push(h1("四、功能需求")); + +kids.push(h2("4.1 菜单入口")); +kids.push(bullet([T("运八平台端新增独立菜单,菜单名称 "), B("“运单文件包”"), T(",挂在运单管理相关模块下。")])); +kids.push(bullet("页面结构:上方“上传任务”入口(模板下载 + 上传按钮),下方“任务列表”。")); +kids.push(bullet([T("可见角色:"), B("运营人员"), T(";菜单需权限控制——文件包含身份证等敏感证件照片。")])); + +kids.push(h2("4.2 文件上传")); +kids.push(h3("4.2.1 上传模板")); +kids.push(makeTable( + ["列名", "类型", "必填", "说明"], + [ + ["序号", "整数", "是", "正整数,全文件内唯一;决定批次内“最小序号运单”的判定"], + ["货源单号", "文本", "是", "系统内货源单号"], + ["运单号", "文本", "是", "系统内运单号"], + ], + [1300, 1100, 700, 5926], + { centerCols: [1, 2] } +)); +kids.push(spacer(80)); +kids.push(bullet([T("文件格式:"), B(".xlsx"), T(";页面提供模板下载。")])); +kids.push(bullet([T("限制:单文件行数上限 "), B("2000 行"), T(";文件大小上限 "), B("10MB"), T("。")])); + +kids.push(h3("4.2.2 校验规则")); +kids.push(makeTable( + ["级别", "规则", "处理方式"], + [ + ["文件级", "非 xlsx 格式 / 列名缺失或不符 / 文件损坏", "上传即拒绝,提示具体原因,不创建任务"], + ["文件级", "行数、大小超上限", "上传即拒绝"], + ["数据级", "序号非正整数或重复", "该行计入失败清单"], + ["数据级", "货源单号 / 运单号为空", "该行计入失败清单"], + ["数据级", "运单号在系统中不存在", "该行计入失败清单"], + ["数据级", "文件中货源单号与该运单实际所属货源不一致", "该行计入失败清单"], + ["数据级", "同一运单号在文件中重复出现", "重复行计入失败清单"], + ["数据级", "运单缺少司机或车辆信息,无法归批", "该行计入失败清单(原因:无法归批)"], + ], + [900, 4400, 3726], + { centerCols: [0] } +)); +kids.push(spacer(80)); +kids.push(noteP([B("处理原则:"), T("文件级错误整体拒绝;数据级错误剔除失败行后继续处理有效行,任务状态记为“已完成·部分失败”。")])); + +kids.push(h2("4.3 任务")); +kids.push(h3("4.3.1 任务状态")); +kids.push(...monoBlock([ + "待处理 → 处理中 → 已完成 (全部有效行成功)", + " → 已完成·部分失败 (部分行失败,可下载失败清单)", + " → 失败 (系统级错误导致整体未生成文件包)", +])); +kids.push(h3("4.3.2 任务列表")); +kids.push(makeTable( + ["字段", "说明"], + [ + ["任务编号", "系统生成"], + ["源文件名", "上传的清单文件名"], + ["上传人 / 上传时间", "—"], + ["任务状态", "待处理 / 处理中 / 已完成 / 已完成·部分失败 / 失败"], + ["总行数 / 成功数 / 失败数", "处理进度与结果统计"], + ["完成时间", "—"], + ["操作", "下载文件包(任务成功后显示)、下载失败清单(存在失败行时显示,xlsx,含序号/货源单号/运单号/失败原因)"], + ], + [2500, 6526] +)); +kids.push(spacer()); + +kids.push(h2("4.4 文件包生成规则")); +kids.push(h3("4.4.1 批次划分")); +kids.push(para([T("按有效行运单在"), B("系统内"), T("的 司机姓名 + 司机身份证号 + 车牌号 三要素归组,三要素完全一致归为一批,每批生成一个文件包。同一司机换车、同一车辆换司机都会拆分为不同批次。")])); +kids.push(h3("4.4.2 目录结构与命名")); +kids.push(...monoBlock([ + "运单资料_【任务编号】.zip ← 任务下载总包", + "├─ 【司机姓名】-【身份证号】-【车牌号】/ ← 批次文件包①", + "│ ├─ 1-YD20260901001-HY202609001-含司机及车辆证件/ ← 批次内最小序号运单包", + "│ │ ├─ 合同/(该运单全部合同文件)", + "│ │ ├─ 电子回单/(该运单全部支付记录对应回单)", + "│ │ ├─ 司机证件/(身份证、驾驶证、从业资格证等照片)", + "│ │ └─ 车辆证件/(行驶证、道路运输证等照片)", + "│ └─ 3-YD20260901003-HY202609001/ ← 批次内其余运单包", + "│ ├─ 合同/", + "│ └─ 电子回单/", + "└─ 【司机姓名】-【身份证号】-【车牌号】/ ← 批次文件包②", + " └─ 2-YD20260901002-HY202609002-含司机及车辆证件/ ← 单运单批次,仍含证件", +])); +kids.push(bullet([T("任务下载总包命名:"), B("运单资料_【任务编号】.zip"), T("。")])); +kids.push(bullet([T("批次文件包命名:"), B("【司机姓名】-【身份证号】-【车牌号】"), T("。")])); +kids.push(bullet([T("运单包命名(需求明确):最小序号运单 "), B("【序号】-【运单号】-【货源单号】-含司机及车辆证件"), T(";其余运单 "), B("【序号】-【运单号】-【货源单号】"), T("。")])); +kids.push(bullet("运单包内按 合同 / 电子回单 / 司机证件 / 车辆证件 建子目录;文件保留系统原文件名,重名时自动追加 (1)、(2)。")); +kids.push(h3("4.4.3 各运单包内容")); +kids.push(makeTable( + ["内容", "最小序号运单", "其余运单", "数据来源"], + [ + ["运单相关合同", "√", "√", "运单关联的合同附件(以运单详情-合同附件为准,含承运合同;不含委托合同/框架合同)"], + ["电子回单", "√", "√", "运单全部支付记录对应的银行电子回单"], + ["司机证件照片", "√", "×", "该运单司机档案:身份证(人像面/国徽面)、驾驶证、从业资格证等"], + ["车辆证件照片", "√", "×", "该运单车辆档案:行驶证、道路运输证、车辆照片等"], + ], + [1700, 1400, 1200, 4726], + { centerCols: [1, 2] } +)); +kids.push(spacer(80)); +kids.push(noteP("证件照片以批次内最小序号运单挂载的司机、车辆档案为准(同批次三要素一致,证件相同,故只随最小序号运单导出一份)。")); +kids.push(h3("4.4.4 文件缺失处理")); +kids.push(bullet("某运单无合同或无电子回单:不阻断任务,对应子目录不生成,原因记入失败清单(如“无电子回单:运单无支付记录”)。")); +kids.push(bullet([T("批次内最小序号运单因故剔除(校验失败/文件缺失):"), B("重新计算"), T("批次内最小序号,证件照片改挂到新的最小序号运单。")])); +kids.push(bullet("单个文件下载失败自动重试 3 次,仍失败则记入失败清单,不阻断其余文件。")); + +kids.push(h2("4.5 下载")); +kids.push(bullet("任务完成后,任务列表该行显示“下载”按钮,下载内容为任务总包 zip(含全部批次文件包)。")); +kids.push(bullet("支持重复下载,不重复生成。")); +kids.push(bullet("下载行为记录审计日志(操作人、时间、任务编号)——文件包含身份证等敏感个人信息。")); +kids.push(bullet("按批次文件包单独下载:本期不做。")); + +// ── 五、上传示例与生成结果 ── +kids.push(h1("五、上传示例与生成结果")); +kids.push(para([B("上传清单:")])); +kids.push(makeTable( + ["序号", "货源单号", "运单号", "司机(系统内)", "车牌(系统内)"], + [ + ["1", "HY202609001", "YD20260901001", "张三", "皖A12345"], + ["2", "HY202609002", "YD20260901002", "李四", "皖B67890"], + ["3", "HY202609001", "YD20260901003", "张三", "皖A12345"], + ], + [800, 2000, 2400, 1900, 1926], + { centerCols: [0, 3, 4] } +)); +kids.push(spacer(80)); +kids.push(para([B("生成结果:")])); +kids.push(bullet([T("批次① = 序号 1、3(张三+同一身份证+皖A12345)→ 文件包“张三-340102199001011234-皖A12345”,内含运单包 "), B("1-…-含司机及车辆证件"), T("(合同+回单+张三证件+皖A12345 证件)和 "), B("3-…"), T("(仅合同+回单)。")])); +kids.push(bullet([T("批次② = 序号 2(李四)→ 文件包“李四-340102199001015678-皖B67890”,运单包 "), B("2-…-含司机及车辆证件"), T("(单运单批次,仍含司机及车辆证件)。")])); + +// ── 六、异常与边界场景汇总 ── +kids.push(h1("六、异常与边界场景汇总")); +kids.push(makeTable( + ["#", "场景", "处理"], + [ + ["1", "模板格式/列名错误", "上传即拒绝"], + ["2", "序号重复、非正整数", "行级失败清单"], + ["3", "运单号不存在 / 货源单号不匹配", "行级失败清单"], + ["4", "运单被关闭、未产生支付记录导致无电子回单", "不阻断,记失败清单"], + ["5", "运单缺司机或车辆信息无法归批", "行级失败清单"], + ["6", "批次内最小序号运单被剔除", "证件改挂重新计算后的最小序号运单"], + ["7", "同一文件重复上传", "允许,各自生成独立任务,不合并去重"], + ["8", "多任务并发", "后台排队处理(并发上限 1~2),防磁盘/带宽压力"], + ["9", "文件包超过保留期", "不可下载,需重新上传生成"], + ["10", "任务处理中系统异常", "任务置“失败”,支持删除后重新上传"], + ], + [500, 3900, 4626], + { centerCols: [0] } +)); +kids.push(spacer()); + +// ── 七、非功能需求 ── +kids.push(h1("七、非功能需求")); +kids.push(makeTable( + ["项", "要求"], + [ + ["异步处理", "打包为后台异步任务,任务列表可见进度(成功/失败条数);上传后无需等待"], + ["性能", "1000 单规模任务 30 分钟内完成"], + ["保留期", "生成的文件包默认保留 7 天,过期自动清理"], + ["敏感数据", "司机身份证号、证件照片属敏感个人信息:菜单需权限控制、下载记审计日志;批次包命名含完整身份证号,包内数据仅限授权人员获取"], + ["幂等", "同一任务重复点击下载不重复生成文件包"], + ], + [1600, 7426] +)); +kids.push(spacer()); + +// ── 八、确认决议记录 ── +kids.push(h1("八、确认决议记录(2026-09-08)")); +kids.push(para([T("原 v0.1 草稿 13 项待确认事项,经需求方确认"), B("全部采纳文档建议方案"), T(",逐项记录如下:")])); +kids.push(makeTable( + ["#", "事项", "确认结论"], + [ + ["1", "菜单名称与挂载位置", "“运单文件包”,挂在运单管理模块下"], + ["2", "可见角色/权限", "运营人员"], + ["3", "批次文件包命名", "司机姓名-身份证号-车牌号(含完整身份证号)"], + ["4", "运单包内子目录", "按 合同/电子回单/司机证件/车辆证件 建子目录"], + ["5", "“运单相关合同”范围", "以运单详情-合同附件为准(含承运合同),不含委托合同/框架合同"], + ["6", "货源单号与系统不一致时", "该行失败"], + ["7", "数据级校验失败行处理", "剔除后继续,任务记“已完成·部分失败”"], + ["8", "失败行剔除后证件挂载", "挂到批次内剩余运单的最小序号运单"], + ["9", "行数/大小上限", "2000 行 / 10MB"], + ["10", "文件包保留期", "7 天"], + ["11", "按批次包单独下载", "本期不做"], + ["12", "zip 是否加密", "不加密(依赖权限+审计)"], + ["13", "序号唯一性范围", "全文件唯一"], + ], + [500, 2800, 5726], + { centerCols: [0] } +)); +kids.push(spacer()); + +// ── 九、验收要点 ── +kids.push(h1("九、验收要点")); +kids.push(numItem("上传合法清单后任务创建成功,完成后可下载 zip;zip 内批次划分与目录命名符合 4.4 规则。")); +kids.push(numItem("同一批次内仅最小序号运单包含司机、车辆证件照片,其余运单仅含合同与电子回单。")); +kids.push(numItem("单运单批次的运单包仍包含司机及车辆证件照片。")); +kids.push(numItem("各类非法数据按 4.2.2 处理,失败清单内容准确可下载。")); +kids.push(numItem("任务失败、部分失败、重复下载、保留期过期等边界行为符合第五、六章定义。")); + +// ── 组装文档 ── +const doc = new Document({ + styles: { + default: { + document: { run: { font: FONT_BODY, size: 21, color: "333333" } }, + heading1: { run: { font: FONT_HEAD, size: 30, bold: true, color: "1F3864" }, paragraph: { spacing: { before: 360, after: 180 } } }, + heading2: { run: { font: FONT_HEAD, size: 25, bold: true, color: "2E5395" }, paragraph: { spacing: { before: 280, after: 140 } } }, + heading3: { run: { font: FONT_HEAD, size: 22, bold: true, color: "404040" }, paragraph: { spacing: { before: 240, after: 120 } } }, + }, + }, + numbering: { + config: [ + { reference: "bul", levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 420, hanging: 210 } } } }] }, + { reference: "num", levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 420, hanging: 210 } } } }] }, + ], + }, + sections: [{ + properties: { page: { margin: { top: 1440, bottom: 1440, left: 1440, right: 1440 } } }, + footers: { + default: new Footer({ + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ children: ["第 ", PageNumber.CURRENT, " 页 / 共 ", PageNumber.TOTAL_PAGES, " 页"], size: 16, color: "999999" })], + })], + }), + }, + children: kids, + }], +}); + +const out = path.resolve(__dirname, "..", "requirements", "运单资料文件包下载需求.docx"); +Packer.toBuffer(doc).then((buf) => { + fs.writeFileSync(out, buf); + console.log("OK ->", out, buf.length, "bytes"); +}); diff --git a/output/manifests/运单资料文件包下载需求.json b/output/manifests/运单资料文件包下载需求.json new file mode 100644 index 0000000..4b99b30 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求.json @@ -0,0 +1,553 @@ +{ + "_meta": { + "base_name": "运单资料文件包下载需求", + "merged_zones": [ + "prepare", + "analyze", + "design", + "execute", + "review", + "monitor" + ], + "merged_at": "2026-09-08T08:11:23.813211+00:00", + "updated_at": "2026-09-08T08:11:23.813211+00:00" + }, + "prepare": { + "base_name": "运单资料文件包下载需求", + "requirement_source_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "requirement_input_type": "md", + "normalized_requirement_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求\\requirement.md", + "normalized_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求", + "technical_solution_files": [], + "normalized_technical_solution_files": [], + "project_profile_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\00_project\\project_profile.md", + "document_confidence": { + "requirement": 1.0, + "issues": [] + }, + "activated_knowledge": { + "terminology": { + "permanent": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md" + ], + "optional": [] + }, + "semantic_matches": [] + }, + "knowledge_gaps": [ + { + "category": "history", + "suggestion": "未激活任何历史缺陷/易漏场景,建议补充相关知识库条目" + }, + { + "category": "best_practice", + "suggestion": "未激活任何最佳实践范例,建议补充同类型需求的优秀用例" + } + ], + "attached_source_files": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + } + ], + "sources_registry": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "type": "primary_requirement", + "role": "business_background", + "format": "md", + "authority": "primary" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "attached_project_file", + "role": "ui_prototype", + "format": "html", + "authority": "reference", + "exists": "true" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "attached_project_file", + "role": "reference", + "format": "md", + "authority": "reference", + "exists": "true" + } + ], + "agent_notes": { + "document-parser": "解析完成,置信度 100%", + "knowledge-activator": "激活 1 常驻 + 0 可选术语" + }, + "_meta": { + "zone": "prepare", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.770287+00:00", + "status": "completed" + } + }, + "base_name": "运单资料文件包下载需求", + "requirement_source_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "requirement_input_type": "md", + "normalized_requirement_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求\\requirement.md", + "normalized_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求", + "technical_solution_files": [], + "normalized_technical_solution_files": [], + "project_profile_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\00_project\\project_profile.md", + "document_confidence": { + "requirement": 1.0, + "issues": [] + }, + "activated_knowledge": { + "terminology": { + "permanent": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md" + ], + "optional": [] + }, + "semantic_matches": [] + }, + "knowledge_gaps": [ + { + "category": "history", + "suggestion": "未激活任何历史缺陷/易漏场景,建议补充相关知识库条目" + }, + { + "category": "best_practice", + "suggestion": "未激活任何最佳实践范例,建议补充同类型需求的优秀用例" + } + ], + "attached_source_files": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + } + ], + "sources_registry": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "type": "primary_requirement", + "role": "business_background", + "format": "md", + "authority": "primary" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "attached_project_file", + "role": "ui_prototype", + "format": "html", + "authority": "reference", + "exists": "true" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "attached_project_file", + "role": "reference", + "format": "md", + "authority": "reference", + "exists": "true" + } + ], + "agent_notes": { + "execution-analyst": "等待测试结果输入", + "knowledge-curator": "等待执行分析结果" + }, + "analyze": { + "base_name": "运单资料文件包下载需求", + "analysis_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_分析.md", + "relation_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_关联与冲突.md", + "risk_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_风险评估.md", + "related_requirements": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.docx", + "similarity": 0.833565 + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\安徽运八需求.md", + "similarity": 0.10511 + } + ], + "conflict_candidates_count": 0, + "conflict_summary": {}, + "risk_matrix": { + "risks": [ + { + "id": "RISK-AVAILABILITY", + "category": "可用性", + "keywords_matched": [ + "并发", + "重试", + "幂等" + ], + "likelihood": 3, + "impact": 4, + "score": 12, + "level": "P1", + "conflict_amplified": false + }, + { + "id": "RISK-FINANCIAL", + "category": "资损", + "keywords_matched": [ + "支付" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPLIANCE", + "category": "合规", + "keywords_matched": [ + "加密" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-DATA", + "category": "数据", + "keywords_matched": [ + "删除" + ], + "likelihood": 1, + "impact": 4, + "score": 4, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPATIBILITY", + "category": "兼容性", + "keywords_matched": [ + "版本" + ], + "likelihood": 1, + "impact": 3, + "score": 3, + "level": "P2", + "conflict_amplified": false + } + ], + "total": 5, + "p0_count": 0, + "p1_count": 1 + }, + "confirmation_gate": { + "required": true, + "reasons": [ + "识别到 2 个历史相似需求,需确认与旧需求的关系类型、生效范围和是否需要回写历史需求。" + ], + "pending_markers_count": 0, + "decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md", + "decision_status": "confirmed", + "decision_status_label": "已确认", + "allow_export_before_confirmation": true, + "candidate_decision_files": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + ], + "suggested_decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + }, + "agent_notes": { + "requirement-analyzer": "识别 2 个关联需求", + "conflict-detector": "检测到 0 个冲突候选", + "risk-assessor": "识别 5 个风险项" + }, + "_meta": { + "zone": "analyze", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.800208+00:00", + "status": "completed" + } + }, + "analysis_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_分析.md", + "relation_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_关联与冲突.md", + "risk_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_风险评估.md", + "related_requirements": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.docx", + "similarity": 0.833565 + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\安徽运八需求.md", + "similarity": 0.10511 + } + ], + "conflict_candidates_count": 0, + "conflict_summary": {}, + "risk_matrix": { + "risks": [ + { + "id": "RISK-AVAILABILITY", + "category": "可用性", + "keywords_matched": [ + "并发", + "重试", + "幂等" + ], + "likelihood": 3, + "impact": 4, + "score": 12, + "level": "P1", + "conflict_amplified": false + }, + { + "id": "RISK-FINANCIAL", + "category": "资损", + "keywords_matched": [ + "支付" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPLIANCE", + "category": "合规", + "keywords_matched": [ + "加密" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-DATA", + "category": "数据", + "keywords_matched": [ + "删除" + ], + "likelihood": 1, + "impact": 4, + "score": 4, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPATIBILITY", + "category": "兼容性", + "keywords_matched": [ + "版本" + ], + "likelihood": 1, + "impact": 3, + "score": 3, + "level": "P2", + "conflict_amplified": false + } + ], + "total": 5, + "p0_count": 0, + "p1_count": 1 + }, + "confirmation_gate": { + "required": true, + "reasons": [ + "识别到 2 个历史相似需求,需确认与旧需求的关系类型、生效范围和是否需要回写历史需求。" + ], + "pending_markers_count": 0, + "decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md", + "decision_status": "confirmed", + "decision_status_label": "已确认", + "allow_export_before_confirmation": true, + "candidate_decision_files": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + ], + "suggested_decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + }, + "design": { + "base_name": "运单资料文件包下载需求", + "strategy_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试策略.md", + "test_points_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_points\\运单资料文件包下载需求_测试点.md", + "test_cases_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_cases\\运单资料文件包下载需求_测试用例.md", + "test_data_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试数据.md", + "p0_required_coverage": "N/A", + "agent_notes": { + "test-strategist": { + "status": "completed", + "message": "策略已生成,0 个 P0 风险需 100% 覆盖" + }, + "testpoint-designer": { + "status": "pending_ai", + "message": "待 AI Agent 生成测试点", + "prompt_file": "agents/design/testpoint_designer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_points\\运单资料文件包下载需求_测试点.md" + }, + "case-designer": { + "status": "pending_ai", + "message": "待 AI Agent 生成用例", + "prompt_file": "agents/design/case_designer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_cases\\运单资料文件包下载需求_测试用例.md" + }, + "data-builder": { + "status": "pending_ai", + "message": "待 AI Agent 完善测试数据", + "prompt_file": "agents/design/data_builder.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试数据.md" + } + }, + "_meta": { + "zone": "design", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.803209+00:00", + "status": "completed" + } + }, + "strategy_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试策略.md", + "test_points_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_points\\运单资料文件包下载需求_测试点.md", + "test_cases_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_cases\\运单资料文件包下载需求_测试用例.md", + "test_data_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试数据.md", + "p0_required_coverage": "N/A", + "execute": { + "base_name": "运单资料文件包下载需求", + "playwright_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\playwright_tests.py", + "appium_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\appium_tests.py", + "execution_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求_执行报告.md", + "screenshots_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\screenshots\\运单资料文件包下载需求", + "execution_config": { + "browsers": [ + "chromium", + "firefox", + "webkit" + ], + "mobile_platforms": [ + "android", + "ios" + ], + "screenshot_on_failure": true, + "screenshot_on_step": false + }, + "agent_notes": { + "web-executor": "Playwright 脚本已生成 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\playwright_tests.py", + "mobile-executor": "Appium 脚本已生成 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\appium_tests.py", + "result-reporter": "执行报告 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求_执行报告.md" + }, + "_meta": { + "zone": "execute", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.808213+00:00", + "status": "completed" + } + }, + "playwright_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\playwright_tests.py", + "appium_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\appium_tests.py", + "execution_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_执行分析.md", + "screenshots_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\screenshots\\运单资料文件包下载需求", + "execution_config": { + "browsers": [ + "chromium", + "firefox", + "webkit" + ], + "mobile_platforms": [ + "android", + "ios" + ], + "screenshot_on_failure": true, + "screenshot_on_step": false + }, + "review": { + "base_name": "运单资料文件包下载需求", + "review_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_评审报告.md", + "coverage_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_覆盖率审计.md", + "verdict_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_质量裁决.md", + "quality_verdict": { + "verdict": "PENDING_AI", + "reason": "等待 AI Agent 评审(review 战区: case-reviewer → coverage-auditor → quality-gatekeeper)", + "case_count": 0, + "min_coverage_required": 0.95, + "max_blockers_allowed": 0 + }, + "agent_notes": { + "case-reviewer": { + "status": "pending_ai", + "message": "待 AI Agent 评审用例", + "prompt_file": "agents/review/case_reviewer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_评审报告.md" + }, + "coverage-auditor": { + "status": "pending_ai", + "message": "待 AI Agent 审计覆盖率", + "prompt_file": "agents/review/coverage_auditor.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_覆盖率审计.md" + }, + "quality-gatekeeper": { + "status": "pending_ai", + "message": "待 AI Agent 质量裁决", + "prompt_file": "agents/review/quality_gatekeeper.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_质量裁决.md" + } + }, + "_meta": { + "zone": "review", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.810212+00:00", + "status": "completed" + } + }, + "review_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_评审报告.md", + "coverage_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_覆盖率审计.md", + "verdict_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_质量裁决.md", + "quality_verdict": { + "verdict": "PENDING_AI", + "reason": "等待 AI Agent 评审(review 战区: case-reviewer → coverage-auditor → quality-gatekeeper)", + "case_count": 0, + "min_coverage_required": 0.95, + "max_blockers_allowed": 0 + }, + "monitor": { + "base_name": "运单资料文件包下载需求", + "execution_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_执行分析.md", + "agent_notes": { + "execution-analyst": "等待测试结果输入", + "knowledge-curator": "等待执行分析结果" + }, + "curation_suggestions": [], + "_meta": { + "zone": "monitor", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.812219+00:00", + "status": "completed" + } + }, + "curation_suggestions": [], + "current_excel_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\excel_reports\\运单资料文件包下载需求_测试用例.xlsx", + "versioning_scheme": { + "current_files": "固定文件名,始终表示当前最新版", + "snapshot_rule": "仅在 export 成功且产物内容发生变化时递增版本", + "snapshot_dir_pattern": "output/versions/{BASE_NAME}/vN/" + }, + "latest_snapshot_version": "v1", + "latest_snapshot_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\versions\\运单资料文件包下载需求\\v1", + "latest_snapshot_type": "full_pipeline", + "maintained_requirement_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md" +} diff --git a/output/manifests/运单资料文件包下载需求_analyze.json b/output/manifests/运单资料文件包下载需求_analyze.json new file mode 100644 index 0000000..4e31fa5 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_analyze.json @@ -0,0 +1,113 @@ +{ + "base_name": "运单资料文件包下载需求", + "analysis_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_分析.md", + "relation_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_关联与冲突.md", + "risk_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_风险评估.md", + "related_requirements": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.docx", + "similarity": 0.833565 + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\安徽运八需求.md", + "similarity": 0.10511 + } + ], + "conflict_candidates_count": 0, + "conflict_summary": {}, + "risk_matrix": { + "risks": [ + { + "id": "RISK-AVAILABILITY", + "category": "可用性", + "keywords_matched": [ + "并发", + "重试", + "幂等" + ], + "likelihood": 3, + "impact": 4, + "score": 12, + "level": "P1", + "conflict_amplified": false + }, + { + "id": "RISK-FINANCIAL", + "category": "资损", + "keywords_matched": [ + "支付" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPLIANCE", + "category": "合规", + "keywords_matched": [ + "加密" + ], + "likelihood": 1, + "impact": 5, + "score": 5, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-DATA", + "category": "数据", + "keywords_matched": [ + "删除" + ], + "likelihood": 1, + "impact": 4, + "score": 4, + "level": "P2", + "conflict_amplified": false + }, + { + "id": "RISK-COMPATIBILITY", + "category": "兼容性", + "keywords_matched": [ + "版本" + ], + "likelihood": 1, + "impact": 3, + "score": 3, + "level": "P2", + "conflict_amplified": false + } + ], + "total": 5, + "p0_count": 0, + "p1_count": 1 + }, + "confirmation_gate": { + "required": true, + "reasons": [ + "识别到 2 个历史相似需求,需确认与旧需求的关系类型、生效范围和是否需要回写历史需求。" + ], + "pending_markers_count": 0, + "decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md", + "decision_status": "confirmed", + "decision_status_label": "已确认", + "allow_export_before_confirmation": true, + "candidate_decision_files": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + ], + "suggested_decision_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\decisions\\运单资料文件包下载需求_确认结论.md" + }, + "agent_notes": { + "requirement-analyzer": "识别 2 个关联需求", + "conflict-detector": "检测到 0 个冲突候选", + "risk-assessor": "识别 5 个风险项" + }, + "_meta": { + "zone": "analyze", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.800208+00:00", + "status": "completed" + } +} diff --git a/output/manifests/运单资料文件包下载需求_design.json b/output/manifests/运单资料文件包下载需求_design.json new file mode 100644 index 0000000..b62d211 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_design.json @@ -0,0 +1,38 @@ +{ + "base_name": "运单资料文件包下载需求", + "strategy_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试策略.md", + "test_points_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_points\\运单资料文件包下载需求_测试点.md", + "test_cases_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_cases\\运单资料文件包下载需求_测试用例.md", + "test_data_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试数据.md", + "p0_required_coverage": "N/A", + "agent_notes": { + "test-strategist": { + "status": "completed", + "message": "策略已生成,0 个 P0 风险需 100% 覆盖" + }, + "testpoint-designer": { + "status": "pending_ai", + "message": "待 AI Agent 生成测试点", + "prompt_file": "agents/design/testpoint_designer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_points\\运单资料文件包下载需求_测试点.md" + }, + "case-designer": { + "status": "pending_ai", + "message": "待 AI Agent 生成用例", + "prompt_file": "agents/design/case_designer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\test_cases\\运单资料文件包下载需求_测试用例.md" + }, + "data-builder": { + "status": "pending_ai", + "message": "待 AI Agent 完善测试数据", + "prompt_file": "agents/design/data_builder.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_测试数据.md" + } + }, + "_meta": { + "zone": "design", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.803209+00:00", + "status": "completed" + } +} diff --git a/output/manifests/运单资料文件包下载需求_execute.json b/output/manifests/运单资料文件包下载需求_execute.json new file mode 100644 index 0000000..832fa84 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_execute.json @@ -0,0 +1,31 @@ +{ + "base_name": "运单资料文件包下载需求", + "playwright_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\playwright_tests.py", + "appium_script": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\appium_tests.py", + "execution_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求_执行报告.md", + "screenshots_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\screenshots\\运单资料文件包下载需求", + "execution_config": { + "browsers": [ + "chromium", + "firefox", + "webkit" + ], + "mobile_platforms": [ + "android", + "ios" + ], + "screenshot_on_failure": true, + "screenshot_on_step": false + }, + "agent_notes": { + "web-executor": "Playwright 脚本已生成 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\playwright_tests.py", + "mobile-executor": "Appium 脚本已生成 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求\\appium_tests.py", + "result-reporter": "执行报告 → E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\execution\\运单资料文件包下载需求_执行报告.md" + }, + "_meta": { + "zone": "execute", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.808213+00:00", + "status": "completed" + } +} diff --git a/output/manifests/运单资料文件包下载需求_monitor.json b/output/manifests/运单资料文件包下载需求_monitor.json new file mode 100644 index 0000000..5bbbe83 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_monitor.json @@ -0,0 +1,17 @@ +{ + "base_name": "运单资料文件包下载需求", + "execution_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_执行分析.md", + "agent_notes": { + "execution-analyst": "等待测试结果输入", + "knowledge-curator": "等待执行分析结果" + }, + "curation_suggestions": [], + "_meta": { + "zone": "monitor", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T09:49:11.260106+00:00", + "status": "completed" + }, + "export_completed": true, + "export_timestamp": "2026-09-08T09:49:11.259100+00:00" +} diff --git a/output/manifests/运单资料文件包下载需求_prepare.json b/output/manifests/运单资料文件包下载需求_prepare.json new file mode 100644 index 0000000..4ad9cb4 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_prepare.json @@ -0,0 +1,84 @@ +{ + "base_name": "运单资料文件包下载需求", + "requirement_source_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "requirement_input_type": "md", + "normalized_requirement_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求\\requirement.md", + "normalized_dir": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\normalized_inputs\\运单资料文件包下载需求", + "technical_solution_files": [], + "normalized_technical_solution_files": [], + "project_profile_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\00_project\\project_profile.md", + "document_confidence": { + "requirement": 1.0, + "issues": [] + }, + "activated_knowledge": { + "terminology": { + "permanent": [ + "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md" + ], + "optional": [] + }, + "semantic_matches": [] + }, + "knowledge_gaps": [ + { + "category": "history", + "suggestion": "未激活任何历史缺陷/易漏场景,建议补充相关知识库条目" + }, + { + "category": "best_practice", + "suggestion": "未激活任何最佳实践范例,建议补充同类型需求的优秀用例" + } + ], + "attached_source_files": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "project_file", + "source": "embedded_relative_path", + "exists": "true", + "context_line": "" + } + ], + "sources_registry": [ + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\requirements\\运单资料文件包下载需求.md", + "type": "primary_requirement", + "role": "business_background", + "format": "md", + "authority": "primary" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\resources\\prototypes\\anhuibaba_file_package.html", + "type": "attached_project_file", + "role": "ui_prototype", + "format": "html", + "authority": "reference", + "exists": "true" + }, + { + "path": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\knowledge_base\\01_standards\\terminology.md", + "type": "attached_project_file", + "role": "reference", + "format": "md", + "authority": "reference", + "exists": "true" + } + ], + "agent_notes": { + "document-parser": "解析完成,置信度 100%", + "knowledge-activator": "激活 1 常驻 + 0 可选术语" + }, + "_meta": { + "zone": "prepare", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.770287+00:00", + "status": "completed" + } +} diff --git a/output/manifests/运单资料文件包下载需求_review.json b/output/manifests/运单资料文件包下载需求_review.json new file mode 100644 index 0000000..843de20 --- /dev/null +++ b/output/manifests/运单资料文件包下载需求_review.json @@ -0,0 +1,39 @@ +{ + "base_name": "运单资料文件包下载需求", + "review_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_评审报告.md", + "coverage_report_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_覆盖率审计.md", + "verdict_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_质量裁决.md", + "quality_verdict": { + "verdict": "PENDING_AI", + "reason": "等待 AI Agent 评审(review 战区: case-reviewer → coverage-auditor → quality-gatekeeper)", + "case_count": 0, + "min_coverage_required": 0.95, + "max_blockers_allowed": 0 + }, + "agent_notes": { + "case-reviewer": { + "status": "pending_ai", + "message": "待 AI Agent 评审用例", + "prompt_file": "agents/review/case_reviewer.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_评审报告.md" + }, + "coverage-auditor": { + "status": "pending_ai", + "message": "待 AI Agent 审计覆盖率", + "prompt_file": "agents/review/coverage_auditor.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_覆盖率审计.md" + }, + "quality-gatekeeper": { + "status": "pending_ai", + "message": "待 AI Agent 质量裁决", + "prompt_file": "agents/review/quality_gatekeeper.md", + "output_file": "E:\\Desktop\\xst_files\\test\\QaAutomationHub\\output\\analysis\\运单资料文件包下载需求_质量裁决.md" + } + }, + "_meta": { + "zone": "review", + "base_name": "运单资料文件包下载需求", + "updated_at": "2026-09-08T08:11:23.810212+00:00", + "status": "completed" + } +} diff --git a/output/normalized_inputs/运单资料文件包下载需求/requirement.md b/output/normalized_inputs/运单资料文件包下载需求/requirement.md new file mode 100644 index 0000000..9157510 --- /dev/null +++ b/output/normalized_inputs/运单资料文件包下载需求/requirement.md @@ -0,0 +1,247 @@ +# 运单资料文件包下载需求 + +> 文档角色:需求文档 +> 原始来源:`requirements\运单资料文件包下载需求.md` + +# 运单资料文件包下载 需求文档 + +| 项 | 内容 | +|:---|:---| +| 功能名称 | 运单资料文件包下载(新增菜单) | +| 所属端 | 运八平台端(Web 管理后台) | +| 版本 | v1.0(定稿) | +| 编写日期 | 2026-09-08 | +| 确认记录 | 2026-09-08 需求方确认,13 项待确认事项全部采纳本文档建议方案(见第八章) | +| 原型 | `resources/prototypes/anhuibaba_file_package.html`(静态演示:任务列表 / 上传弹窗 / 文件包结构预览 / 失败清单) | +| 需求来源 | 运营口头需求(2026-09-08),本文档为整理稿 | +| 关联术语 | 以 `knowledge_base/01_standards/terminology.md` 为准 | + +--- + +## 一、需求背景与目标 + +运营人员在线下归档、审计、对账等场景中,需要按批次收集运单资料:运单合同、电子回单,以及司机证件照片、车辆证件照片。目前只能逐单进入运单详情手工下载整理,效率低且易遗漏。 + +**目标**:提供一个"上传运单清单 → 系统自动生成资料文件包 → 任务完成后下载"的批量导出能力,按"司机+身份证+车辆"自动归批,资料按运单分目录组织、按规则命名,一次下载即可获得全部资料。 + +**本期范围**:仅做资料导出打包;不新增数据采集,合同、电子回单、司机证件、车辆证件均读取运八平台现有数据。 + +--- + +## 二、名词定义 + +| 术语 | 定义 | +|:---|:---| +| **批次** | 上传清单中,运单在系统内的 **司机姓名 + 司机身份证号 + 车牌号** 三要素完全一致的一组运单。 | +| **文件包(批次包)** | 一个批次生成的目录,内含该批次全部运单的运单包。 | +| **运单包** | 批次包下按运单维度建立的子目录,内含该运单的合同、电子回单及(仅最小序号运单)司机、车辆证件照片。 | +| **最小序号运单** | 同一批次内,上传清单中"序号"最小的运单。该运单的运单包额外包含司机证件照片、车辆证件照片。 | + +--- + +## 三、整体流程 + +``` +运营人员 系统 + │ ① 下载模板,填写运单清单并上传 │ + │ ────────────────────────────────────→ │ ② 校验模板与数据(见 4.2.2) + │ │ ③ 创建打包任务(待处理 → 处理中) + │ ④ 任务列表查看处理进度 │ ④ 按批次分组 → 逐运单下载关联文件 → 组装文件包 + │ ←──────────────────────────────────── │ ⑤ 任务完成(已完成 / 已完成·部分失败 / 失败) + │ ⑥ 点击"下载"获取文件包 zip │ + │ ←──────────────────────────────────── │ ⑦ 返回 zip,记录下载审计日志 +``` + +核心规则:**司机+身份证+车辆算一批运单,生成一个文件包**;文件包内按运单建运单包;批次内**最小序号**的运单包额外含司机及车辆证件照片,其余运单包只含合同与电子回单。 + +--- + +## 四、功能需求 + +### 4.1 菜单入口 + +- 运八平台端新增独立菜单,菜单名称 **"运单文件包"**,挂在运单管理相关模块下。 +- 页面结构:上方"上传任务"入口(模板下载 + 上传按钮),下方"任务列表"。 +- 可见角色:**运营人员**;菜单需权限控制——文件包含身份证等敏感证件照片。 + +### 4.2 文件上传 + +#### 4.2.1 上传模板 + +| 列名 | 类型 | 必填 | 说明 | +|:---|:---|:---:|:---| +| 序号 | 整数 | 是 | 正整数,全文件内唯一;决定批次内"最小序号运单"的判定 | +| 货源单号 | 文本 | 是 | 系统内货源单号 | +| 运单号 | 文本 | 是 | 系统内运单号 | + +- 文件格式:`.xlsx`;页面提供**模板下载**。 +- 限制:单文件行数上限 **2000 行**;文件大小上限 **10MB**。 + +#### 4.2.2 校验规则 + +| 级别 | 规则 | 处理方式 | +|:---|:---|:---| +| 文件级 | 非 xlsx 格式 / 列名缺失或不符 / 文件损坏 | 上传即拒绝,提示具体原因,不创建任务 | +| 文件级 | 行数、大小超上限 | 上传即拒绝 | +| 数据级 | 序号非正整数或重复 | 该行计入失败清单 | +| 数据级 | 货源单号 / 运单号为空 | 该行计入失败清单 | +| 数据级 | 运单号在系统中不存在 | 该行计入失败清单 | +| 数据级 | 文件中货源单号与该运单实际所属货源不一致 | 该行计入失败清单 | +| 数据级 | 同一运单号在文件中重复出现 | 重复行计入失败清单 | +| 数据级 | 运单缺少司机或车辆信息,无法归批 | 该行计入失败清单(原因:无法归批) | + +> **处理原则**:文件级错误整体拒绝;数据级错误剔除失败行后继续处理有效行,任务状态记为"已完成·部分失败"。 + +### 4.3 任务 + +#### 4.3.1 任务状态 + +``` +待处理 → 处理中 → 已完成 (全部有效行成功) + → 已完成·部分失败 (部分行失败,可下载失败清单) + → 失败 (系统级错误导致整体未生成文件包) +``` + +#### 4.3.2 任务列表 + +| 字段 | 说明 | +|:---|:---| +| 任务编号 | 系统生成 | +| 源文件名 | 上传的清单文件名 | +| 上传人 / 上传时间 | — | +| 任务状态 | 待处理 / 处理中 / 已完成 / 已完成·部分失败 / 失败 | +| 总行数 / 成功数 / 失败数 | 处理进度与结果统计 | +| 完成时间 | — | +| 操作 | 下载文件包(任务成功后显示)、下载失败清单(存在失败行时显示,xlsx,含序号/货源单号/运单号/失败原因) | + +### 4.4 文件包生成规则 + +#### 4.4.1 批次划分 + +按有效行运单在**系统内**的 `司机姓名 + 司机身份证号 + 车牌号` 三要素归组,三要素完全一致归为一批,每批生成一个文件包。同一司机换车、同一车辆换司机都会拆分为不同批次。 + +#### 4.4.2 目录结构与命名 + +``` +运单资料_【任务编号】.zip ← 任务下载总包 +├─ 【司机姓名】-【身份证号】-【车牌号】/ ← 批次文件包① +│ ├─ 1-YD20260901001-HY202609001-含司机及车辆证件/ ← 批次内最小序号运单包 +│ │ ├─ 合同/(该运单全部合同文件) +│ │ ├─ 电子回单/(该运单全部支付记录对应回单) +│ │ ├─ 司机证件/(身份证、驾驶证、从业资格证等照片) +│ │ └─ 车辆证件/(行驶证、道路运输证等照片) +│ └─ 3-YD20260901003-HY202609001/ ← 批次内其余运单包 +│ ├─ 合同/ +│ └─ 电子回单/ +└─ 【司机姓名】-【身份证号】-【车牌号】/ ← 批次文件包② + └─ 2-YD20260901002-HY202609002-含司机及车辆证件/ ← 单运单批次,仍含证件 +``` + +- 任务下载总包命名:`运单资料_【任务编号】.zip`。 +- 批次文件包命名:`【司机姓名】-【身份证号】-【车牌号】`。 +- 运单包命名(需求明确): + - 最小序号运单:`【序号】-【运单号】-【货源单号】-含司机及车辆证件` + - 其余运单:`【序号】-【运单号】-【货源单号】` +- 运单包内按 `合同 / 电子回单 / 司机证件 / 车辆证件` 建子目录;文件保留系统原文件名,重名时自动追加 `(1)`、`(2)`。 + +#### 4.4.3 各运单包内容 + +| 内容 | 最小序号运单 | 其余运单 | 数据来源 | +|:---|:---:|:---:|:---| +| 运单相关合同 | ✅ | ✅ | 运单关联的合同附件(以运单详情-合同附件为准,含承运合同;不含委托合同/框架合同) | +| 电子回单 | ✅ | ✅ | 运单全部支付记录对应的银行电子回单 | +| 司机证件照片 | ✅ | ❌ | 该运单司机档案:身份证(人像面/国徽面)、驾驶证、从业资格证等 | +| 车辆证件照片 | ✅ | ❌ | 该运单车辆档案:行驶证、道路运输证、车辆照片等 | + +> 证件照片以批次内最小序号运单挂载的司机、车辆档案为准(同批次三要素一致,证件相同,故只随最小序号运单导出一份)。 + +#### 4.4.4 文件缺失处理 + +- 某运单无合同或无电子回单:不阻断任务,对应子目录不生成,原因记入失败清单(如"无电子回单:运单无支付记录")。 +- 批次内最小序号运单因故剔除(校验失败/文件缺失):**重新计算**批次内最小序号,证件照片改挂到新的最小序号运单。 +- 单个文件下载失败自动重试 3 次,仍失败则记入失败清单,不阻断其余文件。 + +### 4.5 下载 + +- 任务完成后,任务列表该行显示"下载"按钮,下载内容为任务总包 zip(含全部批次文件包)。 +- 支持重复下载,不重复生成。 +- 下载行为记录审计日志(操作人、时间、任务编号)——文件包含身份证等敏感个人信息。 +- 按批次文件包单独下载:本期不做。 + +--- + +## 五、上传示例与生成结果 + +上传清单: + +| 序号 | 货源单号 | 运单号 | 司机(系统内) | 车牌(系统内) | +|:---:|:---|:---|:---:|:---:| +| 1 | HY202609001 | YD20260901001 | 张三 | 皖A12345 | +| 2 | HY202609002 | YD20260901002 | 李四 | 皖B67890 | +| 3 | HY202609001 | YD20260901003 | 张三 | 皖A12345 | + +生成结果: + +- 批次① = 序号 1、3(张三+同一身份证+皖A12345)→ 文件包"张三-340102199001011234-皖A12345",内含运单包 `1-…-含司机及车辆证件`(合同+回单+张三证件+皖A12345 证件)和 `3-…`(仅合同+回单)。 +- 批次② = 序号 2(李四)→ 文件包"李四-340102199001015678-皖B67890",运单包 `2-…-含司机及车辆证件`(单运单批次,仍含司机及车辆证件)。 + +--- + +## 六、异常与边界场景汇总 + +| # | 场景 | 处理 | +|:---:|:---|:---| +| 1 | 模板格式/列名错误 | 上传即拒绝 | +| 2 | 序号重复、非正整数 | 行级失败清单 | +| 3 | 运单号不存在 / 货源单号不匹配 | 行级失败清单 | +| 4 | 运单被关闭、未产生支付记录导致无电子回单 | 不阻断,记失败清单 | +| 5 | 运单缺司机或车辆信息无法归批 | 行级失败清单 | +| 6 | 批次内最小序号运单被剔除 | 证件改挂重新计算后的最小序号运单 | +| 7 | 同一文件重复上传 | 允许,各自生成独立任务,不合并去重 | +| 8 | 多任务并发 | 后台排队处理(并发上限 1~2),防磁盘/带宽压力 | +| 9 | 文件包超过保留期 | 不可下载,需重新上传生成 | +| 10 | 任务处理中系统异常 | 任务置"失败",支持删除后重新上传 | + +--- + +## 七、非功能需求 + +| 项 | 要求 | +|:---|:---| +| 异步处理 | 打包为后台异步任务,任务列表可见进度(成功/失败条数);上传后无需等待 | +| 性能 | 1000 单规模任务 30 分钟内完成 | +| 保留期 | 生成的文件包默认保留 7 天,过期自动清理 | +| 敏感数据 | 司机身份证号、证件照片属敏感个人信息:菜单需权限控制、下载记审计日志;批次包命名含完整身份证号,包内数据仅限授权人员获取 | +| 幂等 | 同一任务重复点击下载不重复生成文件包 | + +--- + +## 八、确认决议记录(2026-09-08) + +> 原 v0.1 草稿 13 项待确认事项,经需求方确认**全部采纳文档建议方案**,逐项记录如下: + +| # | 事项 | 确认结论 | +|:---:|:---|:---| +| 1 | 菜单名称与挂载位置 | ✅ "运单文件包",挂在运单管理模块下 | +| 2 | 可见角色/权限 | ✅ 运营人员 | +| 3 | 批次文件包命名 | ✅ `司机姓名-身份证号-车牌号`(含完整身份证号) | +| 4 | 运单包内子目录 | ✅ 按 合同/电子回单/司机证件/车辆证件 建子目录 | +| 5 | "运单相关合同"范围 | ✅ 以运单详情-合同附件为准(含承运合同),不含委托合同/框架合同 | +| 6 | 货源单号与系统不一致时 | ✅ 该行失败 | +| 7 | 数据级校验失败行处理 | ✅ 剔除后继续,任务记"已完成·部分失败" | +| 8 | 失败行剔除后证件挂载 | ✅ 挂到批次内剩余运单的最小序号运单 | +| 9 | 行数/大小上限 | ✅ 2000 行 / 10MB | +| 10 | 文件包保留期 | ✅ 7 天 | +| 11 | 按批次包单独下载 | ✅ 本期不做 | +| 12 | zip 是否加密 | ✅ 不加密(依赖权限+审计) | +| 13 | 序号唯一性范围 | ✅ 全文件唯一 | + +--- + +## 九、验收要点 + +1. 上传合法清单后任务创建成功,完成后可下载 zip;zip 内批次划分与目录命名符合 4.4 规则。 +2. 同一批次内仅最小序号运单包含司机、车辆证件照片,其余运单仅含合同与电子回单。 +3. 单运单批次的运单包仍包含司机及车辆证件照片。 +4. 各类非法数据按 4.2.2 处理,失败清单内容准确可下载。 +5. 任务失败、部分失败、重复下载、保留期过期等边界行为符合第五、六章定义。 diff --git a/output/package-lock.json b/output/package-lock.json new file mode 100644 index 0000000..550eab2 --- /dev/null +++ b/output/package-lock.json @@ -0,0 +1,208 @@ +{ + "name": "output", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "output", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "docx": "^9.7.1" + } + }, + "node_modules/@types/node": { + "version": "25.9.5", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/docx": { + "version": "9.7.1", + "resolved": "https://registry.npmmirror.com/docx/-/docx-9.7.1.tgz", + "integrity": "sha512-ilXFf9Moz47ABjFpDiA5s1w9lpb4EFSp7+5iiJSbfyYDM+bpZdAgLlSr7fW4aXhVe/E+F6QCv0EvRVFEd5CsWg==", + "license": "MIT", + "dependencies": { + "@types/node": "^25.2.3", + "hash.js": "^1.1.7", + "jszip": "^3.10.1", + "nanoid": "^5.1.3", + "xml": "^1.0.1", + "xml-js": "^1.6.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "5.1.16", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.16.tgz", + "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmmirror.com/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + } + } +} diff --git a/output/package.json b/output/package.json new file mode 100644 index 0000000..643b52d --- /dev/null +++ b/output/package.json @@ -0,0 +1,16 @@ +{ + "name": "output", + "version": "1.0.0", + "description": "", + "main": "make_docx_waybill_package.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "docx": "^9.7.1" + } +} diff --git a/output/test_cases/运单资料文件包下载需求_测试用例.md b/output/test_cases/运单资料文件包下载需求_测试用例.md new file mode 100644 index 0000000..e24c3aa --- /dev/null +++ b/output/test_cases/运单资料文件包下载需求_测试用例.md @@ -0,0 +1,147 @@ +# 运单资料文件包下载需求 测试用例 + +> 生成时间: 2026-09-08 +> 依据: requirements/运单资料文件包下载需求.md(v1.0 定稿,含 13 项确认决议)、output/test_points/运单资料文件包下载需求_测试点.md(59 个测试点)、output/analysis/运单资料文件包下载需求_测试数据.md(145 组数据)、output/analysis/运单资料文件包下载需求_关联与冲突.md(无冲突,与安徽运八并行)、knowledge_base/00_project/project_profile.md、knowledge_base/01_standards/test_case_template.md、review_checklist.md +> 原型: resources/prototypes/anhuibaba_file_package.html +> 用例编号前缀: PLT_TMS_FPKG(平台端-运输管理-运单文件包) +> +> **测试用例总数: 85** +> **优先级分布: P0=33 / P1=43 / P2=7 / P3=2** +> **类型分布: 功能测试 62 / 安全性测试 10 / 回归测试 7 / 性能测试 3 / 兼容性测试 1 / 易用性测试 1 / 冒烟测试 1** +> **模块分布: 菜单权限 7 / 上传校验 14 / 数据校验 11 / 任务列表 13 / 打包归批 21 / 下载审计 7 / 非功能 11 / 跨模块冒烟 1** +> **测试点映射: 59/59 全覆盖——P0 测试点 25 个 100% 对应用例,P1 测试点 26 个 100% 对应用例,P2/P3 测试点 8 个全部保留(取舍理由见文末)** +> +> 阅读约定:本文件全文仅一个用例总表;"测试数据"列引用 output/analysis/运单资料文件包下载需求_测试数据.md 中的数据ID;账号默认 ACC-001(super_admin/951260684NiAn..,环境真实账号),ACC-002/003/006 为需在角色管理创建的账号(数据缺口 #9/#10);XLS-001~005 等示例单号落地时须映射为测试环境真实运单(数据缺口 #1);文末集中列出 Q1~Q6 保留待确认项与实现口径确认项。 + +## 用例编号与测试点映射总览 + +- TP-M-001→002;TP-M-002→003;TP-M-003→004/005;TP-M-004→006;TP-M-005→007/008 +- TP-U-001→009/085;TP-U-002→001/010;TP-U-003→011;TP-U-004→012/013/085;TP-U-005→014;TP-U-006→015/016;TP-U-007→017/018;TP-U-008→019;TP-U-009→020;TP-U-010→021;TP-U-011→022;TP-U-012→023;TP-U-013→024;TP-U-014→025;TP-U-015→026/027/083;TP-U-016→028/029;TP-U-017→030;TP-U-018→031 +- TP-T-001→001/032/033;TP-T-002→034;TP-T-003→035/036;TP-T-004→037/038;TP-T-005→039/040;TP-T-006→041/042;TP-T-007→043;TP-T-008→044 +- TP-P-001→045;TP-P-002→046/047;TP-P-003→048;TP-P-004→049;TP-P-005→050;TP-P-006→051/052;TP-P-007→053/054/084;TP-P-008→055/056;TP-P-009→057/058;TP-P-010→059;TP-P-011→060;TP-P-012→061;TP-P-013→062/063;TP-P-014→064 +- TP-D-001→001/065;TP-D-002→066;TP-D-003→067;TP-D-004→068;TP-D-005→069;TP-D-006→070/071 +- TP-N-001→072;TP-N-002→073;TP-N-003→074/075;TP-N-004→076/077;TP-N-005→078;TP-N-006→079/080;TP-N-007→081;TP-N-008→082 + +--- + +## 用例总表 + +| 用例编号 | 模块 | 用例标题 | 优先级 | 类型 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 | 备注 | +| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | +| PLT_TMS_FPKG_001 | 平台端-运单管理-运单文件包 | 冒烟验证上传合法清单到下载总包的端到端主流程 | P0 | 冒烟测试 | 1. ACC-001(super_admin)已登录平台端管理后台;2. 环境存在需求五章示例运单 YD20260901001/YD20260901002/YD20260901003(均已结算打款、含承运合同附件与银行电子回单、司机车辆证件齐全,数据缺口 #1) | 1. 进入"运单文件包"页面点击"下载模板"获得 XLS-008
2. 按模板填写 XLS-001/002/003 三行(序号 1/2/3,货源单号 HY202609001/HY202609002/HY202609001)
3. 点击"上传清单"选择文件并确认"开始上传并创建任务"
4. 轮询任务列表直至状态"已完成"
5. 点击该行"下载文件包"并解压 | ACC-001 账号;XLS-008 模板;XLS-001/002/003 清单行;IDC-006 总包命名 | 1. 模板为合法 .xlsx 且仅含 序号/货源单号/运单号 三列
2. 上传成功提示含任务编号(IDC-001 格式,编码规则以实现为准)
3. 列表置顶新增任务行,状态经 待处理→处理中→已完成,成功数=3、失败数=0、完成时间有值
4. 下载文件名=运单资料_【任务编号】.zip,zip 含 2 个批次包(张三-340102199001011234-皖A12345、李四-340102199001015678-皖B67890)及运单包 1-YD20260901001-HY202609001-含司机及车辆证件、3-YD20260901003-HY202609001、2-YD20260901002-HY202609002-含司机及车辆证件,解压无损坏 | 对应TP-U-002/TP-T-001/TP-D-001;REQ-001/REQ-004/REQ-008/REQ-016(核心链路首轮冒烟) | +| PLT_TMS_FPKG_002 | 平台端-运单管理-运单文件包-菜单权限 | 验证"运单文件包"菜单挂载位置与页面骨架完整 | P0 | 功能测试 | ACC-001 已登录且其角色已配置"运单文件包"菜单权限 | 1. 在运单管理相关模块下查找菜单"运单文件包"
2. 点击菜单进入页面
3. 自上而下核对页面结构:上传任务入口(模板下载+上传按钮)与任务列表
4. 核对面包屑与左侧菜单高亮 | ACC-001 账号;菜单名称"运单文件包"(决议#1);IDC-011 模板下载入口 | 1. 菜单名称逐字为"运单文件包"且挂在运单管理相关模块下
2. 页面自上而下为上传任务入口(含"下载模板""上传清单"按钮)在前、任务列表表格在后
3. 面包屑与菜单高亮定位正确
4. 角色-菜单权限关联数据中已含该菜单配置,页面无需求未定义的多余功能入口 | 对应TP-M-001;REQ-001 | +| PLT_TMS_FPKG_003 | 平台端-运单管理-运单文件包-菜单权限 | 验证被授权运营人员可见菜单并完成上传查看下载全链路 | P0 | 安全性测试 | 1. 已通过平台管理-角色管理创建运营人员账号 ACC-002(仅授权"运单文件包"菜单,数据缺口 #9);2. 环境存在 XLS-007 对应的有效运单(已结算、含合同与回单) | 1. ACC-002 登录平台端确认侧边栏可见"运单文件包"
2. 下载 XLS-008 模板并填写 XLS-007(1/HY202609001/YD20260901001)
3. 上传并等待任务完成
4. 点击"下载文件包"获取 zip
5. 全程观察是否出现权限拦截 | ACC-002 运营账号;XLS-008 模板;XLS-007 最小合法清单 | 1. 菜单可见,上传/查看进度/下载全链路无 401/403 拦截
2. 上传成功创建任务并提示任务编号
3. 任务完成后 zip 下载解压正常
4. 数据库任务表记录上传人=ACC-002 账号名
5. 页面内无其他角色越权入口 | 对应TP-M-002;REQ-002(权限分配由平台管理员在角色管理完成,项目画像 §2.2) | +| PLT_TMS_FPKG_004 | 平台端-运单管理-运单文件包-菜单权限 | 验证非授权角色登录后侧边栏无"运单文件包"菜单 | P0 | 安全性测试 | 1. 存在未授权"运单文件包"菜单的对照账号 ACC-003(财务/客服类角色,数据缺口 #9);2. 车队长 ACC-004(13113113113)与司机 ACC-005(15188888888)账号可用 | 1. ACC-003 登录平台端,遍历侧边栏全部模块与菜单搜索
2. ACC-004 登录检查其端内是否有该功能入口
3. ACC-005 登录司机端检查是否有该功能入口
4. 记录各角色会话下页面渲染内容 | ACC-003/ACC-004/ACC-005 账号 | 1. ACC-003 侧边栏全程无"运单文件包"入口(含菜单搜索)
2. 车队长端与司机端均无该功能入口
3. 各非授权角色页面不渲染任何任务列表数据
4. 角色权限配置数据中未授权角色的菜单集合不含该菜单 | 对应TP-M-003;REQ-002 | +| PLT_TMS_FPKG_005 | 平台端-运单管理-运单文件包-菜单权限 | 验证未登录与低权限会话 URL 直达页面被拦截 | P0 | 安全性测试 | 1. 已从 ACC-001 会话获取"运单文件包"页面路由地址;2. ACC-003(无该菜单权限)账号可用 | 1. 未登录状态浏览器直接输入页面 URL
2. ACC-003 登录后直接输入页面 URL
3. 观察两种场景的跳转与页面渲染
4. 打开开发者工具查看任务列表接口响应 | 页面路由 URL;ACC-003 账号 | 1. 未登录访问跳转登录页(或 403 页面),不渲染任务数据
2. ACC-003 访问返回 403 或无权限提示页,不渲染任务数据
3. 两种场景下任务列表接口请求均被服务端拒绝(401/403),无任务数据泄露 | 对应TP-M-003;REQ-002(漏测清单 §3 未登录访问) | +| PLT_TMS_FPKG_006 | 平台端-运单管理-运单文件包-菜单权限 | 验证无权限会话直接调用上传列表下载接口被服务端拒绝 | P1 | 安全性测试 | 1. ACC-003 已登录并取得有效会话凭证;2. 已存在一个已完成打包任务(任务编号 T1);3. 接口测试工具可用 | 1. 用 ACC-003 会话直接调用任务列表查询接口
2. 直接调用上传接口(携带合法 xlsx 文件)
3. 直接调用任务 T1 的下载接口
4. 记录三个接口的状态码与响应体
5. 检查任务列表 | ACC-003 会话凭证;任务编号 T1;合法 xlsx 文件 | 1. 三个接口均返回 401/403(或业务鉴权错误码),不返回业务数据与文件流
2. 上传接口不创建任务(数据库无新增任务记录)
3. 服务端鉴权独立于前端菜单隐藏,接口不因缺少前端入口而放行 | 对应TP-M-004;REQ-002(RISK-COMPLIANCE P2 缓解措施) | +| PLT_TMS_FPKG_007 | 平台端-运单管理-运单文件包-菜单权限 | 验证跨机构任务列表与文件包下载的数据隔离 | P1 | 安全性测试 | 1. 多机构部署环境:A 机构运营账号 ACC-001、B 机构运营账号均可登录(多机构选择登录);2. B 机构已存在一个已完成打包任务(任务编号 TB,含 B 机构运单资料) | 1. ACC-001 登录查看任务列表全量
2. 从 B 机构会话获取任务编号 TB 与其下载请求报文
3. ACC-001 会话携带 TB 重放下载接口
4. 查询数据库任务表 | ACC-001(A 机构);B 机构任务编号 TB | 1. ACC-001 任务列表不显示 B 机构任务(列表数据仅本机构)
2. 携带 TB 的下载请求被数据权限拦截(403/无权限类响应),不返回 zip 文件流
3. 数据库按机构维度过滤,A 机构会话查不到 B 机构任务记录 | 对应TP-M-005;REQ-002/REQ-026(项目画像 §10 权限类必测机构隔离,升为 P1);环境依赖:多机构部署与 B 机构数据见测试数据缺口 #18;若环境为单机构部署或 super_admin 按设计具备跨机构可见性,隔离断言改用绑定 A 机构的非超管运营账号(ACC-002 补机构绑定)执行并在执行报告记录结论,不得静默跳过 | +| PLT_TMS_FPKG_008 | 平台端-运单管理-运单文件包-菜单权限 | 验证上传清单含他机构运单号时按行级失败处理不导出 | P2 | 安全性测试 | 1. ACC-001(A 机构)已登录;2. B 机构存在有效运单 YDB-001(含证件与回单资料) | 1. 按 XLS-008 模板构造 2 行清单:第 1 行为 A 机构有效运单 XLS-001,第 2 行运单号填 B 机构运单 YDB-001、货源单号填 B 机构货源
2. 上传并等待任务完成
3. 下载 zip 检查内容
4. 下载失败清单核对 | XLS-008 模板;XLS-001 行;B 机构运单号 YDB-001 | 1. 任务状态"已完成·部分失败",成功数=1、失败数=1
2. 失败清单第 2 行原样记录,失败原因属"运单号在系统中不存在"或权限类文案(以实现为准)
3. zip 内不含 YDB-001 的任何运单包、证件或回单文件
4. B 机构运单在 A 机构会话下不可见不可导出 | 对应TP-M-005;REQ-002/REQ-026(B 机构运单 YDB-001 环境依赖见测试数据缺口 #18) | +| PLT_TMS_FPKG_009 | 平台端-运单管理-运单文件包-上传校验 | 验证模板下载产物为合法 xlsx 且仅含三列 | P0 | 功能测试 | ACC-001 已登录并进入"运单文件包"页面 | 1. 点击上传入口"下载模板"按钮
2. 检查下载文件名与文件格式(IDC-011:运单清单模板.xlsx)
3. 用 Excel/WPS 打开核对表头与模板内说明文字
4. 在该模板中按 XLS-007 填写 1 行有效运单后直接上传 | IDC-011 模板文件;XLS-007(1/HY202609001/YD20260901001) | 1. 下载得到合法 .xlsx 文件(文件名与 IDC-011 一致,以实现为准)
2. 表头仅含 序号/货源单号/运单号 三列,列名与需求 4.2.1 逐字一致
3. 模板内填写说明独立于数据表头,上传时不参与数据解析(不因说明行被拒)
4. 用模板填写的 XLS-007 上传成功并创建任务(模板自洽) | 对应TP-U-001;REQ-003 | +| PLT_TMS_FPKG_010 | 平台端-运单管理-运单文件包-上传校验 | 验证合法清单上传创建任务并正确回填列表字段 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境存在 XLS-001/002/003 对应运单(数据缺口 #1);3. 已记录上传前"全部任务"统计卡片数值 | 1. 点击"上传清单"选择本地文件"运单清单_合肥仓0908.xlsx"(内含 XLS-001/002/003 三行)
2. 确认"开始上传并创建任务"
3. 查看成功提示与任务列表置顶新行
4. 核对新行各字段取值
5. 核对统计卡片计数 | 源文件名 IDC-012(运单清单_合肥仓0908.xlsx);XLS-001/002/003 | 1. 上传成功提示含系统生成任务编号(IDC-001 格式,编码规则以实现为准)
2. 列表置顶新增一行:源文件名=运单清单_合肥仓0908.xlsx、上传人=当前账号、上传时间=当前时间、总行数=3
3. 任务状态由"待处理"流转"处理中"并最终"已完成",成功数=3、失败数=0
4. "全部任务"统计卡片计数较上传前 +1;数据库任务表新增记录且统计字段与清单一致 | 对应TP-U-002;REQ-001/REQ-004/REQ-005 | +| PLT_TMS_FPKG_011 | 平台端-运单管理-运单文件包-上传校验 | 验证非 xlsx 格式文件上传整体拒绝且前后端双重限制 | P0 | 功能测试 | 1. ACC-001 已登录;2. 本地准备 ERR-001(.xls)、ERR-002(.csv/.docx/.jpg)、ERR-003(zip 改后缀名为 .xlsx 的伪造文件);3. 接口测试工具可用 | 1. 点击"上传清单"分别选择 .xls、.csv、.docx 文件,观察文件选择器过滤与页面提示
2. 选择 ERR-003 伪 xlsx 上传
3. 用接口工具携带 ACC-001 会话直传 .csv 与伪 xlsx(绕过前端)
4. 每次上传后检查任务列表与数据库 | ERR-001/ERR-002/ERR-003;BND-014 类伪格式文件 | 1. 前端文件选择器过滤非 .xlsx,或选择后立即提示"格式不支持"类具体原因
2. 伪 xlsx 被后端魔数/结构校验拒绝(防仅校验后缀),提示明确
3. 接口直传同样被拒(后端独立校验防绕过)
4. 全部场景不创建任务:列表无新增行、数据库无任务记录 | 对应TP-U-003;REQ-005 | +| PLT_TMS_FPKG_012 | 平台端-运单管理-运单文件包-上传校验 | 验证列名缺失或不符的清单整体拒绝且提示具体列问题 | P0 | 功能测试 | 1. ACC-001 已登录;2. 按 ERR-004/ERR-005 构造 4 个清单文件(缺序号列、缺货源单号列、列名拼写错误、三列+多余备注列) | 1. 上传缺"序号"列文件(仅货源单号/运单号两列)
2. 上传缺"货源单号"列文件
3. 上传列名不符文件(如"单号""序号(必填)""No."、序号尾带空格)
4. 上传含多余未知列文件
5. 每次上传后检查任务列表 | ERR-004(缺列);ERR-005(列名不符变体) | 1. 四类文件均整体拒绝,提示信息指明具体列问题(如"列名缺失或不符"并指明列,具体文案以实现为准)
2. 均不创建任务:列表无新增行、数据库无任务记录
3. 不产生失败清单(未进入数据级校验) | 对应TP-U-004;REQ-005 | +| PLT_TMS_FPKG_013 | 平台端-运单管理-运单文件包-上传校验 | 验证三列名齐全仅列顺序打乱的清单可正常上传 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造列顺序为 运单号/货源单号/序号 的 3 行清单(行数据同 XLS-001/002/003) | 1. 上传列序打乱清单
2. 等待任务完成并核对统计
3. 下载 zip 核对批次划分与命名 | ERR-007 构造文件(列名齐全顺序打乱);XLS-001/002/003 行数据 | 1. 上传成功创建任务且总行数=3(按列名匹配解析,不因列顺序拒绝)
2. 任务"已完成"、成功数=3
3. zip 批次划分、运单包命名与列序正常文件完全一致(归批与命名不受列序影响) | 对应TP-U-004;REQ-005(需求 4.2.2 仅约束"列名缺失或不符"未约束列顺序,按列名匹配口径设计;若实现按固定列序读取则本用例失败需回归,见文末实现口径确认项) | +| PLT_TMS_FPKG_014 | 平台端-运单管理-运单文件包-上传校验 | 验证损坏与加密 xlsx 上传被拒绝且服务端无异常暴露 | P1 | 功能测试 | 1. ACC-001 已登录;2. 准备 ERR-008(截断 xlsx、缺 workbook.xml 的伪 xlsx)、带密码加密 xlsx、0 字节空文件 | 1. 依次上传截断 xlsx 与伪 xlsx
2. 上传带密码加密 xlsx
3. 上传 0 字节空文件
4. 观察每次提示并检查任务列表、服务端日志 | ERR-008(截断/伪 xlsx);加密 xlsx;BND-014(0 字节空文件) | 1. 全部整体拒绝,提示"文件损坏/无法读取"类可理解原因,加密文件给出可理解提示而非堆栈报错
2. 页面无 500/白屏,服务端日志无未捕获异常堆栈
3. 均不创建任务,后台无残留半任务记录 | 对应TP-U-005;REQ-005 | +| PLT_TMS_FPKG_015 | 平台端-运单管理-运单文件包-上传校验 | 验证单文件 2000 行成功与 2001 行整体拒绝的行数上限边界 | P1 | 功能测试 | 1. ACC-001 已登录;2. 环境已准备 2000 个有效运单并生成 XLS-006 清单(数据缺口 #1/#12);3. 已构造 2001 行清单 | 1. 上传 XLS-006(2000 行)等待任务完成并核对成功数
2. 上传 2001 行清单
3. 检查第二次上传后的任务列表与提示 | XLS-006(2000 行);BND-005/BND-006(2000/2001 行) | 1. 2000 行任务创建成功且最终成功数=2000、失败数=0
2. 2001 行文件上传即整体拒绝,提示行数超限类原因
3. 2001 行不创建任务(列表无新增行、数据库无记录)
4. 行数口径:2000 行含、2001 行即超限拒绝 | 对应TP-U-006;REQ-004(决议#9);Q3 已按需求口径收敛:需求 4.2.1 明确"单文件行数上限 2000 行",按数据行计 2000 成功/2001 拒绝 | +| PLT_TMS_FPKG_016 | 平台端-运单管理-运单文件包-上传校验 | 验证仅表头 0 数据行的空清单被拒绝且不生成空任务 | P1 | 功能测试 | 1. ACC-001 已登录;2. 准备未填写任何数据行的 XLS-008 模板文件 | 1. 直接上传未填写数据的模板 XLS-008
2. 观察拒绝提示
3. 检查任务列表与对象存储 | XLS-008(仅表头 0 数据行);BND-001 | 1. 上传被文件级拒绝,提示"清单无数据行"类明确原因
2. 不创建任务:列表无新增行、数据库无任务记录
3. 不生成任何空 zip 或空文件包(对象存储无空包残留) | 对应TP-U-006;REQ-004;Q2 已收敛:按文件级拒绝处理,依据需求三章"填写运单清单并上传"与 4.2.2 处理原则(任务处理对象为有效数据行)及测试点建议口径,若实现按 0 行任务创建需回归修订本用例 | +| PLT_TMS_FPKG_017 | 平台端-运单管理-运单文件包-上传校验 | 验证文件大小 10MB 临界值两侧的接受与拒绝行为 | P1 | 功能测试 | 1. ACC-001 已登录;2. 用 openpyxl 构造恰好 10MB 与 10MB+1B 的合法结构 xlsx(数据缺口 #12) | 1. 上传恰好 10MB 的合法清单
2. 上传 10MB+1B 的清单
3. 分别检查任务列表与提示 | BND-012(10MB 整);BND-013(10MB+1B) | 1. 恰好 10MB 文件上传成功并正常创建任务("大小不超过 10MB"含等于)
2. 10MB+1B 整体拒绝,提示大小超上限类原因
3. 拒绝场景不创建任务 | 对应TP-U-007;REQ-004(决议#9);10MB 字节口径(10 的 6 次方或 2 的 20 次方)见数据缺口 #16,执行前与开发确认 | +| PLT_TMS_FPKG_018 | 平台端-运单管理-运单文件包-上传校验 | 验证行数上限与大小上限两条限制相互独立生效 | P1 | 功能测试 | 1. ACC-001 已登录;2. 构造文件一:50 行但单元格嵌入超长文本使体积超 10MB;3. 构造文件二:2001 行普通数据体积约 1MB | 1. 上传文件一观察拒绝原因
2. 上传文件二观察拒绝原因
3. 对比两条提示文案
4. 检查任务列表 | 文件一(行数少体积超限);文件二(行数超限体积小);BND-006/BND-013 | 1. 文件一被大小限制拒绝(提示大小超上限)
2. 文件二被行数限制拒绝(提示行数超限)
3. 两条提示原因可区分不混淆
4. 两者均不创建任务 | 对应TP-U-007;REQ-004(项目画像 §8.3 Excel 大数据量惯例,两条限制独立生效) | +| PLT_TMS_FPKG_019 | 平台端-运单管理-运单文件包-数据校验 | 验证序号非正整数的行计入失败清单且有效行不受影响 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境存在 XLS-002 对应有效运单;3. 构造 7 行清单:1 行合法(序号 9+XLS-002 数据)+6 行序号分别为 0、-1、1.5、abc、空、全角数字"1"(货源单号/运单号按 XLS-101~105 构造) | 1. 上传该 7 行清单等待任务完成
2. 查看任务状态与成功/失败数
3. 下载失败清单核对 6 个失败行的原因
4. 下载 zip 核对成功行 | XLS-101/102/103/104/105(序号 0/-1/1.5/abc/空);全角数字"1"构造行;ERR-020 | 1. 任务状态"已完成·部分失败",成功数=1、失败数=6
2. 6 个失败行原因均含"序号非正整数"类文案(一行并存多项问题时原因以首要或并列展示,以实现文案为准,不得将非法序号行判为成功)
3. 合法行正常打包(zip 含其运单包)
4. 成功数+失败数=总行数 7,数据库统计一致 | 对应TP-U-008;REQ-006(执行时顺带探测 BND-025/026/027 极值序号:int32 上限 2147483647 行与 15 位以上数字行应"合法或明确报错,不得静默截断",防止破坏最小序号判定链;见文末确认项 #9) | +| PLT_TMS_FPKG_020 | 平台端-运单管理-运单文件包-数据校验 | 验证序号全文件唯一的重复序号行计入失败清单且首行保留 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造 3 行清单:行1 序号 1+YD20260901001(张三批)、行2 序号 1+YD20260901002(李四批)、行3 序号 2+YD20260901003(张三批)——重复序号 1 跨张三/李四两个批次 | 1. 上传该 3 行清单等待完成
2. 核对失败清单行与原因
3. 下载 zip 核对保留行批次归属与证件挂载 | XLS-106(两行序号均为 1);XLS-003 行;决议#13 | 1. 行1(首现行)保留处理、行2(重复行)进失败清单且原因明确"序号重复"类
2. 唯一性范围为全文件:重复序号跨张三/李四批次同样剔除,不按批次内判定
3. 行3 正常打包;行1 与行3 归张三同一批次,行1 为最小序号运单含证件后缀
4. 成功数=2、失败数=1,统计一致 | 对应TP-U-009;REQ-006(决议#13 序号全文件唯一;序号决定最小序号判定联动 PLT_TMS_FPKG_053) | +| PLT_TMS_FPKG_021 | 平台端-运单管理-运单文件包-数据校验 | 验证货源单号或运单号为空的行计入失败清单且原因区分字段 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造 6 行清单:XLS-107(货源单号空串)、货源单号为纯空格行、XLS-108(运单号空串)、运单号为纯空格行、XLS-109(两者均空)、1 行合法基准行(序号 9+XLS-002) | 1. 上传该清单等待完成
2. 逐行核对失败清单原因
3. 核对成功行打包情况 | XLS-107/108/109;ERR-022(空串与纯空格) | 1. 空串与纯空格均判为空(trim 后校验)
2. 失败原因区分"货源单号为空"与"运单号为空";两者均空时并列或合并提示(以实现文案为准,不误报单一字段原因)
3. 合法基准行正常打包
4. 任务"已完成·部分失败",成功数=1、失败数=5,统计一致 | 对应TP-U-010;REQ-006 | +| PLT_TMS_FPKG_022 | 平台端-运单管理-运单文件包-数据校验 | 验证运单号在系统中不存在的行失败原因准确且不影响其他行 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造 4 行清单:XLS-110(1/HY202609001/YD20991231001 不存在)、行2 运单号为"YD20260901001 "(尾带空格,系统存在该单,ERR-027)、行3 运单号为 XLS-001 单号的小写变体 yd20260901001、XLS-001 合法行 | 1. 上传该 4 行清单等待完成
2. 核对失败清单原因
3. 下载 zip 核对成功行
4. 记录尾空格行与大小写变体行的判定结果并核对 zip 中其导出行为 | XLS-110;ERR-027(尾空格运单号);XLS-001 小写变体构造行;XLS-001 | 1. XLS-110 行失败且原因"运单号在系统中不存在"(原型文案)
2. 一行失败不影响同文件其他有效行打包
3. 尾空格行与大小写变体行的存在性校验与实际导出均采用同一匹配口径(trim/大小写敏感与否两处行为一致:匹配则一致成功导出、不匹配则一致按"运单号在系统中不存在"失败),不出现校验通过但导出缺单的不一致
4. 任务统计与状态准确 | 对应TP-U-011;REQ-006 | +| PLT_TMS_FPKG_023 | 平台端-运单管理-运单文件包-数据校验 | 验证货源单号与运单实际所属货源不一致的行失败且正确配对行成功 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境运单 YD20260901001 实际所属货源为 HY202609001(数据缺口 #1);3. 构造 2 行清单:XLS-111(1/HY202609009/YD20260901001 错配)、XLS-001(1/HY202609001/YD20260901001 正确配对) | 1. 上传该 2 行清单等待完成
2. 核对失败清单原因
3. 下载 zip 确认正确配对行打包 | XLS-111(错配);XLS-001(正确配对);决议#6 | 1. 错配行失败且原因"文件中货源单号与该运单实际所属货源不一致"(原型文案)
2. 正确配对行正常打包
3. 归属判定以系统数据为准,不因清单填写顺序改变
4. 成功数=1、失败数=1,任务"已完成·部分失败" | 对应TP-U-012;REQ-006(决议#6) | +| PLT_TMS_FPKG_024 | 平台端-运单管理-运单文件包-数据校验 | 验证同一运单号文件内重复时首现行保留且不产生重复运单包 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造 XLS-112:两行同一运单号 YD20260901001(序号 1、2 不同,货源单号均正确填 HY202609001) | 1. 上传该 2 行清单等待完成
2. 核对失败清单与原因
3. 下载 zip 检索该运单包出现次数 | XLS-112(序号 1、2 同运单号) | 1. 首现行(序号 1)保留处理并打包,zip 中该运单包仅出现一次
2. 重复行(序号 2)进失败清单,失败原因明确为运单号文件内重复类文案(区别于序号重复原因)
3. 不产生两个运单包
4. 成功数=1、失败数=1,统计一致 | 对应TP-U-013;REQ-006 | +| PLT_TMS_FPKG_025 | 平台端-运单管理-运单文件包-数据校验 | 验证缺司机或车辆信息的运单行失败原因标注无法归批 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境准备缺司机信息运单、缺车辆信息运单各 1 单(XLS-113/114,数据缺口 #5);3. 构造 4 行清单:XLS-113、XLS-114、XLS-001、XLS-003(后两行同属张三批合法行) | 1. 上传该 4 行清单等待完成
2. 核对失败清单两行原因
3. 下载 zip 核对批次划分与证件挂载 | XLS-113(缺司机);XLS-114(缺车辆);XLS-001/003 | 1. 两行均失败且原因标注"无法归批"类文案(可区分缺司机/缺车辆或统一归批失败文案,以实现为准)
2. 剔除后批次按剩余有效行正确划分:XLS-001/003 归张三一批且最小序号运单含证件
3. 任务"已完成·部分失败",成功数=2、失败数=2 | 对应TP-U-014;REQ-006(六#5) | +| PLT_TMS_FPKG_026 | 平台端-运单管理-运单文件包-数据校验 | 验证单文件多类数据级错误并存时各行独立判定 | P1 | 功能测试 | 1. ACC-001 已登录;2. 构造 6 行清单:1 行合法(XLS-001)+1 行序号重复(XLS-106 重复行)+1 行运单不存在(XLS-110)+1 行货源错配(XLS-111)+1 行无法归批(XLS-113)+1 行单号为空(XLS-107);序号重复行与合法行 XLS-001 共用序号 1(首现行保留成功、重复行计失败,口径同 020),其余 4 个失败行序号取互不相同的合法值(如 2/3/4/5) | 1. 上传该 6 行清单等待完成
2. 逐行核对失败清单原因
3. 核对成功行打包 | XLS-001/106/110/111/113/107 组合清单 | 1. 5 个失败行各自失败原因准确、互不串行(序号重复、运单不存在、货源不一致、无法归批、单号为空各自对应)
2. 合法行正常打包
3. 成功数=1+失败数=5=总行数 6
4. 任务状态"已完成·部分失败" | 对应TP-U-015;REQ-006/REQ-007(规则组合场景;执行时顺带验证单行多重非法的失败原因展示优先级,XLS-115) | +| PLT_TMS_FPKG_027 | 平台端-运单管理-运单文件包-上传校验 | 验证文件级错误与数据级错误共存时文件级优先整体拒绝 | P1 | 功能测试 | 1. ACC-001 已登录;2. 构造清单:表头缺"货源单号"列且数据行含不存在的运单号 YD20991231001 | 1. 上传该清单
2. 观察拒绝提示
3. 检查任务列表与失败清单 | ERR-004(缺列)+XLS-110(不存在运单号)组合构造文件 | 1. 上传即整体拒绝(文件级优先),提示列名缺失类原因
2. 不创建任务,不进入数据级校验与失败清单流程
3. 无"已完成·部分失败"类任务记录产生 | 对应TP-U-015;REQ-005/REQ-006(4.2.2 处理原则:文件级错误整体拒绝) | +| PLT_TMS_FPKG_028 | 平台端-运单管理-运单文件包-数据校验 | 验证单元格注入类内容按行级失败处理且无注入副作用 | P1 | 安全性测试 | 1. ACC-001 已登录;2. 构造 6 行清单:ERR-030(货源单号 HY202609001' OR '1'='1)、ERR-031(运单号 YD20260901001'; DROP TABLE waybill;--)、ERR-032(序号 1 OR 1=1)、ERR-033(运单号含 script 标签)、1 行含 Emoji 运单号、1 行合法基准(XLS-002) | 1. 上传该清单等待完成
2. 核对失败清单中各行的展示与文件内容
3. 检查任务列表页面回显
4. 检查数据库与任务状态 | ERR-030/031/032/033;Emoji 构造行;XLS-002 | 1. 注入内容行均按数据级原因失败(查无此单/序号非正整数等),SQL 不执行、无数据库异常、无 500
2. 失败清单 xlsx 与页面回显对脚本标签转义展示,不执行脚本
3. Emoji 行不崩溃不乱码
4. 合法行正常打包,数据库表数据完整无被篡改痕迹 | 对应TP-U-016;REQ-006 | +| PLT_TMS_FPKG_029 | 平台端-运单管理-运单文件包-数据校验 | 验证超长单号与超长特殊字符源文件名的防御处理 | P1 | 功能测试 | 1. ACC-001 已登录;2. 构造清单 A:运单号为 256 字符以上连续字符串(ERR-035);3. 构造清单 B:合法 3 行数据、源文件名为 300 字符及含 # % & 空格 全角字符 Emoji 的文件(ERR-036/038/039,经接口直传构造) | 1. 上传清单 A 观察行级处理
2. 上传清单 B 观察任务创建与列表"源文件名"展示
3. 完成后下载失败清单与总包核对命名
4. 检查服务端目录无逃逸文件 | ERR-035(超长运单号);ERR-034(XSS 文件名);ERR-036/037/038/039(超长、路径穿越类、特殊字符、Unicode 文件名) | 1. 超长运单号行按"运单号在系统中不存在"失败,不截断误判为存在、系统不崩溃
2. 特殊字符/超长文件名任务正常创建处理,列表展示截断省略且有完整名 tooltip(原型 .te 样式);含脚本标签的源文件名(ERR-034)在列表转义展示为纯文本,不触发弹窗执行
3. 下载产物(总包/失败清单)命名不受源文件名污染,上传下载目录无路径逃逸文件
4. Emoji/生僻字文件名编码正常(UTF-8 兼容) | 对应TP-U-016;REQ-006(ERR-037 路径穿越并入断言 3) | +| PLT_TMS_FPKG_030 | 平台端-运单管理-运单文件包-上传校验 | 验证上传弹窗按钮态回显与状态重置的交互细节 | P1 | 易用性测试 | 1. ACC-001 已登录;2. 本地准备 BND-015 典型 3 行清单(12KB 级,内含 XLS-001/002/003) | 1. 打开上传弹窗观察未选文件时"开始上传并创建任务"按钮状态
2. 点击选择 BND-015 文件观察 drop 区状态与回显内容
3. 分别用取消按钮、右上角关闭、点击遮罩三种方式关闭弹窗后重新打开
4. 用拖拽方式将文件拖入 drop 区上传
5. 重复打开弹窗检查是否残留上次文件 | BND-015(12KB 3 行清单);XLS-001/002/003 | 1. 未选文件时按钮置灰 disabled
2. 选择文件后 drop 区变绿色态并显示"已选择:运单清单_合肥仓0908.xlsx(大小·行数)"类回显,文件名/大小/行数与实际一致
3. 三种关闭方式均生效;重开弹窗不残留上次选择文件(状态重置)
4. 拖拽与点击两种方式均可正常上传 | 对应TP-U-017;REQ-004(原型交互;防重复点击归 PLT_TMS_FPKG_074 验证) | +| PLT_TMS_FPKG_031 | 平台端-运单管理-运单文件包-上传校验 | 验证同一清单文件重复上传生成两个独立任务 | P2 | 功能测试 | 1. ACC-001 已登录;2. 已用文件"运单清单_合肥仓0908.xlsx"(XLS-001/002/003)完成过一次上传生成任务 T1 | 1. 使用同一文件再次上传生成任务 T2
2. 对比两任务编号、源文件名、总行数、上传时间
3. 等待两任务均完成后分别下载 zip 并比对内容
4. 删除任务 T1 后检查任务 T2 | CMB-013(同文件上传 2 次);XLS-001/002/003 | 1. 生成两个任务,任务编号不同、总行数均为 3、上传时间分别记录
2. 两任务各自完成且 zip 内容一致、互不覆盖(决议口径:允许重复、不合并去重)
3. 删除 T1 不影响 T2 的列表展示与下载
4. 数据库存在两条独立任务记录 | 对应TP-U-018;REQ-023(六#7 确认决议口径) | +| PLT_TMS_FPKG_032 | 平台端-运单管理-运单文件包-任务列表 | 验证任务状态待处理到处理中到已完成的正向流转 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境运单齐备(XLS-001/002/003);3. 已知当前并发队列空闲(若有并发占用,配合 CNC-003 制造"待处理"观察窗口) | 1. 上传 XLS-001/002/003 三行清单
2. 上传后立即刷新列表观察状态
3. 轮询观察状态变化直至终态
4. 核对各状态下完成时间字段与数据库状态值 | XLS-001/002/003;STT-001/002/003 | 1. 状态按 待处理→处理中→已完成 依次流转,单向推进不回跳不跳态
2. 处理中期间列表可见进度变化
3. 已完成后完成时间字段有值;待处理/处理中状态下完成时间为"—"
4. 数据库任务状态字段值与页面标签一一对应(状态字典正确) | 对应TP-T-001;REQ-008 | +| PLT_TMS_FPKG_033 | 平台端-运单管理-运单文件包-任务列表 | 验证五种任务状态标签文案与颜色的映射不混用 | P0 | 功能测试 | 1. 准备 5 种状态任务各 1:待处理(并发占满排队 STT-001)、处理中(STT-002)、已完成(STT-003)、已完成·部分失败(5 行 3 成 2 败 STT-004)、失败(OBS 断开构造 STT-005);2. ACC-001 已登录 | 1. 在任务列表逐一查看 5 种状态标签
2. 截图比对各标签颜色与文案
3. 与原型 anhuibaba_file_package.html 标签样式比对
4. 刷新页面与翻页后复核渲染一致性 | STT-001~005 各 1 任务;漏测清单 §6 颜色映射 | 1. 五种标签文案逐字为 待处理/处理中/已完成/已完成·部分失败/失败
2. 颜色映射与原型一致(待处理灰、处理中蓝、已完成绿、失败红、已完成·部分失败橙,具体色值以原型为准),五色不混用
3. 同一状态在列表各处渲染一致,无状态与颜色错配 | 对应TP-T-001;REQ-008(漏测清单 §6 标签颜色映射) | +| PLT_TMS_FPKG_034 | 平台端-运单管理-运单文件包-任务列表 | 验证部分行失败的任务记已完成部分失败且仍可下载 | P0 | 功能测试 | 1. ACC-001 已登录;2. 构造 5 行清单:3 行合法(XLS-001/002/003)+2 行非法(序号 0 行按 XLS-101、序号 99 行运单号 YD20991231001 按 XLS-110) | 1. 上传该 5 行清单等待完成
2. 查看状态标签与成功/失败数
3. 查看该行操作列按钮
4. 下载 zip 核对内容
5. 下载失败清单核对行数 | XLS-001/002/003+XLS-101+XLS-110;STT-004 | 1. 状态标签为橙色"已完成·部分失败"(非"失败")
2. 成功数=3、失败数=2
3. 操作列同时显示"下载文件包"与"失败清单"两个按钮
4. zip 内仅含 3 个成功运单的资料
5. 失败清单含 2 行且原因准确 | 对应TP-T-002;REQ-007/REQ-008(决议#7 部分失败仍可下载) | +| PLT_TMS_FPKG_035 | 平台端-运单管理-运单文件包-任务列表 | 验证失败任务无下载按钮且删除按钮仅失败状态可见 | P1 | 功能测试 | 1. 准备失败任务 1(OBS 断开构造 STT-005)、已完成任务 1(STT-003)、处理中任务 1(STT-002);2. ACC-001 已登录 | 1. 查看失败任务行的状态、总行数/成功/失败数、完成时间、操作按钮
2. 查看已完成任务行操作按钮
3. 查看处理中任务行操作按钮
4. 比对三类状态的按钮映射 | STT-005/STT-003/STT-002 任务 | 1. 失败任务无"下载文件包"按钮,总行数有值、成功数 0、失败数 0、完成时间"—"
2. 仅失败任务行显示"删除"按钮,已完成/处理中任务无删除入口
3. 失败任务无"失败清单"按钮(系统级失败不产生数据级失败清单) | 对应TP-T-003;REQ-008/REQ-024(漏测清单 §4 状态与按钮映射) | +| PLT_TMS_FPKG_036 | 平台端-运单管理-运单文件包-任务列表 | 验证删除失败任务有确认交互且删除后重新上传可成功 | P1 | 功能测试 | 1. 存在失败任务 T1(源清单为 XLS-001/002/003 三行文件);2. ACC-001 已登录 | 1. 点击 T1 行"删除"按钮
2. 在确认弹窗先点取消
3. 再次点击并确认删除
4. 检查列表与数据库记录
5. 重新上传同一清单文件等待新任务完成 | STT-005→STT-007;XLS-001/002/003 清单文件 | 1. 删除有二次确认交互,取消后任务保留
2. 确认后列表移除该行,数据库任务记录删除或标记已删除(STT-007)
3. 重新上传同清单创建新任务并正常完成(成功数=3)
4. 新任务编号与旧任务不同,互不影响 | 对应TP-T-003;REQ-024(六#10 删除后重新上传) | +| PLT_TMS_FPKG_037 | 平台端-运单管理-运单文件包-任务列表 | 验证任务列表十项字段完整且默认按上传时间倒序 | P1 | 功能测试 | 1. ACC-001 已登录;2. 列表中已有 3 条以上不同时间上传、不同状态的任务 | 1. 核对列表表头字段与需求 4.3.2 清单
2. 逐行核对各字段取值(任务编号/源文件名/上传人/上传时间/任务状态/总行数/成功/失败/完成时间/操作)
3. 核对默认排序
4. 核对数值与时间格式 | 需求 4.3.2 十字段;IDC-012;IDC-001 | 1. 表头含任务编号/源文件名/上传人/上传时间/任务状态/总行数/成功/失败/完成时间/操作十项无缺漏
2. 默认按上传时间倒序(最新在上)
3. 空值展示"—"而非 0 或 null;时间为 YYYY-MM-DD HH:mm:ss 格式
4. 各字段值与数据库任务表一致 | 对应TP-T-004;REQ-009 | +| PLT_TMS_FPKG_038 | 平台端-运单管理-运单文件包-任务列表 | 验证任务列表分页翻页数据不重复不丢失且总数正确 | P1 | 功能测试 | 1. ACC-001 已登录;2. 通过 XLS-007 等最小清单累计创建超过 1 页容量的任务(15 条以上) | 1. 记录第 1 页任务编号集合与分页总条数
2. 翻至第 2 页记录任务编号集合
3. 对比两页集合
4. 切换每页条数(20→50)复核
5. 若页面提供状态筛选/搜索则验证筛选与重置 | XLS-007 复用上传形成的任务集 | 1. 两页任务编号无重复无丢失
2. 分页总条数与数据库任务总数一致
3. 切换每页条数后分页重算正确、数据不重不漏
4. 若提供筛选则筛选结果准确且重置恢复默认;若未提供筛选,确认设计取舍后关闭本断言(见文末实现口径确认项) | 对应TP-T-004;REQ-009(漏测清单 §4 后台 CRUD 检查项) | +| PLT_TMS_FPKG_039 | 平台端-运单管理-运单文件包-任务列表 | 验证上传后异步处理不阻塞页面且处理中任务展示进度 | P1 | 功能测试 | 1. ACC-001 已登录;2. 准备 1000 行规模合法清单(CNC-001/CNC-006,处理时长足以观察) | 1. 上传 1000 行清单
2. 上传提交后立即切换其他菜单操作验证页面不阻塞
3. 返回任务列表观察处理中行的进度展示
4. 间隔 1 分钟记录进度数值变化直至完成 | BND-007(1000 行清单,按 CNC-006 的 500 批×2 运单混合结构构造);STT-002(原型 186/200 形式) | 1. 上传提交后页面立即可操作,无整页阻塞等待
2. 处理中行显示进度条与"已处理/总数"形式进度(如 186/1000)
3. 进度随时间持续推进,最终与成功/失败数一致
4. 数据库统计字段与进度展示同源一致 | 对应TP-T-005;REQ-019 | +| PLT_TMS_FPKG_040 | 平台端-运单管理-运单文件包-任务列表 | 验证关闭页面或退出登录后任务继续在后台推进 | P1 | 功能测试 | 1. ACC-001 已登录;2. 准备 500 行以上合法清单 | 1. 上传 500 行清单后立即退出登录(或关闭浏览器)
2. 等待 5 分钟
3. 重新登录进入任务列表查看该任务进度与状态
4. 等待其终态并核对统计 | XLS-007 扩展 500 行清单;STT-002 | 1. 退出期间任务仍在后台处理(数据库状态与统计持续推进)
2. 重新进入后进度继续显示而非归零重处理
3. 任务最终正常完成,无因会话中断导致的失败或重复任务
4. 成功/失败数与清单实际数据一致 | 对应TP-T-005;REQ-019 | +| PLT_TMS_FPKG_041 | 平台端-运单管理-运单文件包-任务列表 | 验证失败清单下载内容四列与实际失败行一一对应 | P1 | 功能测试 | 1. 已存在"已完成·部分失败"任务(参照 PLT_TMS_FPKG_026 的构造方式,含 XLS-101/110/111/113 四类失败行 + 1 行合法行);2. ACC-001 已登录 | 1. 点击该行"失败清单"下载 xlsx
2. 核对文件名(IDC-010:失败清单_【任务编号】.xlsx)
3. 逐行核对四列内容
4. 与上传清单原值及任务失败数比对 | IDC-010;XLS-101/110/111/113 构造任务 | 1. 下载得到 xlsx,文件名=失败清单_【任务编号】.xlsx
2. 含 序号/货源单号/运单号/失败原因 四列
3. 行数=任务失败数;每行前三列与上传清单原值一致,失败原因与 4.2.2 各规则文案一致
4. 数据库失败明细记录与 xlsx 内容一致 | 对应TP-T-006;REQ-018 | +| PLT_TMS_FPKG_042 | 平台端-运单管理-运单文件包-任务列表 | 验证失败清单按钮仅在存在失败行时显示 | P1 | 功能测试 | 1. 准备全部成功任务 1(XLS-001/002/003,STT-003)、部分失败任务 1(STT-004);2. 一次文件级被拒上传记录(未创建任务);3. ACC-001 已登录 | 1. 查看全部成功任务操作列
2. 查看部分失败任务操作列
3. 确认文件级被拒场景在列表中无任务行
4. 比对按钮与失败状态的映射 | STT-003 与 STT-004 任务;ERR-004 被拒上传 | 1. 全部成功任务不显示"失败清单"按钮(仅"下载文件包")
2. 部分失败任务两个按钮齐备
3. 文件级被拒上传无任务行亦无失败清单入口(未创建任务) | 对应TP-T-006;REQ-018(漏测清单 §4 按钮映射) | +| PLT_TMS_FPKG_043 | 平台端-运单管理-运单文件包-任务列表 | 验证打包过程中服务异常后任务置失败且无半成品可下载 | P1 | 功能测试 | 1. ACC-001 已登录;2. 具备服务重启/打包进程终止的运维配合手段;3. 已上传 1000 行清单使处理窗口足够 | 1. 上传 1000 行清单进入"处理中"
2. 处理期间重启服务或终止打包进程
3. 服务恢复后观察该任务终态
4. 检查下载按钮并直调下载接口
5. 删除该任务后重新上传 | XLS-006(1000 行);STT-005 | 1. 异常后任务最终置"失败",不永久停留"处理中"(无僵尸任务)
2. 下载按钮不显示,直调下载接口返回不可下载错误,无半成品 zip 提供下载
3. 半成品临时文件被清理,不占用 7 天保留期配额(存储核查)
4. 删除重传后新任务正常完成 | 对应TP-T-007;REQ-024(六#10) | +| PLT_TMS_FPKG_044 | 平台端-运单管理-运单文件包-任务列表 | 验证查看结构弹窗的任务信息与文件包结构树预览 | P3 | 功能测试 | 1. 已完成任务 1(多批次,XLS-001/002/003)与处理中任务 1;2. ACC-001 已登录 | 1. 点击已完成任务行"查看结构"
2. 核对弹窗内任务信息(源文件名/上传人/时间/处理结果)与批次划分说明
3. 展开结构树逐层核对命名
4. 与实际下载 zip 的目录结构逐层比对
5. 查看处理中任务是否提供结构预览
6. 测试关闭按钮与遮罩关闭 | STT-003/STT-002 任务;IDC-006/007/008 命名 | 1. 弹窗展示任务信息与批次划分说明且与实际归批一致
2. 结构树命名与实际 zip 逐层一致(总包/批次包/运单包/证件后缀)
3. 处理中任务不提供结构预览下载(原型仅"结构预览"按钮无下载)
4. 关闭按钮与遮罩关闭均可用 | 对应TP-T-008;REQ-011;⚠️ 待确认 Q1:"查看结构/文件包结构预览"仅见于原型、需求正文未定义——影响本用例保留与否与断言范围;建议需求方确认本期是否实现,确认裁剪则删除本用例,确认实现则按弹窗实际字段回填断言 | +| PLT_TMS_FPKG_045 | 平台端-运单管理-运单文件包-打包归批 | 验证按系统内三要素归批并复现需求五章示例 | P0 | 功能测试 | 1. ACC-001 已登录;2. 环境运单与需求五章示例一致:YD20260901001/YD20260901003 同属张三/340102199001011234/皖A12345,YD20260901002 属李四/340102199001015678/皖B67890,另有张三/皖A12345 挂货源 HY202609002 的有效运单 1 单(CMB-007,数据缺口 #1/#8) | 1. 上传 XLS-001/002/003 三行清单并追加 CMB-007 运单行(序号 1/2/3/4,货源单号 HY202609001/HY202609002/HY202609001/HY202609002)
2. 等待任务完成并下载 zip
3. 解压核对批次包数量与运单包归属
4. 确认清单不含司机列、归批依据为系统内数据 | XLS-001/002/003;CMB-007(跨货源同批次行);CMB-001/002;IDC-004/005 | 1. zip 内恰有 2 个批次包:张三-340102199001011234-皖A12345 与 李四-340102199001015678-皖B67890
2. 批次①含运单包 1-YD20260901001-HY202609001-含司机及车辆证件、3-YD20260901003-HY202609001 与 4-【CMB-007 运单号】-HY202609002(跨货源运单仍归同批,归批不看货源单号)
3. 批次②含 2-YD20260901002-HY202609002-含司机及车辆证件(单运单批次)
4. 批次包数量=三要素去重数 2,与需求五章示例逐项一致 | 对应TP-P-001;REQ-010(含 CMB-007 跨货源不拆批负向对照,与 046 拆批两侧互补) | +| PLT_TMS_FPKG_046 | 平台端-运单管理-运单文件包-打包归批 | 验证同一司机换车牌或同一车牌换司机均拆分批次 | P0 | 功能测试 | 1. 环境准备:张三(同证)分别挂皖A12345 与皖C88888 的运单各 1 单(CMB-003);皖A12345 分别由张三与王五承运的运单各 1 单(CMB-004)(数据缺口 #8);2. ACC-001 已登录 | 1. 上传含 CMB-003 两组运单的清单等待完成并下载 zip
2. 核对批次包数量与归属
3. 上传含 CMB-004 两组运单的清单重复验证
4. 核对各批次最小序号证件挂载 | CMB-003(同司机换车);CMB-004(同车换司机) | 1. 场景一 zip 含 2 个批次包(张三+皖A12345、张三+皖C88888),各批次独立判定最小序号并挂证件
2. 场景二 zip 含 2 个批次包(张三+皖A12345、王五+皖A12345)
3. 任一要素不同即拆批,各批次包内运单包归属正确
4. 批次包数量=三要素去重批次数 | 对应TP-P-002;REQ-010 | +| PLT_TMS_FPKG_047 | 平台端-运单管理-运单文件包-打包归批 | 验证同名同车牌但身份证号不同拆分为两个批次 | P0 | 功能测试 | 1. 环境准备两个司机档案:姓名均为张三、车辆均绑定皖A12345、身份证号分别为 340102199001011234 与 330102199201012345(CMB-005,数据缺口 #7),各有运单 1 单;2. ACC-001 已登录 | 1. 上传含两运单的清单(序号 1、2)
2. 任务完成后下载 zip
3. 核对批次包数量与两包身份证号差异
4. 核对各批次运单包证件子目录 | CMB-005;IDC-004 | 1. zip 含 2 个批次包,批次包名仅身份证号段不同(三要素缺一不可)
2. 每个批次包为单运单批次且运单包均含证件后缀与四个子目录
3. 不因姓名与车牌相同而合并为一批 | 对应TP-P-002;REQ-010 | +| PLT_TMS_FPKG_048 | 平台端-运单管理-运单文件包-打包归批 | 验证三层目录命名规则与需求示例逐字一致 | P0 | 功能测试 | 1. 已完成任务(XLS-001/002/003)且已下载 zip;2. 解压工具可用 | 1. 核对总包文件名
2. 核对批次包目录名(含身份证号完整 18 位)
3. 核对最小序号运单包名与证件后缀
4. 核对非最小序号运单包名
5. 检查 zip 顶层层级与连接符 | IDC-006/007/008;XLS-001/002/003 任务;决议#3 | 1. 总包名=运单资料_【任务编号】.zip
2. 批次包名=张三-340102199001011234-皖A12345(连接符"-",身份证号完整 18 位明文非脱敏)
3. 最小序号运单包=1-YD20260901001-HY202609001-含司机及车辆证件;非最小序号运单包=3-YD20260901003-HY202609001 无证件后缀
4. zip 顶层即批次包目录,无多余嵌套层级 | 对应TP-P-003;REQ-011(决议#3,命名与 4.4.2 逐字一致) | +| PLT_TMS_FPKG_049 | 平台端-运单管理-运单文件包-打包归批 | 验证最小序号运单包四子目录齐全且其余运单包仅含合同回单 | P0 | 功能测试 | 1. 已完成任务(XLS-001/002/003);2. 运单均已结算打款含支付回单与承运合同,张三/李四档案证件照片齐全(数据缺口 #1);3. ACC-001 已登录 | 1. 解压 zip 进入批次①最小序号运单包 1-YD20260901001-…-含司机及车辆证件
2. 核对四个子目录及文件
3. 进入 3-YD20260901003-…运单包核对子目录
4. 进入批次②单运单批次运单包 2-…核对
5. 抽检各子目录文件可打开 | IDC-009(合同/电子回单/司机证件/车辆证件);CMB-001/002 | 1. 最小序号运单包含 合同/电子回单/司机证件/车辆证件 四个子目录且均有文件
2. 3-…运单包仅含 合同/电子回单,确无司机证件/车辆证件子目录(既不生成空目录,目录内也不得含任何证件文件)
3. 单运单批次 2-…运单包含四子目录且带证件后缀
4. 抽检合同/回单/证件文件均可打开非损坏 | 对应TP-P-004;REQ-012(验收要点 2/3) | +| PLT_TMS_FPKG_050 | 平台端-运单管理-运单文件包-打包归批 | 验证合同子目录仅导出承运合同不含委托与框架合同 | P1 | 功能测试 | 1. 环境准备:运单 A 含承运合同、运单 B 仅含委托合同、运单 C 含承运+框架合同(CMB-015,数据缺口 #2/#3);2. ACC-001 已登录 | 1. 上传含运单 A/B/C 的清单等待完成
2. 下载 zip 分别核对三个运单包的合同子目录
3. 与各运单详情页-合同附件列表逐份比对
4. 核对失败清单 | CMB-015;STT-014/015;决议#5 | 1. 运单 A 合同子目录含全部承运合同文件且可打开
2. 运单 B 不导出委托合同(合同子目录不生成或不含委托合同文件),原因记入失败清单
3. 运单 C 仅导出承运合同,框架合同不入包
4. 导出合同集合与运单详情-合同附件当前列表一致 | 对应TP-P-005;REQ-013(决议#5 合同口径) | +| PLT_TMS_FPKG_051 | 平台端-运单管理-运单文件包-打包归批 | 验证多笔支付运单导出全部对应银行电子回单 | P1 | 功能测试 | 1. 环境准备含 3 笔支付记录的运单(数据缺口 #6);2. ACC-001 已登录;3. 承运结算-电子回单可查询该运单支付记录 | 1. 在承运结算-电子回单查询该运单支付与回单记录数
2. 上传含该运单的清单等待完成并下载 zip
3. 核对电子回单子目录文件数与内容
4. 抽查回单文件可打开 | BND-062/063;CMB-014(2 笔支付同类) | 1. 电子回单子目录含 3 份回单文件,与该运单 3 笔支付记录一一对应
2. 回单文件可打开且与银行回单原件一致
3. 同名回单自动追加 (1)、(2) 不互相覆盖 | 对应TP-P-006;REQ-013(术语表:电子回单=运单全部支付记录对应银行电子回单) | +| PLT_TMS_FPKG_052 | 平台端-运单管理-运单文件包-打包归批 | 验证司机与车辆证件按最小序号运单档案导出且全批仅一份 | P1 | 功能测试 | 1. 张三司机档案含身份证人像面/国徽面、驾驶证、从业资格证照片;皖A12345 车辆档案含行驶证、道路运输证照片(数据缺口 #1/#13);2. 已完成任务 zip(XLS-001/003 同批) | 1. 核对最小序号运单包司机证件子目录文件种类与档案一致
2. 核对车辆证件子目录文件种类
3. 全 zip 检索确认证件文件仅在最小序号运单包出现一次
4. 打开证件照片验证非损坏 | IDC-009;需求 4.4.3 档案口径 | 1. 司机证件含档案全部证件照片(身份证正反面、驾驶证、从业资格证等)
2. 车辆证件含行驶证、道路运输证等档案证件照片
3. 同批次其余运单包(3-…)无任何证件文件(不重复导出)
4. 照片文件可打开非损坏 | 对应TP-P-006;REQ-013(4.4.3 以最小序号运单挂载档案为准) | +| PLT_TMS_FPKG_053 | 平台端-运单管理-运单文件包-打包归批 | 验证最小序号运单被剔除后证件改挂重算的最小序号运单 | P0 | 功能测试 | 1. 张三批次构造 3 行:序号 1 行运单号填不存在的 YD20991231001(校验失败)、序号 3 行 YD20260901003、序号 5 行 YD20260901004(均有效,CMB-006+XLS-004);2. ACC-001 已登录 | 1. 上传该 3 行清单等待完成
2. 核对失败清单含序号 1 行
3. 下载 zip 核对批次①运单包命名与子目录
4. 全 zip 检索确认无序号 1 运单包 | CMB-006(序号 1、3、5);决议#8;XLS-003/004 | 1. 序号 1 行进失败清单,原因"运单号在系统中不存在"
2. 证件改挂序号 3:运单包名=3-YD20260901003-HY202609001-含司机及车辆证件,含四个子目录
3. 序号 5 运单包仅含合同+电子回单
4. 全 zip 无 1-… 运单包;成功数=2、失败数=1 | 对应TP-P-007;REQ-015(决议#8、六#6;全需求最易错点,回归必测) | +| PLT_TMS_FPKG_054 | 平台端-运单管理-运单文件包-打包归批 | 验证单运单批次唯一运单被剔除后整批不生成 | P0 | 功能测试 | 1. 构造 3 行清单:批次①为 XLS-001/003(张三批正常 2 行)、批次②唯一行填不存在的运单号(2/HY202609002/YD20991231001);2. ACC-001 已登录 | 1. 上传该清单等待完成
2. 下载 zip
3. 检索李四批次包是否存在
4. 核对失败清单与统计 | 构造清单(XLS-001/003+不存在单号行);CMB-006 变体 | 1. zip 内无 李四-340102199001015678-皖B67890 批次包
2. 失败清单含该行且原因"运单号在系统中不存在"
3. 张三批次包正常生成且证件挂载不受影响
4. 成功数=2、失败数=1,与 zip 内容一致 | 对应TP-P-007;REQ-015(决议#8 单运单批次剔除边界) | +| PLT_TMS_FPKG_055 | 平台端-运单管理-运单文件包-打包归批 | 验证运单无支付记录时电子回单缺失不阻断任务 | P0 | 功能测试 | 1. 环境准备无支付记录的已关闭运单 1 单(STT-012,司机取消终止流转,数据缺口 #4)与正常运单 XLS-001;2. ACC-001 已登录 | 1. 上传含两运单的清单等待完成
2. 查看任务状态
3. 下载 zip 核对无回单运单包的子目录
4. 核对失败清单原因 | STT-012(已关闭无支付);BND-061;六#4 | 1. 任务状态"已完成·部分失败"而非"失败"
2. 无回单运单包无"电子回单"子目录,其余子目录正常生成
3. 失败清单记"无电子回单:运单无支付记录"类原因(原型文案)
4. 正常运单不受影响完整打包 | 对应TP-P-008;REQ-015(六#4;按 4.4.4 条款一"不阻断仅记清单"口径设计,与条款二衔接见文末实现口径确认项数据缺口 #17) | +| PLT_TMS_FPKG_056 | 平台端-运单管理-运单文件包-打包归批 | 验证运单无合同附件时合同子目录不生成且不阻断 | P0 | 功能测试 | 1. 环境准备运单详情-合同附件为空的运单 1 单(CMB-016);2. 正常运单 XLS-001 可用;3. ACC-001 已登录 | 1. 上传含该运单与 XLS-001 的清单等待完成
2. 下载 zip 核对该运单包子目录
3. 核对失败清单与任务状态
4. 确认正常运单打包不受影响 | CMB-016;STT-014 | 1. 该运单包无"合同"子目录,其余子目录按规则正常
2. 失败清单记无合同类原因
3. 任务"已完成·部分失败",成功数含两运单中有效者
4. XLS-001 正常打包不阻断 | 对应TP-P-008;REQ-015(4.4.4 文件缺失不阻断) | +| PLT_TMS_FPKG_057 | 平台端-运单管理-运单文件包-打包归批 | 验证单文件 OBS 拉取前两次失败第三次成功正常入包 | P1 | 功能测试 | 1. 运维配合构造某运单合同文件 OBS 前 2 次访问失败、第 3 次成功(篡改 URL 或 mock,数据缺口 #11);2. ACC-001 已登录 | 1. 上传含该运单的清单
2. 观察任务处理与服务端重试日志
3. 任务完成后下载 zip
4. 核对该文件数量与内容 | BND-041/042(第 1、2 次失败第 3 次成功);数据缺口 #11 | 1. 系统自动重试,第 3 次拉取成功
2. 文件正常入包且 zip 内仅一份(无重试导致重复落盘)
3. 该运单不进失败清单
4. 任务正常完成不受影响 | 对应TP-P-009;REQ-015(项目画像 §6.1 华为云 OBS 为关键依赖) | +| PLT_TMS_FPKG_058 | 平台端-运单管理-运单文件包-打包归批 | 验证单文件重试 3 次全失败记入失败清单且不阻断任务 | P1 | 回归测试 | 1. 运维配合构造某运单全部文件 OBS 拉取持续失败(数据缺口 #11);2. 同清单另有正常运单;3. ACC-001 已登录 | 1. 上传清单观察服务端重试日志(恰 3 次后停止)
2. 任务完成后核对状态与失败清单
3. 下载 zip 检查该文件与临时残留
4. 核对其余运单完整打包 | BND-043(3 次全失败第 4 次不重试) | 1. 重试恰 3 次后停止,不无限重试
2. 该文件记入失败清单(原因含文件拉取失败类文案)
3. 任务继续处理其余文件并正常完成,不整体失败
4. zip 内无重复文件与半成品残留(重试幂等) | 对应TP-P-009;REQ-015;[AI修正: 历史缺陷防御](BUG-202607-02 重试幂等同类防御) | +| PLT_TMS_FPKG_059 | 平台端-运单管理-运单文件包-打包归批 | 验证运单包内文件保留原名且同目录重名自动追加序号 | P1 | 功能测试 | 1. 环境准备:同一运单上传 2 份同名合同附件;司机档案同时存在 身份证.jpg 与 身份证(1).jpg(BND-073,数据缺口 #13);2. ACC-001 已登录 | 1. 上传含该运单清单等待完成并下载 zip
2. 核对合同子目录两份同名文件命名
3. 核对司机证件子目录文件命名
4. 分别打开各文件核对内容对应各自原件
5. 检查跨运单包同名文件 | BND-071/072/073;CMB-014 | 1. 同目录第 2 个同名文件命名为 原名(1).后缀、第 3 个为 原名(2).后缀
2. 档案已有 身份证(1).jpg 时新导出同名文件命名不冲突(基于实际文件集合去重)
3. 各文件内容与各自原件对应且可打开
4. 跨运单包同名文件互不影响;原文件名(含中文/日期)未被篡改 | 对应TP-P-010;REQ-014 | +| PLT_TMS_FPKG_060 | 平台端-运单管理-运单文件包-打包归批 | 验证司机姓名含非法字符或超长时批次包命名不失败不乱码 | P1 | 功能测试 | 1. 环境准备司机档案:姓名含间隔号(阿依古丽·买买提)、姓名含 Windows 非法字符(正斜杠、反斜杠、冒号、星号、问号、英文双引号、尖括号、竖线,后台构造)、超长姓名档案(ERR-040,数据缺口 #5/#7 类构造);2. ACC-001 已登录 | 1. 上传含上述档案运单的清单等待完成
2. 下载 zip 到 Windows 解压
3. 核对批次包目录名的字符处理规则
4. 核对总包完整路径长度 | ERR-040(特殊字符/Emoji/超长姓名档案) | 1. 打包不失败、任务正常完成
2. 非法字符被统一替换或转义且规则可解释(具体策略以开发实现为准,见文末实现口径确认项)
3. Windows 解压无"路径过长/非法字符"错误、无乱码
4. 超长组合名不导致打包中断(截断策略确认后固化断言) | 对应TP-P-011;REQ-011(联动 PLT_TMS_FPKG_081 兼容性) | +| PLT_TMS_FPKG_061 | 平台端-运单管理-运单文件包-打包归批 | 验证 2000 行规模打包后 zip 包数量与任务统计严格一致 | P1 | 回归测试 | 1. XLS-006(2000 行混合多批次,其中混入 20 行非法行:运单号不存在类);2. ACC-001 已登录 | 1. 上传 2000 行清单等待完成
2. 记录总行数/成功数/失败数
3. 下载 zip 全量清点运单包数量与批次包数量
4. 与成功数、三要素去重批次数比对 | XLS-006;CMB-012/017 | 1. zip 内运单包数量=成功数(如成功 1980 则恰 1980 个运单包)
2. 批次包数量=三要素去重批次数
3. 成功数+失败数=总行数 2000
4. 全量清点无缺包无多包,列表统计与包内容不出现"两张皮" | 对应TP-P-012;REQ-004/REQ-012;[AI修正: 历史缺陷防御](BUG-202607-03 跨模块数据不一致) | +| PLT_TMS_FPKG_062 | 平台端-运单管理-运单文件包-打包归批 | 验证打包读取合同与回单来源于正确数据源而非缓存 | P1 | 回归测试 | 1. 环境运单 YD20260901001 含 2 份承运合同附件与 1 笔支付回单;2. 可查询支付流水表与合同附件表;3. ACC-001 已登录 | 1. 上传含该运单清单等待完成
2. 下载 zip 比对合同子目录文件与运单详情-合同附件列表
3. 比对电子回单文件与支付流水对应回单
4. 抽查服务端取数日志确认查询来源表 | STT-014;BND-062 | 1. zip 合同文件集合=运单详情-合同附件当前列表(非历史缓存)
2. 回单文件=支付流水表当前记录对应回单
3. 文件内容与原件一致可打开
4. 不出现旧版本文件或已删除附件残留 | 对应TP-P-013;REQ-013/REQ-015;[AI修正: 历史缺陷防御](BUG-202607-03 数据溯源) | +| PLT_TMS_FPKG_063 | 平台端-运单管理-运单文件包-打包归批 | 验证打包期间源数据变更时包内数据口径全任务一致 | P1 | 回归测试 | 1. 准备 500 行以上清单使打包窗口足够长;2. 运维/业务可对该批运单追加支付(生成新回单)与更换司机证件照;3. ACC-001 已登录 | 1. 上传大清单进入"处理中"
2. 打包期间给清单内某运单新增 1 笔支付(产生新回单)并更换另一运单司机档案证件照
3. 任务完成后下载 zip
4. 核对该运单回单份数与证件照版本的全任务一致性 | XLS-007 扩展 500 行;STT-011 | 1. 该运单回单份数按确认口径处理且全任务一致(快照口径不含新增回单、实时口径包含新增回单,二者取一,不出现同任务内新旧混杂)
2. 证件照片版本同样全任务一致
3. 任务正常完成不因源数据变更失败 | 对应TP-P-013;REQ-013/REQ-015;[AI修正: 历史缺陷防御](BUG-202607-03);⚠️ 待确认 Q4:打包期间源数据变更(新回单/换证件照/运单关闭)按任务开始时刻快照还是实时拉取——影响本用例断言 1 取值与 TP-P-013 回归口径;建议需求方确认后回填断言 | +| PLT_TMS_FPKG_064 | 平台端-运单管理-运单文件包-打包归批 | 验证 zip 不加密且身份证号明文下补偿控制同时生效 | P2 | 安全性测试 | 1. 已完成任务 zip(XLS-001/002/003);2. ACC-001 已登录 | 1. 下载 zip 直接解压验证无密码
2. 核对批次包目录名身份证号为完整 18 位明文
3. 打开证件照片验证可读
4. 核对该次下载的审计日志已记录与菜单权限控制生效 | IDC-004(340102199001011234);决议#3/#12 | 1. zip 无密码可直接解压(决议#12 落地)
2. 批次包名身份证号完整非脱敏(决议#3 落地)
3. 证件照片可打开
4. 权限+审计补偿链同时生效:无权限账号不可达下载接口(联动 PLT_TMS_FPKG_006)、每次下载有审计日志(联动 PLT_TMS_FPKG_067),不存在"不加密又无审计"中间态 | 对应TP-P-014;REQ-026(RISK-COMPLIANCE 暴露面确认) | +| PLT_TMS_FPKG_065 | 平台端-运单管理-运单文件包-下载审计 | 验证任务完成后下载总包 zip 的命名与完整性 | P0 | 功能测试 | 1. 已完成任务 1(全部成功,STT-003)与"已完成·部分失败"任务 1(STT-004);2. ACC-001 已登录 | 1. 在已完成任务行点击"下载文件包"
2. 核对下载文件名
3. 解压验证完整性
4. 对部分失败任务重复下载核对仅含成功运单
5. 下载前后对比任务状态与统计数 | IDC-006;STT-003/STT-004 | 1. 下载文件名=运单资料_【任务编号】.zip
2. zip 完整可解压无损坏,含全部批次文件包
3. 部分失败任务 zip 仅含成功运单资料
4. 下载不改变任务状态与成功/失败统计(数据库字段前后一致) | 对应TP-D-001;REQ-016 | +| PLT_TMS_FPKG_066 | 平台端-运单管理-运单文件包-下载审计 | 验证同一任务重复下载幂等不重复生成文件包 | P0 | 功能测试 | 1. 已完成任务 1(STT-003);2. 已记录首次下载 zip 的哈希值与文件包存储信息;3. ACC-001 与 ACC-006 两账号可用 | 1. ACC-001 连续下载 3 次并分别计算哈希
2. 用 ACC-006 再下载同一任务
3. 下载进行中立即再次点击下载
4. 核对服务端存储与任务完成时间 | CNC-005;IDC-006;ACC-001/ACC-006 | 1. 3 次 zip 哈希一致、内容完整
2. 两账号下载均成功且互不覆盖
3. 下载中再次点击不产生第二个半成品文件(获得完整包或排队提示)
4. 服务端完成时间与文件包存储不因重复下载变化(未重新打包) | 对应TP-D-002;REQ-016(七章幂等行) | +| PLT_TMS_FPKG_067 | 平台端-运单管理-运单文件包-下载审计 | 验证每次下载记录含操作人时间任务编号的审计日志 | P0 | 安全性测试 | 1. 已完成任务 1;2. ACC-001 与 ACC-006 可分别登录;3. 审计日志查询入口可用(运维工具-行为日志或专项审计表) | 1. ACC-001 下载一次并记录时间
2. ACC-006 下载一次
3. ACC-001 再次下载
4. 按任务编号检索审计日志逐条核对 | ACC-001/ACC-006;IDC-006;REQ-017 审计三要素 | 1. 每次下载产生一条审计日志,含操作人、操作时间、任务编号三要素
2. 重复下载逐次留痕(3 次下载 3 条记录,非仅记首次)
3. 日志时间与实际下载时间一致(秒级)
4. 按任务编号可反查全部下载人清单 | 对应TP-D-003;REQ-017;⚠️ 待确认 Q6:失败清单下载是否同样记审计日志——失败清单含货源/运单号属敏感业务数据;建议一并留痕,确认后补充失败清单下载审计断言 | +| PLT_TMS_FPKG_068 | 平台端-运单管理-运单文件包-下载审计 | 验证未完成任务直调下载接口被后端双重校验拒绝 | P1 | 回归测试 | 1. 准备待处理、处理中、失败任务各 1(STT-001/002/005);2. 抓包工具可获取已完成任务的下载接口报文;3. ACC-001 已登录 | 1. 确认三类任务行均无下载按钮
2. 抓取已完成任务下载请求,分别替换任务编号为待处理/处理中/失败任务后重放
3. 任务刚转"已完成"瞬间并发发起下载请求
4. 核对各响应 | STT-001/002/005 任务;下载接口报文 | 1. 三类状态前端均无下载按钮
2. 直调下载接口均返回明确错误(403/业务错误码),不返回 200 文件流或半成品
3. 完成瞬间并发请求要么等待打包落库后返回完整包、要么明确拒绝,不返回半成品 zip
4. 后端状态校验独立于前端按钮(双重拦截) | 对应TP-D-004;REQ-008/REQ-016;[AI修正: 历史缺陷防御](BUG-202607-01 仅前端控制同类防御) | +| PLT_TMS_FPKG_069 | 平台端-运单管理-运单文件包-下载审计 | 验证不提供按批次文件包单独下载的入口与接口 | P3 | 功能测试 | 1. 已完成多批次任务 1(XLS-001/002/003 两个批次);2. 接口探测工具可用;3. ACC-001 已登录 | 1. 检查任务行与任务详情/结构弹窗全部操作项
2. 探测下载接口携带批次参数的请求(如批次目录名/批次序号)
3. 正常下载总包确认功能不受影响 | 决议#11;多批次任务 | 1. 页面无"按批次下载"类按钮或入口
2. 携带批次参数的下载探测请求返回 404/403 或不被解释为批次下载,无导出单批次能力
3. 总包下载功能正常(负向裁剪不误伤主功能) | 对应TP-D-005;REQ-025(决议#11 本期不做,防过度实现) | +| PLT_TMS_FPKG_070 | 平台端-运单管理-运单文件包-下载审计 | 验证下载中断或取消后服务端文件包完好可重新下载 | P1 | 功能测试 | 1. 已完成任务 1(zip 较大,含证件图片);2. 浏览器开发者工具可限速断网;3. ACC-001 已登录 | 1. 开始下载后中途断网(或浏览器手动取消下载)
2. 恢复网络后重新点击下载
3. 核对二次下载 zip 完整性
4. 检查服务端日志与存储 | IDC-006;大 zip 任务 | 1. 中断/取消不影响服务端文件包(存储完好)
2. 重新下载获得完整 zip(与首次完整包一致可解压)
3. 服务端无异常日志刷屏、无残留半成品响应
4. 审计日志按实际成功下载记录 | 对应TP-D-006;REQ-016(漏测清单弱网项) | +| PLT_TMS_FPKG_071 | 平台端-运单管理-运单文件包-下载审计 | 验证 1000 单规模大 zip 下载不因网关超时失败 | P1 | 性能测试 | 1. 已完成 1000 单任务(含证件图片,zip 数百 MB 级);2. 已确认网关(OpenResty)超时阈值配置;3. ACC-001 已登录 | 1. 点击下载并计时至下载完成
2. 核对 zip 完整性
3. 重复 3 次记录耗时基线
4. 观察服务端资源 | CNC-006 产出任务;BND-007 | 1. 下载全程无网关 504/超时中断(耗时在网关超时阈值内或支持流式输出/断点续传)
2. 下载完成的 zip 完整可解压
3. 3 次耗时基线已记录供回归对比,服务端无内存异常 | 对应TP-D-006;REQ-016 | +| PLT_TMS_FPKG_072 | 平台端-运单管理-运单文件包-非功能 | 验证 1000 单规模任务 30 分钟内完成并记录基线 | P1 | 性能测试 | 1. 环境已造 1000 单有效运单(500 批×2 运单混合结构,数据缺口 #1);2. 生成对应 1000 行清单;3. 并发队列为空 | 1. 记录开始时间并上传 1000 行清单
2. 间隔 1 分钟轮询任务状态与进度
3. 记录转"处理中"与"已完成"时刻
4. 抽检 zip 内 3 个批次包完整性
5. 用 XLS-006 全量 2000 行重复观测(仅记录不设卡) | BND-007(1000 行);CNC-006;XLS-006(2000 行) | 1. 1000 单任务从上传到"已完成"实测小于 30 分钟
2. 进度持续推进,无 5 分钟以上零进度停滞
3. 抽检批次包结构完整、文件可打开
4. 耗时基线已记录;2000 行观测值单独记录不作为验收卡点 | 对应TP-N-001;REQ-020(RISK-AVAILABILITY P1 容量侧面) | +| PLT_TMS_FPKG_073 | 平台端-运单管理-运单文件包-非功能 | 验证并发提交多任务时处理数不超过上限且排队不丢失 | P1 | 性能测试 | 1. 准备 5 份合法清单(每份 300~500 行);2. 已确认并发上限配置(1~2);3. ACC-001 已登录 | 1. 5 份清单在 10 秒内先后上传(其中 1 份由 ACC-006 提交,构造 CNC-007 双账号并发)
2. 以 10 秒级轮询记录各任务状态
3. 统计同一时刻"处理中"任务数峰值
4. 等待全部任务终态并逐一下载验证 zip | CNC-002/003/007;BND-051/052/053;STT-001;ACC-006 | 1. 同一时刻"处理中"任务数不超过 2,其余停留"待处理"
2. 排队任务按提交顺序依次转"处理中"
3. 5 个任务全部完成且 zip 完整无丢失
4. 排队期间上传入口可用(可继续新建任务),数据库无任务丢失或状态错乱;各任务上传人字段与提交账号一一对应(ACC-001/ACC-006) | 对应TP-N-002;REQ-022(六#8;RISK-AVAILABILITY P1 主场景,不得省略) | +| PLT_TMS_FPKG_074 | 平台端-运单管理-运单文件包-非功能 | 验证同一文件毫秒级并发重复提交仅创建一个任务 | P1 | 回归测试 | 1. ACC-001 已登录;2. 接口工具可并发重放上传请求;3. 准备合法清单文件(XLS-001/002/003) | 1. 页面选择文件后 1 秒内快速连点"开始上传并创建任务"5 次
2. 另用接口工具携带同一会话并发重放上传请求 3 次
3. 查询任务列表与数据库任务表 | CNC-008;XLS-001/002/003 清单 | 1. 页面连点仅创建 1 个任务(前端防抖)
2. 接口并发重放仅创建 1 个任务(后端幂等键/分布式锁)
3. 数据库任务表仅 1 条新记录
4. 前端防抖与后端幂任一失效即本用例失败 | 对应TP-N-003;REQ-022/REQ-023;[AI修正: 历史缺陷防御](BUG-202607-02 重试+手动触发并发提交防御;项目画像 §8.2 必测幂等) | +| PLT_TMS_FPKG_075 | 平台端-运单管理-运单文件包-非功能 | 验证上传接口超时时有明确提示且重试前防重复建任务 | P1 | 功能测试 | 1. ACC-001 已登录;2. 代理工具可模拟上传接口响应延迟超过 30 秒 | 1. 开启延迟模拟后正常上传清单
2. 观察前端 Loading 与超时提示
3. 超时后先刷新列表查询任务是否已创建再决定重新上传
4. 核对最终任务数量 | 漏测清单 §2(30 秒级超时);XLS-001/002/003 | 1. 上传请求发出后按钮防重复点击、有 Loading 态
2. 超时给出明确提示,非静默失败
3. 重试前查询发现任务已创建则不重复上传,最终仅 1 个任务
4. 若服务端已建任务而前端提示失败,重传请求被幂等拦截不产生第二个任务 | 对应TP-N-003;REQ-022/REQ-023(漏测清单超时处理项) | +| PLT_TMS_FPKG_076 | 平台端-运单管理-运单文件包-非功能 | 验证文件包第 7 天内可下载过期后不可下载 | P1 | 功能测试 | 1. 已完成任务 1 并记录完成时间 T0;2. 具备保留期模拟手段(回拨数据库完成时间或开发提供 mock,需运维配合);3. ACC-001 已登录 | 1. 将任务完成时间模拟为 6 天前,点击下载验证
2. 模拟为恰好 7 天前整,点击下载验证临界行为
3. 模拟为 8 天前,点击下载并观察提示
4. 核对数据库保留期字段与清理任务记录 | BND-031/032/033;STT-021/022 | 1. 第 6 天可正常下载完整 zip
2. 第 7 天整临界行为与实现口径一致(以"完成时间+7 天"为界,需开发确认后固化)
3. 第 8 天下载被拒,提示"文件包已超过 7 天保留期,请重新上传清单生成"类文案(原型文案)
4. 数据库保留期字段/清理记录标记过期 | 对应TP-N-004;REQ-021(决议#10;临界口径见文末实现口径确认项) | +| PLT_TMS_FPKG_077 | 平台端-运单管理-运单文件包-非功能 | 验证过期任务的列表展示形态与存储清理及重新上传 | P1 | 功能测试 | 1. 已过期任务 1(承接 PLT_TMS_FPKG_076 步骤产出);2. 对象存储控制台/工具可核查;3. ACC-001 已登录 | 1. 查看过期任务在列表中的展示(状态标签、按钮、置灰形态)
2. 核查对象存储中该 zip 是否已清理
3. 使用同清单重新上传
4. 核对新任务与旧任务互不影响 | STT-006(原型"已过期"标签);STT-022;BND-033 | 1. 过期任务展示形态按确认口径实现:新增"已过期"展示标签 或 保持原状态+下载按钮置灰,二选一,不出现无法理解的展示态
2. 过期后存储文件被自动清理,无静默占用(对象存储核查)
3. 重新上传同清单创建新任务并可正常完成下载
4. 旧任务记录不影响新任务编号与统计 | 对应TP-N-004;REQ-021;⚠️ 待确认 Q5:过期任务列表展示形态——需求 4.3.1 状态机仅 5 态,原型任务列表有灰色"已过期"标签;影响本用例断言 1 与列表/状态字典实现;建议确认新增展示态 or 原状态+按钮置灰后回填 | +| PLT_TMS_FPKG_078 | 平台端-运单管理-运单文件包-非功能 | 验证下载 URL 鉴权与审计反查的敏感数据补偿控制 | P2 | 安全性测试 | 1. 已完成任务 1;2. 抓包工具可用;3. 无权限对照账号 ACC-003 可登录;4. ACC-001 已登录 | 1. ACC-001 下载并抓取下载 URL
2. 将该 URL 复制到未登录浏览器与 ACC-003 会话直接访问
3. 篡改 URL 中任务编号或签名类参数后重放
4. 在审计日志按任务编号反查下载人 | ACC-001/ACC-003;IDC-006;REQ-026 补偿控制 | 1. 下载 URL 携带鉴权信息,未登录/无权限会话访问被拒,不可离线伪造或转发生效
2. 若实现签名/一次性链接,则过期或二次使用失效
3. 篡改参数被校验拒绝,不返回文件流
4. 审计日志可完整反查"谁在何时下载了哪个任务"(联动 PLT_TMS_FPKG_067) | 对应TP-N-005;REQ-002/REQ-017/REQ-026(RISK-COMPLIANCE 补偿控制链) | +| PLT_TMS_FPKG_079 | 平台端-运单管理-运单文件包-非功能 | 验证 OBS 持续不可用时任务超时置失败可删除重传 | P1 | 功能测试 | 1. 运维配合断开服务对 OBS 的访问(网络策略或 mock);2. ACC-001 已登录;3. 准备合法清单(XLS-001/002/003) | 1. OBS 断开期间上传清单
2. 观察任务状态变化(重试→超时)
3. 确认任务最终置"失败"并检查可删除
4. 检查无僵尸"处理中"任务与半成品 zip | STT-005;数据缺口 #11 | 1. 任务不无限停留"处理中",超时后置"失败"
2. 失败任务可删除(联动 PLT_TMS_FPKG_036)
3. 无半成品 zip 可下载
4. 数据库任务终态与系统级失败原因记录完整可解释 | 对应TP-N-006;REQ-015/REQ-024(项目画像必测"依赖服务不可用") | +| PLT_TMS_FPKG_080 | 平台端-运单管理-运单文件包-非功能 | 验证 OBS 恢复后删除重传全链路成功且不拖累其他业务 | P1 | 功能测试 | 1. 承接 PLT_TMS_FPKG_079 的失败任务;2. OBS 已恢复访问;3. ACC-001 已登录 | 1. 删除 OBS 故障期的失败任务
2. 重新上传同清单等待完成
3. 下载 zip 抽检文件完整
4. 同期并行验证装卸货图片上传等其他 OBS 业务正常 | STT-005→STT-003;XLS-001/002/003 | 1. 删除重传后新任务全链路成功,无需人工修数据
2. zip 内容完整与正常时期一致
3. 平台其他 OBS 业务(装卸货图片等)不受本功能故障与恢复影响
4. 服务端无残留脏数据 | 对应TP-N-006;REQ-015/REQ-024 | +| PLT_TMS_FPKG_081 | 平台端-运单管理-运单文件包-非功能 | 验证 zip 中文目录与多来源 xlsx 的兼容性 | P2 | 兼容性测试 | 1. 已完成任务 zip(批次包名含中文司机姓名与车牌,如 张三-340102199001011234-皖A12345);2. WPS 生成的 xlsx 清单、.xls 改后缀 .xlsx 文件;3. Chrome/Edge/Firefox 浏览器可用 | 1. 在 Windows 资源管理器解压 zip 核对中文目录名
2. 用 WinRAR/7-Zip/Bandizip 各解压一次核对
3. 上传 WPS 生成的 xlsx 验证解析
4. 上传 .xls 改后缀 .xlsx 验证拒绝口径
5. 三种浏览器分别下载核对文件名 | IDC-007(中文批次包名);ERR-001/003;XLS-001/002/003 | 1. 中文批次包名在资源管理器与常用解压工具下显示正确无乱码(zip UTF-8 标志位兼容)
2. WPS 生成的合法 xlsx 可正常解析上传
3. .xls 改后缀 .xlsx 被拒绝(与 PLT_TMS_FPKG_011 口径一致)
4. Chrome/Edge/Firefox 下载文件名=运单资料_【任务编号】.zip 完整不乱码 | 对应TP-N-007;REQ-004/REQ-016(RISK-COMPATIBILITY;漏测清单导入导出兼容项) | +| PLT_TMS_FPKG_082 | 平台端-运单管理-运单文件包-非功能 | 验证新增运单文件包功能不影响既有功能与并行需求 | P2 | 回归测试 | 1. ACC-001 已登录;2. 运单管理、运单跟踪、安徽运八并行需求功能可用;3. 可触发 2 个 2000 行任务制造打包高峰 | 1. 触发 2 个 XLS-006(2000 行)任务进入"处理中"制造打包高峰
2. 高峰期操作运单管理列表/详情/导出、运单跟踪等既有菜单
3. 触发一次运单导出等其他下载
4. 核对安徽运八异步任务正常
5. 打包完成后核查运单数据是否被修改 | XLS-006×2;运单管理既有功能清单 | 1. 既有菜单功能全部正常(列表/详情/导出无报错、无劣化到不可用)
2. 高峰期运单导出等其他下载不被磁盘/带宽拖垮(验证并发上限 1~2 设计动机)
3. 打包前后运单状态与业务数据无任何修改(本功能只读消费运单数据)
4. 安徽运八异步任务不受干扰正常完成 | 对应TP-N-008;REQ-001;[AI修正: 冲突修订](关联与冲突报告确认与安徽运八并行无冲突,落"并行不干扰"回归验证点) | +| PLT_TMS_FPKG_083 | 平台端-运单管理-运单文件包-数据校验 | 验证全部行数据级失败(0 有效行)时任务终态与无空包残留 | P1 | 功能测试 | 1. ACC-001 已登录;2. 构造 3 行全非法清单:XLS-101(序号 0)+XLS-110(运单不存在)+XLS-107(单号为空) | 1. 上传该 3 行清单等待任务终态
2. 查看任务状态与成功/失败数
3. 下载失败清单核对 3 行原因
4. 检查任务下载入口与对象存储 | XLS-101/110/107 组合清单(CMB-018 构造基准) | 1. 3 行全部进入失败清单,原因分别对应 4.2.2 各规则文案
2. 成功数=0、失败数=3、总数=3,数据库统计一致
3. 任务无"下载文件包"入口(暂按不生成空 zip 设计),对象存储无空文件包残留
4. 任务终态按确认结论回填(暂按"已完成·部分失败"断言) | 对应TP-U-015(关联 TP-T-002);REQ-006/REQ-007;⚠️ 待确认:0 有效行终态(已完成·部分失败 or 失败)与是否生成空文件包,见文末确认项 #10(数据缺口 #14),确认后回填断言 3/4 | +| PLT_TMS_FPKG_084 | 平台端-运单管理-运单文件包-打包归批 | 验证最小序号运单因文件缺失剔除后证件改挂重算的最小序号运单 | P0 | 功能测试 | 1. 张三批次构造 3 行:序号 1 行为仅缺电子回单的运单(无支付记录/回单文件缺失,CMB-010)、序号 3/5 行为回单合同齐全的有效运单(CMB-006+XLS-004);2. ACC-001 已登录 | 1. 上传该 3 行清单等待完成
2. 核对失败清单含序号 1 行及缺失原因
3. 下载 zip 核对批次①运单包命名与子目录
4. 检索证件照片实际落位 | CMB-010(最小序号仅缺回单);CMB-006(序号 1、3、5);决议#8;XLS-003/004 | 1. 失败清单含序号 1 行,原因含回单/文件缺失类文案("无电子回单:运单无支付记录"或同类)
2. 证件改挂重算后的最小序号:序号 3 运单包名=3-…-含司机及车辆证件且含四子目录,序号 5 运单包仅含合同+电子回单
3. 序号 1 运单包最终形态(整包不生成 or 保留但缺电子回单子目录)按 4.4.4 条款一/二边界确认后回填;无论何种形态,断言 2 的证件改挂均须成立且不阻断其余运单
4. 成功数/失败数与 zip 内容一致 | 对应TP-P-007;REQ-015(决议#8;4.4.4 条款二字面将"文件缺失"列为剔除触发,本用例固化证件改挂断言);⚠️ 待确认:条款一(缺失不剔除仅记清单)与条款二(剔除改挂)边界,见文末确认项 #3(数据缺口 #17),确认后回填断言 3 | +| PLT_TMS_FPKG_085 | 平台端-运单管理-运单文件包-上传校验 | 验证多 Sheet 工作簿不得静默丢数据且处理行为明确 | P2 | 功能测试 | 1. ACC-001 已登录;2. 构造含 2 个 Sheet 的 xlsx:Sheet1 为模板三列 + XLS-001/002 两行有效数据,Sheet2 同结构含 XLS-003 一行有效数据 | 1. 上传该多 Sheet 文件
2. 观察上传结果(成功或拒绝提示)
3. 若创建任务:等待完成核对总行数/成功数并下载 zip
4. 若拒绝:核对提示文案与任务列表 | XLS-001/002/003(分置两个 Sheet);多 Sheet 构造文件(openpyxl) | 1. 系统有明确处理行为且两 Sheet 数据无一被静默丢弃:全部 Sheet 解析(总行数=3、zip 含 3 运单包)或整体拒绝并提示具体原因
2. 不得出现仅解析 Sheet1(总行数=2)而 Sheet2 数据静默丢失后生成缺单文件包
3. 数据库统计与实际解析行数一致 | 对应TP-U-001/TP-U-004;REQ-004/REQ-005;⚠️ 待确认:多 Sheet 读取口径(读首 Sheet 拒绝其余 or 全部解析),见文末确认项 #1(数据缺口 #15),确认后回填断言 1 取值 | + +--- + +## P2/P3 用例取舍说明 + +- 本次未裁剪任何 P2/P3 测试点(8 个全部保留),理由:TP-M-005 机构隔离为项目画像 §10 硬约束(权限类用例必须验证机构隔离);TP-U-018 为确认决议 #7/六#7 的既定口径且执行成本低;TP-P-014 与 TP-N-005 是 zip 不加密决策(决议 #12)的合规补偿链验证,属 RISK-COMPLIANCE 缓解措施;TP-N-007 对应 RISK-COMPATIBILITY;TP-N-008 是关联与冲突报告(无冲突)落地的"并行不干扰"回归验证点;TP-T-008 与 TP-D-005 为范围确认类用例——分别防止 Q1 功能遗漏与按决议 #11 防止过度实现。 +- 拆分/合并原则:同一测试点内"接受 vs 拒绝"或不同真实业务场景拆为独立用例(TP-M-003、TP-U-004、TP-P-007、TP-P-008、TP-D-006;TP-P-002 按要素维度处理——046 承接换车/换司机拆批、045 承接 CMB-007 跨货源不拆批对照);同一边界两侧行为合并为一条用例(2000/2001 行、10MB±1B、重试 3 次边界按两侧分设);端到端冒烟单独成条(001),不与明细用例混同。 +- 优先级校验:P0 占比 33/85=39%,与测试点 P0 占比(25/59=42%)匹配;全部 P0 测试点 100% 有 P0 用例承接,无高风险场景下沉到 P2(007 机构隔离已按项目画像 §10 硬约束升为 P1)。 +- 新增 085(P2)承接 TP-U-001/TP-U-004 的多 Sheet 解析口径不变式(数据缺口 #15),断言按"不得静默丢数据"设计,具体口径确认后回填;083/084 为评审与覆盖率审计修复新增(0 有效行终态、最小序号文件缺失剔除改挂)。 + +## 未收敛的 ⚠️ 待确认清单(Q1~Q6 保留项) + +> Q2、Q3 已按需求口径收敛(Q3:需求 4.2.1"单文件行数上限 2000 行",2000 行含、2001 行拒绝,见 015 备注;Q2:仅表头 0 数据行按文件级拒绝、依据三章"运单清单"与 4.2.2 处理原则,见 016 备注)。以下 4 项未能从需求原文确定,相关用例不得按臆造规则执行,须确认后回填。 + +1. **Q1(承接用例 044,TP-T-008)**:问题——"查看结构/文件包结构预览"与"失败任务删除"仅见于原型,需求正文未定义;影响范围——044 用例保留与否及断言范围(若确认裁剪,"失败任务删除"仍以需求六#10 为准保留在 036);建议确认方向——需求方确认本期是否实现结构预览弹窗,确认实现则按弹窗实际字段回填断言,确认裁剪则删除 044。 +2. **Q4(承接用例 063,TP-P-013)**:问题——打包期间源数据变更(新回单/换证件照/运单关闭)按任务开始时刻快照还是实时拉取;影响范围——063 断言 1 的取值(快照=不含新增回单;实时=包含新增回单)与 TP-P-013 回归口径;建议确认方向——需求方二选一后回填断言,并明确"全任务一致"的实现保证。 +3. **Q5(承接用例 077,TP-N-004)**:问题——过期任务的列表展示形态:原型有灰色"已过期"标签,需求 4.3.1 状态机仅 5 态;影响范围——077 断言 1 与列表实现/状态字典;建议确认方向——确认新增"已过期"展示态(状态字段不动、仅展示层标记)或保持原状态+下载按钮置灰,确认后回填。 +4. **Q6(承接用例 067,TP-D-003)**:问题——失败清单下载是否同样记审计日志;影响范围——067 断言范围与敏感数据留痕完整性(失败清单含货源单号/运单号);建议确认方向——建议一并留痕(与文件包下载同表或同流水),确认后补充失败清单下载审计断言。 + +## 其他实现口径确认项(非 Q1~Q6,来自测试数据缺口,执行前与开发/需求方确认) + +1. 数据缺口 #15:多 Sheet、表头后附加说明行/合并单元格的读取口径(085 已固化"不得静默丢数据"不变式断言,具体取值确认后回填);列顺序已按"按列名匹配"设计(013),若实现按固定列序读取需回归。 +2. 数据缺口 #16:10MB=10 的 6 次方还是 2 的 20 次方字节(017);序号/单号单元格数值型 vs 文本型读取规则(019)。 +3. 数据缺口 #17:需求 4.4.4 条款一(无回单/无合同不剔除仅记清单,055/056)与条款二(文件缺失剔除改挂,053/054/084)在"最小序号运单仅缺回单/合同"场景的适用边界(084 已按条款二字面口径固化证件改挂断言,运单包最终形态待确认回填)。 +4. BND-032 保留期临界(完成时间+7 天整)的实现口径(076)。 +5. ERR-006 列名全半角/空格 trim 匹配口径(012)。 +6. ERR-027 运单号前后空格匹配:已按"存在性校验与实际导出同口径"设计(022),trim 与否本身需实现确认。 +7. ERR-040 批次包名非法字符替换/转义与超长截断策略(060)。 +8. IDC-001 任务编号编码规则:断言不写死格式,仅验证系统生成且唯一(001/010)。 +9. BND-025/026/027 序号 int32 上限与 Excel 15 位精度截断:已锚定 019 备注,执行 019 时顺带探测,预期"合法或明确报错,不得静默截断"。 +10. 数据缺口 #14:数据级校验全部失败(0 有效行)的任务终态(已完成·部分失败 or 失败)与是否生成空文件包(083 暂按"已完成·部分失败、不生成空 zip"设计,确认后回填断言)。 +11. 机构隔离环境依赖(007/008):多机构部署形态、B 机构运营账号 ACC-B01 与 B 机构运单 YDB-001 的可用性见测试数据缺口 #18;若环境不支持,按 007 备注的替代口径执行。 diff --git a/output/test_points/运单资料文件包下载需求_测试点.md b/output/test_points/运单资料文件包下载需求_测试点.md new file mode 100644 index 0000000..f2d5256 --- /dev/null +++ b/output/test_points/运单资料文件包下载需求_测试点.md @@ -0,0 +1,575 @@ +# 运单资料文件包下载需求 测试点 + +> 生成时间: 2026-09-08 +> 依据: output/analysis/运单资料文件包下载需求_分析.md(26 条 REQ)、_风险评估.md(RISK-AVAILABILITY P1 等 5 项)、_测试策略.md、_关联与冲突.md(无冲突,与安徽运八需求并行) +> 知识库: project_profile.md、common_missed_scenes.md、historical_defects.md、definition_of_done.md、terminology.md +> 原型: resources/prototypes/anhuibaba_file_package.html +> 术语: 批次 / 文件包(批次包)/ 运单包 / 最小序号运单 / 电子回单 / 失败清单 / 审计日志 / 幂等性,均与 knowledge_base/01_standards/terminology.md 一致 + +## 测试点概览 + +- 总测试点数: 59 +- P0: 25 / P1: 26 / P2: 6 / P3: 2 +- 来源分布: [需求] 47, [漏测清单] 14, [风险矩阵] 7, [项目画像] 7, [历史缺陷] 4, [最佳实践] 3, [冲突修订] 1([营销规则] 不适用:本项目无营销域,见"不适用说明") + +### 覆盖维度对照(12/12 全覆盖) + +| 维度 | 对应测试点 | +| :--- | :--- | +| 主流程 | TP-M-001、TP-U-001/002、TP-T-001、TP-P-001/003/004、TP-D-001 | +| 异常流程 | TP-U-003/004/005、TP-T-007、TP-P-008、TP-N-006、TP-N-003 | +| 边界条件 | TP-U-006/007、TP-P-011/012、TP-N-004 | +| 数据校验 | TP-U-008~016、TP-T-004/006、TP-P-005/006/010 | +| 状态流转 | TP-T-001/002/003/007、TP-D-004、TP-N-004 | +| 权限控制 | TP-M-002/003/004/005、TP-N-005 | +| 并发幂等 | TP-D-002、TP-U-018、TP-N-002/003、TP-P-009 | +| 弱网超时 | TP-D-006、TP-N-003、TP-U-017 | +| 规则组合 | TP-P-002/007、TP-U-015、TP-T-002 | +| 历史缺陷防御 | TP-P-012/013、TP-D-004、TP-N-003 | +| 跨需求冲突防御 | TP-N-008(关联与冲突报告未识别冲突条目,落"并行不干扰"回归验证点) | +| 项目高风险场景 | TP-N-005/006、TP-M-005、TP-U-007(OBS 依赖/敏感合规/机构隔离/Excel 边界) | + +### 不适用说明(显式标注,非静默省略) + +- [营销规则] 维度不适用:项目画像 §4 明确本项目无营销活动/优惠券/积分体系,本需求亦无营销规则。 +- [历史缺陷] BUG-202607-04(省份代码硬编码)不适用:本需求为资料导出打包,无监管上报省份字段;其余 3 条历史缺陷(阶段依赖链前后端双重校验、重试幂等、跨模块数据溯源)均已转化为 TP-D-004、TP-N-003、TP-P-012/013。 + +### 待确认项汇总(评审时确认,确认后重点回归) + +| 编号 | 待确认问题 | 影响测试点 | +| :--- | :--- | :--- | +| Q1 | "查看结构/文件包结构预览"与"失败任务删除"仅见于原型,需求正文未定义 | TP-T-008 | +| Q2 | 仅表头 0 数据行的空清单如何处理(拒绝 or 创建空任务) | TP-U-006 | +| Q3 | 2000 行上限口径是否含表头行(本文件按"数据行 2000"设计) | TP-U-006 | +| Q4 | 打包期间源数据变更(新回单/换证件照/运单关闭)按任务开始时刻快照还是实时拉取 | TP-P-013 | +| Q5 | 过期任务的列表展示形态(原型有"已过期"标签,需求状态机仅 5 态) | TP-N-004 | +| Q6 | 失败清单下载是否同样记审计日志 | TP-D-003 | + +--- + +## 模块 TP-M 菜单与权限(5 个测试点) + +### TP-M-001: 菜单入口与页面骨架 +- 优先级: P0 +- 类型: 功能测试 +- 覆盖维度: 主流程 +- 来源: [需求] +- 描述: 对应 REQ-001。运八平台端"运单管理"相关模块下出现独立菜单"运单文件包",页面自上而下为上传任务入口(模板下载 + 上传按钮)与任务列表。 +- 关键验证点: 菜单名称逐字为"运单文件包"且挂载位置正确;页面含"下载模板""上传清单"按钮与任务列表表格;面包屑/菜单高亮正确;上传入口在前、任务列表在后。 + +### TP-M-002: 运营人员可见可操作 +- 优先级: P0 +- 类型: 权限测试 +- 覆盖维度: 权限控制 +- 来源: [需求] +- 描述: 对应 REQ-002。被授权的运营人员(super_admin 验证)登录后可见菜单并可完成上传、查看进度、下载文件包全链路。 +- 关键验证点: 运营角色菜单可见;上传/下载操作不被拦截;页面内无其他角色越权入口;权限分配由平台管理员在角色管理完成(项目画像 §2.2)。 + +### TP-M-003: 非授权角色不可见且 URL 直达被拦截 +- 优先级: P0 +- 类型: 权限测试 +- 覆盖维度: 权限控制 +- 来源: [需求][漏测清单] +- 描述: 对应 REQ-002。财务、客服、车队长、司机等非授权角色登录平台端不可见该菜单;未登录或低权限账号直接输入页面 URL 访问被拦截跳转登录/403。 +- 关键验证点: 各非授权角色侧边栏无"运单文件包"入口;直接 URL 访问返回 403 或跳登录页(漏测清单 §3 未登录访问);页面不渲染任务列表数据。 + +### TP-M-004: 接口层越权防御 +- 优先级: P1 +- 类型: 安全测试 +- 覆盖维度: 权限控制 +- 来源: [项目画像][风险矩阵] +- 描述: 对应 REQ-002,风险矩阵 RISK-COMPLIANCE(P2 合规)缓解。前端隐藏菜单不够,服务端接口必须独立鉴权——无菜单权限账号直接调用任务列表/上传/下载 API 应被拒绝(对应项目画像必测异常"越权操作")。 +- 关键验证点: 无权限会话调用上传/列表/下载接口返回 401/403;携带他人任务编号调用下载接口被数据权限拦截;接口不因缺少前端入口而放行。 + +### TP-M-005: 机构数据隔离 +- 优先级: P2 +- 类型: 安全测试 +- 覆盖维度: 权限控制 +- 来源: [项目画像] +- 描述: 对应 REQ-002/REQ-026。项目画像要求权限类用例必须验证机构数据隔离:多机构部署下,任务列表、上传任务、下载文件包均不得跨机构泄露运单与证件资料。 +- 关键验证点: A 机构运营账号不可见 B 机构任务;上传清单含 B 机构运单号时按"运单号不存在/无权限"类行级失败处理(不导出);下载 zip 内不含他机构运单资料。 + +--- + +## 模块 TP-U 上传与校验(18 个测试点) + +### TP-U-001: 模板下载 +- 优先级: P0 +- 类型: 功能测试 +- 覆盖维度: 主流程 +- 来源: [需求] +- 描述: 对应 REQ-003。上传入口提供模板下载,模板为 .xlsx 且仅含三列:序号、货源单号、运单号。 +- 关键验证点: 下载得到合法 .xlsx;列名与需求 4.2.1 逐字一致;用下载模板填写 1 条合法数据可直接上传成功(模板自洽);模板内含填写说明不参与数据解析。 + +### TP-U-002: 正常上传创建任务(正向成功链路) +- 优先级: P0 +- 类型: 功能测试 +- 覆盖维度: 主流程 +- 来源: [需求][漏测清单] +- 描述: 对应 REQ-001/REQ-004/REQ-005。合法清单上传后系统创建打包任务并开始异步处理——不能只测"校验失败",正向成功链路必须覆盖。 +- 关键验证点: 上传成功提示含任务编号;任务列表置顶新增一行(待处理→处理中);源文件名/上传人/上传时间正确;总行数与清单数据行数一致;"全部任务"统计卡片计数 +1(原型)。 + +### TP-U-003: 非 xlsx 格式整体拒绝 +- 优先级: P0 +- 类型: 异常测试 +- 覆盖维度: 异常流程 +- 来源: [需求] +- 描述: 对应 REQ-005。上传 .docx/.xls/.csv/.zip/.png 或将 zip 改后缀为 .xlsx 的文件,上传即整体拒绝。 +- 关键验证点: 提示具体原因(格式不支持);不创建任务(列表无新增行);文件选择器与后端双重限制(前端过滤 + 后端再校验,防绕过前端直传 API)。 + +### TP-U-004: 列名缺失或不符整体拒绝 +- 优先级: P0 +- 类型: 异常测试 +- 覆盖维度: 异常流程 +- 来源: [需求] +- 描述: 对应 REQ-005。表头缺列、列名错别字、多出未知列均整体拒绝;但三列名正确仅顺序不同时应允许(需求约束的是列名而非列顺序)。 +- 关键验证点: 缺"序号"列拒绝、缺"货源单号"列拒绝、列名拼写错误拒绝、多余列拒绝;列顺序打乱(列名齐全)上传成功;提示信息指明具体列问题。 + +### TP-U-005: 文件损坏整体拒绝 +- 优先级: P1 +- 类型: 异常测试 +- 覆盖维度: 异常流程 +- 来源: [需求] +- 描述: 对应 REQ-005。上传截断文件、伪造 xlsx 头的非法文件、加密带密码的 xlsx,上传即拒绝且服务端不抛 500 白屏。 +- 关键验证点: 提示"文件损坏/无法读取"类明确原因;不创建任务;后台无残留半任务;加密 xlsx 给出可理解提示(非堆栈报错)。 + +### TP-U-006: 行数边界(2000/2001/空清单) +- 优先级: P1 +- 类型: 边界测试 +- 覆盖维度: 边界条件 +- 来源: [需求] +- 描述: 对应 REQ-004(确认决议 #9)。单文件数据行 2000 行成功、2001 行整体拒绝。 +- 关键验证点: 恰好 2000 行有效清单上传成功且成功数=2000;2001 行拒绝且不创建任务;空清单(仅表头 0 数据行)的处理——⚠️ 待确认 Q2:建议拒绝并提示"清单无数据行",不得生成空 zip;⚠️ 待确认 Q3:行数口径是否含表头。 + +### TP-U-007: 文件大小边界(10MB 临界) +- 优先级: P1 +- 类型: 边界测试 +- 覆盖维度: 边界条件 +- 来源: [需求][项目画像] +- 描述: 对应 REQ-004(确认决议 #9)。项目画像 §8.3 提示本项目 Excel 处理有大数据量惯例,需验证行数与大小两条限制相互独立生效。 +- 关键验证点: 恰好 10MB(临界值)上传成功、10MB+1B 拒绝;行数少但体积超 10MB(如嵌大图/长文本)被大小限制拒绝;行数超限但体积小于 10MB 被行数限制拒绝;两类超限提示原因可区分。 + +### TP-U-008: 序号非正整数行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006。序号为 0、负数、小数(1.5)、文本(abc)、空、全角数字的行计入失败清单,其余行正常处理。 +- 关键验证点: 各非法序号行进入失败清单且失败原因准确;有效行不受影响;任务记"已完成·部分失败";失败数统计准确。 + +### TP-U-009: 序号重复行级失败(全文件唯一) +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求][最佳实践] +- 描述: 对应 REQ-006(确认决议 #13:序号全文件唯一)。同一序号出现多行时,重复行计入失败清单;重复序号跨批次出现同样生效(唯一性范围是全文件而非批次内)。 +- 关键验证点: 重复行失败原因明确;保留行与剔除行的判定规则稳定(如首现行保留);序号决定"最小序号运单"判定,重复序号被剔除后不得影响证件挂载(联动 TP-P-007)。 + +### TP-U-010: 货源单号/运单号为空行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006。货源单号或运单号为空串、纯空格、Excel 空单元格的行计入失败清单。 +- 关键验证点: 空串与纯空格均判为空;失败原因区分"货源单号为空"/"运单号为空";仅表头行不误判为数据行。 + +### TP-U-011: 运单号在系统中不存在行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006。运单号在系统无匹配记录的行计入失败清单(原型失败原因文案:"运单号在系统中不存在")。 +- 关键验证点: 不存在运单号失败且原因准确;运单号大小写/前后空格的匹配口径一致(同一规则应用于存在性校验与实际导出);一行失败不影响同文件其他有效行。 + +### TP-U-012: 货源单号与运单实际所属货源不一致行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006(确认决议 #6)。运单号存在但货源单号与该运单在系统中实际所属货源不一致,该行失败;运单号+其正确货源单号配对则成功(正向配对验证)。 +- 关键验证点: 错配行失败原因准确(原型文案:"文件中货源单号与该运单实际所属货源不一致");正确配对行正常打包;同一运单在不同货源下的归属以系统数据为准,不因清单填写顺序改变。 + +### TP-U-013: 运单号文件内重复行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006。同一运单号在文件内出现两行,重复行计入失败清单,首次出现行保留处理,防止同一运单被重复打包。 +- 关键验证点: 首现行打包且仅出现一次;重复行进失败清单且原因明确(区别于序号重复的原因文案);两行序号不同的重复运单不产生两个运单包。 + +### TP-U-014: 运单缺司机或车辆信息无法归批行级失败 +- 优先级: P0 +- 类型: 数据校验 +- 覆盖维度: 数据校验 +- 来源: [需求] +- 描述: 对应 REQ-006。运单在系统内缺少司机或车辆信息导致三要素不全、无法归批的行计入失败清单,失败原因标注"无法归批"。 +- 关键验证点: 缺司机信息的运单失败且原因准确;缺车辆信息的运单失败且原因准确;该行剔除后批次划分正确重算(若其本应为某批次最小序号,联动 TP-P-007)。 + +### TP-U-015: 单文件混合多类错误(规则组合) +- 优先级: P1 +- 类型: 异常测试 +- 覆盖维度: 规则组合 +- 来源: [需求][最佳实践] +- 描述: 对应 REQ-006/REQ-007。同一文件同时含多类数据级错误(序号重复+运单不存在+货源不匹配+无法归批)时各行独立判定;文件级错误与数据级错误共存时文件级优先整体拒绝。 +- 关键验证点: 各失败行原因分别准确、互不串行;成功行数+失败行数=总行数;任务状态"已完成·部分失败";文件级+数据级共存时整体拒绝且不进入失败清单流程。 + +### TP-U-016: 单元格特殊字符与超长内容防御 +- 优先级: P1 +- 类型: 异常测试 +- 覆盖维度: 数据校验 +- 来源: [漏测清单] +- 描述: 对应 REQ-006。清单单元格含 Emoji、SQL 注入字符、HTML 标签、超长字符串(超过系统字段长度)时系统不崩溃、不误吞有效行;源文件名含特殊字符/超长时列表展示与 zip 命名不异常。 +- 关键验证点: 单号含 `'; DROP TABLE--`、` + +