添加pc端es查询岗位方法

This commit is contained in:
sh
2025-10-28 10:47:03 +08:00
parent ce2d9328c3
commit ec09ede7eb
11 changed files with 215 additions and 8 deletions

View File

@@ -76,6 +76,7 @@ public class AppJobController extends BaseController
{ {
if (RoleUtils.getAppCurrentUseridCard() != null) { if (RoleUtils.getAppCurrentUseridCard() != null) {
esJobSearch.setCode(RoleUtils.getAppCurrentUseridCard()); esJobSearch.setCode(RoleUtils.getAppCurrentUseridCard());
esJobSearch.setUserType(RoleUtils.getAppIscompanyUser());
} }
List<ESJobDocument> jobList = jobService.recommend(esJobSearch); List<ESJobDocument> jobList = jobService.recommend(esJobSearch);
return success(jobList); return success(jobList);

View File

@@ -1,10 +1,13 @@
package com.ruoyi.cms.controller.cms; package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.ESJobDocument;
import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.query.ESJobSearch;
import com.ruoyi.cms.domain.vo.CandidateVO; import com.ruoyi.cms.domain.vo.CandidateVO;
import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.service.ICompanyService;
import com.ruoyi.cms.service.IJobService; import com.ruoyi.cms.service.IJobService;
import com.ruoyi.cms.util.RoleUtils; import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.cms.util.sensitiveWord.SensitiveWordChecker; import com.ruoyi.cms.util.sensitiveWord.SensitiveWordChecker;
import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
@@ -142,4 +145,18 @@ public class CmsJobController extends BaseController
List<CandidateVO> list = jobService.candidates(jobId); List<CandidateVO> list = jobService.candidates(jobId);
return getDataTable(list); return getDataTable(list);
} }
@ApiOperation("获取推荐岗位")
@PreAuthorize("@ss.hasPermi('bussiness:job:recommend')")
@GetMapping("/recommend")
public AjaxResult recommend(ESJobSearch esJobSearch)
{
if (RoleUtils.isCompanyAdmin()) {
esJobSearch.setCode(RoleUtils.getCurrentUseridCard());
esJobSearch.setUserType(StringUtil.IS_COMPANY_USER);
}
esJobSearch.setPageSize(20);
List<ESJobDocument> jobList = jobService.sysRecommend(esJobSearch);
return success(jobList);
}
} }

View File

@@ -1,7 +1,6 @@
package com.ruoyi.cms.domain.query; package com.ruoyi.cms.domain.query;
import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.Job;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@@ -54,4 +53,6 @@ public class ESJobSearch extends Job
private String area; private String area;
/*** 用户角色app角色0企业1求职者2网格员 3内部政府人员*/
private String userType;
} }

View File

@@ -57,4 +57,6 @@ public interface IAppUserService
AppUser selectByOpenid(String openid); AppUser selectByOpenid(String openid);
public AppUser registerAppUser(RegisterBody registerBody); public AppUser registerAppUser(RegisterBody registerBody);
public AppUser selectAppuserByIdcard(String idCard);
} }

View File

@@ -1,8 +1,8 @@
package com.ruoyi.cms.service; package com.ruoyi.cms.service;
import com.ruoyi.cms.domain.ESJobDocument; import com.ruoyi.cms.domain.ESJobDocument;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.query.ESJobSearch; import com.ruoyi.cms.domain.query.ESJobSearch;
import com.ruoyi.common.core.domain.entity.AppUser;
import org.dromara.easyes.core.biz.EsPageInfo; import org.dromara.easyes.core.biz.EsPageInfo;
import java.util.List; import java.util.List;
@@ -69,4 +69,6 @@ public interface IESJobSearchService
void deleteJob(Long jobId); void deleteJob(Long jobId);
List<ESJobDocument> selectByIds(Long[] jobIds); List<ESJobDocument> selectByIds(Long[] jobIds);
List<ESJobDocument> selectSysTextListExceptJobId(ESJobSearch esJobSearch, List<Long> jobIds, AppUser appUser);
} }

View File

@@ -92,4 +92,6 @@ public interface IJobService
void publishJob(Job job); void publishJob(Job job);
List<AppUser> selectApplyJobUserList(Long jobId); List<AppUser> selectApplyJobUserList(Long jobId);
List<ESJobDocument> sysRecommend(ESJobSearch esJobSearch);
} }

View File

@@ -210,4 +210,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper,AppUser> imple
appUserMapper.updateById(appUser); appUserMapper.updateById(appUser);
return appUser; return appUser;
} }
@Override
public AppUser selectAppuserByIdcard(String idCard) {
return appUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getIdCard, idCard).orderByDesc(AppUser::getUpdateTime).last("LIMIT 1"));
}
} }

View File

