170 lines
4.9 KiB
Python
170 lines
4.9 KiB
Python
"""
|
||
验证树状结构更新结果
|
||
"""
|
||
import os
|
||
import json
|
||
import pymysql
|
||
from typing import Dict, List
|
||
|
||
# 数据库连接配置
|
||
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 print_tree_structure(conn):
|
||
"""打印树状结构"""
|
||
cursor = conn.cursor(pymysql.cursors.DictCursor)
|
||
|
||
sql = """
|
||
SELECT id, name, parent_id, template_code, input_data, state
|
||
FROM f_polic_file_config
|
||
WHERE tenant_id = %s
|
||
ORDER BY parent_id, name
|
||
"""
|
||
cursor.execute(sql, (TENANT_ID,))
|
||
configs = cursor.fetchall()
|
||
|
||
# 构建ID到配置的映射
|
||
id_to_config = {config['id']: config for config in configs}
|
||
|
||
# 找出根节点(parent_id为NULL)
|
||
root_nodes = [config for config in configs if config.get('parent_id') is None]
|
||
|
||
def print_node(config, indent=0, visited=None):
|
||
"""递归打印节点"""
|
||
if visited is None:
|
||
visited = set()
|
||
|
||
if config['id'] in visited:
|
||
return
|
||
|
||
visited.add(config['id'])
|
||
|
||
prefix = " " * indent
|
||
parent_info = ""
|
||
if config.get('parent_id'):
|
||
parent_name = id_to_config.get(config['parent_id'], {}).get('name', f"ID:{config['parent_id']}")
|
||
parent_info = f" [父: {parent_name}]"
|
||
|
||
template_code = config.get('template_code')
|
||
if not template_code and config.get('input_data'):
|
||
try:
|
||
input_data = json.loads(config['input_data']) if isinstance(config['input_data'], str) else config['input_data']
|
||
if isinstance(input_data, dict):
|
||
template_code = input_data.get('template_code')
|
||
except:
|
||
pass
|
||
|
||
template_info = f" [code: {template_code}]" if template_code else ""
|
||
state_info = " [启用]" if config.get('state') == 1 else " [未启用]"
|
||
|
||
print(f"{prefix}├─ {config['name']}{parent_info}{template_info}{state_info}")
|
||
|
||
# 打印子节点
|
||
children = [c for c in configs if c.get('parent_id') == config['id']]
|
||
for i, child in enumerate(sorted(children, key=lambda x: x['name'])):
|
||
is_last = i == len(children) - 1
|
||
if is_last:
|
||
print_node(child, indent + 1, visited)
|
||
else:
|
||
print_node(child, indent + 1, visited)
|
||
|
||
print("="*80)
|
||
print("树状结构")
|
||
print("="*80)
|
||
|
||
for root in sorted(root_nodes, key=lambda x: x['name']):
|
||
print_node(root)
|
||
print()
|
||
|
||
# 统计信息
|
||
print("="*80)
|
||
print("统计信息")
|
||
print("="*80)
|
||
print(f"总记录数: {len(configs)}")
|
||
print(f"根节点数: {len(root_nodes)}")
|
||
print(f"有父节点的记录: {len([c for c in configs if c.get('parent_id')])}")
|
||
print(f"无父节点的记录: {len([c for c in configs if not c.get('parent_id')])}")
|
||
|
||
cursor.close()
|
||
|
||
|
||
def verify_parent_relationships(conn):
|
||
"""验证父子关系"""
|
||
cursor = conn.cursor(pymysql.cursors.DictCursor)
|
||
|
||
sql = """
|
||
SELECT id, name, parent_id
|
||
FROM f_polic_file_config
|
||
WHERE tenant_id = %s AND parent_id IS NOT NULL
|
||
"""
|
||
cursor.execute(sql, (TENANT_ID,))
|
||
configs = cursor.fetchall()
|
||
|
||
print("\n" + "="*80)
|
||
print("验证父子关系")
|
||
print("="*80)
|
||
|
||
errors = []
|
||
for config in configs:
|
||
parent_id = config['parent_id']
|
||
check_sql = """
|
||
SELECT id, name FROM f_polic_file_config
|
||
WHERE id = %s AND tenant_id = %s
|
||
"""
|
||
cursor.execute(check_sql, (parent_id, TENANT_ID))
|
||
parent = cursor.fetchone()
|
||
|
||
if not parent:
|
||
errors.append({
|
||
'child': config['name'],
|
||
'child_id': config['id'],
|
||
'parent_id': parent_id,
|
||
'error': '父节点不存在'
|
||
})
|
||
|
||
if errors:
|
||
print(f"\n✗ 发现 {len(errors)} 个错误:")
|
||
for error in errors:
|
||
print(f" - {error['child']} (ID: {error['child_id']})")
|
||
print(f" 父节点ID {error['parent_id']} 不存在")
|
||
else:
|
||
print("\n✓ 所有父子关系验证通过")
|
||
|
||
cursor.close()
|
||
return len(errors) == 0
|
||
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("="*80)
|
||
print("验证树状结构")
|
||
print("="*80)
|
||
|
||
try:
|
||
conn = pymysql.connect(**DB_CONFIG)
|
||
print("✓ 数据库连接成功\n")
|
||
|
||
print_tree_structure(conn)
|
||
verify_parent_relationships(conn)
|
||
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"✗ 错误: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|
||
|