Files
cmautobuy/docs/task/98-真实采购任务安全模式.md
T

70 lines
4.4 KiB
Markdown
Raw Normal View History

2026-08-10 15:12:21 +08:00
# 98 Admin:增加真实采购任务模式、能力隔离与创建审计
- 类型:需求
- 父级大工单:#96
- 所属 MVP / 版本:#97
- 状态:已完成
- 日期:2026-08-10
- Gitea 工单:<http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/98>
## 背景与目标
原有采购任务无法区分演练和真实下单,也不能阻止只支持演练的 Client 领取真实任务。
本任务增加不可变执行模式、真实任务创建审计和 Client 能力隔离,同时保持真实下单默认关闭且不增加付款能力。
## 最终方案
- MySQL 追加 v5 迁移,为 `tasks` 增加 `execution_mode`、`live_confirmed_by` 和
`live_confirmed_at`,历史数据默认 `dry_run`;数据库 CHECK 同时约束模式和 live 审计字段。
- 管理员和其他正常状态用户均可创建 `dry_run` 或 `live` 采购任务。`live` 必须勾选风险确认、
输入“创建未付款订单”,并选择当前账号可见且声明 `purchase_mode=live` 的 Client。
- 任务领取按 Client 上报能力过滤:`dry_run` Client 只能领取演练任务,`live` Client 可以领取两种模式。
- 任务列表、详情和 Client 领取响应显示 `execution_mode`;Client 契约同步更新。
- 顺运宝创建弹窗默认选择采购演练;切换真实模式后显示明确警告和双重确认,并禁用仅演练客户端。
- 与最初建单方案的差异:用户在实施中确认取消“仅管理员创建 live”的限制,改为所有正常状态用户均可创建;
工单正文和实施均已同步调整。
## 改了哪些
- `admin/repository/mysql_db.go`:追加可重放的 MySQL v5 迁移、约束、索引和 schema 自检。
- `admin/model/model.go`、`admin/repository/task.go`:增加任务执行模式与 live 创建审计字段,读写和领取查询同步支持。
- `admin/repository/client.go`:安全解析 Client 采购能力,旧值和非法值回退为 `dry_run`。
- `admin/service/purchase_workflow.go`:校验账号状态、live 双重确认、客户端可见范围与 live 能力并记录审计。
- `admin/handler/`、`admin/templates/`、`admin/static/`:解析创建参数,显示任务模式并实现安全确认交互。
- `docs/client/04-admin-api-contract.md` 及 Admin 基线文档:同步领取能力矩阵、响应字段、数据和界面规则。
- 新增及扩充测试:覆盖 v5 迁移、错误表形状、创建门禁、能力领取隔离、模式保持和 API 响应。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| MySQL 从 v4 升级、DDL 完成但版本未记录时重放,并通过表形状自检 | 通过 |
| 错误 v5 列形状不记录迁移版本 | 通过 |
| 旧任务和未传模式请求默认 `dry_run` | 通过 |
| 管理员和其他正常状态用户均可经阻断确认创建 live,禁用账号不可创建 | 通过 |
| live 必须指定 live Client,dry_run Client 无法领取 | 通过 |
| 取消和重派不改变任务模式 | 通过 |
| 页面、详情和 Client API 明确区分执行模式 | 通过 |
| 取消或重派后仍接受原 Client 结果 | 通过 |
| 不增加付款、凭据记录或风控绕过能力 | 通过 |
## 测试
- 执行的命令:
- `GOTOOLCHAIN=go1.23.0 go test ./service -run '<#98 创建、领取、模式保持及取消/重派回归>' -count=1`
- `GOTOOLCHAIN=go1.23.0 go test ./service -run 'Test(Claim_无主任务能被领到并标记领取者|SubmitResult_同键同内容返回同一结果)' -count=1`
- `GOTOOLCHAIN=go1.23.0 go test ./repository -run 'TestMySQLMigrate_(V4升级V5且断点重跑|V5形状错误不记版本)' -count=1`
- `GOTOOLCHAIN=go1.23.0 go test ./handler/api ./handler/web -count=1`
- `GOTOOLCHAIN=go1.23.0 go vet ./...`
- `GOTOOLCHAIN=go1.23.0 go build ./...`
- `gofmt -l .`、`git diff --check`
2026-08-10 15:15:29 +08:00
- 生产核验:通过 TLS 只读查询确认 `autobuy` 已记录 v5,三列、两个强制 CHECK、领取索引和存量任务审计均正确。
- 结果:精确服务测试、真实 MySQL 8 `_test` 迁移测试、生产 v5 核验、handler 测试、vet、build、格式和空白检查全部通过。
2026-08-10 15:12:21 +08:00
- **没验证到的部分**:未让 Client 在安卓真机创建真实未付款订单;该执行能力属于后续 Client 工单。
2026-08-10 15:15:29 +08:00
完整受影响包的真实 MySQL 测试因远程逐用例建库耗时过长被主动停止,没有出现失败输出;
本工单直接相关用例已单独全部通过。
2026-08-10 15:12:21 +08:00
## 相关提交
- `3aaa40cfe043d9cfb9841dd4c899d2a4d8b2d141` feat: 增加真实采购任务安全模式 (#98)