audit full project flows and harden backend

This commit is contained in:
2026-08-03 16:03:44 +08:00
parent d8d62469d6
commit 95b6f2b69c
22 changed files with 505 additions and 890 deletions

View File

@@ -1,219 +1,65 @@
# 全项目业务流程测试报告
# 全项目流程审计与检查报告
测试日期2026-07-31
测试分支:`main`
测试环境:仓库当前远程开发 PostgreSQL / Redis、Mock 验证码、Mock 支付边界
审计日期2026-08-03
依据:`checking/03-系统与业务覆盖矩阵.md``checking/06-业务流程测试.md`
## 1. 结论
本轮门禁通过:
本轮是代码、契约和本地门禁审计不是远程环境端到端验收。BF-01BF-15 中没有任何流程具备“全链路通过”证据4 项为部分具备11 项因实现缺口或环境缺口阻塞。旧报告中的远程数据库、浏览器和 Flutter 成功结论不得沿用。
- 核心成功路径全部通过。
- 本轮发现的 P00 个。
- 本轮发现并修复的 P15 类。
- 修复后平台、气站、配送三套后台的 91 个鉴权及资源列表 HTTP 检查全部通过。
- 用户注册、服务关系、商城、钱包和提现闭环的 56 个流程断言全部通过。
- 三套 Web 已用真实浏览器完成登录和关键页面回归。
- 两个 Flutter 客户端的静态分析及现有测试全部通过。
状态定义:
当前没有阻止提交和推送的未修复 P0/P1
- `部分具备`:存在主要实现和局部自动化证据,但缺远程依赖、外部沙箱或跨端 E2E
- `阻塞`:关键业务步骤不存在,或必要环境/安全凭据未提供。
## 2. 测试范围与数据隔离
## 2. BF-01BF-15 检查矩阵
测试以 `BFT20260731...` 为唯一前缀创建气站、配送点、后台账号、用户、地址、商品、钱包、银行卡、商城订单和提现申请。未使用或修改既有业务主数据。
| 流程 | 状态 | 本轮证据 | 主要缺口 |
| --- | --- | --- | --- |
| BF-01 邀请注册与服务关系 | 阻塞 | 管理端与 API 可构建 | 无本轮远程 DB/Redis、二维码安全及跨端 E2E。 |
| BF-02 设备绑定与远程关阀 | 阻塞 | 内部命令/Outbox/Gateway/协议代码存在 | 无设备绑定、用户归属鉴权和公开远控入口。 |
| BF-03 高风险遥测与整改 | 阻塞 | 上行消息可持久化 | 无规则事件、自动关阀、通知、整改复检及开阀拦截闭环。 |
| BF-04 共享、群控与报修 | 阻塞 | 无充分证据 | 共享权限、群控结果聚合及撤权服务端校验未形成闭环。 |
| BF-05 下单、支付与任务 | 部分具备 | 支付回调一致性已修复并有单测 | 无远程事务、支付沙箱、商户/appid 显式校验和跨端任务 E2E。 |
| BF-06 超时关单与迟到回调 | 部分具备 | Worker 调度与 API 关单代码可构建 | Worker 无测试;无渠道超时、竞争和重启实测。 |
| BF-07 订单项退款入钱包 | 部分具备 | 退款模型/逻辑可静态检查 | 无远程并发、审核隔离、钱包守恒和渠道对账证据。 |
| BF-08 气瓶配送与回收 | 阻塞 | 三套后台可构建 | 无库存并发、轨迹、扫码取证、押金及结算 E2E。 |
| BF-09 人员准入与离线补传 | 阻塞 | App 代码存在 | Flutter 未验证;服务端强制前置和离线完整性无全链路证据。 |
| BF-10 安装/维修闭环 | 阻塞 | 需求与页面资源存在 | 缺服务端顺序状态机和强制证据集成测试。 |
| BF-11 钱包提现审核 | 部分具备 | 资金逻辑已有历史单测,后端门禁通过 | 本轮未连接远程 DB/Redis未执行并发、重复审批和打款回执 E2E。 |
| BF-12 组织隔离与轨迹访问 | 阻塞 | 鉴权框架和后台资源存在 | 无多组织远程数据、分页/导出/缓存串租户及敏感访问审计 E2E。 |
| BF-13 IoT 上行与 ACK | 阻塞 | 协议、Gateway、Topic 身份单测通过 | ACK 包号复用风险;无 MQTT Broker/真设备联调。 |
| BF-14 IoT Outbox 恢复 | 阻塞 | Outbox/Worker 投递代码存在 | 无双 Worker、崩溃窗口、重复投递、积压和死信测试。 |
| BF-15 审计与灾备 | 阻塞 | 部分事实有审计字段 | 未执行 PostgreSQL WAL 恢复、Redis 故障恢复和 RPO/RTO 测量。 |
测试结束后:
## 3. AC-01AC-25 汇总
- 已驳回仍处于待处理状态的并发测试提现,恢复其预扣余额。
- 已归档本轮创建的气站、配送点、后台账号、用户、地址、服务关系、商品和分类等可变主数据。
- 钱包流水、提现申请、审核记录等不可变资金与审计证据按约定保留,并可通过测试前缀追踪。
- Redis 验证码使用短 TTL未修改既有键本轮测试键会自动过期。
| 状态 | AC |
| --- | --- |
| 局部代码证据 | AC-02、AC-07、AC-08、AC-24、AC-25 |
| 关键实现或 E2E 阻塞 | AC-01、AC-03AC-06、AC-09AC-23 |
## 3. 核心流程结果
“局部代码证据”不代表验收通过。AC-02/AC-25 仍受 ACK 关联和 Broker 联调阻塞AC-07 仍受支付沙箱和商户身份检查阻塞AC-08 仍受远程并发验证阻塞AC-24 仍需数据库 Schema 全量核查。
### 3.1 鉴权与数据域
## 4. 本轮实际验证
- 平台 root 正确密码登录成功,错误密码被拒绝。
- 未携带令牌访问受保护接口被拒绝。
- 气站管理员、配送管理员分别登录成功。
- 气站令牌访问平台后台、用户端接口均被拒绝。
- 用户完成验证码注册、密码登录、资料及地址查询。
- 用户注册时正确建立气站和配送点服务关系。
| 范围 | 结果 |
| --- | --- |
| API | `go test ./...``go vet ./...`、build 通过 |
| Worker | test/vet/build 通过,但无测试文件 |
| IoT Gateway | test/vet/build 通过 |
| IoT Server | test/vet/build 通过,含 Topic 身份回归测试 |
| platform_admin | type、contract、build 通过lint 有 111 warnings/12 infos |
| gas_admin、delivery_admin | type、lint、build 命令通过;存在非阻断 lint 告警 |
| site | build 通过4/4 托管测试通过 |
| Flutter Apps | 命令启动超时,未取得结果 |
| 远程 PostgreSQL/Redis | API YAML 已恢复远程配置,但本轮未执行集成流程 |
### 3.2 商城与幂等
## 5. 远程执行前置清单
- 创建并启用商城分类和商品
- 用户按服务端价格创建 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本轮未批量改写这些非业务告警。
1. 确认 YAML 配置指向隔离库,并为 Redis 使用独立 DB/前缀
2. 限制配置文件访问权限,不在命令、报告或日志中记录连接值
3. 明确测试数据前缀和保留策略;禁止清库和删除资金/审计事实
4. 启动支付沙箱、MQTT 模拟器和四后端进程,逐项记录 UI/API、数据库、Outbox、回执和审计证据
5. 先解决 P0/P1 实现缺口,再执行完整 BF 门禁;否则测试结果只能是预期阻塞