diff --git a/docs/task/114-移除Client真实采购手工授权.md b/docs/task/114-移除Client真实采购手工授权.md new file mode 100644 index 0000000..c6e3ff1 --- /dev/null +++ b/docs/task/114-移除Client真实采购手工授权.md @@ -0,0 +1,66 @@ +# 114 移除 Client 真实采购手工授权并放开采购指派 + +- 类型:需求变更 +- 父级大工单:#96 +- 所属 MVP / 版本:#97 +- 状态:已完成 +- 日期:2026-08-10 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/114 + +## 背景与目标 + +Admin 已固定创建真实采购任务,但创建时仍按 Client 的手工 live 授权状态禁用候选,Client 设置页也要求逐台输入确认文字启用。这套重复授权会阻止采购员把任务提前指派给当前账号可见但尚未就绪的 Client。 + +本次删除 Client 手工真实采购授权,并让 Admin 把当前账号可见的全部 Client 作为可指派候选。禁止付款、最终复核、不可逆标记、单次提交和不可逆后只核单等执行安全边界保持不变。 + +## 最终方案 + +- Admin 创建期只校验 Client 存在且在当前账号可见范围内,不再校验最后登记的 `purchase_mode`。 +- 采购弹窗中的全部可见 Client 均可选择,选项展示在线状态;只有一个候选时自动选中,没有可见 Client 时禁用提交。 +- Client 删除真实采购授权卡片、确认输入、启停 worker、授权服务和历史授权测试。 +- Client 保存身份、保存或删除设备后自动刷新 Admin 登记;领取时根据“已保存 Android 设备 + 真实采购 Adapter”自动声明 `purchase_mode=live`,未就绪时声明 `dry_run`。 +- `purchase_mode` 字段继续保留为领取期运行就绪能力。尚未就绪或旧版 Client 可以被提前指派,但任务保持等待,直到指定 Client 就绪后领取。 +- 历史 `purchase.live_*` 设置不迁移、不删除,当前版本停止读取和写入。 + +与建单方案相比,运行就绪判断使用“已保存设备”而不是设置页表格当前勾选行。这样离线设备配置不会因为页面搜索暂时没有结果而被清除能力;实际执行前仍由设备连接检查阻止离线设备操作。 + +## 改了哪些 + +- `AGENTS.md`、`client/AGENTS.md`、`admin/AGENTS.md`:更新固定真实采购和可见 Client 指派红线。 +- `client/src/settings_ui.py`、`client/src/settings_ui_event.py`:删除手工授权界面和事件,设备变化后自动刷新登记。 +- `client/src/pdd_ui_event.py`、`client/src/task_dispatcher.py`:按运行时设备和 Adapter 自动声明 live,并更新未就绪错误。 +- `client/src/live_purchase_authorization.py`:删除已废弃的手工授权服务。 +- `admin/service/service.go`、`admin/service/purchase_workflow.go`:全部可见 Client 计为可选,创建期删除 live 能力校验。 +- `admin/templates/syb/list.html`、`admin/handler/web/others.go`:候选不再禁用,显示在线状态和等待提示。 +- Client/Admin 对应测试:覆盖自动 live、无手工入口、全部可见候选和 dry_run 历史状态仍可创建 live 任务。 +- `docs/client/`、`docs/admin/`:同步需求、架构、数据模型、接口契约、界面和安全基线。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 三份 AGENTS.md 删除手工授权要求并保留禁止付款 | 通过 | +| Client 不再显示或发送真实采购手工启用请求 | 通过 | +| 设备和采购执行器就绪时自动声明 live,未就绪时不领取 | 通过 | +| Admin 当前账号可见的全部 Client 均可选择 | 通过 | +| 单一可见 Client 自动选中,无可见 Client 禁用提交 | 通过 | +| 创建任务不再按 Client live 状态拒绝 | 通过 | +| 非当前账号可见 Client 仍不能越权指派 | 通过 | +| 未就绪 Client 的指定任务保持等待且不会降级执行 | 通过 | +| 禁止付款、最终复核、不可逆和单次提交门禁未削弱 | 通过 | +| Client/Admin 接口契约和长期基线一致 | 通过 | + +## 测试 + +- 执行的命令: + - `C:/Python310/python.exe -m pytest test -q --disable-warnings`(从 `client/` 执行,设置 `QT_QPA_PLATFORM=offscreen`) + - `go test ./... -count=1`(从 `admin/` 执行,`GOTOOLCHAIN=go1.23.0`) + - `go vet ./...`(从 `admin/` 执行,`GOTOOLCHAIN=go1.23.0`) + - `go build ./...`(从 `admin/` 执行,`GOTOOLCHAIN=go1.23.0`) + - `git diff --check` +- 结果:Client 330 项通过;Admin 全量测试、vet、build 和差异检查通过。 +- **没验证到的部分**:未连接真实 Android 手机,未执行真实下单,未在浏览器中人工点击采购弹窗;自动测试没有创建真实订单。 + +## 相关提交 + +- `10bb892` 移除 Client 真实采购手工授权并放开采购指派