移除 Client 真实采购手工授权并放开采购指派 #114

Closed
opened 2026-08-10 18:27:31 +08:00 by ila · 4 comments
Owner

1. 基本信息

  • 类型:需求变更
  • 父级大工单:#96
  • 所属 MVP/版本:#97
  • 阶段:真实采购任务创建与 Client 执行衔接
  • 状态:待验收

2. 要解决什么

当前 Admin 仍按 Client 上报的手工“真实采购已启用”状态限制采购任务创建,Client 设置页也要求操作员逐台授权真实采购。客户已确认系统以后只创建真实采购任务(下单至未付款,不自动付款),因此这套重复授权会阻断正常采购员选择客户端,也增加不必要的配置步骤。

目标:

  1. 彻底移除 Client 的真实采购手工启用请求、确认输入和启停操作;
  2. Admin 创建采购任务时,把当前账号可见的全部 Client 都作为可选客户端,不再因 purchase_mode 禁用;
  3. Client 在采购执行器可用且已配置 Android 设备时自动上报 purchase_mode=live,让运行时领取仍能识别客户端是否真正就绪;
  4. 保留真实下单的设备复核、价格保护、不可逆标记、单次提交、禁止付款以及不可逆后只核单等安全约束。

3. 做什么 / 不做什么

做什么

  • 修改根、Client、Admin 的 AGENTS.md,删除“真实下单默认关闭/需手工授权”的旧规则,明确系统固定创建未付款真实采购任务。
  • 删除 Client 设置页中的真实采购授权卡片、确认文字、启用/停用按钮及相关 worker/service 注入。
  • Client 根据采购适配器与已选设备是否就绪自动上报 purchase_mode;历史 purchase.live_* 本地设置停止读取,无需数据迁移。
  • Admin 采购确认弹窗允许选择当前账号可见的全部 Client;只有一个可见 Client 时自动选中。
  • Admin 创建任务时不再校验目标 Client 的 purchase_mode=live。
  • 领取接口继续用 purchase_mode 作为运行时就绪能力:新版且设备就绪的 Client 自动上报 live;未就绪或旧版 Client 不会误领真实任务,已指派任务保持等待。
  • 同步 Client/Admin 接口契约、上手与安全基线文档。
  • 补充或调整 Admin 与 Client 自动化测试。

不做什么

  • 不自动付款。
  • 不绕过拼多多验证码、风控或安全机制,不自动注册/登录。
  • 不移除价格、规格、数量、设备和客户端身份复核。
  • 不允许不可逆动作后重新下单。
  • 不迁移或删除历史任务数据。

4. 已确认的实现方案

Admin

  • PurchaseClientOptions 的可选数量按当前账号可见记录计算,不再按 live 能力计算。
  • 顺运宝采购确认弹窗删除“未启用真实采购”的禁用状态及说明,所有可见 Client 可选。
  • 创建采购任务的事务校验删除 ClientPurchaseMode 门槛;仍校验 Client 存在且对当前账号可见。
  • 任务仍以 execution_mode=live 保存。

Client

  • 删除手工授权领域服务及设置页入口。
  • 注册、刷新注册和领取任务时,若真实采购适配器存在、Client 身份有效且已选择 Android 设备,则自动声明 purchase_mode=live;否则声明 dry_run/不支持采购并等待就绪。
  • TaskDispatcher 和接口字段暂时保留 purchase_mode,用于运行时能力兼容与安全领取,不再代表用户手工授权。
  • 旧版本 Client 仍可注册,但不会领取真实任务;升级并完成设备配置后自动恢复领取。

预计修改文件

  • AGENTS.md
  • client/AGENTS.md
  • admin/AGENTS.md
  • client/src/settings_ui.py
  • client/src/settings_ui_event.py
  • client/src/live_purchase_authorization.py(删除或退役)
  • Client 相关注册/任务调度装配文件与测试
  • admin/service/service.go
  • admin/service/purchase_workflow.go
  • admin/templates/syb/list.html
  • Admin 相关测试
  • docs/client/04-admin-api-contract.md
  • docs/admin/04-client-api.md
  • 必要的上手/安全基线文档

