feat: 财务对账页面 — GET /api/finance/daily-summary + Finance.vue
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
"""Finance router — daily revenue vs cost reconciliation."""
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime as _dt
|
||||
from typing import Any, Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.database import get_db
|
||||
from app.models.upstream import Upstream
|
||||
from app.models.website import Website
|
||||
from app.services.finance_service import get_daily_summary, yesterday_shanghai
|
||||
from app.utils.auth import get_current_user
|
||||
|
||||
router = APIRouter(prefix="/api/finance", tags=["finance"])
|
||||
|
||||
|
||||
@router.get("/daily-summary")
|
||||
def daily_summary(
|
||||
date: Optional[str] = Query(None, description="YYYY-MM-DD, defaults to yesterday Asia/Shanghai"),
|
||||
db: Session = Depends(get_db),
|
||||
_: Any = Depends(get_current_user),
|
||||
) -> dict:
|
||||
"""Return daily revenue vs cost summary.
|
||||
|
||||
Never raises for individual item failures — each failed website/upstream
|
||||
is included in the response with status='failed' and an error message.
|
||||
Only raises HTTP errors for bad request parameters.
|
||||
"""
|
||||
if date:
|
||||
try:
|
||||
target = _dt.date.fromisoformat(date)
|
||||
except ValueError:
|
||||
raise HTTPException(400, f"Invalid date format: {date!r}. Expected YYYY-MM-DD.")
|
||||
else:
|
||||
target = yesterday_shanghai()
|
||||
|
||||
websites = db.query(Website).filter(Website.enabled == True).all()
|
||||
upstreams = db.query(Upstream).filter(Upstream.enabled == True).all()
|
||||
|
||||
return get_daily_summary(websites, upstreams, target)
|
||||
Reference in New Issue
Block a user