288766443a
从最新 origin/main 重拉的干净分支,只含本人记账改动,不含 marco 的归因订单(order_record)——后者是另一条未合并分支 feat/user-order-records 的功能,此前被误用 git add -A 和记账混进了 feat/savings-accounting-m1。本分支不带它:savings_record 升级为唯一真相表(新增原价/比价价/支付渠道/源平台/幂等键等列,迁移 savings_report_fields 直接挂 f01db5d77dac、不经 order_record_table);/order/report 改写 savings_record(source='compare'),省额=源平台原价−实付;展示 /api/v1/savings/* 真实优先 demo 兜底。无 order_record 的 model/repo/迁移/路由。alembic 单一 head + pytest 54 passed。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: xianze <ze@192.168.0.138> Reviewed-on: #10 Co-authored-by: zhangxianze <zhangxianze@wonderable.ai> Co-committed-by: zhangxianze <zhangxianze@wonderable.ai>
31 lines
1.7 KiB
Python
31 lines
1.7 KiB
Python
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
|