Parcourir la source

Merge branch 'feature-tmp-score' into 'DEV'

Feature tmp score



See merge request !868

menduo il y a 7 ans
Parent
commit
cdea38721c
18 fichiers modifiés avec 278 ajouts et 54 suppressions
  1. 13 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ApplyUploadRecordDao.java
  2. 35 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ApplyUploadRecord.java
  3. 7 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GeneralCalculateScoreService.java
  4. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java
  5. 50 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/data/CacheUtil.java
  6. 9 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/CaseController.java
  7. 35 13
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java
  8. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginController.java
  9. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/response/ServerCode.java
  10. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GeneralCalculateScoreLogic.java
  11. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/UpDownloadLogic.java
  12. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/UpDownloadLogicImpl.java
  13. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/UpDownloadLogicPCImpl.java
  14. 20 30
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponent.java
  15. 24 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreLogicImpl.java
  16. 3 0
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/CaseControllerTest.java
  17. 3 2
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginControllerTest.java
  18. 13 7
      mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponentTest.java

+ 13 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ApplyUploadRecordDao.java

@@ -0,0 +1,13 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.ApplyUploadRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * Created on 2018/10/22
+ */
+public interface ApplyUploadRecordDao extends JpaRepository<ApplyUploadRecord, Long>{
+
+    ApplyUploadRecord findTopByWorkerIdAndExamIdOrderByIdDesc(long workerId, long examId);
+
+}

+ 35 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/ApplyUploadRecord.java

@@ -0,0 +1,35 @@
+package cn.iselab.mooctest.site.models;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Created on 2018/10/22
+ */
+@Table(name = "apply_upload_record")
+@Entity
+@EqualsAndHashCode
+@Data
+public class ApplyUploadRecord {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    long id;
+
+    @Column(name = "worker_id")
+    long workerId;
+
+    @Column(name = "exam_id")
+    long examId;
+
+    @Column(name = "oss_url")
+    String ossUrl;
+
+
+}

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

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.service;
 
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
+import cn.iselab.mooctest.site.models.ApplyUploadRecord;
 import cn.iselab.mooctest.site.models.UploadRecord;
 import java.util.List;
 import java.util.Map;
@@ -31,4 +32,10 @@ public interface GeneralCalculateScoreService {
   UploadRecordDTO saveUploadRecords(UploadRecordDTO record);
 
   List<Long> getUploadUsers(long examId, long caseId);
+
+  ApplyUploadRecord saveApplyUploadRecord(long workerId,long examId,String ossUrl);
+
+  ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId);
+
+  ApplyUploadRecord getApplyUploadRecordById(long id);
 }

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java

@@ -1,8 +1,10 @@
 package cn.iselab.mooctest.site.service.impl;
 
+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.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;
@@ -29,6 +31,8 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
   GradeGeneralDao gradeGeneralDao;
   @Autowired
   UploadRecordDao uploadRecordDao;
+  @Autowired
+  ApplyUploadRecordDao applyUploadRecordDao;
   @Override
   public void updateTypeGrade(long uploadId, String type, double score) {
     GradeGeneral gradeGeneral = gradeGeneralDao.findByUploadIdAndType(uploadId,type);
@@ -117,5 +121,24 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
     return uploadRecordDao.retrieveUserIdsByExamIdAndCaseId(examId, caseId);
   }
 
+  @Override
+  public ApplyUploadRecord saveApplyUploadRecord(long workerId, long examId, String ossUrl) {
+    ApplyUploadRecord applyUploadRecord = new ApplyUploadRecord();
+    applyUploadRecord.setWorkerId(workerId);
+    applyUploadRecord.setExamId(examId);
+    applyUploadRecord.setOssUrl(ossUrl);
+    return applyUploadRecordDao.save(applyUploadRecord);
+  }
+
+  @Override
+  public ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId) {
+    return applyUploadRecordDao.findTopByWorkerIdAndExamIdOrderByIdDesc(workerId, examId);
+  }
+
+  @Override
+  public ApplyUploadRecord getApplyUploadRecordById(long id) {
+    return applyUploadRecordDao.findOne(id);
+  }
+
 
 }

+ 50 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/data/CacheUtil.java

