From a6a1081f7442fd2cff4b55607d5ba9bab71e030d Mon Sep 17 00:00:00 2001
From: zk
Date: Fri, 31 Jul 2026 16:11:03 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A8=E8=8D=90=E5=85=AC?=
=?UTF-8?q?=E5=91=8A=E5=88=97=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../RecruitAnnouncementController.java | 8 ++++
.../RecruitAnnouncementRecommendDto.java | 29 ++++++++++++
.../RecruitAnnouncementRecommendParam.java | 21 +++++++++
.../service/RecruitAnnouncementService.java | 47 +++++++++++++++++++
.../mapper/RecruitAnnouncementMapper.java | 6 +++
.../mapper/RecruitAnnouncementMapper.xml | 36 ++++++++++++++
6 files changed, 147 insertions(+)
create mode 100644 client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementRecommendDto.java
create mode 100644 client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementRecommendParam.java
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
+
+
+