From cf821b78aadf7afb22ce32b6f7eec781ecaf9fcd Mon Sep 17 00:00:00 2001 From: dxc Date: Mon, 2 Mar 2026 17:36:25 +0800 Subject: [PATCH] fix: make advanced filters work Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) --- .../app/services/inbound/base_service.py | 48 +++++++++++++------ inventory-web/src/views/material/list.vue | 7 ++- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/inventory-backend/app/services/inbound/base_service.py b/inventory-backend/app/services/inbound/base_service.py index 12aa0ec..067a118 100644 --- a/inventory-backend/app/services/inbound/base_service.py +++ b/inventory-backend/app/services/inbound/base_service.py @@ -209,24 +209,44 @@ class MaterialBaseService: column = getattr(MaterialBase, db_field, None) if column is None: continue - if operator == 'eq': - filter_conditions.append(column == value) - elif operator == 'ne': - filter_conditions.append(column != value) - elif operator == 'contains': - filter_conditions.append(column.ilike(f'%{value}%')) - elif operator == 'ge': + # 处理操作符 + # 对于数值型列(聚合字段)只支持 eq, ne, ge, le + if isinstance(column, type(total_inv)): + # 数值型列 try: num_val = float(value) + except ValueError: + # 转换失败则跳过该条件 + continue + if operator == 'eq': + filter_conditions.append(column == num_val) + elif operator == 'ne': + filter_conditions.append(column != num_val) + elif operator == 'ge': filter_conditions.append(column >= num_val) - except ValueError: - continue - elif operator == 'le': - try: - num_val = float(value) + elif operator == 'le': filter_conditions.append(column <= num_val) - except ValueError: - continue + # 对于 contains 操作符,数值型列不支持,忽略 + else: + # 字符串型列 + if operator == 'eq': + filter_conditions.append(column == value) + elif operator == 'ne': + filter_conditions.append(column != value) + elif operator == 'contains': + filter_conditions.append(column.ilike(f'%{value}%')) + elif operator == 'ge': + try: + num_val = float(value) + filter_conditions.append(column >= num_val) + except ValueError: + continue + elif operator == 'le': + try: + num_val = float(value) + filter_conditions.append(column <= num_val) + except ValueError: + continue if filter_conditions: query = query.filter(and_(*filter_conditions)) diff --git a/inventory-web/src/views/material/list.vue b/inventory-web/src/views/material/list.vue index b0a8578..c5cd2fa 100644 --- a/inventory-web/src/views/material/list.vue +++ b/inventory-web/src/views/material/list.vue @@ -736,7 +736,12 @@ const querySearchType = (queryString: string, cb: any) => { const getList = () => { loading.value = true; - listMaterialBase(queryParams) + // Stringify advancedFilters to JSON string as backend expects + const params = { + ...queryParams, + advancedFilters: JSON.stringify(queryParams.advancedFilters || []) + }; + listMaterialBase(params) .then((response: any) => { if (response && response.data) { tableData.value = response.data.items;