Admin:增加真实采购任务模式、能力隔离与创建审计 #98

Closed
opened 2026-08-10 14:37:44 +08:00 by ila · 9 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#96
  • 所属 MVP / 版本:#97
  • 阶段:阶段 1——Admin 任务模式与能力隔离

要解决什么

Admin 采购任务没有字段区分演练与真实下单。直接开放 live 会让 dry_run Client 误领,也无法审计谁把任务设为真实执行。

做什么 / 不做什么

  • 做:新增不可变 execution_mode=dry_run/live;旧数据和默认值 dry_run;管理员和其他正常状态用户均可经阻断确认创建 live;只允许指定声明 live 的 Client;领取按能力过滤;列表/详情显示模式;记录创建人和确认时间;同步 Client 契约。
  • 不做:不实现手机点击;禁用或状态异常用户不能创建任务;不付款;不批量 live;不远程打开 Client live。

怎么做

  • MySQL 追加迁移,给 tasks 增加执行模式和 live 确认审计字段;DDL 可重放、自检后记录版本,生产前备份。
  • 修改 Admin model、repository、purchase workflow、领取服务和 handler;模式默认、创建校验、不可变和 Client 能力校验全部在服务端完成。
  • live 任务必须指定已登记且声明 live 的 Client;dry_run Client 永远查不到 live。
  • 顺运宝确认弹窗默认 dry_run;管理员和其他正常状态用户均可选择 live,需勾选并输入“创建未付款订单”。
  • 任务列表/详情明确显示“采购演练”或“真实下单(不支付)”。
  • API payload 增加 execution_mode;旧 Client 缺字段只兼容 dry_run;同工单同步 docs/client/04-admin-api-contract.md。
  • 预计文件:admin/model/model.go、admin/repository/mysql_db.go、task.go、admin/service/purchase_workflow.go、领取 handler/service、模板、契约和测试。

验收标准

  • MySQL 从当前版本升级、重放和表形状自检通过。
  • 旧任务和未传模式请求均为 dry_run。
  • 管理员和其他正常状态用户经阻断确认后均可创建 live;禁用或状态异常用户不可创建。
  • live 必须指定 live Client,dry_run Client 无法领取。
  • 模式创建后不可修改,取消/重派也不改变。
  • 页面和 API 文字区分模式。
  • 采集、演练、幂等和取消后仍收结果无回归。
  • 不增加付款能力或记录凭据。

怎么验证

cd D:\chengma\cmautobuy\admin
$env:GOTOOLCHAIN='go1.23.0'
go vet ./...
gofmt -l .
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN

使用独立 MySQL 8.4 _test 库验证升级和能力矩阵,并运行 Admin/Client 契约测试。

风险和回退

数据库/API 风险通过备份、默认 dry_run 和兼容测试控制。回退应用时保留追加字段,不删除迁移;误建风险由账号状态校验、双重确认、指定 Client 和服务端复核控制。

## 基本信息 - 类型:需求 - 父级大工单:#96 - 所属 MVP / 版本:#97 - 阶段:阶段 1——Admin 任务模式与能力隔离 ## 要解决什么 Admin 采购任务没有字段区分演练与真实下单。直接开放 live 会让 dry_run Client 误领,也无法审计谁把任务设为真实执行。 ## 做什么 / 不做什么 - 做:新增不可变 `execution_mode=dry_run/live`;旧数据和默认值 dry_run;管理员和其他正常状态用户均可经阻断确认创建 live;只允许指定声明 live 的 Client;领取按能力过滤;列表/详情显示模式;记录创建人和确认时间;同步 Client 契约。 - 不做:不实现手机点击;禁用或状态异常用户不能创建任务;不付款;不批量 live;不远程打开 Client live。 ## 怎么做 - MySQL 追加迁移,给 `tasks` 增加执行模式和 live 确认审计字段;DDL 可重放、自检后记录版本,生产前备份。 - 修改 Admin model、repository、purchase workflow、领取服务和 handler;模式默认、创建校验、不可变和 Client 能力校验全部在服务端完成。 - live 任务必须指定已登记且声明 live 的 Client;dry_run Client 永远查不到 live。 - 顺运宝确认弹窗默认 dry_run;管理员和其他正常状态用户均可选择 live,需勾选并输入“创建未付款订单”。 - 任务列表/详情明确显示“采购演练”或“真实下单(不支付)”。 - API payload 增加 `execution_mode`;旧 Client 缺字段只兼容 dry_run;同工单同步 `docs/client/04-admin-api-contract.md`。 - 预计文件:`admin/model/model.go`、`admin/repository/mysql_db.go`、`task.go`、`admin/service/purchase_workflow.go`、领取 handler/service、模板、契约和测试。 ## 验收标准 - [x] MySQL 从当前版本升级、重放和表形状自检通过。 - [x] 旧任务和未传模式请求均为 dry_run。 - [x] 管理员和其他正常状态用户经阻断确认后均可创建 live;禁用或状态异常用户不可创建。 - [x] live 必须指定 live Client,dry_run Client 无法领取。 - [x] 模式创建后不可修改,取消/重派也不改变。 - [x] 页面和 API 文字区分模式。 - [x] 采集、演练、幂等和取消后仍收结果无回归。 - [x] 不增加付款能力或记录凭据。 ## 怎么验证 ```powershell cd D:\chengma\cmautobuy\admin $env:GOTOOLCHAIN='go1.23.0' go vet ./... gofmt -l . go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` 使用独立 MySQL 8.4 `_test` 库验证升级和能力矩阵,并运行 Admin/Client 契约测试。 ## 风险和回退 数据库/API 风险通过备份、默认 dry_run 和兼容测试控制。回退应用时保留追加字段,不删除迁移;误建风险由账号状态校验、双重确认、指定 Client 和服务端复核控制。
Author
Owner

