Explorar o código

Merge branch 'feature-examResult' into 'DEV'

Feature exam result



See merge request !410

梅杰 %!s(int64=8) %!d(string=hai) anos
pai
achega
559ac5c4b3
Modificáronse 15 ficheiros con 279 adicións e 38 borrados
  1. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ApplicationStartup.java
  2. 8 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestMentorDao.java
  3. 5 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ContestService.java
  4. 8 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ContestServiceImpl.java
  5. 9 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/CaseController.java
  6. 31 9
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ExamController.java
  7. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java
  8. 3 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CalculateSocreLogic.java
  9. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CaseLogic.java
  10. 3 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ContestLogic.java
  11. 3 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ExamLogic.java
  12. 103 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CalculateScoreLogicImpl.java
  13. 47 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java
  14. 24 12
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ContestLogicImpl.java
  15. 21 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ApplicationStartup.java

@@ -14,7 +14,7 @@ public class ApplicationStartup implements ApplicationListener<ContextRefreshedE
         System.out.println("-----------------------------------------------------------------------------------------");
         System.out.println("listener");
         ExamController examController = event.getApplicationContext().getBean(ExamController.class);
-        examController.updateStatusForAllTask();
+   //     examController.updateStatusForAllTask();
         examController.startInitExamSchedulerMap();
         System.out.println("exam scheduler map initialized");
         System.out.println("-----------------------------------------------------------------------------------------");

+ 8 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestMentorDao.java

@@ -1,6 +1,9 @@
 package cn.iselab.mooctest.site.dao;
 
 import cn.iselab.mooctest.site.models.ContestMentor;
+import cn.iselab.mooctest.site.models.User;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -15,6 +18,11 @@ import java.util.List;
 public interface ContestMentorDao extends CrudRepository<ContestMentor, Long> {
     List<ContestMentor> findByExamIdAndParticipantIdAndRole(Long examId, Long userId, Byte role);
 
+    @Query("SELECT u FROM User u,ContestMentor cm " +
+            "WHERE cm.examId=:examId AND cm.teacherEmail=:email AND cm.participantId=u.id " +
+            "AND (u.name LIKE concat('%',:keyword,'%') or u.email LIKE concat('%',:keyword,'%') or u.mobile LIKE concat('%',:keyword,'%'))")
+    Page<User> findMentorUsers(@Param("examId")Long examId, @Param("email")String email, @Param("keyword")String keyword, Pageable pageable);
+
     @Query("SELECT count(u.id) from User u, ContestMentor cm where u.id=:userId and u.email=cm.teacherEmail and cm.role=0")
     Long countByTeacherId(@Param("userId") Long userId);
 

+ 5 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ContestService.java

@@ -3,7 +3,10 @@ package cn.iselab.mooctest.site.service;
 import cn.iselab.mooctest.site.data.ContestStatistics;
 import cn.iselab.mooctest.site.models.Contest;
 import cn.iselab.mooctest.site.models.ContestMentor;
+import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.web.data.ContestMentorVO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 
 import java.util.List;
 
@@ -29,4 +32,6 @@ public interface ContestService {
     List<ContestMentor> getContestMnetor(Long contestId, Long userId, Byte role);
 
     ContestStatistics getContestStatisticsOfFall(Long groupId);
+
+    Page<User> findByExamIdAndEmailAndKeyword(Long examId, String email,String keyword, Pageable pageable);
 }

+ 8 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ContestServiceImpl.java

@@ -7,18 +7,16 @@ import cn.iselab.mooctest.site.dao.ContestMentorDao;
 import cn.iselab.mooctest.site.dao.SignRecordDao;
 import cn.iselab.mooctest.site.dao.WorkerDao;
 import cn.iselab.mooctest.site.data.ContestStatistics;
-import cn.iselab.mooctest.site.models.Contest;
-import cn.iselab.mooctest.site.models.ContestMentor;
-import cn.iselab.mooctest.site.models.SignRecord;
-import cn.iselab.mooctest.site.models.Worker;
+import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.ContestService;
 import cn.iselab.mooctest.site.web.data.ContestMentorVO;
 import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -142,6 +140,11 @@ public class ContestServiceImpl implements ContestService {
         return contestStatistics;
     }
 
+    @Override
+    public Page<User> findByExamIdAndEmailAndKeyword(Long examId, String email,String keyword, Pageable pageable) {
+        return contestMentorDao.findMentorUsers(examId, email,keyword,pageable);
+    }
+
     /*
     * 2017夏季赛统计数据
     * */

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/CaseController.java

@@ -169,6 +169,14 @@ public class CaseController extends BaseController {
         }
     }
 
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API+"caseSig", method = RequestMethod.GET)
+    public String getCaseDownloadSignature(@RequestParam(name = "examId", required = false) Long examId,
+                                           @RequestParam(name = "userId", required = false) Long userId,
+                                           @RequestParam(name = "caseName", required = false) String caseName){
+        return caseLogic.getCaseDownloadSignature(examId, userId, caseName);
+    }
+
     @RequiresRoles(value = "manager")
     @RequestMapping(value = UrlConstants.API+"cases/{targetId}",method = RequestMethod.POST)
     public Page<CaseVO> getCasesForTarget(@PathVariable @NotNull long targetId,
@@ -178,4 +186,5 @@ public class CaseController extends BaseController {
         Pageable pageable=new PageRequest(activePage-1,rowsOnPage);
         return caseLogic.getCasesForTarget(targetId,keyword,pageable);
     }
+
 }

