Quellcode durchsuchen

Merge remote-tracking branch 'origin/dev' into dev

wangliang vor 4 Jahren
Ursprung
Commit
c102529b78

+ 2 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TOeExamRecordMapper.java

@@ -249,5 +249,7 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
 	public Long getCountByExamId(@Param("examId") Long examId);
 	
 	public List<TOeExamRecord> getListByExamIdAndStartId(@Param("examId")Long examId,@Param("startId") Long startId);
+
+	public void updateObjectiveScore(@Param("recordId") Long recordId,@Param("score") Double score);
 	
 }

+ 4 - 3
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamPaperServiceImpl.java

@@ -138,10 +138,11 @@ public class TEExamPaperServiceImpl extends ServiceImpl<TEExamPaperMapper, TEExa
             dfile.mkdirs();
             File structFile = new File(dir + "struct.json");
             FileUtil.saveUrlAsFile(structUrl, structFile);
-            File answerEncryptFile = new File(dir + "answer_encrypt_file.json");
-            FileUtil.saveUrlAsFile(answerUrl, answerEncryptFile);
+//            File answerEncryptFile = new File(dir + "answer_encrypt_file.json");
+//            FileUtil.saveUrlAsFile(answerUrl, answerEncryptFile);
             File answerFile = new File(dir + "answer_file.json");
-            FileUtil.decryptFile(answerEncryptFile, answerFile, ep.getDecryptSecret(), ep.getDecryptVector());
+            FileUtil.saveUrlAsFile(answerUrl, answerFile);
+//            FileUtil.decryptFile(answerEncryptFile, answerFile, ep.getDecryptSecret(), ep.getDecryptVector());
             String structJson = FileUtil.readFileContent(structFile);
             String answerjson = FileUtil.readFileContent(answerFile);
             return buildCache(structJson, answerjson);

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -974,6 +974,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 	    			for(TOeExamRecord rc:list) {
 	    				index++;
 	    				if(ExamRecordStatusEnum.PERSISTED.equals(rc.getStatus())) {
+	    					recordId=rc.getId();
 	    					toeExamRecordService.calculateScore(rc.getId());
 	    				}
 	    			}
@@ -981,7 +982,6 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 	    			tbTaskHistoryService.saveOrUpdate(task);
     			}
     		}
-			toeExamRecordService.calculateScore(recordId);
 			task.setSummary("处理成功");
 			task.setProgress(100.0);
 			task.setStatus(TaskStatusEnum.FINISH);

+ 79 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.themis.business.bean.backend.InvigilateListBean;
@@ -596,7 +597,84 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     @Transactional
     @Override
     public void calculateScore(Long recordId) {
-    	//TODO
+    	
+    	TOeExamRecord rec=this.getById(recordId);
+    	
+        Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(rec.getPaperId());
+        if (map == null || map.size() == 0) {
+            log.debug("no ObjectiveAnswerCacheBean for calculateObjectiveScore recordId:"+recordId);
+            return;
+        }
+        QueryWrapper<TOeExamAnswer> wp = new QueryWrapper<>();
+		wp.lambda().eq(TOeExamAnswer::getExamRecordId, recordId);
+		List<TOeExamAnswer> answers=examAnswerService.list(wp);
+		if(answers==null||answers.size()==0) {
+			log.debug("no ObjectiveAnswer for calculateObjectiveScore recordId:"+recordId);
+			return;
+		}
+		BigDecimal tatolscore = new BigDecimal(0.0);
+		for(TOeExamAnswer answer:answers) {
+			Double score=calculateScoreForQuestion(answer, map);
+			if(score!=null) {
+				tatolscore=tatolscore.add(new BigDecimal(score));
+			}
+		}
+
+        // 设置客观分总分
+		tOeExamRecordMapper.updateObjectiveScore(recordId, tatolscore.doubleValue());
+    }
+    
+    private Double calculateScoreForQuestion(TOeExamAnswer answer,Map<String, ObjectiveAnswerCacheBean> map) {
+    	Long recordId=answer.getExamRecordId();
+    	Integer mainNumber=answer.getMainNumber();
+    	Integer subNumber=answer.getSubNumber();
+    	Integer subIndex=answer.getSubIndex();
+    	String key = RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex);
+        ObjectiveAnswerCacheBean cb = map.get(key);
+        if (cb == null) {
+        	log.debug("not a objective question  recordId:"+answer.getExamRecordId()+" key:"+key);
+            return null;
+        }
+
+        if (cb.getStructType().intValue() == 1) {
+            if (checkSingleChoice(answer.getAnswer(), cb.getChoiceAnswer())) {
+                answer.setScore(cb.getScore());
+            } else {
+                answer.setScore(0.0);
+            }
+        }
+        if (cb.getStructType().intValue() == 2) {
+            ExamCacheBean ec = examService.getExamCacheBean(ExamRecordCacheUtil.getExamId(recordId));
+            int r = checkMultipleChoice(answer.getAnswer(), cb.getChoiceAnswer());
+            if (ec.getObjectiveScorePolicy().equals(ObjectiveScorePolicyEnum.EQUAL)) {// 全对给分
+                if (r == 1) {
+                    answer.setScore(cb.getScore());
+                } else {
+                    answer.setScore(0.0);
+                }
+            }
+            if (ec.getObjectiveScorePolicy().equals(ObjectiveScorePolicyEnum.PARTIAL)) {// 漏选半分
+                if (r == 1) {
+                    answer.setScore(cb.getScore());
+                } else if (r == 0) {
+                    BigDecimal b = new BigDecimal(cb.getScore()).divide(new BigDecimal("2"), 1, BigDecimal.ROUND_UP);
+                    answer.setScore(b.doubleValue());
+                } else {
+                    answer.setScore(0.0);
+                }
+            }
+        }
+        if (cb.getStructType().intValue() == 3) {
+            if (Boolean.parseBoolean(answer.getAnswer()) == cb.getBoolAnswer().booleanValue()) {
+                answer.setScore(cb.getScore());
+            } else {
+                answer.setScore(0.0);
+            }
+        }
+
+        examAnswerService.saveOrUpdate(answer);
+        
+        return answer.getScore();
     }
     
     /**获取考试记录数

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskExamPaperImportTemplete.java

@@ -289,12 +289,12 @@ public class TaskExamPaperImportTemplete implements TaskImportTemplete {
         if (answerFile == null) {
             return;
         }
-        File encryptFile = new File(rootDir + uuid() + ".json");
-        FileUtil.encryptFile(answerFile, encryptFile, paper.getDecryptSecret(), paper.getDecryptVector());
+//        File encryptFile = new File(rootDir + uuid() + ".json");
+//        FileUtil.encryptFile(answerFile, encryptFile, paper.getDecryptSecret(), paper.getDecryptVector());
         String filePath = sdf.format(new Date()) + "/" + uuid() + ".json";
         paper.setAnswerPath(filePath);
         SystemConfig systemConfig = SpringContextHolder.getBean(SystemConfig.class);
-        OssUtil.ossUpload(systemConfig.getOssEnv(3), filePath, encryptFile);
+        OssUtil.ossUpload(systemConfig.getOssEnv(3), filePath, answerFile);
     }
 
     private void addResult(StringBuilder result, String msg) {

+ 4 - 0
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -441,4 +441,8 @@
 		order by f.id
 		limit 500
 	</select>
+	
+	<update id="updateObjectiveScore">
+		update t_oe_exam_record t set t.objective_score=#{score} where t.id=#{recordId}
+	</update>
 </mapper>