@@ -11,8 +11,8 @@ import com.ruoyi.cms.service.IESJobSearchService;
import com.ruoyi.cms.util.ListUtil; import com.ruoyi.cms.util.ListUtil;
import com.ruoyi.cms.util.StringUtil; import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.model.LoginSiteUser;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.bean.BeanUtils;
import org.dromara.easyes.core.biz.EsPageInfo; import org.dromara.easyes.core.biz.EsPageInfo;
@@ -441,11 +441,7 @@ public class ESJobSearchImpl implements IESJobSearchService
} }
//企业用户排除es去除jobIds //企业用户排除es去除jobIds
boolean needExclude = true; boolean needExclude = true;
if (SiteSecurityUtils.isLogin()) { needExclude = !StringUtil.IS_COMPANY_USER.equals(esJobSearch.getUserType());
LoginSiteUser siteUser = SiteSecurityUtils.getLoginSiteUser();
AppUser appUser = siteUser.getUser();
needExclude = !StringUtil.IS_COMPANY_USER.equals(appUser.getIsCompanyUser());
}
if(needExclude && !ListUtil.isListEmptyOrNull(jobIds)){ if(needExclude && !ListUtil.isListEmptyOrNull(jobIds)){
wrapper.not().in(ESJobDocument::getJobId, jobIds); wrapper.not().in(ESJobDocument::getJobId, jobIds);
} }
@@ -595,4 +591,123 @@ public class ESJobSearchImpl implements IESJobSearchService
wrapper.in(ESJobDocument::getJobId,jobIds); wrapper.in(ESJobDocument::getJobId,jobIds);
return esJobDocumentMapper.selectList(wrapper); return esJobDocumentMapper.selectList(wrapper);
} }
/**
* pc端查询es
* @param esJobSearch
* @param jobIds
* @param appUser
* @return
*/
@Override
public List<ESJobDocument> selectSysTextListExceptJobId(ESJobSearch esJobSearch, List<Long> jobIds,AppUser appUser) {
ESJobSearch newSearch = new ESJobSearch();
BeanUtils.copyProperties(esJobSearch,newSearch);
//查询
if(SecurityUtils.isLogin()){
if(appUser!=null){
if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){
List<String> jobTitle = appUser.getJobTitle();
newSearch.setJobTitle(String.join(",", jobTitle));
}
if(!StringUtil.isEmptyOrNull(appUser.getEducation())){
newSearch.setEducation(appUser.getEducation());
}
if(!StringUtil.isEmptyOrNull(appUser.getArea())){
newSearch.setArea(appUser.getArea());
}
if(!StringUtil.isEmptyOrNull(appUser.getExperience())){
newSearch.setExperience(appUser.getExperience());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){
newSearch.setExperience(esJobSearch.getExperience());
}
if(!StringUtil.isEmptyOrNull(appUser.getSalaryMax())){
newSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMax()));
}
if(!StringUtil.isEmptyOrNull(appUser.getSalaryMin())){
newSearch.setMinSalary(Long.valueOf(appUser.getSalaryMin()));
}
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getArea())){
newSearch.setArea(esJobSearch.getArea());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getEducation())){
newSearch.setEducation(esJobSearch.getEducation());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){
newSearch.setJobTitle(esJobSearch.getJobTitle());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getJobType())){
newSearch.setJobType(esJobSearch.getJobType());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getType())){
newSearch.setType(esJobSearch.getType());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getDescription())){
newSearch.setDescription(esJobSearch.getDescription());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getCompanyNature())){
newSearch.setCompanyNature(esJobSearch.getCompanyNature());
}
if(!StringUtil.isEmptyOrNull(esJobSearch.getCode())){
newSearch.setCode(esJobSearch.getCode());
}
}
LambdaEsQueryWrapper<ESJobDocument> wrapper = getWrapper(newSearch,jobIds);
//todo 暂时
wrapper.limit(esJobSearch.getPageSize());
List<ESJobDocument> esJobDocuments = esJobDocumentMapper.selectList(wrapper);
if (esJobDocuments.size() < esJobSearch.getPageSize()) {
// 定义要逐步放宽的搜索条件字段
List<Runnable> relaxConditions = new ArrayList<>();
relaxConditions.add(() -> newSearch.setArea(null));
relaxConditions.add(() -> newSearch.setExperience(null));
relaxConditions.add(() -> newSearch.setMaxSalary(null));
relaxConditions.add(() -> newSearch.setMinSalary(null));
relaxConditions.add(() -> newSearch.setEducation(null));
relaxConditions.add(()-> newSearch.setJobTitle(null));
// 保存所有查询到的文档
List<ESJobDocument> allDocuments = new ArrayList<>(esJobDocuments);
// 记录已经放宽的条件数量
int relaxedConditions = 0;
// 继续放宽条件直到满足分页或所有条件都已放宽
while (allDocuments.size() < esJobSearch.getPageSize()
&& relaxedConditions < relaxConditions.size()) {
// 放宽下一个条件
relaxConditions.get(relaxedConditions).run();
relaxedConditions++;
// 查询新增的文档(不包含之前已经查询到的)
wrapper = getWrapper(newSearch, jobIds);
wrapper.limit(esJobSearch.getPageSize() - allDocuments.size());
if (!allDocuments.isEmpty()) {
// 排除已经查询到的文档ID
Set<String> existingIds = allDocuments.stream()
.map(ESJobDocument::getId)
.collect(Collectors.toSet());
wrapper.not().in(ESJobDocument::getId, existingIds);
}
List<ESJobDocument> newDocuments = esJobDocumentMapper.selectList(wrapper);
allDocuments.addAll(newDocuments);
}
// 如果总数超过分页大小,截取所需数量
if (allDocuments.size() > esJobSearch.getPageSize()) {
esJobDocuments = allDocuments.subList(0, esJobSearch.getPageSize());
} else {
esJobDocuments = allDocuments;
}
}
return esJobDocuments;
}
} }

