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

70 lines
4.4 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.
# 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`
- 生产核验:通过 TLS 只读查询确认 `autobuy` 已记录 v5,三列、两个强制 CHECK、领取索引和存量任务审计均正确。
- 结果:精确服务测试、真实 MySQL 8 `_test` 迁移测试、生产 v5 核验、handler 测试、vet、build、格式和空白检查全部通过。
- **没验证到的部分**:未让 Client 在安卓真机创建真实未付款订单;该执行能力属于后续 Client 工单。
完整受影响包的真实 MySQL 测试因远程逐用例建库耗时过长被主动停止,没有出现失败输出;
本工单直接相关用例已单独全部通过。
## 相关提交
- `3aaa40cfe043d9cfb9841dd4c899d2a4d8b2d141` feat: 增加真实采购任务安全模式 (#98)