package com.rongyichuang.carousel.service; import com.rongyichuang.carousel.dto.request.CarouselInput; import com.rongyichuang.carousel.dto.request.CarouselSortOrderInput; import com.rongyichuang.carousel.dto.response.CarouselResponse; import com.rongyichuang.carousel.entity.Carousel; import com.rongyichuang.carousel.repository.CarouselRepository; import org.springframework.data.domain.Sort; import org.springframework.util.StringUtils; import com.rongyichuang.common.dto.PageResponse; import com.rongyichuang.common.entity.Media; import com.rongyichuang.common.exception.BusinessException; import com.rongyichuang.common.repository.MediaRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 轮播图业务服务 */ @Service public class CarouselService { @Autowired private CarouselRepository carouselRepository; @Autowired private MediaRepository mediaRepository; /** * 分页查询轮播图 */ public PageResponse getCarousels(int page, int size, String title) { Pageable pageable = org.springframework.data.domain.PageRequest.of(page, size, Sort.by(Sort.Direction.ASC, "sortOrder")); Page carouselPage; if (StringUtils.hasText(title)) { carouselPage = carouselRepository.findByTitleContaining(title, pageable); } else { carouselPage = carouselRepository.findAll(pageable); } List responses = carouselPage.getContent().stream() .map(this::convertToResponse) .collect(Collectors.toList()); // 批量查询媒体数量 if (!responses.isEmpty()) { List carouselIds = responses.stream() .map(CarouselResponse::getId) .collect(Collectors.toList()); // 查询媒体数量(targetType=4表示轮播图) List mediaCountResults = mediaRepository.countByTargetTypeAndTargetIdInAndState(4, carouselIds, 1); Map mediaCountMap = mediaCountResults.stream() .collect(Collectors.toMap( result -> (Long) result[0], result -> ((Long) result[1]).intValue() )); // 设置媒体数量 responses.forEach(response -> { Integer mediaCount = mediaCountMap.getOrDefault(response.getId(), 0); response.setMediaCount(mediaCount); }); } return new PageResponse<>(responses, carouselPage.getTotalElements(), carouselPage.getNumber(), carouselPage.getSize()); } /** * 根据ID查询轮播图 */ public CarouselResponse getCarousel(Long id) { Carousel carousel = carouselRepository.findById(id) .orElseThrow(() -> new BusinessException("轮播图不存在")); CarouselResponse response = convertToResponse(carousel); // 查询媒体数量 List mediaList = mediaRepository.findByTargetTypeAndTargetIdAndState(4, id, 1); response.setMediaCount(mediaList.size()); return response; } /** * 获取播放列表 */ public List getPlayList() { List carousels = carouselRepository.findPlayList(); return carousels.stream() .map(this::convertToResponse) .collect(Collectors.toList()); } /** * 保存轮播图 */ @Transactional public CarouselResponse saveCarousel(CarouselInput input) { Carousel carousel; if (input.getId() != null) { // 修改 carousel = carouselRepository.findById(input.getId()) .orElseThrow(() -> new BusinessException("轮播图不存在")); } else { // 新增 carousel = new Carousel(); } carousel.setTitle(input.getTitle()); carousel.setContent(input.getContent()); carousel.setSortOrder(input.getSortOrder()); carousel = carouselRepository.save(carousel); return convertToResponse(carousel); } /** * 删除轮播图 */ @Transactional public boolean deleteCarousel(Long id) { Carousel carousel = carouselRepository.findById(id) .orElseThrow(() -> new BusinessException("轮播图不存在")); // 逻辑删除 carousel.setState(0); carouselRepository.save(carousel); return true; } /** * 批量更新播放顺序 */ @Transactional public boolean updateSortOrders(List sortOrders) { System.out.println("=== CarouselService.updateSortOrders 开始执行 ==="); System.out.println("接收到的排序数据数量: " + sortOrders.size()); for (CarouselSortOrderInput sortOrderInput : sortOrders) { System.out.println("处理轮播图ID: " + sortOrderInput.getId() + ", 新排序值: " + sortOrderInput.getSortOrder()); Carousel carousel = carouselRepository.findById(sortOrderInput.getId()) .orElseThrow(() -> new BusinessException("轮播图不存在,ID:" + sortOrderInput.getId())); System.out.println("找到轮播图: " + carousel.getTitle() + ", 当前排序值: " + carousel.getSortOrder()); carousel.setSortOrder(sortOrderInput.getSortOrder()); carouselRepository.save(carousel); System.out.println("已更新轮播图排序值为: " + sortOrderInput.getSortOrder()); } System.out.println("=== CarouselService.updateSortOrders 执行完成 ==="); return true; } /** * 转换为响应DTO */ private CarouselResponse convertToResponse(Carousel carousel) { CarouselResponse response = new CarouselResponse(); response.setId(carousel.getId()); response.setTitle(carousel.getTitle()); response.setContent(carousel.getContent()); response.setSortOrder(carousel.getSortOrder()); response.setCreateTime(carousel.getCreateTime()); response.setUpdateTime(carousel.getUpdateTime()); return response; } }