浏览代码

重新整理评估测试能力需要添加的逻辑

wyf 5 年之前
父节点
当前提交
5a6ae7b426
共有 17 个文件被更改,包括 473 次插入35 次删除
  1. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/EvaluationConfiguration.java
  2. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseExtendsDao.java
  3. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Competition2ExamDao.java
  4. 8 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/EvaluationPermissionDao.java
  5. 18 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/UploadRecordDao.java
  6. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/EvaluationPermission.java
  7. 5 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CaseService.java
  8. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CompetitionService.java
  9. 3 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ExamService.java
  10. 6 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GeneralCalculateScoreService.java
  11. 46 19
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java
  12. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CompetitionServiceImpl.java
  13. 23 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ExamServiceImpl.java
  14. 61 8
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java
  15. 114 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/EvaluationController.java
  16. 6 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/UserEvaluationLogic.java
  17. 119 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/UserEvaluationLogicImpl.java

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/EvaluationConfiguration.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.site.configure;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created on 2019/12/31
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "evaluation")
+public class EvaluationConfiguration {
+
+    // 评估项目后端baseUrl
+    private String backEndUrl;
+
+    // 评估项目前端baseUrl
+    private String frontEndUrl;
+
+    // radar页面路由
+    private String radarUrl;
+}

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CaseExtendsDao.java

@@ -17,4 +17,8 @@ import java.util.List;
 public interface CaseExtendsDao extends PagingAndSortingRepository<CaseExtends, Long>,JpaSpecificationExecutor<CaseExtends> , UpdateAdapter<CaseExtends, Long> {
 public interface CaseExtendsDao extends PagingAndSortingRepository<CaseExtends, Long>,JpaSpecificationExecutor<CaseExtends> , UpdateAdapter<CaseExtends, Long> {
 
 
     List<CaseExtends> findByAppId(long appId);
     List<CaseExtends> findByAppId(long appId);
+
+    @Query(nativeQuery = true, value = "select case_.id,case_.name,case_.properties,target.subsite_id as target_type " +
+            "from target,(select id,name,properties,app_id from case_entity where id =:caseId) case_ where target.id=case_.app_id;")
+    List<Object[]> getCaseInfoById(@Param("caseId") long caseId);
 }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Competition2ExamDao.java

@@ -20,4 +20,6 @@ public interface Competition2ExamDao extends CrudRepository<Competition2Exam, Lo
     ArrayList<Competition2Exam> findByCompetitionId(Long competitionId);
     ArrayList<Competition2Exam> findByCompetitionId(Long competitionId);
 
 
     void deleteByCompetitionIdAndIndex(Long competitionId, Integer index);
     void deleteByCompetitionIdAndIndex(Long competitionId, Integer index);
+
+    ArrayList<Competition2Exam> findByExamIdOrderByIdDesc(Long examId);
 }
 }

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

@@ -0,0 +1,8 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.EvaluationPermission;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface EvaluationPermissionDao extends PagingAndSortingRepository<EvaluationPermission, Long> {
+    EvaluationPermission findByTargetTypeAndTestType(Long targetType, Integer testType);
+}

+ 18 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/UploadRecordDao.java

@@ -30,4 +30,22 @@ public interface UploadRecordDao extends JpaRepository<UploadRecord, Long>, Upda
       caseId);
       caseId);
 
 
     UploadRecord findByApplyUploadId(long applyUploadId);
     UploadRecord findByApplyUploadId(long applyUploadId);
