result = {'success': False, 'rows': [], 'total': 0} try: dbname = get_module_dbname('dingdingflow') async with DBPools().sqlorContext(dbname) as sor: # Build WHERE clause from data_filter or direct params where_clauses = [] where_ns = {} # Support data_filter from CRUD search popup data_filter_str = params_kw.get('data_filter', '') if data_filter_str: # Individual filter values passed alongside data_filter status_filter = params_kw.get('status_filter', '') biz_type_filter = params_kw.get('biz_type_filter', '') title_filter = params_kw.get('title_filter', '') if status_filter: where_clauses.append("status=${status_filter}$") where_ns['status_filter'] = status_filter if biz_type_filter: where_clauses.append("biz_type=${biz_type_filter}$") where_ns['biz_type_filter'] = biz_type_filter if title_filter: where_clauses.append("title LIKE ${title_filter}$") where_ns['title_filter'] = f'%{title_filter}%' else: # Direct param filtering status = params_kw.get('status', '') if status: where_clauses.append("status=${status}$") where_ns['status'] = status biz_type = params_kw.get('biz_type', '') if biz_type: where_clauses.append("biz_type=${biz_type}$") where_ns['biz_type'] = biz_type where_sql = " AND ".join(where_clauses) where_prefix = " WHERE " if where_clauses else "" # Count query count_sql = "SELECT count(*) rcnt FROM dd_approvals" + where_prefix + where_sql count_rows = await sor.sqlExe(count_sql, where_ns) total = 0 if count_rows and len(count_rows) > 0: r = count_rows[0] total = getattr(r, 'rcnt', 0) if total > 0: ns = { 'page': int(params_kw.get('page', 1)), 'rows': int(params_kw.get('rows', 20)), 'sort': params_kw.get('sort', 'created_at desc') } sql = "SELECT id, org_id, biz_type, biz_id, title, applicant_id, approver_id, dingtalk_instance_id, status, comment, created_at, completed_at FROM dd_approvals" + where_prefix + where_sql query_ns = dict(list(ns.items()) + list(where_ns.items())) rows = await sor.sqlExe(sql, query_ns) if isinstance(rows, dict): result['rows'] = rows.get('rows', []) result['total'] = rows.get('total', total) elif rows: result['rows'] = [dict(r) if hasattr(r, 'keys') else r for r in rows] result['total'] = total else: result['total'] = 0 result['success'] = True except Exception as e: result['error'] = str(e) return result