Commit ce8faa9b by zwb

新增岗位智推列表查询

parent cef9c004
...@@ -2,7 +2,11 @@ package com.bkty.system.controller; ...@@ -2,7 +2,11 @@ package com.bkty.system.controller;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.bkty.system.domain.dto.AnalysisCareerDto; import com.bkty.system.domain.dto.AnalysisCareerDto;
import com.bkty.system.domain.dto.PositionQueryDto;
import com.bkty.system.domain.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import com.bkty.system.init.*; import com.bkty.system.init.*;
import com.bkty.system.service.jobRecommend.AiAnalysisService; import com.bkty.system.service.jobRecommend.AiAnalysisService;
import com.bkty.system.service.jobRecommend.JobRecommendService; import com.bkty.system.service.jobRecommend.JobRecommendService;
...@@ -99,4 +103,16 @@ public class JobRecommendController { ...@@ -99,4 +103,16 @@ public class JobRecommendController {
jobRecommendService.recommendPosition(analysisId,userId,resumeId); jobRecommendService.recommendPosition(analysisId,userId,resumeId);
return R.ok(); return R.ok();
} }
/**
* 查询推荐岗位列表
*
* @param dto
* @return
*/
@PostMapping("/query-position-list")
public R<List<PositionRecommendListVo>> queryPositionList(@RequestBody PositionQueryDto dto) {
List<PositionRecommendListVo> aiPositionRecommendRecordVoList = jobRecommendService.queryPositionList(dto);
return new R<>(aiPositionRecommendRecordVoList);
}
} }
package com.bkty.system.domain.dto;
import lombok.Data;
import java.util.List;
/**
* @author Zhang Wenbiao
* @description 岗位查询dto
* @datetime 2025/12/8 9:49
*/
@Data
public class PositionQueryDto {
private Long userId;
private int minSalary;
private int maxSalary;
private List<String> cityCodes;
}
...@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; ...@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date; import java.util.Date;
...@@ -75,6 +77,8 @@ public class AiPositionRecommendRecord extends BaseEntity { ...@@ -75,6 +77,8 @@ public class AiPositionRecommendRecord extends BaseEntity {
private Integer maxPay; private Integer maxPay;
private Integer minPay;
private String companyName; private String companyName;
private Integer positionScore; private Integer positionScore;
...@@ -106,4 +110,7 @@ public class AiPositionRecommendRecord extends BaseEntity { ...@@ -106,4 +110,7 @@ public class AiPositionRecommendRecord extends BaseEntity {
// 分析id // 分析id
private Long analysisId; private Long analysisId;
//薪资范围
private String salaryRange;
} }
\ No newline at end of file
package com.bkty.system.domain.vo;
import lombok.Data;
/**
* @author Zhang Wenbiao
* @description 岗位智推列表返回类
* @datetime 2025/12/8 11:45
*/
@Data
public class PositionRecommendListVo {
/**
* 岗位id
*/
private Long positionId;
/**
* 岗位名称
*/
private String jobTitle;
/**
* 分析详情
*/
private String rDetails;
/**
* 薪酬范围
*/
private String salaryRange;
/**
* 公司名称
*/
private String companyName;
/**
* 城市编码
*/
private String cityCode;
/**
* 城市名称
*/
private String cityName;
/**
* 匹配度
*/
private int rScore;
}
package com.bkty.system.mapper; package com.bkty.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bkty.system.domain.dto.PositionQueryDto;
import com.bkty.system.domain.entity.AiPositionRecommendRecord; import com.bkty.system.domain.entity.AiPositionRecommendRecord;
import com.bkty.system.domain.vo.AiPositionRecommendRecordVo; import com.bkty.system.domain.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -31,4 +34,15 @@ public interface PositionRecommendMapper extends BaseMapper<AiPositionRecommendR ...@@ -31,4 +34,15 @@ public interface PositionRecommendMapper extends BaseMapper<AiPositionRecommendR
@Param("sortField") String sortField, @Param("sortField") String sortField,
@Param("sortType") String sortType, @Param("sortType") String sortType,
@Param("deliverType") Integer deliverType); @Param("deliverType") Integer deliverType);
/**
* 根据用户ID获取最后一次推荐时间
*
* @param userId 用户ID
* @return 最后一次推荐时间
*/
@Select("SELECT MAX(recommend_time) FROM ai_position_recommend_record WHERE user_id = #{userId}")
Date getLastRecommendTime(@Param("userId") Long userId);
List<PositionRecommendListVo> queryPositionList(@Param("dto") PositionQueryDto dto);
} }
package com.bkty.system.service.jobRecommend; package com.bkty.system.service.jobRecommend;
import com.bkty.system.domain.dto.PositionQueryDto;
import com.bkty.system.domain.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import com.bkty.system.init.Level1Group; import com.bkty.system.init.Level1Group;
import java.util.List; import java.util.List;
...@@ -22,4 +25,11 @@ public interface JobRecommendService { ...@@ -22,4 +25,11 @@ public interface JobRecommendService {
* @param resumeId * @param resumeId
*/ */
void recommendPosition(Long analysisId, Long userId, Long resumeId); void recommendPosition(Long analysisId, Long userId, Long resumeId);
/**
* 查询岗位智推列表数据
* @param dto
* @return
*/
List<PositionRecommendListVo> queryPositionList(PositionQueryDto dto);
} }
package com.bkty.system.service.jobRecommend.impl; package com.bkty.system.service.jobRecommend.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.alibaba.nacos.common.utils.StringUtils;
import com.bkty.system.domain.dto.PositionQueryDto;
import com.bkty.system.domain.entity.AiRecommendBase; import com.bkty.system.domain.entity.AiRecommendBase;
import com.bkty.system.domain.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import com.bkty.system.init.CategoryCacheManager; import com.bkty.system.init.CategoryCacheManager;
import com.bkty.system.init.Level1Group; import com.bkty.system.init.Level1Group;
import com.bkty.system.init.Level2Group; import com.bkty.system.init.Level2Group;
import com.bkty.system.init.Level3Group; import com.bkty.system.init.Level3Group;
import com.bkty.system.mapper.AiAnalysisMapper; import com.bkty.system.mapper.AiAnalysisMapper;
import com.bkty.system.mapper.PositionRecommendMapper;
import com.bkty.system.service.jobRecommend.AiAnalysisService; import com.bkty.system.service.jobRecommend.AiAnalysisService;
import com.bkty.system.service.jobRecommend.JobRecommendService; import com.bkty.system.service.jobRecommend.JobRecommendService;
import com.bkty.system.service.jobRecommend.RecommendPositionService; import com.bkty.system.service.jobRecommend.RecommendPositionService;
...@@ -18,10 +26,13 @@ import org.dromara.common.core.utils.SecurityUtils; ...@@ -18,10 +26,13 @@ import org.dromara.common.core.utils.SecurityUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/** /**
* @author Zhang Wenbiao * @author Zhang Wenbiao
...@@ -41,6 +52,10 @@ public class JobRecommendServiceImpl implements JobRecommendService { ...@@ -41,6 +52,10 @@ public class JobRecommendServiceImpl implements JobRecommendService {
private final RecommendPositionService recommendPositionService; private final RecommendPositionService recommendPositionService;
private final PositionRecommendMapper positionRecommendMapper;
private final RedisTemplate<String, String> redisTemplate;
@Override @Override
public List<Level1Group> getLevel1Groups(String level1) { public List<Level1Group> getLevel1Groups(String level1) {
...@@ -109,4 +124,24 @@ public class JobRecommendServiceImpl implements JobRecommendService { ...@@ -109,4 +124,24 @@ public class JobRecommendServiceImpl implements JobRecommendService {
} }
}).start(); }).start();
} }
private static final String RECOMMEND_LIST = "recommend:list:%s";
@Override
public List<PositionRecommendListVo> queryPositionList(PositionQueryDto dto) {
Long userId = Objects.requireNonNull(LoginHelper.getLoginUser()).getUserId();
// String redisKey = String.format(RECOMMEND_LIST, userId);
dto.setUserId(userId);
// if (ObjectUtil.isEmpty(dto.getMaxSalary())&&ObjectUtil.isEmpty(dto.getMinSalary())&&CollectionUtils.isEmpty(dto.getCityCodes())) {
// // 1. 先尝试从Redis获取
// String result = redisTemplate.opsForValue().get(redisKey);
// if (StringUtils.isNotBlank(result)) {
// // 使用TypeReference来处理泛型类型
// return JSON.parseObject(result, new TypeReference<List<PositionRecommendListVo>>() {
// });
// }
// }
List<PositionRecommendListVo> recommendList = positionRecommendMapper.queryPositionList(dto);
return recommendList;
}
} }
...@@ -291,10 +291,12 @@ public class RecommendPositionServiceImpl implements RecommendPositionService { ...@@ -291,10 +291,12 @@ public class RecommendPositionServiceImpl implements RecommendPositionService {
recommendRecord.setPublicPlatform(portraitVo.getPublicPlatform()); recommendRecord.setPublicPlatform(portraitVo.getPublicPlatform());
recommendRecord.setCompanyName(portraitVo.getCompanyName()); recommendRecord.setCompanyName(portraitVo.getCompanyName());
recommendRecord.setJdMd(portraitVo.getJdMd()); recommendRecord.setJdMd(portraitVo.getJdMd());
recommendRecord.setMaxPay(portraitVo.getPay()); recommendRecord.setMaxPay(Integer.valueOf(portraitVo.getSalaryRange().split("-")[1]));
recommendRecord.setMinPay(Integer.valueOf(portraitVo.getSalaryRange().split("-")[0]));
recommendRecord.setCreateTime(date); recommendRecord.setCreateTime(date);
recommendRecord.setUpdateTime(date); recommendRecord.setUpdateTime(date);
recommendRecord.setAnalysisId(analysisId); recommendRecord.setAnalysisId(analysisId);
recommendRecord.setSalaryRange(portraitVo.getSalaryRange());
return recommendRecord; return recommendRecord;
} }
......
...@@ -56,4 +56,35 @@ ...@@ -56,4 +56,35 @@
</if> </if>
</select> </select>
<select id="queryPositionList" resultType="com.bkty.system.domain.vo.PositionRecommendListVo">
SELECT a.position_id,a.job_title,a.r_details,a.salary_range,a.company_name,a.city_code,a.r_score,c.city_name
FROM ai_position_recommend_record a
INNER JOIN city_data c
ON c.city_code = a.city_code
WHERE is_deleted = 0
AND user_id = #{dto.userId}
AND recommend_time = (
SELECT MAX(recommend_time)
FROM ai_position_recommend_record
WHERE user_id = #{dto.userId}
AND is_deleted = 0
)
<!-- 薪资过滤:查询薪资最小值小于薪资最小值字段,或查询薪资最大值大于薪资最大值字段 -->
<if test="dto.minSalary != null and dto.minSalary != '' and dto.maxSalary != null and dto.maxSalary != ''">
AND (
#{dto.minSalary} <![CDATA[ <= ]]> min_pay
AND #{dto.maxSalary} <![CDATA[ >= ]]> min_pay
OR #{dto.maxSalary} <![CDATA[ >= ]]> max_pay
AND #{dto.minSalary} <![CDATA[ <= ]]> max_pay
)
</if>
<!-- 城市筛选:支持多个城市 -->
<if test="dto.cityCodes != null and dto.cityCodes.size() > 0">
AND a.city_code IN
<foreach collection="dto.cityCodes" item="cityCode" open="(" separator="," close=")">
#{cityCode}
</foreach>
</if>
ORDER BY position_score DESC
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment