定制简历 添加 原简历id 简历名字段

This commit is contained in:
zk
2026-06-18 16:36:03 +08:00
parent 0ddc4b5a6b
commit 1edc28e332
4 changed files with 26 additions and 11 deletions
+3 -1
View File
@@ -6,7 +6,7 @@
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from sqlalchemy import BigInteger, DateTime, JSON from sqlalchemy import BigInteger, DateTime, JSON, String
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base from app.core.database import Base
@@ -19,6 +19,8 @@ class UserJobCustomizeResume(Base):
id: Mapped[int] = mapped_column(BigInteger, primary_key=True) id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
user_id: Mapped[int] = mapped_column(BigInteger, nullable=False, comment="用户ID") user_id: Mapped[int] = mapped_column(BigInteger, nullable=False, comment="用户ID")
job_id: Mapped[int] = mapped_column(BigInteger, nullable=False, comment="岗位ID,关联 bg_job.id") job_id: Mapped[int] = mapped_column(BigInteger, nullable=False, comment="岗位ID,关联 bg_job.id")
resume_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, comment="原简历ID,关联 bg_user_resume.id")
resume_name: Mapped[Optional[str]] = mapped_column(String(256), nullable=True, comment="定制简历名称")
content: Mapped[Optional[dict]] = mapped_column(JSON, nullable=False, comment="定制简历完整 JSONCustomizeResume 结构)") content: Mapped[Optional[dict]] = mapped_column(JSON, nullable=False, comment="定制简历完整 JSONCustomizeResume 结构)")
create_time: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, comment="创建时间") create_time: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, comment="创建时间")
update_time: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间") update_time: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
+21 -8
View File
@@ -72,8 +72,11 @@ def _rollback_key(user_id: int, job_id: int) -> str:
return f"{ROLLBACK_PREFIX}{user_id}:{job_id}" return f"{ROLLBACK_PREFIX}{user_id}:{job_id}"
async def save(user_id: int, job_id: int, cr: CustomizeResume) -> None: async def save(user_id: int, job_id: int, cr: CustomizeResume, resume_id: int | None = None, resume_name: str | None = None) -> None:
"""保存定制简历:备份旧版本到 Redis 用于回滚 + 写数据库""" """保存定制简历:备份旧版本到 Redis 用于回滚 + 写数据库
resume_id / resume_name 仅在首次创建(INSERT)时写入,UPDATE 不更新。
"""
content = cr.model_dump(by_alias=True) content = cr.model_dump(by_alias=True)
async for session in get_db(): async for session in get_db():
@@ -86,23 +89,33 @@ async def save(user_id: int, job_id: int, cr: CustomizeResume) -> None:
await session.execute(update(UserJobCustomizeResume).where( await session.execute(update(UserJobCustomizeResume).where(
UserJobCustomizeResume.id == record.id).values(content=content)) UserJobCustomizeResume.id == record.id).values(content=content))
else: else:
session.add(UserJobCustomizeResume(id=next_id(), user_id=user_id, job_id=job_id, content=content)) session.add(UserJobCustomizeResume(id=next_id(), user_id=user_id, job_id=job_id, resume_id=resume_id, resume_name=resume_name, content=content))
async def get(user_id: int, job_id: int) -> dict | None: async def get(user_id: int, job_id: int) -> dict | None:
"""查询定制简历,查不到则加载默认简历构建返回""" """查询定制简历,查不到则加载默认简历构建返回
data = None
返回结构:{id, resumeId, resumeName, resume, education, work, internship, project, competition}
fallback 默认简历时:id=None, resumeId=默认简历id, resumeName=原简历名
"""
async for session in get_db(): async for session in get_db():
result = await session.execute(select(UserJobCustomizeResume).where( result = await session.execute(select(UserJobCustomizeResume).where(UserJobCustomizeResume.user_id == user_id, UserJobCustomizeResume.job_id == job_id))
UserJobCustomizeResume.user_id == user_id, UserJobCustomizeResume.job_id == job_id))
record = result.scalar_one_or_none() record = result.scalar_one_or_none()
if record: if record:
data = CustomizeResume.model_validate(record.content).model_dump(by_alias=True) data = CustomizeResume.model_validate(record.content).model_dump(by_alias=True)
data["id"] = record.id
data["resumeId"] = record.resume_id
data["resumeName"] = record.resume_name
return data
else: else:
# 没有定制简历,加载默认简历构建 # 没有定制简历,加载默认简历构建
detail = await load_default_resume_detail(session, user_id) detail = await load_default_resume_detail(session, user_id)
data = build_from_detail(detail).model_dump(by_alias=True) data = build_from_detail(detail).model_dump(by_alias=True)
return data data["id"] = None
data["resumeId"] = detail.resume.id
data["resumeName"] = detail.resume.resume_name or ""
return data
return None
async def rollback(user_id: int, job_id: int) -> None: async def rollback(user_id: int, job_id: int) -> None:
+1 -1
View File
@@ -99,7 +99,7 @@ class JobAgentChatService:
continue continue
self._apply_optimize_result(cr, mod_name, idx, result) self._apply_optimize_result(cr, mod_name, idx, result)
# 5. 存数据库 # 5. 存数据库
await customize_resume_store.save(user_id, job_id, cr) await customize_resume_store.save(user_id, job_id, cr, resume_id=detail.resume.id, resume_name=f"{detail.resume.resume_name or ''}-定制")
log.info(f"岗位简历优化已保存 [user={user_id}, job={job_id}]") log.info(f"岗位简历优化已保存 [user={user_id}, job={job_id}]")
# 6. 返回 # 6. 返回
return cr.model_dump(by_alias=True) return cr.model_dump(by_alias=True)
+1 -1
View File
@@ -132,7 +132,7 @@ class SkillGapService:
if new_skills: if new_skills:
log.info(f"定制简历追加技能: {new_skills}") log.info(f"定制简历追加技能: {new_skills}")
# 6. 存数据库 # 6. 存数据库
await customize_resume_store.save(user_id, job_id, cr) await customize_resume_store.save(user_id, job_id, cr, resume_id=detail.resume.id, resume_name=f"{detail.resume.resume_name or ''}-定制")
log.info(f"定制简历已保存 [user={user_id}, job={job_id}]") log.info(f"定制简历已保存 [user={user_id}, job={job_id}]")
@staticmethod @staticmethod