diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppJobController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppJobController.java index 1cbb402..4550713 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppJobController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppJobController.java @@ -76,6 +76,7 @@ public class AppJobController extends BaseController { if (RoleUtils.getAppCurrentUseridCard() != null) { esJobSearch.setCode(RoleUtils.getAppCurrentUseridCard()); + esJobSearch.setUserType(RoleUtils.getAppIscompanyUser()); } List jobList = jobService.recommend(esJobSearch); return success(jobList); 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 6af9137..48a0025 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 @@ -1,10 +1,13 @@ package com.ruoyi.cms.controller.cms; +import com.ruoyi.cms.domain.ESJobDocument; import com.ruoyi.cms.domain.Job; +import com.ruoyi.cms.domain.query.ESJobSearch; import com.ruoyi.cms.domain.vo.CandidateVO; import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.service.IJobService; import com.ruoyi.cms.util.RoleUtils; +import com.ruoyi.cms.util.StringUtil; import com.ruoyi.cms.util.sensitiveWord.SensitiveWordChecker; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Log; @@ -142,4 +145,18 @@ public class CmsJobController extends BaseController List list = jobService.candidates(jobId); 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 jobList = jobService.sysRecommend(esJobSearch); + return success(jobList); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/query/ESJobSearch.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/query/ESJobSearch.java index 1890e5b..e3396c9 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/query/ESJobSearch.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/query/ESJobSearch.java @@ -1,7 +1,6 @@ package com.ruoyi.cms.domain.query; import com.ruoyi.cms.domain.Job; -import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -54,4 +53,6 @@ public class ESJobSearch extends Job private String area; + /*** 用户角色app角色:0企业,1求职者,2网格员 3内部政府人员*/ + private String userType; } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java index 19256d1..72a4014 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java @@ -57,4 +57,6 @@ public interface IAppUserService AppUser selectByOpenid(String openid); public AppUser registerAppUser(RegisterBody registerBody); + + public AppUser selectAppuserByIdcard(String idCard); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IESJobSearchService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IESJobSearchService.java index 1dba935..c705598 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IESJobSearchService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IESJobSearchService.java @@ -1,8 +1,8 @@ package com.ruoyi.cms.service; import com.ruoyi.cms.domain.ESJobDocument; -import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.query.ESJobSearch; +import com.ruoyi.common.core.domain.entity.AppUser; import org.dromara.easyes.core.biz.EsPageInfo; import java.util.List; @@ -69,4 +69,6 @@ public interface IESJobSearchService void deleteJob(Long jobId); List selectByIds(Long[] jobIds); + + List selectSysTextListExceptJobId(ESJobSearch esJobSearch, List jobIds, AppUser appUser); } 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 b924bf2..59f7b9c 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 @@ -92,4 +92,6 @@ public interface IJobService void publishJob(Job job); List selectApplyJobUserList(Long jobId); + + List sysRecommend(ESJobSearch esJobSearch); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java index 46e27eb..faf48de 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java @@ -210,4 +210,9 @@ public class AppUserServiceImpl extends ServiceImpl imple appUserMapper.updateById(appUser); return appUser; } + + @Override + public AppUser selectAppuserByIdcard(String idCard) { + return appUserMapper.selectOne(Wrappers.lambdaQuery().eq(AppUser::getIdCard, idCard).orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + } } 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 3e9ff6e..344aa55 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 @@ -11,8 +11,8 @@ import com.ruoyi.cms.service.IESJobSearchService; import com.ruoyi.cms.util.ListUtil; import com.ruoyi.cms.util.StringUtil; 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.utils.SecurityUtils; import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import org.dromara.easyes.core.biz.EsPageInfo; @@ -441,11 +441,7 @@ public class ESJobSearchImpl implements IESJobSearchService } //企业用户排除es去除jobIds boolean needExclude = true; - if (SiteSecurityUtils.isLogin()) { - LoginSiteUser siteUser = SiteSecurityUtils.getLoginSiteUser(); - AppUser appUser = siteUser.getUser(); - needExclude = !StringUtil.IS_COMPANY_USER.equals(appUser.getIsCompanyUser()); - } + needExclude = !StringUtil.IS_COMPANY_USER.equals(esJobSearch.getUserType()); if(needExclude && !ListUtil.isListEmptyOrNull(jobIds)){ wrapper.not().in(ESJobDocument::getJobId, jobIds); } @@ -595,4 +591,123 @@ public class ESJobSearchImpl implements IESJobSearchService wrapper.in(ESJobDocument::getJobId,jobIds); return esJobDocumentMapper.selectList(wrapper); } + + /** + * pc端查询es + * @param esJobSearch + * @param jobIds + * @param appUser + * @return + */ + @Override + public List selectSysTextListExceptJobId(ESJobSearch esJobSearch, List jobIds,AppUser appUser) { + + ESJobSearch newSearch = new ESJobSearch(); + BeanUtils.copyProperties(esJobSearch,newSearch); + //查询 + if(SecurityUtils.isLogin()){ + if(appUser!=null){ + if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){ + List 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 wrapper = getWrapper(newSearch,jobIds); + + //todo 暂时 + wrapper.limit(esJobSearch.getPageSize()); + List esJobDocuments = esJobDocumentMapper.selectList(wrapper); + + if (esJobDocuments.size() < esJobSearch.getPageSize()) { + // 定义要逐步放宽的搜索条件字段 + List 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 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 existingIds = allDocuments.stream() + .map(ESJobDocument::getId) + .collect(Collectors.toSet()); + wrapper.not().in(ESJobDocument::getId, existingIds); + } + + List newDocuments = esJobDocumentMapper.selectList(wrapper); + allDocuments.addAll(newDocuments); + } + + // 如果总数超过分页大小,截取所需数量 + if (allDocuments.size() > esJobSearch.getPageSize()) { + esJobDocuments = allDocuments.subList(0, esJobSearch.getPageSize()); + } else { + esJobDocuments = allDocuments; + } + } + + return esJobDocuments; + } } 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 de53ff0..0968b2e 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 @@ -15,6 +15,7 @@ import com.ruoyi.cms.domain.vo.CandidateVO; import com.ruoyi.cms.mapper.*; import com.ruoyi.cms.service.*; import com.ruoyi.cms.util.*; +import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.TreeSelect; 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.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -79,6 +81,8 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe private JobContactMapper jobContactMapper; @Autowired private FileMapper fileMapper; + @Autowired + private IAppUserService appUserService; /** * 更新工作地址的经纬度信息 @@ -786,6 +790,23 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe return jobs; } + private List sysUserCollection(List jobs){ + if(jobs.isEmpty()){return new ArrayList<>();} + if(SecurityUtils.isLogin()){ + //收藏 + Set collectionIds = jobCollectionMapper.selectList(Wrappers.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 public void publishJob(Job job) { job.setIsPublish(0); @@ -809,4 +830,27 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe public List selectApplyJobUserList(Long jobId) { return jobMapper.selectApplyJobUserList(jobId); } + + @Override + public List sysRecommend(ESJobSearch esJobSearch) { + String jobKey=CacheConstants.SYS_JOB_IDS+ SecurityUtils.getUserId(); + RedisCache redisCache = SpringUtils.getBean(RedisCache.class); + JSONArray cacheObject = redisCache.getCacheObject(jobKey); + List jobList = new ArrayList<>(); + if(Objects.isNull(cacheObject)){ + ArrayList longs = new ArrayList<>(); + jobList =longs; + }else { + jobList = cacheObject.toList(Long.class); + } + AppUser appUser=appUserService.selectAppuserByIdcard(RoleUtils.getCurrentUseridCard()); + + //从es中查询 + List jobListResult = iesJobSearchService.selectSysTextListExceptJobId(esJobSearch,jobList,appUser); + //存入当前session中查看的岗位 避免重复 todo 定时删除 key上保存用户信息 + jobList.addAll(jobListResult.stream().map(ESJobDocument::getJobId).collect(Collectors.toList())); + redisCache.setCacheObject(jobKey,jobList); + List esJobDocuments = sysUserCollection(jobListResult); + return esJobDocuments; + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java index 40ad047..d101fa4 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/RoleUtils.java @@ -61,4 +61,17 @@ public class RoleUtils { return null; } } + + /** + * 获取用户角色 + * @return + */ + public static String getAppIscompanyUser(){ + LoginSiteUser loginSiteUser = SiteSecurityUtils.getLoginUser(); + AppUser appUser = loginSiteUser.getUser(); + if (appUser == null) { + throw new IllegalArgumentException("用户信息为空,无法获取身份证号"); // 用户信息为空仍抛异常,避免空指针 + } + return appUser.getIsCompanyUser(); + } } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 2dde81d..4eb123a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -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_SITE = "site:pwd_err_cnt:"; + + /** + *pc岗位ids + */ + public static final String SYS_JOB_IDS = "job_ids:"; }