添加agent优化简历接口
This commit is contained in:
@@ -1,11 +1,17 @@
|
||||
"""定制简历 Redis 存取模块
|
||||
"""定制简历 Redis 存取 + 数据转换模块
|
||||
|
||||
提供定制简历的保存(自动回滚备份)、查询、回滚能力。
|
||||
提供定制简历的保存(自动回滚备份)、查询、回滚、从 ResumeDetail 构建能力。
|
||||
各 Service 统一复用,不直接操作 Redis key。
|
||||
"""
|
||||
|
||||
import random
|
||||
import string
|
||||
|
||||
from app.core.redis import RedisManager
|
||||
from app.schemas.customize_resume import CustomizeResume
|
||||
from app.schemas.customize_resume import (
|
||||
CustomizeResume, ResumeProfile, Education, Work, Internship, Project, Competition, Paragraph,
|
||||
)
|
||||
from app.services.resume_loader import ResumeDetail
|
||||
|
||||
# Redis 常量
|
||||
KEY_PREFIX = "customize:resume:"
|
||||
@@ -13,16 +19,59 @@ EXPIRE = 12 * 60 * 60 # 12小时
|
||||
ROLLBACK_KEY_PREFIX = "customize:resume:rollback:"
|
||||
ROLLBACK_EXPIRE = 30 * 60 # 30分钟
|
||||
|
||||
_CHARS = string.ascii_letters + string.digits
|
||||
|
||||
|
||||
def _rand_id() -> str:
|
||||
"""生成随机8位字符串标识"""
|
||||
return "".join(random.choices(_CHARS, k=8))
|
||||
|
||||
|
||||
def _build_paragraphs(description: list[dict] | None) -> list[Paragraph]:
|
||||
"""将数据库 description [{id, text}] 转为 Paragraph 列表"""
|
||||
if not description:
|
||||
return []
|
||||
return [Paragraph(id=_rand_id(), text=item.get("text", "")) for item in description if isinstance(item, dict)]
|
||||
|
||||
|
||||
def build_from_detail(detail: ResumeDetail) -> CustomizeResume:
|
||||
"""从 ResumeDetail 组装 CustomizeResume"""
|
||||
resume = detail.resume
|
||||
profile = ResumeProfile(
|
||||
avatarUrl=resume.avatar_url or "", name=resume.name or "", email=resume.email or "",
|
||||
mobileNumber=resume.mobile_number or "", city=resume.city or "",
|
||||
wechatNumber=resume.wechat_number or "", portfolioUrl=resume.portfolio_url or "",
|
||||
skills=resume.skills or [], certificates=resume.certificates or [],
|
||||
summary=resume.summary or "",
|
||||
)
|
||||
return CustomizeResume(
|
||||
resume=profile,
|
||||
education=[Education(id=_rand_id(), school=r.school or "", major=r.major or "",
|
||||
degree=r.degree or "", studyType=r.study_type or "",
|
||||
startDate=r.start_date or "", endDate=r.end_date or "",
|
||||
description=_build_paragraphs(r.description)) for r in detail.education],
|
||||
work=[Work(id=_rand_id(), companyName=r.company_name or "", position=r.position or "",
|
||||
startDate=r.start_date or "", endDate=r.end_date or "",
|
||||
description=_build_paragraphs(r.description)) for r in detail.work],
|
||||
internship=[Internship(id=_rand_id(), companyName=r.company_name or "", position=r.position or "",
|
||||
startDate=r.start_date or "", endDate=r.end_date or "",
|
||||
description=_build_paragraphs(r.description)) for r in detail.internship],
|
||||
project=[Project(id=_rand_id(), companyName=r.company_name or "", projectName=r.project_name or "",
|
||||
role=r.role or "", startDate=r.start_date or "", endDate=r.end_date or "",
|
||||
description=_build_paragraphs(r.description)) for r in detail.project],
|
||||
competition=[Competition(id=_rand_id(), competitionName=r.competition_name or "", award=r.award or "",
|
||||
awardDate=r.award_date or "",
|
||||
description=_build_paragraphs(r.description)) for r in detail.competition],
|
||||
)
|
||||
|
||||
|
||||
async def save(user_id: int, cr: CustomizeResume) -> None:
|
||||
"""保存定制简历,自动备份旧版本到回滚 key"""
|
||||
key = f"{KEY_PREFIX}{user_id}"
|
||||
rollback_key = f"{ROLLBACK_KEY_PREFIX}{user_id}"
|
||||
# 备份旧数据
|
||||
old_data = await RedisManager.client.get(key)
|
||||
if old_data:
|
||||
await RedisManager.client.set(rollback_key, old_data, ex=ROLLBACK_EXPIRE)
|
||||
# 存新数据
|
||||
await RedisManager.client.set(key, cr.model_dump_json(by_alias=True), ex=EXPIRE)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user