开始实施。范围严格按工单:新增不可变 execution_mode,默认 dry_run;live 仅管理员经阻断式确认创建,且必须分配给声明 purchase_mode=live 的客户端;领取接口按能力过滤;同步任务列表/详情/API 与契约文档。不会加入支付、验证码/风控绕过、批量真实下单或远程开启真实模式。

开始实施。范围严格按工单:新增不可变 `execution_mode`,默认 `dry_run`;`live` 仅管理员经阻断式确认创建,且必须分配给声明 `purchase_mode=live` 的客户端;领取接口按能力过滤;同步任务列表/详情/API 与契约文档。不会加入支付、验证码/风控绕过、批量真实下单或远程开启真实模式。
Author
Owner

范围变更(用户已确认):取消“仅管理员可创建 live”的限制。管理员和其他正常状态用户均可创建演练及真实采购任务;真实任务仍必须勾选确认、输入指定短语、分配给 live Client,并记录创建人与确认时间。禁用或状态异常账号不得创建。

范围变更(用户已确认):取消“仅管理员可创建 live”的限制。管理员和其他正常状态用户均可创建演练及真实采购任务;真实任务仍必须勾选确认、输入指定短语、分配给 live Client,并记录创建人与确认时间。禁用或状态异常账号不得创建。
Author
Owner

实现完成,状态:待用户验收。

实现要点:

  • MySQL 追加 v5:任务模式、live 创建审计、CHECK、领取索引及形状自检。
  • 管理员和其他正常状态用户均可创建 live;服务端强制复选确认、短语“创建未付款订单”、当前可见 live Client。
  • dry_run Client 无法领取 live;live Client 可领取两种模式。
  • 任务列表/详情/API 和 Client 契约显示 execution_mode。
  • 保持默认 dry_run,不增加支付、凭据存储或风控绕过。

验证:

  • Go 1.23.0 精确服务门禁与取消/重派结果回归通过。
  • 真实 MySQL 8 _test 的 v4→v5、DDL 重放、错误形状不记版本通过。
  • handler 测试、go vet ./...、go build ./...、格式检查通过。
  • 未验证:安卓真机创建真实未付款订单(属于后续 Client 工单);未对生产库执行 v5。

提交:

  • 实现:3aaa40cfe043d9cfb9841dd4c899d2a4d8b2d141
  • 归档:03c87ec82dc6aa10f612ba19160fb74c5470b529
  • 归档:docs/task/98-真实采购任务安全模式.md
实现完成,状态:待用户验收。 实现要点: - MySQL 追加 v5:任务模式、live 创建审计、CHECK、领取索引及形状自检。 - 管理员和其他正常状态用户均可创建 live;服务端强制复选确认、短语“创建未付款订单”、当前可见 live Client。 - dry_run Client 无法领取 live;live Client 可领取两种模式。 - 任务列表/详情/API 和 Client 契约显示 `execution_mode`。 - 保持默认 dry_run,不增加支付、凭据存储或风控绕过。 验证: - Go 1.23.0 精确服务门禁与取消/重派结果回归通过。 - 真实 MySQL 8 `_test` 的 v4→v5、DDL 重放、错误形状不记版本通过。 - handler 测试、`go vet ./...`、`go build ./...`、格式检查通过。 - 未验证:安卓真机创建真实未付款订单(属于后续 Client 工单);未对生产库执行 v5。 提交: - 实现:`3aaa40cfe043d9cfb9841dd4c899d2a4d8b2d141` - 归档:`03c87ec82dc6aa10f612ba19160fb74c5470b529` - 归档:`docs/task/98-真实采购任务安全模式.md`
Author
Owner

