diff --git a/src/agent/agent_assistant_core.py b/src/agent/agent_assistant_core.py index c6a9c38..d435826 100644 --- a/src/agent/agent_assistant_core.py +++ b/src/agent/agent_assistant_core.py @@ -37,8 +37,7 @@ class TSPAgentAssistantCore(TSPAssistant): # 初始化智能Agent self.intelligent_agent = IntelligentAgent( - llm_manager=self.llm_manager, - agent_core=self.agent_core + llm_client=self.llm_manager ) # 初始化动作执行器 diff --git a/src/core/query_optimizer.py b/src/core/query_optimizer.py index 561e44e..d2a1722 100644 --- a/src/core/query_optimizer.py +++ b/src/core/query_optimizer.py @@ -243,17 +243,13 @@ class QueryOptimizer: start_time_query = end_time - timedelta(days=days-1) # 批量查询所有需要的数据 - workorders = session.query(WorkOrder).filter( - WorkOrder.created_at >= start_time_query - ).all() + # 修改:查询所有工单,不限制时间范围 + workorders = session.query(WorkOrder).all() - alerts = session.query(Alert).filter( - Alert.created_at >= start_time_query - ).all() + # 修改:查询所有预警和对话,不限制时间范围 + alerts = session.query(Alert).all() - conversations = session.query(Conversation).filter( - Conversation.timestamp >= start_time_query - ).all() + conversations = session.query(Conversation).all() # 处理数据 analytics = self._process_analytics_data(workorders, alerts, conversations, days) diff --git a/src/web/app.py b/src/web/app.py index ca81493..b00cf24 100644 --- a/src/web/app.py +++ b/src/web/app.py @@ -11,7 +11,7 @@ import logging from datetime import datetime, timedelta from typing import Dict, Any -from flask import Flask, render_template, request, jsonify, send_from_directory +from flask import Flask, render_template, request, jsonify, send_from_directory, make_response from flask_cors import CORS # 添加项目根目录到Python路径 @@ -72,9 +72,12 @@ app.register_blueprint(core_bp) # 页面路由 @app.route('/') +@app.route('/dashboard') def index(): """主页 - 综合管理平台""" - return render_template('dashboard.html') + response = make_response(render_template('dashboard.html')) + response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' + return response @app.route('/alerts') def alerts(): @@ -214,9 +217,16 @@ def get_agent_status(): """获取Agent状态""" try: status = service_manager.get_agent_assistant().get_agent_status() - return jsonify(status) + return jsonify({"success": True, **status}) except Exception as e: - return jsonify({"error": str(e)}), 500 + # 返回默认状态,避免500错误 + return jsonify({ + "success": False, + "status": "inactive", + "active_goals": 0, + "available_tools": 0, + "error": "Agent服务暂时不可用" + }) @app.route('/api/agent/action-history') def get_agent_action_history(): @@ -366,7 +376,13 @@ def get_agent_tools_stats(): "performance": performance }) except Exception as e: - return jsonify({"error": str(e)}), 500 + # 返回默认工具列表,避免500错误 + return jsonify({ + "success": False, + "tools": [], + "performance": {}, + "error": "工具统计暂时不可用" + }) @app.route('/api/agent/tools/execute', methods=['POST']) def execute_agent_tool(): diff --git a/src/web/blueprints/alerts.py b/src/web/blueprints/alerts.py index 991d4ba..13dc250 100644 --- a/src/web/blueprints/alerts.py +++ b/src/web/blueprints/alerts.py @@ -30,14 +30,14 @@ def get_alerts(): # 构建查询 query = session.query(Alert) - # 应用过滤器 - if level_filter: - query = query.filter(Alert.level == level_filter) - if status_filter: - if status_filter == 'active': - query = query.filter(Alert.is_active == True) - elif status_filter == 'resolved': - query = query.filter(Alert.is_active == False) + # 应用过滤器 + if level_filter: + query = query.filter(Alert.level == level_filter) + if status_filter: + if status_filter == 'active': + query = query.filter(Alert.is_active == True) + elif status_filter == 'resolved': + query = query.filter(Alert.is_active == False) # 按创建时间倒序排列 query = query.order_by(Alert.created_at.desc()) diff --git a/src/web/blueprints/knowledge.py b/src/web/blueprints/knowledge.py index 094aade..5f64775 100644 --- a/src/web/blueprints/knowledge.py +++ b/src/web/blueprints/knowledge.py @@ -8,18 +8,11 @@ import os import tempfile import uuid from flask import Blueprint, request, jsonify -from src.main import TSPAssistant -from src.agent_assistant import TSPAgentAssistant +from src.web.service_manager import service_manager +from src.web.error_handlers import handle_api_errors, create_error_response, create_success_response knowledge_bp = Blueprint('knowledge', __name__, url_prefix='/api/knowledge') -def get_assistant(): - """获取TSP助手实例(懒加载)""" - global _assistant - if '_assistant' not in globals(): - _assistant = TSPAssistant() - return _assistant - def get_agent_assistant(): """获取Agent助手实例(懒加载)""" global _agent_assistant @@ -107,7 +100,7 @@ def search_knowledge(): return jsonify([]) # 直接调用知识库管理器的搜索方法 - assistant = get_assistant() + assistant = service_manager.get_assistant() results = assistant.knowledge_manager.search_knowledge(query, top_k=5) logger.info(f"搜索结果数量: {len(results)}") return jsonify(results) @@ -122,7 +115,7 @@ def add_knowledge(): """添加知识库条目""" try: data = request.get_json() - success = get_assistant().knowledge_manager.add_knowledge_entry( + success = service_manager.get_assistant().knowledge_manager.add_knowledge_entry( question=data['question'], answer=data['answer'], category=data['category'], @@ -136,7 +129,7 @@ def add_knowledge(): def get_knowledge_stats(): """获取知识库统计""" try: - stats = get_assistant().knowledge_manager.get_knowledge_stats() + stats = service_manager.get_assistant().knowledge_manager.get_knowledge_stats() return jsonify(stats) except Exception as e: return jsonify({"error": str(e)}), 500 @@ -190,7 +183,7 @@ def upload_knowledge_file(): def delete_knowledge(knowledge_id): """删除知识库条目""" try: - success = get_assistant().knowledge_manager.delete_knowledge_entry(knowledge_id) + success = service_manager.get_assistant().knowledge_manager.delete_knowledge_entry(knowledge_id) return jsonify({"success": success, "message": "删除成功" if success else "删除失败"}) except Exception as e: return jsonify({"error": str(e)}), 500 @@ -201,7 +194,7 @@ def verify_knowledge(knowledge_id): try: data = request.get_json() or {} verified_by = data.get('verified_by', 'admin') - success = get_assistant().knowledge_manager.verify_knowledge_entry(knowledge_id, verified_by) + success = service_manager.get_assistant().knowledge_manager.verify_knowledge_entry(knowledge_id, verified_by) return jsonify({"success": success, "message": "验证成功" if success else "验证失败"}) except Exception as e: return jsonify({"error": str(e)}), 500 @@ -210,7 +203,7 @@ def verify_knowledge(knowledge_id): def unverify_knowledge(knowledge_id): """取消验证知识库条目""" try: - success = get_assistant().knowledge_manager.unverify_knowledge_entry(knowledge_id) + success = service_manager.get_assistant().knowledge_manager.unverify_knowledge_entry(knowledge_id) return jsonify({"success": success, "message": "取消验证成功" if success else "取消验证失败"}) except Exception as e: return jsonify({"error": str(e)}), 500 diff --git a/src/web/blueprints/workorders.py b/src/web/blueprints/workorders.py index 2e6dc36..350fe7f 100644 --- a/src/web/blueprints/workorders.py +++ b/src/web/blueprints/workorders.py @@ -42,6 +42,7 @@ from src.main import TSPAssistant from src.core.database import db_manager from src.core.models import WorkOrder, Conversation, WorkOrderSuggestion, KnowledgeEntry from src.core.query_optimizer import query_optimizer +from src.web.service_manager import service_manager workorders_bp = Blueprint('workorders', __name__, url_prefix='/api/workorders') @@ -321,7 +322,7 @@ def generate_workorder_ai_suggestion(workorder_id): rec.ai_suggestion = suggestion rec.updated_at = datetime.now() session.commit() - return jsonify({"success": True, "ai_suggestion": suggestion}) + return jsonify({"success": True, "suggestion": suggestion}) except Exception as e: return jsonify({"error": str(e)}), 500 diff --git a/src/web/static/js/dashboard.js b/src/web/static/js/dashboard.js index 01e9445..e76aeff 100644 --- a/src/web/static/js/dashboard.js +++ b/src/web/static/js/dashboard.js @@ -19,6 +19,10 @@ const translations = { 'sidebar-knowledge': '知识库', 'sidebar-analytics': '数据分析', 'sidebar-feishu-sync': '飞书同步', + 'sidebar-conversation-history': '对话历史', + 'sidebar-token-monitor': 'Token监控', + 'sidebar-ai-monitor': 'AI监控', + 'sidebar-system-optimizer': '系统优化', 'sidebar-system': '系统设置', // 预警管理页面 @@ -60,6 +64,10 @@ const translations = { 'sidebar-knowledge': 'Knowledge Base', 'sidebar-analytics': 'Analytics', 'sidebar-feishu-sync': 'Feishu Sync', + 'sidebar-conversation-history': 'Conversation History', + 'sidebar-token-monitor': 'Token Monitor', + 'sidebar-ai-monitor': 'AI Monitor', + 'sidebar-system-optimizer': 'System Optimizer', 'sidebar-system': 'System Settings', // Alert Management page @@ -109,7 +117,19 @@ function updatePageLanguage(lang) { elements.forEach(element => { const key = element.getAttribute('data-i18n'); if (t[key]) { - element.textContent = t[key]; + // 检查元素是否包含图标(i标签) + const icon = element.querySelector('i'); + if (icon) { + // 如果包含图标,只更新文本部分 + const textNodes = Array.from(element.childNodes).filter(node => + node.nodeType === Node.TEXT_NODE || (node.nodeType === Node.ELEMENT_NODE && node.tagName !== 'I') + ); + // 保留图标,更新其他文本内容 + element.innerHTML = icon.outerHTML + ' ' + t[key]; + } else { + // 如果没有图标,直接更新文本内容 + element.textContent = t[key]; + } } }); @@ -129,7 +149,13 @@ function updatePageLanguage(lang) { if (currentTab) { const tabKey = currentTab.getAttribute('data-i18n'); if (tabKey && t[tabKey]) { - currentTabTitle.textContent = t[tabKey]; + // 检查当前标签是否包含图标 + const icon = currentTab.querySelector('i'); + if (icon) { + currentTabTitle.innerHTML = icon.outerHTML + ' ' + t[tabKey]; + } else { + currentTabTitle.textContent = t[tabKey]; + } } } } @@ -194,7 +220,7 @@ class TSPDashboard { if (data.success) { if (textarea) { - textarea.value = data.ai_suggestion || ''; + textarea.value = data.suggestion || ''; textarea.classList.remove('ai-loading'); textarea.classList.add('success-animation'); @@ -703,15 +729,15 @@ class TSPDashboard { } startAutoRefresh() { - // 每15秒刷新健康状态(减少 /api/health 日志) + // 每30秒刷新健康状态(减少重复请求) this.refreshIntervals.health = setInterval(() => { this.loadHealth(); - }, 15000); + }, 30000); - // 每10秒刷新当前标签页数据 + // 每30秒刷新当前标签页数据(减少重复请求) this.refreshIntervals.currentTab = setInterval(() => { this.refreshCurrentTab(); - }, 10000); + }, 30000); } refreshCurrentTab() { @@ -815,8 +841,8 @@ class TSPDashboard { // 更新统计卡片 document.getElementById('total-sessions').textContent = sessions.sessions?.length || 0; - document.getElementById('total-alerts').textContent = alerts.length || 0; - document.getElementById('total-workorders').textContent = workorders.filter(w => w.status === 'open').length || 0; + document.getElementById('total-alerts').textContent = alerts.alerts?.length || 0; + document.getElementById('total-workorders').textContent = workorders.workorders?.filter(w => w.status === 'open').length || 0; document.getElementById('knowledge-count').textContent = knowledge.total_entries || 0; // 更新知识库详细统计 @@ -832,6 +858,9 @@ class TSPDashboard { // 更新系统健康状态 await this.updateSystemHealth(); + + // 加载分析数据并更新统计卡片 + await this.loadAnalytics(); } catch (error) { console.error('加载仪表板数据失败:', error); @@ -3782,11 +3811,13 @@ class TSPDashboard { // 更新工单统计 const total = data.workorders?.total || 0; const open = data.workorders?.open || 0; + const inProgress = data.workorders?.in_progress || 0; const resolved = data.workorders?.resolved || 0; const avgSatisfaction = data.satisfaction?.average || 0; document.getElementById('totalWorkorders').textContent = total; document.getElementById('openWorkorders').textContent = open; + document.getElementById('workorders-progress').textContent = inProgress; document.getElementById('resolvedWorkorders').textContent = resolved; document.getElementById('avgSatisfaction').textContent = avgSatisfaction.toFixed(1); diff --git a/src/web/templates/dashboard.html b/src/web/templates/dashboard.html index 7221cb8..cdc0fc1 100644 --- a/src/web/templates/dashboard.html +++ b/src/web/templates/dashboard.html @@ -3,12 +3,15 @@ + + + TSP智能助手 - 综合管理平台 - - + +