添加推荐公告列表

This commit is contained in:
zk
2026-07-31 16:11:03 +08:00
parent ce801c1cf7
commit a6a1081f74
6 changed files with 147 additions and 0 deletions
@@ -4,8 +4,10 @@ import lombok.AllArgsConstructor;
import org.jiayunet.pojo.PageResult; import org.jiayunet.pojo.PageResult;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDetailDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDetailDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementRecommendDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam; import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementRecommendParam;
import org.jiayunet.service.RecruitAnnouncementService; import org.jiayunet.service.RecruitAnnouncementService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@@ -50,6 +52,12 @@ public class RecruitAnnouncementController {
return recruitAnnouncementService.pageAnnouncement(param); return recruitAnnouncementService.pageAnnouncement(param);
} }
/** 分页查询推荐公告(同行业或同岗位大类) */
@PostMapping("/recommend")
public PageResult<RecruitAnnouncementRecommendDto> pageRecommend(@Validated @RequestBody RecruitAnnouncementRecommendParam param) {
return recruitAnnouncementService.pageRecommend(param);
}
/** 查询公告详情 */ /** 查询公告详情 */
@GetMapping("/detail") @GetMapping("/detail")
public RecruitAnnouncementDetailDto getDetail(@RequestParam Long id) { public RecruitAnnouncementDetailDto getDetail(@RequestParam Long id) {
@@ -0,0 +1,29 @@
package org.jiayunet.pojo.dto.recruitAnnouncement;
import lombok.Data;
import java.util.List;
/**
* 招聘公告推荐返回
*
* @author zk
*/
@Data
public class RecruitAnnouncementRecommendDto {
/** 公告ID */
private Long id;
/** 公司名称 */
private String companyName;
/** 公司logo */
private String logoUrl;
/** 岗位大类列表 */
private List<String> categoryNames;
/** 热招城市列表 */
private List<String> cityNames;
}
@@ -0,0 +1,21 @@
package org.jiayunet.pojo.param.recruitAnnouncement;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jiayunet.pojo.PageParam;
import javax.validation.constraints.NotNull;
/**
* 招聘公告推荐入参
*
* @author zk
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class RecruitAnnouncementRecommendParam extends PageParam {
/** 公告ID */
@NotNull(message = "公告ID不能为空")
private Long announcementId;
}
@@ -17,8 +17,10 @@ import org.jiayunet.mapper.RecruitAnnouncementYearMapper;
import org.jiayunet.pojo.PageResult; import org.jiayunet.pojo.PageResult;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDetailDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDetailDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementRecommendDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto; import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam; import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementRecommendParam;
import org.jiayunet.pojo.po.Company; import org.jiayunet.pojo.po.Company;
import org.jiayunet.pojo.po.RecruitAnnouncement; import org.jiayunet.pojo.po.RecruitAnnouncement;
import org.jiayunet.pojo.po.RecruitAnnouncementBatch; import org.jiayunet.pojo.po.RecruitAnnouncementBatch;
@@ -133,6 +135,51 @@ public class RecruitAnnouncementService {
return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), dtoList); return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), dtoList);
} }
/**
* 分页查询推荐公告
* <p>1. 校验公告存在 2. 取该公告的行业与岗位大类 3. 命中任一维度即推荐 4. 按本页id组装分类与城市</p>
*/
public PageResult<RecruitAnnouncementRecommendDto> pageRecommend(RecruitAnnouncementRecommendParam param) {
//校验公告存在
Long announcementId = param.getAnnouncementId();
RecruitAnnouncement announcement = recruitAnnouncementMapper.selectById(announcementId);
if (announcement == null || announcement.getStatus() == 0) {
throw new BusinessException(BusinessExpCodeEnum.DATA_NOT_EXIST, "公告不存在");
}
//取该公告的行业与岗位大类作为推荐依据
List<String> industryNames = industryMapper.selectList(new LambdaQueryWrapper<RecruitAnnouncementIndustry>().eq(RecruitAnnouncementIndustry::getAnnouncementId, announcementId)).stream().map(RecruitAnnouncementIndustry::getIndustryName).collect(Collectors.toList());
List<String> categoryNames = categoryMapper.selectList(new LambdaQueryWrapper<RecruitAnnouncementCategory>().eq(RecruitAnnouncementCategory::getAnnouncementId, announcementId)).stream().map(RecruitAnnouncementCategory::getCategoryName).collect(Collectors.toList());
//查询数据
Page<RecruitAnnouncementListItemVo> pageParam = param.toPage();
pageParam.setSearchCount(false);
if (industryNames.isEmpty() && categoryNames.isEmpty()) {
return new PageResult<>(pageParam.getCurrent(), pageParam.getSize(), 0L, List.of());
}
Page<RecruitAnnouncementListItemVo> page = recruitAnnouncementMapper.selectRecommendPage(pageParam, industryNames, categoryNames);
List<Long> announcementIds = page.getRecords().stream().map(RecruitAnnouncementListItemVo::getId).collect(Collectors.toList());
if (announcementIds.isEmpty()) {
return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), List.of());
}
// 按本页id批量查从表,各自按公告id分组
Map<Long, List<String>> categoryMap = categoryMapper.selectList(new LambdaQueryWrapper<RecruitAnnouncementCategory>().in(RecruitAnnouncementCategory::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementCategory::getAnnouncementId, Collectors.mapping(RecruitAnnouncementCategory::getCategoryName, Collectors.toList())));
Map<Long, List<String>> cityMap = cityMapper.selectList(new LambdaQueryWrapper<RecruitAnnouncementCity>().in(RecruitAnnouncementCity::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementCity::getAnnouncementId, Collectors.mapping(RecruitAnnouncementCity::getCityName, Collectors.toList())));
// 组装返回数据
List<RecruitAnnouncementRecommendDto> dtoList = page.getRecords().stream().map(vo -> {
RecruitAnnouncementRecommendDto dto = new RecruitAnnouncementRecommendDto();
BeanUtils.copyProperties(vo, dto);
dto.setCategoryNames(categoryMap.getOrDefault(vo.getId(), List.of()));
dto.setCityNames(cityMap.getOrDefault(vo.getId(), List.of()));
return dto;
}).collect(Collectors.toList());
return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), dtoList);
}
/** /**
* 查询公告详情 * 查询公告详情
* <p>1. 查公告主表(不存在或已失效则报错) 2. 补公司logo与类型 3. 按公告id查7张从表组装多值维度</p> * <p>1. 查公告主表(不存在或已失效则报错) 2. 补公司logo与类型 3. 按公告id查7张从表组装多值维度</p>
@@ -38,4 +38,10 @@ public interface RecruitAnnouncementMapper extends CommonMapper<RecruitAnnouncem
* <p>各筛选条件为“且”关系,为空则不参与筛选;多值维度不在此查询,由Java侧按id批量组装</p> * <p>各筛选条件为“且”关系,为空则不参与筛选;多值维度不在此查询,由Java侧按id批量组装</p>
*/ */
Page<RecruitAnnouncementListItemVo> selectAnnouncementPage(Page<RecruitAnnouncementListItemVo> page, @Param("keyword") String keyword, @Param("publishTimeStart") Instant publishTimeStart, @Param("publishTimeEnd") Instant publishTimeEnd, @Param("applyEndTimeStart") Instant applyEndTimeStart, @Param("applyEndTimeEnd") Instant applyEndTimeEnd, @Param("companyTypes") List<String> companyTypes, @Param("educationNames") List<String> educationNames, @Param("recruitYears") List<Integer> recruitYears, @Param("batchNames") List<String> batchNames, @Param("categoryNames") List<String> categoryNames, @Param("cityNames") List<String> cityNames, @Param("industryNames") List<String> industryNames, @Param("tagNames") List<String> tagNames); Page<RecruitAnnouncementListItemVo> selectAnnouncementPage(Page<RecruitAnnouncementListItemVo> page, @Param("keyword") String keyword, @Param("publishTimeStart") Instant publishTimeStart, @Param("publishTimeEnd") Instant publishTimeEnd, @Param("applyEndTimeStart") Instant applyEndTimeStart, @Param("applyEndTimeEnd") Instant applyEndTimeEnd, @Param("companyTypes") List<String> companyTypes, @Param("educationNames") List<String> educationNames, @Param("recruitYears") List<Integer> recruitYears, @Param("batchNames") List<String> batchNames, @Param("categoryNames") List<String> categoryNames, @Param("cityNames") List<String> cityNames, @Param("industryNames") List<String> industryNames, @Param("tagNames") List<String> tagNames);
/**
* 分页查询推荐公告
* <p>命中任一行业或任一岗位大类即可</p>
*/
Page<RecruitAnnouncementListItemVo> selectRecommendPage(Page<RecruitAnnouncementListItemVo> page, @Param("industryNames") List<String> industryNames, @Param("categoryNames") List<String> categoryNames);
} }
@@ -158,4 +158,40 @@
ORDER BY ra.id DESC ORDER BY ra.id DESC
</select> </select>
<!-- 分页查询推荐公告:命中任一行业或任一岗位大类 -->
<select id="selectRecommendPage" resultMap="RecruitAnnouncementListItemVoMap">
SELECT
ra.id,
ra.company_name,
c.logo_url
FROM bg_recruit_announcement ra
INNER JOIN bg_company c ON ra.company_id = c.id
WHERE c.status = 1
AND ra.status = 1
AND (
1 = 0
<if test="industryNames != null and industryNames.size() > 0">
OR ra.id IN (
SELECT rai.announcement_id
FROM bg_recruit_announcement_industry rai
WHERE rai.industry_name IN
<foreach collection="industryNames" item="name" open="(" separator="," close=")">
#{name}
</foreach>
)
</if>
<if test="categoryNames != null and categoryNames.size() > 0">
OR ra.id IN (
SELECT rac.announcement_id
FROM bg_recruit_announcement_category rac
WHERE rac.category_name IN
<foreach collection="categoryNames" item="name" open="(" separator="," close=")">
#{name}
</foreach>
)
</if>
)
ORDER BY ra.id DESC
</select>
</mapper> </mapper>