Files
meida_backend/packages/report
xsl a1d0171fc5
CI / lint / typecheck / import-linter / tests / secrets (push) Canceled after 0s
feat(uploads): 本地磁盘直传(COS 降级路线)+ 报告照片存在性校验
- POST /uploads/direct:原始字节 body + Content-Type 申报 + scene query(默认 report_photo),场景/类型/大小三重校验复用 storage 既有规则,落盘 var/uploads/<scene>/<user_id>/<uuid>.<ext>(config 新增 upload_dir),key 布局与 COS 同构;不加 python-multipart 依赖
- storage/local.py:save_direct_upload + require_local_upload(resolve 归并 + is_relative_to 归属收敛 + 存在性校验,越界/模拟/不存在一律 404)
- report/service.create_report:资格校验后、配额预扣前插入照片存在性校验(模拟 key 被拦且不消耗额度;regenerate 复用已验 photo_meta 不复核)
- 测试:test_upload_direct 14 单测 + test_upload_direct_flow 4 集成(真 key 全链路/假 key 404 零流水/401/40010)

偏差说明:test_report_flow._create_report 改走 /uploads/direct 拿真 key(存在性校验必然封死假 key),40920 与幂等重放两条断言语义未动。
2026-09-12 00:24:01 +08:00
..

packages/report/ — 美学报告(占位)

职责(架构 §4.1):触发判定、生成编排、版本管理、分享。 不负责:具体的视觉分析与文案生成(调 AI 能力层)。

profile.py 对外提供「最近一份 succeeded 报告的画像摘要」(Agent 上下文 注入用,P0-2);rp_report / rp_input 仍只有本域 repo 可触,外部一律走这里。

待实现

  • 表:rp_report rp_input rp_share
  • 架构 §7.1 的 24 步生成链路(这是全系统最复杂的一条)

这条链路上不能妥协的四件事

  1. 原图生命周期:直传 COS 临时桶 → Worker 拉取 → 第 14 步显式删除 → 桶级 2 小时生命周期兜底(TD-20 / CR-02)。rp_input 只存派生特征与图片元信息。
  2. 失败即退款:任何步骤失败 → tk_task 转 failed → billing.refund()。
  3. 分步可恢复:视觉分析结果必须落中间态,LLM 或渲染失败时不重跑视觉分析 (也就不需要用户重新上传)。
  4. 生成后校验不可跳过:禁忌违反、色值在板内、维度引用存在、无医疗/贬损表述。 最多重试 2 次,仍失败降级为规则直出模板文案,绝不放行违规内容。

结论反馈(T-P3-21 最小可用版,迭代 3 落地)

feedback_service.py + rp_feedback:维度级「准/不准 + 可选修正」,同维度 重复反馈 = 覆盖更新(upsert)。有意裁剪:原文要求的「修正后置信度置 1.0 并即时写 L1 记忆」未做——L1 记忆系统未建,本迭代只落表,认同率/修正率 两项指标可从 SQL 直接算出,不回写报告结论。

预约留资(T-P3-22,迭代 3 落地)

reservation_service.py + rp_reservation:topic 预留通用性(首期 full_report)。指标口径:预约率 = rp_reservation(topic='full_report') 行数 ÷ 埋点 full_report.card_view 去重曝光数;决策门槛 ≥8%(产品方案 §2.2.3)。