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 文件 |