+ 31 - 9
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ExamController.java

@@ -3,10 +3,7 @@ package cn.iselab.mooctest.site.web.ctrl;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.models.instancePermission.TaskPermission;
-import cn.iselab.mooctest.site.web.data.AssignedTaskVO;
-import cn.iselab.mooctest.site.web.data.ExamVO;
-import cn.iselab.mooctest.site.web.data.PaperVO;
-import cn.iselab.mooctest.site.web.data.ScoreVO;
+import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.web.exception.IllegalOperationException;
 import cn.iselab.mooctest.site.web.logic.ExamLogic;
 import cn.iselab.mooctest.site.web.logic.PaperLogic;
@@ -138,6 +135,34 @@ public class ExamController extends BaseController {
             throw new UnauthorizedException("unauthorized");
         }
 
+        Pageable pageable = getPageInfo(sortOrder, sortBy, request);
+
+        boolean hasScorePermission = SecurityUtils.getSubject().isPermitted(new TaskPermission(user.getId().toString() + ":task:score:" + examId.toString()));
+        boolean needFilter = !hasScorePermission;
+        return examLogic.getAssignedTasks(examId,keyword, needFilter, pageable);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "exam/user", method = RequestMethod.GET)
+    public Page<UserVO> getUsersExamId(@RequestParam(name = "examId", required = false) Long examId,
+                                                @RequestParam(name = "sortOrder", required = false, defaultValue = "desc") String sortOrder,
+                                                @RequestParam(name = "sortBy", required = false, defaultValue = "id") String sortBy,
+                                                @RequestParam(name = "keyword", required = false, defaultValue = "") String keyword,
+                                                HttpServletRequest request) throws Exception {
+        User user = (User) SecurityUtils.getSubject().getSession().getAttribute("User");
+        String examPermissionStr = user.getId().toString() + ":task:view:" + examId.toString();
+        if (!SecurityUtils.getSubject().isPermitted(new TaskPermission(examPermissionStr))) {
+            throw new UnauthorizedException("unauthorized");
+        }
+        Pageable pageable = getPageInfo(sortOrder, sortBy, request);
+        boolean hasScorePermission = SecurityUtils.getSubject().isPermitted(new TaskPermission(user.getId().toString() + ":task:score:" + examId.toString()));
+        boolean needFilter = !hasScorePermission;
+        String email = user.getEmail();
+        if(email == null)
+            email = "";
+        return examLogic.getUsers(examId,needFilter,email,keyword,pageable);
+    }
+
+    private Pageable getPageInfo(String sortOrder, String sortBy,HttpServletRequest request) {
         String activePage = request.getHeader("activePage");
         String rowsOnPage = request.getHeader("rowsOnPage");
         if (activePage == null || rowsOnPage == null) {
@@ -149,13 +174,10 @@ public class ExamController extends BaseController {
         else
             sort = new Sort(Sort.Direction.ASC, sortBy);
 
-        Pageable pageable = new PageRequest(Integer.parseInt(activePage) - 1, Integer.parseInt(rowsOnPage), sort);
-
-        boolean hasScorePermission = SecurityUtils.getSubject().isPermitted(new TaskPermission(user.getId().toString() + ":task:score:" + examId.toString()));
-        boolean needFilter = !hasScorePermission;
-        return examLogic.getAssignedTasks(examId,keyword, needFilter, pageable);
+        return new PageRequest(Integer.parseInt(activePage) - 1, Integer.parseInt(rowsOnPage), sort);
     }
 
+
     @RequestMapping(value = UrlConstants.API + "score", method = RequestMethod.GET)
     public ScoreVO getScoreByExamIdAndWorkerId(@RequestParam(name = "examId") Long examId) throws Exception {
         User user = (User) SecurityUtils.getSubject().getSession().getAttribute("User");

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java

@@ -1,13 +1,16 @@
 package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.common.web.SuccessResult;
 import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
 import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by HenryLee on 2017/7/10.
@@ -39,4 +42,12 @@ public class ScoreController extends BaseController{
                                            @RequestBody WeightDirtyVO weightDirtyVO) throws Exception{
         return calculateSocreLogic.calculateExamScore(examId,participantId,weightDirtyVO,calculateAll);
     }
+
+    @RequestMapping(value= UrlConstants.API + "score/mutation", method = RequestMethod.PUT)
+    public Map<String, Object> calculateAllMutationScore(@RequestParam("examId") long examId,
+                                                         @RequestParam("caseId") long caseId) throws IOException {
+
+        calculateSocreLogic.calculateAllMutationScore(examId, caseId);
+        return SuccessResult.ok();
+    }
 }

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CalculateSocreLogic.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.web.logic;
 
 import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -14,4 +15,6 @@ public interface CalculateSocreLogic {
     public List<Double> calculateExamScore(long examId, Long participantId, WeightDirtyVO weightDirtyVO,boolean calculateAll);
 
     public List<Double> calculateExamScoreAuto(long examId,long participantId);
+
+    void calculateAllMutationScore(long examId,long caseId) throws IOException;
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CaseLogic.java

@@ -39,6 +39,8 @@ public interface CaseLogic {
 
     List<CaseExtendsVO> getCasesByExamId(Long paperId);
 
+    String getCaseDownloadSignature(Long examId,Long userId,String caseName);
+
     KeyAnalysisVO getCasesByKey(String key) throws Exception;
 
     Page<CaseVO> getCasesForTarget(long targetId, String keyword, Pageable pageable) throws Exception;

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ContestLogic.java

@@ -3,6 +3,7 @@ package cn.iselab.mooctest.site.web.logic;
 import cn.iselab.mooctest.site.web.data.ContestMentorVO;
 import cn.iselab.mooctest.site.web.data.ContestVO;
 import cn.iselab.mooctest.site.web.data.ExamVO;
+import cn.iselab.mooctest.site.web.data.UserVO;
 import net.sf.json.JSONObject;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -32,4 +33,6 @@ public interface ContestLogic {
     Page<ExamVO> getContestList(Long userId, Pageable pageable);
 
     JSONObject getContestStatisticsOfFall(Long groupId);
+
+    Page<UserVO> getContestMentorUsers(Long contestId, String email,String keyword,Pageable pageable);
 }

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ExamLogic.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.web.logic;
 
+import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.web.data.AssignedTaskVO;
 import cn.iselab.mooctest.site.web.data.ExamVO;
@@ -36,6 +37,8 @@ public interface ExamLogic {
 
     Page<AssignedTaskVO> getAssignedTasks(Long examId, String keyword, Boolean needFilter, Pageable pageable);
 
+    Page<UserVO> getUsers(Long examId , Boolean needFilter,String email,String keyword, Pageable pageable);
+
     ScoreVO getScoreBy(long examId, long participantId) throws AssignedTaskNotExistException;
 
     List<Double> getScoreList(Long examId);

+ 103 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CalculateScoreLogicImpl.java

@@ -3,18 +3,24 @@ package cn.iselab.mooctest.site.web.logic.impl;
 import cn.iselab.mooctest.site.common.constant.AnswerWayConstants;
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.models.*;
+import cn.iselab.mooctest.site.rpc.dev.data.CaseMutationDTO;
+import cn.iselab.mooctest.site.rpc.dev.data.LineMutationDTO;
+import cn.iselab.mooctest.site.rpc.dev.data.MutationDTO;
 import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.service.common.MongoAPIService;
+import cn.iselab.mooctest.site.service.fromDev.AnalysisService;
 import cn.iselab.mooctest.site.service.fromKibug.ScoreRuleService;
 import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
+import cn.iselab.mooctest.site.web.data.forMongo.MutationForMongoDTO;
 import cn.iselab.mooctest.site.web.data.fromKibug.ScoreRuleItemVO;
+import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.io.IOException;
+import java.util.*;
 
 /**
  * Created by HenryLee on 2017/7/10.
@@ -36,6 +42,10 @@ public class CalculateScoreLogicImpl implements CalculateSocreLogic {
     private PaperService paperService;
     @Autowired
     private TaskService taskService;
+    @Autowired
+    MongoAPIService mongoAPIService;
+    @Autowired
+    AnalysisService analysisService;
 
     @Override
     public void calculateScore(long taskId, long caseId) {
@@ -127,6 +137,96 @@ public class CalculateScoreLogicImpl implements CalculateSocreLogic {
         return this.calculateExamScore(examId,participantId,weightDirtyVO,false);
     }
 
+    @Override
+    public void calculateAllMutationScore(long examId, long caseId) throws IOException {
+
+        final double scoreOfPerMutation = 100;
+        Map<String, Integer> mutationTotalKilledMap = new HashMap<>();
+        List<MutationForMongoDTO> mutationForMongoDTOS = mongoAPIService.getMutationFromMongo(null, examId, caseId);
+
+        if(mutationForMongoDTOS == null && mutationForMongoDTOS.size() == 0)
+            throw new HttpNotFoundException("该考试的这道题没有变异成绩。");
+        for (MutationForMongoDTO mutationForMongoDTO : mutationForMongoDTOS) {
+            statisMutation(mutationTotalKilledMap, mutationForMongoDTO.getMutationDTO());
+        }
+
+        Map<String, Double> mutationScoreMap = generatePerMutationScore(mutationTotalKilledMap, mutationForMongoDTOS,
+                scoreOfPerMutation);
+        final double baseScore = calculateBaseScore(mutationScoreMap);
+        for (MutationForMongoDTO mutationForMongoDTO : mutationForMongoDTOS) {
+            try {
+                double mutationScore = calculateMutationScore(mutationForMongoDTO, mutationScoreMap, baseScore);
+                analysisService.saveMutationScore(mutationForMongoDTO.getStuId(), mutationForMongoDTO.getExamId(),
+                        mutationForMongoDTO.getCaseId(), mutationScore);
+            } catch (Exception e) {
+                e.printStackTrace();
+                continue;
+            }
+        }
+
+    }
+
+
+    private double calculateMutationScore(MutationForMongoDTO mutationForMongoDTO, Map<String, Double> mutationScoreMap,
+                                    final double baseScore) {
+        double sum = 0;
+        for (CaseMutationDTO caseMutation : mutationForMongoDTO.getMutationDTO().getDetailList()) {
+            for (LineMutationDTO lineMutation : caseMutation.getEachMutantsResult()) {
+                if(lineMutation.isKilled()) {
+                    String key = caseMutation.getClassName() + lineMutation.getMutantId();
+                    double score = mutationScoreMap.get(key);
+                    sum += score;
+                }
+            }
+        }
+        return (sum / baseScore) * 100;
+    }
+
+    private double calculateBaseScore(Map<String, Double> mutationScoreMap) {
+        List<Double> scores = (List<Double>) mutationScoreMap.values();
+        double sum = 0;
+        for(Double score : scores) {
+            sum += score;
+        }
+        return sum;
+    }
+
+    private Map<String, Double> generatePerMutationScore(Map<String, Integer> mutationTotalKilledMap,
+                                          List<MutationForMongoDTO> mutationForMongoDTOS,
+                                          final double scoreOfPerMutation) {
+        Map<String, Double> mutationScoreMap = new HashMap<>();
+        MutationForMongoDTO mutationForMongoDTO = mutationForMongoDTOS.get(0);
+        mutationForMongoDTO.getMutationDTO().getDetailList().forEach(caseMutation -> {
+            caseMutation.getEachMutantsResult().forEach(lineMutation -> {
+                String key = caseMutation.getClassName() + lineMutation.getMutantId();
+                Integer killedCount = mutationTotalKilledMap.get(key);
+                if (killedCount == null) {
+                    killedCount = 1;
+                }
+                mutationScoreMap.put(key, scoreOfPerMutation / killedCount);
+
+            });
+        });
+        return mutationScoreMap;
+    }
+
+    private void statisMutation(Map<String, Integer> mutationTotalKilledMap, MutationDTO mutationDTO) {
+        mutationDTO.getDetailList().forEach(caseMutation -> {
+                caseMutation.getEachMutantsResult().forEach(lineMutation -> {
+                    if(lineMutation.isKilled()) {
+                        String key = caseMutation.getClassName() + lineMutation.getMutantId();
+                        Integer count = mutationTotalKilledMap.get(key);
+                        if(count != null) {
+                            count = 0;
+                        }
+                        count = count + 1;
+                        mutationTotalKilledMap.put(key, count);
+                    }
+                });
+
+        });
+    }
+    
 
     private double calculateOneScore(AssignedTask assignedTask,long examId){
         String result=assignedTask.getResult();

+ 47 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java

@@ -26,17 +26,20 @@ import cn.iselab.mooctest.site.web.logic.CaseLogic;
 import cn.iselab.mooctest.site.web.logic.fromDev.PluginLogic;
 import cn.iselab.mooctest.site.web.logic.fromDev.UpDownloadLogic;
 import cn.iselab.mooctest.site.web.util.Converter;
+import com.aliyun.oss.HttpMethod;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.GeneratePresignedUrlRequest;
+import com.aliyun.oss.model.OSSObjectSummary;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.net.URL;
 import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -46,6 +49,17 @@ import java.util.stream.Collectors;
 @Service
 public class CaseLogicImpl implements CaseLogic {
 
+    @Value("${aliOSS.endPoint}")
+    private String endPoint;
+    @Value("${aliOSS.accessKeyId}")
+    private String accessKeyId;
+    @Value("${aliOSS.accessKeySecret}")
+    private String accessKeySecret;
+    @Value("${aliOSS.bucketName.dev}")
+    private String bucketNameDev;
+    @Value("${aliOSS.bucketName.main}")
+    private String bucketName;
+
     @Autowired
     private CaseVOWrapper caseVOWrapper;
 
@@ -422,6 +436,35 @@ public class CaseLogicImpl implements CaseLogic {
         return caseVOS;
     }
 
+    @Override
+    public String getCaseDownloadSignature(Long examId, Long userId, String caseName) {
+        //打开OSS连接
+        OSSClient client = new OSSClient(endPoint, accessKeyId, accessKeySecret);
+
+        //生成签名
+        String keyPrifix = "data/answers/" + examId + "/" + userId + "/" + caseName;
+        List<OSSObjectSummary> sums = client.listObjects(bucketNameDev,keyPrifix).getObjectSummaries();
+        Long minLong = Long.MIN_VALUE;
+        String maxUpdateTime = minLong.toString();
+        for (OSSObjectSummary summary : sums) {
+            String fileKey = summary.getKey();
+            String updateTimeStr = fileKey.substring(fileKey.indexOf("_")+1,fileKey.lastIndexOf("."));
+            Long updateTime = new Long(updateTimeStr);
+            if(updateTime>minLong) {
+                minLong = updateTime;
+                maxUpdateTime = updateTimeStr;
+            }
+        }
+        String filePath = keyPrifix + "_" + maxUpdateTime + ".zip";
+        Date expiration = new Date(System.currentTimeMillis() + 5 * 1000 * 60);//签名5分钟过期
+        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketNameDev, filePath, HttpMethod.GET);
+        request.setExpiration(expiration);
+        URL signedUrl = client.generatePresignedUrl(request);
+        //关闭OSS连接
+        client.shutdown();
+        return signedUrl.toString();
+    }
+
     private void injectManagerNames(List<CaseVO> caseVOs) {
 
         Set<Long> managerIds = caseVOs.stream().map(CaseVO::getManagerId).filter(id -> id != null).

+ 24 - 12
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ContestLogicImpl.java

@@ -1,21 +1,13 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.data.ContestStatistics;
-import cn.iselab.mooctest.site.models.Contest;
-import cn.iselab.mooctest.site.models.ContestMentor;
-import cn.iselab.mooctest.site.models.Group;
-import cn.iselab.mooctest.site.models.Task;
-import cn.iselab.mooctest.site.service.ContestService;
-import cn.iselab.mooctest.site.service.ExamService;
-import cn.iselab.mooctest.site.service.GroupService;
-import cn.iselab.mooctest.site.service.Worker2ContestService;
-import cn.iselab.mooctest.site.web.data.ContestVO;
-import cn.iselab.mooctest.site.web.data.ContestMentorVO;
-import cn.iselab.mooctest.site.web.data.ExamVO;
-import cn.iselab.mooctest.site.web.data.GroupVO;
+import cn.iselab.mooctest.site.models.*;
+import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.web.data.wrapper.ContestStatisticsVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.ContestVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.ExamVOWrapper;
+import cn.iselab.mooctest.site.web.data.wrapper.UserVOWrapper;
 import cn.iselab.mooctest.site.web.logic.ContestLogic;
 import cn.iselab.mooctest.site.web.util.Converter;
 import net.sf.json.JSONObject;
@@ -26,6 +18,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Created by lishuying on 17/3/30.
@@ -51,6 +44,12 @@ public class ContestLogicImpl implements ContestLogic {
     private GroupService groupService;
 
     @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserVOWrapper userVOWrapper;
+
+    @Autowired
     private ContestStatisticsVOWrapper contestStatisticsVOWrapper;
 
     @Override
@@ -145,6 +144,19 @@ public class ContestLogicImpl implements ContestLogic {
     }
 
     @Override
+    public Page<UserVO> getContestMentorUsers(Long contestId, String email,String keyword,Pageable pageable) {
+        Page<User> users = contestService.findByExamIdAndEmailAndKeyword(contestId,email,keyword,pageable);
+        Page<UserVO> userVOS = users.map(new org.springframework.core.convert.converter.Converter<User, UserVO>(){
+            @Override
+            public UserVO convert(User user) {
+                UserVO userVO = userVOWrapper.wrap(user);
+                return userVO;
+            }
+        });
+        return userVOS;
+    }
+
+    @Override
     public String sycnStudentInfo() {
         return contestService.sycnStudentInfo();
     }

+ 21 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java

@@ -7,10 +7,7 @@ import cn.iselab.mooctest.site.models.instancePermission.TaskPermission;
 import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.service.instancePermission.ReportPermissionService;
 import cn.iselab.mooctest.site.service.instancePermission.TaskPermissionService;
-import cn.iselab.mooctest.site.web.data.AssignedTaskVO;
-import cn.iselab.mooctest.site.web.data.ExamVO;
-import cn.iselab.mooctest.site.web.data.PaperVO;
-import cn.iselab.mooctest.site.web.data.ScoreVO;
+import cn.iselab.mooctest.site.web.data.*;
 import cn.iselab.mooctest.site.web.data.wrapper.AssignedCaseVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.AssignedTaskVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.ExamVOWrapper;
@@ -19,7 +16,9 @@ import cn.iselab.mooctest.site.web.exception.AssignedTaskNotExistException;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
 import cn.iselab.mooctest.site.web.logic.BaseLogic;
+import cn.iselab.mooctest.site.web.logic.ContestLogic;
 import cn.iselab.mooctest.site.web.logic.ExamLogic;
+import cn.iselab.mooctest.site.web.logic.GroupLogic;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.convert.converter.Converter;
@@ -82,6 +81,12 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     ScoreVOWrapper scoreVOWrapper;
 
     @Autowired
+    ContestLogic contestLogic;
+
+    @Autowired
+    GroupLogic groupLogic;
+
+    @Autowired
     AssignedTask2UserInfoService assignedTask2UserInfoService;
 
     @Autowired
@@ -235,6 +240,18 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
+    public Page<UserVO> getUsers(Long examId, Boolean needFilter,String email,String keyword, Pageable pageable) {
+        Page<UserVO> userVOS;
+        if(needFilter) {
+            userVOS = contestLogic.getContestMentorUsers(examId,email,keyword,pageable);
+        }else {
+            Long groupId = groupService.getGroupIdsByTaskId(examId).get(0);
+            userVOS = groupLogic.getManagerWorkersInGroupPageable(groupId,keyword,pageable);
+        }
+        return userVOS;
+    }
+
+    @Override
     public ScoreVO getScoreBy(long examId, long participantId) throws AssignedTaskNotExistException {
         AssignedTask assignedTask = assignedTaskService.getAssignedTask(examId, participantId);
         if (assignedTask == null) {