Admin:采购任务固定真实下单并简化创建弹窗 #112

Closed
opened 2026-08-10 17:44:23 +08:00 by ila · 8 comments
Owner

基本信息

  • 类型:需求变更
  • 父级大工单:#96
  • 所属 MVP / 版本:#97
  • 阶段:阶段 1 补充——真实采购任务创建弹窗
  • 前置:#98
  • 关联:#99、#100、#101、#113

要解决什么

Admin 新建采购任务已经固定为真实下单(只创建未付款订单),但当前弹窗仍重复要求采购员勾选风险确认并输入“创建未付款订单”,操作过重。客户端候选又被限制为“当前在线且声明 live”,导致已绑定但暂时离线的 live Client 不能提前接收任务;不具备 live 能力的 Client 被完全隐藏,采购员也看不出为什么不能选择。

本次按用户 2026-08-10 的最新确认,删除 Admin 创建弹窗的重复真实下单安全确认。提交创建表单本身即表示创建真实采购任务;Client 侧的一次性 live 授权、设备绑定、最终规格/数量/价格复核、不可逆标记、单次提交和禁止付款继续保留。

做什么 / 不做什么

做

  • 更新根 AGENTS.md、#96、#97 和直接冲突的长期基线:
    • Admin 新建采购任务固定为 execution_mode=live;
    • Admin 弹窗不再要求额外复选框、确认短语或浏览器二次确认;
    • 只能把任务分配给已授权并声明 live 能力的 Client;
    • Client 设备绑定、最终复核、不可逆标记和单次提交门禁保持不变。
  • 删除顺运宝采购弹窗中的“真实下单安全确认”、风险复选框和确认短语输入框。
  • 删除表单提交前的重复浏览器 confirm;保留明确的“创建真实采购任务”按钮、CSRF 和提交中禁用反馈。
  • Web handler 固定构造 execution_mode=live,不信任浏览器提交的执行模式。
  • 服务端取消对 live_acknowledged、live_confirmation 的必填校验;登录用户提交成功时仍记录创建人和创建时间审计。
  • 客户端下拉框显示当前账号可见的采购 Client:
    • 声明 live 的 Client 可选择,暂时离线也允许指派,等待其上线领取;
    • 未声明 live 的 Client 显示为禁用项,并给出“未启用真实采购”原因;
    • 唯一可选 Client 自动选中;
    • 服务端创建事务仍复核用户可见范围和 live 能力,但不因暂时离线拒绝指派。
  • 无可选 live Client 时禁用提交,并提示在 Client 设置页完成真实采购授权和重新登记。
  • 历史 dry_run 任务和数据库/API 的 execution_mode 字段继续兼容。

不做

  • 不取消 Client 侧一次性 live 授权、Client ID/Android 设备绑定、最终页面复核、价格保护、不可逆标记和单次提交。
  • 不允许未声明 live 的 Client 实际接收或领取 live 任务。
  • 不自动付款,不增加付款接口或付款控件定位。
  • 不绕过验证码、登录、风控或平台安全机制。
  • 不改变不可逆阶段后只核单、绝不重新下单的规则。
  • 不修改已发布的数据库 migration。
  • 不在本工单处理规格行错误显示;该缺陷由 #113 修复。

已确认的实现方案

  1. 规则和基线
    • 修改根 AGENTS.md 第 2 条:删除 Admin 创建时必须重复风险确认的要求,保留 Client live 授权和其余安全门禁。
    • 同步 #96、#97 以及 Admin/Client 直接冲突的需求、界面和安全文档。
  2. 弹窗
    • 从 admin/templates/syb/list.html 删除确认区和 data-confirm-submit。
    • 从 admin/static/js/app.js 删除复选框/确认短语重置逻辑,仅保留选择行、提交禁用和“创建中…”反馈。
  3. 服务端
    • Web 创建入口固定 live。
    • CreatePurchaseTasksWithOptions 不再要求 Admin 复选和短语;使用登录用户与当前时间填写 live 创建审计。
    • 保留权限、Client live 能力、CSRF、规格映射、数量和价格校验。
  4. 客户端候选
    • 查询当前账号可见 Client,不再按瞬时在线状态删除 live 候选。
    • 模板将 live 候选设为可选、非 live 候选设为禁用,并在只有一个可选项时默认选中。
    • 创建事务复核可见范围和 live 能力;离线只影响领取时间,不阻止任务提前指派。
  5. 兼容与测试
    • 历史 dry_run 和 API 字段保持不变。
    • 自动测试不连接手机、不产生真实订单。

