This commit is contained in:
2026-05-11 09:34:50 +08:00
parent 79ca3613ae
commit 5e1d475a22
14 changed files with 336 additions and 264 deletions
+22 -7
View File
@@ -31,8 +31,12 @@ from .schemas import (
PartnerStatementItemResponse,
FinancePartnerProductStatementResponse,
PartnerProductStatementItemResponse,
PaginatedResponse,
)
from .utils import generate_order_no
from utils.logger import get_logger
logger = get_logger(__name__)
router = APIRouter(prefix="/finance", tags=["财务管理"])
@@ -227,7 +231,7 @@ async def create_payment(
return _build_transaction_response(created)
@router.get("/transactions", response_model=List[FinanceTransactionResponse])
@router.get("/transactions", response_model=PaginatedResponse[FinanceTransactionResponse])
async def list_transactions(
txn_type: Optional[str] = None,
status: Optional[str] = "confirmed",
@@ -238,22 +242,29 @@ async def list_transactions(
db_session: AsyncSession = Depends(get_db_session),
current_user: User = Depends(get_current_active_user),
):
query = (
base_query = (
select(FinanceTransaction)
.options(selectinload(FinanceTransaction.allocations))
.order_by(FinanceTransaction.created_at.desc())
)
if txn_type:
query = query.where(FinanceTransaction.txn_type == txn_type)
base_query = base_query.where(FinanceTransaction.txn_type == txn_type)
if status:
query = query.where(FinanceTransaction.status == status)
base_query = base_query.where(FinanceTransaction.status == status)
if year is not None or quarter is not None:
_, _, _, period_start, period_end = _resolve_period_scope(year, quarter)
query = query.where(FinanceTransaction.txn_date >= period_start).where(FinanceTransaction.txn_date < period_end)
query = query.offset(skip).limit(limit)
base_query = base_query.where(FinanceTransaction.txn_date >= period_start).where(FinanceTransaction.txn_date < period_end)
count_query = select(func.count()).select_from(base_query.subquery())
total = await db_session.scalar(count_query) or 0
query = base_query.offset(skip).limit(limit)
result = await db_session.execute(query)
rows = result.scalars().all()
return [_build_transaction_response(item) for item in rows]
return PaginatedResponse(
items=[_build_transaction_response(item) for item in rows],
total=total, skip=skip, limit=limit
)
@router.post("/transactions/{transaction_id}/void")
@@ -287,6 +298,10 @@ async def void_transaction(
txn.status = "voided"
await db_session.commit()
logger.warning(
"财务单据已作废: txn_no=%s txn_type=%s amount=%s operator_id=%s",
txn.txn_no, txn.txn_type, txn.amount, current_user.id
)
return {"message": "单据已作废"}