@@ -0,0 +1,50 @@
+package cn.iselab.mooctest.site.util.data;
+
+import cn.iselab.mooctest.site.service.CaseGraphService;
+import cn.iselab.mooctest.site.web.data.forMongo.CaseGraphDTO;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.PostConstruct;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created on 2018/10/19
+ */
+@Component
+public class CacheUtil {
+    @Autowired
+    CaseGraphService caseGraphService;
+
+    @Value("${cache.expire.duration}")
+    long expireDuration;
+
+    private Cache<Long, CaseGraphDTO> metaNodeCache;
+
+    @PostConstruct
+    private void init(){
+        metaNodeCache = CacheBuilder
+                .newBuilder()
+                .maximumSize(1000)
+                .expireAfterAccess(expireDuration, TimeUnit.MINUTES)
+                .build();
+    }
+
+    public CaseGraphDTO getMetaNode(long caseId) throws ExecutionException {
+        return metaNodeCache.get(caseId, () -> caseGraphService.getCaseGraph(caseId));
+    }
+
+    public void removeMetaNodeByKey(long caseId){
+        metaNodeCache.invalidate(caseId);
+    }
+
+    public void removeMetaNodeAll(){
+        metaNodeCache.invalidateAll();
+    }
+
+
+
+}

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

@@ -8,6 +8,7 @@ import cn.iselab.mooctest.site.service.fromKibug.CaseTakeService;
 import cn.iselab.mooctest.site.web.data.SearchConditionVO;
 import cn.iselab.mooctest.site.web.data.UserStarCaseVO;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
 import cn.iselab.mooctest.site.web.response.ErrorResult;
 import cn.iselab.mooctest.site.web.response.ResponseMessage;
 import cn.iselab.mooctest.site.web.response.StatusCode;
