修复AI建议逻辑和字段映射问题

- 修复AI建议基于问题描述而不是处理过程生成
- 修复工单详情页面显示逻辑
- 修复飞书时间字段处理(毫秒时间戳转换)
- 优化字段映射和转换逻辑
- 添加飞书集成功能
- 改进对话历史合并功能
- 优化系统优化反馈机制
This commit is contained in:
赵杰 Jie Zhao (雄狮汽车科技)
2025-09-19 17:29:33 +01:00
parent 66f44143d9
commit 79cf316c63
20 changed files with 2648 additions and 86 deletions

View File

@@ -31,15 +31,23 @@ def _ensure_workorder_template_file() -> str:
# 确保目录存在
os.makedirs('uploads', exist_ok=True)
if not os.path.exists(template_path):
# 如果运行目录不存在模板,尝试从项目根相对路径拷贝一份
repo_template = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'uploads', 'workorder_template.xlsx')
repo_template = os.path.abspath(repo_template)
# 优先从项目根目录的 uploads 拷贝(仓库自带模板)
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
repo_template = os.path.join(project_root, 'uploads', 'workorder_template.xlsx')
try:
if os.path.exists(repo_template):
import shutil
shutil.copyfile(repo_template, template_path)
else:
raise FileNotFoundError('模板文件缺失uploads/workorder_template.xlsx')
# 仓库模板不存在时,自动生成一个最小可用模板
try:
import pandas as pd
from pandas import DataFrame
columns = ['标题', '描述', '分类', '优先级', '状态', '解决方案', '满意度']
df: DataFrame = pd.DataFrame(columns=columns)
df.to_excel(template_path, index=False)
except Exception as gen_err:
raise FileNotFoundError('模板文件缺失且自动生成失败请检查依赖openpyxl/pandas') from gen_err
except Exception as copy_err:
raise copy_err
return template_path
@@ -199,14 +207,15 @@ def generate_workorder_ai_suggestion(workorder_id):
if not w:
return jsonify({"error": "工单不存在"}), 404
# 调用知识库搜索与LLM生成
query = f"{w.title} {w.description}"
# 使用问题描述title而不是处理过程description)作为主要查询依据
query = f"{w.title}"
kb_results = get_assistant().search_knowledge(query, top_k=3)
kb_list = kb_results.get('results', []) if isinstance(kb_results, dict) else []
# 组装提示词
context = "\n".join([f"Q: {k.get('question','')}\nA: {k.get('answer','')}" for k in kb_list])
from src.core.llm_client import QwenClient
llm = QwenClient()
prompt = f"请基于以下工单描述与知识库片段,给出简洁、可执行的处理建议。\n工单描述:\n{w.description}\n\n知识库片段:\n{context}\n\n请直接输出建议文本:"
prompt = f"请基于以下工单问题描述与知识库片段,给出简洁、可执行的处理建议。\n\n问题描述:\n{w.title}\n\n处理过程(仅供参考):\n{w.description}\n\n知识库片段:\n{context}\n\n请直接输出建议文本:"
llm_resp = llm.chat_completion(messages=[{"role":"user","content":prompt}], temperature=0.3, max_tokens=800)
suggestion = ""
if llm_resp and 'choices' in llm_resp:
@@ -404,6 +413,11 @@ def download_import_template_file():
"""直接返回工单导入模板文件(下载)"""
try:
template_path = _ensure_workorder_template_file()
return send_file(template_path, as_attachment=True, download_name='工单导入模板.xlsx')
try:
# Flask>=2 使用 download_name
return send_file(template_path, as_attachment=True, download_name='工单导入模板.xlsx', mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except TypeError:
# 兼容 Flask<2 的 attachment_filename
return send_file(template_path, as_attachment=True, attachment_filename='工单导入模板.xlsx', mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e:
return jsonify({"error": str(e)}), 500