fix: make advanced filters work

Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat>
This commit is contained in:
dxc
2026-03-02 17:36:25 +08:00
parent e3a143f730
commit cf821b78aa
2 changed files with 40 additions and 15 deletions

View File

@ -209,24 +209,44 @@ class MaterialBaseService:
column = getattr(MaterialBase, db_field, None) column = getattr(MaterialBase, db_field, None)
if column is None: if column is None:
continue continue
if operator == 'eq': # 处理操作符
filter_conditions.append(column == value) # 对于数值型列(聚合字段)只支持 eq, ne, ge, le
elif operator == 'ne': if isinstance(column, type(total_inv)):
filter_conditions.append(column != value) # 数值型列
elif operator == 'contains':
filter_conditions.append(column.ilike(f'%{value}%'))
elif operator == 'ge':
try: try:
num_val = float(value) 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) filter_conditions.append(column >= num_val)
except ValueError: elif operator == 'le':
continue
elif operator == 'le':
try:
num_val = float(value)
filter_conditions.append(column <= num_val) filter_conditions.append(column <= num_val)
except ValueError: # 对于 contains 操作符,数值型列不支持,忽略
continue 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: if filter_conditions:
query = query.filter(and_(*filter_conditions)) query = query.filter(and_(*filter_conditions))

View File

@ -736,7 +736,12 @@ const querySearchType = (queryString: string, cb: any) => {
const getList = () => { const getList = () => {
loading.value = true; 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) => { .then((response: any) => {
if (response && response.data) { if (response && response.data) {
tableData.value = response.data.items; tableData.value = response.data.items;