@@ -52,6 +53,8 @@ public class CaseController extends BaseSearchController {
     private CaseTakeService caseTakeService;
     @Autowired
     private UserStarCaseService userStarCaseService;
+    @Autowired
+    private GeneralCalculateScoreLogic generalCalculateScoreLogic;
 
     public Page<CaseExtendsVO> search(@RequestParam(name = "isPublic", required = false) Boolean isPublic,
                                       @RequestParam(name = "subjectId", required = false) Long subjectId,
@@ -106,7 +109,12 @@ public class CaseController extends BaseSearchController {
         if (!SecurityUtils.getSubject().isPermitted(new CasePermission(permissionStr))) {
             throw new UnauthenticatedException("forbidden");
         }
-        return caseLogic.saveGraph(caseGraphDTO);
+        CaseGraphDTO caseGraph =  caseLogic.saveGraph(caseGraphDTO);
+        //修改caseGraph后执行缓存失效
+        if(caseGraph != null){
+            generalCalculateScoreLogic.expireMetaNode(caseGraph.getCaseId());
+        }
+        return caseGraph;
     }
 
     @RequiresPermissions("case:view")

+ 35 - 13
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java

@@ -5,6 +5,7 @@ import cn.iselab.mooctest.site.common.enums.CompeteAnalysisType;
 import cn.iselab.mooctest.site.common.enums.SortOrder;
 import cn.iselab.mooctest.site.data.PageData;
 import cn.iselab.mooctest.site.data.Sort;
+import cn.iselab.mooctest.site.models.ApplyUploadRecord;
 import cn.iselab.mooctest.site.service.CaughtNodeService;
 import cn.iselab.mooctest.site.service.CompeteAnalysisAssignedTaskService;
 import cn.iselab.mooctest.site.service.enums.ExamStatus;
@@ -16,6 +17,7 @@ import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CaughtNodeDTO;
 import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import cn.iselab.mooctest.site.web.data.response.ServerCode;
+import cn.iselab.mooctest.site.web.exception.ServerException;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
 import cn.iselab.mooctest.site.web.logic.ExamLogic;
 import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
@@ -102,19 +104,25 @@ public class ScoreController extends BaseController {
                 null);
     }
 
-//    @RequestMapping(value = UrlConstants.API_COMMON +
-//            "generalUploadCaughtNode/{examId}/{caseId}/{userId}/{uploadTime}/{source}", method = RequestMethod.PUT)
-//    public void generalCatchNode(@PathVariable("examId") long examId,
-//            @PathVariable("caseId") long caseId,
-//            @PathVariable("userId") long userId,
-//            @PathVariable("uploadTime") String uploadTime,
-//            @PathVariable("source") String source,
-//            @RequestBody List<CaughtNodeDTO> caughtNodeDTOs) throws Exception {
-//
-//        calculateSocreLogic.recordNode(examId, caseId, userId, uploadTime, source,
-//                caughtNodeDTOs,null);
-//
-//    }
+    @RequestMapping(value = UrlConstants.API_COMMON +
+            "generalUploadCaughtNode/{examId}/{caseId}/{userId}/{uploadTime}/{source}", method = RequestMethod.PUT)
+    public ResponseVO generalCatchNode(@PathVariable("examId") long examId,
+            @PathVariable("caseId") long caseId,
+            @PathVariable("userId") long userId,
+            @PathVariable("uploadTime") String uploadTime,
+            @PathVariable("source") String source,
+            @RequestBody List<CaughtNodeDTO> caughtNodeDTOs) throws Exception {
+
+        ApplyUploadRecord applyUploadRecord = generalCalculateScoreLogic
+                .getLatestApplyUploadRecord(userId,examId);
+        if(applyUploadRecord == null){
+            return new ResponseVO(ServerCode.NO_APPLY_FOUND);
+        }
+        calculateSocreLogic.recordNode(examId, caseId, userId, uploadTime, source,
+                caughtNodeDTOs,applyUploadRecord.getOssUrl());
+        return new ResponseVO(ServerCode.SUCCESS);
+
+    }
 
     @RequestMapping(value = UrlConstants.API_COMMON +
             "generalUploadCaughtNode", method = RequestMethod.PUT)
@@ -188,6 +196,20 @@ public class ScoreController extends BaseController {
         generalCalculateScoreLogic.uploadCaseScore(examId, caseId, userId, score);
     }
 
+    //使缓存的元node失效
+    @RequestMapping(value = UrlConstants.API_COMMON +
+            "expireMetaNode/{caseId}", method = RequestMethod.PUT)
+    public void expireMetaNode(@PathVariable("caseId") long caseId) {
+        generalCalculateScoreLogic.expireMetaNode(caseId);
+    }
+
+    //使所有缓存的元node失效
+    @RequestMapping(value = UrlConstants.API_COMMON +
+            "expireMetaNode", method = RequestMethod.PUT)
+    public void expireMetaNodeAll() {
+        generalCalculateScoreLogic.expireMetaNodeAll();
+    }
+
     @RequiresRoles("manager")
     @RequestMapping(value = UrlConstants.API + "competeAnalysis", method = RequestMethod.GET)
     public List<AssignedTaskVO> competeAnalysis(@RequestParam(value = "examId") Long examId) {

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginController.java

@@ -69,7 +69,7 @@ public class PluginController extends BaseController{
         String taskID = request.getParameter("taskID"),
                 workerID = request.getParameter("workerID"),
                 caseName = request.getParameter("caseName");
-        String signature = upDownloadLogic.getSubmitAnswersSignature(taskID, workerID, caseName);
+        String signature = upDownloadLogic.getAndRecordSubmitAnswersSignature(taskID,workerID,caseName);
         if (signature == null) {
             return StResponse.failure("签名未能生成");
         } else {

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/response/ServerCode.java

@@ -12,6 +12,7 @@ public enum ServerCode {
 
     //分数相关状态码:50000-59999
     UPLOAD_RECORD_FAIL(50000,"存储提交记录失败"),
+    NO_APPLY_FOUND(50001,"未找到申请提交记录"),
 
     //系统错误:60000-69999
     SYSTEM_ERROR(60000,"系统错误"),

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GeneralCalculateScoreLogic.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.web.logic;
 
+import cn.iselab.mooctest.site.models.ApplyUploadRecord;
+
 /**
  * general calculate score logic
  *
@@ -52,4 +54,12 @@ public interface GeneralCalculateScoreLogic {
 
 
     void uploadCaseScore(long examId, long caseId, long userId, double score);
+
+    void expireMetaNode(long caseId);
+
+    void expireMetaNodeAll();
+
+    ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId);
+
+    ApplyUploadRecord getApplyUploadRecord(long id);
 }

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/UpDownloadLogic.java

@@ -37,4 +37,14 @@ public interface UpDownloadLogic {
      * @return
      */
     String getSubmitAnswersSignature(String examID, String stuID, String examName);
+
+    /**
+     * 获取上传答案的签名并存储记录
+     *
+     * @param examID
+     * @param stuID
+     * @param examName
+     * @return
+     */
+    String getAndRecordSubmitAnswersSignature(String examID, String stuID, String examName);
 }

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/UpDownloadLogicImpl.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.web.logic.fromDev.impl;
 
 import cn.iselab.mooctest.site.models.CaseExtends;
 import cn.iselab.mooctest.site.service.CaseService;
+import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.service.TargetService;
 import cn.iselab.mooctest.site.web.logic.BaseLogic;
 import cn.iselab.mooctest.site.web.logic.fromDev.UpDownloadLogic;
@@ -30,6 +31,8 @@ public class UpDownloadLogicImpl extends BaseLogic implements UpDownloadLogic {
     private CaseService caseService;
     @Autowired
     private TargetService targetService;
+    @Autowired
+    private GeneralCalculateScoreService generalCalculateScoreService;
 
     @Value("${oss.endPoint}")
     private String endPoint;
@@ -132,4 +135,12 @@ public class UpDownloadLogicImpl extends BaseLogic implements UpDownloadLogic {
         client.shutdown();
         return signedUrl.toString();
     }
+
+    @Override
+    public String getAndRecordSubmitAnswersSignature(String examID, String stuID, String examName) {
+        String signature = this.getSubmitAnswersSignature(examID, stuID, examName);
+        generalCalculateScoreService.saveApplyUploadRecord(Long.parseLong(stuID),Long.parseLong(examID),
+                signature.split("\\?")[0]);
+        return signature;
+    }
 }

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/fromDev/impl/UpDownloadLogicPCImpl.java

@@ -26,6 +26,8 @@ public class UpDownloadLogicPCImpl implements UpDownloadLogic{
     private CaseService caseService;
     @Autowired
     private TargetService targetService;
+    @Autowired
+    private GeneralCalculateScoreService generalCalculateScoreService;
 
     /**
      * 获取下载文件的签名(私有云)
@@ -73,4 +75,12 @@ public class UpDownloadLogicPCImpl implements UpDownloadLogic{
 
         return path;
     }
+
+    @Override
+    public String getAndRecordSubmitAnswersSignature(String examID, String stuID, String examName) {
+        String path = getSubmitAnswersSignature(examID, stuID, examName);
+        generalCalculateScoreService.saveApplyUploadRecord(Long.parseLong(stuID),Long.parseLong
+                (examID),path);
+        return path;
+    }
 }

+ 20 - 30
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponent.java

@@ -3,9 +3,14 @@ package cn.iselab.mooctest.site.web.logic.impl;
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import cn.iselab.mooctest.site.data.NodeExtends;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
-import cn.iselab.mooctest.site.models.UploadRecord;
-import cn.iselab.mooctest.site.service.*;
-import cn.iselab.mooctest.site.util.BeanFactory;
+import cn.iselab.mooctest.site.service.CatchService;
+import cn.iselab.mooctest.site.service.CaughtNodeService;
+import cn.iselab.mooctest.site.service.Exam2CaseService;
+import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
+import cn.iselab.mooctest.site.service.SubmitRecordService;
+import cn.iselab.mooctest.site.service.UserCatchService;
+import cn.iselab.mooctest.site.service.WeightGeneralService;
+import cn.iselab.mooctest.site.util.data.CacheUtil;
 import cn.iselab.mooctest.site.util.data.JSONUtil;
 import cn.iselab.mooctest.site.web.data.forMongo.CaseGraphDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CatchDTO;
@@ -17,20 +22,17 @@ import cn.iselab.mooctest.site.web.exception.ServerException;
 import cn.iselab.mooctest.site.web.logic.strategy.HighestStrategy;
 import cn.iselab.mooctest.site.web.logic.strategy.LatestStrategy;
 import cn.iselab.mooctest.site.web.logic.strategy.ScoreStrategy;
-import java.util.stream.Collectors;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Scope;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
 
 /**
  * asyncTask
@@ -42,9 +44,6 @@ import java.util.Map;
 @Slf4j
 public class GeneralCalculateScoreComponent {
 
-//    获取元node服务
-    @Autowired
-    CaseGraphService caseGraphService;
     //获取被命中nodes的服务
     @Autowired
     CaughtNodeService caughtNodeService;
@@ -64,8 +63,8 @@ public class GeneralCalculateScoreComponent {
     HighestStrategy highestStrategy;
     @Autowired
     CatchService catchService;
-
-    private static Map<Long, CaseGraphDTO> basicNodeMap = new HashMap<>();
+    @Autowired
+    CacheUtil cacheUtil;
 
     public void calculateGrade(long examId, long caseId, Long userId) throws
             Exception {
@@ -90,7 +89,7 @@ public class GeneralCalculateScoreComponent {
                 ,null)).collect(Collectors.toList());
 
         //通过元node和CatchDTOs计算每种类型的得分
-        CaseGraphDTO basicNode = getBasicNode(caseId);
+        CaseGraphDTO basicNode = cacheUtil.getMetaNode(caseId);
         Map<String, Double> typeScoreMap = calculateTypeScore(basicNode,catchDTOS);
         List<GeneralGradeDTO> gradeDTOList = new ArrayList<>();
         typeScoreMap.forEach((type,score) -> gradeDTOList.add(new GeneralGradeDTO(type,score,uploadId)));
@@ -134,7 +133,7 @@ public class GeneralCalculateScoreComponent {
         List<GeneralGradeDTO> generalGradeDTOList = new ArrayList<>();
 
         //元node数据
-        CaseGraphDTO basicNode = getBasicNode(caseId);
+        CaseGraphDTO basicNode = cacheUtil.getMetaNode(caseId);
 
         if (basicNode != null && userCatchDTOS != null && userCatchDTOS.size() != 0) {
             for (UserCatchDTO userCatchDTO : userCatchDTOS) {
@@ -160,6 +159,9 @@ public class GeneralCalculateScoreComponent {
     private Map<String,Double> calculateTypeScore(CaseGraphDTO basicNode, List<CatchDTO>
             catchDTOs){
         Map<String, Double> typeScoreMap = new HashMap<>();
+        if(basicNode == null || catchDTOs == null){
+            return typeScoreMap;
+        }
         for (Node node : basicNode.getNodes()) {
             for (CatchDTO catchDTO : catchDTOs) {
                 if (node.getName().equals(catchDTO.getNodeName())) {//用户命中了该node
@@ -287,16 +289,4 @@ public class GeneralCalculateScoreComponent {
         calculateGradeCurrent(uploadId,examId,caseId,userId,caughtNodeDTOs);
 
     }
-
-    private CaseGraphDTO getBasicNode(long caseId){
-        CaseGraphDTO basicNode = basicNodeMap.get(caseId);
-        if(basicNode == null){
-            basicNode = caseGraphService.getCaseGraph(caseId);
-            if(basicNode == null){
-                throw new ServerException(ServerCode.META_NODE_NOT_EXIST);
-            }
-            basicNodeMap.put(caseId,basicNode);
-        }
-        return  basicNode;
-    }
 }

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

@@ -1,9 +1,11 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
+import cn.iselab.mooctest.site.models.ApplyUploadRecord;
 import cn.iselab.mooctest.site.service.Exam2CaseService;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.service.SubmitRecordService;
 import cn.iselab.mooctest.site.service.WeightGeneralService;
+import cn.iselab.mooctest.site.util.data.CacheUtil;
 import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -33,6 +35,8 @@ public class GeneralCalculateScoreLogicImpl implements GeneralCalculateScoreLogi
   @Autowired
   Exam2CaseService exam2CaseService;
 
+  @Autowired
+  CacheUtil cacheUtil;
 
   @Override
   public void calculateExamScoreFromNode(long examId, String source) throws Exception {
@@ -73,5 +77,25 @@ public class GeneralCalculateScoreLogicImpl implements GeneralCalculateScoreLogi
     generalCalculateScoreComponent.saveGrade(userId,examId,caseId,score);
   }
 
+  @Override
+  public void expireMetaNode(long caseId) {
+    cacheUtil.removeMetaNodeByKey(caseId);
+  }
+
+  @Override
+  public void expireMetaNodeAll() {
+    cacheUtil.removeMetaNodeAll();
+  }
+
+  @Override
+  public ApplyUploadRecord getLatestApplyUploadRecord(long workerId, long examId) {
+    return generalCalculateScoreService.getLatestApplyUploadRecord(workerId, examId);
+  }
+
+  @Override
+  public ApplyUploadRecord getApplyUploadRecord(long id) {
+    return generalCalculateScoreService.getApplyUploadRecordById(id);
+  }
+
 
 }

+ 3 - 0
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/CaseControllerTest.java

@@ -13,6 +13,7 @@ import cn.iselab.mooctest.site.web.data.forMongo.graph.Category;
 import cn.iselab.mooctest.site.web.data.forMongo.graph.Edge;
 import cn.iselab.mooctest.site.web.data.forMongo.graph.Node;
 import cn.iselab.mooctest.site.web.logic.CaseLogic;
+import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
 import org.apache.shiro.session.Session;
 import org.apache.shiro.subject.Subject;
 import org.json.JSONArray;
@@ -58,6 +59,8 @@ public class CaseControllerTest extends AbstractShiroTest{
     private CaseLogic caseLogic;
     @Mock
     private ExamService examService;
+    @Mock
+    GeneralCalculateScoreLogic generalCalculateScoreLogic;
 
     private Page<CaseExtendsVO> expectPage;
     private List<CaseExtendsVO> cases = new ArrayList<>();

+ 3 - 2
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/ctrl/fromDev/PluginControllerTest.java

@@ -87,7 +87,8 @@ public class PluginControllerTest {
 
     @Test
     public void should_return_AnswersSignature_when_AnswersSignatureExsits() throws Exception{
-        when(upDownloadLogic.getSubmitAnswersSignature("1","1","Matrix")).thenReturn("test");
+        when(upDownloadLogic.getAndRecordSubmitAnswersSignature("1","1","Matrix")).thenReturn
+                ("test");
 
         MvcResult result = mockMvc.perform(
                 get("/api/dev/plugin/submitAnswersSig")
@@ -96,7 +97,7 @@ public class PluginControllerTest {
                         .param("caseName","Matrix")
         ).andDo(print()).andExpect(status().isOk()).andReturn();
 
-        Assert.assertEquals(result.getResponse().getContentAsString(),expect);
+        Assert.assertEquals(expect,result.getResponse().getContentAsString());
     }
 
     @Test

+ 13 - 7
mooctest-site-server/src/test/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponentTest.java

@@ -4,6 +4,7 @@ package cn.iselab.mooctest.site.web.logic.impl;
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import cn.iselab.mooctest.site.data.UploadRecordDTO;
 import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.util.data.CacheUtil;
 import cn.iselab.mooctest.site.web.data.forMongo.CaseGraphDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CatchDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.UserCatchDTO;
@@ -52,6 +53,8 @@ public class GeneralCalculateScoreComponentTest {
     private LatestStrategy latestStrategy;
     @Mock
     private HighestStrategy highestStrategy;
+    @Mock
+    private CacheUtil cacheUtil;
 
 
 
@@ -74,9 +77,9 @@ public class GeneralCalculateScoreComponentTest {
 
         //初始化反射类及其成员变量
         instance = generalCalculateScoreComponentClass.newInstance();
-        Field caseGraphServiceField = generalCalculateScoreComponentClass.getDeclaredField
-                ("caseGraphService");
-        caseGraphServiceField.set(instance, caseGraphService);
+//        Field caseGraphServiceField = generalCalculateScoreComponentClass.getDeclaredField
+//                ("caseGraphService");
+//        caseGraphServiceField.set(instance, caseGraphService);
 
         Field catchServiceField= generalCalculateScoreComponentClass.getDeclaredField("catchService");
         catchServiceField.set(instance, catchService);
@@ -92,6 +95,9 @@ public class GeneralCalculateScoreComponentTest {
                 ("generalCalculateScoreService");
         field3.set(instance,generalCalculateScoreService);
 
+        Field field4 = generalCalculateScoreComponentClass.getDeclaredField("cacheUtil");
+        field4.set(instance,cacheUtil);
+
         basicNode.setCaseId(1L);
         Category c1 = new Category("c1", 1);
         Category c2 = new Category("c2", 1);
@@ -164,7 +170,7 @@ public class GeneralCalculateScoreComponentTest {
 
     @Test
     public void should_calculateTypeScore_when_givenData() throws Exception {
-        when(caseGraphService.getCaseGraph(1L)).thenReturn(basicNode);
+        when(cacheUtil.getMetaNode(1L)).thenReturn(basicNode);
         when(catchService.findById("5b2fdac0d7fa0b6acb628193")).thenReturn(catchDTOList);
         when(generalCalculateScoreService.getUploadRecord(1105L, 1804L, 824L,"1234567"))
                 .thenReturn(uploadRecordDTO);
@@ -188,14 +194,14 @@ public class GeneralCalculateScoreComponentTest {
 
     }
 
-    @Test(expected = Exception.class)
+    @Test
     public void should_throwException_when_caseNotHasNode() throws Exception {
-        when(caseGraphService.getCaseGraph(2L)).thenReturn(null);
+        when(cacheUtil.getMetaNode(2L)).thenReturn(null);
         Method method = generalCalculateScoreComponentClass.getDeclaredMethod("calculateTypeScore",
                 long.class, List.class);
         method.setAccessible(true);
         Object result = method.invoke(instance, 1L, userCatchDTOList);
-//        assertEquals(0, ((ArrayList) result).size());
+        assertEquals(0, ((ArrayList) result).size());
     }
 
     @Test