entcms模块: - 4个数据表(cms_content/cms_categories/cms_leads/cms_site_config) - 22个.dspy API(含公开API和data_filter) - 4个公开页面(首页/新闻/案例)+管理后台 - 完整营销站点CSS/JS(暗色主题/渐变/动画/响应式) - 云宝SVG线稿占位符 - RBAC权限配置 dingdingflow模块: - 2个数据表(dd_approvals/dd_approval_configs) - 10个.dspy API(含钉钉回调endpoint) - 钉钉API客户端(环境变量配置,开发模式mock) - 管理UI 文档: 架构设计/53条测试用例/开发日志
77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""dd_approvals list API with data_filter support"""
|
|
|
|
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 json.dumps(result, ensure_ascii=False, default=str)
|