diff --git a/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java b/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java index 034b658..071afd6 100644 --- a/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java +++ b/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java @@ -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 pageRecommend(@Validated @RequestBody RecruitAnnouncementRecommendParam param) { + return recruitAnnouncementService.pageRecommend(param); + } + /** 查询公告详情 */ @GetMapping("/detail") public RecruitAnnouncementDetailDto getDetail(@RequestParam Long id) { diff --git a/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementRecommendDto.java b/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementRecommendDto.java new file mode 100644 index 0000000..6f50bd4 --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementRecommendDto.java @@ -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 categoryNames; + + /** 热招城市列表 */ + private List cityNames; +} diff --git a/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementRecommendParam.java b/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementRecommendParam.java new file mode 100644 index 0000000..e5404e5 --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementRecommendParam.java @@ -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; +} diff --git a/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java b/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java index d853b36..1d52731 100644 --- a/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java +++ b/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java @@ -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); } + /** + * 分页查询推荐公告 + *

1. 校验公告存在 2. 取该公告的行业与岗位大类 3. 命中任一维度即推荐 4. 按本页id组装分类与城市

+ */ + public PageResult 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 industryNames = industryMapper.selectList(new LambdaQueryWrapper().eq(RecruitAnnouncementIndustry::getAnnouncementId, announcementId)).stream().map(RecruitAnnouncementIndustry::getIndustryName).collect(Collectors.toList()); + List categoryNames = categoryMapper.selectList(new LambdaQueryWrapper().eq(RecruitAnnouncementCategory::getAnnouncementId, announcementId)).stream().map(RecruitAnnouncementCategory::getCategoryName).collect(Collectors.toList()); + + //查询数据 + Page pageParam = param.toPage(); + pageParam.setSearchCount(false); + if (industryNames.isEmpty() && categoryNames.isEmpty()) { + return new PageResult<>(pageParam.getCurrent(), pageParam.getSize(), 0L, List.of()); + } + Page page = recruitAnnouncementMapper.selectRecommendPage(pageParam, industryNames, categoryNames); + + List 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> categoryMap = categoryMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementCategory::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementCategory::getAnnouncementId, Collectors.mapping(RecruitAnnouncementCategory::getCategoryName, Collectors.toList()))); + Map> cityMap = cityMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementCity::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementCity::getAnnouncementId, Collectors.mapping(RecruitAnnouncementCity::getCityName, Collectors.toList()))); + + // 组装返回数据 + List 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); + } + /** * 查询公告详情 *

1. 查公告主表(不存在或已失效则报错) 2. 补公司logo与类型 3. 按公告id查7张从表组装多值维度

diff --git a/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java b/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java index 57b6cb7..0e61b09 100644 --- a/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java +++ b/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java @@ -38,4 +38,10 @@ public interface RecruitAnnouncementMapper extends CommonMapper各筛选条件为“且”关系,为空则不参与筛选;多值维度不在此查询,由Java侧按id批量组装

*/ Page selectAnnouncementPage(Page page, @Param("keyword") String keyword, @Param("publishTimeStart") Instant publishTimeStart, @Param("publishTimeEnd") Instant publishTimeEnd, @Param("applyEndTimeStart") Instant applyEndTimeStart, @Param("applyEndTimeEnd") Instant applyEndTimeEnd, @Param("companyTypes") List companyTypes, @Param("educationNames") List educationNames, @Param("recruitYears") List recruitYears, @Param("batchNames") List batchNames, @Param("categoryNames") List categoryNames, @Param("cityNames") List cityNames, @Param("industryNames") List industryNames, @Param("tagNames") List tagNames); + + /** + * 分页查询推荐公告 + *

命中任一行业或任一岗位大类即可

+ */ + Page selectRecommendPage(Page page, @Param("industryNames") List industryNames, @Param("categoryNames") List categoryNames); } diff --git a/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml b/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml index 8347c1b..0d63ed7 100644 --- a/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml +++ b/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml @@ -158,4 +158,40 @@ ORDER BY ra.id DESC + + +