From 72a8f97bd120dad45000494d40b62f9f815b4215 Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Tue, 8 Sep 2026 21:39:26 +0800 Subject: [PATCH] feat(crm): support datetime column sort on customer list. Co-authored-by: Cursor --- backend/app/crud/crm/customer.py | 22 ++++++++++++++++++++-- backend/app/schemas/crm/customer.py | 4 ++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/backend/app/crud/crm/customer.py b/backend/app/crud/crm/customer.py index 128efc223..67034a812 100644 --- a/backend/app/crud/crm/customer.py +++ b/backend/app/crud/crm/customer.py @@ -18,6 +18,7 @@ from app.crud.crm.data_scope_helpers import ( ensure_crm_owner_row_in_scope, ) from app.services.crm.customer_list_filters import build_customer_column_filters +from app.services.crm.list_sort import resolve_datetime_order_by from app.utils.pinyin_abbr import resolve_name_pinyin_abbr @@ -285,9 +286,26 @@ def list_customers( cap = max_page_size if max_page_size is not None else 500 page_size = min(max(1, page_size), cap) - order_by = CrmCustomer.create_time.desc() + default_order = CrmCustomer.create_time.desc() if view_mode == "toFollow": - order_by = CrmCustomer.next_time.asc() + default_order = CrmCustomer.next_time.asc() + + _customer_sort_whitelist = { + "lastTime": CrmCustomer.last_time, + "nextTime": CrmCustomer.next_time, + "dealTime": CrmCustomer.deal_time, + "intoPoolTime": CrmCustomer.into_pool_time, + "claimTime": CrmCustomer.claim_time, + "protectTime": CrmCustomer.protect_time, + "createTime": CrmCustomer.create_time, + "updateTime": CrmCustomer.update_time, + } + order_by = resolve_datetime_order_by( + filter_params.get("sort_field") or filter_params.get("sortField"), + filter_params.get("sort_order") or filter_params.get("sortOrder"), + _customer_sort_whitelist, + default_order, + ) rows = ( q.order_by(order_by) diff --git a/backend/app/schemas/crm/customer.py b/backend/app/schemas/crm/customer.py index cb270442d..686de5457 100644 --- a/backend/app/schemas/crm/customer.py +++ b/backend/app/schemas/crm/customer.py @@ -202,6 +202,8 @@ class CustomerListBody(CustomerColumnFilterMixin): ids: Optional[List[str]] = Field(default=None, description="导出指定ID列表") columns: Optional[List[str]] = Field(default=None, description="导出列(前端 visibleColumns)") + sort_field: Optional[str] = Field(default=None, alias="sortField", description="日期列排序字段(prop)") + sort_order: Optional[str] = Field(default=None, alias="sortOrder", description="asc|desc") def to_list_kwargs(self, *, view_mode_override: Optional[str] = None) -> dict: """解析列表查询参数,供 API 与 CRUD 共用。""" @@ -210,6 +212,8 @@ class CustomerListBody(CustomerColumnFilterMixin): kwargs = { "keyword": keyword, "view_mode": view_mode, + "sort_field": (self.sort_field or "").strip() or None, + "sort_order": (self.sort_order or "").strip() or None, **self.column_filter_kwargs(), } # createTimeRange 优先于 begin/end / createTimeFrom/To