Commit ce8faa9b by zwb

新增岗位智推列表查询

parent cef9c004
......@@ -2,7 +2,11 @@ package com.bkty.system.controller;
import cn.hutool.core.collection.CollectionUtil;
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.PositionQueryDto;
import com.bkty.system.domain.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import com.bkty.system.init.*;
import com.bkty.system.service.jobRecommend.AiAnalysisService;
import com.bkty.system.service.jobRecommend.JobRecommendService;
......@@ -99,4 +103,16 @@ public class JobRecommendController {
jobRecommendService.recommendPosition(analysisId,userId,resumeId);
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;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
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;
......@@ -75,6 +77,8 @@ public class AiPositionRecommendRecord extends BaseEntity {
private Integer maxPay;
private Integer minPay;
private String companyName;
private Integer positionScore;
......@@ -106,4 +110,7 @@ public class AiPositionRecommendRecord extends BaseEntity {
// 分析id
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;
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.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Date;
import java.util.List;
/**
......@@ -31,4 +34,15 @@ public interface PositionRecommendMapper extends BaseMapper<AiPositionRecommendR
@Param("sortField") String sortField,
@Param("sortType") String sortType,
@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;
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 java.util.List;
......@@ -22,4 +25,11 @@ public interface JobRecommendService {
* @param resumeId
*/
void recommendPosition(Long analysisId, Long userId, Long resumeId);
/**
* 查询岗位智推列表数据
* @param dto
* @return
*/
List<PositionRecommendListVo> queryPositionList(PositionQueryDto dto);
}
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.vo.AiPositionRecommendRecordVo;
import com.bkty.system.domain.vo.PositionRecommendListVo;
import com.bkty.system.init.CategoryCacheManager;
import com.bkty.system.init.Level1Group;
import com.bkty.system.init.Level2Group;
import com.bkty.system.init.Level3Group;
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.JobRecommendService;
import com.bkty.system.service.jobRecommend.RecommendPositionService;
......@@ -18,10 +26,13 @@ import org.dromara.common.core.utils.SecurityUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author Zhang Wenbiao
......@@ -41,6 +52,10 @@ public class JobRecommendServiceImpl implements JobRecommendService {
private final RecommendPositionService recommendPositionService;
private final PositionRecommendMapper positionRecommendMapper;
private final RedisTemplate<String, String> redisTemplate;
@Override
public List<Level1Group> getLevel1Groups(String level1) {
......@@ -109,4 +124,24 @@ public class JobRecommendServiceImpl implements JobRecommendService {
}
}).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 {
recommendRecord.setPublicPlatform(portraitVo.getPublicPlatform());
recommendRecord.setCompanyName(portraitVo.getCompanyName());
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.setUpdateTime(date);
recommendRecord.setAnalysisId(analysisId);
recommendRecord.setSalaryRange(portraitVo.getSalaryRange());
return recommendRecord;
}
......
......@@ -56,4 +56,35 @@
</if>
</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>
\ 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