diff --git a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/IGroupCourseRepository.java b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/IGroupCourseRepository.java index cee768e..904ee84 100644 --- a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/IGroupCourseRepository.java +++ b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/IGroupCourseRepository.java @@ -18,6 +18,9 @@ public interface IGroupCourseRepository { Mono> findByPage(PageRequest pageRequest); Mono> findByPageAndNotDeleted(PageRequest pageRequest); + Mono> findByPageWithKeyword(PageRequest pageRequest); + Mono> findByPageWithKeywordAndNotDeleted(PageRequest pageRequest); + Mono save(GroupCourse groupCourse); Mono update(GroupCourse groupCourse); diff --git a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/impl/GroupCourseRepository.java b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/impl/GroupCourseRepository.java index ef344d0..71f226b 100644 --- a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/impl/GroupCourseRepository.java +++ b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/repository/impl/GroupCourseRepository.java @@ -10,6 +10,7 @@ import cn.novalon.gym.manage.groupcourse.entity.GroupCourseEntity; import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository; import org.springframework.data.domain.Sort; import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; +import org.springframework.data.relational.core.query.Criteria; import org.springframework.data.relational.core.query.Query; import org.springframework.stereotype.Repository; import reactor.core.publisher.Flux; @@ -178,4 +179,84 @@ public class GroupCourseRepository implements IGroupCourseRepository { return Mono.empty(); }); } + + @Override + public Mono> findByPageWithKeyword(PageRequest pageRequest) { + int page = pageRequest.getPage(); + int size = pageRequest.getSize(); + String sort = pageRequest.getSort(); + String order = pageRequest.getOrder(); + String keyword = pageRequest.getKeyword(); + + Sort sortObj = Sort.unsorted(); + if (sort != null && !sort.isEmpty()) { + sortObj = Sort.by(Sort.Direction.fromString(order), sort); + } + + org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, size, sortObj); + + Criteria criteria = Criteria.empty(); + if (keyword != null && !keyword.isEmpty()) { + criteria = criteria.or(Criteria.where("course_name").like("%" + keyword + "%")) + .or(Criteria.where("location").like("%" + keyword + "%")) + .or(Criteria.where("description").like("%" + keyword + "%")); + } + + Query query = Query.query(criteria); + + return r2dbcEntityTemplate.select(GroupCourseEntity.class) + .matching(query.with(pageable)) + .all() + .collectList() + .zipWith(r2dbcEntityTemplate.count(query, GroupCourseEntity.class)) + .map(tuple -> { + long total = tuple.getT2(); + int totalPages = (int) Math.ceil((double) total / size); + List courseList = tuple.getT1().stream() + .map(groupCourseConverter::toDomain) + .toList(); + return new PageResponse<>(courseList, totalPages, total, page, size); + }); + } + + @Override + public Mono> findByPageWithKeywordAndNotDeleted(PageRequest pageRequest) { + int page = pageRequest.getPage(); + int size = pageRequest.getSize(); + String sort = pageRequest.getSort(); + String order = pageRequest.getOrder(); + String keyword = pageRequest.getKeyword(); + + Sort sortObj = Sort.unsorted(); + if (sort != null && !sort.isEmpty()) { + sortObj = Sort.by(Sort.Direction.fromString(order), sort); + } + + org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, size, sortObj); + + Criteria criteria = Criteria.where("deleted_at").isNull(); + if (keyword != null && !keyword.isEmpty()) { + criteria = criteria.and( + Criteria.where("course_name").like("%" + keyword + "%") + .or(Criteria.where("location").like("%" + keyword + "%")) + .or(Criteria.where("description").like("%" + keyword + "%")) + ); + } + + Query query = Query.query(criteria); + + return r2dbcEntityTemplate.select(GroupCourseEntity.class) + .matching(query.with(pageable)) + .all() + .collectList() + .zipWith(r2dbcEntityTemplate.count(query, GroupCourseEntity.class)) + .map(tuple -> { + long total = tuple.getT2(); + int totalPages = (int) Math.ceil((double) total / size); + List courseList = tuple.getT1().stream() + .map(groupCourseConverter::toDomain) + .toList(); + return new PageResponse<>(courseList, totalPages, total, page, size); + }); + } } diff --git a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/service/impl/GroupCourseService.java b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/service/impl/GroupCourseService.java index 7847c9a..916e7a2 100644 --- a/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/service/impl/GroupCourseService.java +++ b/gym-manage-api/gym-groupCourse/src/main/java/cn/novalon/gym/manage/groupcourse/service/impl/GroupCourseService.java @@ -139,10 +139,17 @@ public class GroupCourseService implements IGroupCourseService { Mono.defer(() -> { logger.debug("缓存未命中,查询数据库 - findByPage: key={}", cacheKey); Mono> resultMono; + + boolean hasKeyword = keyword != null && !keyword.isEmpty(); + if (includeDeleted) { - resultMono = groupCourseRepository.findByPage(pageRequest); + resultMono = hasKeyword + ? groupCourseRepository.findByPageWithKeyword(pageRequest) + : groupCourseRepository.findByPage(pageRequest); } else { - resultMono = groupCourseRepository.findByPageAndNotDeleted(pageRequest); + resultMono = hasKeyword + ? groupCourseRepository.findByPageWithKeywordAndNotDeleted(pageRequest) + : groupCourseRepository.findByPageAndNotDeleted(pageRequest); } return resultMono.flatMap(pageResponse -> {