feat: 自动提交 - 周二 2025/09/23 14:03:10.47

This commit is contained in:
赵杰
2025-09-23 14:03:10 +01:00
parent 4da97d600a
commit 6b0c03439f
8 changed files with 104 additions and 65 deletions

View File

@@ -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
)
# 初始化动作执行器

View File

@@ -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)

View File

@@ -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():

View File

@@ -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())

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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>