From eb0bbab0405330b0dd667ebbb9c78b68d9c4bcca Mon Sep 17 00:00:00 2001 From: zk Date: Fri, 20 Mar 2026 20:39:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jiayunet/controller/JobController.java | 20 ++++++++ .../org/jiayunet/pojo/vo/JobApplyCountVo.java | 30 ++++++++++++ .../jiayunet/pojo/vo/JobFavoriteCountVo.java | 25 ++++++++++ .../java/org/jiayunet/service/JobService.java | 49 +++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 client-api/src/main/java/org/jiayunet/pojo/vo/JobApplyCountVo.java create mode 100644 client-api/src/main/java/org/jiayunet/pojo/vo/JobFavoriteCountVo.java diff --git a/client-api/src/main/java/org/jiayunet/controller/JobController.java b/client-api/src/main/java/org/jiayunet/controller/JobController.java index fa1864b..92f6e4e 100644 --- a/client-api/src/main/java/org/jiayunet/controller/JobController.java +++ b/client-api/src/main/java/org/jiayunet/controller/JobController.java @@ -9,6 +9,8 @@ import org.jiayunet.pojo.param.job.JobApplyParam; import org.jiayunet.pojo.param.job.JobApplyQueryParam; import org.jiayunet.pojo.param.job.JobDislikeParam; import org.jiayunet.pojo.param.job.JobQueryParam; +import org.jiayunet.pojo.vo.JobApplyCountVo; +import org.jiayunet.pojo.vo.JobFavoriteCountVo; import org.jiayunet.service.JobService; import org.jiayunet.tool.UserSecurityTool; import org.springframework.validation.annotation.Validated; @@ -99,4 +101,22 @@ public class JobController { Long userId = UserSecurityTool.getUserId(); jobService.applyJob(param.getJobId(), param.getStatus(), userId); } + + /** + * 收藏统计 + */ + @GetMapping("/favorite/count") + public JobFavoriteCountVo getFavoriteCount() { + Long userId = UserSecurityTool.getUserId(); + return jobService.getFavoriteCount(userId); + } + + /** + * 投递统计 + */ + @GetMapping("/apply/count") + public JobApplyCountVo getApplyCount() { + Long userId = UserSecurityTool.getUserId(); + return jobService.getApplyCount(userId); + } } diff --git a/client-api/src/main/java/org/jiayunet/pojo/vo/JobApplyCountVo.java b/client-api/src/main/java/org/jiayunet/pojo/vo/JobApplyCountVo.java new file mode 100644 index 0000000..a7a4dcb --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/vo/JobApplyCountVo.java @@ -0,0 +1,30 @@ +package org.jiayunet.pojo.vo; + +import lombok.Data; + +/** + * 投递统计结果 + * + * @author zk + */ +@Data +public class JobApplyCountVo { + + /** 投递总数 */ + private Long totalCount; + + /** 已投递数(status=0) */ + private Long appliedCount; + + /** 面试中数(status=1) */ + private Long interviewingCount; + + /** 有Offer数(status=2) */ + private Long offerCount; + + /** 未通过数(status=3) */ + private Long rejectedCount; + + /** 已结束数(status=4) */ + private Long closedCount; +} diff --git a/client-api/src/main/java/org/jiayunet/pojo/vo/JobFavoriteCountVo.java b/client-api/src/main/java/org/jiayunet/pojo/vo/JobFavoriteCountVo.java new file mode 100644 index 0000000..2549ac1 --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/vo/JobFavoriteCountVo.java @@ -0,0 +1,25 @@ +package org.jiayunet.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 收藏统计结果 + * + * @author zk + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class JobFavoriteCountVo { + + /** 收藏总数 */ + private Long totalCount; + + /** 有效收藏数(岗位status=0) */ + private Long validCount; + + /** 失效收藏数(岗位status!=0或已删除) */ + private Long invalidCount; +} diff --git a/client-api/src/main/java/org/jiayunet/service/JobService.java b/client-api/src/main/java/org/jiayunet/service/JobService.java index a4052be..bc4a4f6 100644 --- a/client-api/src/main/java/org/jiayunet/service/JobService.java +++ b/client-api/src/main/java/org/jiayunet/service/JobService.java @@ -12,6 +12,8 @@ import org.jiayunet.pojo.dto.job.JobMatchScoreDto; import org.jiayunet.pojo.param.job.JobApplyQueryParam; import org.jiayunet.pojo.param.job.JobQueryParam; import org.jiayunet.pojo.po.*; +import org.jiayunet.pojo.vo.JobApplyCountVo; +import org.jiayunet.pojo.vo.JobFavoriteCountVo; import org.jiayunet.pojo.vo.JobListItemVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -461,4 +463,51 @@ public class JobService { userJobApplicationMapper.insert(application); } } + + /** + * 收藏统计 + *

方法逻辑流程:

+ *

1. 查询收藏总数

+ *

2. 查询有效收藏数(JOIN岗位表,status=0)

+ *

3. 计算失效收藏数

+ */ + public JobFavoriteCountVo getFavoriteCount(Long userId) { + // 1. 查询收藏总数 + Long totalCount = userJobFavoriteMapper.selectCount(new LambdaQueryWrapper().eq(UserJobFavorite::getUserId, userId)); + + // 2. 查询有效收藏数(岗位status=0) + List favorites = userJobFavoriteMapper.selectList(new LambdaQueryWrapper().eq(UserJobFavorite::getUserId, userId)); + List jobIds = favorites.stream().map(UserJobFavorite::getJobId).collect(Collectors.toList()); + Long validCount = 0L; + if (!jobIds.isEmpty()) { + validCount = jobMapper.selectCount(new LambdaQueryWrapper().in(Job::getId, jobIds).eq(Job::getStatus, 0)); + } + + // 3. 计算失效收藏数 + Long invalidCount = totalCount - validCount; + + return new JobFavoriteCountVo(totalCount, validCount, invalidCount); + } + + /** + * 投递统计 + *

方法逻辑流程:

+ *

1. 查询所有投递记录

+ *

2. 按状态分组统计

+ */ + public JobApplyCountVo getApplyCount(Long userId) { + // 1. 查询所有投递记录 + List applications = userJobApplicationMapper.selectList(new LambdaQueryWrapper().eq(UserJobApplication::getUserId, userId)); + + // 2. 按状态分组统计 + JobApplyCountVo vo = new JobApplyCountVo(); + vo.setTotalCount((long) applications.size()); + vo.setAppliedCount(applications.stream().filter(a -> a.getStatus() == 0).count()); + vo.setInterviewingCount(applications.stream().filter(a -> a.getStatus() == 1).count()); + vo.setOfferCount(applications.stream().filter(a -> a.getStatus() == 2).count()); + vo.setRejectedCount(applications.stream().filter(a -> a.getStatus() == 3).count()); + vo.setClosedCount(applications.stream().filter(a -> a.getStatus() == 4).count()); + + return vo; + } }