预计修改文件:

  • AGENTS.md
  • admin/templates/syb/list.html
  • admin/static/js/app.js
  • admin/handler/web/others.go
  • admin/service/service.go
  • admin/service/purchase_workflow.go
  • 对应 Admin handler/service/template 测试
  • docs/admin/01-requirements.md
  • docs/admin/05-ui-specification.md
  • docs/admin/06-quality-security.md
  • 必要的 Client 基线文档

验收标准

  • 根规则、#96、#97 和长期基线已同步最新决定。
  • 弹窗没有执行模式、风险复选框、确认短语和重复浏览器确认。
  • 主按钮明确表示创建真实采购任务,提交后立即禁用并显示“创建中…”。
  • 服务端始终创建 execution_mode=live,篡改模式字段不能创建 dry_run。
  • 服务端不再要求 live_acknowledged 或 live_confirmation。
  • 当前账号可见且声明 live 的 Client 可选择;暂时离线也允许指派。
  • 非 live Client 显示但禁用,并说明需要先在 Client 启用真实采购。
  • 只有一个可用 Client 时自动选中;没有可用 Client 时不能提交且提示清楚。
  • 创建事务仍复核 Client 可见范围与 live 能力。
  • 创建人、创建时间、指定 Client 和 live 模式审计完整。
  • Client 设备绑定、最终复核、不可逆标记、单击一次、禁止付款和不可逆后只核单没有削弱。
  • CSRF、用户状态、规格、数量和价格校验保持有效。
  • 历史 dry_run 任务及 API 兼容不变。
  • Go 1.23.0 专项和全量测试通过。
  • 自动验证未连接 Android 手机、未创建真实订单。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go vet ./...
go build ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN

浏览器验证:

  1. 打开采购弹窗,确认不存在模式选择、安全确认区、确认短语和二次 confirm。
  2. 准备在线 live、离线 live、在线 dry_run 三个当前用户可见 Client;确认前两个可选,dry_run 显示但禁用。
  3. 只有一个 live 候选时确认自动选中。
  4. 篡改 Client ID、执行模式或确认字段,确认服务端仍只允许可见 live Client ���固定创建 live。
  5. 不连接 Android 手机,不执行真实下单。

风险和回退

  • 风险:删除 Admin 重复确认会降低误点防护;允许离线指派后任务可能长时间等待;候选能力显示错误可能让任务无法领取。
  • 控制:按钮明确写“创建真实采购任务”,保留登录权限、CSRF、Client 一次性 live 授权、设备绑定、服务端 live 复核、价格保护、不可逆先落库、单次提交和禁止付款。
  • 回退:可回退本工单的弹窗、候选与服务校验代码,不改写历史任务;已经进入不可逆阶段的任务只能核单,绝不重新下单。
