first commit

This commit is contained in:
2026-03-09 14:46:56 +08:00
commit 62236eb80e
63 changed files with 6143 additions and 0 deletions

47
backend/app/api/export.py Normal file
View File

@@ -0,0 +1,47 @@
"""Export API: Excel and PDF report download."""
from io import BytesIO
from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import StreamingResponse
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.database import get_db
from app.models import Case, Transaction
from app.schemas import TransactionResponse
router = APIRouter()
@router.get("/{case_id}/export/excel")
async def export_excel(case_id: int, db: AsyncSession = Depends(get_db)):
from app.services.report import build_excel_report
r = await db.execute(select(Case).where(Case.id == case_id))
case = r.scalar_one_or_none()
if not case:
raise HTTPException(status_code=404, detail="Case not found")
r = await db.execute(select(Transaction).where(Transaction.case_id == case_id).order_by(Transaction.transaction_time))
txns = [TransactionResponse.model_validate(t) for t in r.scalars().all()]
data = await build_excel_report(case, txns)
return StreamingResponse(
BytesIO(data),
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
headers={"Content-Disposition": f"attachment; filename=case_{case_id}_report.xlsx"},
)
@router.get("/{case_id}/export/pdf")
async def export_pdf(case_id: int, db: AsyncSession = Depends(get_db)):
from app.services.report import build_pdf_report
r = await db.execute(select(Case).where(Case.id == case_id))
case = r.scalar_one_or_none()
if not case:
raise HTTPException(status_code=404, detail="Case not found")
r = await db.execute(select(Transaction).where(Transaction.case_id == case_id).order_by(Transaction.transaction_time))
txns = [TransactionResponse.model_validate(t) for t in r.scalars().all()]
data = await build_pdf_report(case, txns)
return StreamingResponse(
BytesIO(data),
media_type="application/pdf",
headers={"Content-Disposition": f"attachment; filename=case_{case_id}_report.pdf"},
)