فهرست منبع

月排行-按购买张数

licailing 4 سال پیش
والد
کامیت
a72556f5a5

+ 18 - 0
src/main/java/com/izouma/nineth/dto/LeaderboardDTO.java

@@ -0,0 +1,18 @@
+package com.izouma.nineth.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class LeaderboardDTO {
+    private int rank;
+
+    private Long userId;
+
+    private String nickname;
+
+    private String avatar;
+
+    private Long num;
+}

+ 3 - 0
src/main/java/com/izouma/nineth/repo/UserRepo.java

@@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.lang.NonNull;
 
 import javax.transaction.Transactional;
+import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 
@@ -35,6 +36,8 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
     Optional<User> findByIdAndDelFalse(Long userId);
 
+    List<User> findByIdInAndDelFalse(Collection<Long> userId);
+
     @Transactional
     @Modifying
     @Query("update User u set u.followers = u.followers + ?1 where u.id = ?1")

+ 56 - 7
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -3,6 +3,7 @@ package com.izouma.nineth.service;
 import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
+import com.izouma.nineth.dto.LeaderboardDTO;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.UserHistory;
 import com.izouma.nineth.enums.AssetStatus;
@@ -416,16 +417,64 @@ public class AssetService {
 
     /**
      * 排行榜
+     * 被删除的用户??
      */
-    public void leaderboard(Long userId, int size) {
+    public List<LeaderboardDTO> leaderboard(Long userId, int size) {
         List<TokenHistory> all = tokenHistoryRepo.findAllByPriceIsNotNullAndOperationLike("出售");
         Map<Long, Long> countMap = all.stream()
                 .collect(Collectors.groupingBy(TokenHistory::getToUserId, Collectors.counting()));
-        Map<Long, Long> result = new HashMap<>();
-        countMap.entrySet()
-                .stream()
-                .sorted(Map.Entry.comparingByValue())
-                .forEachOrdered(b -> result.put(b.getKey(), b.getValue()));
-        if (result.entrySet().size() > size){}
+
+        List<LeaderboardDTO> dtos = new ArrayList<>();
+
+        countMap.forEach((k, v) ->
+                dtos.add(LeaderboardDTO.builder()
+                        .userId(k)
+                        .num(v)
+                        .build())
+        );
+        dtos.sort((a, b) -> b.getNum().compareTo(a.getNum()));
+
+        Set<Long> userIds = countMap.keySet();
+        if (userIds.size() <= size) {
+            Map<Long, User> userMap = userRepo.findByIdInAndDelFalse(userIds)
+                    .stream()
+                    .collect(Collectors.toMap(User::getId, user -> user));
+            for (int i = 1; i < dtos.size() + 1; i++) {
+                LeaderboardDTO dto = dtos.get(i);
+                Long k = dto.getUserId();
+                User user = userMap.get(k);
+                if (user == null) {
+                    continue;
+                }
+                dto.setAvatar(user.getAvatar());
+                dto.setNickname(user.getNickname());
+                dto.setRank(i);
+                i++;
+            }
+            return dtos;
+        }
+
+        List<LeaderboardDTO> leaderboardDTOS = new ArrayList<>();
+        int i = 1;
+
+        for (LeaderboardDTO dto : dtos) {
+            Long k = dto.getUserId();
+            if (!k.equals(userId) && i > size) {
+                i++;
+                continue;
+            }
+
+            User user = userRepo.findByIdAndDelFalse(k).orElse(null);
+            if (user == null) {
+                continue;
+            }
+            dto.setAvatar(user.getAvatar());
+            dto.setNickname(user.getNickname());
+            dto.setRank(i);
+            leaderboardDTOS.add(dto);
+            i++;
+        }
+
+        return leaderboardDTOS;
     }
 }

+ 5 - 0
src/test/java/com/izouma/nineth/service/AssetServiceTest.java

@@ -93,4 +93,9 @@ class AssetServiceTest extends ApplicationTests {
     public void userHistory() {
         assetService.userHistory(44L, 1, Pageable.unpaged());
     }
+
+    @Test
+    public void test() {
+        assetService.leaderboard(439L, 15).forEach(System.out::println);
+    }
 }