e9c0a80d44
按本页 trace_id 一次性聚合 ad_ecpm_record 展示收益(元),挂到领券数据 看板明细行(dict 字段)与比价记录列表项(ORM 瞬态属性),防 N+1 范式与 现有 _attach_user_info / _ad_coins_by_trace 一致。 - CouponDataRow: 新增 ad_revenue_yuan: float = 0.0 字段 - AdminComparisonListItem: 新增 ad_revenue_yuan: float = 0.0 字段 - coupon_data.py: _session_to_row 增 ad_revenue_yuan 参数;coupon_data_report 在分页后调用 crud_ecpm.revenue_yuan_by_trace 按本页批量聚合 - queries.py: list_comparison_records 在 _attach_user_info 后瞬态挂 ad_revenue_yuan - 新增 tests/test_board_ad_revenue.py:两个看板各一个集成测试 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
75 lines
3.1 KiB
Python
75 lines
3.1 KiB
Python
"""admin 比价记录 debug 页 schema(独立于 C 端 app/schemas/compare_record:admin 看任意用户、
|
|
无 debug_trace 权限闸、展示全量 debug 字段)。phone/nickname 由 queries 瞬态挂在 ORM 实例上。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class AdminComparisonListItem(BaseModel):
|
|
"""列表项:概要 + debug 维度概览(不含大字段 raw_payload/llm_calls/明细数组)。"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
user_id: int
|
|
phone: str | None = None # join User 瞬态(非 DB 列)
|
|
nickname: str | None = None # join User 瞬态
|
|
business_type: str
|
|
trace_id: str
|
|
# admin 是 debug 工具,无条件下发 trace_url(不看 user.debug_trace_enabled)
|
|
trace_url: str | None = None
|
|
status: str
|
|
information: str | None = None
|
|
store_name: str | None = None
|
|
product_names: str | None = None # 下单商品名派生串(顿号分隔;「商品」列展示 + 商品搜索)
|
|
source_platform_name: str | None = None
|
|
best_platform_name: str | None = None
|
|
source_price_cents: int | None = None
|
|
best_price_cents: int | None = None
|
|
saved_amount_cents: int | None = None
|
|
# debug 概览
|
|
total_ms: int | None = None
|
|
step_count: int | None = None
|
|
llm_call_count: int | None = None
|
|
retry_count: int | None = None
|
|
input_tokens: int | None = None # Σ usage.prompt_tokens(server 派生)
|
|
output_tokens: int | None = None # Σ usage.completion_tokens(server 派生)
|
|
device_model: str | None = None
|
|
rom_vendor: str | None = None
|
|
rom_name: str | None = None
|
|
android_version: str | None = None
|
|
app_version: str | None = None
|
|
ad_revenue_yuan: float = 0.0 # 本次比价看的信息流广告预估收益(元),queries 瞬态挂 ORM 实例上
|
|
created_at: datetime
|
|
|
|
|
|
class AdminComparisonDetail(AdminComparisonListItem):
|
|
"""详情:概要 + 全量明细(逐平台对比 / LLM 每次调用 / 原始 payload)。"""
|
|
|
|
source_platform_id: str | None = None
|
|
source_package: str | None = None
|
|
best_platform_id: str | None = None
|
|
best_deeplink: str | None = None
|
|
is_source_best: bool | None = None
|
|
total_dish_count: int | None = None
|
|
skipped_dish_count: int | None = None
|
|
device_id: str | None = None
|
|
items: list = []
|
|
comparison_results: list = [] # 逐平台对比(价格/rank/coupon/打烊...)
|
|
skipped_dish_names: list = []
|
|
# 全量环境
|
|
device_manufacturer: str | None = None
|
|
rom_version: int | None = None
|
|
android_sdk: int | None = None
|
|
app_version_code: int | None = None
|
|
source_app_version: str | None = None
|
|
longitude: float | None = None
|
|
latitude: float | None = None
|
|
# 每次 LLM 调用明细 [{scene,model,input_messages,output,usage,latency_ms,error}]
|
|
llm_calls: list | None = None
|
|
# 原始上报全量;「卡在哪一步」从 raw_payload.platform_results[*].status 读
|
|
# (store_not_found/items_not_found/below_minimum/unsupported = 卡在 找店/加菜/起送/读价)。
|
|
raw_payload: dict | None = None
|