diff --git a/docs/task/98-真实采购任务安全模式.md b/docs/task/98-真实采购任务安全模式.md new file mode 100644 index 0000000..88e75cd --- /dev/null +++ b/docs/task/98-真实采购任务安全模式.md @@ -0,0 +1,68 @@ +# 98 Admin:增加真实采购任务模式、能力隔离与创建审计 + +- 类型:需求 +- 父级大工单:#96 +- 所属 MVP / 版本:#97 +- 状态:已完成 +- 日期:2026-08-10 +- Gitea 工单: + +## 背景与目标 + +原有采购任务无法区分演练和真实下单,也不能阻止只支持演练的 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` +- 结果:精确服务测试、真实 MySQL 8 `_test` 迁移测试、handler 测试、vet、build、格式和空白检查全部通过。 +- **没验证到的部分**:未让 Client 在安卓真机创建真实未付款订单;该执行能力属于后续 Client 工单。 + 未在生产 `autobuy` 库执行 v5,仅在隔离 `_test` 库验证。完整受影响包的真实 MySQL 测试因远程逐用例建库耗时过长被主动停止, + 没有出现失败输出;本工单直接相关用例已单独全部通过。 + +## 相关提交 + +- `3aaa40cfe043d9cfb9841dd4c899d2a4d8b2d141` feat: 增加真实采购任务安全模式 (#98)