SupplyLink 测试用例(Phase 1)

文档控制

项目 值
版本 v1.0
日期 2026-09-14
目标读者 测试人员(手工执行)
契约来源 04-selected-prd.md v1.7、openapi.yaml、05-prototype-brief.md、08-build-plan.md
覆盖范围 Phase 1 功能需求 REQ-001..017 + REQ-009A(不含 Phase 2 售后域 REQ-018..026)
补充说明 与自动化测试(backend/test、admin ui-check、scripts/e2e-m3.sh)互补;本文档聚焦手工验收、异常分支、跨组织/权限拒绝与回归

1. 文档说明

1.1 目的

为测试人员提供一套可执行、可追溯的手工测试用例,覆盖 SupplyLink Phase 1 的功能、API、Admin UI 与端到端旅程,用于验收、回归与缺陷复现。

1.2 范围

  • 包含:REQ-001..017 + REQ-009A(Phase 1 全量)。
  • 排除:REQ-018..026(Phase 2 统一售后域,受 OQ-AFS 门禁阻塞,未实现);部署/云/密钥等生产话题(OQ-INFRA-001 阻塞)。

1.3 实现状态约定

状态 含义
可执行 功能已实现,用例可立即手工执行
待实现 契约已冻结(PRD + OpenAPI),代码尚未交付,用例不可执行,待对应里程碑落地后回归
部分 模块内部分能力已实现(outbox/jobs),其余待实现

实现状态以 08-build-plan.md 任务队列与 .github/delivery/supplylink.md 为准,执行前请先核对当前里程碑。

1.4 术语与环境标记

  • 环境标记:每条集成记录与证据导出须显式显示 MOCK / TEST / LIVE。
  • 货币:仅 AUD,金额以整数分存储;数量使用 decimal(18,4)。
  • GST:行级 half-up 舍入,line_gst_cents = ROUND(line_net_cents * gst_rate_bp / 10000, HALF_UP);整单 gross_cents = net_cents + gst_cents(tax_inclusive=true 时按含税倒算净额,规则一致)。
  • 日期时间:UTC 存储,按组织/站点配置的澳大利亚 IANA 时区显示。
  • 统一错误体:{ code, message, details?, trace_id };HTTP 状态码与业务错误码分离。

2. 用例编写规范

2.1 用例 ID 规则

TC-<模块缩写>-<三位序号>,如 TC-IDN-001。模块缩写见下表:

缩写 模块 缩写 模块
IDN 身份/组织范围/RBAC SHP 发运/包装/交付
CUS 客户/联系人/地址 EDI 零售商 EDI
LDS 线索/商机/活动 MTC 供应商发票/三单匹配/AP
QOT 报价与价格快照 RPL 补货建议
PRD 产品/税/定价 SVC 客户服务工单
STK 仓库库存与溯源 EXP 通知/作业/异常工作台
SUP 供应商与外部 PO 镜像 RPT 仪表盘/报表/导出
OCR OCR 采购导入 AUD 不可变审计与证据
ORD 销售订单与 GST E2E 端到端旅程
REC 销售三单对账

2.2 用例字段

字段 说明
用例ID 唯一标识,见 2.1
标题 一句话描述测试目标
优先级 P0 核心/阻断、P1 重要、P2 一般(对齐需求 P0/P1/P2)
类型 功能(手工步骤级)/ API(端点级)/ UI(Admin 页面级)/ E2E(旅程)
关联 需求 REQ/NFR、流程 FLOW、页面 P-xxx、旅程 J-xxx、端点、错误码
前置条件 数据/权限/环境准备
测试步骤 可复现的操作序列
预期结果 可验证的期望,含 HTTP 状态码与业务错误码
状态 可执行 / 待实现 / 部分

2.3 优先级定义

优先级 定义
P0 安全、多租户隔离、金额正确性、幂等、状态机核心流转;失败即阻断发布
P1 主要业务路径与关键异常分支
P2 边界、低频路径、体验类

3. 测试环境与数据准备

3.1 种子组织(tenant)

组织代码 含义 说明
SHENZHEN_HQ 深圳家之宝全球总部 可聚合读取,写操作仍须指定单一 owner
HONG_KONG 香港采购 BYD 采购镜像
PSS_AU 澳大利亚公司 A Bunnings 渠道业务
VOLTURA_AU 澳大利亚公司 B Supercheap Auto 供货 + BYD 售后(Phase 2)

3.2 角色与权限(测试账号准备)

按 04-selected-prd.md 用户与角色权限矩阵准备以下最小测试账号集合:

测试账号 角色权限 活动组织 用途
group-admin group_admin SHENZHEN_HQ 全局管理、跨组织聚合读取
org-admin-voltura org_admin VOLTURA_AU 组织内用户/主数据管理
purchaser-hk purchasing:read/write HONG_KONG 供应商、PO 镜像、收货
purchaser-approver purchasing:approve VOLTURA_AU 超容差差异批准、AP 排期/回填 paid
sales-voltura sales VOLTURA_AU 客户、报价、手工订单
order-edi-voltura order_edi VOLTURA_AU 订单、EDI 异常、POA/ASN/INVOIC 准备
warehouse-pss warehouse PSS_AU 收货、库存、发运
service-voltura service VOLTURA_AU 服务工单
manager-voltura manager VOLTURA_AU 只读报表
auditor auditor PSS_AU 审计与证据导出(只读)

无权限/跨组织拒绝用例需额外准备「缺权限账号」「foreign 组织账号」「inactive membership 账号」各一。

3.3 通用数据 fixture

  • 客户:含 11 位校验合法 ABN 的客户、无 ABN 客户、inactive 客户、foreign 组织同 ABN 客户。
  • 商品:含 GST 10% 类目、GST 豁免类目、active/inactive 商品、customer/channel/base 三档价格。
  • 库存:指定 location 的 on-hand/allocated/available 数量,用于分配/不足/转移用例。
  • 金额换算参考:net=3000、gst_rate_bp=1000(10%)→ line_gst_cents=300、gross=3300。

4. 分模块测试用例

4.1 身份 / 组织范围 / RBAC(REQ-001,FLOW-190)— 可执行