+
+    @Query("select distinct u.workerId from UploadRecord u where u.examId = :examId")
+    List<Long> retrieveUserIdsByExamId(@Param("examId") long examId);
+
+    @Query(nativeQuery = true, value = "select uu.case_id,uu.worker_id,uu.type,uu.score, min(up.upload_time) " +
+            "from `upload_record` up ,(select max(g.score)  as score, g.type as type, ur.worker_id as worker_id, " +
+            "ur.case_id as case_id, ur.exam_id as exam_id from `upload_record` ur " +
+            "INNER JOIN `grade_general` g on ur.id=g.upload_id where ur.exam_id= :examId " +
+            "GROUP BY g.type, ur.worker_id, ur.case_id) uu " +
+            "where uu.worker_id = up.worker_id and uu.case_id=up.case_id and up.exam_id=uu.exam_id " +
+            "GROUP BY uu.worker_id, uu.case_id, uu.type, uu.score")
+    List<Object[]> findBestRecordByExamId(@Param("examId") long examId);
+
+    @Query(nativeQuery = true, value = "select uu.case_id, uu.worker_id, uu.type, grade.score from grade_general grade, " +
+            "(select max(gg.id) gid, up.worker_id, up.case_id, gg.type from grade_general gg INNER JOIN upload_record up " +
+            "on gg.upload_id = up.id where up.exam_id= :examId GROUP BY up.worker_id, up.case_id, gg.type) uu " +
+            "where grade.id = uu.gid")
+    List<Object[]> findLatestRecordByExamId(@Param("examId") long examId);
 }
 }

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/EvaluationPermission.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.site.models;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * Created by wyf on 2020/2/14.
+ */
+@Data
+@Entity
+@Table(name = "evaluation_permission")
+public class EvaluationPermission {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "target_type")
+    private Long targetType;
+
+    @Column(name = "test_type")
+    private Integer testType;
+}

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

@@ -4,6 +4,7 @@ import cn.iselab.mooctest.site.models.CaseExtends;
 import cn.iselab.mooctest.site.models.Dimension;
 import cn.iselab.mooctest.site.models.Dimension;
 import cn.iselab.mooctest.site.models.Subject;
 import cn.iselab.mooctest.site.models.Subject;
 import cn.iselab.mooctest.site.models.Subsite;
 import cn.iselab.mooctest.site.models.Subsite;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
 
 
@@ -30,4 +31,8 @@ public interface CaseService {
     Map<String, String> getCaseProperties(long caseId);
     Map<String, String> getCaseProperties(long caseId);
 
 
     List<Dimension> getCase2Dimension(long caseId);
     List<Dimension> getCase2Dimension(long caseId);
+
+    Boolean checkCaseEvaluationPermission(long caseId);
+
+    JSONObject getCaseInfoById(long caseId);
 }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CompetitionService.java

@@ -108,4 +108,6 @@ public interface CompetitionService {
     List<List<UserVO>> getTeamCompetitionStudents(long competitionId, long teacherId);
     List<List<UserVO>> getTeamCompetitionStudents(long competitionId, long teacherId);
 
 
     Qualification getQualificationByCompetitionAndUserIdAndStatus(Long competitionId,Long userId,Integer status);
     Qualification getQualificationByCompetitionAndUserIdAndStatus(Long competitionId,Long userId,Integer status);
+
+    Competition getCompetitionByExamId(Long examId);
 }
 }

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ExamService.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.service;
 
 
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.models.*;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
 
 
@@ -62,4 +63,6 @@ public interface ExamService {
 
 
     Map<Long, ExamForUserSituation> getExamForUserSituation();
     Map<Long, ExamForUserSituation> getExamForUserSituation();
 
 
+    JSONObject getExamBasicInfo(Long examId);
+
 }
 }

+ 6 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GeneralCalculateScoreService.java

@@ -5,6 +5,8 @@ import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
 import cn.iselab.mooctest.site.models.ApplyUploadRecord;
 import cn.iselab.mooctest.site.models.ApplyUploadRecord;
 import cn.iselab.mooctest.site.models.UploadRecord;
 import cn.iselab.mooctest.site.models.UploadRecord;
+import com.alibaba.fastjson.JSONObject;
+
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -42,4 +44,8 @@ public interface GeneralCalculateScoreService {
   ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId);
   ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId);
 
 
   ApplyUploadRecord getApplyUploadRecordById(long id);
   ApplyUploadRecord getApplyUploadRecordById(long id);
+
+  JSONObject getCase2WorkerData(long examId);
+
+  List<Long> getUploadUsersByExamId(long examId);
 }
 }

+ 46 - 19
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java

@@ -5,6 +5,7 @@ import cn.iselab.mooctest.site.dao.*;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.CaseService;
 import cn.iselab.mooctest.site.service.CaseService;
 import cn.iselab.mooctest.site.service.Entity2TagService;
 import cn.iselab.mooctest.site.service.Entity2TagService;
