package com.izouma.nineth.service; import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSONArray; import com.izouma.nineth.config.MetaConstants; import com.izouma.nineth.domain.MetaRank; import com.izouma.nineth.dto.MetaRankDTO; import com.izouma.nineth.dto.MetaRestResult; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.dto.PageWrapper; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.MetaRankRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import org.apache.commons.collections.CollectionUtils; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; @Service @AllArgsConstructor public class MetaRankService { private MetaRankRepo metaRankRepo; private MetaUserGoldRecordService metaUserGoldRecordService; public Page all(PageQuery pageQuery) { return metaRankRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaRank.class), JpaUtils.toPageRequest(pageQuery)); } public Page rank(PageQuery pageQuery) { Map query = pageQuery.getQuery(); if (!query.containsKey("id")) { throw new BusinessException("排行榜id不存在!"); } Long id = Convert.toLong(query.get("id")); if (id.equals(MetaConstants.META_GOLD_RECEIVED_RANK_ID)) { return buildPage(pageQuery, metaUserGoldRecordService.rank()); } // ... throw new BusinessException("非法排行榜id"); } public MetaRestResult> metaQuery() { List> rank = metaUserGoldRecordService.rank(); if (CollectionUtils.isEmpty(rank)) { return MetaRestResult.returnSuccess(new ArrayList<>()); } return MetaRestResult.returnSuccess(convertMapToJavaList(rank)); } private Page buildPage(PageQuery pageQuery, List> rank) { if (CollectionUtils.isEmpty(rank)) { return null; } List metaRankDTOS = convertMapToJavaList(rank); int page = pageQuery.getPage(); int size = pageQuery.getSize(); int start = page * size; int totalElements = 0; if (CollectionUtils.isEmpty(metaRankDTOS)) { return new PageWrapper<>(new ArrayList(), page, size, totalElements).toPage(); } totalElements = metaRankDTOS.size(); List newMetaRankDTOS; if (metaRankDTOS.size() < start + size) { newMetaRankDTOS = metaRankDTOS.subList(start, metaRankDTOS.size()); return new PageWrapper<>(newMetaRankDTOS, page, size, totalElements).toPage(); } newMetaRankDTOS = metaRankDTOS.subList(start, start + size); return new PageWrapper<>(newMetaRankDTOS, page, size, totalElements).toPage(); } private List convertMapToJavaList(List> map) { JSONArray jsonArray = new JSONArray(); jsonArray.addAll(map); return jsonArray.toJavaList(MetaRankDTO.class); } }