diff --git a/docs/task/112-采购任务固定真实下单.md b/docs/task/112-采购任务固定真实下单.md new file mode 100644 index 0000000..0a8e04b --- /dev/null +++ b/docs/task/112-采购任务固定真实下单.md @@ -0,0 +1,60 @@ +# 112 Admin:采购任务固定真实下单并简化创建弹窗 + +- 类型:需求 +- 父级大工单:#96 +- 所属 MVP / 版本:#97 +- 状态:已完成 +- 日期:2026-08-10 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/112 + +## 背景与目标 + +客户确认后续 Admin 新建采购任务固定为真实下单(只创建未付款订单),不再让采购员选择演练模式。同时必须保留操作确认、Client live 能力、在线状态、设备绑定、价格保护、不可逆标记、单次提交、禁止付款和不可逆后只核单等安全门禁。 + +## 最终方案 + +- 修改根规则和 Admin/Client 基线:Admin 新建采购任务固定为 live,历史 dry_run 和接口缺省兼容值继续保留。 +- 顺运宝采购弹窗删除执行模式单选,真实下单风险说明、复选框和确认短语始终显示。 +- Web handler 不读取浏览器提交的 execution_mode,固定向服务层传入 live;篡改为 dry_run 也不能改变结果。 +- 页面只列出当前用户可见、在线且声明 live 能力的 Client,选项只显示名称和 Client ID。 +- 创建事务再次检查 Client 在线时间、可见范围和 live 能力,避免页面打开后状态变化造成误分配。 +- 提交按钮明确为“确认创建真实采购任务”,提交后禁用并显示“创建中…”。 +- 没有改写已发布的 v5 migration,也没有修改历史任务。 + +## 改了哪些 + +- `AGENTS.md`、`client/AGENTS.md`:调整默认采购策略并保留 Client 本地安全授权。 +- `admin/handler/web/others.go`:固定 live,传递在线截止时间。 +- `admin/repository/client.go`:增加事务内在线状态查询。 +- `admin/service/service.go`、`purchase_workflow.go`:筛选 live 在线候选并在创建时复核。 +- `admin/templates/syb/list.html`、`admin/static/js/app.js`:简化弹窗、保留确认和提交反馈。 +- Admin 测试:覆盖候选过滤、离线拒绝、表单篡改和模板文案。 +- `docs/admin/`、`docs/client/`:同步需求、界面、架构、安全和接口契约。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 项目规则明确 Admin 新采购任务固定 live | 通过 | +| 弹窗不再显示执行模式,风险确认始终显示 | 通过 | +| 服务端忽略被篡改的 dry_run 字段 | 通过 | +| 只列出可见、在线且声明 live 的 Client | 通过 | +| 创建事务再次复核在线与 live 能力 | 通过 | +| 历史 dry_run、execution_mode 字段和 API 兼容保留 | 通过 | +| 不付款、不绕过安全机制、不可逆后不重下单 | 通过 | +| Go 1.23.0 全量验证 | 通过 | + +## 测试 + +- 执行的命令: + - `GOTOOLCHAIN=go1.23.0 go test ./service ./handler/web ./repository -count=1` + - `GOTOOLCHAIN=go1.23.0 go vet ./...` + - `GOTOOLCHAIN=go1.23.0 go build ./...` + - `GOTOOLCHAIN=go1.23.0 go test ./... -count=1` + - `git diff --check` +- 结果:Admin 全部包测试、构建、vet 和格式检查通过。 +- **没验证到的部分**:未连接 Android 真机,未创建真实未付款订单;真机 live 由 #101 单独验收。未在浏览器中人工点击弹窗,模板结构和文案由 Go 页面测试覆盖。 + +## 相关提交 + +- `e1b32ea024f6c5b69a76efb827f90abf88ba4682` feat: 固定创建真实采购任务 (#112)