Page:
Task 34 purchase task state machine
Pages
Android-Agent-API-Contract
Architecture-and-Code-Map
Business-Rules-and-Glossary
Common-Changes
Delivery-Issues
Deployment-Template
Deployment-and-Operations
Development-Workflow
Home
Local-Development-and-Verification
OnePlus-Real-Device-Acceptance
PDD-Detail-Rule-Migration-Analysis
Product-Requirements-Overview
Project-Profile
SYB-ERP-Interface-Contract
Task 26 PDD spec traversal
Task 31 PDD product archive
Task 32 procurement closed loop prototype
Task 33 purchase task contract
Task 34 purchase task state machine
Task-35-Admin-采购任务与人工处理页面
Task-36-Android地址后缀不可逆门禁与创建订单
Task 40 Shopee product archive
Task 41 SYB product import
Task-42-Android-采购演练规则与持久执行基线
Task-43-升级-DevHarness-文档基线
Task-43-升级-GoAuto-DevHarness-文档基线
Task-44-Admin-SYB商品列表规格匹配入口与批量采购创建
Task-47-升级-DevHarness-文档基线至-bfdf648
Task-49-店铺管理与-SYB-同步店铺过滤
Task 50 SYB async sync
Task 51 SYB list layout
Task 52 SYB sync diagnostics
Task-53-补齐采购规则参数化动作契约
Task-54-统一采集与采购任务设备状态
Task-55-补齐采购任务-Admin-列表与详情查询接口
Task-56-采购-Admin-接口成功响应兼容
Task-57-优化采购管理筛选栏布局
Task-58-采购管理失败任务批量重试
Task-59-修复-PDD-规格入口误触商品评论页
Task-60-修复可选颜色切换后价格缺失
Task-61-修复采购规格探测未识别安全入口
Task-62-采购规格标准化匹配与-AI-Provider-设置
Task-63-采购列表刷新不得触发-AI-规格匹配
Task-64-修复正式采购规格滚动定位与重复探测卡死
Task 65 purchase address panel recovery
Task 66 Android payment chooser reconciliation
Task-67-SYB-与采购任务蝦皮订单号
Task-68-调整-SYB-商品页顶部工具栏与采购入口
Task-69-蝦皮与-PDD-规格匹配.-
Task-70-从-cmautobuy-线上库导入-PDD-与蝦皮商品
Task-71-Supervisor-GoAuto-services
Task-72-Fix-Supervisor-SYB-startup-race
Task-73-优化-SYB-商品列表加载与采购准备预检
Task-74-优化-SYB-商品筛选与列表列宽
Task-75-SYB-Hourly-Sync
Task-78-在-SYB-同步记录页增加管理员立即同步
Task-79-SYB-只读分页请求超时后有限重试
Task-81-修复-SYB-查看-PDD-商品跳转
Task-82-区分去关联-PDD-与去匹配动作
Task-83-PDD-商品单商品定位模式
Task-85-修复采购员账号登录并补齐最小权限
Task-Archive-Template
Troubleshooting
Clone
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
34 服务端采购任务、租约、幂等与状态机
- 类型:需求
- 所属总体设计:#32
- 所属 MVP / 版本:采购闭环
- 状态:已完成
- 日期:2026-08-20
- Gitea 工单:#34
- Wiki 页面:Task-34-purchase-task-state-machine
背景与目标
在 #33 数据与规则契约上实现服务端采购任务状态机,让后续 Admin 和 Android 能通过稳定接口创建、领取、执行和提交采购任务,同时隔离演练与正式能力、阻止设备/已知账号并发、避免重复订单事实,并保证系统不执行支付。
最终方案
- 新增
server/app/goauto/purchase/,实现从单条 SYB 明细创建正式任务,以及从 PDD 商品创建无副作用演练任务。创建时固化商品、规格、数量、价格、币种、规则、设备、可选账号和_cg{taskId}地址后缀。 - 正式任务校验 SYB → 虾皮 → PDD 关联和已确认规格映射;映射不完整、PDD 档案待采集或无规格时要求
purchase.spec-probe.v1并进入两趟执行。 - 创建、下一任务、领取和开始四个边界均校验版本化能力。领取通过数据库 guard 同时占用设备和可选 PDD 账号租约,并检查该设备没有采集任务。
start创建唯一 attempt;规格探测第一趟提交后释放租约,服务端对同一 attempt 固化一次 AI/人工决策,第二趟使用新 attempt 派发。无匹配结果明确失败。- 正式任务必须先提交
order-submit-started才能提交订单号;order_result_unknown不自动重试,只能人工解除。 - attempt 最终结果保存请求 ID 和内容哈希;相同内容重放返回原事实,不同内容拒绝覆盖。
- 一次性重新采购授权在新任务创建事务中消耗,旧任务和旧订单保留;人工支付复核、取消、结果未知解除和回填候选选择均有请求审计。后选的已支付订单覆盖同一 SYB 明细的旧回填候选。
- 演练规则在服务端拒绝改地址、创建订单和核单;任何规则拒绝支付。Admin 页面、Android 页面动作、物流和回填不在本工单。
修改文件
server/app/goauto/purchase/:创建、租约、状态转换、结果幂等、人工处置、HTTP 路由和回归测试。server/app/goauto/models/purchase.go:状态审计、请求幂等、规格决策和取消字段;演练任务的虾皮关联改为可空。server/cmd/migrate/migration/version-local/1786701200000_purchase_state_machine.go:既有数据库追加迁移。server/app/admin/router/init_router.go:注册采购任务路由。docs/00、02、03、08、09:Wiki revision5da7f225的只读镜像。
验收结果
| 验收标准 | 结果 |
|---|---|
| 演练规则不能获得改地址、创建订单和支付能力 | 通过;规则契约回归覆盖 |
| 创建、next、claim、start 均执行能力校验 | 通过;不兼容 next 会跳过,其他边界明确拒绝 |
| 同一设备或已知 PDD 账号只能有一个领取/执行租约 | 通过;查询校验加数据库唯一 guard |
| 同一 attempt 相同结果重放不重复写,不同结果不能覆盖 | 通过 |
| 成功任务默认不能重建,一次授权只产生一条新任务并自动消耗 | 通过 |
| 结果未知不自动重派且必须人工解除 | 通过 |
| 状态事务化并保存审计字段,不记录敏感信息 | 通过 |
测试
go test ./...:服务端全量通过。go vet ./app/goauto/purchase ./app/goauto/models ./app/admin/router:通过。powershell -ExecutionPolicy Bypass -File scripts/verify.ps1 -Component server:全量测试与构建通过。python dev_scripts/harness.py check --strict:通过。- 本地 MySQL 8.4:迁移
1786701200000成功登记;purchase_task的状态、规格决策和订单提交幂等字段存在。 - 未验证部分:未实现或验证 Admin 页面、Android 规则执行、真实修改地址、创建 PDD 订单、人工支付、物流采集和 SYB 回填;没有执行任何真实下单或支付动作。
遗留问题
- Gitea Wiki REST API 仍返回 404;本次通过可正常读写的 Wiki Git 仓库完成 Wiki-first 更新,并逐页比对核心
docs/镜像。 - Admin 列表、详情和批量创建交互由 #35 实现;Android 演练和正式动作分别由 #42、#36 实现。
相关提交
65ae41fd6fdd9a0ee31b3c7a3fab1d0fec58db6efeat(#34): implement purchase task state machine
用户验收
- 2026-08-20:用户明确回复“#34通过验收”。