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