""" 能力评估API接口 用于智能工牌数据分析、能力评估报告生成等 """ from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import List from app.core.deps import get_current_user, get_db from app.models.user import User from app.schemas.base import ResponseModel from app.schemas.ability import AbilityAssessmentResponse, AbilityAssessmentHistory from app.services.yanji_service import YanjiService from app.services.ability_assessment_service import get_ability_assessment_service import logging logger = logging.getLogger(__name__) router = APIRouter() @router.post("/analyze-yanji", response_model=ResponseModel) async def analyze_yanji_badge_data( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): """ 分析智能工牌数据生成能力评估和课程推荐 使用 Python 原生 AI 服务实现。 功能说明: 1. 从言迹智能工牌获取员工的最近10条录音记录 2. 分析对话数据,进行能力评估(6个维度) 3. 基于能力短板生成课程推荐(3-5门) 4. 保存评估记录到数据库 要求: - 用户必须已绑定手机号(用于匹配言迹数据) 返回: - assessment_id: 评估记录ID - total_score: 综合评分(0-100) - dimensions: 能力维度列表(6个维度) - recommended_courses: 推荐课程列表(3-5门) - conversation_count: 分析的对话数量 """ # 检查用户是否绑定手机号 if not current_user.phone: logger.warning(f"用户未绑定手机号: user_id={current_user.id}") raise HTTPException( status_code=400, detail="用户未绑定手机号,无法匹配言迹数据" ) # 获取服务实例 yanji_service = YanjiService() assessment_service = get_ability_assessment_service() try: logger.info( f"开始分析智能工牌数据: user_id={current_user.id}, " f"phone={current_user.phone}" ) # 调用能力评估服务(使用 Python 原生实现) result = await assessment_service.analyze_yanji_conversations( user_id=current_user.id, phone=current_user.phone, db=db, yanji_service=yanji_service, engine="v2" # 固定使用 V2 ) logger.info( f"智能工牌数据分析完成: user_id={current_user.id}, " f"assessment_id={result['assessment_id']}, " f"total_score={result['total_score']}" ) return ResponseModel( code=200, message="智能工牌数据分析完成", data=result ) except ValueError as e: # 业务逻辑错误(如未找到录音记录) logger.warning(f"智能工牌数据分析失败: {e}") raise HTTPException(status_code=404, detail=str(e)) except Exception as e: # 系统错误 logger.error(f"分析智能工牌数据失败: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"分析失败: {str(e)}" ) @router.get("/history", response_model=ResponseModel) async def get_assessment_history( limit: int = Query(default=10, ge=1, le=50, description="返回记录数量"), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): """ 获取用户的能力评估历史记录 参数: - limit: 返回记录数量(默认10,最大50) 返回: - 评估历史记录列表 """ assessment_service = get_ability_assessment_service() try: history = await assessment_service.get_user_assessment_history( user_id=current_user.id, db=db, limit=limit ) return ResponseModel( code=200, message=f"获取评估历史成功,共{len(history)}条", data={"history": history, "total": len(history)} ) except Exception as e: logger.error(f"获取评估历史失败: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"获取评估历史失败: {str(e)}" ) @router.get("/{assessment_id}", response_model=ResponseModel) async def get_assessment_detail( assessment_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): """ 获取单个评估记录的详细信息 参数: - assessment_id: 评估记录ID 返回: - 评估详细信息 """ assessment_service = get_ability_assessment_service() try: detail = await assessment_service.get_assessment_detail( assessment_id=assessment_id, db=db ) # 权限检查:只能查看自己的评估记录 if detail['user_id'] != current_user.id: raise HTTPException( status_code=403, detail="无权访问该评估记录" ) return ResponseModel( code=200, message="获取评估详情成功", data=detail ) except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) except HTTPException: raise except Exception as e: logger.error(f"获取评估详情失败: {e}", exc_info=True) raise HTTPException( status_code=500, detail=f"获取评估详情失败: {str(e)}" )