Files
2026-04-24 19:04:57 +08:00

66 lines
3.4 KiB
Python

"""简历统一查询模块
提供简历主表 + 5张子表的统一查询能力,返回脱离 session 的 ResumeDetail dataclass。
各 Service 统一复用,避免重复查询逻辑。
"""
from dataclasses import dataclass, field
from sqlalchemy import select, desc
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.user_resume import UserResume
from app.models.user_resume_education import UserResumeEducation
from app.models.user_resume_work import UserResumeWork
from app.models.user_resume_internship import UserResumeInternship
from app.models.user_resume_project import UserResumeProject
from app.models.user_resume_competition import UserResumeCompetition
@dataclass
class ResumeDetail:
"""简历完整数据,主表 + 5张子表"""
resume: UserResume
education: list[UserResumeEducation] = field(default_factory=list)
work: list[UserResumeWork] = field(default_factory=list)
internship: list[UserResumeInternship] = field(default_factory=list)
project: list[UserResumeProject] = field(default_factory=list)
competition: list[UserResumeCompetition] = field(default_factory=list)
async def load_resume_detail(session: AsyncSession, resume_id: int, user_id: int) -> ResumeDetail:
"""按ID查简历主表(校验归属)+ 5张子表,返回 ResumeDetail"""
result = await session.execute(select(UserResume).where(UserResume.id == resume_id, UserResume.user_id == user_id))
resume = result.scalar_one_or_none()
if not resume:
raise ValueError("简历不存在")
edu, work, intern, proj, comp = await _load_sub_tables(session, resume_id)
return ResumeDetail(resume=resume, education=edu, work=work, internship=intern, project=proj, competition=comp)
async def load_default_resume_detail(session: AsyncSession, user_id: int) -> ResumeDetail:
"""自动选默认简历(先默认再最新)+ 5张子表,返回 ResumeDetail"""
result = await session.execute(
select(UserResume).where(UserResume.user_id == user_id, UserResume.is_default == 1)
.order_by(desc(UserResume.update_time)).limit(1))
resume = result.scalar_one_or_none()
if not resume:
result = await session.execute(
select(UserResume).where(UserResume.user_id == user_id)
.order_by(desc(UserResume.update_time)).limit(1))
resume = result.scalar_one_or_none()
if not resume:
raise ValueError("请先创建简历")
edu, work, intern, proj, comp = await _load_sub_tables(session, resume.id)
return ResumeDetail(resume=resume, education=edu, work=work, internship=intern, project=proj, competition=comp)
async def _load_sub_tables(session: AsyncSession, resume_id: int):
"""查询简历5张子表"""
edu = (await session.execute(select(UserResumeEducation).where(UserResumeEducation.resume_id == resume_id))).scalars().all()
work = (await session.execute(select(UserResumeWork).where(UserResumeWork.resume_id == resume_id))).scalars().all()
intern = (await session.execute(select(UserResumeInternship).where(UserResumeInternship.resume_id == resume_id))).scalars().all()
proj = (await session.execute(select(UserResumeProject).where(UserResumeProject.resume_id == resume_id))).scalars().all()
comp = (await session.execute(select(UserResumeCompetition).where(UserResumeCompetition.resume_id == resume_id))).scalars().all()
return edu, work, intern, proj, comp