`C&gG}4Hs9mk5*|)7nNc~8C>nZgW^U-3-=hQ}B#OGu;8owdumrw6clDx2bsQXk1
zGT*^UbJEm1Oo#ddp-}JEhhzEmgB+=dpi7dcqd_`_7WRSqHbQEvJ82Ojon>=}eld-y
zrs_e}uBWrhV@;>IdRb_Q?QKs1>hIe!>c7xx6!6eVjci!)u
zp8GrJo_pVUuiy8L95P-s7<52K|6fyk?|Z*7wt5`n9KZ%ZFbHwf&E|5WkB{@DrpQii
znk7=P&`wS*G`jm#G9OnRK)6&^Q4M%;OqdA(7*dhIigqPM7AUT|4^fz~uk@BBCnvhH2}RT$)tst~oe0@kYVq_B?W#h
zt=|uU0&bt0eCTzMhhEE$0^W)8dI-0cLCidpAD~-1V|V9{hy5xC%p+)ra3E%%naz1C
z`h+<<5ZSglSx=^P_QmaV{XXH45MGeiy{H%7=G&nc#bL-mnRZsUt)L#ZpE4+%^%cy{
zM0>;@8?EB@7f0@%K6?AB&+jCz+#Mdd_uXfAPJT&VuH3z=>rWowU~y~sK*zo=+1(il
zhn3D)S0wD-t8~Z;_HY?hXGB&q0#-Vrk#JkjBARcTvU_W!^Gzj|&vgIn`FkTHLAS@4
zF=6Gc9wi#vnGcVWTa`{h-MKFkRfxXoO8+DJXz$T$0I~vDTxn@VLNj4=4Q@ZPeaLkQ
zr)>VT&40tT`nqj($`(x9f(acZinenvCH2dwTxz%)Os)t~xhYDg+K#s+oy}Ku6sV-c
zP+ANnb24eLpX*KQFDX}Fjwj{-t3CTI=JL4OQC2KdG_NAoFX=!s(
z{12HBr9{i5Q5yYVWfR)4o}R&2E!X6Nv3jA&!HqR6q4qT=3UP4FWo<6yuT^u*_G_8F
zrlh%qA1_i<&v=QNdd5q6YX8WUgqD!1>P6^v5~|*{l#eZV(lN3sHrrDGdsGS7gJks)
zk^EBa4<3W=S?Xosf{M01z4N0M4kKCfr14{xnHk!!I^wh08|a%+K#(=;n)mK-a~Z7H
zYTz*Sl6Z|1X~?;n_2gEKTR2FQe}u@ds^#Pbt69KE3&%LJzrxPPAxW^X(~#amftW{UN==
z37%rP9z0{hXIS&8lM}^*
z!yZGfO(Nu{RZG>lpE^b#t>RGW0JSna?g``fspUb~N>!BoUAQs((BTAm?)l%%z072c
zTqsVAYJxjBf3dnYS=F2cs()_EsrgWEQPUHj1uyxyp+z{s@(hqa8t8IFY-~oy$d*Qr
TkYMhUWT3GKogY2lSb_cldzayT
diff --git a/src/web/app.py b/src/web/app.py
index b00cf24..a371851 100644
--- a/src/web/app.py
+++ b/src/web/app.py
@@ -115,9 +115,9 @@ def create_chat_session():
data = request.get_json()
user_id = data.get('user_id', 'anonymous')
work_order_id = data.get('work_order_id')
-
+
session_id = service_manager.get_chat_manager().create_session(user_id, work_order_id)
-
+
return jsonify({
"success": True,
"session_id": session_id,
@@ -133,10 +133,10 @@ def send_chat_message():
data = request.get_json()
session_id = data.get('session_id')
message = data.get('message')
-
+
if not session_id or not message:
return jsonify({"error": "缺少必要参数"}), 400
-
+
result = service_manager.get_chat_manager().process_message(session_id, message)
return jsonify(result)
except Exception as e:
@@ -164,10 +164,10 @@ def create_work_order():
description = data.get('description')
category = data.get('category', '技术问题')
priority = data.get('priority', 'medium')
-
+
if not session_id or not title or not description:
return jsonify({"error": "缺少必要参数"}), 400
-
+
result = service_manager.get_chat_manager().create_work_order(session_id, title, description, category, priority)
return jsonify(result)
except Exception as e:
@@ -281,7 +281,7 @@ def toggle_agent_mode():
enabled = data.get('enabled', True)
success = service_manager.get_agent_assistant().toggle_agent_mode(enabled)
return jsonify({
- "success": success,
+ "success": success,
"message": f"Agent模式已{'启用' if enabled else '禁用'}"
})
except Exception as e:
@@ -293,7 +293,7 @@ def start_agent_monitoring():
try:
success = service_manager.get_agent_assistant().start_proactive_monitoring()
return jsonify({
- "success": success,
+ "success": success,
"message": "Agent监控已启动" if success else "启动失败"
})
except Exception as e:
@@ -305,7 +305,7 @@ def stop_agent_monitoring():
try:
success = service_manager.get_agent_assistant().stop_proactive_monitoring()
return jsonify({
- "success": success,
+ "success": success,
"message": "Agent监控已停止" if success else "停止失败"
})
except Exception as e:
@@ -336,13 +336,13 @@ def agent_chat():
data = request.get_json()
message = data.get('message', '')
context = data.get('context', {})
-
+
if not message:
return jsonify({"error": "消息不能为空"}), 400
-
+
# 使用Agent助手处理消息
agent_assistant = service_manager.get_agent_assistant()
-
+
# 模拟Agent处理(实际应该调用真正的Agent处理逻辑)
import asyncio
result = asyncio.run(agent_assistant.process_message_agent(
@@ -351,7 +351,7 @@ def agent_chat():
work_order_id=None,
enable_proactive=True
))
-
+
return jsonify({
"success": True,
"response": result.get('response', 'Agent已处理您的请求'),
@@ -440,18 +440,18 @@ def export_analytics():
try:
# 生成Excel报告(使用数据库真实数据)
analytics = query_optimizer.get_analytics_optimized(30)
-
+
# 创建工作簿
from openpyxl import Workbook
from openpyxl.styles import Font
wb = Workbook()
ws = wb.active
ws.title = "分析报告"
-
+
# 添加标题
ws['A1'] = 'TSP智能助手分析报告'
ws['A1'].font = Font(size=16, bold=True)
-
+
# 添加工单统计
ws['A3'] = '工单统计'
ws['A3'].font = Font(bold=True)
@@ -461,15 +461,15 @@ def export_analytics():
ws['B5'] = analytics['workorders']['open']
ws['A6'] = '已解决'
ws['B6'] = analytics['workorders']['resolved']
-
+
# 保存文件
report_path = 'uploads/analytics_report.xlsx'
os.makedirs('uploads', exist_ok=True)
wb.save(report_path)
-
+
from flask import send_file
return send_file(report_path, as_attachment=True, download_name='analytics_report.xlsx')
-
+
except Exception as e:
return jsonify({"error": str(e)}), 500
@@ -484,7 +484,7 @@ def get_vehicle_data():
vehicle_vin = request.args.get('vehicle_vin')
data_type = request.args.get('data_type')
limit = request.args.get('limit', 10, type=int)
-
+
vehicle_mgr = service_manager.get_vehicle_manager()
if vehicle_vin:
data = vehicle_mgr.get_vehicle_data_by_vin(vehicle_vin, data_type, limit)
@@ -492,7 +492,7 @@ def get_vehicle_data():
data = vehicle_mgr.get_vehicle_data(vehicle_id, data_type, limit)
else:
data = vehicle_mgr.search_vehicle_data(limit=limit)
-
+
return jsonify(data)
except Exception as e:
return jsonify({"error": str(e)}), 500
@@ -560,10 +560,10 @@ def test_api_connection():
api_base_url = data.get('api_base_url', '')
api_key = data.get('api_key', '')
model_name = data.get('model_name', 'qwen-turbo')
-
+
# 这里可以调用LLM客户端进行连接测试
# 暂时返回模拟结果
-
+
return jsonify({
"success": True,
"message": f"API连接测试成功 - {api_provider}",
@@ -579,7 +579,7 @@ def test_model_response():
try:
data = request.get_json()
test_message = data.get('test_message', '你好,请简单介绍一下你自己')
-
+
# 这里可以调用LLM客户端进行回答测试
# 暂时返回模拟结果
return jsonify({
diff --git a/src/web/blueprints/__pycache__/auth.cpython-311.pyc b/src/web/blueprints/__pycache__/auth.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ed657b1dc4e15d8060c840b5e7b17ab8812decbe
GIT binary patch
literal 15533
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
G$^QT*CBfGK
literal 0
HcmV?d00001
diff --git a/src/web/blueprints/__pycache__/workorders.cpython-311.pyc b/src/web/blueprints/__pycache__/workorders.cpython-311.pyc
index 70eaa096a08dcb92d1569b961e9695e9a80c49e2..65642a941f3b7a5e0d10e1e76f69d361c97d4034 100644
GIT binary patch
literal 59019
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