修复用户反馈机型与系统版本补全 #181
Reference in New Issue
Block a user
Delete Branch "codex/feedback-device-details"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
改动说明
验证
🤖 review-pr 深审结论(后端 · app-server #181)
配套前端 admin-web #85。本仓有本地克隆,走完整仓 worktree 深审 + 实跑测试。
总评 🟢 可合:字段契约与前端对齐,时间窗匹配正确、时区一致、单条窗口查询无 N+1,13 项反馈测试全过、新增回归测试通过。置信度 ~0.9。
值得改(低危 · 健壮性/一致性)
queries.py的_attach_feedback_device_details:三个瞬态字段只在 candidates(有device_model的反馈)上赋值,历史反馈(device_model=None,线上真实存在)从不赋这三个属性。实测(Pydantic 2.12.5 +from_attributes)不会 500,但model_validate对缺失属性既不报错也不填默认值,model_dump_json会整个省略这三个 key(不是null,是键缺失);前端因防御式写法当前不受影响。但这偏离了本仓约定——_attach_user_info是对所有 record 无条件挂phone/nickname,正为保证from_attributes永远读得到。建议把= None默认赋值移到所有 items(而非仅 candidates),响应契约更干净、也不依赖前端恰好防御到位。Nits(非阻塞)
_DEVICE_MARKETING_NAMES仅 6 条硬编码机型映射,多数线上机型会退回展示原始Build.MODEL编码;后续可考虑挪到数据表/配置。fb直接model_validate不走补全(新字段被省略),但它本就没挂phone/nickname,新字段只是沿用既有模式,影响可忽略。写得好 👍
row_number() over (partition_by feedback_id order by created_at desc, id desc))取反馈时间点或之前最近一条比价记录,无 N+1,分页后调用、集合有界。created_at <= Feedback.created_at两侧均DateTime(timezone=True),无时区错配;join 带user_id相等,而ComparisonRecord.user_id可空、Feedback.user_idNOT NULL,SQL 里天然排除孤儿比价行,不会误配。—— 自动深审,仅供参考,具体以人工判断为准。