Browse Source

修改获取用户排名算法,获取所有项目,通过项目分组计算

xuexiaobo 6 years ago
parent
commit
63191e1cd0

+ 33 - 12
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -10,19 +10,18 @@ import com.mooctest.crowd.site.command.*;
 import com.mooctest.crowd.site.data.dto.*;
 import com.mooctest.crowd.site.data.vo.*;
 import com.mooctest.crowd.site.mediator.ViewMediator;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
  * @Author: xuexb
  * @Date: 2019.7.16 20:27
  */
+@Slf4j
 @Component("WebMediator")
 public class WebMediatorImpl implements ViewMediator {
 
@@ -49,16 +48,38 @@ public class WebMediatorImpl implements ViewMediator {
     @Override
     public IndexDTO renderIndex() {
         ArrayList<CrowdTaskVO> allTasks = new ArrayList<>();
-        projectRepo.getAllCrowdTestProject().forEach(project -> {
+        List<CrowdTestProject> allProjects = projectRepo.getAllCrowdTestProject();
+        allProjects.forEach(project -> {
             allTasks.addAll(project.getCrowdTestTaskList()
                     .stream().filter(crowdTestTask -> crowdTestTask.getStatus() == CrowdTestTaskStatus.HAS_RELEASED)
                     .map(crowdTestTask -> new CrowdTaskVO(crowdTestTask)).collect(Collectors.toList()));
         });
-        List<UserVO> allUser = userRepo.getAllUser().stream().map(user -> new UserVO(user)).collect(Collectors.toList());
-        allUser.forEach(userVO -> {
-            userVO.setAllProjectPrice(projectRepo.getCrowdListByUserId(userVO.getId()).stream().mapToDouble(CrowdTestProject::getQuotedPrice).sum());
+
+        //对Project按照UserId进行分组
+        Map<Long, List<CrowdTestProject>> projectsGroup = new HashMap<>();
+        allProjects.forEach(project -> {
+            if (!projectsGroup.keySet().contains(project.getUserId()))
+                projectsGroup.put(project.getUserId(), new ArrayList<>());
+            projectsGroup.get(project.getUserId()).add(project);
         });
-        allUser.sort(Comparator.comparing(UserVO::getAllProjectPrice).reversed());
+        //根据组的项目总价进行排序,提取UserId
+        List<Long> userIds = projectsGroup.entrySet().stream().sorted((o1, o2) -> {
+            Double sumPrice1 = o1.getValue().stream().mapToDouble(CrowdTestProject::getQuotedPrice).sum();
+            Double sumPrice2 = o2.getValue().stream().mapToDouble(CrowdTestProject::getQuotedPrice).sum();
+            if (sumPrice1 > sumPrice2)
+                return -1;
+            else if (sumPrice1 < sumPrice2)
+                return 1;
+            else
+                return 0;
+        }).map(Map.Entry::getKey).collect(Collectors.toList());
+        for (Long id : userIds)
+            log.info("UserId from Project: " + id);
+        if (userIds.size()>10)
+            userIds = userIds.subList(0,9);
+        List<UserVO> userRanks = userIds.stream().map(id -> new UserVO(userRepo.getByID(id))).collect(Collectors.toList());
+        userRanks.forEach(userVO -> userVO.setAllProjectPrice(projectsGroup.get(userVO.getId()).stream().mapToDouble(CrowdTestProject::getQuotedPrice).sum()));
+
         allTasks.sort(Comparator.comparing(CrowdTaskVO::getQuotePrice).reversed());
         List<CrowdTaskVO> hotTasks = allTasks.subList(0,3);
         List<EvolutionAgencyVO> agencyVOS = new ArrayList<>();
@@ -103,10 +124,10 @@ public class WebMediatorImpl implements ViewMediator {
         agencyVOS.add(agency9);
         agencyVOS.add(agency10);
         IndexDTO indexDTO = new IndexDTO();
+
+
         indexDTO.setHotTaskList(hotTasks);
-        if (allUser.size()>10)
-            allUser = allUser.subList(0, 10);
-        indexDTO.setUserRank(allUser);
+        indexDTO.setUserRank(userRanks);
         indexDTO.setAgencyRank(agencyVOS);
         List<String> img = new ArrayList<>();
         img.add("http://mooctest-crowd-service.oss-cn-hangzhou.aliyuncs.com/Image/daylight.jpg");