Files
platforms/audit/BUSINESS_FLOW_TEST_REPORT.md
2026-07-31 11:33:44 +08:00

220 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 全项目业务流程测试报告
测试日期2026-07-31
测试分支:`main`
测试环境:仓库当前远程开发 PostgreSQL / Redis、Mock 验证码、Mock 支付边界
## 1. 结论
本轮门禁通过:
- 核心成功路径全部通过。
- 本轮发现的 P00 个。
- 本轮发现并修复的 P15 类。
- 修复后平台、气站、配送三套后台的 91 个鉴权及资源列表 HTTP 检查全部通过。
- 用户注册、服务关系、商城、钱包和提现闭环的 56 个流程断言全部通过。
- 三套 Web 已用真实浏览器完成登录和关键页面回归。
- 两个 Flutter 客户端的静态分析及现有测试全部通过。
当前没有阻止提交和推送的未修复 P0/P1。
## 2. 测试范围与数据隔离
测试以 `BFT20260731...` 为唯一前缀创建气站、配送点、后台账号、用户、地址、商品、钱包、银行卡、商城订单和提现申请。未使用或修改既有业务主数据。
测试结束后:
- 已驳回仍处于待处理状态的并发测试提现,恢复其预扣余额。
- 已归档本轮创建的气站、配送点、后台账号、用户、地址、服务关系、商品和分类等可变主数据。
- 钱包流水、提现申请、审核记录等不可变资金与审计证据按约定保留,并可通过测试前缀追踪。
- Redis 验证码使用短 TTL未修改既有键本轮测试键会自动过期。
## 3. 核心流程结果
### 3.1 鉴权与数据域
- 平台 root 正确密码登录成功,错误密码被拒绝。
- 未携带令牌访问受保护接口被拒绝。
- 气站管理员、配送管理员分别登录成功。
- 气站令牌访问平台后台、用户端接口均被拒绝。
- 用户完成验证码注册、密码登录、资料及地址查询。
- 用户注册时正确建立气站和配送点服务关系。
### 3.2 商城与幂等
- 创建并启用商城分类和商品。
- 用户按服务端价格创建 80 元订单。
- 相同 `request_no` 重复创建只返回同一订单,未重复扣减库存。
- 钱包支付成功后订单进入已支付状态。
- 已支付订单重复支付被拒绝。
### 3.3 钱包资金闭环
以人工充值 100 元且可提现为起点:
1. 充值后:`balance=10000``withdrawal_balance=10000`
2. 重复充值请求保持幂等,未重复入账。
3. 商城消费 80 元后:`balance=2000``withdrawal_balance=2000`
4. 再申请提现 100 元被拒绝,余额保持不变。
5. 申请提现 10 元后立即预扣:两类余额均从 2000 降至 1000。
6. 重复提交同一提现申请未重复预扣。
7. 平台驳回后两类余额均恢复至 2000。
8. 重复驳回未重复返还,余额没有凭空增加。
9. 未审核提现直接完成被拒绝。
10. 审核通过并完成提现 10 元后:`balance=1000``withdrawal_balance=1000`
11. 相同交易号重复完成保持幂等。
12. 两个并发 15 元提现请求面对 20 元余额时仅一个成功,最终余额为 5 元,没有透支。
以上结果确认此前的重复支出、驳回增发和完成不扣总余额问题已闭环。
### 3.4 全资源 HTTP 扫描
修复后独立执行 91 个回归检查,结果 `91/91`
- 平台总后台47 个资源列表。
- 气站后台20 个资源列表。
- 配送后台18 个资源列表。
- 另含三端登录、平台错误密码和未认证访问检查。
所有接口均返回预期业务码,没有 404、500、跨端越权或 SQL 错误。
## 4. 发现并修复的问题
### P1-1 远程库迁移被历史非空数据阻断
`gasorder_track_point.received_at` 新增为非空字段时GORM 直接执行 `ADD NOT NULL`,已有轨迹行导致迁移失败。
修复:
- 迁移前先添加可空字段。
- 使用既有 `occurred_at`,再退化到 `created_at` / 当前时间回填。
- 回填完成后再设置非空。
- PostgreSQL 和 MySQL 分别使用对应 SQL。
- 已在远程开发库实际迁移成功。
### P1-2 联表资源查询的 `status` 字段歧义
气站后台的配送账号、人员资质等联表资源使用裸 `status <> 3`PostgreSQL 返回 `column reference "status" is ambiguous`
修复:
- `ActiveRecords` 统一使用 GORM 当前表限定 `"<table>"."status"`
- 气站配送账号查询抽取明确的数据域查询函数。
- 增加联表 SQL 回归测试。
- 修复后气站和配送全部资源列表通过。
### P1-3 配送钱包充值页面契约存在但 GET 路由缺失
配送前端声明 `/wallet_recharge` 资源页,后端仅有 POST 充值动作,列表页请求 GET 时直接 404。
修复:
- 增加配送点范围内的充值流水列表和详情接口。
- 仅返回当前配送点钱包中 `delivery_admin_recharge` 类型流水。
- 同步配送前端生成契约。
- 增加路由回归断言。
### P1-4 气站、配送后台登录令牌写入与读取使用不同键
登录 Store 将令牌写入 `token`HTTP 客户端却读取 `gas_admin_token` / `delivery_admin_token`。表现为提示“登录成功”后资料请求 401并退回登录页。
修复:
- HTTP 客户端统一调用各端 `getToken()`
- 气站端固定使用 `gas_admin_token`
- 配送端固定使用 `delivery_admin_token`
- 浏览器回归确认两端均能进入运营首页。
### P1-5 隐藏关联页被前端权限守卫错误送到 404
`hideInMenu` 的资质、地址、关联明细页复用已授权 `menuCode`,但权限守卫仍强制要求路由名存在于服务端菜单树。
修复:
- 三套后台统一允许“服务端菜单路由存在”或“当前路由 `menuCode` 已授权”。
- 后端 JWT、角色和数据域校验保持不变。
- 浏览器回归确认气站人员资质隐藏页可访问。
## 5. Web 浏览器验证
使用本地真实前端和远程开发 API
- 平台后台 `5173`root 登录、运营仪表盘数据、提现列表加载通过。
- 气站后台 `5175`:隔离气站管理员登录、首页数据、人员资质隐藏页加载通过。
- 配送后台 `5176`:隔离配送管理员登录、首页、钱包充值页加载通过。
- 关键页面控制台无 error / warning。
## 6. Flutter 客户端
### 用户 App
- `flutter analyze`:通过,无问题。
- `flutter test`2 项通过。
### 服务 App
- `flutter analyze`:通过,无问题。
- `flutter test`3 项通过。
设备级运行未覆盖,原因:
- 两个工程当前只包含 Android / iOS 目录,没有 macOS / Web 平台。
- 本机没有 Android SDK。
- Flutter 报两个工程未配置为可构建的 iOS 应用。
- 当前可见设备只有 macOS 和 Chrome无法承载现有工程。
因此客户端结论限定为“静态分析和自动化测试通过”,不声明真机/模拟器运行通过。
## 7. Worker、IoT 与外部边界
- Worker`go test ./...`、构建通过;当前为 Mock 边界。
- IoT`go test ./...`、构建通过;未连接真实 MQTT Broker 或设备。
- 未连接真实短信、支付渠道和 MQTT。
- 验证码与支付只验证当前 Mock 实现的状态机、幂等和资金记账。
## 8. 实际执行的回归命令
```bash
cd backend/api
go test ./...
go vet ./...
go build ./cmd/main/main.go
cd backend/worker
go test ./...
go build ./cmd/main/main.go
cd backend/iot
go test ./...
go build ./cmd/main/main.go
cd frontend/platform_admin
pnpm type:check
pnpm lint
pnpm contract:check
pnpm build
cd frontend/gas_admin
pnpm type:check
pnpm lint
pnpm contract:check
pnpm build
cd frontend/delivery_admin
pnpm contract:sync
pnpm type:check
pnpm lint
pnpm contract:check
pnpm build
cd apps/user_app
flutter analyze
flutter test
cd apps/service_app
flutter analyze
flutter test
```
补充说明:三套前端 lint 命令返回成功,但仍报告工程模板既有的未使用代码、单词组件名和 Node import 风格 warnings本轮未批量改写这些非业务告警。