From 1edc28e332ac3397e68f00ac0f04efcf5581ab69 Mon Sep 17 00:00:00 2001 From: zk Date: Thu, 18 Jun 2026 16:36:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E5=88=B6=E7=AE=80=E5=8E=86=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=8E=9F=E7=AE=80=E5=8E=86id=20=E7=AE=80?= =?UTF-8?q?=E5=8E=86=E5=90=8D=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user_job_customize_resume.py | 4 +++- app/services/customize_resume_store.py | 29 ++++++++++++++++++------- app/services/job_agent_chat_service.py | 2 +- app/services/skill_gap_service.py | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/models/user_job_customize_resume.py b/app/models/user_job_customize_resume.py index 263d6cf..dfabdaf 100644 --- a/app/models/user_job_customize_resume.py +++ b/app/models/user_job_customize_resume.py @@ -6,7 +6,7 @@ from datetime import datetime 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 app.core.database import Base @@ -19,6 +19,8 @@ class UserJobCustomizeResume(Base): id: Mapped[int] = mapped_column(BigInteger, primary_key=True) 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") + 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="定制简历完整 JSON(CustomizeResume 结构)") 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="更新时间") diff --git a/app/services/customize_resume_store.py b/app/services/customize_resume_store.py index 070645d..7b25479 100644 --- a/app/services/customize_resume_store.py +++ b/app/services/customize_resume_store.py @@ -72,8 +72,11 @@ def _rollback_key(user_id: int, job_id: int) -> str: return f"{ROLLBACK_PREFIX}{user_id}:{job_id}" -async def save(user_id: int, job_id: int, cr: CustomizeResume) -> None: - """保存定制简历:备份旧版本到 Redis 用于回滚 + 写数据库""" +async def save(user_id: int, job_id: int, cr: CustomizeResume, resume_id: int | None = None, resume_name: str | None = None) -> None: + """保存定制简历:备份旧版本到 Redis 用于回滚 + 写数据库 + + resume_id / resume_name 仅在首次创建(INSERT)时写入,UPDATE 不更新。 + """ content = cr.model_dump(by_alias=True) 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( UserJobCustomizeResume.id == record.id).values(content=content)) 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: - """查询定制简历,查不到则加载默认简历构建返回""" - data = None + """查询定制简历,查不到则加载默认简历构建返回 + + 返回结构:{id, resumeId, resumeName, resume, education, work, internship, project, competition} + fallback 默认简历时:id=None, resumeId=默认简历id, resumeName=原简历名 + """ async for session in get_db(): - result = await session.execute(select(UserJobCustomizeResume).where( - UserJobCustomizeResume.user_id == user_id, UserJobCustomizeResume.job_id == job_id)) + result = await session.execute(select(UserJobCustomizeResume).where(UserJobCustomizeResume.user_id == user_id, UserJobCustomizeResume.job_id == job_id)) record = result.scalar_one_or_none() if record: 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: # 没有定制简历,加载默认简历构建 detail = await load_default_resume_detail(session, user_id) 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: diff --git a/app/services/job_agent_chat_service.py b/app/services/job_agent_chat_service.py index a8d3849..9768b20 100644 --- a/app/services/job_agent_chat_service.py +++ b/app/services/job_agent_chat_service.py @@ -99,7 +99,7 @@ class JobAgentChatService: continue self._apply_optimize_result(cr, mod_name, idx, result) # 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}]") # 6. 返回 return cr.model_dump(by_alias=True) diff --git a/app/services/skill_gap_service.py b/app/services/skill_gap_service.py index e5eae19..bf557e4 100644 --- a/app/services/skill_gap_service.py +++ b/app/services/skill_gap_service.py @@ -132,7 +132,7 @@ class SkillGapService: if new_skills: log.info(f"定制简历追加技能: {new_skills}") # 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}]") @staticmethod