Преглед изворни кода

基本完成报告上半部分接口,还未测试,paperResult实体内sectionInfo字段还未生成

4228306 пре 6 година
родитељ
комит
cdbbe76438

+ 8 - 0
src/main/java/edu/math/diagnosis/controller/PaperResultController.java

@@ -32,4 +32,12 @@ public class PaperResultController {
         paperResultService.checkAndDelete(paper.getId(), commit.getUid());
         return paperResultService.parseResult(commit, paper);
     }
+
+    @GetMapping("/rebuildByUid")
+    public Result rebuild(Long pid, Long uid) {
+        PaperCommit commit = paperCommitRepo.findByPidAndUid(pid, uid);
+        Paper paper = paperService.getOnePaper(commit.getPid());
+        paperResultService.checkAndDelete(paper.getId(), commit.getUid());
+        return paperResultService.parseResult(commit, paper);
+    }
 }

+ 24 - 9
src/main/java/edu/math/diagnosis/controller/ReportController.java

@@ -11,6 +11,8 @@ import edu.math.diagnosis.service.UserService;
 import edu.math.diagnosis.util.CommonUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -34,20 +36,22 @@ public class ReportController {
     @Resource
     private SubjectService subjectService;
 
+    private static final Logger logger = LoggerFactory.getLogger(ReportController.class);
+
     @GetMapping("generate")
     public Result generateAll() {
         return Result.fail("not implements");
     }
 
     @GetMapping("generateKnowledge")
-    public Result generateKnowledge(Long uid, Long pid) {
+    public Result generateKnowledge(Long pid, Long uid) {
 
         return Result.fail("not implements");
     }
 
     @GetMapping("userInfo")
     @ApiOperation("获取报告中用户的个人信息")
-    public Result userInfo(Long uid, Long pid) {
+    public Result userInfo(Long pid, Long uid) {
         UserInfo info = userService.getSimpleUser(uid);
         if (info == null) {
             return Result.fail("未找到用户");
@@ -56,11 +60,11 @@ public class ReportController {
         if (paper == null) {
             return Result.fail("未找到试卷");
         }
-        List<PaperResult> paperResults = paperResultService.findByPidAndUid(pid, uid);
-        if (CommonUtil.isEmpty(paperResults)) {
-            return Result.fail("未找到提交的试卷结果");
+        PaperResult paperResult = paperResultService.findByPidAndUid(pid, uid);
+        if (paperResult == null) {
+            logger.info("正在生成结果");
+            paperResult = (PaperResult) paperResultService.parseResult(pid, uid).getT();
         }
-        PaperResult paperResult = paperResults.get(0);
         Map<String, Object> result = new HashMap<>();
         result.put("name", info.getName());
         result.put("grade", paper.getGrade());
@@ -72,18 +76,29 @@ public class ReportController {
 
     }
 
-//    private Result check()
-
     @GetMapping("globalResult")
     @ApiOperation("诊断结果")
     public Result<PaperResult> globalResult(Long paperResultId) {
         Map<String, Object> result = new HashMap<>();
         PaperResult paperResult = paperResultService.get(paperResultId);
         if (paperResult == null) {
-            return new Result<>(false, "");
+            logger.error("未找到诊断结果,paperResultId is {}", paperResultId);
+            return new Result<>(false, "未找到诊断结果");
         }
         paperResultService.globalResult(paperResult);
         return new Result<>(true, "", paperResult);
     }
 
+    @GetMapping("usedTime")
+    @ApiOperation("获取作答时间及平均作答时间")
+    public Result usedTime(Long paperResultId) {
+        PaperResult paperResult = paperResultService.get(paperResultId);
+        if (paperResult == null) {
+            return new Result<>(false, "未找到诊断结果");
+        }
+
+        return Result.ok(paperResultService.avgUseTime(paperResult));
+    }
+
+
 }

+ 2 - 2
src/main/java/edu/math/diagnosis/dao/PaperResultRepo.java

@@ -4,7 +4,6 @@ import edu.math.diagnosis.entity.PaperResult;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
-import java.util.List;
 
 /**
  * @AUTHOR: DaiFengWen
@@ -14,9 +13,10 @@ import java.util.List;
 @Repository
 public interface PaperResultRepo extends JpaRepository<PaperResult, Long> {
 
-    List<PaperResult> findByPidAndUid(Long pid, Long uid);
+    PaperResult findByPidAndUid(Long pid, Long uid);
 
     boolean deleteByPidAndUid(Long pid, Long uid);
 
     boolean existsByPidAndUid(Long pid, Long uid);
+
 }

+ 22 - 0
src/main/java/edu/math/diagnosis/entity/PaperResult.java

@@ -86,6 +86,20 @@ public class PaperResult {
     @ApiModelProperty("各章节掌握率 {\"预备章节\":0,\"第一章\":88.88}")
     private String chapterRate;
 
+    /**
+     * {
+     *  "第一章":[{
+     *    "chapter":"1",
+     *    "number":1,
+     *    "knowledgeName":"⼩学⽔平计算",
+     *    "matter":"计算出错,学习动力问题"
+     *  }]
+     * }
+     */
+    @Lob
+    @ApiModelProperty("各章节掌握情况及指向问题表格,{\"第一章\":[{ \"chapter\":\"1\", \"number\":1, \"knowledgeName\":\"⼩学⽔平计算\", \"matter\":\"计算出错,学习动力问题\"}]}")
+    private String knowledgeKeepStatus;
+
     /**
      * 各题目答题时间
      * [50,20]
@@ -226,6 +240,14 @@ public class PaperResult {
         this.chapterRate = chapterRate;
     }
 
+    public String getKnowledgeKeepStatus() {
+        return knowledgeKeepStatus;
+    }
+
+    public void setKnowledgeKeepStatus(String knowledgeKeepStatus) {
+        this.knowledgeKeepStatus = knowledgeKeepStatus;
+    }
+
     public String getUseTime() {
         return useTime;
     }

+ 0 - 38
src/main/java/edu/math/diagnosis/model/AbilityScoreListVo.java

@@ -1,38 +0,0 @@
-package edu.math.diagnosis.model;
-
-import java.util.List;
-
-public class AbilityScoreListVo {
-
-    private List<AbilityScoreVo> list;
-
-    public List<AbilityScoreVo> getList() {
-        return list;
-    }
-
-    public void setList(List<AbilityScoreVo> list) {
-        this.list = list;
-    }
-
-    public static class AbilityScoreVo {
-
-        private String code;
-        private Double score;
-
-        public String getCode() {
-            return code;
-        }
-
-        public void setCode(String code) {
-            this.code = code;
-        }
-
-        public Double getScore() {
-            return score;
-        }
-
-        public void setScore(Double score) {
-            this.score = score;
-        }
-    }
-}

+ 48 - 0
src/main/java/edu/math/diagnosis/model/SectionInfoVo.java

@@ -0,0 +1,48 @@
+package edu.math.diagnosis.model;
+
+public class SectionInfoVo {
+
+    private String section;
+    private String info;
+    private String useTime;
+    private Double score;
+
+    public SectionInfoVo(String section, String info, String useTime, Double score) {
+        this.section = section;
+        this.info = info;
+        this.useTime = useTime;
+        this.score = score;
+    }
+
+    public String getSection() {
+        return section;
+    }
+
+    public void setSection(String section) {
+        this.section = section;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public void setInfo(String info) {
+        this.info = info;
+    }
+
+    public String getUseTime() {
+        return useTime;
+    }
+
+    public void setUseTime(String useTime) {
+        this.useTime = useTime;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+}

+ 32 - 4
src/main/java/edu/math/diagnosis/service/CommitService.java

@@ -10,6 +10,7 @@ import edu.math.diagnosis.model.QuestionDetail;
 import edu.math.diagnosis.model.Result;
 import edu.math.diagnosis.util.CodeUtil;
 import edu.math.diagnosis.util.CommonUtil;
+import edu.math.diagnosis.util.NumberUtil;
 import edu.math.diagnosis.util.ObjectUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -120,7 +121,7 @@ public class CommitService {
         }
         List<Answer> answers = paperCommit.getAnswers();
         if (CommonUtil.isEmpty(answers)) {
-            return Result.fail("没有找到答案");
+            return Result.fail("没有填写答案");
         }
         answers.forEach(a -> {
             if (a.getUseTime() == null) {
@@ -136,6 +137,7 @@ public class CommitService {
         paperCommitRepo.save(paperCommit);
         logger.info("uid={},name={},pid={} commit paper success", paperCommit.getUid(), paperCommit.getName(), paperCommit.getPid());
         try {
+            updateAvgCommitTime(paper.getId());
             return paperResultService.parseResult(paperCommit, paper);
         } catch (Exception e) {
             logger.error("考试结果解析失败");
@@ -144,10 +146,36 @@ public class CommitService {
         return Result.fail("考试结果解析失败");
     }
 
-    private boolean updateAvgCommitTime(Long pid,List<Answer> answers){
+    private boolean updateAvgCommitTime(Long pid) {
+        Paper paper = paperService.getSimplePaper(pid);
+        Map<Integer, Double> sum = new LinkedHashMap<>();
+        Map<Integer, Double> avg = new LinkedHashMap<>();
+        for (int i = 1; i <= paper.getQuestionNum(); i++) {
+            sum.put(i, 0d);
+            avg.put(i, 0d);
+        }
+
         PaperCount count = paperCountService.findByPid(pid);
-        //TODO updateAvgCommitTime
-        return false;
+        List<PaperCommit> commits = paperCommitRepo.findByPid(pid);
+        //把每人的成绩累加起来计算
+        //如果数据量比较大,可能需要改成直接将总时间存储到PaperCount
+        for (PaperCommit commit : commits) {
+            String jsonAns = commit.getJsonAns();
+            commit.setAnswers(ObjectUtil.json2List(jsonAns));
+            //累加
+            for (Answer answer : commit.getAnswers()) {
+//                sum.compute(answer.getNumber(),c-> Double.valueOf(c+1));
+                sum.put(answer.getNumber(), sum.get(answer.getNumber()) + answer.getUseTime());
+            }
+        }
+
+        for (Map.Entry<Integer, Double> entry : sum.entrySet()) {
+            double a = commits.size() == 0 ? 0 : NumberUtil.format(sum.get(entry.getKey()) / commits.size());
+            avg.put(entry.getKey(), a);
+        }
+
+        count.setKnowledgeAvgRate(ObjectUtil.object2Json(avg));
+        return paperCountService.add(count) != null;
     }
 
 

+ 7 - 2
src/main/java/edu/math/diagnosis/service/PaperCountService.java

@@ -1,6 +1,7 @@
 package edu.math.diagnosis.service;
 
 import edu.math.diagnosis.dao.PaperCountRepo;
+import edu.math.diagnosis.entity.Paper;
 import edu.math.diagnosis.entity.PaperCount;
 import org.springframework.stereotype.Service;
 
@@ -12,7 +13,11 @@ public class PaperCountService {
     @Resource
     private PaperCountRepo paperCountRepo;
 
-     public PaperCount findByPid(Long pid){
+    public PaperCount findByPid(Long pid) {
         return paperCountRepo.findByPid(pid);
-     }
+    }
+
+    public PaperCount add(PaperCount paperCount) {
+        return paperCountRepo.save(paperCount);
+    }
 }

+ 47 - 4
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -7,6 +7,7 @@ import edu.math.diagnosis.entity.*;
 import edu.math.diagnosis.model.Answer;
 import edu.math.diagnosis.model.KnowledgeKeepVo;
 import edu.math.diagnosis.model.Result;
+import edu.math.diagnosis.model.SectionInfoVo;
 import edu.math.diagnosis.util.NumberUtil;
 import edu.math.diagnosis.util.ObjectUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -40,9 +41,17 @@ public class PaperResultService {
     private ChapterService chapterService;
     @Resource
     private MatterService matterService;
+    @Resource
+    private PaperCountService paperCountService;
 
     private static final Logger logger = LoggerFactory.getLogger(PaperResultService.class);
 
+    public Result parseResult(Long pid, Long uid) {
+        PaperCommit commit = paperCommitRepo.findByPidAndUid(pid, uid);
+        Paper paper = paperService.getOnePaper(pid);
+        return parseResult(commit, paper);
+    }
+
     @SuppressWarnings("unchecked")
     public Result parseResult(PaperCommit paperCommit, Paper paper) {
         List<Question> questions = paper.getQuestions();
@@ -105,7 +114,7 @@ public class PaperResultService {
         return paperResultRepo.getOne(resultId);
     }
 
-    public List<PaperResult> findByPidAndUid(Long pid, Long uid) {
+    public PaperResult findByPidAndUid(Long pid, Long uid) {
         return paperResultRepo.findByPidAndUid(pid, uid);
     }
 
@@ -126,7 +135,12 @@ public class PaperResultService {
         //知识点掌握率
         r.setKnowledgeRate(knowledgeRate(r, paper));
         r.setAbilityScore(abilityScore(r, paper));
-
+        r.setKnowledgeAcceptanceLevel(knowledgeAcceptanceLevel(r, paper));
+        r.setChapterRate(chapterRate(r, paper));
+        r.setKnowledgeKeepStatus(ObjectUtil.object2Json(knowledgeKeepStatus(r, paper)));
+        r.setUseTime(useTime(paper, commit));
+        r.setSectionInfo(sectionInfo(r, paper));
+        paperResultRepo.save(r);
     }
 
     /**
@@ -235,7 +249,7 @@ public class PaperResultService {
      * @param paper  试卷
      * @return [[1, 2, 0], [0, 0, 1]]
      */
-    public String keepStatus(PaperResult result, Paper paper) {
+    public String knowledgeAcceptanceLevel(PaperResult result, Paper paper) {
         List<List<Integer>> keepStatus = new ArrayList<>();
         Long subjectId = paper.getSubjectId();
         String grade = paper.getGrade();
@@ -260,7 +274,7 @@ public class PaperResultService {
         return ObjectUtil.object2Json(keepStatus);
     }
 
-    public String chapterKeepRate(PaperResult result, Paper paper) {
+    public String chapterRate(PaperResult result, Paper paper) {
         //Map<chapter,rate> 章节掌握率
         Map<String, Double> chapterKeepRate = new LinkedHashMap<>();
 
@@ -368,4 +382,33 @@ public class PaperResultService {
         return tagKeep;
     }
 
+    public String useTime(Paper paper, PaperCommit commit) {
+        Map<Integer, Long> useTime = new LinkedHashMap<>();
+        for (int i = 1; i <= paper.getQuestionNum(); i++) {
+            useTime.put(i, 0L);
+        }
+        List<Answer> answers = commit.getAnswers();
+        Map<Integer, Long> use = answers.stream().collect(Collectors.toMap(Answer::getNumber, Answer::getUseTime));
+        for (Map.Entry<Integer, Long> entry : use.entrySet()) {
+            useTime.put(entry.getKey(), entry.getValue());
+        }
+        return ObjectUtil.object2Json(useTime);
+    }
+
+    public String avgUseTime(PaperResult paperResult) {
+        PaperCount count = paperCountService.findByPid(paperResult.getPid());
+        return count.getUseTimeAgvRate();
+    }
+
+    public String sectionInfo(PaperResult result, Paper paper) {
+        //TODO 按模块输出答题情况
+        SectionInfoVo vo1 = new SectionInfoVo("模块一", "43/50", "23:00/30:00", 35d);
+        SectionInfoVo vo2 = new SectionInfoVo("模块二", "8/10", "21:00/30:00", 28d);
+        SectionInfoVo vo3 = new SectionInfoVo("模块三", "5/10", "18:00/30:00", 22d);
+        List<SectionInfoVo> list = new ArrayList<>();
+        list.add(vo1);
+        list.add(vo2);
+        list.add(vo3);
+        return ObjectUtil.object2Json(list);
+    }
 }

+ 5 - 1
src/main/java/edu/math/diagnosis/service/PaperService.java

@@ -113,7 +113,7 @@ public class PaperService {
         //一次查出该试卷所有的选项
         List<QuestionOption> options = optionRepo.findByIdIn(qids);
         //然后根据Id进行分组
-        Map<Long,List<QuestionOption>> group = options.stream().collect(Collectors.groupingBy(QuestionOption::getQid));
+        Map<Long, List<QuestionOption>> group = options.stream().collect(Collectors.groupingBy(QuestionOption::getQid));
         for (Question question : questions) {
 //            List<QuestionOption> options = optionRepo.findByQid(question.getId());
 //            for (QuestionOption option : options) {
@@ -409,4 +409,8 @@ public class PaperService {
         return section;
     }
 
+    public Paper getSimplePaper(Long id) {
+        return paperRepo.getOne(id);
+    }
+
 }

+ 5 - 5
src/main/java/edu/math/diagnosis/util/ObjectUtil.java

@@ -22,11 +22,11 @@ public class ObjectUtil {
         return gson.toJson(o);
     }
 
-    public static Object json2Object(String json) {
-        Type type = new TypeToken<HashMap<Long, List<Long>>>() {
-        }.getType();
-        return gson.fromJson(json, type);
-    }
+//    public static Object json2Object(String json) {
+//        Type type = new TypeToken<HashMap<Long, List<Long>>>() {
+//        }.getType();
+//        return gson.fromJson(json, type);
+//    }
 
     public static <T> Map<String, T> json2Map(String json) {
         Type type = new TypeToken<HashMap<String, T>>() {