Ver Fonte

Merge branch 'task-score-api-fix' into 'DEV'

Task score api fix

1. 计算总分接口、逻辑改动
2. paper删题后重新计算case的比例

See merge request !160

LiHaoyu há 8 anos atrás
pai
commit
0dffaa408e

+ 10 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/PaperServiceImpl.java

@@ -7,7 +7,9 @@ import cn.iselab.mooctest.site.dao.Task2CaseDao;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.BaseService;
 import cn.iselab.mooctest.site.service.PaperService;
+import cn.iselab.mooctest.site.service.TaskService;
 import cn.iselab.mooctest.site.web.data.CaseBlockVO;
+import cn.iselab.mooctest.site.web.data.wrapper.CaseBlockVOWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -39,6 +41,10 @@ public class PaperServiceImpl extends BaseService implements PaperService {
 
     @Autowired
     Exam2PaperDao exam2PaperDao;
+    @Autowired
+    TaskService taskService;
+    @Autowired
+    private CaseBlockVOWrapper caseBlockVOWrapper;
 
     @Override
     public Paper getById(long paperId) {
@@ -152,9 +158,11 @@ public class PaperServiceImpl extends BaseService implements PaperService {
         if(task2Case == null)
             throw new IllegalArgumentException("该试卷不存在这道题!");
         task2CaseDao.delete(task2Case);
-        if(task2CaseDao.findOne(task2Case.getId()) == null)
+        if(task2CaseDao.findOne(task2Case.getId()) == null){
+            List<CaseBlockVO> caseBlockVOS = taskService.getCaseBlocks(paperId).stream().map(caseBlock -> caseBlockVOWrapper.wrap(caseBlock)).collect(Collectors.toList());
+            updateCaseAndWeight(paperId,caseBlockVOS);
             return true;
-        else
+        } else
             return false;
 
     }

+ 6 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java

@@ -1,7 +1,9 @@
 package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
+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.*;
 
@@ -29,9 +31,11 @@ public class ScoreController {
     }
 
     //一次考试的一个人的分 或者 一次考试的所有人的分
+    @RequiresRoles("manager")
     @RequestMapping(value = UrlConstants.API + "score",method = RequestMethod.PUT)
     public List<Double> CalculateTaskScore(@RequestParam(name="examId") Long examId,
-                                           @RequestParam(name="participantId",required = false) Long participantId){
-        return calculateSocreLogic.calculateExamScore(examId,participantId);
+                                           @RequestParam(name="participantId",required = false) Long participantId,
+                                           @RequestBody WeightDirtyVO weightDirtyVO) throws Exception{
+        return calculateSocreLogic.calculateExamScore(examId,participantId,weightDirtyVO);
     }
 }

+ 14 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/WeightDirtyVO.java

@@ -0,0 +1,14 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by HenryLee on 2017/8/7.
+ */
+@Data
+public class WeightDirtyVO {
+    private boolean weightDirty;
+    private List<Long> caseDirty;
+}

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

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.web.logic;
 
+import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
+
 import java.util.List;
 
 /**
@@ -9,5 +11,5 @@ public interface CalculateSocreLogic {
     public void calculateScore(long taskId, long caseId) throws Exception;
     public void calculateScore(long taskId, long caseId, long userId) throws Exception;
 
-    public List<Double> calculateExamScore(long examId, Long participantId);
+    public List<Double> calculateExamScore(long examId, Long participantId, WeightDirtyVO weightDirtyVO) throws Exception;
 }

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

@@ -1,14 +1,11 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.common.constant.SubsiteConstants;
-import cn.iselab.mooctest.site.models.AssignedTask;
-import cn.iselab.mooctest.site.models.CaseExtends;
-import cn.iselab.mooctest.site.models.Exam2Case;
-import cn.iselab.mooctest.site.service.AssignedTaskService;
-import cn.iselab.mooctest.site.service.CalculateScoreService;
-import cn.iselab.mooctest.site.service.CaseService;
-import cn.iselab.mooctest.site.service.Exam2CaseService;
+import cn.iselab.mooctest.site.data.CaseBlock;
+import cn.iselab.mooctest.site.models.*;
+import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.service.fromKibug.ScoreRuleService;
+import cn.iselab.mooctest.site.web.data.WeightDirtyVO;
 import cn.iselab.mooctest.site.web.data.fromKibug.ScoreRuleItemVO;
 import cn.iselab.mooctest.site.web.logic.CalculateSocreLogic;
 import org.json.JSONArray;
@@ -26,21 +23,20 @@ import java.util.List;
 @Service
 public class CalculateScoreLogicImpl implements CalculateSocreLogic {
 
-
     @Autowired
     private CalculateScoreService calculateScoreService;
-
     @Autowired
     private AssignedTaskService assignedTaskService;
-
     @Autowired
     private Exam2CaseService exam2CaseService;
-
     @Autowired
     private ScoreRuleService scoreRuleService;
-
     @Autowired
     private CaseService caseService;
+    @Autowired
+    private PaperService paperService;
+    @Autowired
+    private TaskService taskService;
 
     @Override
     public void calculateScore(long taskId, long caseId) throws Exception{
@@ -71,7 +67,32 @@ public class CalculateScoreLogicImpl implements CalculateSocreLogic {
     }
 
     @Override
-    public List<Double> calculateExamScore(long examId, Long participantId) {
+    public List<Double> calculateExamScore(long examId, Long participantId,WeightDirtyVO weightDirtyVO) throws Exception{
+        //获取exam中应有的case
+        Paper paper = paperService.getByExamId(examId);
+        if(paper == null) {
+            throw new IllegalArgumentException("Cannot find paper of this exam.");
+        }
+        List<CaseBlock> caseBlocks = taskService.getCaseBlocks(paper.getId());
+        List<Long> casesId = new ArrayList<>();
+        for(CaseBlock caseBlock :caseBlocks){
+            for(Long caseId : caseBlock.getCaseIds()) {
+                casesId.add(caseId);
+            }
+        }
+
+        //为null表示为发布成绩时,计算所有case的小分,再计算总分
+        if(weightDirtyVO == null) {
+            for(Long caseId:casesId){
+                calculateScore(examId,caseId);
+            }
+        }else {//如果不为null,表示保存评分规则时,需要对更改的评分规则的case进行计算,再计算总分
+            for(Long caseId:weightDirtyVO.getCaseDirty()){
+                if(casesId.contains(caseId))
+                    calculateScore(examId,caseId);
+            }
+        }
+        //最后计算task的总分
         List<Double> scores = new ArrayList<>();
         if(participantId != null){
             AssignedTask assignedTask=assignedTaskService.getAssignedTask(examId,participantId);