+import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -50,6 +51,9 @@ public class CaseServiceImpl implements CaseService {
     private TargetDao targetDao;
     private TargetDao targetDao;
 
 
     @Autowired
     @Autowired
+    private EvaluationPermissionDao evaluationPermissionDao;
+
+    @Autowired
     private Entity2TagService entity2TagService;
     private Entity2TagService entity2TagService;
 
 
     @Override
     @Override
@@ -149,29 +153,52 @@ public class CaseServiceImpl implements CaseService {
     @Override
     @Override
     public List<Dimension> getCase2Dimension(long caseId) {
     public List<Dimension> getCase2Dimension(long caseId) {
         List<Dimension> dimensions = new ArrayList<>();
         List<Dimension> dimensions = new ArrayList<>();
-        try {
-            int testType = Integer.parseInt(getCaseProperties(caseId).get("testType"));
-            CaseExtends caseExtends = getCaseById(caseId);
-            Long targetType = null;
-            if (caseExtends != null) {
-                Long targetId = caseExtends.getAppId();
-                if (targetId != null) {
-                    Target target = targetDao.findOne(targetId);
-                    targetType = target.getTargetType();
-                }
-            }
-            List<Case2Dimension> case2Dimensions = case2DimensionDao.findByTestTypeAndTargetType(testType, targetType);
-            List<Long> dimensionIds = case2Dimensions.stream().map(Case2Dimension::getDimensionId).collect(Collectors.toList());
-            for (long id : dimensionIds) {
-                Dimension item = dimensionDao.findById(id);
-                dimensions.add(item);
-            }
-        } catch (NullPointerException e) {
-            log.info("过去老数据没有testType导致NullPointerException");
+        JSONObject json = getCaseInfoById(caseId);
+        if (json == null || !json.containsKey("targetType") || !json.containsKey("testType")) {
+            return dimensions;
+        }
+        List<Case2Dimension> case2Dimensions = case2DimensionDao
+                .findByTestTypeAndTargetType(json.getInteger("testType"), json.getLong("targetType"));
+        List<Long> dimensionIds = case2Dimensions.stream().map(Case2Dimension::getDimensionId).collect(Collectors.toList());
+        for (long id : dimensionIds) {
+            Dimension item = dimensionDao.findById(id);
+            dimensions.add(item);
         }
         }
         return dimensions;
         return dimensions;
     }
     }
 
 
+    @Override
+    public Boolean checkCaseEvaluationPermission(long caseId) {
+        JSONObject json = getCaseInfoById(caseId);
+        if (json == null || !json.containsKey("targetType") || !json.containsKey("testType")) {
+            return false;
+        }
+        EvaluationPermission evaluationPermission = evaluationPermissionDao
+                .findByTargetTypeAndTestType(json.getLong("targetType"), json.getInteger("testType"));
+        return evaluationPermission != null;
+    }
+
+    @Override
+    public JSONObject getCaseInfoById(long caseId) {
+        JSONObject res = new JSONObject();
+        List<Object[]> caseInfo = caseDao.getCaseInfoById(caseId);
+        if (caseInfo == null || caseInfo.size() <= 0) {
+            return null;
+        }
+        res.put("id", Long.valueOf(String.valueOf(caseInfo.get(0)[0])));
+        res.put("name", String.valueOf(caseInfo.get(0)[1]));
+        Map<String, String> properties = new Gson().fromJson(String.valueOf(caseInfo.get(0)[2]), new
+                TypeToken<HashMap<String, String>>() {
+                }.getType());
+        if (properties.containsKey("testType")) {
+            Integer testType = Integer.parseInt(properties.get("testType"));
+            res.put("testType", testType);
+        }
+        res.put("targetType", Long.valueOf(String.valueOf(caseInfo.get(0)[3])));
+        log.info("caseInfo",res);
+        return res;
+    }
+
     private Specification<CaseExtends> getWhereTarget(long targetId, String keyword){
     private Specification<CaseExtends> getWhereTarget(long targetId, String keyword){
         return new Specification<CaseExtends>() {
         return new Specification<CaseExtends>() {
             @Override
             @Override

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CompetitionServiceImpl.java

@@ -390,4 +390,14 @@ public class CompetitionServiceImpl implements CompetitionService {
         return qualificationDao.findByCompetitionIdAndUserIdAndStatus(competitionId,userId,status);
         return qualificationDao.findByCompetitionIdAndUserIdAndStatus(competitionId,userId,status);
     }
     }
 
 
+    @Override
+    public Competition getCompetitionByExamId(Long examId) {
+        List<Competition2Exam> list = competition2ExamDao.findByExamIdOrderByIdDesc(examId);
+        if (list.size() > 0) {
+            Optional<Competition> optional=competitionDao.findById(list.get(0).getCompetitionId());
+            return optional.orElse(null);
+        }
+        return null;
+    }
+
 }
 }

+ 23 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ExamServiceImpl.java

@@ -4,9 +4,11 @@ import cn.iselab.mooctest.site.dao.*;
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.BaseService;
 import cn.iselab.mooctest.site.service.BaseService;
+import cn.iselab.mooctest.site.service.CompetitionService;
 import cn.iselab.mooctest.site.service.ExamService;
 import cn.iselab.mooctest.site.service.ExamService;
 import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -51,7 +53,8 @@ public class ExamServiceImpl extends BaseService implements ExamService {
     private WeightDao weightDao;
     private WeightDao weightDao;
     @Autowired
     @Autowired
     private SubmitRecordDao submitRecordDao;
     private SubmitRecordDao submitRecordDao;
-
+    @Autowired
+    private CompetitionService competitionService;
     @Autowired
     @Autowired
     private SearchListComponent searchListComponent;
     private SearchListComponent searchListComponent;
 
 
@@ -334,4 +337,23 @@ public class ExamServiceImpl extends BaseService implements ExamService {
         return map;
         return map;
 
 
     }
     }
+
+    @Override
+    public JSONObject getExamBasicInfo(Long examId) {
+        JSONObject examData = new JSONObject();
+        examData.put("id",examId);
+        Exam exam = examDao.findOne(examId);
+        examData.put("isContest",false);
+        if (exam != null) {
+            examData.put("beginTime",exam.getBeginTime());
+            examData.put("endTime",exam.getEndTime());
+            examData.put("name",exam.getName());
+        }
+        Competition competition = competitionService.getCompetitionByExamId(examId);
+        if (competition != null) {
+            examData.put("isContest",true);
+            examData.put("contestName",competition.getName());
+        }
+        return examData;
+    }
 }
 }

+ 61 - 8
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java

@@ -3,15 +3,11 @@ package cn.iselab.mooctest.site.service.impl;
 import cn.iselab.mooctest.rpc.user.constants.IntegralTypeEnum;
 import cn.iselab.mooctest.rpc.user.constants.IntegralTypeEnum;
 import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
 import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
 import cn.iselab.mooctest.site.configure.ClientFeatureConfiguration;
 import cn.iselab.mooctest.site.configure.ClientFeatureConfiguration;
-import cn.iselab.mooctest.site.dao.ApplyUploadRecordDao;
-import cn.iselab.mooctest.site.dao.GradeGeneralDao;
-import cn.iselab.mooctest.site.dao.UploadRecordDao;
+import cn.iselab.mooctest.site.dao.*;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
-import cn.iselab.mooctest.site.models.ApplyUploadRecord;
-import cn.iselab.mooctest.site.models.Grade;
-import cn.iselab.mooctest.site.models.GradeGeneral;
-import cn.iselab.mooctest.site.models.UploadRecord;
+import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.rpc.user.IntegralService;
 import cn.iselab.mooctest.site.rpc.user.IntegralService;
+import cn.iselab.mooctest.site.service.CaseService;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import java.util.Collections;
 import java.util.Collections;
@@ -20,6 +16,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
@@ -39,7 +38,12 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
   UploadRecordDao uploadRecordDao;
   UploadRecordDao uploadRecordDao;
   @Autowired
   @Autowired
   ApplyUploadRecordDao applyUploadRecordDao;
   ApplyUploadRecordDao applyUploadRecordDao;
-
+  @Autowired
+  Exam2CaseDao exam2CaseDao;
+  @Autowired
+  SubmitRecordDao submitRecordDao;
+  @Autowired
+  CaseService caseService;
   @Autowired
   @Autowired
   IntegralService integralService;
   IntegralService integralService;
 
 
@@ -201,5 +205,54 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
     return applyUploadRecordDao.findOne(id);
     return applyUploadRecordDao.findOne(id);
   }
   }
 
 
