feat: 财务对账页面 — GET /api/finance/daily-summary + Finance.vue

This commit is contained in:
SmartUp Developer
2026-07-03 15:28:06 +08:00
parent 9997b9d56a
commit 5e99abcbc5
7 changed files with 1006 additions and 1 deletions
+42
View File
@@ -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)