补充验证:无主采集任务领取与相同幂等键重复提交结果回归均在 Go 1.23.0 + 真实 MySQL 8 _test 下通过。归档提交因补充该验证记录已更新为 6249147229f5e9674159bd56c9333855944015cb(上一条中的 03c87ec... 已被本提交替代)。

补充验证:无主采集任务领取与相同幂等键重复提交结果回归均在 Go 1.23.0 + 真实 MySQL 8 `_test` 下通过。归档提交因补充该验证记录已更新为 `6249147229f5e9674159bd56c9333855944015cb`(上一条中的 `03c87ec...` 已被本提交替代)。
Author
Owner

生产数据库核验完成:

  • 目标库:autobuy
  • MySQL:8.4.8
  • schema:已是 v5,应用时间 2026-08-10T06:51:00.6763521Z
  • v5 三列的类型、默认值、可空性和排序规则正确
  • chk_tasks_execution_mode、chk_tasks_live_confirmation 均为强制启用
  • idx_tasks_claim_mode 列顺序和降序方向正确
  • 当前 2 条历史任务均为 dry_run
  • 非法 live 审计记录:0

由于只读预检时已确认 v5 被应用启动流程执行,本次没有重复执行 DDL,也没有修改任务数据。归档同步提交:7bd75510b20b04f59688a855d6ab839cf084c53f。

生产数据库核验完成: - 目标库:`autobuy` - MySQL:8.4.8 - schema:已是 v5,应用时间 `2026-08-10T06:51:00.6763521Z` - v5 三列的类型、默认值、可空性和排序规则正确 - `chk_tasks_execution_mode`、`chk_tasks_live_confirmation` 均为强制启用 - `idx_tasks_claim_mode` 列顺序和降序方向正确 - 当前 2 条历史任务均为 `dry_run` - 非法 live 审计记录:0 由于只读预检时已确认 v5 被应用启动流程执行,本次没有重复执行 DDL,也没有修改任务数据。归档同步提交:`7bd75510b20b04f59688a855d6ab839cf084c53f`。
Author
Owner

按用户明确授权,已清空线上 MySQL 8 的 autobuy schema:删除库内全部 19 张表,保留 autobuy 数据库本身和账号权限;执行后复核剩余业务表数量为 0。执行前确认无其他活动连接。本次未创建包含业务数据或凭据的转储,因此原数据不可恢复。下一次启动当前 Admin 会从空库重建到最新 schema,并要求重新初始化管理员。

按用户明确授权,已清空线上 MySQL 8 的 `autobuy` schema:删除库内全部 19 张表,保留 `autobuy` 数据库本身和账号权限;执行后复核剩余业务表数量为 0。执行前确认无其他活动连接。本次未创建包含业务数据或凭据的转储,因此原数据不可恢复。下一次启动当前 Admin 会从空库重建到最新 schema,并要求重新初始化管理员。
Author
Owner

用户已明确验收通过。关闭本工单,并已同步更新父工单 #97、#96 的任务清单及“正常状态用户可创建 live”权限决策。

用户已明确验收通过。关闭本工单,并已同步更新父工单 #97、#96 的任务清单及“正常状态用户可创建 live”权限决策。
ila closed this issue 2026-08-10 15:45:07 +08:00
Author
Owner

用户已明确验收通过 #98。实现、验证、生产库结构核验和本地归档均已完成,现关闭工单并同步父工单 #96/#97。

用户已明确验收通过 #98。实现、验证、生产库结构核验和本地归档均已完成,现关闭工单并同步父工单 #96/#97。
Author
Owner

用户于 2026-08-10 调整后续业务策略:Admin 新建采购任务固定为 live,不再提供 dry_run/live 选择。后续由 #112 实施并保留本工单已建立的执行模式字段、审计和 Client 能力隔离;#98 的历史实现与验收记录不重写。价格确认区调整另见 #113。

用户于 2026-08-10 调整后续业务策略:Admin 新建采购任务固定为 live,不再提供 dry_run/live 选择。后续由 #112 实施并保留本工单已建立的执行模式字段、审计和 Client 能力隔离;#98 的历史实现与验收记录不重写。价格确认区调整另见 #113。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#98