Files
java-template/test_org_optimization_demo.py
T

495 lines
20 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.
"""
组织架构优化服务使用示例和性能测试
演示如何使用基于闭包表的组织架构优化服务
包含完整的使用示例和性能对比测试
作者: Claude Code Assistant
版本: 1.0.0
"""
import sys
import os
import time
import json
from typing import Dict, List
# 添加项目路径
sys.path.append('/Users/bg/work/codes/93/yunxiang/ljwx-bigscreen/bigscreen')
from bigScreen.org_optimized_service import get_optimized_org_service
from bigScreen.closure_table_maintenance import get_closure_maintenance_service
from bigScreen.models import db, OrgInfo, OrgClosure, UserInfo, UserOrg
from sqlalchemy import text
class OrgOptimizationDemo:
"""组织架构优化演示类"""
def __init__(self):
self.org_service = get_optimized_org_service()
self.maintenance_service = get_closure_maintenance_service()
def run_all_demos(self):
"""运行所有演示"""
print("=" * 80)
print("🚀 组织架构优化服务演示开始")
print("=" * 80)
# 1. 基本功能演示
self.demo_basic_operations()
# 2. 性能优化演示
self.demo_performance_comparison()
# 3. 管理员缓存演示
self.demo_manager_cache()
# 4. 闭包表维护演示
self.demo_closure_maintenance()
# 5. 一致性检查演示
self.demo_consistency_validation()
# 6. 统一服务聚合器集成演示
self.demo_unified_aggregator_integration()
print("\n" + "=" * 80)
print("✅ 组织架构优化服务演示完成")
print("=" * 80)
def demo_basic_operations(self):
"""基本操作演示"""
print("\n📋 1. 基本操作演示")
print("-" * 50)
# 获取组织树
print("🌳 获取组织架构树...")
start_time = time.time()
tree_result = self.org_service.get_org_tree_optimized(
customer_id=0,
max_depth=3,
include_users=True
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
print(f" 组织数量: {tree_result['data']['stats']['total_orgs']}")
print(f" 用户数量: {tree_result['data']['stats']['total_users']}")
print(f" 缓存状态: {'命中' if tree_result.get('performance', {}).get('cached') else '未命中'}")
# 获取后代组织
print("\n🔗 获取后代组织...")
start_time = time.time()
descendants = self.org_service.get_org_descendants_optimized(
org_id=1939964806110937090,
customer_id=0,
max_depth=2
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
print(f" 后代组织: {len(descendants)}个")
# 获取祖先组织
print("\n⬆️ 获取祖先组织...")
start_time = time.time()
ancestors = self.org_service.get_org_ancestors_optimized(
org_id=1957457455646371841,
customer_id=0
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
print(f" 祖先组织: {len(ancestors)}个")
if ancestors:
print(f" 层级路径: {' -> '.join([a['name'] for a in ancestors])}")
# 获取组织用户
print("\n👥 获取组织用户...")
start_time = time.time()
users_result = self.org_service.get_org_users_optimized(
org_id=1940374479725170690,
customer_id=0,
include_descendants=True,
page=1,
page_size=20
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
if users_result['success']:
print(f" 用户数量: {users_result['data']['pagination']['total']}")
print(f" 包含组织: {users_result['data']['organization_info']['total_orgs_searched']}个")
def demo_performance_comparison(self):
"""性能对比演示"""
print("\n⚡ 2. 性能优化对比演示")
print("-" * 50)
# 传统递归查询 vs 闭包表查询
org_id = 1939964806110937090
customer_id = 0
print("🐌 传统递归查询(模拟)...")
start_time = time.time()
traditional_result = self._traditional_hierarchy_query(org_id, customer_id)
traditional_time = time.time() - start_time
print(f" 响应时间: {traditional_time:.3f}s")
print(f" 查询次数: 多次递归查询")
print("\n🚀 闭包表优化查询...")
start_time = time.time()
optimized_result = self.org_service.get_org_descendants_optimized(org_id, customer_id)
optimized_time = time.time() - start_time
print(f" 响应时间: {optimized_time:.3f}s")
print(f" 查询次数: 单次JOIN查询")
if traditional_time > 0:
improvement = ((traditional_time - optimized_time) / traditional_time) * 100
print(f"\n💡 性能提升: {improvement:.1f}% ({traditional_time/optimized_time:.1f}x 更快)")
# 批量用户查询性能测试
print("\n👥 批量用户查询性能测试...")
org_ids = [1939964806110937090, 1940374479725170690, 1955920989166800898]
start_time = time.time()
total_users = 0
for org_id in org_ids:
users_result = self.org_service.get_org_users_optimized(org_id, customer_id, page_size=50)
if users_result['success']:
total_users += users_result['data']['pagination']['total']
batch_time = time.time() - start_time
print(f" 批量查询时间: {batch_time:.3f}s")
print(f" 总用户数: {total_users}")
print(f" 平均每个组织: {batch_time/len(org_ids):.3f}s")
def demo_manager_cache(self):
"""管理员缓存演示"""
print("\n👨‍💼 3. 管理员缓存演示")
print("-" * 50)
# 重建管理员缓存
print("🔄 重建管理员缓存...")
start_time = time.time()
rebuild_result = self.org_service.rebuild_org_manager_cache(customer_id=0)
print(f" 重建时间: {time.time() - start_time:.3f}s")
if rebuild_result['success']:
print(f" 管理员总数: {rebuild_result['data']['total_managers']}")
# 查询组织管理员
print("\n🔍 查询组织管理员...")
start_time = time.time()
managers = self.org_service.get_org_managers_optimized(
org_id=1939964806110937090,
customer_id=0,
role_types=['manager', 'director', 'admin']
)
print(f" 查询时间: {time.time() - start_time:.3f}s")
print(f" 管理员数量: {len(managers)}")
for manager in managers[:3]: # 显示前3个
print(f" - {manager['user_name']} ({manager['role_type']}) - Level {manager['org_level']}")
def demo_closure_maintenance(self):
"""闭包表维护演示"""
print("\n🛠️ 4. 闭包表维护演示")
print("-" * 50)
# 添加新组织
print("➕ 添加新组织...")
new_org_data = {
'name': f'测试部门_{int(time.time())}',
'parent_id': 1940374479725170690,
'customer_id': 0,
'code': f'TEST_{int(time.time())}',
'description': '演示用测试部门',
'create_user': 'demo_user',
'create_user_id': 1
}
start_time = time.time()
add_result = self.maintenance_service.add_organization_with_closure(new_org_data)
print(f" 添加时间: {time.time() - start_time:.3f}s")
if add_result['success']:
new_org_id = add_result['data']['org_id']
print(f" 新组织ID: {new_org_id}")
print(f" 组织层级: {add_result['data']['level']}")
# 移动组织
print(f"\n🔄 移动组织 {new_org_id}...")
start_time = time.time()
move_result = self.maintenance_service.move_organization_with_closure(
org_id=new_org_id,
new_parent_id=1939964806110937090,
customer_id=0,
operator_info={'user_name': 'demo_user', 'user_id': 1}
)
print(f" 移动时间: {time.time() - start_time:.3f}s")
if move_result['success']:
print(f" 新层级: {move_result['data']['new_level']}")
print(f" 影响组织: {move_result['data']['affected_orgs']}个")
# 删除组织
print(f"\n🗑️ 删除组织 {new_org_id}...")
start_time = time.time()
delete_result = self.maintenance_service.delete_organization_with_closure(
org_id=new_org_id,
customer_id=0,
operator_info={'user_name': 'demo_user', 'user_id': 1}
)
print(f" 删除时间: {time.time() - start_time:.3f}s")
if delete_result['success']:
print(f" 删除组织: {delete_result['data']['deleted_count']}个")
def demo_consistency_validation(self):
"""一致性检查演示"""
print("\n🔍 5. 一致性检查演示")
print("-" * 50)
# 验证闭包表一致性
print("✅ 验证闭包表一致性...")
start_time = time.time()
validation_result = self.maintenance_service.validate_closure_consistency(customer_id=0)
print(f" 检查时间: {time.time() - start_time:.3f}s")
if validation_result['success']:
is_consistent = validation_result['data']['is_consistent']
total_issues = validation_result['data']['total_issues']
stats = validation_result['data']['statistics']
print(f" 一致性状态: {'✅ 一致' if is_consistent else '❌ 不一致'}")
print(f" 问题数量: {total_issues}")
print(f" 组织总数: {stats['total_orgs']}")
print(f" 闭包记录: {stats['total_closures']}")
if not is_consistent:
print("\n 发现的问题:")
for issue in validation_result['data']['issues']:
print(f" - {issue['type']}: {issue['count']}个 - {issue['description']}")
# 重建闭包表(如果需要)
if not validation_result.get('data', {}).get('is_consistent', True):
print("\n🔄 重建闭包表...")
start_time = time.time()
rebuild_result = self.maintenance_service.rebuild_closure_table(customer_id=0)
print(f" 重建时间: {time.time() - start_time:.3f}s")
if rebuild_result['success']:
print(f" 处理组织: {rebuild_result['data']['total_orgs']}")
print(f" 生成闭包: {rebuild_result['data']['total_closure_records']}")
def demo_unified_aggregator_integration(self):
"""统一服务聚合器集成演示"""
print("\n🔗 6. 统一服务聚合器集成演示")
print("-" * 50)
# 导入统一服务聚合器
from bigScreen.unified_service_aggregator import (
get_org_tree_optimized_unified,
get_org_users_optimized_unified,
get_org_managers_optimized_unified,
rebuild_org_manager_cache_unified,
validate_closure_consistency_unified
)
print("🌐 通过统一接口获取组织树...")
start_time = time.time()
tree_result = get_org_tree_optimized_unified(
customer_id=0,
max_depth=2,
include_users=True
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
if tree_result['success']:
print(f" 组织数量: {tree_result['data']['stats']['total_orgs']}")
print(f" 用户数量: {tree_result['data']['stats']['total_users']}")
print("\n👥 通过统一接口获取部门用户...")
start_time = time.time()
users_result = get_org_users_optimized_unified(
org_id=1940374479725170690,
customer_id=0,
include_descendants=True,
page=1,
page_size=10
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
if users_result['success']:
print(f" 用户数量: {users_result['data']['pagination']['total']}")
print("\n👨‍💼 通过统一接口获取部门管理员...")
start_time = time.time()
managers = get_org_managers_optimized_unified(
org_id=1939964806110937090,
customer_id=0,
role_types=['manager', 'director']
)
print(f" 响应时间: {time.time() - start_time:.3f}s")
print(f" 管理员数量: {len(managers)}")
print("\n🔄 通过统一接口重建管理员缓存...")
start_time = time.time()
rebuild_result = rebuild_org_manager_cache_unified(customer_id=0)
print(f" 重建时间: {time.time() - start_time:.3f}s")
if rebuild_result['success']:
print(f" 管理员总数: {rebuild_result['data']['total_managers']}")
print("\n✅ 通过统一接口验证数据一致性...")
start_time = time.time()
validation_result = validate_closure_consistency_unified(customer_id=0)
print(f" 检查时间: {time.time() - start_time:.3f}s")
if validation_result['success']:
is_consistent = validation_result['data']['is_consistent']
print(f" 一致性状态: {'✅ 一致' if is_consistent else '❌ 不一致'}")
print(f" 问题数量: {validation_result['data']['total_issues']}")
print("\n💡 统一服务聚合器集成优势:")
print(" - 提供统一的访问接口,简化调用")
print(" - 自动服务发现和懒加载")
print(" - 统一的错误处理和性能监控")
print(" - 便于系统集成和维护")
def _traditional_hierarchy_query(self, org_id: int, customer_id: int) -> List[Dict]:
"""模拟传统递归查询(性能对比用)"""
# 这是一个简化的传统递归查询模拟
# 实际传统方式会有多次数据库查询
time.sleep(0.05) # 模拟多次查询的延迟
# 使用简单查询获取结果用于对比
query = text("""
SELECT id, parent_id, name, level
FROM sys_org_units
WHERE customer_id = :customer_id
AND is_deleted = 0
AND status = '1'
ORDER BY level, sort, id
""")
from bigScreen.models import db
results = db.session.execute(query, {
'customer_id': customer_id
}).fetchall()
return [{'id': r.id, 'name': r.name, 'level': r.level} for r in results]
def run_performance_benchmark():
"""运行性能基准测试"""
print("\n" + "=" * 80)
print("🏃‍♂️ 性能基准测试")
print("=" * 80)
org_service = get_optimized_org_service()
# 导入统一接口用于对比测试
from bigScreen.unified_service_aggregator import (
get_org_tree_optimized_unified,
get_org_users_optimized_unified,
get_org_managers_optimized_unified
)
# 测试场景 - 直接调用vs统一接口
test_scenarios = [
{
'name': '直接调用 - 获取组织树',
'func': lambda: org_service.get_org_tree_optimized(customer_id=0, include_users=True),
'expected_time': 0.1
},
{
'name': '统一接口 - 获取组织树',
'func': lambda: get_org_tree_optimized_unified(customer_id=0, include_users=True),
'expected_time': 0.12
},
{
'name': '直接调用 - 获取部门用户',
'func': lambda: org_service.get_org_users_optimized(1939964806110937090, 0, True, 1, 100),
'expected_time': 0.05
},
{
'name': '统一接口 - 获取部门用户',
'func': lambda: get_org_users_optimized_unified(1939964806110937090, 0, True, 1, 100),
'expected_time': 0.06
},
{
'name': '直接调用 - 获取组织层级',
'func': lambda: org_service.get_org_descendants_optimized(1939964806110937090, 0),
'expected_time': 0.02
},
{
'name': '直接调用 - 批量管理员查询',
'func': lambda: org_service.get_org_managers_optimized(1939964806110937090, 0),
'expected_time': 0.01
},
{
'name': '统一接口 - 批量管理员查询',
'func': lambda: get_org_managers_optimized_unified(1939964806110937090, 0),
'expected_time': 0.02
}
]
print(f"{'测试项目':<30} {'响应时间':<10} {'期望时间':<10} {'状态':<10} {'接口类型':<10}")
print("-" * 80)
direct_times = []
unified_times = []
for scenario in test_scenarios:
start_time = time.time()
try:
result = scenario['func']()
actual_time = time.time() - start_time
# 分类统计性能
if '直接调用' in scenario['name']:
direct_times.append(actual_time)
interface_type = "直接调用"
else:
unified_times.append(actual_time)
interface_type = "统一接口"
status = "✅ 通过" if actual_time <= scenario['expected_time'] else "⚠️ 超时"
print(f"{scenario['name']:<30} {actual_time:<10.3f} {scenario['expected_time']:<10.3f} {status:<10} {interface_type:<10}")
if hasattr(result, 'get') and result.get('success'):
cached = result.get('performance', {}).get('cached', False)
print(f"{' └─ 缓存状态':<30} {'命中' if cached else '未命中'}")
except Exception as e:
print(f"{scenario['name']:<30} {'ERROR':<10.3f} {scenario['expected_time']:<10.3f} {'❌ 失败':<10} {str(e)[:20]}")
# 性能对比分析
if direct_times and unified_times:
avg_direct = sum(direct_times) / len(direct_times)
avg_unified = sum(unified_times) / len(unified_times)
overhead = ((avg_unified - avg_direct) / avg_direct) * 100
print("\n" + "=" * 50)
print("📊 性能对比分析")
print("=" * 50)
print(f"直接调用平均响应时间: {avg_direct:.3f}s")
print(f"统一接口平均响应时间: {avg_unified:.3f}s")
print(f"统一接口性能开销: {overhead:.1f}%")
if overhead < 20:
print("✅ 统一接口性能开销在可接受范围内(< 20%)")
else:
print("⚠️ 统一接口性能开销较高,建议优化")
print("\n💡 性能优化总结:")
print("- 闭包表查询: O(1) vs 传统递归 O(n)")
print("- Redis缓存: 3-5分钟TTL,显著减少数据库访问")
print("- 批量查询: 减少N+1查询问题")
print("- 统一接口: 便于使用,性能开销可控")
def main():
"""主函数"""
try:
# 运行演示
demo = OrgOptimizationDemo()
demo.run_all_demos()
# 运行性能测试
run_performance_benchmark()
print("\n🎉 所有测试完成!")
except Exception as e:
print(f"\n❌ 测试过程中出现错误: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()