From f31a0f0002edafafc37ef56f8b223eeddd940151 Mon Sep 17 00:00:00 2001 From: Kim Doo Hyeon <66135897+engus525@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:05:34 +0900 Subject: [PATCH] =?UTF-8?q?Revert=20"[TASK]=20JobSearch=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blaybus/domain/job_search/JobSearch.java | 30 ++++++---- .../domain/job_search/JobSearchTimeSlot.java | 33 ----------- .../request/CreateJobSearchRequest.java | 10 +++- .../request/JobSearchTimeSlotRequest.java | 17 ------ .../request/UpdateJobSearchRequest.java | 10 ++-- .../response/DetailJobSearchResponse.java | 9 ++- .../response/JobSearchTimeSlotResponse.java | 24 -------- .../job_search/service/JobSearchService.java | 40 ++++++------- .../controller/response/ListRecommendDto.java | 12 +++- .../controller/response/TimeSlotDto.java | 24 -------- .../senior/service/RecommendService.java | 58 +++++++------------ 11 files changed, 90 insertions(+), 177 deletions(-) delete mode 100644 src/main/java/young/blaybus/domain/job_search/JobSearchTimeSlot.java delete mode 100644 src/main/java/young/blaybus/domain/job_search/request/JobSearchTimeSlotRequest.java delete mode 100644 src/main/java/young/blaybus/domain/job_search/response/JobSearchTimeSlotResponse.java delete mode 100644 src/main/java/young/blaybus/domain/senior/controller/response/TimeSlotDto.java diff --git a/src/main/java/young/blaybus/domain/job_search/JobSearch.java b/src/main/java/young/blaybus/domain/job_search/JobSearch.java index 90541c4..69cd20f 100644 --- a/src/main/java/young/blaybus/domain/job_search/JobSearch.java +++ b/src/main/java/young/blaybus/domain/job_search/JobSearch.java @@ -17,10 +17,9 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import young.blaybus.domain.job_search.request.JobSearchAreaRequest; -import young.blaybus.domain.job_search.request.JobSearchTimeSlotRequest; import young.blaybus.domain.job_search.request.UpdateJobSearchRequest; import young.blaybus.domain.member.Member; - +import young.blaybus.util.enums.DayOfWeek; @Entity @Builder @@ -34,6 +33,12 @@ public class JobSearch { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Comment("시작 시간") + private LocalTime startTime; + + @Comment("종료 시간") + private LocalTime endTime; + @Comment("희망 급여") private Integer salary; @@ -54,9 +59,16 @@ public class JobSearch { @Builder.Default @OneToMany(mappedBy = "jobSearch", cascade = CascadeType.ALL, orphanRemoval = true) - private List timeSlots = new ArrayList<>(); + private List dayList = new ArrayList<>(); public void updateFromDto(UpdateJobSearchRequest request){ + if(request.startTime()!=null) { + this.startTime = LocalTime.parse(request.startTime()); + } + + if(request.endTime()!=null) { + this.endTime = LocalTime.parse(request.endTime()); + } if(request.salary()!=null) { this.salary = request.salary(); @@ -72,14 +84,12 @@ public void updateFromDto(UpdateJobSearchRequest request){ } } - if (!request.timeSlots().isEmpty()) { - this.timeSlots.clear(); - for (JobSearchTimeSlotRequest timeSlot : request.timeSlots()) { - this.timeSlots.add(JobSearchTimeSlot.builder() + if(!request.dayList().isEmpty()) { + this.dayList.clear(); + for (DayOfWeek dayOfWeek : request.dayList()) { + this.dayList.add(JobSearchDay.builder() .jobSearch(this) - .day(timeSlot.day()) - .startTime(LocalTime.parse(timeSlot.startTime())) - .endTime(LocalTime.parse(timeSlot.endTime())) + .day(dayOfWeek) .build()); } } diff --git a/src/main/java/young/blaybus/domain/job_search/JobSearchTimeSlot.java b/src/main/java/young/blaybus/domain/job_search/JobSearchTimeSlot.java deleted file mode 100644 index 12da48e..0000000 --- a/src/main/java/young/blaybus/domain/job_search/JobSearchTimeSlot.java +++ /dev/null @@ -1,33 +0,0 @@ -package young.blaybus.domain.job_search; - -import jakarta.persistence.*; -import lombok.*; -import org.hibernate.annotations.Comment; -import young.blaybus.util.enums.DayOfWeek; - -import java.time.LocalTime; - -@Entity -@Builder -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class JobSearchTimeSlot { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Enumerated(EnumType.STRING) - private DayOfWeek day; - - @Comment("시작 시간") - private LocalTime startTime; - - @Comment("종료 시간") - private LocalTime endTime; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "job_search_id") - private JobSearch jobSearch; -} \ No newline at end of file diff --git a/src/main/java/young/blaybus/domain/job_search/request/CreateJobSearchRequest.java b/src/main/java/young/blaybus/domain/job_search/request/CreateJobSearchRequest.java index 42bfcd0..e7ec9fe 100644 --- a/src/main/java/young/blaybus/domain/job_search/request/CreateJobSearchRequest.java +++ b/src/main/java/young/blaybus/domain/job_search/request/CreateJobSearchRequest.java @@ -11,13 +11,19 @@ public record CreateJobSearchRequest( @Schema(description = "회원 ID") String memberId, + @Schema(description = "근무 시작 시간 (09:30)") + String startTime, + + @Schema(description = "근무 종료 시간(18:00)") + String endTime, + @Schema(description = "희망 시급") Integer salary, @Schema(description = "근무 가능 지역") List jobSearchAreas, - @Schema(description = "근무 가능 요일&시간대 목록") - List timeSlots + @Schema(description = "근무 가능 요일 목록") + List dayList ) { } diff --git a/src/main/java/young/blaybus/domain/job_search/request/JobSearchTimeSlotRequest.java b/src/main/java/young/blaybus/domain/job_search/request/JobSearchTimeSlotRequest.java deleted file mode 100644 index 9563492..0000000 --- a/src/main/java/young/blaybus/domain/job_search/request/JobSearchTimeSlotRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package young.blaybus.domain.job_search.request; - -import io.swagger.v3.oas.annotations.media.Schema; -import young.blaybus.util.enums.DayOfWeek; - -@Schema(description = "근무 가능 시간대 요청 객체") -public record JobSearchTimeSlotRequest( - @Schema(description = "근무 요일") - DayOfWeek day, - - @Schema(description = "근무 시작 시간 (HH:mm)") - String startTime, - - @Schema(description = "근무 종료 시간 (HH:mm)") - String endTime -){ -} diff --git a/src/main/java/young/blaybus/domain/job_search/request/UpdateJobSearchRequest.java b/src/main/java/young/blaybus/domain/job_search/request/UpdateJobSearchRequest.java index a12cc68..5667810 100644 --- a/src/main/java/young/blaybus/domain/job_search/request/UpdateJobSearchRequest.java +++ b/src/main/java/young/blaybus/domain/job_search/request/UpdateJobSearchRequest.java @@ -7,6 +7,11 @@ @Schema(description = "구직 정보 수정 객체") public record UpdateJobSearchRequest( + @Schema(description = "근무 시작 시간 (09:30)") + String startTime, + + @Schema(description = "근무 종료 시간(18:00)") + String endTime, @Schema(description = "희망 시급") Integer salary, @@ -15,9 +20,6 @@ public record UpdateJobSearchRequest( List jobSearchAreas, @Schema(description = "근무 가능 요일 목록") - List dayList, - - @Schema(description = "근무 가능 요일&시간대 목록") - List timeSlots + List dayList ) { } diff --git a/src/main/java/young/blaybus/domain/job_search/response/DetailJobSearchResponse.java b/src/main/java/young/blaybus/domain/job_search/response/DetailJobSearchResponse.java index 9436e7c..917c30e 100644 --- a/src/main/java/young/blaybus/domain/job_search/response/DetailJobSearchResponse.java +++ b/src/main/java/young/blaybus/domain/job_search/response/DetailJobSearchResponse.java @@ -16,6 +16,11 @@ public class DetailJobSearchResponse { @Schema(description = "구직 정보 ID") private Long jobSearchId; + @Schema(description = "근무 시작 시간") + private String startTime; + + @Schema(description = "근무 종료 시간") + private String endTime; @Schema(description = "희망 급여") private Integer salary; @@ -23,6 +28,6 @@ public class DetailJobSearchResponse { @Schema(description = "근무 가능 지역 목록") private List jobSearchAreas; - @Schema(description = "근무 가능 요일&시간대 목록") - private List timeSlots; + @Schema(description = "근무 가능 요일 목록") + private List dayList; } diff --git a/src/main/java/young/blaybus/domain/job_search/response/JobSearchTimeSlotResponse.java b/src/main/java/young/blaybus/domain/job_search/response/JobSearchTimeSlotResponse.java deleted file mode 100644 index e00ef55..0000000 --- a/src/main/java/young/blaybus/domain/job_search/response/JobSearchTimeSlotResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package young.blaybus.domain.job_search.response; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import young.blaybus.util.enums.DayOfWeek; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Schema(description = "근무 가능 요일&시간대 응답 객체") -public class JobSearchTimeSlotResponse { - @Schema(description = "근무 요일") - DayOfWeek day; - - @Schema(description = "근무 시작 시간 (HH:mm)") - String startTime; - - @Schema(description = "근무 종료 시간 (HH:mm)") - String endTime; -} diff --git a/src/main/java/young/blaybus/domain/job_search/service/JobSearchService.java b/src/main/java/young/blaybus/domain/job_search/service/JobSearchService.java index 7981ed6..8ece5dc 100644 --- a/src/main/java/young/blaybus/domain/job_search/service/JobSearchService.java +++ b/src/main/java/young/blaybus/domain/job_search/service/JobSearchService.java @@ -6,15 +6,15 @@ import org.springframework.transaction.annotation.Transactional; import young.blaybus.domain.job_search.JobSearch; import young.blaybus.domain.job_search.JobSearchArea; -import young.blaybus.domain.job_search.JobSearchTimeSlot; +import young.blaybus.domain.job_search.JobSearchDay; import young.blaybus.domain.job_search.repository.JobSearchRepository; import young.blaybus.domain.job_search.request.CreateJobSearchRequest; import young.blaybus.domain.job_search.request.UpdateJobSearchRequest; import young.blaybus.domain.job_search.response.DetailJobSearchResponse; import young.blaybus.domain.job_search.response.JobSearchAreaResponse; -import young.blaybus.domain.job_search.response.JobSearchTimeSlotResponse; import young.blaybus.domain.member.Member; import young.blaybus.domain.member.repository.MemberRepository; +import young.blaybus.util.enums.DayOfWeek; import java.time.LocalDateTime; import java.time.LocalTime; @@ -35,28 +35,28 @@ public void createJobSearch(CreateJobSearchRequest jobSearchRequest) { JobSearch jobSearch = JobSearch.builder() .member(member) + .startTime(LocalTime.parse(jobSearchRequest.startTime())) + .endTime(LocalTime.parse(jobSearchRequest.endTime())) .salary(jobSearchRequest.salary()) .createdTime(LocalDateTime.now()) .build(); - List areas = jobSearchRequest.jobSearchAreas().stream() + List jobSearchAreas = jobSearchRequest.jobSearchAreas().stream() .map(areaRequest -> JobSearchArea.builder() .address(areaRequest.address()) .jobSearch(jobSearch) .build()) .toList(); - jobSearch.getJobSearchAreas().addAll(areas); + jobSearch.getJobSearchAreas().addAll(jobSearchAreas); - List timeSlots = jobSearchRequest.timeSlots().stream() - .map(slot -> JobSearchTimeSlot.builder() + List jobSearchDays = jobSearchRequest.dayList().stream() + .map(day -> JobSearchDay.builder() + .day(day) .jobSearch(jobSearch) - .day(slot.day()) - .startTime(LocalTime.parse(slot.startTime())) - .endTime(LocalTime.parse(slot.endTime())) .build()) .toList(); - jobSearch.getTimeSlots().addAll(timeSlots); + jobSearch.getDayList().addAll(jobSearchDays); jobSearchRepository.save(jobSearch); } @@ -76,24 +76,22 @@ public DetailJobSearchResponse getJobSearch(String memberId) { JobSearch jobSearch= jobSearchRepository.findByMemberId(memberId) .orElseThrow(()->new IllegalArgumentException("해당 회원의 구직 정보가 존재하지 않습니다.")); - List areaResponses = jobSearch.getJobSearchAreas().stream().map(jobSearchArea -> + List jobSearchAreaResponses = jobSearch.getJobSearchAreas().stream().map(jobSearchArea -> JobSearchAreaResponse.builder().address(jobSearchArea.getAddress()).build() ).toList(); - List timeSlotResponses = jobSearch.getTimeSlots().stream() - .map(slot -> JobSearchTimeSlotResponse.builder() - .day(slot.getDay()) - .startTime(slot.getStartTime().toString()) - .endTime(slot.getEndTime().toString()) - .build()) - .toList(); + List dayList = jobSearch.getDayList().stream() + .map(JobSearchDay::getDay) + .map(DayOfWeek::toString) + .collect(Collectors.toList()); return DetailJobSearchResponse.builder() .jobSearchId(jobSearch.getId()) + .startTime(jobSearch.getStartTime().toString()) + .endTime(jobSearch.getEndTime().toString()) .salary(jobSearch.getSalary()) - .jobSearchAreas(areaResponses) - .timeSlots(timeSlotResponses) + .jobSearchAreas(jobSearchAreaResponses) + .dayList(dayList) .build(); - } } diff --git a/src/main/java/young/blaybus/domain/senior/controller/response/ListRecommendDto.java b/src/main/java/young/blaybus/domain/senior/controller/response/ListRecommendDto.java index 0341b96..f1e3270 100644 --- a/src/main/java/young/blaybus/domain/senior/controller/response/ListRecommendDto.java +++ b/src/main/java/young/blaybus/domain/senior/controller/response/ListRecommendDto.java @@ -8,7 +8,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import young.blaybus.domain.job_search.response.JobSearchTimeSlotResponse; import young.blaybus.util.enums.DayOfWeek; @Builder @@ -27,8 +26,15 @@ public class ListRecommendDto { @Schema(description = "프로필 사진") private String profileUrl; - @Schema(description = "근무 가능 요일&시간대 목록") - private List timeSlots; + @Setter + @Schema(description = "희망 요일 목록") + private List dayList; + + @Schema(description = "희망 시작 시간") + private LocalTime startTime; + + @Schema(description = "희망 종료 시간") + private LocalTime endTime; @Schema(description = "돌봄 스타일") private String careStyle; diff --git a/src/main/java/young/blaybus/domain/senior/controller/response/TimeSlotDto.java b/src/main/java/young/blaybus/domain/senior/controller/response/TimeSlotDto.java deleted file mode 100644 index 5a84544..0000000 --- a/src/main/java/young/blaybus/domain/senior/controller/response/TimeSlotDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package young.blaybus.domain.senior.controller.response; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import young.blaybus.util.enums.DayOfWeek; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Schema(description = "근무 요일&시간대 DTO") -public class TimeSlotDto { - @Schema(description = "근무 요일") - DayOfWeek day; - - @Schema(description = "근무 시작 시간 (HH:mm)") - String startTime; - - @Schema(description = "근무 종료 시간 (HH:mm)") - String endTime; -} diff --git a/src/main/java/young/blaybus/domain/senior/service/RecommendService.java b/src/main/java/young/blaybus/domain/senior/service/RecommendService.java index c1b44a8..b3b1019 100644 --- a/src/main/java/young/blaybus/domain/senior/service/RecommendService.java +++ b/src/main/java/young/blaybus/domain/senior/service/RecommendService.java @@ -16,7 +16,6 @@ import young.blaybus.domain.certificate.repository.ListCertificateRepository; import young.blaybus.domain.job_search.JobSearch; import young.blaybus.domain.job_search.JobSearchDay; -import young.blaybus.domain.job_search.JobSearchTimeSlot; import young.blaybus.domain.job_search.repository.JobSearchRepository; import young.blaybus.domain.job_seek.JobSeek; import young.blaybus.domain.job_seek.repository.JobSeekRepository; @@ -26,7 +25,6 @@ import young.blaybus.domain.senior.SeniorDay; import young.blaybus.domain.senior.controller.response.ListRecommendDto; import young.blaybus.domain.senior.controller.response.ListRecommendResponse; -import young.blaybus.domain.senior.controller.response.TimeSlotDto; import young.blaybus.domain.senior.repository.ListRecommendRepository; import young.blaybus.domain.senior.repository.SeniorRepository; import young.blaybus.map.controller.response.geocoding.Coordinate; @@ -57,21 +55,14 @@ public ListRecommendResponse getRecommendList(Long seniorId) { JobSearch jobSearch = jobSearchRepository.findByMemberId(member.getId()).orElse(null); if (jobSearch == null) continue; - // timeSlots 기반으로 요일 및 시간대 가져오기 - List timeSlotDtos = jobSearch.getTimeSlots().stream() - .map(slot -> TimeSlotDto.builder() - .day(slot.getDay()) - .startTime(slot.getStartTime().toString()) // LocalTime → String 변환 - .endTime(slot.getEndTime().toString()) - .build()) - .toList(); - recommendList.add( ListRecommendDto.builder() .memberId(member.getId()) .name(member.getName()) .profileUrl(member.getProfileUrl()) - .timeSlots(timeSlotDtos) + .dayList(jobSearch.getDayList().stream().map(JobSearchDay::getDay).toList()) + .startTime(jobSearch.getStartTime()) + .endTime(jobSearch.getEndTime()) .careStyle(member.getCareStyle().getValue()) .fitness(calculateFitness(member, jobSearch, senior)) .build() @@ -90,18 +81,17 @@ private int calculateFitness(Member member, JobSearch jobSearch, Senior senior) JobSeek jobSeek = jobSeekRepository.findBySenior(senior); - // todo // 거리 : 0km 최고점, 350km 최하점 → 30점 만점 -// fitness += 30; -// Coordinate memberGeocoding = mapService.geocoding(member.getAddress().toString()); -// Coordinate seniorGeocoding = mapService.geocoding(senior.getAddress()); -// Double distance = mapService.getDistance(memberGeocoding, seniorGeocoding); -// double maxDistance = 350_000; -// -// fitness -= Math.min(30, distance * 30 / maxDistance); + fitness += 30; + Coordinate memberGeocoding = mapService.geocoding(member.getAddress().toString()); + Coordinate seniorGeocoding = mapService.geocoding(senior.getAddress()); + Double distance = mapService.getDistance(memberGeocoding, seniorGeocoding); + double maxDistance = 350_000; + + fitness -= Math.min(30, distance * 30 / maxDistance); // 요일 → (노인의 희망 요일이 보호사의 요일과 겹치는 개수) * 15 / (노인의 희망 요일 개수) 점 → 15점 만점 - List memberDayList = jobSearch.getTimeSlots().stream().map(JobSearchTimeSlot::getDay).toList(); + List memberDayList = jobSearch.getDayList().stream().map(JobSearchDay::getDay).toList(); List seniorDayList = senior.getDayList().stream().map(SeniorDay::getDay).toList(); int intersectCount = memberDayList.stream() .filter(seniorDayList::contains) @@ -109,22 +99,16 @@ private int calculateFitness(Member member, JobSearch jobSearch, Senior senior) fitness += (double) (15 * intersectCount) / seniorDayList.size(); // 시간 → 겹치는 시간의 비율 * 15 (15 만점) - for (JobSearchTimeSlot slot : jobSearch.getTimeSlots()) { - LocalTime memberStart = slot.getStartTime(); - LocalTime memberEnd = slot.getEndTime(); - LocalTime seniorStart = senior.getStartTime(); - LocalTime seniorEnd = senior.getEndTime(); - - LocalTime overlapStart = memberStart.isBefore(seniorStart) ? seniorStart : memberStart; - LocalTime overlapEnd = memberEnd.isBefore(seniorEnd) ? memberEnd : seniorEnd; - - if (overlapStart.isBefore(overlapEnd)) { // 겹치는 경우 - long overlapMinutes = Duration.between(overlapStart, overlapEnd).toMinutes(); - long memberTotalMinutes = Duration.between(memberStart, memberEnd).toMinutes(); - if (memberTotalMinutes > 0) { - fitness += (double) 15 * overlapMinutes / memberTotalMinutes; - } - } + LocalTime memberStart = jobSearch.getStartTime(); + LocalTime memberEnd = jobSearch.getEndTime(); + LocalTime seniorStart = senior.getStartTime(); + LocalTime seniorEnd = senior.getEndTime(); + LocalTime overlapStart = memberStart.isBefore(seniorStart) ? seniorStart : memberStart; + LocalTime overlapEnd = memberEnd.isBefore(seniorEnd) ? memberEnd : seniorEnd; + if (overlapStart.isBefore(overlapEnd)) { // 겹치면 + long overlapMinutes = Duration.between(overlapStart, overlapEnd).toMinutes(); + long memberTotalMinutes = Duration.between(memberStart, memberEnd).toMinutes(); + fitness += (double) 15 * overlapMinutes / memberTotalMinutes; } // 자격증 : 요양보호사 제외 개수당 3점 → 10점 만점, 사회복지사 자격증 번호 1로 시작(1급)하면 2점 추가 (10 만점)