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 c9365f3..b713320 100644
--- a/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java
+++ b/client-api/src/main/java/org/jiayunet/controller/RecruitAnnouncementController.java
@@ -1,10 +1,15 @@
package org.jiayunet.controller;
import lombok.AllArgsConstructor;
+import org.jiayunet.pojo.PageResult;
+import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto;
+import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
import org.jiayunet.service.RecruitAnnouncementService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -37,6 +42,12 @@ public class RecruitAnnouncementController {
return recruitAnnouncementService.getStatistics();
}
+ /** 分页查询公告列表 */
+ @PostMapping("/page")
+ public PageResult pageAnnouncement(@Validated @RequestBody RecruitAnnouncementQueryParam param) {
+ return recruitAnnouncementService.pageAnnouncement(param);
+ }
+
/** 查询公告批次列表(去重) */
@GetMapping("/batch")
public List listBatchName() {
diff --git a/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementDto.java b/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementDto.java
new file mode 100644
index 0000000..e75097b
--- /dev/null
+++ b/client-api/src/main/java/org/jiayunet/pojo/dto/recruitAnnouncement/RecruitAnnouncementDto.java
@@ -0,0 +1,57 @@
+package org.jiayunet.pojo.dto.recruitAnnouncement;
+
+import lombok.Data;
+
+import java.time.Instant;
+import java.util.List;
+
+/**
+ * 招聘公告列表返回
+ *
+ * @author zk
+ */
+@Data
+public class RecruitAnnouncementDto {
+
+ /** 公告ID */
+ private Long id;
+
+ /** 公司ID */
+ private Long companyId;
+
+ /** 公司名称 */
+ private String companyName;
+
+ /** 公司logo */
+ private String logoUrl;
+
+ /** 公告标题 */
+ private String title;
+
+ /** 专业要求 */
+ private String majorRequire;
+
+ /** 投递结束时间 */
+ private Instant applyEndTime;
+
+ /** 投递截止描述 */
+ private String applyEndDesc;
+
+ /** 行业列表 */
+ private List industryNames;
+
+ /** 岗位大类列表 */
+ private List categoryNames;
+
+ /** 热招城市列表 */
+ private List cityNames;
+
+ /** 学历要求列表 */
+ private List educationNames;
+
+ /** 招聘届数列表 */
+ private List recruitYears;
+
+ /** 批次列表 */
+ private List batchNames;
+}
diff --git a/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementQueryParam.java b/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementQueryParam.java
new file mode 100644
index 0000000..604b118
--- /dev/null
+++ b/client-api/src/main/java/org/jiayunet/pojo/param/recruitAnnouncement/RecruitAnnouncementQueryParam.java
@@ -0,0 +1,55 @@
+package org.jiayunet.pojo.param.recruitAnnouncement;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.jiayunet.pojo.PageParam;
+
+import java.time.Instant;
+import java.util.List;
+
+/**
+ * 招聘公告查询入参
+ * 各筛选条件之间为“且”关系,为空则不参与筛选
+ *
+ * @author zk
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class RecruitAnnouncementQueryParam extends PageParam {
+
+ /** 发布时间起(不含) */
+ private Instant publishTimeStart;
+
+ /** 发布时间止(含) */
+ private Instant publishTimeEnd;
+
+ /** 投递截止时间起(不含) */
+ private Instant applyEndTimeStart;
+
+ /** 投递截止时间止(含) */
+ private Instant applyEndTimeEnd;
+
+ /** 公司类型列表 */
+ private List companyTypes;
+
+ /** 学历要求列表 */
+ private List educationNames;
+
+ /** 招聘届数列表 */
+ private List recruitYears;
+
+ /** 批次列表 */
+ private List batchNames;
+
+ /** 岗位大类列表 */
+ private List categoryNames;
+
+ /** 热招城市列表 */
+ private List cityNames;
+
+ /** 行业列表 */
+ private List industryNames;
+
+ /** 标签列表 */
+ private List tagNames;
+}
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 7d77e60..162c759 100644
--- a/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java
+++ b/client-api/src/main/java/org/jiayunet/service/RecruitAnnouncementService.java
@@ -1,5 +1,7 @@
package org.jiayunet.service;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jiayunet.mapper.RecruitAnnouncementBatchMapper;
import org.jiayunet.mapper.RecruitAnnouncementMapper;
@@ -9,7 +11,17 @@ import org.jiayunet.mapper.RecruitAnnouncementEducationMapper;
import org.jiayunet.mapper.RecruitAnnouncementIndustryMapper;
import org.jiayunet.mapper.RecruitAnnouncementTagMapper;
import org.jiayunet.mapper.RecruitAnnouncementYearMapper;
+import org.jiayunet.pojo.PageResult;
+import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementDto;
import org.jiayunet.pojo.dto.recruitAnnouncement.RecruitAnnouncementStatisticsDto;
+import org.jiayunet.pojo.param.recruitAnnouncement.RecruitAnnouncementQueryParam;
+import org.jiayunet.pojo.po.RecruitAnnouncementBatch;
+import org.jiayunet.pojo.po.RecruitAnnouncementCategory;
+import org.jiayunet.pojo.po.RecruitAnnouncementCity;
+import org.jiayunet.pojo.po.RecruitAnnouncementEducation;
+import org.jiayunet.pojo.po.RecruitAnnouncementIndustry;
+import org.jiayunet.pojo.po.RecruitAnnouncementYear;
+import org.jiayunet.pojo.vo.RecruitAnnouncementListItemVo;
import org.jiayunet.pojo.vo.RecruitAnnouncementStatisticsVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +31,8 @@ import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* 招聘公告服务
@@ -69,6 +83,46 @@ public class RecruitAnnouncementService {
return recruitAnnouncementMapper.selectLastCreateTime();
}
+ /**
+ * 分页查询招聘公告列表
+ * 1. 主表分页查询(多值维度不参与) 2. 按本页id批量查6张从表 3. Java侧分组组装DTO
+ */
+ public PageResult pageAnnouncement(RecruitAnnouncementQueryParam param) {
+
+ //查询数据
+ Page pageParam = param.toPage();
+ pageParam.setSearchCount(false);
+ Page page = recruitAnnouncementMapper.selectAnnouncementPage(pageParam, param.getPublishTimeStart(), param.getPublishTimeEnd(), param.getApplyEndTimeStart(), param.getApplyEndTimeEnd(), param.getCompanyTypes(), param.getEducationNames(), param.getRecruitYears(), param.getBatchNames(), param.getCategoryNames(), param.getCityNames(), param.getIndustryNames(), param.getTagNames());
+
+ 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> industryMap = industryMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementIndustry::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementIndustry::getAnnouncementId, Collectors.mapping(RecruitAnnouncementIndustry::getIndustryName, Collectors.toList())));
+ 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())));
+ Map> educationMap = educationMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementEducation::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementEducation::getAnnouncementId, Collectors.mapping(RecruitAnnouncementEducation::getEducationName, Collectors.toList())));
+ Map> yearMap = yearMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementYear::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementYear::getAnnouncementId, Collectors.mapping(RecruitAnnouncementYear::getRecruitYear, Collectors.toList())));
+ Map> batchMap = batchMapper.selectList(new LambdaQueryWrapper().in(RecruitAnnouncementBatch::getAnnouncementId, announcementIds)).stream().collect(Collectors.groupingBy(RecruitAnnouncementBatch::getAnnouncementId, Collectors.mapping(RecruitAnnouncementBatch::getBatchName, Collectors.toList())));
+
+ // 组装返回数据
+ List dtoList = page.getRecords().stream().map(vo -> {
+ RecruitAnnouncementDto dto = new RecruitAnnouncementDto();
+ BeanUtils.copyProperties(vo, dto);
+ dto.setIndustryNames(industryMap.getOrDefault(vo.getId(), List.of()));
+ dto.setCategoryNames(categoryMap.getOrDefault(vo.getId(), List.of()));
+ dto.setCityNames(cityMap.getOrDefault(vo.getId(), List.of()));
+ dto.setEducationNames(educationMap.getOrDefault(vo.getId(), List.of()));
+ dto.setRecruitYears(yearMap.getOrDefault(vo.getId(), List.of()));
+ dto.setBatchNames(batchMap.getOrDefault(vo.getId(), List.of()));
+ return dto;
+ }).collect(Collectors.toList());
+ return new PageResult<>(page.getCurrent(), page.getSize(), page.getTotal(), dtoList);
+ }
+
/**
* 统计公告数量(今日新增/本月新增/累计)
* 1. 按东八区算出今日零点、本月1号零点 2. 一次SQL条件聚合出三个计数 3. 转DTO返回
diff --git a/common/src/main/java/org/jiayunet/pojo/PageParam.java b/common/src/main/java/org/jiayunet/pojo/PageParam.java
index 4c8a17b..d42736f 100644
--- a/common/src/main/java/org/jiayunet/pojo/PageParam.java
+++ b/common/src/main/java/org/jiayunet/pojo/PageParam.java
@@ -20,7 +20,7 @@ public class PageParam {
/** 每页条数 */
@Min(value = 1, message = "每页条数最小为1")
- @Max(value = 1000, message = "每页条数最大为100")
+ @Max(value = 200, message = "每页条数最大为200")
private Integer pageSize = 10;
/**
diff --git a/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java b/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java
index 3b96973..12bdc26 100644
--- a/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java
+++ b/manager/src/main/java/org/jiayunet/mapper/RecruitAnnouncementMapper.java
@@ -1,11 +1,14 @@
package org.jiayunet.mapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.jiayunet.pojo.po.RecruitAnnouncement;
+import org.jiayunet.pojo.vo.RecruitAnnouncementListItemVo;
import org.jiayunet.pojo.vo.RecruitAnnouncementStatisticsVo;
import java.time.Instant;
+import java.util.List;
/**
* 招聘公告主表Mapper
@@ -29,4 +32,10 @@ public interface RecruitAnnouncementMapper extends CommonMapper各筛选条件为“且”关系,为空则不参与筛选;多值维度不在此查询,由Java侧按id批量组装
+ */
+ Page selectAnnouncementPage(Page page, @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);
}
diff --git a/manager/src/main/java/org/jiayunet/pojo/dto/RecruitAnnouncementQueryDto.java b/manager/src/main/java/org/jiayunet/pojo/dto/RecruitAnnouncementQueryDto.java
new file mode 100644
index 0000000..a130613
--- /dev/null
+++ b/manager/src/main/java/org/jiayunet/pojo/dto/RecruitAnnouncementQueryDto.java
@@ -0,0 +1,52 @@
+package org.jiayunet.pojo.dto;
+
+import lombok.Data;
+
+import java.time.Instant;
+import java.util.List;
+
+/**
+ * 招聘公告查询条件(Mapper入参)
+ * 各条件之间为“且”关系,为空则不参与筛选
+ *
+ * @author zk
+ */
+@Data
+public class RecruitAnnouncementQueryDto {
+
+ /** 发布时间起(不含) */
+ private Instant publishTimeStart;
+
+ /** 发布时间止(含) */
+ private Instant publishTimeEnd;
+
+ /** 投递截止时间起(不含) */
+ private Instant applyEndTimeStart;
+
+ /** 投递截止时间止(含) */
+ private Instant applyEndTimeEnd;
+
+ /** 公司类型列表 */
+ private List companyTypes;
+
+ /** 学历要求列表 */
+ private List educationNames;
+
+ /** 招聘届数列表 */
+ private List recruitYears;
+
+ /** 批次列表 */
+ private List batchNames;
+
+ /** 岗位大类列表 */
+ private List categoryNames;
+
+ /** 热招城市列表 */
+ private List cityNames;
+
+ /** 行业列表 */
+ private List industryNames;
+
+ /** 标签列表 */
+ private List tagNames;
+}
diff --git a/manager/src/main/java/org/jiayunet/pojo/vo/RecruitAnnouncementListItemVo.java b/manager/src/main/java/org/jiayunet/pojo/vo/RecruitAnnouncementListItemVo.java
new file mode 100644
index 0000000..0ae223a
--- /dev/null
+++ b/manager/src/main/java/org/jiayunet/pojo/vo/RecruitAnnouncementListItemVo.java
@@ -0,0 +1,38 @@
+package org.jiayunet.pojo.vo;
+
+import lombok.Data;
+
+import java.time.Instant;
+
+/**
+ * 招聘公告列表项VO(SQL查询结果,多值维度由Java侧组装)
+ *
+ * @author zk
+ */
+@Data
+public class RecruitAnnouncementListItemVo {
+
+ /** 公告ID */
+ private Long id;
+
+ /** 公司ID */
+ private Long companyId;
+
+ /** 公司名称 */
+ private String companyName;
+
+ /** 公司logo */
+ private String logoUrl;
+
+ /** 公告标题 */
+ private String title;
+
+ /** 专业要求 */
+ private String majorRequire;
+
+ /** 投递结束时间 */
+ private Instant applyEndTime;
+
+ /** 投递截止描述 */
+ private String applyEndDesc;
+}
diff --git a/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml b/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml
index 1db27fc..c295238 100644
--- a/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml
+++ b/manager/src/main/resources/mapper/RecruitAnnouncementMapper.xml
@@ -25,4 +25,131 @@
FROM bg_recruit_announcement
+
+
+
+
+
+
+
+
+
+
+
+
+
+