+  @Override
+  public JSONObject getCase2WorkerData(long examId) {
+    JSONObject res = new JSONObject();
+    List<Object[]> bestRecords = uploadRecordDao.findBestRecordByExamId(examId);
+    List<Object[]> latestRecords = uploadRecordDao.findLatestRecordByExamId(examId);
+    List<SubmitRecord> submitRecords = submitRecordDao.findByExamId(examId);
+    List<Long> caseIds = exam2CaseDao.findCasesByExamId(examId).stream()
+            .filter(x -> caseService.checkCaseEvaluationPermission(x)).collect(Collectors.toList());
+    List<Long> workerIds = uploadRecordDao.retrieveUserIdsByExamId(examId);
+    for (Long caseId : caseIds) {
+      JSONArray workerList = new JSONArray();
+      for (Long workerId : workerIds) {
+        JSONObject workerRecord = new JSONObject();
+        JSONArray bestTypeScores = new JSONArray();
+        JSONArray latestTypeScores = new JSONArray();
+        if (submitRecords != null && submitRecords.size() > 0) {
+          workerRecord.put("totalScore", submitRecords.stream()
+                  .filter(x -> x.getParticipantId().equals(workerId)).findFirst().get().getScore());
+        }
+        bestRecords.stream().filter(x -> (Long.parseLong(String.valueOf(x[0])) == caseId
+                && Long.parseLong(String.valueOf(x[1])) == (workerId))).forEach(x -> {
+          JSONObject item = new JSONObject();
+          item.put("type", x[2]);
+          item.put("score", x[3]);
+          item.put("uploadTime", x[4]);
+          bestTypeScores.add(item);
+        });
+        latestRecords.stream().filter(x -> (Long.parseLong(String.valueOf(x[0])) == caseId
+                && Long.parseLong(String.valueOf(x[1])) == (workerId))).forEach(x -> {
+          JSONObject item = new JSONObject();
+          item.put("type", x[2]);
+          item.put("score", x[3]);
+          latestTypeScores.add(item);
+        });
+        workerRecord.put("workerId", workerId);
+        workerRecord.put("bestTypeScores", bestTypeScores);
+        workerRecord.put("latestTypeScores", latestTypeScores);
+        workerList.add(workerRecord);
+      }
+      res.put(String.valueOf(caseId), workerList);
+    }
+    return res;
+  }
+
+  @Override
+  public List<Long> getUploadUsersByExamId(long examId) {
+    return uploadRecordDao.retrieveUserIdsByExamId(examId);
+  }
+
 
 
 }
 }