5. 验收标准

  • 三份 AGENTS.md 不再要求真实采购默认关闭或 Client 手工授权,并继续明确禁止自动付款。
  • Client 设置页不再展示真实采购启用/停用入口,也不会发送手工启用请求。
  • Client 在采购执行器和设备就绪时自动上报 live;未就绪时不会领取真实采购任务。
  • Admin 采购弹窗中当前账号可见的所有 Client 均可选择,不再出现“未启用真实采购”。
  • 当前账号只有一个可见 Client 时自动选中。
  • Admin 可为任一当前账号可见 Client 创建未付款订单任务,不再按 Client live 状态拒绝。
  • 非当前账号可见的 Client 仍不能被越权指派。
  • 已指派给未就绪/旧版 Client 的任务保持等待,不会被其他 Client 误领,也不会触发演练下单。
  • 真实下单的末端复核、价格保护、不可逆标记、单击提交、禁止付款与不可逆后只核单均保持有效。
  • Client/Admin 接口契约一致,自动化测试通过。

6. 验证方式

从仓库根目录执行:

go test ./admin/...
python -m pytest client/test/test_settings_ui_event.py client/test/test_task_dispatcher.py client/test/test_purchase_task_service.py

补充人工验证:

  1. 用普通采购员登录 Admin,确认其可见的在线/离线 Client 都可在采购弹窗中选择并创建任务。
  2. Client 未选择设备时不领取真实任务;选择设备且采购执行器可用后无需手工授权即可领取。
  3. 真机执行只验证到生成未付款订单页面,不进行付款。

风险和回退

  • 风险:Admin 允许指派尚未就绪的 Client 后,任务可能保持等待;界面应清楚展示在线状态,但不能再用 live 授权禁用选择。
  • 风险:旧版 Client 不会自动上报 live,必须升级后才能领取真实任务。
  • 回退:恢复 Admin 创建期 capability 校验和 Client 授权入口;不修改已有任务和订单数据。
