# 生产服务器 QA Agent 清单

这份清单给部署在服务器内的 QA Agent 使用。开发机只负责代码门禁和配置检查；以下项目必须在生产或 staging 服务器上验证，因为它们依赖公网 HTTPS、微信回调、小程序合法域名、持久化卷和真实网络。

## 1. 服务器启动与基础健康

- 确认 `bigdata.dtacloud.cn` 已解析到服务器公网 IP。
- 确认 `.env.production` 只在服务器存在，不进 Git。
- 执行 `docker compose --env-file .env.production config --quiet`；需要查看结构时使用 `docker compose --env-file .env.production config --no-interpolate`，不要把插值后的密钥输出到日志。
- 执行 `docker compose --env-file .env.production up -d --build`。
- 执行 `docker compose --env-file .env.production ps`，确认 backend、web、postgres、minio、caddy、prometheus、grafana、alertmanager 均为 running/healthy。
- 访问 `https://bigdata.dtacloud.cn/api/health`，必须返回 `ok`。
- 访问 `https://bigdata.dtacloud.cn/api/health/deep`，确认 database、sms、objectStorage、wechatPay 配置状态符合生产预期。
- 访问 `https://bigdata.dtacloud.cn/api/metrics`，确认公网返回 404；Prometheus 容器仍需从内网抓取 backend 指标。

## 2. 生产安全开关

- `NODE_ENV=production`。
- `ENABLE_DEV_AUTH_CODE=false`。
- `ENABLE_DEV_PAYMENT=false`。
- `ENABLE_DEV_ADMIN_TOKEN=false`。
- CORS 仅允许 `https://bigdata.dtacloud.cn` 及明确 allowlist。
- 非白名单 Origin 请求 API 应被拒绝。
- `.env.production`、微信支付证书、阿里云密钥、短信密钥、JWT 密钥不出现在 Git 工作区。

## 3. 账号与登录

- 超级管理员手机号 `15842430688` 可通过短信验证码进入后台。
- `1390000000x` 历史种子手机号不可作为 active 管理员入口。
- 普通用户手机号验证码登录只允许已有账号；新注册主流程走小程序微信授权和绑定手机号。
- 小程序微信登录：
  - 新用户进入绑定手机号。
  - 绑定手机号后进入 onboarding。
  - 完成资料后进入首页。
  - 老用户直接进入首页或资料补全页。
- PC 小程序码登录：
  - PC 展示小程序码。
  - 小程序扫码后 PC 状态变化正常。
  - 手机确认后 PC 自动登录。

## 4. 微信支付真单

- 商户号、AppID、APIv3 key、商户证书序列号、公钥 ID、公钥文件路径或 base64 均正确。
- 小程序 JSAPI 支付：
  - 创建 1 笔小额测试订单。
  - 小程序可调起微信支付。
  - 用户取消后订单保持 `pending_payment`。
  - 支付成功后以前端刷新状态为准，不直接信前端成功回调。
- PC Native 支付：
  - PC 生成 Native 二维码。
  - 微信扫码可识别并付款。
  - 轮询最终进入成功页。
- 微信回调：
  - 回调 URL 为 `https://bigdata.dtacloud.cn/api/payments/wechat/notify`。
  - 验签失败不改订单。
  - 金额不匹配不改订单。
  - 成功回调后 payment_order 为 `succeeded`，order 为 `paid`。
  - 重复回调不重复发权益、不重复生成结算记录。

## 5. 文件与 MinIO

- MinIO bucket 已创建：public/private。
- `/api/health/deep` 的 objectStorage 真实 put/get/delete 探测为 `ok`。
- 上传并验证以下文件场景：
  - 商品封面。
  - CMS 首页图、Logo。
  - 专家头像。
  - 专家资质材料。
  - 数据服务需求附件。
  - 数据服务交付文件。
  - 发票 PDF/OFD。
  - 提现打款凭证。
- 权限验证：
  - 公共商品/CMS 图片未登录可访问。
  - 发票文件仅订单本人和 `invoice:read` 后台可下载。
  - 数据服务交付文件仅订单用户和 `data_service:read/update` 后台可下载。
  - 专家材料仅本人和专家审核/资料权限后台可查看。
  - 删除或移动对象存储中的文件后，再访问该文件会在异常中心生成 `file.object.missing`。
- 重启 backend/web/minio 后，已上传文件仍可访问。

## 6. 手动发票中心

- 已支付且金额大于 0 的订单可申请普通电子发票。
- 未支付、0 元、已取消订单不可申请。
- 同一订单不能重复提交有效发票申请。
- 用户只能查看自己的发票申请。
- 后台发票中心可筛选、导出 CSV、查看详情。
- 财务可标记开票中、驳回、失败。
- 标记已开票必须填写发票号码、开票时间并上传 PDF/OFD。
- 用户端“我的发票”和订单详情可查看状态并下载文件。

## 7. 异常中心

- `/admin/exceptions` 可打开。
- 手动制造或通过数据准备验证：
  - 支付超时生成 `payment.order.timeout`。
  - 支付成功但订单未 paid 生成 `payment.order_state_mismatch`。
  - 订单 paid 但权益缺失生成 `order.entitlement_missing`。
  - 发票 pending 超过 3 天生成 `invoice.pending_stale`。
  - 发票 failed/rejected 生成 `invoice.failed`。
  - 文件对象缺失生成 `file.object.missing`。
- 异常可标记处理中、解决、忽略、记录重试。
- 所有处理动作写入审计日志。

## 8. 监控告警

- 公网 `https://bigdata.dtacloud.cn/api/metrics` 返回 404。
- Prometheus 能从内网抓取 backend `/api/metrics`。
- Grafana 能登录并看到数据源。
- Alertmanager webhook token 正确。
- Sentry DSN 配置后，前端/后端测试异常可上报。
- 告警演练：
  - backend 停止触发服务不可用告警。
  - MinIO 停止触发对象存储告警。
  - 短信失败率异常可被记录。
  - 微信回调失败可被记录。
  - 备份失败可被记录。

## 9. 备份恢复

- 执行 `make backup`，确认生成 PostgreSQL dump 和 MinIO 数据备份。
- 在 staging 或临时 compose project 执行恢复演练，不在生产库直接演练删库。
- 恢复后验证：
  - 管理员可登录。
  - 用户订单存在。
  - 发票文件可下载。
  - 商品/CMS 图片可访问。
  - 异常中心历史事件存在。

## 10. 真机与浏览器回归

- 小程序真机：
  - 微信登录。
  - 绑定手机号。
  - onboarding。
  - 下单。
  - JSAPI 支付取消。
  - JSAPI 支付成功。
  - 申请发票。
  - PC 扫码确认登录。
- PC 浏览器：
  - 首页、商品详情、购物车、结算、成功页。
  - 登录页默认小程序码登录。
  - 手机号兜底登录已有账号。
  - 我的订单、我的发票。
  - 后台订单、支付、发票、异常中心、系统状态。
  - 404、loading、error 页面无白屏和重叠。

## 11. QA 输出

QA Agent 完成后输出：

- 通过项列表。
- 失败项列表，每条包含复现步骤、请求/响应、截图或日志。
- 生产阻断项。
- 可延期项。
- 建议上线/不建议上线结论。
