ee6c2e4710
本次(M1 记账): savings_record 升级为记账唯一真相表(新增 源平台原价/比价价/支付渠道/平台包名/源平台名/源链接/幂等键/device_id, 加 user_id+client_event_id 唯一约束); /api/v1/order/report 改为写 savings_record(source=compare), 省额=源平台原价 减 实付, 按 client_event_id 幂等; 统计与明细改为 有真实记录用真实、否则 demo 兜底; 修复 dishes 列 JSONB 改 with_variant 兼容 SQLite 测试库; 新增 tests/test_order_savings.py, 全量 pytest 54 passed 一并纳入(此前工作区已有、未提交, 非本次改动): order_record 归因订单 模型/repo/api/迁移, 及 main.py、models/__init__ 注册等改动 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
52 lines
2.1 KiB
Python
52 lines
2.1 KiB
Python
from datetime import datetime
|
||
|
||
from pydantic import BaseModel, ConfigDict, Field
|
||
|
||
|
||
class OrderReportRequest(BaseModel):
|
||
"""客户端归因成功后的上报体。金额一律用「分」(int) 传,避免浮点误差。"""
|
||
|
||
client_event_id: str = Field(..., max_length=64, description="客户端幂等键(UUID)")
|
||
platform: str = Field(..., max_length=32, description="平台展示名,如 美团")
|
||
platform_package: str | None = Field(None, max_length=128, description="平台包名")
|
||
pay_channel: str = Field(..., max_length=16, description="支付渠道 wechat/alipay")
|
||
compared_price_cents: int = Field(..., ge=0, description="我们给出的比价价(分)")
|
||
paid_amount_cents: int = Field(..., ge=0, description="实际支付金额(分)")
|
||
device_id: str | None = Field(None, max_length=128)
|
||
# ===== 比价时携带的记账信息(客户端从意图识别阶段缓存而来;旧版客户端可能不传,故全部可空)=====
|
||
shop_name: str | None = Field(None, max_length=128, description="门店名,如 肯德基宅急送(天北路店)")
|
||
dishes: list[str] = Field(default_factory=list, description="菜品名列表")
|
||
original_price_cents: int | None = Field(None, ge=0, description="源平台原价(分),省额=原价−实付")
|
||
source_platform_name: str | None = Field(None, max_length=32, description="源平台展示名,如 美团")
|
||
source_deeplink: str | None = Field(None, max_length=512, description="源平台重进链接(预留,本期只存不展示)")
|
||
|
||
|
||
class OrderReportOut(BaseModel):
|
||
model_config = ConfigDict(from_attributes=True)
|
||
|
||
id: int
|
||
platform: str
|
||
pay_channel: str
|
||
compared_price_cents: int
|
||
paid_amount_cents: int
|
||
duplicated: bool = False
|
||
|
||
|
||
class OrderListItem(BaseModel):
|
||
"""订单明细一条(展示用)。saved_cents = 比价价 − 实付(下限 0)。"""
|
||
|
||
model_config = ConfigDict(from_attributes=True)
|
||
|
||
id: int
|
||
platform: str
|
||
pay_channel: str
|
||
compared_price_cents: int
|
||
paid_amount_cents: int
|
||
saved_cents: int
|
||
created_at: datetime
|
||
|
||
|
||
class OrderListOut(BaseModel):
|
||
items: list[OrderListItem]
|
||
total: int
|