## 基本信息 - 类型:需求变更 - 父级大工单:#96 - 所属 MVP / 版本:#97 - 阶段:阶段 1 补充——真实采购任务创建弹窗 - 前置:#98 - 关联:#99、#100、#101、#113 ## 要解决什么 Admin 新建采购任务已经固定为真实下单(只创建未付款订单),但当前弹窗仍重复要求采购员勾选风险确认并输入“创建未付款订单”,操作过重。客户端候选又被限制为“当前在线且声明 live”,导致已绑定但暂时离线的 live Client 不能提前接收任务;不具备 live 能力的 Client 被完全隐藏,采购员也看不出为什么不能选择。 本次按用户 2026-08-10 的最新确认,删除 Admin 创建弹窗的重复真实下单安全确认。提交创建表单本身即表示创建真实采购任务;Client 侧的一次性 live 授权、设备绑定、最终规格/数量/价格复核、不可逆标记、单次提交和禁止付款继续保留。 ## 做什么 / 不做什么 ### 做 - 更新根 `AGENTS.md`、#96、#97 和直接冲突的长期基线: - Admin 新建采购任务固定为 `execution_mode=live`; - Admin 弹窗不再要求额外复选框、确认短语或浏览器二次确认; - 只能把任务分配给已授权并声明 live 能力的 Client; - Client 设备绑定、最终复核、不可逆标记和单次提交门禁保持不变。 - 删除顺运宝采购弹窗中的“真实下单安全确认”、风险复选框和确认短语输入框。 - 删除表单提交前的重复浏览器 `confirm`;保留明确的“创建真实采购任务”按钮、CSRF 和提交中禁用反馈。 - Web handler 固定构造 `execution_mode=live`,不信任浏览器提交的执行模式。 - 服务端取消对 `live_acknowledged`、`live_confirmation` 的必填校验;登录用户提交成功时仍记录创建人和创建时间审计。 - 客户端下拉框显示当前账号可见的采购 Client: - 声明 live 的 Client 可选择,暂时离线也允许指派,等待其上线领取; - 未声明 live 的 Client 显示为禁用项,并给出“未启用真实采购”原因; - 唯一可选 Client 自动选中; - 服务端创建事务仍复核用户可见范围和 live 能力,但不因暂时离线拒绝指派。 - 无可选 live Client 时禁用提交,并提示在 Client 设置页完成真实采购授权和重新登记。 - 历史 dry_run 任务和数据库/API 的 `execution_mode` 字段继续兼容。 ### 不做 - 不取消 Client 侧一次性 live 授权、Client ID/Android 设备绑定、最终页面复核、价格保护、不可逆标记和单次提交。 - 不允许未声明 live 的 Client 实际接收或领取 live 任务。 - 不自动付款,不增加付款接口或付款控件定位。 - 不绕过验证码、登录、风控或平台安全机制。 - 不改变不可逆阶段后只核单、绝不重新下单的规则。 - 不修改已发布的数据库 migration。 - 不在本工单处理规格行错误显示;该缺陷由 #113 修复。 ## 已确认的实现方案 1. **规则和基线** - 修改根 `AGENTS.md` 第 2 条:删除 Admin 创建时必须重复风险确认的要求,保留 Client live 授权和其余安全门禁。 - 同步 #96、#97 以及 Admin/Client 直接冲突的需求、界面和安全文档。 2. **弹窗** - 从 `admin/templates/syb/list.html` 删除确认区和 `data-confirm-submit`。 - 从 `admin/static/js/app.js` 删除复选框/确认短语重置逻辑,仅保留选择行、提交禁用和“创建中…”反馈。 3. **服务端** - Web 创建入口固定 live。 - `CreatePurchaseTasksWithOptions` 不再要求 Admin 复选和短语;使用登录用户与当前时间填写 live 创建审计。 - 保留权限、Client live 能力、CSRF、规格映射、数量和价格校验。 4. **客户端候选** - 查询当前账号可见 Client,不再按瞬时在线状态删除 live 候选。 - 模板将 live 候选设为可选、非 live 候选设为禁用,并在只有一个可选项时默认选中。 - 创建事务复核可见范围和 live 能力;离线只影响领取时间,不阻止任务提前指派。 5. **兼容与测试** - 历史 dry_run 和 API 字段保持不变。 - 自动测试不连接手机、不产生真实订单。 预计修改文件: - `AGENTS.md` - `admin/templates/syb/list.html` - `admin/static/js/app.js` - `admin/handler/web/others.go` - `admin/service/service.go` - `admin/service/purchase_workflow.go` - 对应 Admin handler/service/template 测试 - `docs/admin/01-requirements.md` - `docs/admin/05-ui-specification.md` - `docs/admin/06-quality-security.md` - 必要的 Client 基线文档 ## 验收标准 - [x] 根规则、#96、#97 和长期基线已同步最新决定。 - [x] 弹窗没有执行模式、风险复选框、确认短语和重复浏览器确认。 - [x] 主按钮明确表示创建真实采购任务,提交后立即禁用并显示“创建中…”。 - [x] 服务端始终创建 `execution_mode=live`,篡改模式字段不能创建 dry_run。 - [x] 服务端不再要求 `live_acknowledged` 或 `live_confirmation`。 - [x] 当前账号可见且声明 live 的 Client 可选择;暂时离线也允许指派。 - [x] 非 live Client 显示但禁用,并说明需要先在 Client 启用真实采购。 - [x] 只有一个可用 Client 时自动选中;没有可用 Client 时不能提交且提示清楚。 - [x] 创建事务仍复核 Client 可见范围与 live 能力。 - [x] 创建人、创建时间、指定 Client 和 live 模式审计完整。 - [x] Client 设备绑定、最终复核、不可逆标记、单击一次、禁止付款和不可逆后只核单没有削弱。 - [x] CSRF、用户状态、规格、数量和价格校验保持有效。 - [x] 历史 dry_run 任务及 API 兼容不变。 - [x] Go 1.23.0 专项和全量测试通过。 - [x] 自动验证未连接 Android 手机、未创建真实订单。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go vet ./... go build ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` 浏览器验证: 1. 打开采购弹窗,确认不存在模式选择、安全确认区、确认短语和二次 confirm。 2. 准备在线 live、离线 live、在线 dry_run 三个当前用户可见 Client;确认前两个可选,dry_run 显示但禁用。 3. 只有一个 live 候选时确认自动选中。 4. 篡改 Client ID、执行模式或确认字段,确认服务端仍只允许可见 live Client ���固定创建 live。 5. 不连接 Android 手机,不执行真实下单。 ## 风险和回退 - 风险:删除 Admin 重复确认会降低误点防护;允许离线指派后任务可能长时间等待;候选能力显示错误可能让任务无法领取。 - 控制:按钮明确写“创建真实采购任务”,保留登录权限、CSRF、Client 一次性 live 授权、设备绑定、服务端 live 复核、价格保护、不可逆先落库、单次提交和禁止付款。 - 回退:可回退本工单的弹窗、候选与服务校验代码,不改写历史任务;已经进入不可逆阶段的任务只能核单,绝不重新下单。
Author
Owner

