# -*- coding: utf-8 -*- """报表公共工具函数""" import logging _logger = logging.getLogger(__name__) def _id_list(val): """将参数标准化为扁平整数列表,用于多选场景下 'in' 操作符 - 列表/元组 → 递归展平后返回列表(防止 [[20, 30]] 嵌套导致 SQL 类型错误) - 单个整数 → [val] - None/False/0/空字符串 → [](空列表,使 if partner_id 为 False,不追加条件) 单选时 _id_list(20) → [20],配合 'in' [20] 等价于原来的 = 20,数据一致 多选时 _id_list([20, 30]) → [20, 30],配合 'in' [20, 30] 正常 嵌套时 _id_list([[20, 30]]) → [20, 30],防止 psycopg2 把 list 转为 ARRAY 导致 SQL 类型错误 """ if isinstance(val, (list, tuple)): result = [] for item in val: # 递归展平嵌套的列表/元组 if isinstance(item, (list, tuple)): result.extend(_id_list(item)) elif item is not None and item is not False and item != 0 and item != '': result.append(item) return result if val is None or val is False or val == 0 or val == '': return [] return [val]