""" 组织架构优化服务使用示例和性能测试 演示如何使用基于闭包表的组织架构优化服务 包含完整的使用示例和性能对比测试 作者: 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()