Kaynağa Gözat

fix: 修正Eval入库分析中加分错误的问题

181250114 4 yıl önce
ebeveyn
işleme
6596c82ab8

+ 3 - 3
src/main/java/com/seecoder/dataanalysis/analysis/EvalDataAnalysisService.java

@@ -19,11 +19,11 @@ public interface EvalDataAnalysisService {
     CompetencyTree getTreeById(int userId);
 
     /**
-     * 学生提交试卷,根据考试结果分析KSD并入库
-     * @param exam_id 学生提交试卷的试卷id
+     * 学生提交试卷得到提交日志,根据考试结果分析KSD并入库
+     * @param recordId 学生提交试卷的试卷id
      * @return competency_tree 返回能力树
      */
-    CompetencyTree getTreeAfterExam(int exam_id);
+    CompetencyTree getTreeAfterExam(int recordId);
 
     /**
      * 根据学生id,获得学生的错题列表,用于推荐系统

+ 19 - 11
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -33,7 +33,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
 
     @Override
     public CompetencyTree getTreeById(int userId){
-        //TODO 和ModelTree进行合并,空值补0,返回可以用于可视化的结果
+
         Competencies competencies = new Competencies();
         CompetencyTree modelTree = new CompetencyTree(competencies);
 
@@ -99,15 +99,22 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
     }
 
     @Override
-    public CompetencyTree getTreeAfterExam(int exam_id){
+    public CompetencyTree getTreeAfterExam(int recordId){
         //TODO 测试检查
 
-        EvalExamRecord evalExamRecord = evalExamRecordDao.findById(exam_id).get();
-        EvalExamInfo evalExamInfo = evalExamInfoDao.findById(exam_id).get();
+        EvalExamRecord evalExamRecord = evalExamRecordDao.findById(recordId).get();
+
+        Optional<EvalExamInfo> result1 = evalExamInfoDao.findById(evalExamRecord.getExamId());
+        if(!result1.isPresent()){
+            System.out.println("考试信息不存在");
+            return null;
+        }
+
+        EvalExamInfo evalExamInfo = evalExamInfoDao.findById(evalExamRecord.getExamId()).get();
         CompetencyTree competencyTree;
 
-        Optional<CompetencyTree> result = competencyTreeDao.findById(evalExamRecord.getUserId());
-        if(!result.isPresent()){
+        Optional<CompetencyTree> result2 = competencyTreeDao.findById(evalExamRecord.getUserId());
+        if(!result2.isPresent()){
             competencyTree = new CompetencyTree(evalExamRecord.getUserId());
         }else {
             competencyTree  = competencyTreeDao.findById(evalExamRecord.getUserId()).get();
@@ -115,8 +122,10 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
 
         //数据取完,开始进行KSD分析和入库
         List<KSDScore> subTree = competencyTree.getSubCompetencyTree();
+        //难度由1-5,分别对应1.0, 1.25, 1.5, 1.75, 2.0的得分系数
         Integer difficulty = evalExamInfo.getDifficulty();
         String disposition = evalExamInfo.getDisposition();
+        System.out.println(competencyTree);
         Double tree_Score = competencyTree.getTreeScore();
         double[] difficulty_percent = new double[]{1.0,1.25,1.5,1.75,2.0};
         //得到学生所有题目的得分
@@ -128,9 +137,9 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
             Question question = questionDao.findById(questionId).get();
 
             //能力树中的加分 = 学生得分 * 试卷难度
-            Double addScore = difficulty_percent[difficulty] * studentScores.get(questionId);
-            //增加能力树总分
-            tree_Score += addScore;
+            Double addScore = difficulty_percent[difficulty-1] * studentScores.get(questionId);
+            //增加能力树总分,注意,每个competency都会加分
+            tree_Score += (addScore*question.getCompetencies().size());
 
             for(int i=0;i<question.getCompetencies().size();i++){
                 String competency = question.getCompetencies().get(i);
@@ -183,7 +192,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
                 }
                 List<Double> skills = changeKSScore.getSkillsAndScore();
                 for(int j=0;j<skills.size();j++){
-                    Double score = ksScoreMessage.getSkillsAndScore().get(j) * addScore + skills.get(i);
+                    Double score = ksScoreMessage.getSkillsAndScore().get(j) * addScore + skills.get(j);
                     skills.set(j,score);
                 }
                 changeKSScore.setSkillsAndScore(skills);
@@ -193,7 +202,6 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
                 }
 
 
-
                 //开始处理DScore,记录该品质是否存在
                 boolean existD = false;
                 List<DScore> subD = changeKSDScore.getDScore();

+ 6 - 0
src/main/java/com/seecoder/dataanalysis/logic/parser/impl/LogParsingServiceImpl.java

@@ -2,6 +2,7 @@ package com.seecoder.dataanalysis.logic.parser.impl;
 
 import com.alibaba.fastjson.JSONException;
 import com.seecoder.dataanalysis.analysis.DevcloudDataAnalysisService;
+import com.seecoder.dataanalysis.analysis.EvalDataAnalysisService;
 import com.seecoder.dataanalysis.data.dao.devcloud.DevcloudInfoDao;
 import com.seecoder.dataanalysis.data.dao.eval.EvalExamInfoDao;
 import com.seecoder.dataanalysis.data.dao.eval.EvalExamRecordDao;
@@ -32,6 +33,10 @@ public class LogParsingServiceImpl implements LogParsingService {
     @Autowired
     private DevcloudDataAnalysisService devcloudDataAnalysisService;
 
+    @Autowired
+    private EvalDataAnalysisService evalDataAnalysisService;
+
+
     /**
      * 根据日志元数据操作类型(op_type)查找对应的类名
      */
@@ -129,6 +134,7 @@ public class LogParsingServiceImpl implements LogParsingService {
         } else if (className.equals(EvalExamRecordDTO.class.getName())) {
             EvalExamRecord record = LogConvertor.convertToEvalExamRecordEntity((EvalExamRecordDTO) data);
             evalExamRecordDao.save(record);
+            evalDataAnalysisService.getTreeAfterExam(record.getRecordId());
 
         //Devcloud op_type100-111
         } else if (className.equals(BugInfoDTO.class.getName())) {

+ 122 - 13
src/test/java/com/seecoder/dataanalysis/eval/impl/EvalDataAnalysisServiceImplTest.java

@@ -1,44 +1,146 @@
 package com.seecoder.dataanalysis.eval.impl;
 
+import com.seecoder.dataanalysis.analysis.EvalDataAnalysisService;
 import com.seecoder.dataanalysis.data.dao.competency.CompetencyTreeDao;
+import com.seecoder.dataanalysis.data.dao.eval.EvalExamInfoDao;
 import com.seecoder.dataanalysis.data.dao.eval.EvalExamRecordDao;
-import com.seecoder.dataanalysis.data.entity.competency.CompetencyTree;
-import com.seecoder.dataanalysis.data.entity.competency.Competencies;
+import com.seecoder.dataanalysis.data.dao.eval.QuestionDao;
+import com.seecoder.dataanalysis.data.entity.competency.*;
+import com.seecoder.dataanalysis.data.entity.eval.EvalExamInfo;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
+import com.seecoder.dataanalysis.data.entity.eval.Question;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @SpringBootTest
 public class EvalDataAnalysisServiceImplTest {
 
     @Autowired
     CompetencyTreeDao competencyTreeDao;
-
     @Autowired
     EvalExamRecordDao evalExamRecordDao;
+    @Autowired
+    EvalExamInfoDao evalExamInfoDao;
+    @Autowired
+    QuestionDao questionDao;
+
+    @Autowired
+    EvalDataAnalysisService evalDataAnalysisService;
+
+    @Test
+    void addQuestion(){
+        Question question1 = new Question().setQuestionId("abc123").setQuestionScore(50.0);
+        List<String> com1 = new ArrayList<>();
+        List<KSScore> ksScoreList1 = new ArrayList<>();
+        Double[] skills1 = new Double[]{0.0,1.0,0.0,1.0,0.0,1.0};
+        Double[] skills2 = new Double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0};
+        com1.add("软件设计");
+        com1.add("软件构造");
+        com1.add("软件设计");
+        KSScore ksScore1 = new KSScore().setKnowledge("软件体系结构").setSkillsAndScore(Arrays.asList(skills1));
+        KSScore ksScore2 = new KSScore().setKnowledge("管理软件构造").setSkillsAndScore(Arrays.asList(skills1));
+        KSScore ksScore4 = new KSScore().setKnowledge("软件设计基础").setSkillsAndScore(Arrays.asList(skills2));
+        ksScoreList1.add(ksScore1);
+        ksScoreList1.add(ksScore2);
+        ksScoreList1.add(ksScore4);
+        question1.setCompetencies(com1).setKsScores(ksScoreList1);
+
+        Question question2 = new Question().setQuestionId("zxc111").setQuestionScore(30.0);
+        List<String> com2 = new ArrayList<>();
+        List<KSScore> ksScoreList2 = new ArrayList<>();
+        com2.add("软件维护");
+        KSScore ksScore3 = new KSScore().setKnowledge("软件维护基础").setSkillsAndScore(Arrays.asList(skills2));
+        ksScoreList2.add(ksScore3);
+        question2.setCompetencies(com2).setKsScores(ksScoreList2);
+
+        questionDao.save(question1);
+        questionDao.save(question2);
+    }
+
+    @Test
+    void addExamInfo(){
+        Question question1 = questionDao.findById("abc123").get();
+        Question question2 = questionDao.findById("zxc111").get();
+        Map<String,Double> questionAndScore = new HashMap<>();
+        questionAndScore.put(question1.getQuestionId(),question1.getQuestionScore());
+        questionAndScore.put(question2.getQuestionId(),question2.getQuestionScore());
+
+        EvalExamInfo evalExamInfo = new EvalExamInfo()
+                .setExamId(1)
+                .setExamScore(question1.getQuestionScore()+question2.getQuestionScore())
+                .setUpdateTime(new Date())
+                .setStartTime(new Date())
+                .setEndTime(new Date())
+                .setDifficulty(1)
+                .setDisposition("热情")
+                .setQuestionAndScore(questionAndScore);
+
+        evalExamInfoDao.save(evalExamInfo);
+    }
 
     @Test
     void addExamRecord(){
+        Question question1 = questionDao.findById("abc123").get();
+        Question question2 = questionDao.findById("zxc111").get();
         Map<String, Double> quesScore = new HashMap<>();
-        quesScore.put("1", 50.0);
-        quesScore.put("2", 50.0);
+        quesScore.put(question1.getQuestionId(),question1.getQuestionScore()-10.0);
+        quesScore.put(question2.getQuestionId(),question2.getQuestionScore()-10.0);
 
         EvalExamRecord evalExamRecord = new EvalExamRecord()
-                .setRecordId(2)
-                .setExamId(2)
-                .setScore(100.0)
+                .setRecordId(1)
+                .setExamId(1)
+                .setScore(quesScore.get(question1.getQuestionId())+quesScore.get(question2.getQuestionId()))
                 .setErrorQuestions(quesScore)
                 .setSubmitTime(new Date())
-                .setUserId(1);
+                .setUserId(2);
+
         evalExamRecordDao.save(evalExamRecord);
     }
 
+    @Test
+    void testGetTreeAfterExam(){
+        evalDataAnalysisService.getTreeAfterExam(1);
+    }
+
+    @Test
+    void addTree(){
+        List<KSScore> L1 = new ArrayList<>();
+        List<DScore> L2 = new ArrayList<>();
+        List<Double> L4 = new ArrayList<>();
+        for(int i=0;i<6;i++){
+            if(i%2==0){
+                L4.add(0.0);
+            }else {
+                L4.add(10.0);
+            }
+        }
+        KSScore ksScore = new KSScore()
+                .setKnowledge("软件体系结构")
+                .setSkillsAndScore(L4);
+        DScore dScore = new DScore()
+                .setName("细心")
+                .setScore(10.0);
+        L1.add(ksScore);
+        L2.add(dScore);
+        KSDScore ksdScore = new KSDScore()
+                .setCompetency("软件设计")
+                .setTotalScore(10.0)
+                .setDScore(L2)
+                .setKSScore(L1);
+        List<KSDScore> L3 = new ArrayList<>();
+        L3.add(ksdScore);
+
+        CompetencyTree competencyTree = new CompetencyTree()
+                .setUserId(2)
+                .setTreeScore(10.0)
+                .setSubCompetencyTree(L3);
+
+        competencyTreeDao.save(competencyTree);
+    }
+
     @Test
     void testModelTree(){
         Competencies competencies = new Competencies();
@@ -47,6 +149,13 @@ public class EvalDataAnalysisServiceImplTest {
         competencyTreeDao.save(model);
     }
 
+    @Test
+    void testGetTreeById(){
+        CompetencyTree model = evalDataAnalysisService.getTreeById(2);
+        model.setUserId(3);
+        competencyTreeDao.save(model);
+    }
+
     @Test
     void testFindByUserId(){
         List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(1);