范围:JWT 登录/刷新/登出、X-Org-Id 组织范围、角色权限矩阵、用户开通生命周期(邀请→激活→授权→禁用)。端点:/auth/*、/orgs、/users*、/invitations/accept、/roles/assignable。页面:P-001 /sign-in、P-002 /select-organisation、P-190 /admin/access、P-003 /activate-account。

关键错误码:ORG_SCOPE_REQUIRED(400)、ORG_SCOPE_FORBIDDEN(403)、PERMISSION_FORBIDDEN(403)、INVITATION_INVALID(400)、PASSWORD_POLICY_INVALID(422)、IDENTITY_TRANSITION_INVALID(409)、INVITATION_EMAIL_EXISTS(409)、ROLE_ASSIGNMENT_INVALID(422)、IDEMPOTENCY_KEY_REUSED(409)、IF_MATCH_REQUIRED(428)、VERSION_CONFLICT(409)、VALIDATION_FAILED(422)。

4.1.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-IDN-001 合法凭证登录成功 P0 功能 REQ-001, POST /auth/login, P-001 active user + active membership 1) 打开 P-001 输入邮箱+正确密码提交 登录成功,获得 access+refresh 会话;refresh token 仅存 Secure/HttpOnly/SameSite=Strict cookie;跳转组织选择/工作台 可执行
TC-IDN-002 错误密码登录拒绝 P0 功能 REQ-001, P-001 active user 输入正确邮箱+错误密码 登录失败,不返回 token;不泄露账号是否存在 可执行
TC-IDN-003 disabled 用户登录拒绝 P0 功能 REQ-001, FLOW-190, J-194 账户被禁用 用 disabled 账户登录 拒绝登录(401),不返回 token 可执行
TC-IDN-004 刷新令牌轮换并撤销旧令牌 P0 API REQ-001, POST /auth/refresh 有效 refresh cookie + X-CSRF-Token 调用 /auth/refresh 返回新 access token;旧 refresh family 被撤销,旧 token 再次刷新失败 可执行
TC-IDN-005 登出撤销会话家族 P0 API REQ-001, POST /auth/logout 有效会话 带 X-CSRF-Token 调用 /auth/logout 登出成功,access/refresh 均失效;旧 refresh 不可复用 可执行
TC-IDN-006 刷新/登出缺失 CSRF Token 拒绝 P0 API REQ-001 有效会话 不带 X-CSRF-Token 调用 refresh/logout 拒绝(403),会话状态不变 可执行
TC-IDN-007 缺少 X-Org-Id 返回 400 P0 API REQ-001, 组织范围 任意 org-scoped 端点 不带 X-Org-Id 调用 GET /users 返回 400 ORG_SCOPE_REQUIRED,不返回数据 可执行
TC-IDN-008 foreign 组织访问拒绝且不泄露存在性 P0 API REQ-001, NFR-004 PSS-only user 用 X-Org-Id: VOLTURA_AU 读取 Voltura 资源 返回 403 ORG_SCOPE_FORBIDDEN,且不披露资源存在性;foreign/random ID 同体 404 可执行
TC-IDN-009 缺 base permission 返回 403 且无 mutation P0 API REQ-001, 权限矩阵 无 identity:manage 用户 调用 POST /users/invitations 返回 403 PERMISSION_FORBIDDEN,不创建任何记录 可执行
TC-IDN-010 邀请新用户成功且不泄露 raw token P0 功能 REQ-001, FLOW-190, J-191, P-190 group/org admin + Idempotency-Key 用新邮箱+预置角色发起邀请 返回 invited user(不含 raw token);创建 invited user + active membership + 72h pending invitation + 脱敏 audit + mock outbox 可执行
TC-IDN-011 重复邮箱邀请返回 409 P1 API REQ-001, J-191 已存在同邮箱 pending 邀请 再次邀请同邮箱 返回 409 INVITATION_EMAIL_EXISTS,不创建新 invitation 可执行
TC-IDN-012 同幂等键不同 payload 返回 409 P1 API REQ-001, J-191 已用过的 Idempotency-Key 用相同 key 但不同邮箱/角色再邀请 返回 409 IDEMPOTENCY_KEY_REUSED 可执行
TC-IDN-013 空/未知角色返回 422 P1 API REQ-001, J-191 admin 邀请时提交空角色或非预置角色 返回 422 ROLE_ASSIGNMENT_INVALID,不创建 invitation 可执行
TC-IDN-014 邀请重发同事务撤销旧 pending P1 API REQ-001, FLOW-190, J-191 存在 pending 邀请 对该邮箱重发邀请 旧 pending → revoked,新 pending 创建;72h 有效 可执行
TC-IDN-015 邀请撤销后不可激活 P1 API REQ-001, FLOW-190, J-191 pending 邀请 管理员撤销后,用户用该 token 激活 撤销成功;激活返回 400 INVITATION_INVALID 可执行
TC-IDN-016 有效邀请激活成功 P0 功能 REQ-001, FLOW-190, J-192, P-003 有效未过期 pending token 打开 P-003,从 URL fragment 取 token,提交合规密码 user invited→active、invitation pending→consumed、递增 session version;不自动登录;响应/日志/审计不含 raw token/password 可执行
TC-IDN-017 无效/过期/已消费 token 统一 400 P0 API REQ-001, FLOW-190, J-192 未知/过期/已消费 token 用任一无效 token 激活 统一返回 400 INVITATION_INVALID,不披露 email/user/org,无状态/审计变更 可执行
TC-IDN-018 密码不合规保持 pending P1 API REQ-001, FLOW-190, J-192 有效 token 提交不合规密码 返回 422 PASSWORD_POLICY_INVALID,token 保持 pending;不写成功 audit/outbox 可执行
TC-IDN-019 整体替换角色并立即吊销会话 P0 API REQ-001, FLOW-190, J-193, P-190 admin + 匹配 If-Match 替换目标 user 的预置角色 角色整体替换,session version 递增,旧 access/refresh 立即失效 可执行
TC-IDN-020 停用 membership 立即吊销会话 P0 API REQ-001, FLOW-190, J-193 admin + If-Match 停用目标 user 的 membership membership active→inactive,session version 递增,旧 token 失效 可执行
TC-IDN-021 禁用账户立即吊销会话,恢复需重新登录 P0 功能 REQ-001, FLOW-190, J-194 admin + If-Match 禁用账户 → 用旧 token 访问 → 恢复 → 用旧 token 访问 禁用后旧 token 401;恢复后旧 token 仍不可用,须重新登录 可执行
TC-IDN-022 对 disabled user 启用 membership 返回 422 P1 API REQ-001, FLOW-190, J-193 disabled user 管理员尝试启用其 membership 返回 422,membership 不变 可执行
TC-IDN-023 陈旧版本/缺失 If-Match 返回 428/409 P1 API REQ-001, FLOW-190 admin 用陈旧 version 或缺失 If-Match 调 PATCH/PUT 分别返回 409 VERSION_CONFLICT / 428 IF_MATCH_REQUIRED,数据不变 可执行
TC-IDN-024 非法状态转换返回 409 P1 API REQ-001, FLOW-190 disabled user 借激活/重发/角色更新恢复 disabled user 返回 409 IDENTITY_TRANSITION_INVALID,不产生会话/角色变更 可执行
TC-IDN-025 多组织用户选择活动组织 P0 功能 REQ-001, P-002 拥有多 membership 用户 登录后进入 P-002 选择组织 列出成员组织;选择后工作台按该组织范围运行 可执行
TC-IDN-026 全局聚合读取需 group:read P1 API REQ-001, 权限矩阵 HQ manager + group:read 调用聚合报表路由 聚合获批组织 totals 且 drill-down 保留 owner 标签;非 HQ 或缺 group:read 返回 403 可执行

4.1.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-IDN-101 POST /auth/login 成功契约 P0 API REQ-001 active user 提交 {email,password} 200;access token + refresh cookie;响应不含密码 可执行
TC-IDN-102 POST /auth/login 缺字段 P1 API REQ-001 — 缺 email 或 password 422 VALIDATION_FAILED 可执行
TC-IDN-103 GET /orgs 聚合白名单 P1 API REQ-001 已认证用户 调用 GET /orgs 返回其 membership 组织列表(聚合白名单,无需 X-Org-Id) 可执行
TC-IDN-104 GET /users 组织范围分页 P1 API REQ-001, J-190-user-query admin + X-Org-Id 分页查询当前组织用户 返回 {data, meta:{total,page,page_size}};含 invited/active/disabled 与角色摘要;不含 password/token digest/raw token 可执行
TC-IDN-105 POST /users/invitations 幂等 P1 API REQ-001, J-191 admin 带 Idempotency-Key 邀请,重放相同请求 首次 201;重放返回原结果,不重复创建 可执行
TC-IDN-106 POST /invitations/accept 非法 JSON P1 API REQ-001, J-192 — 提交非法 JSON 422 VALIDATION_FAILED(非 PASSWORD_POLICY_INVALID);先验 token 再验密码 可执行
TC-IDN-107 GET /roles/assignable P1 API REQ-001 admin 查询预置角色目录 返回预置角色列表;不含自定义角色 可执行
TC-IDN-108 PUT /users/{id}/membership/roles P1 API REQ-001, J-193 admin + If-Match 整体替换非空预置角色 成功替换并递增 session version;空/未知角色 422 ROLE_ASSIGNMENT_INVALID 可执行
TC-IDN-109 PATCH /users/{id}/membership 启停 P1 API REQ-001, J-193 admin + If-Match active↔inactive 合法启停成功;foreign membership 404;非法状态 409 可执行
TC-IDN-110 POST /users/{id}/invitation/resend 缺键 P1 API REQ-001, J-191 admin 不带 Idempotency-Key 422 VALIDATION_FAILED(不得放行) 可执行
TC-IDN-111 POST /users/{id}/invitation/revoke P1 API REQ-001, FLOW-190 admin 撤销 pending 邀请 撤销成功;revoked 不可恢复 pending 可执行
TC-IDN-112 PATCH /users/{id}/account-status 禁用/恢复 P0 API REQ-001, J-194 admin + If-Match active→disabled→active 每次变更递增 session version 并撤销会话;恢复后旧 token 仍不可用 可执行
TC-IDN-113 授权与 scope 同时失败按 scope 优先 P1 API REQ-001, 权限优先级 缺权限 + foreign scope 调用写操作 返回 ORG_SCOPE_FORBIDDEN(scope 优先于 base permission) 可执行

4.1.3 UI 测试用例(Admin 页面)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-IDN-201 P-001 登录页基础流程 P0 UI REQ-001, P-001 — 打开 /sign-in,输入凭证提交 登录成功进入组织选择;错误凭证显示 inline error 可执行
TC-IDN-202 P-002 组织选择器 P0 UI REQ-001, P-002 多组织用户 选择组织进入工作台 导航与数据随所选组织范围切换 可执行
TC-IDN-203 P-190 用户列表六态 P1 UI REQ-001, P-190, NFR-008 admin 访问 /admin/access 空/有数据/加载/错误/禁用/部分数据 六态(loading/empty/error/disabled/success/partial)正确呈现 可执行
TC-IDN-204 P-190 邀请对话框 P0 UI REQ-001, P-190, J-191 admin 打开邀请对话框,填邮箱+角色提交 成功后列表出现 invited 用户;不显示 raw token 可执行
TC-IDN-205 P-190 重发/撤销操作 P1 UI REQ-001, P-190 存在 pending 邀请 分别点击重发/撤销 重发生成新 72h 邀请;撤销后状态为 revoked 可执行
TC-IDN-206 P-190 禁用/恢复账户 P0 UI REQ-001, P-190, J-194 admin + 目标 user 点击禁用 → 确认 → 恢复 禁用后该用户立即无法访问;恢复后需重新登录;按钮态/确认提示正确 可执行
TC-IDN-207 P-003 激活页 token 从 URL fragment 读取 P0 UI REQ-001, P-003, J-192 有效 token 链接 打开激活页,填密码+确认提交 激活成功转到 P-001;token 不进入 access log/Referer;读取后清空 hash 可执行
TC-IDN-208 四视口响应式与键盘可达 P1 UI REQ-001, NFR-008/009 — 在 360/768/1280/1440px 操作登录/组织切换/用户管理 无横向溢出;键盘可完成全部流程;focus 环可见 可执行

4.2 客户 / 联系人 / 地址(REQ-002)— 可执行

范围:客户主数据、联系人、类型化地址(billing|shipping|installation)、ABN 校验、重复候选、primary contact 唯一、inactive 限制、合并。端点:GET/POST /customers、GET/PATCH /customers/{id}、GET/POST /customers/{id}/contacts、GET/POST /customers/{id}/addresses。页面:P-020 /customers、P-021 /customers/:id。

关键错误码:CUSTOMER_DUPLICATE_CANDIDATE(409)、CUSTOMER_INACTIVE(409)、VERSION_CONFLICT(409)、IF_MATCH_REQUIRED(428)、RESOURCE_NOT_FOUND(404)。

4.2.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-CUS-001 创建客户归属活动组织 P0 功能 REQ-002, P-020 sales + X-Org-Id 填合法 ABN+收货地址创建 客户创建成功,归属活动组织,出现在时间线 可执行
TC-CUS-002 ABN 校验失败拒绝 P1 API REQ-002 sales 提交非法 11 位 ABN(checksum 错误) 422,不创建客户 可执行
TC-CUS-003 inactive 客户不可下新单 P0 API REQ-002, REQ-009 inactive 客户 对其创建订单 返回 409 CUSTOMER_INACTIVE 可执行
TC-CUS-004 重复候选返回 409 P1 API REQ-002 已存在规范化姓名+ABN 相同客户 再创建同姓名+ABN 客户 返回 409 CUSTOMER_DUPLICATE_CANDIDATE,返回候选 ID 可执行
TC-CUS-005 合并为事务性并写别名 P1 功能 REQ-002 两个候选客户 手动合并 合并成功,写 source-to-target aliases;任一步失败整体回滚 可执行
TC-CUS-006 跨组织同 ABN 不泄露 P0 API REQ-002, NFR-004 另一组织存在同 ABN 客户 regional scope 搜索 不披露 foreign customer 可执行
TC-CUS-007 每客户仅一个 primary contact P1 API REQ-002 已有 primary contact 再设第二个 primary 拒绝或自动替换(按契约),不出现两个 primary 可执行
TC-CUS-008 联系人/地址增删 P1 功能 REQ-002, P-021 已存在客户 添加/编辑联系人、billing/shipping/installation 地址 操作成功且类型正确 可执行
TC-CUS-009 乐观并发冲突 P1 API REQ-002 陈旧 version 用旧 version PATCH 返回 409 VERSION_CONFLICT;缺失 If-Match 428 IF_MATCH_REQUIRED 可执行

4.2.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-CUS-101 GET /customers 分页筛选 P1 API REQ-002 sales 按名称/ABN 筛选分页查询 返回 {data, meta},仅活动组织数据 可执行
TC-CUS-102 POST /customers 幂等/校验 P1 API REQ-002 sales 正常/重复/非法 ABN 201/409/422 契约正确 可执行
TC-CUS-103 GET/PATCH /customers/{id} foreign 404 P0 API REQ-002, NFR-004 foreign 组织客户 ID 用本组织 scope 访问 404 RESOURCE_NOT_FOUND,同体不泄露 可执行
TC-CUS-104 GET/POST /customers/{id}/contacts P1 API REQ-002 存在客户 列出/新增联系人 契约正确,primary 唯一约束生效 可执行
TC-CUS-105 GET/POST /customers/{id}/addresses P1 API REQ-002 存在客户 列出/新增类型化地址 地址类型枚举校验正确 可执行

4.2.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-CUS-201 P-020 客户列表筛选与六态 P1 UI REQ-002, P-020, NFR-008 — 搜索/筛选、空/加载/错误/部分状态 六态正确;筛选生效 可执行
TC-CUS-202 P-021 客户详情与编辑 P1 UI REQ-002, P-021 存在客户 查看摘要/联系人/地址/时间线并编辑 编辑成功;重复候选/版本冲突显示 inline error 可执行
TC-CUS-203 四视口与键盘可达 P2 UI REQ-002, NFR-008/009 — 360/768/1280/1440px 操作列表与详情 无溢出;键盘可完成增删改查 可执行

4.3 线索 / 商机 / 活动(REQ-003)— 待实现

范围:Lead new|qualified|disqualified|converted;Opportunity open|won|lost;Activities call|email|meeting|note|task;conversion 原子创建 customer+opportunity;overdue 按组织时区推导。端点:GET/POST /leads、POST /leads/{id}/convert、GET/POST /opportunities、GET/POST /activities。页面:P-030、P-032。

关键错误码:SALES_STAGE_INVALID(409)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-LDS-001 线索转换原子创建 customer+opportunity P0 功能 REQ-003 qualified lead 转换 lead 恰好创建一对 customer/opportunity 待实现
TC-LDS-002 幂等转换返回原结果 P0 API REQ-003 已转换 lead 用同一 idempotency key 重试 两次返回相同 IDs,不重复创建 待实现
TC-LDS-003 非法 stage 返回 409 P1 API REQ-003 lead 非法 stage 更新 409 SALES_STAGE_INVALID 待实现
TC-LDS-004 overdue task 按组织时区标记 P1 功能 REQ-003 past-due task 加载用户队列 按组织时区标记 overdue 待实现
TC-LDS-005 P-030/P-032 页面流程 P2 UI REQ-003, P-030/P-032 — 线索列表/商机详情操作 页面功能与六态正确 待实现

4.4 报价与价格快照(REQ-004)— 待实现

范围:Quote draft|sent|accepted|rejected|expired|converted;quote:decide 接受/拒绝强制 If-Match;quote-expiry worker 条件 UPDATE 到期;accepted 只可转换一次;net/GST/gross 快照;折扣 0-100%;价格覆盖需权限。端点:POST/GET /quotes、POST /quotes/{id}/send|accept|reject|convert。页面:P-040、P-041。

关键错误码:QUOTE_TRANSITION_INVALID(409)、VERSION_CONFLICT(409)、IF_MATCH_REQUIRED(428)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-QOT-001 报价总额计算(net/GST/gross) P0 API REQ-004, REQ-009 带 GST 类目的 AUD 行 计算 totals 行级 half-up 舍入与快照符合算法 待实现
TC-QOT-002 sent 接受/拒绝需 quote:decide + If-Match P0 API REQ-004 sent quote 有/无权限、缺 If-Match 接受 授权成功;缺权限 403;缺 If-Match 428 待实现
TC-QOT-003 到期 worker 条件 UPDATE P1 API REQ-004, FLOW-005 sent 且 expiry<=now 等 worker 扫描 status 变 expired 并写 service audit;重复扫描 no-op 待实现
TC-QOT-004 accepted 只可转换一次 P0 API REQ-004 accepted quote 转换两次 仅产生一个 sales order 待实现
TC-QOT-005 非法/陈旧转换返回 409 P1 API REQ-004 expired/rejected quote 转换 409 QUOTE_TRANSITION_INVALID;stale 409 VERSION_CONFLICT 待实现
TC-QOT-006 折扣边界与价格覆盖权限 P2 API REQ-004 — 0-100% 折扣、覆盖价格 越界拒绝;覆盖需权限+审计 待实现
TC-QOT-007 P-040/P-041 页面流程 P2 UI REQ-004, P-040/P-041 — 创建/发送/接受/转换报价 页面功能与六态正确 待实现

4.5 产品 / 税 / 定价(REQ-005)— 可执行

范围:SKU 组织内唯一、GTIN 校验、active|inactive、价格窗口不重叠、GST 快照默认 10%、优先级 customer > channel > base、product:manage 停用需 If-Match、inactive 不可下单(PRODUCT_NOT_ORDERABLE)、货源伙伴追溯。端点:GET/POST /products、GET/PATCH /products/{id}、POST /products/{id}/prices、GET /products/{id}/stock。页面:P-050、P-052。

关键错误码:PRICE_WINDOW_OVERLAP(409)、PRODUCT_NOT_ORDERABLE(422)、VERSION_CONFLICT(409)、IF_MATCH_REQUIRED(428)。

4.5.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-PRD-001 SKU 组织内唯一 P0 API REQ-005 同组织已有 SKU 重复创建同 SKU 拒绝,不创建重复 可执行
TC-PRD-002 价格窗口重叠返回 409 P0 API REQ-005 同 scope/SKU 已有价格窗口 创建重叠窗口 409 PRICE_WINDOW_OVERLAP 可执行
TC-PRD-003 定价优先级 customer > channel > base P0 API REQ-005 三档价均存在且窗口有效 为订单定价 customer price 优先且保存来源 可执行
TC-PRD-004 价格快照不随后续调价改变 P0 API REQ-005 已有订单 调价后查看旧订单 旧订单 snapshot total 不变 可执行
TC-PRD-005 停用需 product:manage + If-Match P0 API REQ-005 active 商品 + product:manage PATCH status=inactive 返回 inactive + 递增 version;缺 If-Match 428、陈旧 409 可执行
TC-PRD-006 停用后仍可读但不可下单 P0 API REQ-005, REQ-009 已停用商品 读详情 + 建新订单/报价/EDI/补货 读成功;下单统一 422 PRODUCT_NOT_ORDERABLE 且不创建订单/草稿 可执行
TC-PRD-007 货源伙伴追溯 P2 功能 REQ-005, P-052 商品关联货源伙伴 查看商品详情 可追溯供应商记录 可执行
TC-PRD-008 GST 类目快照默认 10% P1 API REQ-005 创建商品未指定税率 读取快照 默认 GST 10% 快照 可执行

4.5.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-PRD-101 GET/POST /products P1 API REQ-005 sales/admin 分页/创建商品 契约正确,SKU/GTIN 校验生效 可执行
TC-PRD-102 PATCH /products/{id} 状态变更 P0 API REQ-005 product:manage + If-Match 变更 status 成功递增 version;无权限 403 可执行
TC-PRD-103 POST /products/{id}/prices 窗口 P1 API REQ-005 — 创建价格窗口 不重叠窗口成功;重叠 409 可执行
TC-PRD-104 GET /products/{id}/stock P1 API REQ-005, REQ-006 有库存 读库存快照 返回 on-hand/allocated/available 可执行

4.5.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-PRD-201 P-050 商品列表与六态 P1 UI REQ-005, P-050, NFR-008 — 浏览/筛选商品 六态正确,SKU/状态/价格列齐全 可执行
TC-PRD-202 P-052 详情与停用/启用 P0 UI REQ-005, P-052 product:manage 添加价格、停用/启用 状态变更提交 If-Match;428/409 inline error;只读用户看不到变更动作 可执行
TC-PRD-203 四视口与键盘 P2 UI REQ-005, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

4.6 仓库库存与溯源(REQ-006)— 可执行

范围:库存地点、不可变 movement 台账、类型 receipt|allocation|release|shipment|adjustment_in|adjustment_out|transfer_in|transfer_out|return、分配不超 available、transfer 成对原子、溯源。端点:GET/POST /stock-locations、POST /stock-movements、GET /products/{id}/stock。页面:P-060、P-063。

关键错误码:INSUFFICIENT_AVAILABLE_STOCK(409)、INVENTORY_VERSION_CONFLICT(409)、METHOD_NOT_ALLOWED(405)。

4.6.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-STK-001 分配不得超过可用库存 P0 API REQ-006, NFR-007 on-hand 10, allocated 3 分配 8 拒绝发布 movement,available 保持 7 可执行
TC-STK-002 分配不足返回 409 P0 API REQ-006 库存不足 超额分配 409 INSUFFICIENT_AVAILABLE_STOCK 可执行
TC-STK-003 转移成对原子且净额为零 P0 API REQ-006 两组织/地点 公司间转移 paired movements 净额为零,保留两个 owners;失败回滚两条 可执行
TC-STK-004 已过账 movement 不可编辑/删除 P0 API REQ-006 已过账 movement PATCH/DELETE 405 METHOD_NOT_ALLOWED;只能创建带原因+原记录引用的冲销 可执行
TC-STK-005 并发版本冲突 P1 API REQ-006, NFR-007 双连接陈旧 version 并发变更 409 INVENTORY_VERSION_CONFLICT,不丢版本 可执行
TC-STK-006 调整需原因 P1 功能 REQ-006 warehouse 无原因 adjustment 拒绝,要求授权调整原因 可执行
TC-STK-007 收货/发货关联溯源 P1 功能 REQ-006 receipt/shipment 记录 查看 movement movement 关联 supplier/batch/purchase mirror 或 shipment 可执行

4.6.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-STK-101 GET/POST /stock-locations P1 API REQ-006 warehouse 列出/创建地点 契约正确,组织隔离 可执行
TC-STK-102 POST /stock-movements 类型枚举 P1 API REQ-006 warehouse 提交各类型 movement 合法类型成功;非法类型 422 可执行
TC-STK-103 GET /products/{id}/stock 快照 P1 API REQ-006 有库存 读库存 返回 on-hand/allocated/available 可执行

4.6.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-STK-201 P-060 库存地点与数量 P1 UI REQ-006, P-060 warehouse 查看现有/已分配/可用/在途 数量正确、归属方/位置筛选正确 可执行
TC-STK-202 P-063 台账只读与导出 P1 UI REQ-006, P-063 warehouse/auditor 查看台账、导出、创建冲销 台账不可编辑;冲销需原因 可执行
TC-STK-203 四视口与键盘 P2 UI REQ-006, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

4.7 供应商与外部 PO 镜像(REQ-007)— 可执行

范围:供应商(ABN/联系人/条款)、外部 PO 镜像(manual/CSV 导入,无出站 BYD 操作)、状态 awaiting_receipt|part_received|received|invoiced|closed|cancelled、按 owner+supplier+external PO 唯一。端点:GET/POST /suppliers、GET/POST /purchase-orders、POST /purchase-orders/{id}/receipts、POST /purchase-orders/{id}/cancel。页面:P-070、P-071。

关键错误码:PURCHASE_ORDER_DUPLICATE(409)、PURCHASE_ORDER_CANNOT_CANCEL(409)。

4.7.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-SUP-001 手动录入外部 PO 镜像 P0 功能 REQ-007, P-070 purchaser 录入 BYD 平台 PO 创建带 source platform reference 的 mirror;不发出 outbound supplier event 可执行
TC-SUP-002 CSV 导入生成 review batch P1 功能 REQ-007 CSV 文件含合法/错误行 导入 合法行创建,错误行进入 review batch,不部分静默创建 可执行
TC-SUP-003 重复外部 PO 返回 409 P0 API REQ-007 已存在同 owner+supplier+external PO 重复导入 409 PURCHASE_ORDER_DUPLICATE,error details 返回已有 ID 可执行
TC-SUP-004 收货后不可取消 P1 API REQ-007, FLOW-002 已 part_received/received 取消 409 PURCHASE_ORDER_CANNOT_CANCEL 可执行
TC-SUP-005 无收货取消成功 P1 API REQ-007, FLOW-002 awaiting_receipt 取消 取消成功,写 cancellation audit 可执行
TC-SUP-006 关闭状态需无未决异常 P1 功能 REQ-007, FLOW-002 invoiced + 无 open receipt/match exception 关闭 closed,不可变 closure audit 可执行

4.7.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-SUP-101 GET/POST /suppliers P1 API REQ-007 purchaser 分页/创建供应商 契约正确,ABN/条款字段生效 可执行
TC-SUP-102 GET/POST /purchase-orders 状态流转 P1 API REQ-007, FLOW-002 purchaser 创建并推进状态 状态机合法流转正确,非法 409 可执行
TC-SUP-103 POST /purchase-orders/{id}/cancel P1 API REQ-007 — 取消 awaiting_receipt 成功;已收货 409 可执行

4.7.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-SUP-201 P-070 PO 列表与导入 P1 UI REQ-007, P-070 purchaser 浏览/筛选/手动/CSV 导入 列表与导入批次正确,六态正确 可执行
TC-SUP-202 P-071 详情/收货/匹配/关闭 P0 UI REQ-007, P-071 purchaser/warehouse 查看明细、收货/QC、匹配、关闭 各操作入口正确,状态与 AP 状态显示正确 可执行
TC-SUP-203 四视口与键盘 P2 UI REQ-007, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

4.8 OCR 采购导入(REQ-008)— 可执行(mock fixture)

范围:上传 PDF/JPG/PNG ≤20MB、malware 扫描、OCR 仅生成 review_required 草稿、字段含 value/confidence/location、低于阈值(0.85)标记、GTIN 匹配不建商品、确认要求全部必填+行 resolved。端点:POST /purchase-orders/import、POST /purchase-orders/recognize、POST /purchase-orders/recognize/{id}/confirm。页面:P-074。

关键错误码:FILE_REJECTED(422)、PRODUCT_MATCH_REQUIRED(422)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-OCR-001 上传后仅生成 review_required 草稿 P0 功能 REQ-008, P-074 PDF/JPG/PNG 文件 上传并 recognize 生成 review_required 草稿,不建 PO mirror 可执行
TC-OCR-002 低置信度字段可见标记 P1 功能 REQ-008 含低置信度数量字段 fixture recognize 该字段标记置信度,不创建 PO mirror 可执行
TC-OCR-003 恶意文件返回 422 P0 API REQ-008 malware 阳性文件 上传 422 FILE_REJECTED,不启动 extraction 可执行
TC-OCR-004 未匹配商品返回 422 P1 API REQ-008 行商品无法匹配 confirm 422 PRODUCT_MATCH_REQUIRED,不建商品/PO 可执行
TC-OCR-005 确认关联原文件+extraction+编辑审计 P0 功能 REQ-008 已修正字段+已匹配商品 confirm 创建 source=ocr mirror,关联原始文件、extraction JSON、field-level edit audit 可执行
TC-OCR-006 文件大小超限拒绝 P2 API REQ-008 >20MB 文件 上传 拒绝(422) 可执行
TC-OCR-007 超时记录可重试 job failure P2 API REQ-008 adapter 超时 recognize 30s 超时,记录 retryable job failure 可执行
TC-OCR-008 P-074 审查页面 P1 UI REQ-008, P-074 存在草稿 预览/更正/匹配/确认/拒绝 置信度标记、匹配、确认、拒绝流程正确 可执行

4.9 销售订单与 GST(REQ-009)— 可执行

范围:Source manual|edi、状态 draft|confirmed|fulfilling|shipped|completed|invoiced|cancelled、retailer 外部 PO 唯一、行快照(SKU/数量/单价/折扣/GST 率/net/GST/gross)、Supercheap Auto 订单恒为 VOLTURA_AU 且 installation_enabled=false、FLOW-001 状态机。端点:GET/POST /orders、GET /orders/{id}、POST /orders/{id}/confirm、POST /orders/{id}/cancel。页面:P-080、P-081。

关键错误码:ORDER_EXTERNAL_REFERENCE_DUPLICATE(409)、ORDER_TOTAL_INVALID(422)、ORDER_CANNOT_CANCEL(409)、ORDER_NOT_CONFIRMED(409)、CUSTOMER_INACTIVE(409)、PRODUCT_NOT_ORDERABLE(422)。

4.9.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-ORD-001 GST 行级 half-up 快照 P0 API REQ-009 net 3000、10% GST 行 创建订单 line_gst=300、gross=3300;含税/免税行规则一致 可执行
TC-ORD-002 同一 EDI PO 并发只建一单 P0 API REQ-009, NFR-006 同 external reference 并发处理两次 仅一个 order,两份文档均关联它 可执行
TC-ORD-003 手工重复 external reference 409 P1 API REQ-009 已存在手工 external reference 重复创建 409 ORDER_EXTERNAL_REFERENCE_DUPLICATE 可执行
TC-ORD-004 总额无效返回 422 P1 API REQ-009 行合计不符 创建 422 ORDER_TOTAL_INVALID 可执行
TC-ORD-005 confirm 触发库存分配 P0 功能 REQ-009, FLOW-001 draft + 足够库存 confirm 订单 confirmed,分配 movement 已生成 可执行
TC-ORD-006 confirm 库存不足整体回滚 P0 API REQ-009, REQ-006 库存不足 confirm 失败不确认订单,事务内分配回滚 可执行
TC-ORD-007 发运后禁止取消 P0 API REQ-009, FLOW-001 fulfilling/shipped+ cancel 409 ORDER_CANNOT_CANCEL 可执行
TC-ORD-008 draft 取消释放分配 P1 API REQ-009, FLOW-001 draft/confirmed 无已过账发运 cancel cancelled,释放 allocation,写 reason audit 可执行
TC-ORD-009 draft 创建发运被拒 P1 API REQ-009, FLOW-001 draft 订单 创建 shipment 409 ORDER_NOT_CONFIRMED 可执行
TC-ORD-010 Supercheap Auto 订单约束 P0 API REQ-009 EDI Supercheap 来源 确认订单 owner=VOLTURA_AU 且 installation_enabled=false,不创建安装工作 可执行
TC-ORD-011 全部发运完成变 shipped P1 功能 REQ-009, REQ-010 订单行数量 10 发 4 与 6 order 变 shipped;额外发运被拒 可执行

4.9.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-ORD-101 GET/POST /orders 分页筛选 P1 API REQ-009 sales/operator 分页/按状态筛选 契约正确,组织隔离 可执行
TC-ORD-102 GET /orders/{id} foreign 404 P0 API REQ-009, NFR-004 foreign 订单 ID 本组织访问 404,不泄露 可执行
TC-ORD-103 POST /orders/{id}/confirm P0 API REQ-009, FLOW-001 draft 确认 confirmed + 分配;非法状态 409 可执行
TC-ORD-104 POST /orders/{id}/cancel P1 API REQ-009 draft/confirmed 取消 cancelled + 释放分配;shipped+ 409 可执行

4.9.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-ORD-201 P-080 订单列表六态与来源标识 P1 UI REQ-009, P-080 — 浏览/筛选订单 六态正确,手动/EDI 来源与 Data Source 标识正确 可执行
TC-ORD-202 P-081 订单详情确认/取消 P0 UI REQ-009, P-081 操作员 查看明细/合计/分配,确认/取消 确认后合计与分配正确;取消需原因;非法操作 inline error 可执行
TC-ORD-203 四视口与键盘 P2 UI REQ-009, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

4.10 销售三单对账(REQ-009A)— 可执行

范围:GET /orders/{id}/reconciliation 严格纯读,基于同一快照实时计算,返回 pending|matched|discrepancy;不创建/更新 exception、audit 或订单;容差默认数量 0、金额 AUD 1.00。页面:P-081 对账状态。

关键错误码:ORDER_RECONCILIATION_NOT_READY(409)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-REC-001 shipped/completed 无发票返回 pending P0 API REQ-009A shipped/completed 订单无已过账发票 调用对账 200 pending 可执行
TC-REC-002 一致返回 matched P0 API REQ-009A shipped+ 有发票,数量金额一致 调用对账 200 matched 可执行
TC-REC-003 差异返回 discrepancy 并列出差异行 P0 API REQ-009A 发货少于订单但开全额发票 调用对账 200 discrepancy,列出具体差异行 可执行
TC-REC-004 未就绪状态返回 409 P0 API REQ-009A draft/confirmed/fulfilling/cancelled 调用对账 409 ORDER_RECONCILIATION_NOT_READY,订单/audit/exception 不变 可执行
TC-REC-005 纯读无副作用 P0 API REQ-009A 任一状态 重复 GET 多次 不写 audit/exception/订单数据,结果一致 可执行
TC-REC-006 P-081 对账状态展示 P1 UI REQ-009A, P-081 各状态订单 查看对账状态 pending/matched/discrepancy 正确显示 可执行

4.11 发运 / 包装 / 交付(REQ-010)— 待实现

范围:Confirmed 订单多 shipments/partial 数量、状态 pending|collected|in_transit|delivered|signed|exception|returned、包装层级 pallet|carton|unit(unit=末级件)、shipped 数量不超 ordered、POD 含 signer/time/file、return/exception 记录 reason 与 replacement/refund 引用(不执行财务)。端点:POST /orders/{id}/shipments、GET/PATCH /shipments/{id}、POST /shipments/{id}/packages、POST /shipments/{id}/appointments、POST /shipments/{id}/sign。页面:P-090、P-091。

关键错误码:SHIPMENT_QUANTITY_EXCEEDED(409)、ASN_DATA_INCOMPLETE(422)、SHIPMENT_TRANSITION_INVALID(409)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-SHP-001 部分发运累计不超订单数量 P0 API REQ-010, FLOW-003 订单行数量 10 发 4 和 6 订单变 shipped;额外发运 409 SHIPMENT_QUANTITY_EXCEEDED 待实现
TC-SHP-002 缺失 ASN 字段返回 422 P1 API REQ-010 生成 ASN 缺必填 尝试发运 422 ASN_DATA_INCOMPLETE 待实现
TC-SHP-003 非法状态流转 409 P1 API REQ-010, FLOW-003 signed/returned 回退状态 409 SHIPMENT_TRANSITION_INVALID 待实现
TC-SHP-004 POD 上传可追溯 P1 功能 REQ-010 delivered 上传 POD 记录 signer/time/file hash 可追溯 待实现
TC-SHP-005 包装层级与预约 P2 功能 REQ-010, P-091 shipment 编辑 pallet/carton/unit、创建预约 层级正确,预约记录成功 待实现
TC-SHP-006 P-090/P-091 页面流程 P2 UI REQ-010, P-090/P-091 — 创建发运、状态迁移、上传 POD 页面功能与六态正确 待实现

4.12 零售商 EDI(REQ-011)— 待实现(live blocked)

范围:Canonical 类型 PO|POA|ASN|INVOIC、direction inbound|outbound、environment mock|test|live、raw payload 不可变且加密、mapping version 必填、幂等(provider+owner+type+external reference)、attempts 记录与脱敏错误、自动重试仅幂等 transient(1m/5m/30m 后 manual)。端点:POST /edi/inbound、GET /edi/partners、GET /edi/documents、POST /edi/documents/{id}/retry、POST /edi/outbound/{doc_type}。页面:P-100、P-101。

关键错误码:EDI_VALIDATION_FAILED(422)、EDI_RETRY_EXHAUSTED、EDI_ADAPTER_NOT_CONFIGURED(503)、EDI_VALIDATION_UNRESOLVED(409)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-EDI-001 有效 mock PO 入站关联订单 P0 功能 REQ-011, FLOW-004 Bunnings mock PO 入站处理 raw hash + canonical + mapping version + PSS 订单关联;标记 mock/test 待实现
TC-EDI-002 无效 PO 不入单且进异常队列 P0 功能 REQ-011 非法 PO 入站 422 EDI_VALIDATION_FAILED,不创建订单,异常队列显示 field errors + allowed actions 待实现
TC-EDI-003 重复文档返回原结果 P0 API REQ-011, NFR-006 同 external reference 重放 返回 prior result,不重复创建 待实现
TC-EDI-004 幂等 transient 自动退避重试 P1 API REQ-011 idempotent transient 失败 观察重试 1m/5m/30m 退避;耗尽 EDI_RETRY_EXHAUSTED 后 manual 待实现
TC-EDI-005 validation/non-idempotent 不自动重试 P0 API REQ-011 validation 失败 观察 不自动重试,未修正重试 409 EDI_VALIDATION_UNRESOLVED 待实现
TC-EDI-006 POA/ASN/INVOIC 使用记录 mapping version 且可复现 P1 功能 REQ-011 shipment/invoice 快照 生成 outbound payload 使用 recorded mapping version 且可复现 待实现
TC-EDI-007 live 配置不可用返回 503 P1 API REQ-011 无 live 凭据 live 发送 503 EDI_ADAPTER_NOT_CONFIGURED,不发送外部消息 待实现
TC-EDI-008 P-100/P-101 文档与血缘 P2 UI REQ-011, P-100/P-101 — 查看文档/血缘/尝试记录,重试 环境标记、source_provider、血缘、允许重试操作正确 待实现

4.13 供应商发票 / 三单匹配 / AP(REQ-012)— 可执行(remediation)

范围:PO 镜像行 / accepted receipts / 供应商发票三单匹配,容差默认数量 0、金额 AUD 1.00,结果 matched|exception|approved,AP 状态 unpaid|scheduled|paid|void(不执行付款),超容差批准、unpaid→scheduled|paid、scheduled→paid 需 purchasing:approve。端点:POST /purchase-orders/{id}/match、GET/POST /supplier-invoices、POST /supplier-invoices/{id}/status。页面:P-075。

关键错误码:SUPPLIER_INVOICE_MATCH_REQUIRED(409)、PERMISSION_FORBIDDEN(403)。

4.13.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-MTC-001 三单一致匹配成功 P0 功能 REQ-012 PO=accepted receipt=invoice match result=matched 可执行
TC-MTC-002 超容差差异创建 exception P0 功能 REQ-012 AUD 5 差异 match 创建 exception;未授权解决前 AP 不可排期 可执行
TC-MTC-003 无 approve 权限排期/paid 返回 403 P0 API REQ-012 仅有 purchasing:write 无 approve 调 scheduled/paid/resolve 403 PERMISSION_FORBIDDEN,匹配与 AP 不变 可执行
TC-MTC-004 approve 后可将发票排期并回填 paid P0 功能 REQ-012 approver + matched/approved 排期→回填 paid AP 流转正确,写 audit 可执行
TC-MTC-005 未匹配/未批准差异排期返回 409 P0 API REQ-012 无匹配或 pending 差异 排期/回填 paid 409 SUPPLIER_INVOICE_MATCH_REQUIRED,发票 status/version/audit 不变 可执行
TC-MTC-006 超容差批准需非空 reason P1 API REQ-012 超容差差异 批准缺 reason 拒绝,要求非空 reason 可执行
TC-MTC-007 差异不静默调整金额 P1 API REQ-012 差异 观察 不自动调整订单/发票金额 可执行

4.13.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-MTC-101 POST /purchase-orders/{id}/match P0 API REQ-012 PO+receipt+invoice 匹配 matched/exception/approved 契约正确 可执行
TC-MTC-102 GET/POST /supplier-invoices P1 API REQ-012 purchaser 列出/创建发票 契约正确,组织隔离 可执行
TC-MTC-103 POST /supplier-invoices/{id}/status 权限 P0 API REQ-012 approver / 无权限 变更 AP 状态 有权限成功;无权限 403 可执行

4.13.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-MTC-201 P-075 匹配结果与差异队列 P0 UI REQ-012, P-075 匹配/差异数据 查看匹配与差异队列、审查/批准异常 状态与批准入口正确,六态正确 可执行
TC-MTC-202 四视口与键盘 P2 UI REQ-012, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

4.14 补货建议(REQ-013)— 待实现

范围:建议量 = max(0, reorder point + target stock - available - open inbound),仅供参考绝不传输采购订单,接受需 POST /replenishment-suggestions/{id}/accept 写 draft preparation + 完整 input snapshot,同一建议仅可接受一次。端点:GET /reports/inventory、POST /replenishment-suggestions/{id}/accept。页面:P-064。

关键错误码:REPLENISHMENT_SNAPSHOT_STALE(409)、PRODUCT_NOT_ORDERABLE(422)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-RPL-001 建议量公式正确 P1 API REQ-013 available 5、inbound 2、reorder 4、target 10 计算 suggestion=3 且带 input snapshot 待实现
TC-RPL-002 接受只创建 draft 准备 P1 API REQ-013 有效建议 accept 仅创建 draft purchase mirror preparation,标记 external BYD ordering,不发外部 PO 待实现
TC-RPL-003 幂等接受返回原 draft P1 API REQ-013 已接受建议 重复 accept 返回原 draft,不重复创建 待实现
TC-RPL-004 过期快照返回 409 P1 API REQ-013 输入快照已变 accept 409 REPLENISHMENT_SNAPSHOT_STALE 待实现
TC-RPL-005 商品不可订购返回 422 P1 API REQ-013 inactive 商品 accept 422 PRODUCT_NOT_ORDERABLE 待实现
TC-RPL-006 P-064 页面 P2 UI REQ-013, P-064 — 查看建议/准备草稿 公式输入与建议、准备草稿入口正确 待实现

4.15 客户服务工单(REQ-014)— 待实现

范围:Type enquiry|complaint|repair|warranty,priority low|normal|high|urgent,status open|assigned|in_progress|resolved|closed,创建需非空 description,closed 重开需 case:reopen + 非空 reason + If-Match,Phase 1 无安装/electrician 字段,PATCH 事件顺序固定。端点:GET/POST /service-tickets、GET/PATCH /service-tickets/{id}。页面:P-110、P-111。

关键错误码:CASE_RESOLUTION_REQUIRED(422)、CASE_TRANSITION_INVALID(409)、CASE_REOPEN_FORBIDDEN(403)、CASE_REOPEN_REASON_REQUIRED(422)、VERSION_CONFLICT(409)、IF_MATCH_REQUIRED(428)、RESOURCE_NOT_FOUND(404)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-SVC-001 创建需非空 description P0 API REQ-014 service 空 description 创建 拒绝;创建写不可变 created 快照 待实现
TC-SVC-002 组织内 service staff 可见 P0 API REQ-014, NFR-004 Voltura order 关联 complaint Voltura 客服处理 / PSS-only 访问 Voltura 可见;PSS-only 无法发现 待实现
TC-SVC-003 无 resolution 关闭返回 422 P0 API REQ-014, FLOW-005 in_progress 无 resolution 关闭 422 CASE_RESOLUTION_REQUIRED,状态不变 待实现
TC-SVC-004 重开需权限+reason+If-Match P0 API REQ-014, FLOW-005 closed case 有/无权限、缺 reason、缺 If-Match 重开 授权成功清空 assignee/保留历史;缺项分别 403/422/409/428 待实现
TC-SVC-005 非法状态转换 409 P1 API REQ-014 closed 转非 open 409 CASE_TRANSITION_INVALID 待实现
TC-SVC-006 无权用户不探测资源 P1 API REQ-014 无 base permission 访问不存在资源 先 403,不探测资源;已过权限的不存在资源 404 待实现
TC-SVC-007 no-op 需匹配 If-Match P2 API REQ-014 全部字段相同 PATCH 200 当前单且 version/history/audit 不变 待实现
TC-SVC-008 P-110/P-111 页面与重开入口 P1 UI REQ-014, P-110/P-111 service 创建/分配/解决/关闭/重开 流程正确;closed 仅 case:reopen 可见重开;403/409/422 inline error 待实现

4.16 通知 / 作业 / 异常工作台(REQ-015)— 部分

范围:In-app 通知(email 为 optional adapter)、Job 状态 queued|running|succeeded|failed|dead_letter、仅幂等 jobs 重试、异常队列覆盖 EDI/OCR/order/shipment/match,ExceptionItem 含 owner/severity/reason/attempts/next_allowed_action。端点:GET /exceptions、POST /exceptions/{id}/claim|retry|resolve、GET /notifications、POST /notifications/{id}/read。页面:P-120、P-121。

实现状态说明:outbox/jobs 基础设施(T-006)已实现可执行;/exceptions、/notifications 端点与 P-120/P-121 页面待实现。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-EXP-001 幂等 transient 作业退避重试 P0 API REQ-015, NFR-011 幂等失败作业 观察 worker 1m/5m/30m 退避,耗尽 dead_letter;每次 attempt 只记一次 可执行
TC-EXP-002 validation/non-idempotent 不重试 P0 API REQ-015 非幂等/校验失败 观察 不自动重试,进入 manual 可执行
TC-EXP-003 领域事务与 outbox 同事务 P0 API REQ-015 故障注入 领域写成功/失败 成功双写;post-domain-write 故障回滚,无孤儿 outbox 可执行
TC-EXP-004 异常项含 next_allowed_action P1 功能 REQ-015, P-120 各类异常 查看队列 按 owner/severity/attempts 推导 `retry claim
TC-EXP-005 认领/重试/解决 P1 功能 REQ-015, P-121 异常项 认领→重试/解决 操作按允许集合生效;解决需记录原因 待实现
TC-EXP-006 通知已读 P2 API REQ-015 存在通知 标记已读 read_at 更新,幂等 待实现
TC-EXP-007 P-120/P-121 异常工作台 P1 UI REQ-015, P-120/P-121 — 查看队列/详情/操作 分组、owner、attempts、allowed actions 正确 待实现

4.17 仪表盘 / 报表 / 导出(REQ-016)— 待实现

范围:报表 sales|edi|inventory|finance,summary=rows 聚合,meta.definition 写口径,封闭 filters + 组织范围 + timezone + generated time + partial 状态,CSV 导出异步 202 job + 15 分钟签名下载 URL,导出二次鉴权,不包含 secret/raw EDI。端点:GET /reports/sales|edi|inventory|finance、POST /reports/exports、GET /reports/exports/{id}。页面:P-010、P-130。

关键错误码:VALIDATION_FAILED(422)、REPORT_EXPORT_INVALID(422)、ORG_SCOPE_FORBIDDEN(403)。

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-RPT-001 regional manager 仅统计活动组织 P0 API REQ-016, NFR-004 regional manager 运行 sales 报表 仅活动组织记录 待实现
TC-RPT-002 summary 等于 rows 聚合 P0 API REQ-016 HQ group scope 运行各报表 各 report summary 与逐组织 rows reconcile 待实现
TC-RPT-003 EDI 成功率重算规则 P0 API REQ-016 含 pending/retry 数据 运行 edi 报表 success/(success+failure) 重算,分母 0 为 0,pending/retry 不入分母,不平均行百分比 待实现
TC-RPT-004 非法参数返回 422 P1 API REQ-016 from>to、非法 timezone/scope_mode/UUID 运行报表 422 VALIDATION_FAILED,不返回 rows/summary、不写 job 待实现
TC-RPT-005 is_partial=true 需非空 partial_reason P1 API REQ-016 部分数据源 运行报表 partial_reason 非空;非 partial 必须为 null 待实现
TC-RPT-006 导出异步 202 + 签名下载 P1 API REQ-016 合法 filters 提交导出 → 查状态 → 下载 202 job;完成后签发 15 分钟 URL;无权限 403 待实现
TC-RPT-007 非法导出返回 422 不建 job P1 API REQ-016 非法 report/filter 提交导出 422 REPORT_EXPORT_INVALID,不建 job/文件/audit 待实现
TC-RPT-008 导出不含 secret/raw EDI P0 API REQ-016 完成导出 检查文件 无 secret/raw EDI payload;audit 记录 filters+requester 待实现
TC-RPT-009 P-130 报表页面 P2 UI REQ-016, P-130 经理 运行/导出报告 筛选、时间、partial 状态、导出入口正确 待实现

4.18 不可变审计与证据(REQ-017)— 可执行

范围:Audit 含 actor/service identity/org/action/resource/redacted diff/time/trace ID/reason;不含 secret/raw token/raw EDI;append-only;失败不写 success audit。端点:GET /audit-events。页面:P-191。

关键错误码:PERMISSION_FORBIDDEN(403)。

4.18.1 功能测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-AUD-001 关键变更产生带 trace ID 审计 P0 API REQ-017, NFR-014 角色/价格/订单状态/库存调整/EDI retry 变更 提交变更 存在同 trace ID 的 audit record 可执行
TC-AUD-002 审计脱敏 P0 API REQ-017, NFR-013 身份/邀请变更 查看审计 email/token/password/secret/raw EDI 均为 [REDACTED] 或缺失 可执行
TC-AUD-003 失败事务不写 success audit P0 API REQ-017 失败事务 触发失败 无 success audit,保留 security/attempt telemetry 可执行
TC-AUD-004 审计 append-only P0 API REQ-017 已有审计记录 尝试修改/删除 应用角色不可修改/删除 可执行
TC-AUD-005 无 audit:read 权限拒绝 P1 API REQ-017 无 audit:read 查询审计 403 PERMISSION_FORBIDDEN 可执行
TC-AUD-006 审计与关键变更同事务 P1 API REQ-017 关键 mutation 观察 audit 与 domain mutation 同事务提交 可执行

4.18.2 API 测试用例(端点级)

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-AUD-101 GET /audit-events 分页与组织范围 P1 API REQ-017 auditor 分页查询 返回组织范围 AuditEventPage,含 redacted diff 可执行
TC-AUD-102 GET /audit-events 权限 P1 API REQ-017 无权限用户 查询 403 PERMISSION_FORBIDDEN 可执行

4.18.3 UI 测试用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-AUD-201 P-191 审计搜索与脱敏展示 P1 UI REQ-017, P-191 auditor 搜索审计、导出证据 脱敏 diff 正确展示;导出成功 可执行
TC-AUD-202 四视口与键盘 P2 UI REQ-017, NFR-008/009 — 360/768/1280/1440px 操作 无溢出,键盘可达 可执行

5. E2E 旅程用例

用例ID 标题 优先级 类型 关联 前置条件 测试步骤 预期结果 状态
TC-E2E-001 用户开通全生命周期(J-190) P0 E2E REQ-001, FLOW-190, P-190/P-003 admin + 干净环境 1) 邀请新邮箱+预置角色 2) 用户经 P-003 设密激活 3) 登录 4) 无权限操作被 403 5) 授权角色后成功 6) 禁用后旧 token 401 7) 恢复后旧 token 仍不可用,需重登 每步契约与错误码符合 FLOW-190;全程 raw token 不落 HTTP 响应/日志/审计 可执行
TC-E2E-002 手工订单链路(M2) P0 E2E REQ-002/005/006/009, FLOW-001 干净测试组织 + GST 10% 商品 login→customer→product→price→location→receipt→order→confirm confirm 返回 confirmed;gross=3300、gst=300(net 3000);foreign org 访问 404 可执行
TC-E2E-003 采购收货链路(M3) P0 E2E REQ-006/007/012, FLOW-002 purchaser+warehouse supplier→PO 镜像→收货(部分/QC)→库存过账→发票→match→AP 排期 全链路 matched;库存过账可追溯;AP 状态正确 可执行
TC-E2E-004 OCR 导入审查链路(M3) P1 E2E REQ-008, P-074 低置信度 fixture 上传→recognize→修正→匹配→confirm 低置信度字段标记;确认创建 source=ocr mirror 并关联文件+extraction 可执行
TC-E2E-005 跨组织隔离拒绝矩阵 P0 E2E REQ-001, NFR-004 PSS-only 与 Voltura 用户 PSS 用户读取/写入 Voltura 资源 全部 403 ORG_SCOPE_FORBIDDEN 或同体 404,零 foreign 标识泄露 可执行
TC-E2E-006 全局聚合报表对账 P1 E2E REQ-016, REQ-001 HQ manager + group:read 运行 sales/edi/inventory/finance 报表 summary 与逐组织 rows reconcile;drill-down 保留 owner 标签 待实现

6. 需求追踪矩阵(实现与验证层)

用例覆盖率保证:Phase 1 每条 REQ 至少 1 条用例;关键 NFR 有对应用例。

需求 用例 ID 覆盖 状态
REQ-001 身份/组织范围/RBAC + FLOW-190 TC-IDN-001..026, TC-IDN-101..113, TC-IDN-201..208, TC-E2E-001, TC-E2E-005 可执行
REQ-002 客户/联系人/地址 TC-CUS-001..009, TC-CUS-101..105, TC-CUS-201..203, TC-E2E-002 可执行
REQ-003 线索/商机/活动 TC-LDS-001..005 待实现
REQ-004 报价与价格快照 TC-QOT-001..007 待实现
REQ-005 产品/税/定价 TC-PRD-001..008, TC-PRD-101..104, TC-PRD-201..203, TC-E2E-002 可执行
REQ-006 仓库库存与溯源 TC-STK-001..007, TC-STK-101..103, TC-STK-201..203, TC-E2E-003 可执行
REQ-007 供应商与外部 PO 镜像 TC-SUP-001..006, TC-SUP-101..103, TC-SUP-201..203, TC-E2E-003 可执行
REQ-008 OCR 采购导入 TC-OCR-001..008, TC-E2E-004 可执行(mock fixture)
REQ-009 销售订单与 GST TC-ORD-001..011, TC-ORD-101..104, TC-ORD-201..203, TC-E2E-002 可执行
REQ-009A 销售三单对账 TC-REC-001..006 可执行
REQ-010 发运/包装/交付 TC-SHP-001..006 待实现
REQ-011 零售商 EDI TC-EDI-001..008 待实现(live blocked)
REQ-012 供应商发票/三单匹配/AP TC-MTC-001..007, TC-MTC-101..103, TC-MTC-201..202, TC-E2E-003 可执行(remediation)
REQ-013 补货建议 TC-RPL-001..006 待实现
REQ-014 客户服务工单 TC-SVC-001..008 待实现
REQ-015 通知/作业/异常工作台 TC-EXP-001..007 部分(outbox 可执行,异常/通知待实现)
REQ-016 仪表盘/报表/导出 TC-RPT-001..009, TC-E2E-006 待实现
REQ-017 不可变审计与证据 TC-AUD-001..006, TC-AUD-101..102, TC-AUD-201..202 可执行
NFR-004 租户隔离 TC-IDN-008, TC-CUS-006, TC-ORD-102, TC-SVC-002, TC-RPT-001, TC-E2E-005 可执行
NFR-006 EDI 可靠性 TC-ORD-002, TC-EDI-003 部分
NFR-007 数据完整性 TC-STK-001/005, TC-ORD-006 可执行
NFR-008/009 可访问性/兼容性 各模块「四视口与键盘」用例(*-2xx) 可执行(已实现页面)
NFR-011 可观测性 TC-EXP-001..003 可执行(outbox/jobs)
NFR-013/014 隐私/审计 TC-AUD-002/003, TC-IDN-010/016 可执行

7. 附录

7.1 业务错误码速查(Phase 1)

HTTP 错误码 相关模块
400 ORG_SCOPE_REQUIRED REQ-001
400 INVITATION_INVALID REQ-001, FLOW-190
403 ORG_SCOPE_FORBIDDEN REQ-001, NFR-004
403 PERMISSION_FORBIDDEN REQ-001 及各写操作
403 CASE_REOPEN_FORBIDDEN REQ-014
404 RESOURCE_NOT_FOUND 各资源(同体反枚举)
405 METHOD_NOT_ALLOWED REQ-006 已过账 movement
409 IDENTITY_TRANSITION_INVALID REQ-001, FLOW-190
409 INVITATION_EMAIL_EXISTS REQ-001, J-191
409 IDEMPOTENCY_KEY_REUSED REQ-001
409 VERSION_CONFLICT 各乐观锁模块
409 CUSTOMER_DUPLICATE_CANDIDATE / CUSTOMER_INACTIVE REQ-002
409 PRICE_WINDOW_OVERLAP REQ-005
409 INSUFFICIENT_AVAILABLE_STOCK / INVENTORY_VERSION_CONFLICT REQ-006
409 PURCHASE_ORDER_DUPLICATE / PURCHASE_ORDER_CANNOT_CANCEL REQ-007
409 ORDER_EXTERNAL_REFERENCE_DUPLICATE / ORDER_CANNOT_CANCEL / ORDER_NOT_CONFIRMED REQ-009
409 ORDER_RECONCILIATION_NOT_READY REQ-009A
409 SUPPLIER_INVOICE_MATCH_REQUIRED REQ-012
409 SHIPMENT_QUANTITY_EXCEEDED / SHIPMENT_TRANSITION_INVALID REQ-010
409 QUOTE_TRANSITION_INVALID REQ-004
409 SALES_STAGE_INVALID REQ-003
409 CASE_TRANSITION_INVALID / EDI_VALIDATION_UNRESOLVED REQ-014 / REQ-011
422 PASSWORD_POLICY_INVALID / ROLE_ASSIGNMENT_INVALID / VALIDATION_FAILED REQ-001
422 PRODUCT_NOT_ORDERABLE REQ-005/009/013
422 ORDER_TOTAL_INVALID REQ-009
422 FILE_REJECTED / PRODUCT_MATCH_REQUIRED REQ-008
422 ASN_DATA_INCOMPLETE REQ-010
422 EDI_VALIDATION_FAILED REQ-011
422 CASE_RESOLUTION_REQUIRED / CASE_REOPEN_REASON_REQUIRED REQ-014
422 REPORT_EXPORT_INVALID REQ-016
428 IF_MATCH_REQUIRED 各乐观锁模块
503 EDI_ADAPTER_NOT_CONFIGURED REQ-011

7.2 非法状态流转清单(Phase 1)

对象 非法操作 响应
Order shipped/completed/invoiced 取消 409 ORDER_CANNOT_CANCEL
Order fulfilling 取消 409 ORDER_CANNOT_CANCEL
Order draft 创建 shipment 409 ORDER_NOT_CONFIRMED
Purchase part_received/received 取消 409 PURCHASE_ORDER_CANNOT_CANCEL
Shipment signed/returned 回退 409 SHIPMENT_TRANSITION_INVALID
EDI failed validation 未修正自动重试 409 EDI_VALIDATION_UNRESOLVED
Quote expired/rejected 转换 409 QUOTE_TRANSITION_INVALID
Case open/in_progress 无 resolution 关闭 422 CASE_RESOLUTION_REQUIRED
Case closed 转非 open / 无权无 reason 重开 409 / 403 / 422
Posted movement 编辑/删除 405 METHOD_NOT_ALLOWED
user/membership/invitation 非法流转 借激活/重发/角色更新恢复 disabled 等 409 IDENTITY_TRANSITION_INVALID
邀请密码不合规 P-003 激活 422 PASSWORD_POLICY_INVALID

7.3 测试数据清单

数据项 说明
四组织种子 SHENZHEN_HQ / HONG_KONG / PSS_AU / VOLTURA_AU
测试账号集 见 3.2 角色权限矩阵(含缺权限/foreign/inactive 账号)
客户 fixture 合法 ABN 客户、无 ABN 客户、inactive 客户、foreign 同 ABN 客户
商品 fixture GST 10%、GST 豁免、active/inactive、三档价格窗口
库存 fixture on-hand/allocated/available、不足库存、跨组织转移
订单 fixture net=3000/gst=300/gross=3300、Supercheap Auto、重复 external reference
EDI fixture Bunnings mock PO(有效/非法)、POA/ASN/INVOIC 快照
OCR fixture 低置信度字段、未匹配商品、malware 阳性、>20MB 文件