90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
"""简历诊断接口"""
|
|
|
|
from fastapi import APIRouter
|
|
from pydantic import BaseModel, Field
|
|
|
|
from app.ai.resume_diagnoser.diagnoser import diagnose_all, generate_summary
|
|
from app.core.context import RequestContext
|
|
from app.core.database import get_db
|
|
from app.services.resume_diagnose_service import ResumeDiagnoseService, aggregate_results
|
|
|
|
router = APIRouter(prefix="/resume/diagnose", tags=["简历诊断"])
|
|
|
|
|
|
class DiagnoseParam(BaseModel):
|
|
resume_id: int = Field(..., alias="resumeId")
|
|
|
|
|
|
class ResolveParam(BaseModel):
|
|
user_feedback: int = Field(..., alias="userFeedback")
|
|
|
|
|
|
@router.post("", summary="触发简历诊断")
|
|
async def diagnose_resume(param: DiagnoseParam):
|
|
"""触发简历AI诊断,返回报告ID"""
|
|
user_id = RequestContext.user_id.get()
|
|
|
|
# 1. 短事务:加载简历数据
|
|
async for session in get_db():
|
|
service = ResumeDiagnoseService(session)
|
|
resume, tasks = await service.load_resume_data(param.resume_id, user_id)
|
|
|
|
if not tasks:
|
|
raise ValueError("简历没有可诊断的描述内容")
|
|
|
|
# 2. 并行 AI 诊断(不持有数据库连接)
|
|
ai_tasks = [{k: v for k, v in t.items() if not k.startswith("_")} for t in tasks]
|
|
ai_results = await diagnose_all(ai_tasks)
|
|
|
|
# 3. 统计 + 评级(纯计算)
|
|
stats = aggregate_results(tasks, ai_results)
|
|
|
|
# 4. AI 生成整体评价(不持有数据库连接)
|
|
summary = await generate_summary(
|
|
grade=stats["grade"], urgent_total=stats["urgent_total"],
|
|
important_total=stats["important_total"], expression_total=stats["expression_total"],
|
|
target_position=resume.target_position or "", all_findings=stats["all_findings"],
|
|
)
|
|
|
|
# 5. 短事务:纯写入
|
|
async for session in get_db():
|
|
service = ResumeDiagnoseService(session)
|
|
report_id = await service.save_report(
|
|
param.resume_id, user_id, stats["grade"], summary,
|
|
stats["urgent_total"], stats["important_total"], stats["expression_total"],
|
|
tasks, ai_results,
|
|
)
|
|
|
|
return {"reportId": report_id}
|
|
|
|
|
|
@router.get("/{resume_id}", summary="查询最近一次诊断报告")
|
|
async def get_diagnosis_report(resume_id: int):
|
|
"""查询指定简历的最近一次诊断报告 + 所有诊断问题"""
|
|
user_id = RequestContext.user_id.get()
|
|
async for session in get_db():
|
|
service = ResumeDiagnoseService(session)
|
|
return await service.get_latest_report(resume_id, user_id)
|
|
|
|
|
|
@router.put("/issue/{issue_id}/resolve", summary="标记问题已处理")
|
|
async def resolve_issue(issue_id: int, param: ResolveParam):
|
|
"""标记诊断问题已处理 + 用户评价"""
|
|
user_id = RequestContext.user_id.get()
|
|
async for session in get_db():
|
|
service = ResumeDiagnoseService(session)
|
|
await service.resolve_issue(issue_id, user_id, param.user_feedback)
|
|
|
|
|
|
class FeedbackParam(BaseModel):
|
|
user_feedback: int = Field(..., alias="userFeedback")
|
|
|
|
|
|
@router.put("/issue/{issue_id}/feedback", summary="用户评价诊断问题")
|
|
async def feedback_issue(issue_id: int, param: FeedbackParam):
|
|
"""单独更新用户评价(1=符合 2=不符合)"""
|
|
user_id = RequestContext.user_id.get()
|
|
async for session in get_db():
|
|
service = ResumeDiagnoseService(session)
|
|
await service.update_feedback(issue_id, user_id, param.user_feedback)
|