from fastapi import APIRouter from app.api.deps import CurrentUser, DbSession from app.repositories import order as crud_order from app.repositories import savings as crud_savings from app.schemas.order import ( OrderListItem, OrderListOut, OrderReportOut, OrderReportRequest, ) router = APIRouter(prefix="/api/v1/order", tags=["order"]) @router.post( "/report", response_model=OrderReportOut, summary="上报归因订单(比价后5分钟内点链接 + 支付金额与比价价相差≤1元)", ) def report_order(req: OrderReportRequest, user: CurrentUser, db: DbSession) -> OrderReportOut: # 记账唯一真相表是 savings_record(source='compare');order_record 已降级,不再写入。 rec, duplicated = crud_savings.create_from_report(db, user.id, req) return OrderReportOut( id=rec.id, platform=rec.platform or req.platform, pay_channel=rec.pay_channel or req.pay_channel, compared_price_cents=rec.compared_price_cents or 0, paid_amount_cents=rec.order_amount_cents, duplicated=duplicated, ) @router.get( "/list", response_model=OrderListOut, summary="当前用户的归因订单明细(按时间倒序)", ) def list_orders(user: CurrentUser, db: DbSession, limit: int = 100) -> OrderListOut: rows, total = crud_order.list_orders(db, user.id, limit=limit) items = [ OrderListItem( id=r.id, platform=r.platform, pay_channel=r.pay_channel, compared_price_cents=r.compared_price_cents, paid_amount_cents=r.paid_amount_cents, saved_cents=max(0, r.compared_price_cents - r.paid_amount_cents), created_at=r.created_at, ) for r in rows ] return OrderListOut(items=items, total=total)