workspace— step3
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
"""surugaya_common 共享数据模型。"""
|
||||||
|
|
||||||
|
from surugaya_common.models.order import (
|
||||||
|
SurugayaOrderDetail,
|
||||||
|
SurugayaOrderItem,
|
||||||
|
SurugayaOrderStatus,
|
||||||
|
SurugayaOrderSummary,
|
||||||
|
SurugayaShippingInfo,
|
||||||
|
)
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"SurugayaOrderDetail",
|
||||||
|
"SurugayaOrderItem",
|
||||||
|
"SurugayaOrderStatus",
|
||||||
|
"SurugayaOrderSummary",
|
||||||
|
"SurugayaShippingInfo",
|
||||||
|
]
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
"""骏河屋订单详情的结构化模型(pydantic + typing only)。
|
||||||
|
|
||||||
|
从 jp_pruchase_zdh_5/src/parsers/surugaya/models.py 迁移而来,作为 API 服务与
|
||||||
|
worker 共享的订单契约统一维护。worker 端解析订单详情页后产出这些结构,写入
|
||||||
|
Redis Hash(见 surugaya_common.redis_keys.trade_hash);API 的 /api/trade 读取
|
||||||
|
同一份数据。
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Any, Literal
|
||||||
|
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
|
class SurugayaOrderStatus(BaseModel):
|
||||||
|
"""交易状态表的结构化结果。"""
|
||||||
|
|
||||||
|
trade_status: str | None = None
|
||||||
|
status_message: str | None = None
|
||||||
|
# 保留日文原始键值,便于排障和后续补字段。
|
||||||
|
raw: dict[str, str] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class SurugayaOrderSummary(BaseModel):
|
||||||
|
"""订单摘要表的结构化结果。"""
|
||||||
|
|
||||||
|
trade_number: str | None = None
|
||||||
|
order_date: str | None = None
|
||||||
|
items_subtotal: int | None = None
|
||||||
|
item_count: int | None = None
|
||||||
|
payment_method: str | None = None
|
||||||
|
cash_on_delivery_fee: int | None = None
|
||||||
|
shipping_date: str | None = None
|
||||||
|
inquiry_number: str | None = None
|
||||||
|
shipping_and_handling_fee: int | None = None
|
||||||
|
digital_gift_certificate_amount: int | None = None
|
||||||
|
grand_total: int | None = None
|
||||||
|
# 保留订单摘要表的原始日文字段。
|
||||||
|
raw: dict[str, str] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class SurugayaShippingInfo(BaseModel):
|
||||||
|
"""收件信息表的结构化结果。"""
|
||||||
|
|
||||||
|
recipient_name: str | None = None
|
||||||
|
recipient_address: str | None = None
|
||||||
|
recipient_phone_number: str | None = None
|
||||||
|
recipient_email: str | None = None
|
||||||
|
# 保留配送信息表的原始日文字段。
|
||||||
|
raw: dict[str, str] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class SurugayaOrderItem(BaseModel):
|
||||||
|
"""商品明细表中的单行商品记录。"""
|
||||||
|
|
||||||
|
product_code: str | None = None
|
||||||
|
condition: str | None = None
|
||||||
|
branch_number: str | None = None
|
||||||
|
product_title: str | None = None
|
||||||
|
unit_price: int | None = None
|
||||||
|
quantity: int | None = None
|
||||||
|
discount_amount: int | None = None
|
||||||
|
line_total: int | None = None
|
||||||
|
remarks: str | None = None
|
||||||
|
# 每一行商品同时保留原始列名和值。
|
||||||
|
raw: dict[str, str] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class SurugayaOrderDetail(BaseModel):
|
||||||
|
"""骏河屋交易详情页的完整结构化结果。"""
|
||||||
|
|
||||||
|
site: Literal["surugaya"] = "surugaya"
|
||||||
|
status: SurugayaOrderStatus
|
||||||
|
summary: SurugayaOrderSummary
|
||||||
|
shipping: SurugayaShippingInfo
|
||||||
|
items: list[SurugayaOrderItem] = Field(default_factory=list)
|
||||||
|
# 以业务分段聚合保留原始表格结果。
|
||||||
|
raw_tables: dict[str, Any] = Field(default_factory=dict)
|
||||||
Reference in New Issue
Block a user