feat: 统一后端分页查询与前端服务层适配
后端新增通用分页模块,为报销单、员工、预算、agent 资产等 端点统一接入分页参数和游标查询,优化 repository 层分页实 现,前端服务层适配分页响应结构,完善预算图表和全局样式, 优化侧边栏和企业选择器组件,引入 Element Plus 插件注册。
This commit is contained in:
61
server/src/app/services/expense_claim_pagination.py
Normal file
61
server/src/app/services/expense_claim_pagination.py
Normal file
@@ -0,0 +1,61 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from app.api.deps import CurrentUserContext
|
||||
from app.models.employee import Employee
|
||||
from app.models.financial_record import ExpenseClaim
|
||||
from app.services.pagination import PageResult, paginate_select
|
||||
|
||||
|
||||
class ExpenseClaimPaginationMixin:
|
||||
def _claim_list_stmt(self):
|
||||
return select(ExpenseClaim).options(
|
||||
selectinload(ExpenseClaim.items),
|
||||
selectinload(ExpenseClaim.employee).selectinload(Employee.manager),
|
||||
selectinload(ExpenseClaim.employee).selectinload(Employee.roles),
|
||||
)
|
||||
|
||||
def list_claims_page(
|
||||
self,
|
||||
current_user: CurrentUserContext,
|
||||
*,
|
||||
page: int | None,
|
||||
page_size: int | None,
|
||||
) -> PageResult[ExpenseClaim]:
|
||||
stmt = self._claim_list_stmt().order_by(
|
||||
ExpenseClaim.created_at.desc(),
|
||||
ExpenseClaim.occurred_at.desc(),
|
||||
)
|
||||
stmt = self._access_policy.apply_claim_scope(stmt, current_user)
|
||||
return paginate_select(self.db, stmt, page=page, page_size=page_size)
|
||||
|
||||
def list_approval_claims_page(
|
||||
self,
|
||||
current_user: CurrentUserContext,
|
||||
*,
|
||||
page: int | None,
|
||||
page_size: int | None,
|
||||
) -> PageResult[ExpenseClaim]:
|
||||
stmt = self._claim_list_stmt().order_by(
|
||||
ExpenseClaim.submitted_at.desc(),
|
||||
ExpenseClaim.created_at.desc(),
|
||||
)
|
||||
stmt = self._access_policy.apply_approval_claim_scope(stmt, current_user)
|
||||
return paginate_select(self.db, stmt, page=page, page_size=page_size)
|
||||
|
||||
def list_archived_claims_page(
|
||||
self,
|
||||
current_user: CurrentUserContext,
|
||||
*,
|
||||
page: int | None,
|
||||
page_size: int | None,
|
||||
) -> PageResult[ExpenseClaim]:
|
||||
stmt = self._claim_list_stmt().order_by(
|
||||
ExpenseClaim.updated_at.desc(),
|
||||
ExpenseClaim.submitted_at.desc(),
|
||||
ExpenseClaim.created_at.desc(),
|
||||
)
|
||||
stmt = self._access_policy.apply_archived_claim_scope(stmt, current_user)
|
||||
return paginate_select(self.db, stmt, page=page, page_size=page_size)
|
||||
Reference in New Issue
Block a user