状态:待实施。用户已明确授权修改项目“采购任务默认 dry_run”的硬性决策。实施时先更新 AGENTS.md 与 #96/#97/长期基线,再改 Admin;真实下单确认、Client live 能力、设备绑定、价格保护、不可逆标记、单击一次、禁止付款和不可逆后只核单仍是硬门禁。本轮仅建单与更新父工单,未修改代码、未提交 Git。

状态:**待实施**。用户已明确授权修改项目“采购任务默认 dry_run”的硬性决策。实施时先更新 `AGENTS.md` 与 #96/#97/长期基线,再改 Admin;真实下单确认、Client live 能力、设备绑定、价格保护、不可逆标记、单击一次、禁止付款和不可逆后只核单仍是硬门禁。本轮仅建单与更新父工单,未修改代码、未提交 Git。
Author
Owner

开始实施 #112。将先修改项目规则与 Admin 创建链,严格保留 live 确认、Client 能力/在线/可见范围校验、历史 dry_run 兼容、禁止付款和不可逆后只核单。工作区存在用户已有的 Client/UI、脚本和图片改动,本工单不会覆盖或提交这些无关文件。

开始实施 #112。将先修改项目规则与 Admin 创建链,严格保留 live 确认、Client 能力/在线/可见范围校验、历史 dry_run 兼容、禁止付款和不可逆后只核单。工作区存在用户已有的 Client/UI、脚本和图片改动,本工单不会覆盖或提交这些无关文件。
Author
Owner

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

  • 实现提交:e1b32ea024f6c5b69a76efb827f90abf88ba4682
  • 归档提交:b509b15f23fe23cc7945611df02f086f5a30515e
  • 本地归档:docs/task/112-采购任务固定真实下单.md
  • 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 全部通过
  • 安全边界:保留风险确认、live/在线/可见范围复核、Client 设备授权、价格保护、不可逆标记、单击一次、禁止付款和不可逆后只核单
  • 未验证:未连接 Android 真机、未创建真实未付款订单;未做浏览器人工点击,模板由页面测试覆盖。