+ 114 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/EvaluationController.java

@@ -1,26 +1,43 @@
 package cn.iselab.mooctest.site.web.ctrl;
 package cn.iselab.mooctest.site.web.ctrl;
 
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.configure.EvaluationConfiguration;
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import cn.iselab.mooctest.site.web.data.response.ServerCode;
 import cn.iselab.mooctest.site.web.data.response.ServerCode;
+import cn.iselab.mooctest.site.web.logic.ExamLogic;
+import cn.iselab.mooctest.site.web.logic.OSSLogic;
 import cn.iselab.mooctest.site.web.logic.UserEvaluationLogic;
 import cn.iselab.mooctest.site.web.logic.UserEvaluationLogic;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.SecurityUtils;
+import org.springframework.http.*;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.File;
+import java.io.InputStream;
 
 
 /**
 /**
  * Created on 2019/3/19
  * Created on 2019/3/19
  */
  */
 @RestController
 @RestController
+@Slf4j
 public class EvaluationController {
 public class EvaluationController {
 
 
     @Resource
     @Resource
+    private EvaluationConfiguration evaluationConfiguration;
+    @Resource
     private UserEvaluationLogic userEvaluationLogic;
     private UserEvaluationLogic userEvaluationLogic;
+    @Resource
+    private OSSLogic ossLogic;
+    @Resource
+    private ExamLogic examLogic;
 
 
     @RequestMapping(value = UrlConstants.API+"/evaluation/{examId}", method = RequestMethod.POST)
     @RequestMapping(value = UrlConstants.API+"/evaluation/{examId}", method = RequestMethod.POST)
     public ResponseVO triggerExamEvaluation(@PathVariable("examId")long examId){
     public ResponseVO triggerExamEvaluation(@PathVariable("examId")long examId){
@@ -35,4 +52,100 @@ public class EvaluationController {
         CommunityStatisticVO vo = userEvaluationLogic.getCommunityStatistic(userId);
         CommunityStatisticVO vo = userEvaluationLogic.getCommunityStatistic(userId);
         return new ResponseVO<>(ServerCode.SUCCESS, vo);
         return new ResponseVO<>(ServerCode.SUCCESS, vo);
     }
     }
+
+    @RequestMapping(value = UrlConstants.API + "/evaluation/trigger/{examId}", method = RequestMethod.POST)
+    public ResponseVO<String> triggerEvaluation(@PathVariable("examId") long examId) {
+        if (examLogic.getExamById(examId) == null) {
+            return new ResponseVO<>(500, "无当前考试记录", null);
+        }
+        String url = evaluationConfiguration.getBackEndUrl() + "jobProgress";
+        log.info("getTriggerResponse开始...");
+        long start = System.currentTimeMillis();
+        ResponseEntity<JSONObject> response = getTriggerResponse(url, examId);
+        log.info("用时:[{}]ms.", System.currentTimeMillis() - start);
+        log.info(String.valueOf(response.getBody()));
+        if (response.getBody().getInteger("code") == 200) {
+            return new ResponseVO<>(ServerCode.SUCCESS, "触发考试评估");
+        } else {
+            return new ResponseVO<>(500, "触发考试失败,请稍后重试", null);
+        }
+    }
+
+    @RequestMapping(value = UrlConstants.API + "/evaluation/getProgress/{examId}", method = RequestMethod.GET)
+    public ResponseVO<JSONObject> checkEvaluationProgress(@PathVariable("examId") long examId) {
+        if (examLogic.getExamById(examId) == null) {
+            return new ResponseVO<>(500, "无当前考试记录", null);
+        }
+        RestTemplate rt = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject json = new JSONObject();
+        json.put("examId", examId);
+        HttpEntity<JSONObject> httpEntity = new HttpEntity<>(json, headers);
+        String url = evaluationConfiguration.getBackEndUrl() + "jobProgress";
+        log.info("方法开始...");
+        long start = System.currentTimeMillis();
+        ResponseEntity<JSONObject> response = rt.exchange(url, HttpMethod.POST, httpEntity, JSONObject.class);
+        log.info("用时:[{}]ms.", System.currentTimeMillis() - start);
+        log.info(String.valueOf(response.getBody()));
+        if (response.getBody().getInteger("code") == 200) {
+            return new ResponseVO<>(ServerCode.SUCCESS, response.getBody().getJSONObject("data"));
+        } else {
+            return new ResponseVO<>(500, "获取评估进度失败", null);
+        }
+    }
+
+    @RequestMapping(value = UrlConstants.API + "/evaluation/retry/{examId}", method = RequestMethod.POST)
+    public ResponseVO<String> retryEvaluation(@PathVariable("examId") long examId) {
+        if (examLogic.getExamById(examId) == null) {
+            return new ResponseVO<>(500, "无当前考试记录", null);
+        }
+        String url = evaluationConfiguration.getBackEndUrl() + "retryJob";
+        ResponseEntity<JSONObject> response = getTriggerResponse(url, examId);
+        log.info(String.valueOf(response.getBody()));
+        if (response.getBody().getInteger("code") == 200) {
+            return new ResponseVO<>(ServerCode.SUCCESS, "重试触发考试评估");
+        } else {
+            return new ResponseVO<>(500, "重试触发考试失败,请稍后重试", null);
+        }
+    }
+
+    private ResponseEntity<JSONObject> getTriggerResponse(String requestUrl, Long examId) {
+        String fileName = "exam_result.json";
+        log.info("generateExamData方法开始...");
+        long start = System.currentTimeMillis();
+        InputStream inputStream = userEvaluationLogic.generateExamData(fileName, examId);
+        log.info("generateExamData方法用时:[{}]ms.", System.currentTimeMillis() - start);
+        String uploadUrl = "evaluation/exam_" + examId + ".json";
+        String ossUrl = ossLogic.uploadByUrl(uploadUrl, inputStream);
+        log.info("ossUrl: " + ossUrl);
+        // 删除本地json文件
+        File tmpFile = new File(fileName);
+        if (tmpFile.exists()) {
+            tmpFile.delete();
+        }
+        RestTemplate rt = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject json = new JSONObject();
+        json.put("examId", examId);
+        json.put("ossUrl", ossUrl);
+        HttpEntity<JSONObject> httpEntity = new HttpEntity<>(json, headers);
+        return rt.exchange(requestUrl, HttpMethod.POST, httpEntity, JSONObject.class);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "/evaluation/getRadarUrl", method = RequestMethod.GET)
+    public ResponseVO<String> getRadarUrl() {
+        String url = evaluationConfiguration.getFrontEndUrl() + evaluationConfiguration.getRadarUrl();
+        return new ResponseVO<>(ServerCode.SUCCESS, url);
+    }
+
+    @RequestMapping(value = UrlConstants.API + "/evaluation/checkPermission/{examId}", method = RequestMethod.GET)
+    public ResponseVO<Boolean> checkEvaluationPermission(@PathVariable("examId") long examId) {
+        if (examLogic.getExamById(examId) == null) {
+            return new ResponseVO<>(500, "无当前考试记录", false);
+        }
+        boolean res = userEvaluationLogic.checkEvaluationPermission(examId);
+        return new ResponseVO<>(ServerCode.SUCCESS, res);
+    }
 }
 }

+ 6 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/UserEvaluationLogic.java

@@ -2,6 +2,8 @@ package cn.iselab.mooctest.site.web.logic;
 
 
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 
 
+import java.io.InputStream;
+
 /**
 /**
  * Created on 2019/3/19
  * Created on 2019/3/19
  */
  */
@@ -11,4 +13,8 @@ public interface UserEvaluationLogic {
 
 
     CommunityStatisticVO getCommunityStatistic(long userId);
     CommunityStatisticVO getCommunityStatistic(long userId);
 
 
+    InputStream generateExamData(String fileName, long examId);
+
+    boolean checkEvaluationPermission(long examId);
+
 }
 }

