From 8f9502fdb1a1bd96277c9149ba8d09e2789662ac Mon Sep 17 00:00:00 2001 From: Kim Doo Hyeon Date: Wed, 19 Feb 2025 16:59:40 +0900 Subject: [PATCH] =?UTF-8?q?[ALL]=20=EC=9D=B4=EA=B2=83=EC=A0=80=EA=B2=83=20?= =?UTF-8?q?#43?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 보호사용 어르신 상세 조회 api --- .../young/blaybus/domain/center/Center.java | 5 + .../domain/center/service/CenterService.java | 157 +++++++++--------- .../blaybus/domain/matching/Matching.java | 3 + .../controller/MatchingController.java | 12 ++ .../DetailMatchingSeniorResponse.java | 76 +++++++++ .../response/DetailSeniorResponse.java | 28 ++-- .../repository/DetailSeniorRepository.java | 29 ++++ .../senior/service/DetailSeniorService.java | 43 ++++- .../domain/senior/service/SeniorService.java | 5 + 9 files changed, 260 insertions(+), 98 deletions(-) create mode 100644 src/main/java/young/blaybus/domain/senior/controller/response/DetailMatchingSeniorResponse.java diff --git a/src/main/java/young/blaybus/domain/center/Center.java b/src/main/java/young/blaybus/domain/center/Center.java index 9b8b64c..0e8bb3b 100644 --- a/src/main/java/young/blaybus/domain/center/Center.java +++ b/src/main/java/young/blaybus/domain/center/Center.java @@ -15,6 +15,7 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import young.blaybus.config.jpa.BooleanToYNConverter; +import young.blaybus.config.jpa.CryptoConverter; import young.blaybus.domain.address.Address; import young.blaybus.domain.member.Member; import young.blaybus.domain.senior.Senior; @@ -34,6 +35,10 @@ public class Center { @Comment("센터명") private String name; + @Convert(converter = CryptoConverter.class) + @Comment("센터 전화번호") + private String phoneNumber; + @Convert(converter = BooleanToYNConverter.class) @Column(columnDefinition = "char(1) default 'N'") @Comment("목욕 차량 보유 여부") diff --git a/src/main/java/young/blaybus/domain/center/service/CenterService.java b/src/main/java/young/blaybus/domain/center/service/CenterService.java index 50fa9a3..7eba773 100644 --- a/src/main/java/young/blaybus/domain/center/service/CenterService.java +++ b/src/main/java/young/blaybus/domain/center/service/CenterService.java @@ -20,87 +20,86 @@ @RequiredArgsConstructor public class CenterService { - private final CenterRepository centerRepository; - - // 센터 등록 - @Transactional - public GetCenterResponse registerCenter(String centerName) { - Center center = Center.builder() - .name(centerName) - .build(); - - centerRepository.save(center); - - Center center1 = centerRepository.findByName(centerName); - return GetCenterResponse.builder() - .id(String.valueOf(center1.getId())) - .name(center1.getName()) - .build(); + private final CenterRepository centerRepository; + + // 센터 등록 + @Transactional + public GetCenterResponse registerCenter(String centerName) { + Center center = Center.builder() + .name(centerName) + .build(); + + centerRepository.save(center); + + Center center1 = centerRepository.findByName(centerName); + return GetCenterResponse.builder() + .id(String.valueOf(center1.getId())) + .name(center1.getName()) + .build(); + } + + // 센터 조회 + @Transactional + public GetCenterResponse getCenterCheck(String centerName) { + Center center1 = centerRepository.findByName(centerName); + return GetCenterResponse.builder() + .id(String.valueOf(center1.getId())) + .name(center1.getName()) + .build(); + } + + // 센터 상세 조회 + @Transactional + public GetCenterDetailInforResponse getCenterDetailInfor(String centerName) { + Center center = centerRepository.findByName(centerName); + return GetCenterDetailInforResponse.builder() + .id(String.valueOf(center.getId())) + .name(center.getName()) + .city(center.getAddress().getCity()) + .gu(center.getAddress().getDistrict()) + .dong(center.getAddress().getDong()) + .operationPeriod(center.getOperationPeriod()) + .grade(center.getGrade()) + .bathCarYn(center.getBathCarYn()) + .introduction(center.getIntroduction()) + .build(); + } + + // 센터 상세 정보 등록 (등록된 센터에 상세 정보 포함해 수정) + @Transactional + public void registerCenterDetailInfor(Member member, CreateAdminRequest adminRequest) { + if (member != null) System.out.println(member.getId()); + + Center center = centerRepository.findByName(adminRequest.center().name()); + + center = center.toBuilder() + .id(center.getId()) + .name(adminRequest.center().name()) + .bathCarYn(adminRequest.center().bathCarYn()) + .grade(adminRequest.center().grade()) + .operationPeriod(adminRequest.center().operationPeriod()) + .address(new Address(adminRequest.center().city(), adminRequest.center().gu(), adminRequest.center().dong(), null)) + .introduction(adminRequest.center().introduction()) + .phoneNumber(adminRequest.phoneNumber()) + .build(); + + centerRepository.save(center); + } + + // 센터 이름으로 센터 등록 여부 조회 + public GetCenter isRegistrationCenterByName(String name) { + Optional> centers = centerRepository.findByNameContaining(name); + + String centerName = null; + if (centers.isPresent()) { + for (Center center : centers.get()) { + if (center.getName().equals(name)) centerName = center.getName(); + } } - // 센터 조회 - @Transactional - public GetCenterResponse getCenterCheck(String centerName) { - Center center1 = centerRepository.findByName(centerName); - return GetCenterResponse.builder() - .id(String.valueOf(center1.getId())) - .name(center1.getName()) - .build(); - } - - // 센터 상세 조회 - @Transactional - public GetCenterDetailInforResponse getCenterDetailInfor(String centerName) { - Center center = centerRepository.findByName(centerName); - return GetCenterDetailInforResponse.builder() - .id(String.valueOf(center.getId())) - .name(center.getName()) - .city(center.getAddress().getCity()) - .gu(center.getAddress().getDistrict()) - .dong(center.getAddress().getDong()) - .operationPeriod(center.getOperationPeriod()) - .grade(center.getGrade()) - .bathCarYn(center.getBathCarYn()) - .introduction(center.getIntroduction()) - .build(); - } - - // 센터 상세 정보 등록 (등록된 센터에 상세 정보 포함해 수정) - @Transactional - public void registerCenterDetailInfor(Member member, CreateAdminRequest adminRequest) { - if (member != null) System.out.println(member.getId()); - - Center center = centerRepository.findByName(adminRequest.center().name()); - LocalDateTime now = LocalDateTime.now(); - - center = center.toBuilder() - .id(center.getId()) - .name(adminRequest.center().name()) - .bathCarYn(adminRequest.center().bathCarYn()) - .grade(adminRequest.center().grade()) - .operationPeriod(adminRequest.center().operationPeriod()) - .address(new Address(adminRequest.center().city(), adminRequest.center().gu(), adminRequest.center().dong(), null)) - .introduction(adminRequest.center().introduction()) - .updatedTime(now) - .build(); - - centerRepository.save(center); - } - - // 센터 이름으로 센터 등록 여부 조회 - public GetCenter isRegistrationCenterByName(String name) { - Optional> centers = centerRepository.findByNameContaining(name); - - String centerName = null; - if (centers.isPresent()) { - for (Center center : centers.get()) { - if (center.getName().equals(name)) centerName = center.getName(); - } - } - - if (centerName != null) return new GetCenter("해당 센터는 현재 등록되어 있습니다.", true); - return new GetCenter("해당 센터는 현재 등록되어 있지 않습니다.", false); - } + if (centerName != null) return new GetCenter("해당 센터는 현재 등록되어 있습니다.", true); + return new GetCenter("해당 센터는 현재 등록되어 있지 않습니다.", false); + } } diff --git a/src/main/java/young/blaybus/domain/matching/Matching.java b/src/main/java/young/blaybus/domain/matching/Matching.java index 73215ca..2565a58 100644 --- a/src/main/java/young/blaybus/domain/matching/Matching.java +++ b/src/main/java/young/blaybus/domain/matching/Matching.java @@ -41,6 +41,9 @@ public class Matching { @Comment("매칭 상태") private MatchingStatus status; + @Comment("적합도(%)") + private Integer fitness; + @CreatedDate @Column(updatable = false) private LocalDateTime createdTime; diff --git a/src/main/java/young/blaybus/domain/matching/controller/MatchingController.java b/src/main/java/young/blaybus/domain/matching/controller/MatchingController.java index 9e1193d..2adb7d4 100644 --- a/src/main/java/young/blaybus/domain/matching/controller/MatchingController.java +++ b/src/main/java/young/blaybus/domain/matching/controller/MatchingController.java @@ -12,6 +12,8 @@ import young.blaybus.domain.matching.controller.request.PatchStatusRequest; import young.blaybus.domain.matching.controller.response.*; import young.blaybus.domain.matching.service.MatchingService; +import young.blaybus.domain.senior.controller.response.DetailMatchingSeniorResponse; +import young.blaybus.domain.senior.service.SeniorService; @RestController @RequiredArgsConstructor @@ -20,6 +22,7 @@ public class MatchingController { private final MatchingService matchingService; + private final SeniorService seniorService; // 매칭 요청 @PostMapping(value = "/request/{worker-id}/{senior-id}") @@ -79,4 +82,13 @@ public ApiResponse update(@RequestBody PatchStatusRequest statusRequest) { return ApiResponse.onSuccess(); } + + @GetMapping("/{senior-id}") + @Operation(summary = "매칭 요청 어르신 상세 조회") + public ApiResponse getMatchingSenior( + @PathVariable("senior-id") Long seniorId + ) { + return ApiResponse.onSuccess(seniorService.getMatchingSenior(seniorId)); + } + } diff --git a/src/main/java/young/blaybus/domain/senior/controller/response/DetailMatchingSeniorResponse.java b/src/main/java/young/blaybus/domain/senior/controller/response/DetailMatchingSeniorResponse.java new file mode 100644 index 0000000..26c1dc0 --- /dev/null +++ b/src/main/java/young/blaybus/domain/senior/controller/response/DetailMatchingSeniorResponse.java @@ -0,0 +1,76 @@ +package young.blaybus.domain.senior.controller.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Builder.Default; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import young.blaybus.domain.senior.enums.CareGrade; +import young.blaybus.domain.senior.enums.Sex; +import young.blaybus.util.enums.CareStyle; + +@Builder +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "어르신 상세 조회 응답 객체") +public class DetailMatchingSeniorResponse { + + private long seniorId; + + private String profileUrl; + + private String name; + + private Sex sex; + + private LocalDate birthday; + + private String address; + + private Integer salary; + + private CareGrade careGrade; + + private CareStyle careStyle; + + @Setter + private List dayList; + + @Setter + @Default + private List careList = new ArrayList<>(); + + private LocalTime startTime; + + private LocalTime endTime; + + private Integer fitness; + + private String phoneNumber; + + + public String getStartTime() { + return startTime.format(DateTimeFormatter.ofPattern("a HH:mm").withLocale(Locale.forLanguageTag("ko"))); + } + public String getEndTime() { + return endTime.format(DateTimeFormatter.ofPattern("HH:mm").withLocale(Locale.forLanguageTag("ko"))); + } + + public String getCareGrade() { + return careGrade.getValue(); + } + + public String getCareStyle() { + String emojiRegex = "[\uD83C-\uDBFF\uDC00-\uDFFF\u2600-\u26FF]+"; + return careStyle.getValue().replaceAll(emojiRegex, "").strip(); + } +} diff --git a/src/main/java/young/blaybus/domain/senior/controller/response/DetailSeniorResponse.java b/src/main/java/young/blaybus/domain/senior/controller/response/DetailSeniorResponse.java index 961d9a7..8066041 100644 --- a/src/main/java/young/blaybus/domain/senior/controller/response/DetailSeniorResponse.java +++ b/src/main/java/young/blaybus/domain/senior/controller/response/DetailSeniorResponse.java @@ -40,20 +40,20 @@ public class DetailSeniorResponse { private CareGrade careGrade; - @Setter - private List dayValueList; - - @Setter - private List foodAssistValueList; - - @Setter - private List moveAssistValueList; - - @Setter - private List lifeAssistValueList; - - @Setter - private List toiletAssistValueList; +// @Setter +// private List dayValueList; +// +// @Setter +// private List foodAssistValueList; +// +// @Setter +// private List moveAssistValueList; +// +// @Setter +// private List lifeAssistValueList; +// +// @Setter +// private List toiletAssistValueList; @Setter private List dayList; diff --git a/src/main/java/young/blaybus/domain/senior/repository/DetailSeniorRepository.java b/src/main/java/young/blaybus/domain/senior/repository/DetailSeniorRepository.java index 9aad60f..f39d466 100644 --- a/src/main/java/young/blaybus/domain/senior/repository/DetailSeniorRepository.java +++ b/src/main/java/young/blaybus/domain/senior/repository/DetailSeniorRepository.java @@ -1,6 +1,7 @@ package young.blaybus.domain.senior.repository; import static young.blaybus.domain.job_seek.QJobSeek.jobSeek; +import static young.blaybus.domain.matching.QMatching.matching; import static young.blaybus.domain.senior.QSenior.senior; import static young.blaybus.domain.senior.QSeniorDay.seniorDay; import static young.blaybus.domain.senior.QSeniorFoodAssist.seniorFoodAssist; @@ -13,6 +14,8 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import young.blaybus.domain.member.Member; +import young.blaybus.domain.senior.controller.response.DetailMatchingSeniorResponse; import young.blaybus.domain.senior.controller.response.DetailSeniorResponse; import young.blaybus.util.enums.DayOfWeek; import young.blaybus.util.enums.assist.FoodAssist; @@ -93,4 +96,30 @@ public List getToiletAssistList(Long seniorId) { .where(seniorToiletAssist.senior.id.eq(seniorId)) .fetch(); } + + public DetailMatchingSeniorResponse getMatchingSenior(Long seniorId, Member worker) { + return queryFactory.select( + Projections.fields( + DetailMatchingSeniorResponse.class, + senior.id.as("seniorId"), + senior.name, + senior.careGrade, + senior.careStyle, + senior.profileUrl, + senior.sex, + senior.birthday, + senior.address, + jobSeek.salary, + senior.startTime, + senior.endTime, + matching.fitness, + senior.center.phoneNumber + ) + ) + .from(senior) + .innerJoin(matching).on(matching.senior.eq(senior), matching.member.eq(worker)) + .leftJoin(jobSeek).on(senior.eq(jobSeek.senior)) + .where(senior.id.eq(seniorId)) + .fetchOne(); + } } diff --git a/src/main/java/young/blaybus/domain/senior/service/DetailSeniorService.java b/src/main/java/young/blaybus/domain/senior/service/DetailSeniorService.java index 505e64d..4b3d160 100644 --- a/src/main/java/young/blaybus/domain/senior/service/DetailSeniorService.java +++ b/src/main/java/young/blaybus/domain/senior/service/DetailSeniorService.java @@ -1,9 +1,16 @@ package young.blaybus.domain.senior.service; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import young.blaybus.api_response.exception.GeneralException; +import young.blaybus.api_response.status.ErrorStatus; +import young.blaybus.domain.member.Member; +import young.blaybus.domain.member.repository.MemberRepository; +import young.blaybus.domain.member.security.SecurityUtils; +import young.blaybus.domain.senior.controller.response.DetailMatchingSeniorResponse; import young.blaybus.domain.senior.controller.response.DetailSeniorResponse; import young.blaybus.domain.senior.repository.DetailSeniorRepository; import young.blaybus.util.enums.DayOfWeek; @@ -18,6 +25,7 @@ public class DetailSeniorService { private final DetailSeniorRepository detailSeniorRepository; + private final MemberRepository memberRepository; public DetailSeniorResponse getSenior(Long seniorId) { @@ -33,12 +41,37 @@ public DetailSeniorResponse getSenior(Long seniorId) { senior.setFoodAssistList(foodAssistList); senior.setMoveAssistList(moveAssistList); senior.setToiletAssistList(toiletAssistList); - senior.setDayValueList(seniorDayList.stream().map(DayOfWeek::toString).toList()); - senior.setLifeAssistValueList(lifeAssistList.stream().map(LifeAssist::getValue).toList()); - senior.setFoodAssistValueList(foodAssistList.stream().map(FoodAssist::getValue).toList()); - senior.setMoveAssistValueList(moveAssistList.stream().map(MoveAssist::getValue).toList()); - senior.setToiletAssistValueList(toiletAssistList.stream().map(ToiletAssist::getValue).toList()); +// senior.setDayValueList(seniorDayList.stream().map(DayOfWeek::toString).toList()); +// senior.setLifeAssistValueList(lifeAssistList.stream().map(LifeAssist::getValue).toList()); +// senior.setFoodAssistValueList(foodAssistList.stream().map(FoodAssist::getValue).toList()); +// senior.setMoveAssistValueList(moveAssistList.stream().map(MoveAssist::getValue).toList()); +// senior.setToiletAssistValueList(toiletAssistList.stream().map(ToiletAssist::getValue).toList()); return senior; } + + public DetailMatchingSeniorResponse getMatchingSenior(Long seniorId) { + String currentMemberId = SecurityUtils.getCurrentMemberName(); + Member worker = memberRepository.findById(currentMemberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.UNAUTHORIZED)); + + DetailMatchingSeniorResponse response = detailSeniorRepository.getMatchingSenior(seniorId, worker); + + List seniorDayList = detailSeniorRepository.getSeniorDayList(seniorId); + response.setDayList(seniorDayList.stream().map(Enum::name).toList()); + + List lifeAssistList = detailSeniorRepository.getLifeAssistList(seniorId); + List foodAssistList = detailSeniorRepository.getFoodAssistList(seniorId); + List moveAssistList = detailSeniorRepository.getMoveAssistList(seniorId); + List toiletAssistList = detailSeniorRepository.getToiletAssistList(seniorId); + + List careList = lifeAssistList.stream().map(LifeAssist::getValue).collect(Collectors.toList()); + foodAssistList.stream().map(FoodAssist::getValue).forEach(careList::add); + moveAssistList.stream().map(MoveAssist::getValue).forEach(careList::add); + toiletAssistList.stream().map(ToiletAssist::getValue).forEach(careList::add); + + response.setCareList(careList); + + return response; + } } diff --git a/src/main/java/young/blaybus/domain/senior/service/SeniorService.java b/src/main/java/young/blaybus/domain/senior/service/SeniorService.java index 8bf44ad..41ea47d 100644 --- a/src/main/java/young/blaybus/domain/senior/service/SeniorService.java +++ b/src/main/java/young/blaybus/domain/senior/service/SeniorService.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import young.blaybus.domain.senior.controller.request.CreateSeniorRequest; import young.blaybus.domain.senior.controller.request.UpdateSeniorRequest; +import young.blaybus.domain.senior.controller.response.DetailMatchingSeniorResponse; import young.blaybus.domain.senior.controller.response.DetailSeniorResponse; import young.blaybus.domain.senior.controller.response.ListSeniorResponse; @@ -30,4 +31,8 @@ public void createSenior(CreateSeniorRequest request) { public void updateSenior(Long seniorId, UpdateSeniorRequest request) { createSeniorService.updateSenior(seniorId, request); } + + public DetailMatchingSeniorResponse getMatchingSenior(Long seniorId) { + return detailSeniorService.getMatchingSenior(seniorId); + } }