From 8f634308818ca53ef7aeb19f18c16170a1bc907c Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Tue, 8 Sep 2026 21:41:05 +0800 Subject: [PATCH] feat(crm): support datetime column sort on quote list. Co-authored-by: Cursor --- backend/app/crud/crm/quote.py | 15 ++++++++++++++- backend/app/schemas/crm/quote.py | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/app/crud/crm/quote.py b/backend/app/crud/crm/quote.py index f8a69b2ef..21810b824 100644 --- a/backend/app/crud/crm/quote.py +++ b/backend/app/crud/crm/quote.py @@ -35,6 +35,7 @@ from app.crud.crm.supplier_info import get_supplier_info from app.models.crm_models import CrmContract, CrmCustomer, CrmQuote, CrmQuoteApproval from app.models.models import SysUser from app.services.crm_quote_pdf import generate_quote_pdf +from app.services.crm.list_sort import resolve_datetime_order_by from app.crud.crm.data_scope_helpers import apply_crm_owner_scope, ensure_crm_owner_row_in_scope _FMT = "%Y-%m-%d %H:%M:%S" @@ -350,7 +351,19 @@ def _build_quote_filters( ) ) - return q.order_by(CrmQuote.create_time.desc()) + default_order = CrmQuote.create_time.desc() + whitelist = { + "quoteDate": CrmQuote.quote_date, + "expireDate": CrmQuote.expire_date, + "lastViewTime": CrmQuote.last_view_time, + "createTime": CrmQuote.create_time, + "updateTime": CrmQuote.update_time, + } + sort_field = _get_field(filters, "sort_field", "sortField") + sort_order = _get_field(filters, "sort_order", "sortOrder") + return q.order_by( + resolve_datetime_order_by(sort_field, sort_order, whitelist, default_order) + ) def _fill_contract_linked_count(db: Session, rows: List[Dict[str, Any]]) -> None: diff --git a/backend/app/schemas/crm/quote.py b/backend/app/schemas/crm/quote.py index c15a69616..88117b1dc 100644 --- a/backend/app/schemas/crm/quote.py +++ b/backend/app/schemas/crm/quote.py @@ -58,6 +58,8 @@ class QuoteListBody(BaseModel): endTime: Optional[str] = None approvedByUserId: Optional[str] = None pendingApprovalUserId: Optional[str] = None + sortField: Optional[str] = None + sortOrder: Optional[str] = None ids: Optional[List[str]] = Field(default=None, description="导出指定ID列表") columns: Optional[List[str]] = Field(default=None, description="导出列(前端 visibleColumns)")