From 0bd42ea325c1e017d0ac4c54623c87d1ead7f0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B8=96=E7=9D=BF?= <2839904623@qq.com> Date: Sat, 20 Jun 2026 22:16:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(compare):=20platform=5Fresults=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=97=20dict,=20=E4=BF=AE=E6=88=90=E5=8A=9F=E6=AF=94?= =?UTF-8?q?=E4=BB=B7=E8=AE=B0=E5=BD=95=E8=A2=AB=20422=20=E6=8B=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 客户端 fromComparison 把 done.params.platform_results(按 platform_id 键的 dict) 原样上报, 但 schema 误声明为 list → pydantic 422 → 成功记录从不落库, 记录页只剩 失败/终止 (2026-06-17 加该字段上报后复现)。改 dict | list 宽松存(仅进 raw_payload)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- app/schemas/compare_record.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/schemas/compare_record.py b/app/schemas/compare_record.py index ed70801..d4fae31 100644 --- a/app/schemas/compare_record.py +++ b/app/schemas/compare_record.py @@ -78,8 +78,12 @@ class ComparisonRecordIn(BaseModel): comparison_results: list[ComparisonResultIn] = Field(default_factory=list) # 逐平台结局摘要(含失败平台的细分原因 status: store_not_found/items_not_found/below_minimum/ # unsupported/...)。来自 done.params.platform_results,客户端透传;落 raw_payload(不单列), - # admin「卡在哪一步」从这里读。list[dict] 宽松存(结构由 pricebot 定,只作 debug 展示)。 - platform_results: list = Field(default_factory=list) + # admin「卡在哪一步」从这里读。 + # ⚠️ pricebot done.params.platform_results 是 **dict(按 platform_id 键)**, 不是 list —— + # 客户端 fromComparison 原样 optJSONObject 透传上来 (见 android Protocol.kt)。早先误声明成 + # list 导致每条成功记录 422 被拒、记录页只剩失败/终止 (2026-06-17 引入 platform_results 上报后复现)。 + # 结构由 pricebot 定、仅作 debug 展示, 宽松存 dict; 兼容老的 list 形态以防回退。 + platform_results: dict | list = Field(default_factory=dict) skipped_dish_count: int | None = None skipped_dish_names: list[str] = Field(default_factory=list) total_dish_count: int | None = None