+ 119 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/UserEvaluationLogicImpl.java

@@ -3,19 +3,24 @@ package cn.iselab.mooctest.site.web.logic.impl;
 import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
 import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
 import cn.iselab.mooctest.site.configure.MongoDBConfiguration;
 import cn.iselab.mooctest.site.configure.MongoDBConfiguration;
 import cn.iselab.mooctest.site.configure.ScriptConfiguration;
 import cn.iselab.mooctest.site.configure.ScriptConfiguration;
-import cn.iselab.mooctest.site.data.ExamPythonCommunityDTO;
-import cn.iselab.mooctest.site.models.ExamPythonCommunity;
+import cn.iselab.mooctest.site.data.UserDTOForMT;
 import cn.iselab.mooctest.site.rpc.user.IntegralService;
 import cn.iselab.mooctest.site.rpc.user.IntegralService;
-import cn.iselab.mooctest.site.service.ExamPythonCommunityService;
+import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 import cn.iselab.mooctest.site.web.data.CommunityStatisticVO;
 import cn.iselab.mooctest.site.web.logic.UserEvaluationLogic;
 import cn.iselab.mooctest.site.web.logic.UserEvaluationLogic;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
+
+import java.io.*;
 import java.nio.file.Path;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+
+import com.alibaba.dubbo.common.json.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -23,6 +28,7 @@ import org.springframework.stereotype.Service;
  * Created on 2019/3/19
  * Created on 2019/3/19
  */
  */
 @Service
 @Service
