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

7.7 KiB
Raw Blame History

全项目业务流程测试报告

测试日期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=10000withdrawal_balance=10000
  2. 重复充值请求保持幂等,未重复入账。
  3. 商城消费 80 元后:balance=2000withdrawal_balance=2000
  4. 再申请提现 100 元被拒绝,余额保持不变。
  5. 申请提现 10 元后立即预扣:两类余额均从 2000 降至 1000。
  6. 重复提交同一提现申请未重复预扣。
  7. 平台驳回后两类余额均恢复至 2000。
  8. 重复驳回未重复返还,余额没有凭空增加。
  9. 未审核提现直接完成被拒绝。
  10. 审核通过并完成提现 10 元后:balance=1000withdrawal_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 <> 3PostgreSQL 返回 column reference "status" is ambiguous

修复:

  • ActiveRecords 统一使用 GORM 当前表限定 "<table>"."status"
  • 气站配送账号查询抽取明确的数据域查询函数。
  • 增加联表 SQL 回归测试。
  • 修复后气站和配送全部资源列表通过。

P1-3 配送钱包充值页面契约存在但 GET 路由缺失

配送前端声明 /wallet_recharge 资源页,后端仅有 POST 充值动作,列表页请求 GET 时直接 404。

修复:

  • 增加配送点范围内的充值流水列表和详情接口。
  • 仅返回当前配送点钱包中 delivery_admin_recharge 类型流水。
  • 同步配送前端生成契约。
  • 增加路由回归断言。

P1-4 气站、配送后台登录令牌写入与读取使用不同键

登录 Store 将令牌写入 tokenHTTP 客户端却读取 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

  • 平台后台 5173root 登录、运营仪表盘数据、提现列表加载通过。
  • 气站后台 5175:隔离气站管理员登录、首页数据、人员资质隐藏页加载通过。
  • 配送后台 5176:隔离配送管理员登录、首页、钱包充值页加载通过。
  • 关键页面控制台无 error / warning。

6. Flutter 客户端

用户 App

  • flutter analyze:通过,无问题。
  • flutter test2 项通过。

服务 App

  • flutter analyze:通过,无问题。
  • flutter test3 项通过。

设备级运行未覆盖,原因:

  • 两个工程当前只包含 Android / iOS 目录,没有 macOS / Web 平台。
  • 本机没有 Android SDK。
  • Flutter 报两个工程未配置为可构建的 iOS 应用。
  • 当前可见设备只有 macOS 和 Chrome无法承载现有工程。

因此客户端结论限定为“静态分析和自动化测试通过”,不声明真机/模拟器运行通过。

7. Worker、IoT 与外部边界

  • Workergo test ./...、构建通过;当前为 Mock 边界。
  • IoTgo test ./...、构建通过;未连接真实 MQTT Broker 或设备。
  • 未连接真实短信、支付渠道和 MQTT。
  • 验证码与支付只验证当前 Mock 实现的状态机、幂等和资金记账。

8. 实际执行的回归命令

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本轮未批量改写这些非业务告警。