添加推荐公告列表

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.dto.recruitAnnouncement.RecruitAnnouncementDetailDto;
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.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementRecommendParam;
import org.jiayunet.service.RecruitAnnouncementService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -50,6 +52,12 @@ public class RecruitAnnouncementController {
return recruitAnnouncementService.pageAnnouncement(param);
}
/** 分页查询推荐公告(同行业或同岗位大类) */
@PostMapping("/recommend")
public PageResult<RecruitAnnouncementRecommendDto> pageRecommend(@Validated @RequestBody RecruitAnnouncementRecommendParam param) {
return recruitAnnouncementService.pageRecommend(param);
}
/** 查询公告详情 */
@GetMapping("/detail")
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.dto.recruitAnnouncement.RecruitAnnouncementDetailDto;
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.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementRecommendParam;
import org.jiayunet.pojo.po.Company;
import org.jiayunet.pojo.po.RecruitAnnouncement;
import org.jiayunet.pojo.po.RecruitAnnouncementBatch;
@@ -133,6 +135,51 @@ public class RecruitAnnouncementService {
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>