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 + + + + + + + + + + + + + +