View File

@@ -15,6 +15,7 @@ import com.ruoyi.cms.domain.vo.CandidateVO;
import com.ruoyi.cms.mapper.*; import com.ruoyi.cms.mapper.*;
import com.ruoyi.cms.service.*; import com.ruoyi.cms.service.*;
import com.ruoyi.cms.util.*; import com.ruoyi.cms.util.*;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.AppUser; import com.ruoyi.common.core.domain.entity.AppUser;
@@ -22,6 +23,7 @@ import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.JobTitle; import com.ruoyi.common.core.domain.entity.JobTitle;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
@@ -79,6 +81,8 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
private JobContactMapper jobContactMapper; private JobContactMapper jobContactMapper;
@Autowired @Autowired
private FileMapper fileMapper; private FileMapper fileMapper;
@Autowired
private IAppUserService appUserService;
/** /**
* 更新工作地址的经纬度信息 * 更新工作地址的经纬度信息
@@ -786,6 +790,23 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
return jobs; return jobs;
} }
private List<ESJobDocument> sysUserCollection(List<ESJobDocument> jobs){
if(jobs.isEmpty()){return new ArrayList<>();}
if(SecurityUtils.isLogin()){
//收藏
Set<Long> collectionIds = jobCollectionMapper.selectList(Wrappers.<JobCollection>lambdaQuery()
.eq(JobCollection::getUserId, SecurityUtils.getUserId())
.in(JobCollection::getJobId, jobs.stream().map(ESJobDocument::getJobId).collect(Collectors.toList())))
.stream().map(JobCollection::getJobId).collect(Collectors.toSet());
for (ESJobDocument j : jobs) {
if (collectionIds.contains(j.getJobId())) {
j.setIsCollection(1);
}
}
}
return jobs;
}
@Override @Override
public void publishJob(Job job) { public void publishJob(Job job) {
job.setIsPublish(0); job.setIsPublish(0);
@@ -809,4 +830,27 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
public List<AppUser> selectApplyJobUserList(Long jobId) { public List<AppUser> selectApplyJobUserList(Long jobId) {
return jobMapper.selectApplyJobUserList(jobId); return jobMapper.selectApplyJobUserList(jobId);
} }
@Override
public List<ESJobDocument> sysRecommend(ESJobSearch esJobSearch) {
String jobKey=CacheConstants.SYS_JOB_IDS+ SecurityUtils.getUserId();
RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
JSONArray cacheObject = redisCache.getCacheObject(jobKey);
List<Long> jobList = new ArrayList<>();
if(Objects.isNull(cacheObject)){
ArrayList<Long> longs = new ArrayList<>();
jobList =longs;
}else {
jobList = cacheObject.toList(Long.class);
}
AppUser appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard());
//从es中查询
List<ESJobDocument> jobListResult = iesJobSearchService.selectSysTextListExceptJobId(esJobSearch,jobList,appUser);
//存入当前session中查看的岗位 避免重复 todo 定时删除 key上保存用户信息
jobList.addAll(jobListResult.stream().map(ESJobDocument::getJobId).collect(Collectors.toList()));
redisCache.setCacheObject(jobKey,jobList);
List<ESJobDocument> esJobDocuments = sysUserCollection(jobListResult);
return esJobDocuments;
}
} }

View File

@@ -61,4 +61,17 @@ public class RoleUtils {
return null; return null;
} }
} }
/**
* 获取用户角色
* @return
*/
public static String getAppIscompanyUser(){
LoginSiteUser loginSiteUser = SiteSecurityUtils.getLoginUser();
AppUser appUser = loginSiteUser.getUser();
if (appUser == null) {
throw new IllegalArgumentException("用户信息为空,无法获取身份证号"); // 用户信息为空仍抛异常,避免空指针
}
return appUser.getIsCompanyUser();
}
} }

View File

@@ -44,4 +44,9 @@ public class CacheConstants
*/ */
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
public static final String PWD_ERR_CNT_KEY_SITE = "site:pwd_err_cnt:"; public static final String PWD_ERR_CNT_KEY_SITE = "site:pwd_err_cnt:";
/**
*pc岗位ids
*/
public static final String SYS_JOB_IDS = "job_ids:";
} }