## 1. 基本信息 - 类型:需求变更 - 父级大工单:#96 - 所属 MVP/版本:#97 - 阶段:真实采购任务创建与 Client 执行衔接 - 状态:待验收 ## 2. 要解决什么 当前 Admin 仍按 Client 上报的手工“真实采购已启用”状态限制采购任务创建,Client 设置页也要求操作员逐台授权真实采购。客户已确认系统以后只创建真实采购任务(下单至未付款,不自动付款),因此这套重复授权会阻断正常采购员选择客户端,也增加不必要的配置步骤。 目标: 1. 彻底移除 Client 的真实采购手工启用请求、确认输入和启停操作; 2. Admin 创建采购任务时,把当前账号可见的全部 Client 都作为可选客户端,不再因 `purchase_mode` 禁用; 3. Client 在采购执行器可用且已配置 Android 设备时自动上报 `purchase_mode=live`,让运行时领取仍能识别客户端是否真正就绪; 4. 保留真实下单的设备复核、价格保护、不可逆标记、单次提交、禁止付款以及不可逆后只核单等安全约束。 ## 3. 做什么 / 不做什么 ### 做什么 - 修改根、Client、Admin 的 `AGENTS.md`,删除“真实下单默认关闭/需手工授权”的旧规则,明确系统固定创建未付款真实采购任务。 - 删除 Client 设置页中的真实采购授权卡片、确认文字、启用/停用按钮及相关 worker/service 注入。 - Client 根据采购适配器与已选设备是否就绪自动上报 `purchase_mode`;历史 `purchase.live_*` 本地设置停止读取,无需数据迁移。 - Admin 采购确认弹窗允许选择当前账号可见的全部 Client;只有一个可见 Client 时自动选中。 - Admin 创建任务时不再校验目标 Client 的 `purchase_mode=live`。 - 领取接口继续用 `purchase_mode` 作为运行时就绪能力:新版且设备就绪的 Client 自动上报 live;未就绪或旧版 Client 不会误领真实任务,已指派任务保持等待。 - 同步 Client/Admin 接口契约、上手与安全基线文档。 - 补充或调整 Admin 与 Client 自动化测试。 ### 不做什么 - 不自动付款。 - 不绕过拼多多验证码、风控或安全机制,不自动注册/登录。 - 不移除价格、规格、数量、设备和客户端身份复核。 - 不允许不可逆动作后重新下单。 - 不迁移或删除历史任务数据。 ## 4. 已确认的实现方案 ### Admin - `PurchaseClientOptions` 的可选数量按当前账号可见记录计算,不再按 live 能力计算。 - 顺运宝采购确认弹窗删除“未启用真实采购”的禁用状态及说明,所有可见 Client 可选。 - 创建采购任务的事务校验删除 `ClientPurchaseMode` 门槛;仍校验 Client 存在且对当前账号可见。 - 任务仍以 `execution_mode=live` 保存。 ### Client - 删除手工授权领域服务及设置页入口。 - 注册、刷新注册和领取任务时,若真实采购适配器存在、Client 身份有效且已选择 Android 设备,则自动声明 `purchase_mode=live`;否则声明 dry_run/不支持采购并等待就绪。 - `TaskDispatcher` 和接口字段暂时保留 `purchase_mode`,用于运行时能力兼容与安全领取,不再代表用户手工授权。 - 旧版本 Client 仍可注册,但不会领取真实任务;升级并完成设备配置后自动恢复领取。 ### 预计修改文件 - `AGENTS.md` - `client/AGENTS.md` - `admin/AGENTS.md` - `client/src/settings_ui.py` - `client/src/settings_ui_event.py` - `client/src/live_purchase_authorization.py`(删除或退役) - Client 相关注册/任务调度装配文件与测试 - `admin/service/service.go` - `admin/service/purchase_workflow.go` - `admin/templates/syb/list.html` - Admin 相关测试 - `docs/client/04-admin-api-contract.md` - `docs/admin/04-client-api.md` - 必要的上手/安全基线文档 ## 5. 验收标准 - [x] 三份 `AGENTS.md` 不再要求真实采购默认关闭或 Client 手工授权,并继续明确禁止自动付款。 - [x] Client 设置页不再展示真实采购启用/停用入口,也不会发送手工启用请求。 - [x] Client 在采购执行器和设备就绪时自动上报 live;未就绪时不会领取真实采购任务。 - [x] Admin 采购弹窗中当前账号可见的所有 Client 均可选择,不再出现“未启用真实采购”。 - [x] 当前账号只有一个可见 Client 时自动选中。 - [x] Admin 可为任一当前账号可见 Client 创建未付款订单任务,不再按 Client live 状态拒绝。 - [x] 非当前账号可见的 Client 仍不能被越权指派。 - [x] 已指派给未就绪/旧版 Client 的任务保持等待,不会被其他 Client 误领,也不会触发演练下单。 - [x] 真实下单的末端复核、价格保护、不可逆标记、单击提交、禁止付款与不可逆后只核单均保持有效。 - [x] Client/Admin 接口契约一致,自动化测试通过。 ## 6. 验证方式 从仓库根目录执行: ```powershell go test ./admin/... python -m pytest client/test/test_settings_ui_event.py client/test/test_task_dispatcher.py client/test/test_purchase_task_service.py ``` 补充人工验证: 1. 用普通采购员登录 Admin,确认其可见的在线/离线 Client 都可在采购弹窗中选择并创建任务。 2. Client 未选择设备时不领取真实任务;选择设备且采购执行器可用后无需手工授权即可领取。 3. 真机执行只验证到生成未付款订单页面,不进行付款。 ## 风险和回退 - 风险:Admin 允许指派尚未就绪的 Client 后,任务可能保持等待;界面应清楚展示在线状态,但不能再用 live 授权禁用选择。 - 风险:旧版 Client 不会自动上报 live,必须升级后才能领取真实任务。 - 回退:恢复 Admin 创建期 capability 校验和 Client 授权入口;不修改已有任务和订单数据。
Author
Owner

