From 080e513e34eae934469c6db1b4deb6ee60c1aa1b Mon Sep 17 00:00:00 2001 From: lw <532810027@qq.com> Date: Tue, 9 Jul 2024 11:38:17 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E4=B8=BB=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=89=88=E6=98=BE=E7=A4=BA=E8=BF=91=E6=97=A5=E4=BA=8B=E9=A1=B9?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=202.=E4=BF=AE=E6=94=B9=E9=94=A5=E5=BD=A2?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E5=88=B0=E9=9D=A2=E4=BA=BA=E6=95=B0=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HomePageController.java | 119 ++++++++++++++---- .../zeroerr/domain/dto/AnnouncementDTO.java | 31 +++++ .../cn/zeroerr/mapper/EntryManageMapper.java | 2 + .../mapper/ResumeFollowRecordMapper.java | 2 + .../zeroerr/service/EntryManageService.java | 2 + .../service/ResumeFollowRecordService.java | 2 + .../service/impl/EntryManageServiceImpl.java | 5 + .../impl/ResumeFollowRecordServiceImpl.java | 5 + .../resources/mapper/EntryManageMapper.xml | 9 ++ .../mapper/ResumeFollowRecordMapper.xml | 8 +- 10 files changed, 163 insertions(+), 22 deletions(-) create mode 100644 zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/dto/AnnouncementDTO.java diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/HomePageController.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/HomePageController.java index 364f1c2..53cad5c 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/HomePageController.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/HomePageController.java @@ -4,6 +4,7 @@ import cn.zeroerr.common.annotation.Anonymous; import cn.zeroerr.common.core.controller.BaseController; import cn.zeroerr.common.core.domain.AjaxResult; import cn.zeroerr.common.core.domain.entity.RecruitStructure; +import cn.zeroerr.domain.dto.AnnouncementDTO; import cn.zeroerr.domain.dto.FollowDTO; import cn.zeroerr.domain.dto.HomePageDTO; import cn.zeroerr.domain.dto.PostDetailDTO; @@ -30,6 +31,7 @@ import java.time.LocalDate; import java.time.YearMonth; import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.function.BiConsumer; import java.util.stream.Collectors; @RestController @@ -75,7 +77,7 @@ public class HomePageController extends BaseController { //寻找该月份实际入职人数(以入职管理里的为准) //List resumeFollowRecordActualEntryList = resumeFollowRecordService.getBySelectMonth(req.getHrName(), firstDay, lastDay, 2); - List entryManageList=entryManageService.getList(firstDay, lastDay); + List entryManageList = entryManageService.getList(firstDay, lastDay); //寻找该月份初试通过人数 List resumeFollowRecordFirstPassList = resumeFollowRecordService.getBySelectMonth(req.getHrName(), firstDay, lastDay, 3); @@ -86,30 +88,31 @@ public class HomePageController extends BaseController { //寻找该月份接受的offer数 List resumeFollowRecordOfferList = resumeFollowRecordService.getBySelectMonth(req.getHrName(), firstDay, lastDay, 6); + ResumeStatVO resumeStatVO = new ResumeStatVO(); //1.合格简历数量 resumeStatVO.setQualifiedCount(resumeFollowRecordList.size()); //2 .初试通过人数 - resumeStatVO.setFistCount(resumeFollowRecordFirstPassList.stream().filter(record -> Objects.nonNull(record.getFirstPass()) && "1".equals(record.getFirstPass())).count()); + resumeStatVO.setFistCount(resumeFollowRecordFirstPassList.stream().filter(record -> "1".equals(record.getFirstPass())).count()); //3.通过人数(终面) - resumeStatVO.setFinalPassCount(resumeFollowRecordFinalPassList.stream().filter(record -> Objects.nonNull(record.getFinalPass()) && "1".equals(record.getFinalPass())).count()); + resumeStatVO.setFinalPassCount(resumeFollowRecordFinalPassList.stream().filter(record -> "1".equals(record.getFinalPass())).count()); //4.未通过人数(终面) - resumeStatVO.setFinalFailCount(resumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getFinalPass()) && "0".equals(record.getFinalPass())).count()); + resumeStatVO.setFinalFailCount(resumeFollowRecordList.stream().filter(record -> "0".equals(record.getFinalPass())).count()); //5.入职人数("实际"入职日期不为空的数据统计) resumeStatVO.setEntryCount(entryManageList.size()); //6.简历来源:下载 - resumeStatVO.setDownLoadCounts(resumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getResumeSource()) && "2".equals(record.getResumeSource())).count()); + resumeStatVO.setDownLoadCounts(resumeFollowRecordList.stream().filter(record -> "2".equals(record.getResumeSource())).count()); //7.简历处理-自投 - if(resumeHandleRecordList!=null){ + if (resumeHandleRecordList != null) { resumeStatVO.setSelfCounts(resumeHandleRecordList.stream() .filter(record -> record.getSelfCounts() != null) .mapToInt(ResumeHandleRecord::getSelfCounts) .sum()); - }else { + } else { resumeStatVO.setSelfCounts(0); } //8.封装实际到面人数 - resumeStatVO.setActualArriveCounts(resumeFollowRecordActualArrivedList.stream().filter(record -> Objects.nonNull(record.getFirstReach()) && "1".equals(record.getFirstReach())).count()); + resumeStatVO.setActualArriveCounts(resumeFollowRecordActualArrivedList.stream().filter(record -> "1".equals(record.getFirstReach())).count()); //9.通过比例(终面)=通过人数(终面)/初面实际到面人数 //long totalCount = resumeStatVO.getFinalPassCount() + resumeStatVO.getFinalFailCount(); if (resumeStatVO.getActualArriveCounts() != null) { @@ -352,30 +355,34 @@ public class HomePageController extends BaseController { //找到所有时间一共有多少份录入的简历 List allResumeFollowRecordList = resumeFollowRecordService.list(); //找到所有时间一共有多少人实际入职 - List allEntryManageList=entryManageService.getList(null, null); + List allEntryManageList = entryManageService.getList(null, null); //封装合格简历 funnelDataList.add(new ResumeStatVO.FunnelData().setName("合格简历:" + allResumeFollowRecordList.size() + "人").setValue((long) allResumeFollowRecordList.size())); //封装电话面试通过百分比 //通过电话面试的人数 //通过 - long phonePassCount1 = allResumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getIsPass()) && "1".equals(record.getIsPass())).count(); + long phonePassCount1 = allResumeFollowRecordList.stream().filter(record -> "1".equals(record.getIsPass())).count(); //直接邀约 - long phonePassCount2 = allResumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getIsPass()) && "4".equals(record.getIsPass())).count(); + long phonePassCount2 = allResumeFollowRecordList.stream().filter(record -> "4".equals(record.getIsPass())).count(); long phonePassCount = phonePassCount1 + phonePassCount2; - funnelDataList.add(new ResumeStatVO.FunnelData().setName("电面通过:" + phonePassCount + "人").setValue(phonePassCount)); + + //封装到面人数 + long arrivedCount = allResumeFollowRecordList.stream().filter(record -> "1".equals(record.getFirstReach())).count(); + funnelDataList.add(new ResumeStatVO.FunnelData().setName("到面人数:" + arrivedCount + "人").setValue(arrivedCount)); + //封装初试通过百分比 - long firstReachCount = allResumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getFirstPass()) && "1".equals(record.getFirstPass())).count(); + long firstReachCount = allResumeFollowRecordList.stream().filter(record -> "1".equals(record.getFirstPass())).count(); funnelDataList.add(new ResumeStatVO.FunnelData().setName("初试通过:" + firstReachCount + "人").setValue(firstReachCount)); - long finalPassCount = allResumeFollowRecordList.stream().filter(record -> Objects.nonNull(record.getFinalPass()) && "1".equals(record.getFinalPass())).count(); + long finalPassCount = allResumeFollowRecordList.stream().filter(record -> "1".equals(record.getFinalPass())).count(); //封装终试通过人数 funnelDataList.add(new ResumeStatVO.FunnelData().setName("终试通过:" + finalPassCount + "人").setValue(finalPassCount)); //封装入职人数 - funnelDataList.add(new ResumeStatVO.FunnelData().setName("入职通过:" + allEntryManageList.size() + "人").setValue((long)allEntryManageList.size())); + funnelDataList.add(new ResumeStatVO.FunnelData().setName("入职通过:" + allEntryManageList.size() + "人").setValue((long) allEntryManageList.size())); resumeStatVO.setFunnelData(funnelDataList); //查询待我审批的条数 @@ -438,21 +445,21 @@ public class HomePageController extends BaseController { } //封装简历合格率 - Integer total=resumeStatVO.getFindResumeCounts()+resumeStatVO.getSelfCounts(); - if(resumeStatVO.getQualifiedCount()!=null && total!=0){ + Integer total = resumeStatVO.getFindResumeCounts() + resumeStatVO.getSelfCounts(); + if (resumeStatVO.getQualifiedCount() != null && total != 0) { BigDecimal arrivePercent = new BigDecimal(resumeStatVO.getQualifiedCount()).divide(new BigDecimal(total), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); resumeStatVO.setQualifiedPercent(arrivePercent.doubleValue()); - }else { + } else { resumeStatVO.setQualifiedPercent(0d); } //封装约面率 - if (resumeStatVO.getInvestInterviewCounts()!=null &&resumeStatVO.getQualifiedCount()!=null){ - if(resumeStatVO.getQualifiedCount()!=0){ + if (resumeStatVO.getInvestInterviewCounts() != null && resumeStatVO.getQualifiedCount() != null) { + if (resumeStatVO.getQualifiedCount() != 0) { BigDecimal arrivePercent = new BigDecimal(resumeStatVO.getInvestInterviewCounts()).divide(new BigDecimal(resumeStatVO.getQualifiedCount()), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); resumeStatVO.setInvitePercent(arrivePercent.doubleValue()); } - }else { + } else { resumeStatVO.setInvitePercent(0d); } return success(resumeStatVO); @@ -488,4 +495,74 @@ public class HomePageController extends BaseController { return AjaxResult.success(postListVOList); } + + @Anonymous + @GetMapping("/getAnnouncement") + @ApiOperation(value = "获取公告数据") + public AjaxResult getAnnouncement() { + //封装公告内容 + List announcementDTOList = new ArrayList<>(); + + // 获取近五天的日期范围 + LocalDate now = LocalDate.now(); + LocalDate fiveDaysLater = now.plusDays(5); + + // 获取近五天预计入职的人,并按时间分类 + Map> groupByJoinDate = entryManageService.getListByWeek(now, fiveDaysLater) + .stream().collect(Collectors.groupingBy(EntryManage::getJoinDate)); + + // 获取近五天将要面试的人,并按时间分类 + Map> groupByFirstDate = resumeFollowRecordService.getListByWeek(now, fiveDaysLater) + .stream().collect(Collectors.groupingBy(ResumeFollowRecord::getFirstDate)); + + // 处理预计入职的公告 + processAnnouncements(announcementDTOList, groupByJoinDate, "预计入职候选人", AnnouncementDTO::setContentEntry); + + // 处理面试公告 + processAnnouncements(announcementDTOList, groupByFirstDate, "面试候选人", AnnouncementDTO::setContentInterview); + + // 按日期排序 + announcementDTOList.sort(Comparator.comparing(AnnouncementDTO::getDate)); + + return AjaxResult.success(announcementDTOList); + } + + private void processAnnouncements(List announcementDTOList, Map> groupedData, String title, BiConsumer setContentMethod) { + int count = 1; + for (Map.Entry> entry : groupedData.entrySet()) { + LocalDate date = entry.getKey(); + List dataList = entry.getValue(); + + Optional existingAnnouncement = announcementDTOList.stream() + .filter(announcement -> date.equals(announcement.getDate())) + .findFirst(); + + StringBuilder content = new StringBuilder(); + for (T data : dataList) { + if (data instanceof EntryManage) { + EntryManage entryManage = (EntryManage) data; + content.append(entryManage.getUserName()).append(" ").append(entryManage.getPostName()).append(";"); + } else if (data instanceof ResumeFollowRecord) { + ResumeFollowRecord resumeFollowRecord = (ResumeFollowRecord) data; + content.append(resumeFollowRecord.getName()).append(" ").append(resumeFollowRecord.getPostName()).append(";"); + } + } + + if (existingAnnouncement.isPresent()) { + AnnouncementDTO announcementDTO = existingAnnouncement.get(); + setContentMethod.accept(announcementDTO, content.toString()); + } else { + AnnouncementDTO announcementDTO = new AnnouncementDTO(); + announcementDTO.setId(count++); + announcementDTO.setDate(date); + announcementDTO.setTitleEntry("预计入职候选人".equals(title) ? title : "预计入职候选人"); + announcementDTO.setContentEntry("预计入职候选人".equals(title) ? content.toString() : "无"); + announcementDTO.setTitleInterview("面试候选人".equals(title) ? title : "面试候选人"); + announcementDTO.setContentInterview("面试候选人".equals(title) ? content.toString() : "无"); + announcementDTOList.add(announcementDTO); + } + } + } + + } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/dto/AnnouncementDTO.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/dto/AnnouncementDTO.java new file mode 100644 index 0000000..74a4c3b --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/dto/AnnouncementDTO.java @@ -0,0 +1,31 @@ +package cn.zeroerr.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@ApiModel +public class AnnouncementDTO { + + @ApiModelProperty(value = "公告id") + private Integer id; + + @ApiModelProperty(value = "日期") + private LocalDate date; + + @ApiModelProperty(value = "预计入职标题") + private String titleEntry; + + @ApiModelProperty(value = "预计入职公告内容") + private String contentEntry; + + @ApiModelProperty(value = "面试标题") + private String titleInterview; + + @ApiModelProperty(value = "面试公告内容") + private String contentInterview; +} diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/EntryManageMapper.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/EntryManageMapper.java index 3134879..8e120e6 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/EntryManageMapper.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/EntryManageMapper.java @@ -21,6 +21,8 @@ public interface EntryManageMapper extends BaseMapper { List listBySelect(@Param("req") EntryManagerDTO req); List getList(@Param("firstDay") LocalDate firstDay, @Param("lastDay") LocalDate lastDay); + + List getListByWeek(@Param("now") LocalDate now, @Param("plusDays") LocalDate plusDays); } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/ResumeFollowRecordMapper.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/ResumeFollowRecordMapper.java index 897b19e..4ccca09 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/ResumeFollowRecordMapper.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/ResumeFollowRecordMapper.java @@ -29,6 +29,8 @@ public interface ResumeFollowRecordMapper extends BaseMapper List listBySelect(@Param("req") FollowDTO req); List getBySelectMonth(@Param("hrName") String hrName, @Param("firstDay") LocalDate firstDay, @Param("lastDay") LocalDate lastDay, @Param("i") int i); + + List getListByWeek(@Param("now") LocalDate now, @Param("plusDays") LocalDate plusDays); } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/EntryManageService.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/EntryManageService.java index ed8b7a6..f034386 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/EntryManageService.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/EntryManageService.java @@ -18,4 +18,6 @@ public interface EntryManageService extends IService { List listBySelect(EntryManagerDTO req); List getList(LocalDate firstDay, LocalDate lastDay); + + List getListByWeek(LocalDate now, LocalDate plusDays); } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/ResumeFollowRecordService.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/ResumeFollowRecordService.java index df05d18..4587029 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/ResumeFollowRecordService.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/ResumeFollowRecordService.java @@ -26,4 +26,6 @@ public interface ResumeFollowRecordService extends IService List getBySelectMonth(String hrName, LocalDate firstDay, LocalDate lastDay, int i); + + List getListByWeek(LocalDate now, LocalDate plusDays); } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/EntryManageServiceImpl.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/EntryManageServiceImpl.java index a422cb3..f7a4e57 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/EntryManageServiceImpl.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/EntryManageServiceImpl.java @@ -28,6 +28,11 @@ public class EntryManageServiceImpl extends ServiceImpl getList(LocalDate firstDay, LocalDate lastDay) { return baseMapper.getList(firstDay,lastDay); } + + @Override + public List getListByWeek(LocalDate now, LocalDate plusDays) { + return this.baseMapper.getListByWeek(now,plusDays); + } } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/ResumeFollowRecordServiceImpl.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/ResumeFollowRecordServiceImpl.java index bddc304..0205fc0 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/ResumeFollowRecordServiceImpl.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/ResumeFollowRecordServiceImpl.java @@ -53,6 +53,11 @@ public class ResumeFollowRecordServiceImpl extends ServiceImpl getListByWeek(LocalDate now, LocalDate plusDays) { + return resumeFollowRecordMapper.getListByWeek(now,plusDays); + } + } diff --git a/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml b/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml index 14d1cc3..30fd349 100644 --- a/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml +++ b/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml @@ -55,4 +55,13 @@ and actual_join_date =]]> #{firstDay} and actual_join_date #{lastDay} + + + diff --git a/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml b/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml index ebe8f36..fc0decb 100644 --- a/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml +++ b/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml @@ -188,5 +188,11 @@ and hr_name like concat('%', #{hrName}, '%') - +