From 90bbc7aa274cc2c329bc1cb8446e78e69a621816 Mon Sep 17 00:00:00 2001 From: haewoni Date: Tue, 12 Nov 2024 21:40:11 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[feat]=20#34=20-=20=EC=A7=80=EC=9B=90?= =?UTF-8?q?=EC=9E=90=20=EA=B2=B0=EA=B3=BC=EC=84=A4=EC=A0=95=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EB=B0=9C=EC=86=A1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/EntJobPostingServiceImpl.java | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java index a0e07d5..e8c7cdf 100644 --- a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java +++ b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java @@ -10,10 +10,14 @@ import com.wooribound.domain.jobposting.JobPostingRepository; import com.wooribound.domain.jobposting.dto.JobPostingDetailDTO; import com.wooribound.domain.jobposting.dto.JobPostingDetailProjection; +import com.wooribound.domain.notification.Notification; +import com.wooribound.domain.notification.NotificationRepository; import com.wooribound.domain.userapply.UserApply; import com.wooribound.domain.userapply.UserApplyRepository; import com.wooribound.domain.userapply.dto.ApplicantResultReqDTO; +import com.wooribound.domain.wbuser.WbUser; import com.wooribound.global.constant.ApplyResult; +import com.wooribound.global.constant.YN; import com.wooribound.global.util.RedisUtil; import lombok.RequiredArgsConstructor; import org.apache.logging.log4j.LogManager; @@ -35,6 +39,7 @@ public class EntJobPostingServiceImpl implements EntJobPostingService { private final JobRepository jobRepository; private final EnterpriseRepository enterpriseRepository; private final UserApplyRepository userApplyRepository; + private final NotificationRepository notificationRepository; private final RedisUtil redisUtil; // 1. 공고 등록 @@ -52,7 +57,7 @@ public String createJobPosting(JobPostingReqDTO jobPostingReqDTO) { .startDate(jobPostingReqDTO.getStartDate()) .endDate(jobPostingReqDTO.getEndDate()) .build(); - + jobPostingRepository.save(jobPosting); return "공고 등록이 완료되었습니다."; } @@ -70,16 +75,16 @@ public JobPostingDetailDTO getJobPostingDetail(Long postId) { // log4j - 조회된 공고 상세 로그 logger.info("공고 상세 조회 결과 - ID: {}, Title: {}", jobPosting.getPostId(), jobPosting.getPostTitle()); return JobPostingDetailDTO.builder() - .postTitle(jobPosting.getPostTitle()) - .entName(jobPosting.getEnterprise().getEntName()) - .postImg(jobPosting.getPostImg()) - .startDate(jobPosting.getStartDate()) - .endDate(jobPosting.getEndDate()) - // .postState(jobPosting.getPostState()) - .jobName(jobPosting.getJob().getJobName()) - .entAddr1(jobPosting.getEnterprise().getEntAddr1()) - .entAddr2(jobPosting.getEnterprise().getEntAddr2()) - .build(); + .postTitle(jobPosting.getPostTitle()) + .entName(jobPosting.getEnterprise().getEntName()) + .postImg(jobPosting.getPostImg()) + .startDate(jobPosting.getStartDate()) + .endDate(jobPosting.getEndDate()) + // .postState(jobPosting.getPostState()) + .jobName(jobPosting.getJob().getJobName()) + .entAddr1(jobPosting.getEnterprise().getEntAddr1()) + .entAddr2(jobPosting.getEnterprise().getEntAddr2()) + .build(); } else { // 공고가 존재하지 않는 경우 예외 로그 logger.error("공고가 존재하지 않습니다 - ID: {}", postId); @@ -103,7 +108,7 @@ public List getJobPostingList(String entId) { .endDate(jp.getEndDate()) .applicantCount(jp.getApplicantCount()) .build() - ) + ) .collect(Collectors.toList()); } @@ -135,16 +140,41 @@ public List getJobApplicants(int postId) { }).collect(Collectors.toList()); } + // TODO: 지원자 알림 // 5. 지원자 결과 설정 @Override public String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO) { int applyId = applicantResultReqDTO.getApplyId(); ApplyResult applyResult = applicantResultReqDTO.getApplyResult(); - if(userApplyRepository.setApplicantResult(applyId, applyResult) == 1){ + if (userApplyRepository.setApplicantResult(applyId, applyResult) == 1) { + + UserApply userApply = userApplyRepository.findById((long)applyId) + .orElseThrow(() -> new RuntimeException("지원 정보를 찾을 수 없습니다.")); + WbUser wbUser = userApply.getWbUser(); + String entName = userApply.getJobPosting().getEnterprise().getEntName(); + + String applyResultKorean = switch (applyResult.name()) { + case "PENDING" -> "발표 전"; + case "ACCEPTED" -> "합격"; + case "FAILED" -> "탈락"; + case "CANCELED" -> "지원취소됨"; + default -> ""; + }; + + // 알림 생성 + Notification notification = Notification.builder() + .wbUser(wbUser) + .userApply(userApply) + .notice(entName+" 지원결과 : "+ applyResultKorean) + .isConfirmed(YN.N) + .build(); + + notificationRepository.save(notification); + return "지원자 결과 설정이 완료되었습니다."; - }else + } else { return "지원자 결과 설정에 실패했습니다."; + } } - } \ No newline at end of file From 5791e8211cd692a7e709656ac7353476ffe47a85 Mon Sep 17 00:00:00 2001 From: haewoni Date: Wed, 13 Nov 2024 10:22:22 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[feat]=20#34=20-=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=A7=81=EB=AC=B4=EB=B3=84=20=EC=9D=B8=EC=9E=AC=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnterpriseJobPostingController.java | 7 ++++- .../facade/EnterpriseJobPostingFacade.java | 4 +++ .../jobposting/JobPostingRepository.java | 8 ++++++ .../Service/EntJobPostingService.java | 3 +++ .../Service/EntJobPostingServiceImpl.java | 27 +++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wooribound/api/corporate/controller/EnterpriseJobPostingController.java b/src/main/java/com/wooribound/api/corporate/controller/EnterpriseJobPostingController.java index 6ab2f54..5dcfdfc 100644 --- a/src/main/java/com/wooribound/api/corporate/controller/EnterpriseJobPostingController.java +++ b/src/main/java/com/wooribound/api/corporate/controller/EnterpriseJobPostingController.java @@ -4,8 +4,8 @@ import com.wooribound.api.corporate.dto.ApplicantsDTO; import com.wooribound.api.corporate.dto.JobPostingReqDTO; import com.wooribound.api.corporate.facade.EnterpriseJobPostingFacade; +import com.wooribound.domain.jobposting.dto.JobPostingDTO; import com.wooribound.domain.jobposting.dto.JobPostingDetailDTO; -import com.wooribound.domain.jobposting.dto.JobPostingDetailProjection; import com.wooribound.domain.resume.dto.ResumeDTO; import com.wooribound.domain.userapply.dto.ApplicantResultReqDTO; import lombok.RequiredArgsConstructor; @@ -57,6 +57,11 @@ public String setApplicantResult(@RequestBody ApplicantResultReqDTO applicantRes return enterpriseJobPostingFacade.setApplicantResult(applicantResultReqDTO); } + // 7. 공고별 지원자 추천 (헤드헌팅기능) + @GetMapping("/applicant-recommend") + public List getApplicantRecommendation(@RequestParam int jobId) { + return enterpriseJobPostingFacade.getApplicantRecommendation(jobId); + } } diff --git a/src/main/java/com/wooribound/api/corporate/facade/EnterpriseJobPostingFacade.java b/src/main/java/com/wooribound/api/corporate/facade/EnterpriseJobPostingFacade.java index c83e0c6..97a5b15 100644 --- a/src/main/java/com/wooribound/api/corporate/facade/EnterpriseJobPostingFacade.java +++ b/src/main/java/com/wooribound/api/corporate/facade/EnterpriseJobPostingFacade.java @@ -56,4 +56,8 @@ public String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO) { return entJobPostingService.setApplicantResult(applicantResultReqDTO); } + // 6. 공고별 지원자 추천 (헤드헌팅기능) + public List getApplicantRecommendation(int jobId) { + return entJobPostingService.getApplicantRecommendation(jobId); + } } diff --git a/src/main/java/com/wooribound/domain/jobposting/JobPostingRepository.java b/src/main/java/com/wooribound/domain/jobposting/JobPostingRepository.java index a7d3636..38c8f9e 100644 --- a/src/main/java/com/wooribound/domain/jobposting/JobPostingRepository.java +++ b/src/main/java/com/wooribound/domain/jobposting/JobPostingRepository.java @@ -2,6 +2,7 @@ import com.wooribound.api.individual.dto.JobPostingProjection; import com.wooribound.domain.jobposting.dto.JobPostingDetailProjection; +import com.wooribound.domain.wbuser.WbUser; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -81,4 +82,11 @@ List findJobPostingsNew(@Param("exJobs") List exJo @Modifying @Query("UPDATE JobPosting jp SET jp.isDeleted = 'Y' WHERE jp.postId = :postId") int updateIsDeletedByPostId(@Param("postId") Long postId); + + // 6. 공고별 지원자 추천 (헤드헌팅기능) + @Query("SELECT w FROM WbUser w " + + "JOIN w.workHistories wh " + + "WHERE wh.job.jobId = :jobId " + + "ORDER BY w.jobPoint DESC") + List findApplicantRecommendation(@Param("jobId") int jobId); } diff --git a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingService.java b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingService.java index ab0ea91..5845f6e 100644 --- a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingService.java +++ b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingService.java @@ -24,4 +24,7 @@ public interface EntJobPostingService { // 5. 지원자 결과 설정 String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO); + + // 6. 공고별 지원자 추천 (헤드헌팅기능) + List getApplicantRecommendation(int jobId); } \ No newline at end of file diff --git a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java index e8c7cdf..fbd5949 100644 --- a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java +++ b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java @@ -177,4 +177,31 @@ public String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO) { return "지원자 결과 설정에 실패했습니다."; } } + + // 6. 공고 직무별 지원자 추천 (헤드헌팅기능) + @Override + public List getApplicantRecommendation(int jobId) { + + List recommendedUsers = jobPostingRepository.findApplicantRecommendation(jobId); + + return recommendedUsers.stream().map(user -> { + // 생일 계산 + Date birthDate = user.getBirth(); + Calendar today = Calendar.getInstance(); + Calendar birthCalendar = Calendar.getInstance(); + birthCalendar.setTime(birthDate); + + int age = today.get(Calendar.YEAR) - birthCalendar.get(Calendar.YEAR); + if (today.get(Calendar.DAY_OF_YEAR) < birthCalendar.get(Calendar.DAY_OF_YEAR)) { + age--; + } + + return ApplicantsDTO.builder() + .applicantName(user.getName()) + .applicantGender(user.getGender()) + .applicantAge(age) + .build(); + }).collect(Collectors.toList()); + + } } \ No newline at end of file From 5dbc20bb15f4b9fdc8b37e0fbd7670c0f9ee17ed Mon Sep 17 00:00:00 2001 From: haewoni Date: Wed, 13 Nov 2024 10:42:20 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20#34=20-=20=EC=A7=80=EC=9B=90?= =?UTF-8?q?=EC=9E=90=20=EA=B2=B0=EA=B3=BC=EC=84=A4=EC=A0=95=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=88=98=EC=A0=95=20-=20createdAt=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/jobposting/Service/EntJobPostingServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java index fbd5949..4377dfa 100644 --- a/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java +++ b/src/main/java/com/wooribound/domain/jobposting/Service/EntJobPostingServiceImpl.java @@ -140,7 +140,6 @@ public List getJobApplicants(int postId) { }).collect(Collectors.toList()); } - // TODO: 지원자 알림 // 5. 지원자 결과 설정 @Override public String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO) { @@ -168,6 +167,7 @@ public String setApplicantResult(ApplicantResultReqDTO applicantResultReqDTO) { .userApply(userApply) .notice(entName+" 지원결과 : "+ applyResultKorean) .isConfirmed(YN.N) + .createdAt(new Date()) .build(); notificationRepository.save(notification);