"""Admin finance API for avatar Token orders, refunds and invoices.""" from fastapi import APIRouter, Body, HTTPException, Query from app.schemas import ApiResponse from app.services.avatar_service import get_session, is_available from app.services.finance_service import FinanceServiceError, finance_service router = APIRouter() def _session(): if not is_available(): raise HTTPException(status_code=503, detail="数字分身数据库尚未初始化") return get_session() def _raise(exc: FinanceServiceError): raise HTTPException(status_code=exc.status_code, detail=str(exc)) @router.get("/summary") def summary(): db = _session() try: return ApiResponse(data=finance_service.summary(db)) finally: db.close() @router.get("/plans") def token_plans(): db = _session() try: return ApiResponse(data=finance_service.list_token_plans(db)) finally: db.close() @router.patch("/plans/{plan_id}") def update_token_plan(plan_id: str, body: dict = Body(...)): db = _session() try: finance_service.update_token_plan( db, plan_id, amount=int(body.get("amount") or 0), price=float(body.get("price") or 0), name=str(body.get("name") or ""), badge=str(body.get("badge") or ""), desc=str(body.get("desc") or ""), ) return ApiResponse(message="充值套餐已更新") except (ValueError, FinanceServiceError) as exc: _raise(exc if isinstance(exc, FinanceServiceError) else FinanceServiceError("积分和价格格式不正确")) finally: db.close() @router.get("/orders") def orders( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), keyword: str = Query(""), status: str = Query(""), provider: str = Query(""), ): db = _session() try: total, items = finance_service.list_orders( db, page=page, page_size=page_size, keyword=keyword.strip(), status=status, provider=provider ) return ApiResponse(data={"total": total, "page": page, "page_size": page_size, "items": items}) finally: db.close() @router.patch("/orders/{order_no}/status") def update_order_status(order_no: str, body: dict = Body(...)): db = _session() try: finance_service.close_order( db, order_no, status=str(body.get("status") or ""), reason=str(body.get("reason") or "") ) return ApiResponse(message="订单状态已更新") except FinanceServiceError as exc: _raise(exc) finally: db.close() @router.get("/invoices") def invoices( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), status: str = Query(""), ): db = _session() try: total, items = finance_service.list_invoices(db, page=page, page_size=page_size, status=status) return ApiResponse(data={"total": total, "page": page, "page_size": page_size, "items": items}) finally: db.close() @router.patch("/invoices/{invoice_id}") def update_invoice(invoice_id: str, body: dict = Body(...)): db = _session() try: finance_service.update_invoice( db, invoice_id, status=str(body.get("status") or ""), invoice_no=str(body.get("invoiceNo") or ""), invoice_url=str(body.get("invoiceUrl") or ""), remark=str(body.get("remark") or ""), ) return ApiResponse(message="发票申请已处理") except FinanceServiceError as exc: _raise(exc) finally: db.close()