From 36afab503a77b67f40b3f3ea9d5f29e93b4a9e48 Mon Sep 17 00:00:00 2001 From: zlwu Date: Sun, 6 Sep 2026 07:43:45 +0800 Subject: [PATCH] feat(bx): wire reimburse my list and export to column filters. Co-authored-by: Cursor --- backend/app/api/bx/export_common.py | 8 +++ backend/app/api/bx/reimburse.py | 86 +++++++++++++++-------------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/backend/app/api/bx/export_common.py b/backend/app/api/bx/export_common.py index 5330e580f..23337c279 100644 --- a/backend/app/api/bx/export_common.py +++ b/backend/app/api/bx/export_common.py @@ -48,6 +48,14 @@ class BxApplyListExportBody(BxExportBodyBase): apply_date_to: Optional[str] = Field(default=None, alias="applyDateTo") expense_id: Optional[str] = Field(default=None, alias="expenseId") expense_name: Optional[str] = Field(default=None, alias="expenseName") + apply_code: Optional[str] = Field(default=None, alias="applyCode") + title: Optional[str] = None + current_node: Optional[str] = Field(default=None, alias="currentNode") + status_in: Optional[str] = Field(default=None, alias="statusIn") + amount_op: Optional[str] = Field(default=None, alias="amountOp") + amount: Optional[str] = None + amount_min: Optional[str] = Field(default=None, alias="amountMin") + amount_max: Optional[str] = Field(default=None, alias="amountMax") def status_label(status: Any) -> str: diff --git a/backend/app/api/bx/reimburse.py b/backend/app/api/bx/reimburse.py index 6aaeb1234..7cbfa4199 100644 --- a/backend/app/api/bx/reimburse.py +++ b/backend/app/api/bx/reimburse.py @@ -40,6 +40,7 @@ from app.services.bx.reimburse_import import ( load_applicant_options, load_expense_nodes_flat, ) +from app.services.bx.reimburse_list_filters import build_reimburse_column_filters from app.utils.bx_codegen import generate_apply_code, generate_title, parse_optional_date from app.utils.bx_date_range import append_create_time_filters @@ -63,34 +64,27 @@ REIMBURSE_EXPORT_COLUMNS = [ def _reimburse_list_filters(body: BxApplyListExportBody, db: Session, tenant_no: str) -> list: - filters = [] - if body.status: - filters.append(BxReimburseApply.status == body.status) - if body.keyword: - filters.append( - or_( - BxReimburseApply.apply_code.contains(body.keyword), - BxReimburseApply.applicant_name.contains(body.keyword), - BxReimburseApply.title.contains(body.keyword), - ) - ) - if body.expense_id: - filters.append(BxReimburseApply.expense_id == str(body.expense_id).strip()) - expense_filter = ReimburseService.build_expense_name_condition(db, tenant_no, body.expense_name) - if expense_filter is not None: - filters.append(expense_filter) - if body.applicant_id: - filters.append(BxReimburseApply.applicant_id == str(body.applicant_id).strip()) - if body.ids: - filters.append(BxReimburseApply.id.in_([str(i) for i in body.ids])) - append_create_time_filters( - filters, - BxReimburseApply, + return build_reimburse_column_filters( + db=db, + tenant_no=tenant_no, + keyword=body.keyword or "", + status=body.status, + status_in=body.status_in, + apply_code=body.apply_code, + title=body.title, + expense_name=body.expense_name, + expense_id=body.expense_id, + applicant_id=body.applicant_id, + current_node=body.current_node, + amount_op=body.amount_op, + amount=body.amount, + amount_min=body.amount_min, + amount_max=body.amount_max, apply_date=body.apply_date, apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + ids=body.ids, ) - return filters def _export_reimburse_rows(db: Session, tenant_no: str, rows) -> list: @@ -252,6 +246,14 @@ def my_reimburses( status: Optional[str] = None, keyword: str = "", expenseName: Optional[str] = None, + applyCode: Optional[str] = None, + title: Optional[str] = None, + currentNode: Optional[str] = None, + statusIn: Optional[str] = None, + amountOp: Optional[str] = None, + amount: Optional[str] = None, + amountMin: Optional[str] = None, + amountMax: Optional[str] = None, applyDate: Optional[str] = None, applyDateFrom: Optional[str] = None, applyDateTo: Optional[str] = None, @@ -265,25 +267,25 @@ def my_reimburses( BxReimburseApply.create_by == user.id, ) ] - if status: - filters.append(BxReimburseApply.status == status) - if keyword: - filters.append( - or_( - BxReimburseApply.apply_code.contains(keyword), - BxReimburseApply.applicant_name.contains(keyword), - BxReimburseApply.title.contains(keyword), - ) + filters.extend( + build_reimburse_column_filters( + db=db, + tenant_no=tenant_no, + keyword=keyword or "", + status=status, + status_in=statusIn, + apply_code=applyCode, + title=title, + expense_name=expenseName, + current_node=currentNode, + amount_op=amountOp, + amount=amount, + amount_min=amountMin, + amount_max=amountMax, + apply_date=applyDate, + apply_date_from=applyDateFrom, + apply_date_to=applyDateTo, ) - expense_filter = ReimburseService.build_expense_name_condition(db, tenant_no, expenseName) - if expense_filter is not None: - filters.append(expense_filter) - append_create_time_filters( - filters, - BxReimburseApply, - apply_date=applyDate, - apply_date_from=applyDateFrom, - apply_date_to=applyDateTo, ) rows, total = ReimburseService.get_paged(db, tenant_no, page=page, page_size=pageSize, filters=filters, user=user) out_rows = ReimburseService.out_rows_with_attachment_counts(db, tenant_no, list(rows))