diff --git a/vetti-admin/src/main/resources/i18n/messages_en_US.properties b/vetti-admin/src/main/resources/i18n/messages_en_US.properties index 7035452..f49a7cc 100644 --- a/vetti-admin/src/main/resources/i18n/messages_en_US.properties +++ b/vetti-admin/src/main/resources/i18n/messages_en_US.properties @@ -63,3 +63,6 @@ HotakeRolesInfoServiceImpl10001 = The job information is abnormal. Please try ag # manager.页面,字段 = User Manager VerificationEmailTiTle = Your verification code VerificationEmailContent = Your verification code is: {0}, valid for {1} minutes. + + +HotakeRolesApplyInfoServiceImpl10001 = You have already applied for this position \ No newline at end of file diff --git a/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties b/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties index 69451eb..90b799f 100644 --- a/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -62,3 +62,4 @@ HotakeRolesInfoServiceImpl10001 = 岗位信息异常,请稍后再试 VerificationEmailTiTle = 你的验证码 VerificationEmailContent = 你的验证码是: {0},有效期为 {1} 分钟。 +HotakeRolesApplyInfoServiceImpl10001 = 您已申请该职位 \ No newline at end of file diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeRolesInfoDto.java b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeRolesInfoDto.java index 844e5c1..1c4a18a 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeRolesInfoDto.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeRolesInfoDto.java @@ -48,4 +48,7 @@ public class HotakeRolesInfoDto extends HotakeRolesInfo { @ApiModelProperty("招聘人详细信息") private SysUser recruiterUser; + @ApiModelProperty("当前用户是否已申请该岗位") + private Boolean hasApplied; + } diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeRolesApplyInfoMapper.java b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeRolesApplyInfoMapper.java index 1047b91..b039813 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeRolesApplyInfoMapper.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeRolesApplyInfoMapper.java @@ -2,6 +2,7 @@ package com.vetti.hotake.mapper; import java.util.List; import com.vetti.hotake.domain.HotakeRolesApplyInfo; +import org.apache.ibatis.annotations.Param; /** * 候选人岗位申请信息Mapper接口 @@ -82,4 +83,13 @@ public interface HotakeRolesApplyInfoMapper */ public int batchInsertHotakeRolesApplyInfo(List hotakeRolesApplyInfoList); + /** + * 根据候选人ID和岗位ID查询申请信息 + * + * @param candidateId 候选人ID + * @param roleId 岗位ID + * @return 候选人岗位申请信息 + */ + public HotakeRolesApplyInfo selectByCandidateIdAndRoleId(@Param("candidateId") Long candidateId, @Param("roleId") Long roleId); + } diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesApplyInfoServiceImpl.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesApplyInfoServiceImpl.java index f15fa88..997d0ac 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesApplyInfoServiceImpl.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesApplyInfoServiceImpl.java @@ -9,6 +9,7 @@ import com.vetti.common.core.service.BaseServiceImpl; import com.vetti.common.enums.FillTypeEnum; import com.vetti.common.enums.StageEnum; import com.vetti.common.exception.ServiceException; +import com.vetti.common.utils.MessageUtils; import com.vetti.common.utils.SecurityUtils; import com.vetti.hotake.domain.*; import com.vetti.hotake.domain.dto.HotakeAiCvScoringRankingDto; @@ -172,7 +173,17 @@ public class HotakeRolesApplyInfoServiceImpl extends BaseServiceImpl implements public HotakeRolesApplyInfo insertHotakeRolesApplyInfo(HotakeRolesApplyInfo hotakeRolesApplyInfo) { fill(FillTypeEnum.INSERT.getCode(), hotakeRolesApplyInfo); - hotakeRolesApplyInfo.setCandidateId(SecurityUtils.getUserId()); + Long candidateId = SecurityUtils.getUserId(); + hotakeRolesApplyInfo.setCandidateId(candidateId); + + // 校验候选人和岗位的唯一性 + if (hotakeRolesApplyInfo.getRoleId() != null) { + HotakeRolesApplyInfo existInfo = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(candidateId, hotakeRolesApplyInfo.getRoleId()); + if (existInfo != null) { + throw new ServiceException(MessageUtils.messageCustomize("HotakeRolesApplyInfoServiceImpl10001")); + } + } + String fileSuffix = FileUtil.getSuffix(hotakeRolesApplyInfo.getCvFile()); if (StrUtil.isNotEmpty(fileSuffix)) { fileSuffix = fileSuffix.toLowerCase(); @@ -193,7 +204,17 @@ public class HotakeRolesApplyInfoServiceImpl extends BaseServiceImpl implements public HotakeRolesApplyInfo updateHotakeRolesApplyInfo(HotakeRolesApplyInfo hotakeRolesApplyInfo) { fill(FillTypeEnum.UPDATE.getCode(), hotakeRolesApplyInfo); - hotakeRolesApplyInfo.setCandidateId(SecurityUtils.getUserId()); + Long candidateId = SecurityUtils.getUserId(); + hotakeRolesApplyInfo.setCandidateId(candidateId); + + // 校验候选人和岗位的唯一性(排除自身) + if (hotakeRolesApplyInfo.getRoleId() != null && hotakeRolesApplyInfo.getId() != null) { + HotakeRolesApplyInfo existInfo = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(candidateId, hotakeRolesApplyInfo.getRoleId()); + if (existInfo != null && !existInfo.getId().equals(hotakeRolesApplyInfo.getId())) { + throw new ServiceException(MessageUtils.messageCustomize("HotakeRolesApplyInfoServiceImpl10001")); + } + } + String fileSuffix = FileUtil.getSuffix(hotakeRolesApplyInfo.getCvFile()); if (StrUtil.isNotEmpty(fileSuffix)) { fileSuffix = fileSuffix.toLowerCase(); diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesInfoServiceImpl.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesInfoServiceImpl.java index 75fdd94..32714a4 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesInfoServiceImpl.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeRolesInfoServiceImpl.java @@ -134,6 +134,11 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota SysUser user = sysUserMapper.selectUserById(hotakeRolesInfo.getRecruiterId()); dto.setRecruiterUser(user); + + // 判断当前用户是否已申请该岗位 + Long currentUserId = SecurityUtils.getUserId(); + HotakeRolesApplyInfo existApply = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(currentUserId, id); + dto.setHasApplied(existApply != null); } return dto; diff --git a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeRolesApplyInfoMapper.xml b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeRolesApplyInfoMapper.xml index 9ca90a7..8ddfcda 100644 --- a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeRolesApplyInfoMapper.xml +++ b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeRolesApplyInfoMapper.xml @@ -305,4 +305,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( #{item.id}, #{item.candidateId},#{item.recruiterId}, #{item.roleId}, #{item.fullName}, #{item.email}, #{item.phoneNumber}, #{item.cvFile}, #{item.coverLetter}, #{item.candidateStatus}, #{item.stage}, #{item.lastContact}, #{item.cvTemplateJson}, #{item.cvScore}, #{item.cvMd5}, #{item.experience}, #{item.aiMatchScore}, #{item.aiMatchScorePercentage}, #{item.delFlag}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.remark}) + + \ No newline at end of file