feat: 自动提交 - 周二 2025/09/23 14:03:10.47
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
# 初始化动作执行器
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -3,12 +3,15 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<title>TSP智能助手 - 综合管理平台</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||
<link href="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.css" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/design-system.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/design-system.css') }}?v=1.0.0" rel="stylesheet">
|
||||
<link href="{{ url_for('static', filename='css/style.css') }}?v=1.0.0" rel="stylesheet">
|
||||
<style>
|
||||
|
||||
.sidebar {
|
||||
@@ -384,56 +387,56 @@
|
||||
控制面板
|
||||
</h5>
|
||||
<nav class="nav flex-column">
|
||||
<a class="nav-link active" href="#dashboard" data-tab="dashboard">
|
||||
<a class="nav-link active" href="#dashboard" data-tab="dashboard" data-i18n="sidebar-dashboard">
|
||||
<i class="fas fa-home"></i>
|
||||
仪表板
|
||||
</a>
|
||||
<a class="nav-link" href="#chat" data-tab="chat">
|
||||
<a class="nav-link" href="#chat" data-tab="chat" data-i18n="sidebar-conversations">
|
||||
<i class="fas fa-comments"></i>
|
||||
智能对话
|
||||
</a>
|
||||
<a class="nav-link" href="#agent" data-tab="agent">
|
||||
<a class="nav-link" href="#agent" data-tab="agent" data-i18n="sidebar-agent">
|
||||
<i class="fas fa-brain"></i>
|
||||
Agent管理
|
||||
</a>
|
||||
<a class="nav-link" href="#alerts" data-tab="alerts" data-i18n="sidebar-alerts">
|
||||
<i class="fas fa-bell"></i>
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
预警管理
|
||||
</a>
|
||||
<a class="nav-link" href="#knowledge" data-tab="knowledge">
|
||||
<a class="nav-link" href="#knowledge" data-tab="knowledge" data-i18n="sidebar-knowledge">
|
||||
<i class="fas fa-database"></i>
|
||||
知识库
|
||||
</a>
|
||||
<a class="nav-link" href="#workorders" data-tab="workorders">
|
||||
<a class="nav-link" href="#workorders" data-tab="workorders" data-i18n="sidebar-workorders">
|
||||
<i class="fas fa-tasks"></i>
|
||||
工单管理
|
||||
</a>
|
||||
<a class="nav-link" href="#feishu-sync" data-tab="feishu-sync">
|
||||
<a class="nav-link" href="#feishu-sync" data-tab="feishu-sync" data-i18n="sidebar-feishu-sync">
|
||||
<i class="fas fa-sync"></i>
|
||||
飞书同步
|
||||
</a>
|
||||
<a class="nav-link" href="#conversation-history" data-tab="conversation-history">
|
||||
<a class="nav-link" href="#conversation-history" data-tab="conversation-history" data-i18n="sidebar-conversation-history">
|
||||
<i class="fas fa-history"></i>
|
||||
对话历史
|
||||
</a>
|
||||
<a class="nav-link" href="#token-monitor" data-tab="token-monitor">
|
||||
<a class="nav-link" href="#token-monitor" data-tab="token-monitor" data-i18n="sidebar-token-monitor">
|
||||
<i class="fas fa-coins"></i>
|
||||
Token监控
|
||||
</a>
|
||||
<a class="nav-link" href="#ai-monitor" data-tab="ai-monitor">
|
||||
<a class="nav-link" href="#ai-monitor" data-tab="ai-monitor" data-i18n="sidebar-ai-monitor">
|
||||
<i class="fas fa-brain"></i>
|
||||
AI监控
|
||||
</a>
|
||||
<a class="nav-link" href="#system-optimizer" data-tab="system-optimizer">
|
||||
<a class="nav-link" href="#system-optimizer" data-tab="system-optimizer" data-i18n="sidebar-system-optimizer">
|
||||
<i class="fas fa-tools"></i>
|
||||
系统优化
|
||||
</a>
|
||||
<a class="nav-link" href="#analytics" data-tab="analytics">
|
||||
<a class="nav-link" href="#analytics" data-tab="analytics" data-i18n="sidebar-analytics">
|
||||
<i class="fas fa-chart-line"></i>
|
||||
数据分析
|
||||
</a>
|
||||
<a class="nav-link" href="#settings" data-tab="settings" data-i18n="sidebar-system">
|
||||
<i class="fas fa-cog"></i>
|
||||
<i class="fas fa-sliders-h"></i>
|
||||
系统设置
|
||||
</a>
|
||||
</nav>
|
||||
@@ -2469,6 +2472,6 @@
|
||||
<!-- 脚本 -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
|
||||
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/dashboard.js') }}?v=1.0.7"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user