实施进度:

  • 已修改根、Client、Admin 三份 AGENTS.md:删除 Client 手工 live 授权要求,明确 Admin 对当前账号可见 Client 全部可指派。
  • 已删除 Client 设置页真实采购授权卡片、确认文字、启停 worker/service 及对应旧测试。
  • Client 保存身份/设备登记和领取任务时,按“已选设备 + 真实采购 Adapter 就绪”自动上报 live;未就绪仍为 dry_run,领取期不会误领。
  • Admin 采购弹窗不再按 purchase_mode 禁用候选,显示在线状态;服务端创建事务只复核当前账号可见范围,不再检查 live 能力。
  • 已同步 Client/Admin 接口契约、需求、架构、数据、UI 与安全基线。
  • 保留价格/规格/数量最终复核、不可逆标记、单次提交、禁止付款和不可逆后只核单。

验证:

Client: 330 passed
Admin: go test ./... -count=1 全部通过
git diff --check: 通过

自动测试未连接 Android 手机、未创建真实订单。

实施进度: - 已修改根、Client、Admin 三份 AGENTS.md:删除 Client 手工 live 授权要求,明确 Admin 对当前账号可见 Client 全部可指派。 - 已删除 Client 设置页真实采购授权卡片、确认文字、启停 worker/service 及对应旧测试。 - Client 保存身份/设备登记和领取任务时,按“已选设备 + 真实采购 Adapter 就绪”自动上报 live;未就绪仍为 dry_run,领取期不会误领。 - Admin 采购弹窗不再按 purchase_mode 禁用候选,显示在线状态;服务端创建事务只复核当前账号可见范围,不再检查 live 能力。 - 已同步 Client/Admin 接口契约、需求、架构、数据、UI 与安全基线。 - 保留价格/规格/数量最终复核、不可逆标记、单次提交、禁止付款和不可逆后只核单。 验证: ```text Client: 330 passed Admin: go test ./... -count=1 全部通过 git diff --check: 通过 ``` 自动测试未连接 Android 手机、未创建真实订单。
Author
Owner

实现与归档已提交,工单进入待验收:

  • 实现提交:10bb892 — 移除 Client 手工授权、自动声明运行就绪能力、Admin 放开全部可见 Client 指派。
  • 归档提交:6530b11
  • 归档:docs/task/114-移除Client真实采购手工授权.md

最终验证:Client 330 项通过;Admin go test ./...、go vet ./...、go build ./... 通过。未做浏览器人工点击和 Android 真机下单,自动测试未创建真实订单。

并行工作区中的 PDD 采集/适配器、UI、启动脚本等改动均未包含在 #114 的两个提交中。

实现与归档已提交,工单进入待验收: - 实现提交:`10bb892` — 移除 Client 手工授权、自动声明运行就绪能力、Admin 放开全部可见 Client 指派。 - 归档提交:`6530b11` - 归档:`docs/task/114-移除Client真实采购手工授权.md` 最终验证:Client 330 项通过;Admin `go test ./...`、`go vet ./...`、`go build ./...` 通过。未做浏览器人工点击和 Android 真机下单,自动测试未创建真实订单。 并行工作区中的 PDD 采集/适配器、UI、启动脚本等改动均未包含在 #114 的两个提交中。
Author
Owner

#116 把“Client 设置页不得再出现真实下单(不支付)手工授权组件组”加入 UI 回归验收;不会恢复 #114 已删除的授权服务或控件。

#116 把“Client 设置页不得再出现真实下单(不支付)手工授权组件组”加入 UI 回归验收;不会恢复 #114 已删除的授权服务或控件。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:30 +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#114