Page:
T-278
Pages
00-ai-start-here
01-vision
02-requirements
03-tech-stack
04-architecture
05-coding-rules
06-tasks
07-user-stories
08-interaction-checklist
Design
Home
Integrations-shunyunbao-contract
PPT
T-001
T-002
T-003
T-004
T-101
T-102
T-103
T-104
T-201
T-202
T-203
T-204
T-205
T-206
T-207
T-208
T-209
T-210
T-211
T-212
T-213
T-214
T-215
T-216
T-217
T-218
T-219
T-220
T-221
T-222
T-223
T-224
T-225
T-226
T-227
T-228
T-229
T-230
T-231
T-232
T-233
T-234
T-235
T-236
T-237
T-238
T-239
T-240
T-241
T-242
T-243
T-244
T-245
T-246
T-247
T-248
T-249
T-250
T-251
T-252
T-253
T-254
T-255
T-256
T-257
T-258
T-259
T-260
T-261
T-262
T-263
T-264
T-265
T-266
T-267
T-268
T-269
T-270
T-271
T-272
T-273
T-274
T-275
T-276
T-277
T-278
T-279
T-280
T-281
Task-Template
Tasks
agent-context
api
clean-state-checklist
current-state
routes
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.
同步来源:
docs/tasks/T-278.md· commitafc651f75a3a
id: T-278 title: 任务价格为空时使用冻结的低价采购上限 phase: 2 deps:
- T-277 status: DONE created: 2026-08-01 context_ref: 757a522 work_branch: null write_paths:
- docs/tasks/T-278.md
- docs/current-state.md
- docs/04-architecture.md
- docs/05-coding-rules.md
- docs/api.md
- backend-api/migrations/**
- backend-api/internal/**
- backend-api/.env.example
- android-buyer/app/src/main/**
- android-buyer/app/src/test/**
问题 / 背景
候选价格可能为空或只是搜索结果展示价。现有 Android 策略在采购任务未设置最高总预算时, 要求下单时的规格单价必须和候选价格文本完全相同;候选价格为空会让已人工确认的商品永远 无法进入订单确认页。直接取消价格判断又会失去自动采购的金额安全边界。
行为契约
- 采购任务设置
max_budget时,以该最高总预算作为订单总额上限;未设置时,以后台CMROUBAO_DEFAULT_ORDER_TOTAL_CAP_CENTS配置作为低价采购上限,默认20000分。 - 创建人工确认授权时,把最终上限和来源
TASK_MAX_BUDGET|DEFAULT_LOW_PRICE_CAP冻结到授权记录和设备命令;配置后续变化不影响 已创建授权。 - 设备命令 schema 升级,上限参与
command_sha256;App 不从任务缓存自行推导默认值。 - 候选
price_text只作为观察数据,不再要求和当前规格价格完全相等,也不作为授权上限。 - App 仍必须在规格选择后读取唯一、已验证的当前单价,并在订单确认页读取总价;
当前单价 × 数量、确认页总价和冻结上限必须同时一致/满足,任何缺失、歧义、溢出或超额 均失败关闭。 - 后端接收 dry-run 时再次校验总价不超过授权记录中的冻结上限,不能只信任手机校验。
方案
- 配置层增加整数分单位的默认总额上限,限制在合理范围,并允许从现有
.env读取。 - migration 为
order_authorizations增加非空总额上限及来源;历史授权按保守方式迁移, down migration 对非默认数据失败关闭。 - 授权仓储根据任务预算或服务配置生成冻结值,设备命令、哈希、HTTP JSON 和 Android 安全存储透传该值。
- 重写 Android 价格策略和 Go dry-run 仓储校验,补充空候选价格、任务预算、默认上限、 超额、篡改哈希及迁移回归测试。
验收要点
- 任务有预算时,命令冻结任务预算并标记
TASK_MAX_BUDGET。 - 任务无预算且候选价格为空时,仍可按默认 200 元上限执行 dry-run。
- 候选价格变化不阻止执行,但当前规格价格缺失或歧义仍阻止执行。
- 当前总价或订单确认总价超过冻结上限时,App 和后端均拒绝。
- 上限和来源参与命令哈希及持久化,重启和配置变化不改变旧授权。
- migration up/down/up、Go 全量测试、Android 双变体单测、lint 和构建通过。
边界
- 本任务不修复确认商品链接身份复核、订单 dry-run 的 VLM 规格兜底或终态失败上报, 由 T-279 完成。
- 不允许价格不可读时自动下单,不允许模型独立生成金额。
- 不自动点击支付,最终仍停留在拼多多待支付订单。
执行记录
- 2026-08-01:按“价格为空时取消候选价等值判断,但保留冻结总额上限”的方案创建任务,
状态
TODO。 - 2026-08-01:完成 v22 授权上限持久化、schema v3 命令、双端金额校验和 Admin 展示;
Go 全量测试/vet、Android Debug/Release 共 942 项测试、lint 和构建通过,状态
DONE。