Files
huihuiSquare/backend/app/api/endpoints/finance.py

119 lines
3.5 KiB
Python

"""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()