فهرست منبع

修复报告管理useTime和userInfo接口

4228306 6 سال پیش
والد
کامیت
14aafe4db9

+ 4 - 1
src/main/java/edu/math/diagnosis/controller/PaperResultController.java

@@ -7,6 +7,7 @@ import edu.math.diagnosis.model.Result;
 import edu.math.diagnosis.service.PaperResultService;
 import edu.math.diagnosis.service.PaperService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -26,6 +27,7 @@ public class PaperResultController {
     private PaperService paperService;
 
     @GetMapping("/rebuild")
+    @ApiOperation("根据提交Id重新生成报告结果")
     public Result rebuild(Long commitId) {
         PaperCommit commit = paperCommitRepo.getOne(commitId);
         Paper paper = paperService.getOnePaper(commit.getPid());
@@ -33,7 +35,8 @@ public class PaperResultController {
         return paperResultService.parseResult(commit, paper);
     }
 
-    @GetMapping("/rebuildByUid")
+    @GetMapping("/rebuildByPidAndUid")
+    @ApiOperation("重新生成报告结果,方便测试")
     public Result rebuild(Long pid, Long uid) {
         PaperCommit commit = paperCommitRepo.findByPidAndUid(pid, uid);
         Paper paper = paperService.getOnePaper(commit.getPid());

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

@@ -22,7 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-@Api(tags = "报告")
+@Api(tags = "报告管理")
 @RestController
 @RequestMapping("/report")
 public class ReportController {
@@ -50,7 +50,7 @@ public class ReportController {
     }
 
     @GetMapping("userInfo")
-    @ApiOperation("获取报告中用户的个人信息")
+    @ApiOperation("获取报告中用户的个人信息,paperResultId为报告结果Id")
     public Result userInfo(Long pid, Long uid) {
         UserInfo info = userService.getSimpleUser(uid);
         if (info == null) {
@@ -68,7 +68,7 @@ public class ReportController {
         Map<String, Object> result = new HashMap<>();
         result.put("name", info.getName());
         result.put("grade", paper.getGrade());
-        result.put("subject", subjectService.get(paper.getSubjectId()));
+        result.put("subject", subjectService.get(paper.getSubjectId()).getName());
         result.put("diagnosisTime", paperResult.getCreatetime());
         result.put("code", paperResult.getCode());
         result.put("paperResultId", paperResult.getId());
@@ -89,16 +89,18 @@ public class ReportController {
         return new Result<>(true, "", paperResult);
     }
 
-    @GetMapping("usedTime")
+    @GetMapping("useTime")
     @ApiOperation("获取作答时间及平均作答时间")
-    public Result usedTime(Long paperResultId) {
-        PaperResult paperResult = paperResultService.get(paperResultId);
+    public Result useTime(Long pid, Long uid) {
+        PaperResult paperResult = paperResultService.findByPidAndUid(pid, uid);
         if (paperResult == null) {
             return new Result<>(false, "未找到诊断结果");
         }
-
-        return Result.ok(paperResultService.avgUseTime(paperResult));
+        Paper paper = paperService.getOnePaper(pid);
+        if (paper == null) {
+            return Result.fail("未找到试卷");
+        }
+        return Result.ok(paperResultService.avgUseTime(paper));
     }
 
-
 }

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

@@ -15,7 +15,7 @@ public interface PaperResultRepo extends JpaRepository<PaperResult, Long> {
 
     PaperResult findByPidAndUid(Long pid, Long uid);
 
-    boolean deleteByPidAndUid(Long pid, Long uid);
+    int deleteByPidAndUid(Long pid, Long uid);
 
     boolean existsByPidAndUid(Long pid, Long uid);
 

+ 0 - 87
src/main/java/edu/math/diagnosis/entity/Commit.java

@@ -1,87 +0,0 @@
-package edu.math.diagnosis.entity;
-
-import io.swagger.annotations.ApiModel;
-import org.hibernate.annotations.CreationTimestamp;
-
-import javax.persistence.*;
-import java.util.Date;
-
-@Entity
-@ApiModel("答案提交")
-@Table(name = "commit", indexes = @Index(name = "IDX_UID_PID", columnList = "uid,pid"))
-public class Commit {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-    @Column(nullable = false)
-    private Long uid;
-    @Column(nullable = false)
-    private Long pid;
-
-    @Lob
-    @Column(nullable = false)
-    private String data;
-    @CreationTimestamp
-    @Column(nullable = false)
-    private Date createtime;
-    @Column(nullable = false, columnDefinition = "double(10,2) default 0")
-    private Double score;
-    @Transient
-    private Paper paper;
-
-    public long getPid() {
-        return pid;
-    }
-
-    public void setPid(long pid) {
-        this.pid = pid;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public long getUid() {
-        return uid;
-    }
-
-    public void setUid(long uid) {
-        this.uid = uid;
-    }
-
-    public String getData() {
-        return data;
-    }
-
-    public void setData(String data) {
-        this.data = data;
-    }
-
-    public Paper getPaper() {
-        return paper;
-    }
-
-    public void setPaper(Paper paper) {
-        this.paper = paper;
-    }
-
-    public Date getCreatetime() {
-        return createtime;
-    }
-
-    public void setCreatetime(Date createtime) {
-        this.createtime = createtime;
-    }
-
-    public double getScore() {
-        return score;
-    }
-
-    public void setScore(double score) {
-        this.score = score;
-    }
-}

+ 3 - 3
src/main/java/edu/math/diagnosis/entity/PaperCommit.java

@@ -32,9 +32,6 @@ public class PaperCommit {
     @ApiModelProperty("用户姓名")
     private String name;
 
-    @Lob
-    @Column(nullable = false)
-    @ApiModelProperty("答案json化")
     /**
      * [{
      *     "useTime":1,
@@ -43,6 +40,9 @@ public class PaperCommit {
      *     "answer":"AB"
      * }]
      */
+    @Lob
+    @Column(nullable = false)
+    @ApiModelProperty("答案json化")
     private String jsonAns;
 
     @CreationTimestamp

+ 27 - 0
src/main/java/edu/math/diagnosis/entity/PaperCount.java

@@ -2,8 +2,11 @@ package edu.math.diagnosis.entity;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
 
 import javax.persistence.*;
+import java.util.Date;
 
 @Entity
 @ApiModel("试卷提交统计信息")
@@ -33,6 +36,14 @@ public class PaperCount {
     @ApiModelProperty("各章节知识点平均掌握率 {\"预备章节\":88.88}")
     private String knowledgeAvgRate;
 
+    @CreationTimestamp
+    @Column(nullable = false)
+    private Date createtime;
+
+    @UpdateTimestamp
+    @Column(nullable = false)
+    private Date updatetime;
+
     public Long getId() {
         return id;
     }
@@ -64,4 +75,20 @@ public class PaperCount {
     public void setUseTimeAgvRate(String useTimeAgvRate) {
         this.useTimeAgvRate = useTimeAgvRate;
     }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public Date getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(Date updatetime) {
+        this.updatetime = updatetime;
+    }
 }

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

@@ -137,7 +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());
+            paperCountService.updateAvgCommitTime(paper);
             return paperResultService.parseResult(paperCommit, paper);
         } catch (Exception e) {
             logger.error("考试结果解析失败");
@@ -146,37 +146,6 @@ public class CommitService {
         return Result.fail("考试结果解析失败");
     }
 
-    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);
-        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;
-    }
 
 
     public List<PaperCommit> listPaperCommit(Long pid, String name, Long startTime, Long endTime) {

+ 53 - 0
src/main/java/edu/math/diagnosis/service/PaperCountService.java

@@ -1,17 +1,30 @@
 package edu.math.diagnosis.service;
 
+import com.google.common.reflect.TypeToken;
+import edu.math.diagnosis.dao.PaperCommitRepo;
 import edu.math.diagnosis.dao.PaperCountRepo;
 import edu.math.diagnosis.entity.Paper;
+import edu.math.diagnosis.entity.PaperCommit;
 import edu.math.diagnosis.entity.PaperCount;
+import edu.math.diagnosis.model.Answer;
+import edu.math.diagnosis.util.NumberUtil;
+import edu.math.diagnosis.util.ObjectUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 @Service
 public class PaperCountService {
 
     @Resource
     private PaperCountRepo paperCountRepo;
+    //防止循环依赖
+    @Resource
+    private PaperCommitRepo paperCommitRepo;
 
     public PaperCount findByPid(Long pid) {
         return paperCountRepo.findByPid(pid);
@@ -20,4 +33,44 @@ public class PaperCountService {
     public PaperCount add(PaperCount paperCount) {
         return paperCountRepo.save(paperCount);
     }
+
+
+    @Transactional
+     public boolean updateAvgCommitTime(Paper paper) {
+        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 = findByPid(paper.getId());
+        if(count == null){
+            count = new PaperCount();
+            count.setPid(paper.getId());
+        }
+        List<PaperCommit> commits = paperCommitRepo.findByPid(paper.getId());
+        //把每人的成绩累加起来计算
+        //如果数据量比较大,可能需要改成直接将总时间存储到PaperCount
+        for (PaperCommit commit : commits) {
+            List<Answer> answers = ObjectUtil.getGson().fromJson(commit.getJsonAns(), new TypeToken<List<Answer>>() {
+            }.getType());
+            commit.setAnswers(answers);
+            //累加
+            for (Answer answer : answers) {
+//                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.setUseTimeAgvRate(ObjectUtil.object2Json(avg));
+        return add(count) != null;
+    }
+
+
 }

+ 10 - 5
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -1,5 +1,6 @@
 package edu.math.diagnosis.service;
 
+import com.google.common.reflect.TypeToken;
 import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.dao.PaperCommitRepo;
 import edu.math.diagnosis.dao.PaperResultRepo;
@@ -55,7 +56,8 @@ public class PaperResultService {
     @SuppressWarnings("unchecked")
     public Result parseResult(PaperCommit paperCommit, Paper paper) {
         List<Question> questions = paper.getQuestions();
-        List<Answer> answers = paperCommit.getAnswers();
+        List<Answer> answers = ObjectUtil.getGson().fromJson(paperCommit.getJsonAns(), new TypeToken<List<Answer>>() {
+        }.getType());
         List<Integer> collectQuestion = new ArrayList<>();
         PaperResult result = new PaperResult();
         result.setPid(paperCommit.getPid());
@@ -81,7 +83,7 @@ public class PaperResultService {
             if (a == null || StringUtils.isBlank(a.getOptions())) {
                 continue;
             }
-            //检测答案的对错
+            //检测答案的对错,此处进行全匹配,全对上该题目才正确
             if (ans.equalsIgnoreCase(a.getOptions())) {
                 collectQuestion.add(q.getNumber());
                 String jsonScore = q.getJsonScore();
@@ -94,6 +96,8 @@ public class PaperResultService {
                 }
             }
         }
+        //对的选项进行升序排序
+        collectQuestion.sort(Integer::compareTo);
         result.setCollectQuestion(StringUtils.join(collectQuestion, ","));
         result.setJsonScore(ObjectUtil.object2Json(pData));
         //转换分数为百分制
@@ -118,7 +122,7 @@ public class PaperResultService {
         return paperResultRepo.findByPidAndUid(pid, uid);
     }
 
-    public boolean delete(Long pid, Long uid) {
+    public int delete(Long pid, Long uid) {
         return paperResultRepo.deleteByPidAndUid(pid, uid);
     }
 
@@ -395,8 +399,9 @@ public class PaperResultService {
         return ObjectUtil.object2Json(useTime);
     }
 
-    public String avgUseTime(PaperResult paperResult) {
-        PaperCount count = paperCountService.findByPid(paperResult.getPid());
+    public String avgUseTime(Paper paper) {
+        paperCountService.updateAvgCommitTime(paper);
+        PaperCount count = paperCountService.findByPid(paper.getId());
         return count.getUseTimeAgvRate();
     }
 

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

@@ -22,11 +22,13 @@ 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 Gson getGson(){
+        return gson;
+    }
+
+    public static Object json2Object(String json,Type type) {
+        return gson.fromJson(json, type);
+    }
 
     public static <T> Map<String, T> json2Map(String json) {
         Type type = new TypeToken<HashMap<String, T>>() {