ai-business-write/query_template_fields_example.py

319 lines
9.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
模板字段关联查询示例脚本
演示如何查询模板关联的输入和输出字段
"""
import pymysql
import os
from typing import Dict, List, Optional
# 数据库连接配置
DB_CONFIG = {
'host': os.getenv('DB_HOST', '152.136.177.240'),
'port': int(os.getenv('DB_PORT', 5012)),
'user': os.getenv('DB_USER', 'finyx'),
'password': os.getenv('DB_PASSWORD', '6QsGK6MpePZDE57Z'),
'database': os.getenv('DB_NAME', 'finyx'),
'charset': 'utf8mb4'
}
TENANT_ID = 615873064429507639
def get_template_fields_by_name(template_name: str) -> Optional[Dict]:
"""
根据模板名称获取关联的字段
Args:
template_name: 模板名称,如 '初步核实审批表'
Returns:
dict: 包含 template_id, template_name, input_fields 和 output_fields 的字典
"""
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor(pymysql.cursors.DictCursor)
try:
sql = """
SELECT
fc.id AS template_id,
fc.name AS template_name,
f.id AS field_id,
f.name AS field_name,
f.filed_code AS field_code,
f.field_type
FROM f_polic_file_config fc
INNER JOIN f_polic_file_field fff ON fc.id = fff.file_id
INNER JOIN f_polic_field f ON fff.filed_id = f.id
WHERE fc.tenant_id = %s
AND fc.name = %s
AND fc.state = 1
AND fff.state = 1
AND f.state = 1
ORDER BY f.field_type, f.name
"""
cursor.execute(sql, (TENANT_ID, template_name))
rows = cursor.fetchall()
if not rows:
return None
result = {
'template_id': rows[0]['template_id'],
'template_name': rows[0]['template_name'],
'input_fields': [],
'output_fields': []
}
for row in rows:
field_info = {
'id': row['field_id'],
'name': row['field_name'],
'field_code': row['field_code'],
'field_type': row['field_type']
}
if row['field_type'] == 1:
result['input_fields'].append(field_info)
elif row['field_type'] == 2:
result['output_fields'].append(field_info)
return result
finally:
cursor.close()
conn.close()
def get_template_fields_by_id(template_id: int) -> Optional[Dict]:
"""
根据模板ID获取关联的字段
Args:
template_id: 模板ID
Returns:
dict: 包含 template_id, template_name, input_fields 和 output_fields 的字典
"""
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor(pymysql.cursors.DictCursor)
try:
# 先获取模板名称
sql_template = """
SELECT id, name
FROM f_polic_file_config
WHERE id = %s AND tenant_id = %s AND state = 1
"""
cursor.execute(sql_template, (template_id, TENANT_ID))
template = cursor.fetchone()
if not template:
return None
# 获取字段
sql_fields = """
SELECT
f.id AS field_id,
f.name AS field_name,
f.filed_code AS field_code,
f.field_type
FROM f_polic_file_field fff
INNER JOIN f_polic_field f ON fff.filed_id = f.id
WHERE fff.file_id = %s
AND fff.tenant_id = %s
AND fff.state = 1
AND f.state = 1
ORDER BY f.field_type, f.name
"""
cursor.execute(sql_fields, (template_id, TENANT_ID))
rows = cursor.fetchall()
result = {
'template_id': template['id'],
'template_name': template['name'],
'input_fields': [],
'output_fields': []
}
for row in rows:
field_info = {
'id': row['field_id'],
'name': row['field_name'],
'field_code': row['field_code'],
'field_type': row['field_type']
}
if row['field_type'] == 1:
result['input_fields'].append(field_info)
elif row['field_type'] == 2:
result['output_fields'].append(field_info)
return result
finally:
cursor.close()
conn.close()
def get_all_templates_with_field_stats() -> List[Dict]:
"""
获取所有模板及其字段统计信息
Returns:
list: 模板列表,每个模板包含字段统计
"""
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor(pymysql.cursors.DictCursor)
try:
sql = """
SELECT
fc.id AS template_id,
fc.name AS template_name,
COUNT(DISTINCT CASE WHEN f.field_type = 1 THEN f.id END) AS input_field_count,
COUNT(DISTINCT CASE WHEN f.field_type = 2 THEN f.id END) AS output_field_count,
COUNT(DISTINCT f.id) AS total_field_count
FROM f_polic_file_config fc
LEFT JOIN f_polic_file_field fff ON fc.id = fff.file_id AND fff.state = 1
LEFT JOIN f_polic_field f ON fff.filed_id = f.id AND f.state = 1
WHERE fc.tenant_id = %s
AND fc.state = 1
GROUP BY fc.id, fc.name
ORDER BY fc.name
"""
cursor.execute(sql, (TENANT_ID,))
templates = cursor.fetchall()
return [
{
'template_id': t['template_id'],
'template_name': t['template_name'],
'input_field_count': t['input_field_count'] or 0,
'output_field_count': t['output_field_count'] or 0,
'total_field_count': t['total_field_count'] or 0
}
for t in templates
]
finally:
cursor.close()
conn.close()
def find_templates_using_field(field_code: str) -> List[Dict]:
"""
查找使用特定字段的所有模板
Args:
field_code: 字段编码,如 'target_name'
Returns:
list: 使用该字段的模板列表
"""
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor(pymysql.cursors.DictCursor)
try:
sql = """
SELECT DISTINCT
fc.id AS template_id,
fc.name AS template_name
FROM f_polic_file_config fc
INNER JOIN f_polic_file_field fff ON fc.id = fff.file_id
INNER JOIN f_polic_field f ON fff.filed_id = f.id
WHERE fc.tenant_id = %s
AND f.tenant_id = %s
AND f.filed_code = %s
AND fc.state = 1
AND fff.state = 1
AND f.state = 1
ORDER BY fc.name
"""
cursor.execute(sql, (TENANT_ID, TENANT_ID, field_code))
templates = cursor.fetchall()
return [
{
'template_id': t['template_id'],
'template_name': t['template_name']
}
for t in templates
]
finally:
cursor.close()
conn.close()
def print_template_fields(result: Dict):
"""打印模板字段信息"""
if not result:
print("未找到模板")
return
print("="*80)
print(f"模板: {result['template_name']} (ID: {result['template_id']})")
print("="*80)
print(f"\n输入字段 ({len(result['input_fields'])} 个):")
if result['input_fields']:
for field in result['input_fields']:
print(f" - {field['name']} ({field['field_code']})")
else:
print(" (无)")
print(f"\n输出字段 ({len(result['output_fields'])} 个):")
if result['output_fields']:
for field in result['output_fields']:
print(f" - {field['name']} ({field['field_code']})")
else:
print(" (无)")
def main():
"""主函数 - 演示各种查询方式"""
print("="*80)
print("模板字段关联查询示例")
print("="*80)
# 示例1: 根据模板名称查询
print("\n【示例1】根据模板名称查询字段")
print("-" * 80)
# 注意:模板名称需要完全匹配,如 "2.初步核实审批表XXX"
result = get_template_fields_by_name('2.初步核实审批表XXX')
if not result:
# 尝试其他可能的名称
result = get_template_fields_by_name('初步核实审批表')
print_template_fields(result)
# 示例2: 获取所有模板的字段统计
print("\n\n【示例2】获取所有模板的字段统计")
print("-" * 80)
templates = get_all_templates_with_field_stats()
print(f"共找到 {len(templates)} 个模板:\n")
for template in templates[:5]: # 只显示前5个
print(f" {template['template_name']} (ID: {template['template_id']})")
print(f" 输入字段: {template['input_field_count']}")
print(f" 输出字段: {template['output_field_count']}")
print(f" 总字段数: {template['total_field_count']}\n")
if len(templates) > 5:
print(f" ... 还有 {len(templates) - 5} 个模板")
# 示例3: 查找使用特定字段的模板
print("\n\n【示例3】查找使用 'target_name' 字段的模板")
print("-" * 80)
templates_using_field = find_templates_using_field('target_name')
print(f"共找到 {len(templates_using_field)} 个模板使用该字段:")
for template in templates_using_field:
print(f" - {template['template_name']} (ID: {template['template_id']})")
print("\n" + "="*80)
print("查询完成")
print("="*80)
if __name__ == '__main__':
main()