fix: check_value支持filter_item级别的value_mode

- check_value增加value_mode参数,优先用传入值,回退到field.value_mode
- filter_item遍历时跳过value_mode key
- 提取filter_item.get('value_mode')传给check_value
- 修复between类型filter报invalid literal for int()错误
This commit is contained in:
Hermes Agent 2026-06-18 17:49:28 +08:00
parent 0d841f078e
commit 7d8fae01ca

View File

@ -128,8 +128,10 @@ def typevalue(v, t):
return v return v
return f(v) return f(v)
def check_value(field, spec_value, data_value): def check_value(field, spec_value, data_value, value_mode=None):
if field.value_mode == 'between': if value_mode is None:
value_mode = field.value_mode
if value_mode == 'between':
arr = spec_value.strip().split() arr = spec_value.strip().split()
if len(arr) < 2 or len(arr) > 3: if len(arr) < 2 or len(arr) > 3:
e = f'{spec_value=} error' e = f'{spec_value=} error'
@ -159,13 +161,13 @@ def check_value(field, spec_value, data_value):
exception(e) exception(e)
raise Exception(e) raise Exception(e)
if field.value_mode == 'in': if value_mode == 'in':
arr = spec_value.strip().split() arr = spec_value.strip().split()
arr = [ typevalue(a, field.type) for a in arr ] arr = [ typevalue(a, field.type) for a in arr ]
# debug(f'{arr=}, {data_value=}') # debug(f'{arr=}, {data_value=}')
return data_value in arr return data_value in arr
mode = field.value_mode mode = value_mode
if not mode or mode == '=': if not mode or mode == '=':
mode = '==' mode = '=='
ns = { ns = {
@ -642,8 +644,9 @@ order by b.enabled_date desc"""
if 'unit_prices' in filter_item: if 'unit_prices' in filter_item:
continue # tiered定价项不在此处检查 continue # tiered定价项不在此处检查
item_ok = True item_ok = True
item_value_mode = filter_item.get('value_mode')
for fk, fv in filter_item.items(): for fk, fv in filter_item.items():
if fk == 'unit_prices': if fk in ('unit_prices', 'value_mode'):
continue continue
f = d.fields.get(fk) f = d.fields.get(fk)
if not f: if not f:
@ -653,7 +656,7 @@ order by b.enabled_date desc"""
if data_value is None: if data_value is None:
continue # 数据中没有该键,视为匹配 continue # 数据中没有该键,视为匹配
try: try:
flg = check_value(f, fv, data_value) flg = check_value(f, fv, data_value, item_value_mode)
if not flg: if not flg:
item_ok = False item_ok = False
break break
@ -681,8 +684,9 @@ order by b.enabled_date desc"""
# 处理 filters 中的区间定价(查找匹配的 unit_prices # 处理 filters 中的区间定价(查找匹配的 unit_prices
if 'filters' in p: if 'filters' in p:
for filter_item in p['filters']: for filter_item in p['filters']:
item_value_mode = filter_item.get('value_mode')
for fk, fv in filter_item.items(): for fk, fv in filter_item.items():
if fk == 'unit_prices': if fk in ('unit_prices', 'value_mode'):
continue continue
f = d.fields.get(fk) f = d.fields.get(fk)
if not f: if not f:
@ -692,7 +696,7 @@ order by b.enabled_date desc"""
if data_value is None: if data_value is None:
continue continue
try: try:
flg = check_value(f, fv, data_value) flg = check_value(f, fv, data_value, item_value_mode)
if flg and 'unit_prices' in filter_item: if flg and 'unit_prices' in filter_item:
unit_price = filter_item['unit_prices'] unit_price = filter_item['unit_prices']
except: except: