Bläddra i källkod

feat: 新增根据recordDTO更新能力树的方法

181250114 4 år sedan
förälder
incheckning
28839ab911

+ 18 - 6
src/main/java/com/seecoder/dataanalysis/analysis/impl/DevcloudDataAnalysisServiceImpl.java

@@ -610,7 +610,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
             //遍历devInfo中的commit信息
             List<CommitInfo> commitInfos = devcloudInfo.getCommitList();
             for(CommitInfo commitInfo : commitInfos){
-                if(commitInfo.getUserId().equals(user_id)){
+                if(commitInfo.getUserId() == null) {
+                    continue;
+                }else if(commitInfo.getUserId().equals(user_id)){
                     commit_times++;
                     commit_msg_overview.add(commitInfo.getMessage());
                     //如果是需求的commit
@@ -630,7 +632,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
             //遍历devInfo中的test信息
             List<TestInfo> testInfos = devcloudInfo.getTestList();
             for(TestInfo testInfo : testInfos){
-                if(testInfo.getUserId().equals(user_id)){
+                if(testInfo.getUserId() == null) {
+                    continue;
+                }else if(testInfo.getUserId().equals(user_id)){
                     test_times++;
                     test_success += testInfo.getSuccess();
                     test_failure += testInfo.getFailure();
@@ -644,7 +648,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
                 //遍历每个流水线中的部署记录
                 List<RecordInfo> recordInfos = pipelineInfo.getRecordList();
                 for(RecordInfo recordInfo : recordInfos){
-                    if(recordInfo.getUserId().equals(user_id)){
+                    if(recordInfo.getUserId() == null) {
+                        continue;
+                    }else if(recordInfo.getUserId().equals(user_id)){
                         pipeline_deploy++;
                         if(recordInfo.getResult().equals("部署成功")){
                             pipeline_pass++;
@@ -735,7 +741,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
             for(CommitInfo commitInfo : commitInfos){
                 for(int j=0;j<userIds.size();j++){
                     Integer user_id = userIds.get(j);
-                    if(commitInfo.getUserId().equals(user_id)){
+                    if(commitInfo.getUserId() == null) {
+                        continue;
+                    }else if(commitInfo.getUserId().equals(user_id)){
                         commitTimes[j]++;
                         commit_msg_overview.add(commitInfo.getMessage());
                         //如果是需求的commit
@@ -759,7 +767,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
             for(TestInfo testInfo : testInfos){
                 for(int j=0;j<userIds.size();j++){
                     Integer user_id = userIds.get(j);
-                    if(testInfo.getUserId().equals(user_id)){
+                    if(testInfo.getUserId() == null) {
+                        continue;
+                    }else if(testInfo.getUserId().equals(user_id)){
                         testTimes[j]++;
                         test_success += testInfo.getSuccess();
                         test_failure += testInfo.getFailure();
@@ -776,7 +786,9 @@ public class DevcloudDataAnalysisServiceImpl implements DevcloudDataAnalysisServ
                 for(int j=0;j<userIds.size();j++){
                     Integer user_id = userIds.get(j);
                     for(RecordInfo recordInfo : recordInfos){
-                        if(recordInfo.getUserId().equals(user_id)){
+                        if(recordInfo.getUserId() == null) {
+                            continue;
+                        }else if(recordInfo.getUserId().equals(user_id)){
                             pipeline_deploy++;
                             pipeTimes[j]++;
                             if(recordInfo.getResult().equals("部署成功")){

+ 99 - 0
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -12,6 +12,8 @@ import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
 import com.seecoder.dataanalysis.data.entity.eval.Question;
 import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
+import com.seecoder.dataanalysis.vo.AnswerDTO;
+import com.seecoder.dataanalysis.vo.EvalExamRecordDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -108,6 +110,12 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         EvalExamInfo evalExamInfo = evalExamInfoDao.findById(evalExamRecord.getExamId()).get();
         CompetencyTree competencyTree;
 
+        //如果record中没有学生id信息
+        if(evalExamRecord.getUserId()==null){
+            System.out.println("找不到学生id");
+            return null;
+        }
+
         Optional<CompetencyTree> result2 = competencyTreeDao.findById(evalExamRecord.getUserId());
         if (!result2.isPresent()) {
             //若查找不到能力树就新建一棵
@@ -177,6 +185,97 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         return competencyTree;
     }
 
+    @Override
+    public CompetencyTree updateCompetencyTreeType2(EvalExamRecordDTO evalExamRecordDTO){
+
+        Optional<EvalExamInfo> result1 = evalExamInfoDao.findById(evalExamRecordDTO.getExamId());
+        if (!result1.isPresent()) {
+            System.out.println("考试信息不存在");
+            return null;
+        }
+
+        EvalExamInfo evalExamInfo = evalExamInfoDao.findById(evalExamRecordDTO.getExamId()).get();
+        CompetencyTree competencyTree;
+
+        //如果record中没有学生id信息
+        if(evalExamRecordDTO.getUserId()==null){
+            System.out.println("找不到学生id");
+            return null;
+        }
+
+        Optional<CompetencyTree> result2 = competencyTreeDao.findById(evalExamRecordDTO.getUserId());
+        if (!result2.isPresent()) {
+            //若查找不到能力树就新建一棵
+            competencyTree = new CompetencyTree(evalExamRecordDTO.getUserId());
+        } else {
+            competencyTree = competencyTreeDao.findById(evalExamRecordDTO.getUserId()).get();
+        }
+
+        //数据取完,开始进行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();
+        Double tree_Score = competencyTree.getTreeScore();
+        double[] difficulty_percent = new double[]{1.0, 1.25, 1.5, 1.75, 2.0};
+        //得到学生所有题目的得分
+        List<AnswerDTO> answers = evalExamRecordDTO.getErrorQuestions();
+        Map<String, Double> studentScores = new HashMap<>();
+        if (answers != null) {
+            for (AnswerDTO answer : answers) {
+                studentScores.put(answer.getQuestionId(), answer.getQuestionScore());
+            }
+        }
+        Map<String, Double> questionAndScore = evalExamInfo.getQuestionAndScore();
+        //修改成不初始化,而是逐条添加的模式,对每一题进行分析入库
+        for (Map.Entry<String, Double> entry : studentScores.entrySet()) {
+            String questionId = entry.getKey();
+            Question question = questionService.getQuestionByIdForAnalysis(questionId);
+            List<String> knowledgeList = question.getCompetencies();
+            Integer weight = question.getWeight();
+
+            //能力树中的加分 = 学生得分 * 试卷难度
+            Double addScore = difficulty_percent[difficulty - 1] * studentScores.get(questionId);
+            //增加能力树总分,注意,每个competency都会加分
+            tree_Score += (addScore * knowledgeList.size());
+
+            for(int i=0;i<knowledgeList.size();i++){
+                String[] coms = knowledgeList.get(i).split("\\.");
+                String com1 = coms[0];
+                dfs(subTree,disposition,weight,addScore,"",com1);
+                int index1 = 0;
+                if(coms.length > 1){
+                    String com2 = coms[1];
+                    for(;index1<subTree.size();index1++){
+                        if(subTree.get(index1).getCompetency().equals(com1)){
+                            break;
+                        }
+                    }
+                    dfs(subTree.get(index1).getChildren(),disposition,weight,addScore,com1+".",com2);
+                }
+                if(coms.length > 2){
+                    String com2 = coms[1];
+                    String com3 = coms[2];
+                    int index2 = 0;
+                    for(;index2<subTree.get(index1).getChildren().size();index2++){
+                        if(subTree.get(index1).getChildren().get(index2).getCompetency().split("\\.")[1].equals(com2)){
+                            break;
+                        }
+                    }
+                    dfs(subTree.get(index1).getChildren().get(index2).getChildren(),disposition,weight,addScore,com1+"."+com2+".",com3);
+                }
+            }
+
+        }
+
+        //处理完考试中的每个问题后,更新能力树
+        competencyTree.setTreeScore(tree_Score);
+        competencyTree.setSubCompetencyTree(subTree);
+        competencyTreeDao.save(competencyTree);
+
+        return competencyTree;
+    }
+
     void dfs(List<KSDScore> sub,String disposition,Integer weight,Double addScore,String pre,String com){
 //        System.out.println("start: "+com);
         boolean existCom = false;

+ 2 - 1
src/main/java/com/seecoder/dataanalysis/logic/parser/impl/LogParsingServiceImpl.java

@@ -135,8 +135,9 @@ public class LogParsingServiceImpl implements LogParsingService {
             //TODO DTO的id和实体id的匹配似乎出了问题?
             EvalExamRecord record = LogConvertor.convertToEvalExamRecordEntity((EvalExamRecordDTO) data);
             evalExamRecordDao.save(record);
+            evalDataAnalysisService.updateCompetencyTreeType2((EvalExamRecordDTO) data);
 //            evalDataAnalysisService.getTreeAfterExam(record.getRecordId());
-            evalDataAnalysisService.getTreeAfterExam(((EvalExamRecordDTO) data).getRecordId());
+//            evalDataAnalysisService.getTreeAfterExam(((EvalExamRecordDTO) data).getRecordId());
 
         //Devcloud op_type100-111
         } else if (className.equals(BugInfoDTO.class.getName())) {

+ 2 - 1
src/main/java/com/seecoder/dataanalysis/vo/EvalExamRecordDTO.java

@@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author miaomuzhi
@@ -33,7 +34,7 @@ public class EvalExamRecordDTO {
      * 用户Id
      */
     @JSONField(name="student_id")
-    private Integer studentId;
+    private Integer userId;
 
     /**
      * 提交时间

+ 30 - 30
src/test/java/com/seecoder/dataanalysis/devcloud/impl/DevcloudDataAnalysisServiceImplTest.java

@@ -20,22 +20,22 @@ import org.springframework.data.mongodb.core.aggregation.ArithmeticOperators;
 import java.util.ArrayList;
 import java.util.List;
 
-enum CommitRelatedEnum {
-    @JsonProperty("tree_id")
-    TREE_ID("tree_id"),
-    @JsonProperty("bug_id")
-    BUG_ID("bug_id");
-
-    private final String value;
-    CommitRelatedEnum(String value) {
-        this.value = value;
-    }
-
-    @Override
-    public String toString(){
-        return value;
-    }
-}
+//enum CommitRelatedEnum {
+//    @JsonProperty("tree_id")
+//    TREE_ID("tree_id"),
+//    @JsonProperty("bug_id")
+//    BUG_ID("bug_id");
+//
+//    private final String value;
+//    CommitRelatedEnum(String value) {
+//        this.value = value;
+//    }
+//
+//    @Override
+//    public String toString(){
+//        return value;
+//    }
+//}
 
 @SpringBootTest
 public class DevcloudDataAnalysisServiceImplTest {
@@ -48,19 +48,19 @@ public class DevcloudDataAnalysisServiceImplTest {
     @Autowired
     private DevcloudController devcloudController;
 
-    @Test
-    void testEnum(){
-        //ANA 日志需要打出新建的bugInfo信息
-        try{
-            JSONObject object = new JSONObject();
-            object.put("1",CommitRelatedEnum.BUG_ID);
-            object.put("2",CommitRelatedEnum.BUG_ID.toString());
-
-            String data = com.alibaba.fastjson.JSONObject.toJSONString(object);
-            System.out.println(data);
-            System.out.println(data.length());
-        }catch (Exception e){}
-    }
+//    @Test
+//    void testEnum(){
+//        //ANA 日志需要打出新建的bugInfo信息
+//        try{
+//            JSONObject object = new JSONObject();
+//            object.put("1",CommitRelatedEnum.BUG_ID);
+//            object.put("2",CommitRelatedEnum.BUG_ID.toString());
+//
+//            String data = com.alibaba.fastjson.JSONObject.toJSONString(object);
+//            System.out.println(data);
+//            System.out.println(data.length());
+//        }catch (Exception e){}
+//    }
 
     @Test
     void saveDevInfo(){
@@ -264,7 +264,7 @@ public class DevcloudDataAnalysisServiceImplTest {
     void testStudent(){
 //        FormatStudent formatStudent = devcloudDataAnalysisService.getStudentAnalysis(4);
 //        FormatStudent formatStudent1 = devcloudDataAnalysisService.getStudentAnalysis(3);
-        FormatStudent formatStudent = (FormatStudent) devcloudController.getStudentAnalysis(4).getContent();
+        FormatStudent formatStudent = (FormatStudent) devcloudController.getStudentAnalysis(1042).getContent();
 
         formatStudent.display();
 //        formatStudent1.display();

+ 45 - 3
src/test/java/com/seecoder/dataanalysis/eval/impl/EvalDataAnalysisServiceImplTest.java

@@ -16,6 +16,7 @@ import com.seecoder.dataanalysis.data.entity.eval.User;
 import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 import com.seecoder.dataanalysis.logic.parser.LogParsingService;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
+import com.seecoder.dataanalysis.vo.AnswerDTO;
 import com.seecoder.dataanalysis.vo.EvalExamRecordDTO;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -313,9 +314,9 @@ public class EvalDataAnalysisServiceImplTest {
     void testGetTreeById(){
 //        CompetencyTree model = evalDataAnalysisService.getTreeById(2);
         CompetencyTree model = (CompetencyTree)evalController.getTreeById(2).getContent();
-        model.setUserId(10);
-        competencyTreeDao.save(model);
-        System.out.println(model);
+//        model.setUserId(10);
+//        competencyTreeDao.save(model);
+//        System.out.println(model);
     }
 
     @Test
@@ -324,6 +325,47 @@ public class EvalDataAnalysisServiceImplTest {
 //        evalController.getTreeAfterExam(1);
     }
 
+    @Test
+    void testType2(){
+        Question question1 = questionService.getQuestionByIdForAnalysis("43604f6f-f829-4aaf-ab97-47b99c20ede0");
+        Question question2 = questionService.getQuestionByIdForAnalysis("b39005ff-23c0-43a2-8174-f370f774eea8");
+        Question question3 = questionService.getQuestionByIdForAnalysis("77f7aa6b-7c4f-4695-b721-a8a1b378dc47");
+        Question question4 = questionService.getQuestionByIdForAnalysis("63dfd56a-ca9f-40c1-87d2-f30375fd636e");
+        Question question5 = questionService.getQuestionByIdForAnalysis("44de50e1-a7c0-414b-8d77-f8775f67624d");
+
+        List<AnswerDTO> answerDTOS = new ArrayList<>();
+        AnswerDTO answerDTO1 = new AnswerDTO();
+        answerDTO1.setQuestionId(question1.getQuestionId());
+        answerDTO1.setQuestionScore(0.0);
+        answerDTOS.add(answerDTO1);
+        AnswerDTO answerDTO2 = new AnswerDTO();
+        answerDTO2.setQuestionId(question2.getQuestionId());
+        answerDTO2.setQuestionScore(10.0);
+        answerDTOS.add(answerDTO2);
+        AnswerDTO answerDTO3 = new AnswerDTO();
+        answerDTO3.setQuestionId(question3.getQuestionId());
+        answerDTO3.setQuestionScore(20.0);
+        answerDTOS.add(answerDTO3);
+        AnswerDTO answerDTO4 = new AnswerDTO();
+        answerDTO4.setQuestionId(question4.getQuestionId());
+        answerDTO4.setQuestionScore(5.0);
+        answerDTOS.add(answerDTO4);
+        AnswerDTO answerDTO5 = new AnswerDTO();
+        answerDTO5.setQuestionId(question5.getQuestionId());
+        answerDTO5.setQuestionScore(20.0);
+        answerDTOS.add(answerDTO5);
+
+        EvalExamRecordDTO evalExamRecordDTO = new EvalExamRecordDTO();
+        evalExamRecordDTO.setRecordId(1);
+        evalExamRecordDTO.setExamId(1);
+        evalExamRecordDTO.setScore(55.0);
+        evalExamRecordDTO.setErrorQuestions(answerDTOS);
+        evalExamRecordDTO.setSubmitTime(new Date());
+        evalExamRecordDTO.setUserId(2);
+
+        evalDataAnalysisService.updateCompetencyTreeType2(evalExamRecordDTO);
+    }
+
     @Test
     void testGetStudentErrorQuestions(){
 //        Map<String,Double> res = evalDataAnalysisService.getStudentErrorQuestions(2);