diff --git a/src/main/java/com/piuda/callcare/domain/medication/controller/MedicationController.java b/src/main/java/com/piuda/callcare/domain/medication/controller/MedicationController.java index a8d03bb..bf4415b 100644 --- a/src/main/java/com/piuda/callcare/domain/medication/controller/MedicationController.java +++ b/src/main/java/com/piuda/callcare/domain/medication/controller/MedicationController.java @@ -63,24 +63,32 @@ public ResponseEntity>> getGroup( return ResponseUtils.ok(medicationQueryService.getGroup(userId, seniorId, hospitalName, prescriptionDate)); } - @Operation(summary = "약물노트 목록 조회", description = "복용 시작일 + 병원 기준으로 그룹화된 약물 목록을 반환합니다.") + @Operation( + summary = "약물노트 목록 조회", + description = "복용 시작일 + 병원 기준으로 그룹화된 약물 목록을 반환합니다. isActive=true(복용중만) / isActive=false(복용완료만) / 미전달(전체)." + ) @GetMapping("/notes") public ResponseEntity>> getNoteList( @AuthenticationPrincipal Long userId, - @RequestParam Long seniorId + @RequestParam Long seniorId, + @RequestParam(required = false) Boolean isActive ) { - return ResponseUtils.ok(medicationQueryService.getNoteList(userId, seniorId)); + return ResponseUtils.ok(medicationQueryService.getNoteList(userId, seniorId, isActive)); } - @Operation(summary = "약물노트 검색", description = "약 이름/별명/병원명으로 검색합니다. period: 1w·1m·3m·1y (기본 1y)") + @Operation( + summary = "약물노트 검색", + description = "약 이름/별명/병원명으로 검색합니다. period: 1w·1m·3m·1y (기본 1y). isActive=true(복용중만) / isActive=false(복용완료만) / 미전달(전체)." + ) @GetMapping("/notes/search") public ResponseEntity>> searchNotes( @AuthenticationPrincipal Long userId, @RequestParam Long seniorId, @RequestParam String keyword, - @RequestParam(required = false, defaultValue = "1y") String period + @RequestParam(required = false, defaultValue = "1y") String period, + @RequestParam(required = false) Boolean isActive ) { - return ResponseUtils.ok(medicationQueryService.searchNotes(userId, seniorId, keyword, period)); + return ResponseUtils.ok(medicationQueryService.searchNotes(userId, seniorId, keyword, period, isActive)); } @Operation(summary = "약 수정", description = "null 필드는 변경하지 않습니다. timesPerDay 변경 시 스케줄을 재생성합니다.") diff --git a/src/main/java/com/piuda/callcare/domain/medication/repository/MedicationRepository.java b/src/main/java/com/piuda/callcare/domain/medication/repository/MedicationRepository.java index 43959b9..928d85f 100644 --- a/src/main/java/com/piuda/callcare/domain/medication/repository/MedicationRepository.java +++ b/src/main/java/com/piuda/callcare/domain/medication/repository/MedicationRepository.java @@ -29,19 +29,22 @@ public interface MedicationRepository extends JpaRepository { """) List findActiveWithDrugInfoBySeniorId(@Param("seniorId") Long seniorId); - // 약물노트 전체 리스트: 활성/비활성 관계없이 전체 조회 (startDate DESC → hospitalName ASC 정렬) + // 약물노트 전체 리스트: isActive null이면 전체, true/false면 해당 상태만 조회 @Query(""" SELECT m FROM Medication m WHERE m.senior.id = :seniorId + AND (:isActive IS NULL OR m.isActive = :isActive) ORDER BY m.startDate DESC, m.hospitalName ASC NULLS LAST """) - List findAllBySeniorId(@Param("seniorId") Long seniorId); + List findAllBySeniorId(@Param("seniorId") Long seniorId, + @Param("isActive") Boolean isActive); - // 약물노트 검색: 약 이름/별명/병원명 키워드 + 날짜 범위 필터 (활성/비활성 모두 포함) + // 약물노트 검색: 약 이름/별명/병원명 키워드 + 날짜 범위 + 상태 필터 @Query(""" SELECT m FROM Medication m WHERE m.senior.id = :seniorId AND m.startDate >= :fromDate + AND (:isActive IS NULL OR m.isActive = :isActive) AND (LOWER(m.drugName) LIKE LOWER(CONCAT('%', :keyword, '%')) OR LOWER(m.drugNickname) LIKE LOWER(CONCAT('%', :keyword, '%')) OR LOWER(m.hospitalName) LIKE LOWER(CONCAT('%', :keyword, '%'))) @@ -49,7 +52,8 @@ OR LOWER(m.hospitalName) LIKE LOWER(CONCAT('%', :keyword, '%'))) """) List searchByKeyword(@Param("seniorId") Long seniorId, @Param("keyword") String keyword, - @Param("fromDate") LocalDate fromDate); + @Param("fromDate") LocalDate fromDate, + @Param("isActive") Boolean isActive); // 약물노트 그룹 상세 조회: 병원명 + 처방일 조합이 그룹 키 (둘 다 null 가능) @Query(""" diff --git a/src/main/java/com/piuda/callcare/domain/medication/service/query/MedicationQueryService.java b/src/main/java/com/piuda/callcare/domain/medication/service/query/MedicationQueryService.java index 81b6ac8..10e9e82 100644 --- a/src/main/java/com/piuda/callcare/domain/medication/service/query/MedicationQueryService.java +++ b/src/main/java/com/piuda/callcare/domain/medication/service/query/MedicationQueryService.java @@ -52,22 +52,22 @@ public List getGroup(Long userId, Long seniorId, St .toList(); } - // 시니어의 약 전체 목록 (활성/비활성 모두) — startDate+병원 기준 그룹화 - public List getNoteList(Long userId, Long seniorId) { + // 시니어의 약 목록 — isActive: true(복용중) / false(복용완료) / null(전체) + public List getNoteList(Long userId, Long seniorId, Boolean isActive) { if (userId == null) throw new CallCareException(ErrorCode.FORBIDDEN); seniorRepository.findByIdAndUser_Id(seniorId, userId) .orElseThrow(() -> new CallCareException(ErrorCode.SENIOR_NOT_FOUND)); - List medications = medicationRepository.findAllBySeniorId(seniorId); + List medications = medicationRepository.findAllBySeniorId(seniorId, isActive); return toNoteGroupResponses(medications); } - // 약 이름/별명/병원명 키워드 검색 + 기간 필터 (1w·1m·3m·1y) - public List searchNotes(Long userId, Long seniorId, String keyword, String period) { + // 약 이름/별명/병원명 키워드 검색 + 기간 필터 + 상태 필터 + public List searchNotes(Long userId, Long seniorId, String keyword, String period, Boolean isActive) { if (userId == null) throw new CallCareException(ErrorCode.FORBIDDEN); seniorRepository.findByIdAndUser_Id(seniorId, userId) .orElseThrow(() -> new CallCareException(ErrorCode.SENIOR_NOT_FOUND)); LocalDate fromDate = resolveFromDate(period); - List medications = medicationRepository.searchByKeyword(seniorId, keyword, fromDate); + List medications = medicationRepository.searchByKeyword(seniorId, keyword, fromDate, isActive); return toNoteGroupResponses(medications); }