diff --git a/.codex/__MACOSX/._skills b/.codex/__MACOSX/._skills new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/._skills differ diff --git a/.codex/__MACOSX/skills/._.DS_Store b/.codex/__MACOSX/skills/._.DS_Store new file mode 100644 index 0000000..a5b28df Binary files /dev/null and b/.codex/__MACOSX/skills/._.DS_Store differ diff --git a/.codex/__MACOSX/skills/._inspect-shz-logs b/.codex/__MACOSX/skills/._inspect-shz-logs new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/._inspect-shz-logs differ diff --git a/.codex/__MACOSX/skills/._query-shz-highgo b/.codex/__MACOSX/skills/._query-shz-highgo new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/._query-shz-highgo differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/._.DS_Store b/.codex/__MACOSX/skills/inspect-shz-logs/._.DS_Store new file mode 100644 index 0000000..a5b28df Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/._.DS_Store differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/._SKILL.md b/.codex/__MACOSX/skills/inspect-shz-logs/._SKILL.md new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/._SKILL.md differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/._agents b/.codex/__MACOSX/skills/inspect-shz-logs/._agents new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/._agents differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/._references b/.codex/__MACOSX/skills/inspect-shz-logs/._references new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/._references differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/._scripts b/.codex/__MACOSX/skills/inspect-shz-logs/._scripts new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/._scripts differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/agents/._openai.yaml b/.codex/__MACOSX/skills/inspect-shz-logs/agents/._openai.yaml new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/agents/._openai.yaml differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/references/._log-locations.md b/.codex/__MACOSX/skills/inspect-shz-logs/references/._log-locations.md new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/references/._log-locations.md differ diff --git a/.codex/__MACOSX/skills/inspect-shz-logs/scripts/._view.sh b/.codex/__MACOSX/skills/inspect-shz-logs/scripts/._view.sh new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/inspect-shz-logs/scripts/._view.sh differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._.DS_Store b/.codex/__MACOSX/skills/query-shz-highgo/._.DS_Store new file mode 100644 index 0000000..a5b28df Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._.DS_Store differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._.password b/.codex/__MACOSX/skills/query-shz-highgo/._.password new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._.password differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._SKILL.md b/.codex/__MACOSX/skills/query-shz-highgo/._SKILL.md new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._SKILL.md differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._agents b/.codex/__MACOSX/skills/query-shz-highgo/._agents new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._agents differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._references b/.codex/__MACOSX/skills/query-shz-highgo/._references new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._references differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/._scripts b/.codex/__MACOSX/skills/query-shz-highgo/._scripts new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/._scripts differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/agents/._openai.yaml b/.codex/__MACOSX/skills/query-shz-highgo/agents/._openai.yaml new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/agents/._openai.yaml differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/references/._connection.md b/.codex/__MACOSX/skills/query-shz-highgo/references/._connection.md new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/references/._connection.md differ diff --git a/.codex/__MACOSX/skills/query-shz-highgo/scripts/._query.sh b/.codex/__MACOSX/skills/query-shz-highgo/scripts/._query.sh new file mode 100644 index 0000000..295701f Binary files /dev/null and b/.codex/__MACOSX/skills/query-shz-highgo/scripts/._query.sh differ diff --git a/.gitignore b/.gitignore index fb41a99..8ca3bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ nbdist/ .local/ local.sh +.claude \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserWorkExperiencesController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserWorkExperiencesController.java index 430fa9f..2e5e19d 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserWorkExperiencesController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserWorkExperiencesController.java @@ -1,7 +1,5 @@ package com.ruoyi.cms.controller.app; -import com.ruoyi.cms.domain.JobApply; -import com.ruoyi.cms.service.impl.JobApplyServiceImpl; import com.ruoyi.common.core.domain.entity.UserWorkExperiences; import com.ruoyi.cms.service.UserWorkExperiencesService; import com.ruoyi.common.core.controller.BaseController; @@ -20,8 +18,8 @@ import java.util.List; /** * 用户工作经历表 * - * @author - * @email + * @author + * @email * @date 2025-10-10 16:26:26 */ @RestController @@ -32,9 +30,6 @@ public class AppUserWorkExperiencesController extends BaseController { @Autowired private UserWorkExperiencesService userWorkExperiencesService; - @Autowired - JobApplyServiceImpl jobApplyService; - /** * 列表 */ @@ -44,14 +39,6 @@ public class AppUserWorkExperiencesController extends BaseController { if(userWorkExperiences.getUserId()==null){ userWorkExperiences.setUserId(SiteSecurityUtils.getUserId()); } - //已读简历 - if (userWorkExperiences.getJobId() != null) { - JobApply jobApply = jobApplyService.selectByJobIdAndUserId(userWorkExperiences.getJobId(), userWorkExperiences.getUserId()); - if (jobApply != null) { - jobApply.setIsView("1"); - jobApplyService.updateJobApply(jobApply); - } - } startPage(); List list=userWorkExperiencesService.getWorkExperiencesList(userWorkExperiences); return getDataTable(list); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java index 96f8a0b..c9d4024 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsJobController.java @@ -84,6 +84,13 @@ public class CmsJobController extends BaseController return getDataTable(list); } + @ApiOperation("根据岗位ID获取推荐的人") + @GetMapping("/getRecommendByJobId") + public AjaxResult getRecommendByJobId(@RequestParam("jobId") Long jobId) + { + return AjaxResult.success(jobService.getRecommendByJobId(jobId)); + } + /** * 获取岗位详细信息 */ @@ -373,4 +380,6 @@ public class CmsJobController extends BaseController } return success(jobService.updateReviewStatus(jobId, reviewStatus)); } + + } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/UserWorkExperiencesController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/UserWorkExperiencesController.java index 7506440..806e82f 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/UserWorkExperiencesController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/UserWorkExperiencesController.java @@ -1,6 +1,8 @@ package com.ruoyi.cms.controller.cms; +import com.ruoyi.cms.domain.JobApply; import com.ruoyi.cms.service.IAppUserService; +import com.ruoyi.cms.service.impl.JobApplyServiceImpl; import com.ruoyi.cms.util.RoleUtils; import com.ruoyi.common.core.domain.entity.AppUser; import com.ruoyi.common.core.domain.entity.UserWorkExperiences; @@ -33,9 +35,13 @@ public class UserWorkExperiencesController extends BaseController { @Autowired private UserWorkExperiencesService userWorkExperiencesService; + @Autowired private IAppUserService appUserService; + @Autowired + private JobApplyServiceImpl jobApplyService; + /** * 列表 */ @@ -43,6 +49,14 @@ public class UserWorkExperiencesController extends BaseController { @PreAuthorize("@ss.hasPermi('cms:userworkexperiences:list')") @GetMapping("/list") public TableDataInfo list(UserWorkExperiences userWorkExperiences){ + //已读简历 + if (userWorkExperiences.getJobId() != null) { + JobApply jobApply = jobApplyService.selectByJobIdAndUserId(userWorkExperiences.getJobId(), userWorkExperiences.getUserId()); + if (jobApply != null) { + jobApply.setIsView("1"); + jobApplyService.updateJobApply(jobApply); + } + } startPage(); List list=userWorkExperiencesService.getWorkExperiencesList(userWorkExperiences); return getDataTable(list); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CompanyJobLive.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CompanyJobLive.java index e1e61cd..98705c2 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CompanyJobLive.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CompanyJobLive.java @@ -49,7 +49,6 @@ public class CompanyJobLive extends BaseEntity @ApiModelProperty("结束时间") private String endTime; - @ApiModelProperty("公司ID") private Long companyId; diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java index db4ac4d..e77c382 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java @@ -82,6 +82,9 @@ public class ESJobDocument @ApiModelProperty("是否火") private Integer isHot; + @ApiModelProperty("是否急聘") + private Integer isUrgent; + @ApiModelProperty("申请次数") private Integer applyNum; @@ -156,4 +159,7 @@ public class ESJobDocument @ApiModelProperty("公司信息") @IndexField(fieldType = FieldType.TEXT) private String companyVoJson; + + @ApiModelProperty("是否发布 0未发布 1发布") + private Integer isPublish; } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java index 0952ec2..6d065d4 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java @@ -103,6 +103,9 @@ public class Job extends BaseEntity @ApiModelProperty("是否火") private Integer isHot; + @ApiModelProperty("是否急聘 0否 1是") + private Integer isUrgent; + @ApiModelProperty("申请次数") @JsonIgnore private Integer applyNum; diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java index 0ef0c5f..9285ad3 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobMapper.java @@ -1,29 +1,28 @@ package com.ruoyi.cms.mapper; -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import java.util.List; -import java.util.Map; - -import com.ruoyi.cms.domain.query.JobSearch; -import com.ruoyi.common.core.domain.entity.AppUser; -import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.RowWork; import com.ruoyi.cms.domain.VectorJob; import com.ruoyi.cms.domain.query.ESJobSearch; +import com.ruoyi.cms.domain.query.JobSearch; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.Company; import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Map; + /** * 岗位Mapper接口 + * * @author lishundong * @date 2024-09-03 */ -public interface JobMapper extends BaseMapper -{ +public interface JobMapper extends BaseMapper { /** * 查询岗位列表 - * + * * @param job 岗位 * @return 岗位集合 */ @@ -40,7 +39,6 @@ public interface JobMapper extends BaseMapper List selectRowCompany(); - void batchInsert(List jobBatch); List selectAllJob(Map params); @@ -56,7 +54,8 @@ public interface JobMapper extends BaseMapper List selectApplyJobUserList(Long jobId); /** - *查询单条岗位信息 + * 查询单条岗位信息 + * * @param jobId * @return */ @@ -67,6 +66,7 @@ public interface JobMapper extends BaseMapper Long updateReviewStatus(@Param("jobId") Long jobId, @Param("reviewStatus") String reviewStatus); //删除岗位 - @InterceptorIgnore(blockAttack = "true") Long delRowWork(); + + List getRecommendByJobId(@Param("jobId") Long jobId); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java index 869f225..6336620 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IJobService.java @@ -114,4 +114,6 @@ public interface IJobService public Integer getTotals(Job job); Long updateReviewStatus(Long jobId, String reviewStatus); + + List getRecommendByJobId(Long jobId); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyJobLiveServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyJobLiveServiceImpl.java index 8471214..dcb855d 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyJobLiveServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyJobLiveServiceImpl.java @@ -64,6 +64,6 @@ public class CompanyJobLiveServiceImpl implements ICompanyJobLiveService { LoginUser logUser = SecurityUtils.getLoginUser(); SysUser sysUser = logUser.getUser(); Company company = companyService.queryCodeCompany(sysUser.getIdCard()); - return company.getCompanyId(); + return company != null ? company.getCompanyId() : null; } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java index 2cef168..e745d14 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java @@ -72,7 +72,7 @@ public class ESJobSearchImpl implements IESJobSearchService /** * 项目启动时,初始化索引及数据 */ -// @PostConstruct + @PostConstruct public void init() { boolean isLockAcquired = false; @@ -346,6 +346,13 @@ public class ESJobSearchImpl implements IESJobSearchService if(!StringUtil.isEmptyOrNull(appUser.getSalaryMin())){ newSearch.setMinSalary(Long.valueOf(appUser.getSalaryMin())); } + // 请求参数覆盖用户资料中的薪资偏好 + if(Objects.nonNull(esJobSearch.getSalaryMin()) || Objects.nonNull(esJobSearch.getMinSalary())){ + newSearch.setMinSalary(Objects.nonNull(esJobSearch.getSalaryMin()) ? esJobSearch.getSalaryMin() : esJobSearch.getMinSalary()); + } + if(Objects.nonNull(esJobSearch.getSalaryMax()) || Objects.nonNull(esJobSearch.getMaxSalary())){ + newSearch.setMaxSalary(Objects.nonNull(esJobSearch.getSalaryMax()) ? esJobSearch.getSalaryMax() : esJobSearch.getMaxSalary()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getJobType())){ newSearch.setJobType(esJobSearch.getJobType()); } @@ -531,14 +538,14 @@ public class ESJobSearchImpl implements IESJobSearchService // 岗位薪资范围与用户期望薪资范围有交集 // 条件:岗位最小薪资 <= 用户最大薪资 AND 岗位最大薪资 >= 用户最小薪资 if(Objects.nonNull(userMinSalary) && Objects.nonNull(userMaxSalary)){ - wrapper.and(x->x.le(ESJobDocument::getMaxSalary,userMaxSalary) - .ge(ESJobDocument::getMinSalary,userMinSalary)); + wrapper.and(x->x.le(ESJobDocument::getMinSalary,userMaxSalary) + .ge(ESJobDocument::getMaxSalary,userMinSalary)); } else if(Objects.nonNull(userMinSalary)){ // 只有最小薪资:岗位最大薪资 >= 用户最小薪资 - wrapper.and(x->x.ge(ESJobDocument::getMinSalary,userMinSalary)); + wrapper.and(x->x.ge(ESJobDocument::getMaxSalary,userMinSalary)); } else if(Objects.nonNull(userMaxSalary)){ // 只有最大薪资:岗位最小薪资 <= 用户最大薪资 - wrapper.and(x->x.le(ESJobDocument::getMaxSalary,userMaxSalary)); + wrapper.and(x->x.le(ESJobDocument::getMinSalary,userMaxSalary)); } if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){ Integer maxValue = StringUtil.findMaxValue(esJobSearch.getExperience()); @@ -891,8 +898,16 @@ public class ESJobSearchImpl implements IESJobSearchService ESJobSearch newSearch = new ESJobSearch(); BeanUtils.copyProperties(esJobSearch,newSearch); - //查询 - if(appUser!=null){ + + // 判断是否为用户主动搜索(有明确的搜索条件),而非纯推荐场景 + boolean isExplicitSearch = !StringUtil.isEmptyOrNull(esJobSearch.getJobTitle()) + || !StringUtil.isEmptyOrNull(esJobSearch.getJobCategory()) + || !StringUtil.isEmptyOrNull(esJobSearch.getCompanyName()) + || !StringUtil.isEmptyOrNull(esJobSearch.getDescription()); + + // 用户资料偏好仅在"纯推荐"场景下作为个性化过滤条件; + // 用户主动搜索时不应被资料中的薪资/学历/经验/区域等偏好缩小结果范围 + if(appUser != null && !isExplicitSearch){ if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){ List jobTitle = appUser.getJobTitle(); newSearch.setJobTitle(String.join(",", jobTitle)); @@ -906,9 +921,6 @@ public class ESJobSearchImpl implements IESJobSearchService if(!StringUtil.isEmptyOrNull(appUser.getWorkExperience())){ newSearch.setExperience(appUser.getWorkExperience()); } - if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){ - newSearch.setExperience(esJobSearch.getExperience()); - } if(!StringUtil.isEmptyOrNull(appUser.getSalaryMax())){ newSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMax())); } @@ -917,12 +929,22 @@ public class ESJobSearchImpl implements IESJobSearchService } } + // 请求参数始终优先于用户资料偏好 + if(Objects.nonNull(esJobSearch.getSalaryMin()) || Objects.nonNull(esJobSearch.getMinSalary())){ + newSearch.setMinSalary(Objects.nonNull(esJobSearch.getSalaryMin()) ? esJobSearch.getSalaryMin() : esJobSearch.getMinSalary()); + } + if(Objects.nonNull(esJobSearch.getSalaryMax()) || Objects.nonNull(esJobSearch.getMaxSalary())){ + newSearch.setMaxSalary(Objects.nonNull(esJobSearch.getSalaryMax()) ? esJobSearch.getSalaryMax() : esJobSearch.getMaxSalary()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getArea())){ newSearch.setArea(esJobSearch.getArea()); } if(!StringUtil.isEmptyOrNull(esJobSearch.getEducation())){ newSearch.setEducation(esJobSearch.getEducation()); } + if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){ + newSearch.setExperience(esJobSearch.getExperience()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){ newSearch.setJobTitle(esJobSearch.getJobTitle()); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobApplyServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobApplyServiceImpl.java index b3b9aa4..8e244df 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobApplyServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobApplyServiceImpl.java @@ -153,7 +153,11 @@ public class JobApplyServiceImpl extends ServiceImpl im @Override public List selectJobApplyListJob(JobApply jobApply) { - return jobApplyMapper.selectJobApplyListJob(jobApply); + List jobList = jobApplyMapper.selectJobApplyListJob(jobApply); + jobList.forEach(job -> { + job.setIsApply(1); + }); + return jobList; } @Override diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java index 11c3195..ee49311 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java @@ -29,20 +29,26 @@ import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.spring.SpringUtils; +import io.swagger.models.auth.In; import org.apache.commons.collections4.CollectionUtils; import org.dromara.easyes.core.biz.EsPageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; +import javax.sql.DataSource; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URL; +import java.sql.Connection; +import java.sql.Statement; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -96,6 +102,40 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe @Autowired private NoticeMapper noticeMapper; + @Autowired + private DataSource dataSource; + + @Autowired + private UserWorkExperiencesMapper userWorkExperiencesMapper; + + @Autowired + private AppSkillMapper appSkillMapper; + + /** + * 应用启动后自动迁移:添加 is_urgent 列(幂等) + */ + @EventListener(ApplicationReadyEvent.class) + public void migrateIsUrgentColumn() { + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement()) { + String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name='job' AND column_name='is_urgent'"; + java.sql.ResultSet rs = stmt.executeQuery(checkSql); + boolean exists = false; + if (rs.next()) { + exists = rs.getInt(1) > 0; + } + rs.close(); + if (!exists) { + stmt.execute("ALTER TABLE job ADD COLUMN is_urgent CHAR(1) DEFAULT '0'"); + logger.info("急聘功能迁移: 成功添加 job.is_urgent 列"); + } else { + logger.info("急聘功能迁移: job.is_urgent 列已存在,跳过"); + } + } catch (Exception e) { + logger.error("急聘功能迁移失败: {}", e.getMessage()); + } + } + /** * 更新工作地址的经纬度信息 */ @@ -1227,4 +1267,23 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe public Long updateReviewStatus(Long jobId, String reviewStatus) { return jobMapper.updateReviewStatus(jobId, reviewStatus); } + + @Override + public List getRecommendByJobId(Long jobId) { + List list = jobMapper.getRecommendByJobId(jobId); + if (CollectionUtils.isNotEmpty(list)) { + list.forEach(appUser -> { + UserWorkExperiences workExperiences = new UserWorkExperiences(); + workExperiences.setUserId(appUser.getUserId()); + List experiences = userWorkExperiencesMapper.getWorkExperiencesList(workExperiences); + appUser.setExperiencesList(experiences); + + AppSkill skill = new AppSkill(); + skill.setUserId(appUser.getUserId()); + List skillList = appSkillMapper.getList(skill); + appUser.setAppSkillsList(skillList); + }); + } + return list; + } } diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/JobApplyMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/JobApplyMapper.xml index 6e9584f..4ceef72 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/JobApplyMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/JobApplyMapper.xml @@ -141,13 +141,24 @@ and latest_ii.job_id = a.job_id and latest_ii.del_flag = '0' where a.del_flag='0' - and b.job_title like concat('%', cast(#{company.jobTitle, jdbcType=VARCHAR} as varchar), '%') - and b.education = #{company.education} - and b.experience = #{company.experience} - and b.company_name like concat('%', cast(#{company.companyName, jdbcType=VARCHAR} as varchar), '%') - and b.company_id = #{company.companyId} - and l.code =#{company.code} - and b.job_title like concat('%', cast(#{name, jdbcType=VARCHAR} as varchar), '%') + + and e.name like concat('%', cast(#{name, jdbcType=VARCHAR} as varchar), '%') + + and e.phone like concat('%', cast(#{phone, jdbcType=VARCHAR} as varchar), '%') + + and e.education = #{education} + + and e.sex = #{sex} + + and e.area = #{area} + + and e.political_affiliation = #{politicalAffiliation} + + and e.id_card like concat('%', cast(#{idCard, jdbcType=VARCHAR} as varchar), '%') + + and e.birth_date = #{birthDate} + + and b.job_title like concat('%', cast(#{jobName, jdbcType=VARCHAR} as varchar), '%') + SELECT + *, + CASE match_level + WHEN 1 THEN '一级: 学历+区域+薪资+岗位类别' + WHEN 2 THEN '二级: 区域+薪资+岗位类别' + WHEN 3 THEN '三级: 薪资+岗位类别' + WHEN 4 THEN '四级: 仅岗位类别' + WHEN 5 THEN '五级: 无满足条件' + END AS match_level_desc + FROM ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY match_level asc) AS best_rn + FROM ( + SELECT + r.*, + CASE + WHEN CAST(j.job_id AS TEXT) = ANY(string_to_array(r.job_title_id, ',')) + AND ((CAST(r.salary_min AS INTEGER) <= p.max_salary AND CAST(r.salary_max AS INTEGER) >= p.min_salary) OR p.max_salary IS NULL) + AND (CAST(r.area AS INTEGER) = CAST(p.job_location_area_code AS INTEGER) OR p.job_location_area_code IS NULL) + AND (CAST(r.education AS INTEGER) >=CAST(p.education AS INTEGER) OR p.education IS NULL OR p.education = '-1') + THEN 1 + WHEN CAST(j.job_id AS TEXT) = ANY(string_to_array(r.job_title_id, ',')) + AND ((CAST(r.salary_min AS INTEGER) <= p.max_salary AND CAST(r.salary_max AS INTEGER) >= p.min_salary) OR p.max_salary IS NULL) + AND (CAST(r.area AS INTEGER) = CAST(p.job_location_area_code AS INTEGER) OR p.job_location_area_code IS NULL) + THEN 2 + WHEN CAST(j.job_id AS TEXT) = ANY(string_to_array(r.job_title_id, ',')) + AND ((CAST(r.salary_min AS INTEGER) <= p.max_salary AND CAST(r.salary_max AS INTEGER) >= p.min_salary) OR p.max_salary IS NULL) + THEN 3 + WHEN (CAST(j.job_id AS TEXT) = ANY(string_to_array(r.job_title_id, ',')) OR p.job_category IS NULL) + THEN 4 + ELSE 5 + END AS match_level + FROM shz.job p + JOIN shz.app_user r ON r.del_flag = '0' + JOIN shz.job_title j ON j.job_name = p.job_category + WHERE p.job_id = #{jobId} + ) c + ) t + WHERE best_rn = 1 + ORDER BY match_level ASC, login_date DESC + LIMIT (SELECT vacancies FROM shz.job WHERE job_id = #{jobId}) + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java index 5146aa7..d5dce8a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java @@ -104,6 +104,10 @@ public class AppUser extends BaseEntity @ApiModelProperty("期望岗位列表") private List jobTitle; + @TableField(exist = false) + @ApiModelProperty("职位名称(搜索用)") + private String jobName; + @ApiModelProperty("身份证") private String idCard; @@ -168,4 +172,8 @@ public class AppUser extends BaseEntity /** 1-大龄人员;2-低保人员;3-残疾人员;4-失地农名或联队职工;5-防止返贫;6-未就业大中专毕业生;7-退役军人;8-长期失业人员;9-城镇零就业家庭成员;10.刑满释放人员 **/ @ApiModelProperty("用户类型,以逗号分隔") private String userType; + + //匹配描述 + @TableField(exist = false) + private String matchLevelDesc; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java index 11ffaf6..1203075 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SsoService.java @@ -282,6 +282,8 @@ public class SsoService { company.setLegalPhone(object.getString("entLegalPersonPhone")); company.setIndustry(object.getString("entIndustry")); company.setRegisteredAddress(object.getString("entRegisteredAddress")); + company.setNature(object.getString("entType")); +// company.setScale(object.getString("entSize")); companyService.insertCompany(company); } /** diff --git a/sql/migration_add_is_urgent.sql b/sql/migration_add_is_urgent.sql new file mode 100644 index 0000000..7c0682d --- /dev/null +++ b/sql/migration_add_is_urgent.sql @@ -0,0 +1,4 @@ +-- 急聘功能:给 job 表添加 is_urgent 字段 +-- 0 = 非急聘(默认),1 = 急聘 +ALTER TABLE "ks_db3"."job" ADD COLUMN "is_urgent" CHAR(1) DEFAULT '0'; +COMMENT ON COLUMN "ks_db3"."job"."is_urgent" IS '是否急聘 0否 1是';