实现完成,状态:**待用户验收**。 - 实现提交:`e1b32ea024f6c5b69a76efb827f90abf88ba4682` - 归档提交:`b509b15f23fe23cc7945611df02f086f5a30515e` - 本地归档:`docs/task/112-采购任务固定真实下单.md` - 验证:Go 1.23.0 下 `go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过 - 安全边界:保留风险确认、live/在线/可见范围复核、Client 设备授权、价格保护、不可逆标记、单击一次、禁止付款和不可逆后只核单 - 未验证:未连接 Android 真机、未创建真实未付款订单;未做浏览器人工点击,模板由页面测试覆盖。
Author
Owner

状态退回:待实施。用户复验后确认删除 Admin 重复的“真实下单安全确认”、风险复选框、确认短语和浏览器二次确认;同时调整 Client 候选为:当前用户可见的 live Client 均可指派(离线可等待上线),非 live Client 显示但禁用,唯一候选自动选中。Client 一次性 live 授权、设备绑定、价格保护、不可逆标记、单次提交和禁止付款保持不变。原实现与归档只代表上一版方案,后续实现和重新验收以更新后的工单正文为准。本轮仅更新工单,未修改代码。

状态退回:**待实施**。用户复验后确认删除 Admin 重复的“真实下单安全确认”、风险复选框、确认短语和浏览器二次确认;同时调整 Client 候选为:当前用户可见的 live Client 均可指派(离线可等待上线),非 live Client 显示但禁用,唯一候选自动选中。Client 一次性 live 授权、设备绑定、价格保护、不可逆标记、单次提交和禁止付款保持不变。原实现与归档只代表上一版方案,后续实现和重新验收以更新后的工单正文为准。本轮仅更新工单,未修改代码。
Author
Owner

开始按修订后的范围重新实施 #112:删除 Admin 重复风险复选/确认短语/浏览器确认;候选改为当前用户可见的 live Client(离线可提前指派),非 live 显示但禁用,唯一 live 候选自动选中;保留 Client 一次性 live 授权和服务端能力复核。工作区现有 Client/UI、脚本与图片改动不纳入本工单。

开始按修订后的范围重新实施 #112:删除 Admin 重复风险复选/确认短语/浏览器确认;候选改为当前用户可见的 live Client(离线可提前指派),非 live 显示但禁用,唯一 live 候选自动选中;保留 Client 一次性 live 授权和服务端能力复核。工作区现有 Client/UI、脚本与图片改动不纳入本工单。
Author
Owner

修订范围实现完成,状态:待用户验收。

  • 实现提交:a262190
  • 归档提交:c84d2bd
  • 结果:删除 Admin 风险复选/确认短语/二次 confirm;live Client 在线或离线均可指派,非 live 显示禁用原因,唯一 live 候选自动选中;服务端仍固定 live 并复核 Client 能力
  • 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 全部通过
  • 未验证:未做浏览器人工点击,未连接 Android,未创建真实订单。
修订范围实现完成,状态:**待用户验收**。 - 实现提交:`a262190` - 归档提交:`c84d2bd` - 结果:删除 Admin 风险复选/确认短语/二次 confirm;live Client 在线或离线均可指派,非 live 显示禁用原因,唯一 live 候选自动选中;服务端仍固定 live 并复核 Client 能力 - 验证:Go 1.23.0 下 `go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过 - 未验证:未做浏览器人工点击,未连接 Android,未创建真实订单。
Author
Owner

客户最新决定由 #114 接续:取消 Client 手工真实采购授权,Admin 当前账号可见的全部 Client 均可指派。#112 已实现的“非 live 禁用/创建期 live 校验”将由 #114 替换;固定 live、权限/CSRF、审计、价格保护和不可逆安全门禁继续保留。

客户最新决定由 #114 接续:取消 Client 手工真实采购授权,Admin 当前账号可见的全部 Client 均可指派。#112 已实现的“非 live 禁用/创建期 live 校验”将由 #114 替换;固定 live、权限/CSRF、审计、价格保护和不可逆安全门禁继续保留。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:25:00 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#112