From 724e3e107308bc69539099d79d3c3dfd85df2a61 Mon Sep 17 00:00:00 2001 From: yuliang_guo Date: Wed, 4 Feb 2026 15:03:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(practice):=20=E8=8E=B7=E5=8F=96=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E6=97=B6=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- backend/app/api/v1/practice.py | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/backend/app/api/v1/practice.py b/backend/app/api/v1/practice.py index cb60496..af6ea66 100644 --- a/backend/app/api/v1/practice.py +++ b/backend/app/api/v1/practice.py @@ -896,7 +896,53 @@ async def get_practice_report( report = result.scalar_one_or_none() if not report: - raise HTTPException(status_code=404, detail="分析报告不存在,请先生成报告") + # 报告不存在,自动生成 + logger.info(f"报告不存在,自动生成: session_id={session_id}") + + # 查询对话历史 + result = await db.execute( + select(PracticeDialogue).where( + PracticeDialogue.session_id == session_id + ).order_by(PracticeDialogue.sequence) + ) + dialogue_list = result.scalars().all() + + if not dialogue_list: + raise HTTPException(status_code=404, detail="没有对话记录,无法生成报告") + + # 构建对话历史 + dialogue_history = [ + {"role": "user" if d.speaker == "user" else "assistant", "content": d.content} + for d in dialogue_list + ] + + # 调用分析服务 + from app.services.practice_analysis_service import PracticeAnalysisService + import json + + practice_analysis_service = PracticeAnalysisService() + analysis_result = await practice_analysis_service.analyze(dialogue_history, db=db) + + if not analysis_result.success: + raise HTTPException(status_code=500, detail=f"分析失败: {analysis_result.error}") + + analysis_data = analysis_result.to_dict() + + # 保存报告 + report = PracticeReport( + session_id=session_id, + total_score=analysis_data.get("overall_score", 0), + score_breakdown=analysis_data.get("score_breakdown", []), + ability_dimensions=analysis_data.get("ability_dimensions", []), + dialogue_review=analysis_data.get("dialogue_review", []), + suggestions=analysis_data.get("suggestions", []), + summary=analysis_data.get("summary", ""), + raw_response=json.dumps(analysis_data, ensure_ascii=False) + ) + db.add(report) + await db.commit() + await db.refresh(report) + logger.info(f"报告自动生成成功: session_id={session_id}, 总分={report.total_score}") # 3. 查询完整对话记录(从数据库) result = await db.execute(