+@Slf4j
 public class UserEvaluationLogicImpl implements UserEvaluationLogic{
 public class UserEvaluationLogicImpl implements UserEvaluationLogic{
 
 
     @Resource
     @Resource
@@ -37,6 +43,18 @@ public class UserEvaluationLogicImpl implements UserEvaluationLogic{
     private ExamPythonCommunityService examPythonCommunityService;
     private ExamPythonCommunityService examPythonCommunityService;
     @Resource
     @Resource
     private IntegralService integralService;
     private IntegralService integralService;
+    @Resource
+    private ExamService examService;
+    @Resource
+    private Exam2CaseService exam2CaseService;
+    @Resource
+    private CaseService caseService;
+    @Resource
+    private GeneralCalculateScoreService generalCalculateScoreService;
+    @Resource
+    private UserService userService;
+//    @Resource
+//    private ThirdPartToolService thirdPartToolService;
 
 
     @Override
     @Override
     public void triggerExamEvaluation(long examId) {
     public void triggerExamEvaluation(long examId) {
@@ -78,4 +96,99 @@ public class UserEvaluationLogicImpl implements UserEvaluationLogic{
         UserIntegralDTO userIntegral = integralService.getUserIntegral(userId);
         UserIntegralDTO userIntegral = integralService.getUserIntegral(userId);
         return new CommunityStatisticVO(userId, total, dones[0], dones[1], userIntegral.getTotal());
         return new CommunityStatisticVO(userId, total, dones[0], dones[1], userIntegral.getTotal());
     }
     }
+
+    @Override
+    public InputStream generateExamData(String fileName, long examId) {
+        try {
+            File file = new File(fileName);
+            if (!file.exists())//判断文件是否存在,若不存在则新建
+            {
+                file.createNewFile();
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(file);
+            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
+            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
+            JSONObject json = new JSONObject();
+            log.info("getExamBasicInfo方法开始...");
+            long start = System.currentTimeMillis();
+            JSONObject examData = examService.getExamBasicInfo(examId);
+            log.info("用时:[{}]ms.", System.currentTimeMillis() - start);
+//            List<ThirdPartToolJob> jobs = thirdPartToolService.getAllThirdPartToolJobsByExamId(examId);
+//            if (jobs != null && jobs.size() > 0) {
+//                json.put("thirdPartTool", jobs);
+//            } else {
+            log.info("generalCalculateScoreService.getCase2WorkerData方法开始...");
+            long start1 = System.currentTimeMillis();
+            json.put("case2Worker", generalCalculateScoreService.getCase2WorkerData(examId));
+            log.info("getCase2WorkerData方法用时:[{}]ms.", System.currentTimeMillis() - start1);
+//            }
+            json.put("examData", examData);
+            json.put("workerData", getWorkerDataDictByExamId(examId));
+            json.put("caseDataList", getCaseDataListByExamId(examId));
+            bufferedWriter.write(JSON.json(json));
+            bufferedWriter.flush();
+            bufferedWriter.close();
+            return new FileInputStream(file);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public boolean checkEvaluationPermission(long examId) {
+        List<Long> caseIds = exam2CaseService.getCaseIdsByExamId(examId);
+        for (Long caseId : caseIds) {
+            boolean checkFlag = caseService.checkCaseEvaluationPermission(caseId);
+            if (checkFlag) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private JSONArray getCaseDataListByExamId(long examId) {
+        log.info("getCaseDataListByExamId方法开始...");
+        long start = System.currentTimeMillis();
+        List<Long> caseIds = exam2CaseService.getCaseIdsByExamId(examId).stream()
+                .filter(x -> caseService.checkCaseEvaluationPermission(x)).collect(Collectors.toList());
+        JSONArray caseDataList = new JSONArray();
+        for (long caseId : caseIds) {
+            JSONObject item = caseService.getCaseInfoById(caseId);
+            caseDataList.add(item);
+        }
+        log.info("getCaseDataListByExamId方法用时:[{}]ms.", System.currentTimeMillis() - start);
+        return caseDataList;
+    }
+
+    private JSONObject getWorkerDataDictByExamId(long examId) {
+        log.info("getWorkerDataDictByExamId方法开始...");
+        long start = System.currentTimeMillis();
+        JSONObject workerDataList = new JSONObject();
+        List<Long> userIds;
+        try {
+//            userIds = thirdPartToolService.getAllThirdPartToolJobsByExamId(examId)
+//                    .stream().map(ThirdPartToolJob::getOwnerId).collect(Collectors.toList());
+//            if (userIds == null || userIds.size() == 0) {
+            userIds = generalCalculateScoreService.getUploadUsersByExamId(examId);
+//            }
+            Map<Long, UserDTOForMT> userMap = userService.getUserMap(userIds);
+            userIds.forEach(id -> {
+                JSONObject item = new JSONObject();
+                UserDTOForMT user = userMap.get(id);
+                item.put("avatar", user.getPhotoUrl());
+                item.put("name", user.getName());
+                item.put("school", user.getSchool());
+                item.put("province", user.getProvince());
+                workerDataList.put(String.valueOf(user.getId()), item);
+            });
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+        log.info("getWorkerDataDictByExamId方法用时:[{}]ms.", System.currentTimeMillis() - start);
+        return workerDataList;
+    }
+
+
 }
 }