فهرست منبع

增加专项诊断思维过程接口

4228306 5 سال پیش
والد
کامیت
7a7cb53a00

+ 10 - 2
src/main/java/com/yaoxiang/diagnosis/controller/SpecialReportController.java

@@ -2,13 +2,17 @@ package com.yaoxiang.diagnosis.controller;
 
 import com.yaoxiang.diagnosis.entity.SpecialMind;
 import com.yaoxiang.diagnosis.entity.SpecialResult;
+import com.yaoxiang.diagnosis.model.SpecialMindVo;
 import com.yaoxiang.diagnosis.service.SpecialReportService;
 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;
 
 import javax.annotation.Resource;
+import java.util.Comparator;
+import java.util.List;
 
 @Api(tags = "专项诊断报告")
 @RestController
@@ -19,13 +23,17 @@ public class SpecialReportController {
     private SpecialReportService specialReportService;
 
     @GetMapping("/generate")
+    @ApiOperation("生成专项诊断第一页知识点报告")
     public SpecialResult generate(Long pid, Long uid) {
         return specialReportService.generate2(pid, uid);
     }
 
     @GetMapping("/generateMind")
-    public SpecialMind generateMind(Long pid, Long uid) {
-        return new SpecialMind();
+    @ApiOperation("生成专项诊断第二页思维过程报告")
+    public List<SpecialMindVo> generateMind(Long pid, Long uid) {
+        List<SpecialMindVo> list = specialReportService.generateMind(pid, uid);
+        list.sort(Comparator.comparingInt(SpecialMindVo::getSort));
+        return list;
     }
 
 //    @GetMapping("/generate2")

+ 6 - 0
src/main/java/com/yaoxiang/diagnosis/dao/SpecialMindRepo.java

@@ -3,6 +3,12 @@ package com.yaoxiang.diagnosis.dao;
 import com.yaoxiang.diagnosis.entity.SpecialMind;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 public interface SpecialMindRepo extends JpaRepository<SpecialMind,Long> {
 
+    List<SpecialMind> findBySubjectIdAndGrade(Long subjectId,String grade);
+
+    List<SpecialMind> findByPid(Long pid);
+
 }

+ 33 - 5
src/main/java/com/yaoxiang/diagnosis/entity/SpecialMind.java

@@ -1,23 +1,35 @@
 package com.yaoxiang.diagnosis.entity;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
 import javax.persistence.*;
 
 @Entity
+@ApiModel
 public class SpecialMind {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    private Integer level;
+    @ApiModelProperty("跟第几步对应,排序用")
+    private Integer sort;
+    @ApiModelProperty("第几步")
     private String step;
+    @ApiModelProperty("问题")
     private String content;
     private Long pid;
     private Long subjectId;
     private String grade;
     private String qids;
     @Transient
+    @ApiModelProperty("是否有错题")
     private Boolean mistake;
+    @Transient
+    private Integer collectNum;
+    @Transient
+    private Integer questionNum;
 
     public Long getId() {
         return id;
@@ -27,12 +39,12 @@ public class SpecialMind {
         this.id = id;
     }
 
-    public Integer getLevel() {
-        return level;
+    public Integer getSort() {
+        return sort;
     }
 
-    public void setLevel(Integer level) {
-        this.level = level;
+    public void setSort(Integer sort) {
+        this.sort = sort;
     }
 
     public String getStep() {
@@ -90,4 +102,20 @@ public class SpecialMind {
     public void setMistake(Boolean mistake) {
         this.mistake = mistake;
     }
+
+    public Integer getCollectNum() {
+        return collectNum;
+    }
+
+    public void setCollectNum(Integer collectNum) {
+        this.collectNum = collectNum;
+    }
+
+    public Integer getQuestionNum() {
+        return questionNum;
+    }
+
+    public void setQuestionNum(Integer questionNum) {
+        this.questionNum = questionNum;
+    }
 }

+ 24 - 0
src/main/java/com/yaoxiang/diagnosis/model/SpecialMindVo.java

@@ -1,13 +1,21 @@
 package com.yaoxiang.diagnosis.model;
 
 import com.yaoxiang.diagnosis.entity.SpecialMind;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
+@ApiModel
 public class SpecialMindVo {
+    @ApiModelProperty("达成率")
     private Double master;
+    private Integer sort;
+    @ApiModelProperty("第几部")
     private String step;
     private List<SpecialMind> minds;
+    @ApiModelProperty("涂色 yellow green red")
+    private String masterStatus;
 
     public Double getMaster() {
         return master;
@@ -17,6 +25,14 @@ public class SpecialMindVo {
         this.master = master;
     }
 
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
     public String getStep() {
         return step;
     }
@@ -32,4 +48,12 @@ public class SpecialMindVo {
     public void setMinds(List<SpecialMind> minds) {
         this.minds = minds;
     }
+
+    public String getMasterStatus() {
+        return masterStatus;
+    }
+
+    public void setMasterStatus(String masterStatus) {
+        this.masterStatus = masterStatus;
+    }
 }

+ 4 - 0
src/main/java/com/yaoxiang/diagnosis/service/SpecialMindService.java

@@ -22,4 +22,8 @@ public class SpecialMindService {
         return true;
     }
 
+    public List<SpecialMind> findByPid(Long pid){
+        return specialMindRepo.findByPid(pid);
+    }
+
 }

+ 121 - 0
src/main/java/com/yaoxiang/diagnosis/service/SpecialReportService.java

@@ -1,9 +1,14 @@
 package com.yaoxiang.diagnosis.service;
 
+import com.google.gson.reflect.TypeToken;
 import com.yaoxiang.diagnosis.config.Constants;
 import com.yaoxiang.diagnosis.entity.*;
+import com.yaoxiang.diagnosis.model.Answer;
+import com.yaoxiang.diagnosis.model.AnswerContrast;
+import com.yaoxiang.diagnosis.model.SpecialMindVo;
 import com.yaoxiang.diagnosis.util.CommonUtil;
 import com.yaoxiang.diagnosis.util.NumberUtil;
+import com.yaoxiang.diagnosis.util.ObjectUtil;
 import io.swagger.models.auth.In;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -14,6 +19,8 @@ import javax.annotation.Resource;
 import javax.transaction.Transactional;
 import java.util.*;
 import java.util.function.Function;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
@@ -31,6 +38,9 @@ public class SpecialReportService {
     @Resource
     private SpecialKnowledgeService specialKnowledgeService;
 
+    @Resource
+    private SpecialMindService specialMindService;
+
     private static final Logger logger = LoggerFactory.getLogger(SpecialReportService.class);
 
 //    public SpecialResult generate(Long pid, Long uid) {
@@ -173,6 +183,10 @@ public class SpecialReportService {
         return r;
     }
 
+    private void calcMind(List<SpecialMind> list) {
+
+    }
+
     private Integer getCount(List<Question> qs, List<Integer> collects) {
         int count = 0;
         for (Question q : qs) {
@@ -183,4 +197,111 @@ public class SpecialReportService {
         return count;
     }
 
+    public List<SpecialMindVo> generateMind(Long pid, Long uid) {
+        logger.info("正在生成专项诊断报告");
+        Paper paper = paperService.getOnePaper(pid);
+        if (paper == null) {
+            logger.error("未找到试卷 pid={}", pid);
+            return null;
+        }
+        PaperCommit commit = commitService.getPaperCommit(pid, uid);
+        if (commit == null) {
+            logger.error("用户未提交 pid={},uid={}", pid, uid);
+            return null;
+        }
+        return generateMind(commit, paper);
+    }
+
+    public List<SpecialMindVo> generateMind(PaperCommit commit, Paper paper) {
+        PaperResult result = paperResultService.findByPidAndUid(commit.getPid(), commit.getUid());
+        List<SpecialMind> list = specialMindService.findByPid(paper.getId());
+        if (CommonUtil.isEmpty(list)) {
+            logger.error("未上传专项诊断思维过程,subjectId={},grade={}", paper.getSubjectId(), paper.getGrade());
+            return null;
+        }
+        String contrast = result.getWrongAnswerContrast();
+        List<AnswerContrast> contrasts = convertAnswerContrast(contrast);
+        if (CommonUtil.isEmpty(contrasts)) {
+            logger.info("没有错题");
+        }
+        Map<Integer, String> map = contrasts.stream().collect(Collectors.toMap(AnswerContrast::getNumber, AnswerContrast::getOptions));
+        //答对的选项
+        Pattern pattern = Pattern.compile("(\\d+)");
+        for (SpecialMind mind : list) {
+            String qids = mind.getQids();
+            if (StringUtils.isBlank(qids)) {
+                logger.error("该问题没有考,请检查,pid={},content={}", paper.getId(), mind.getContent());
+                continue;
+            }
+            String[] qidss = qids.split(",");
+            mind.setCollectNum(qidss.length);
+            mind.setQuestionNum(qidss.length);
+
+            for (String s : qidss) {
+                if (s.matches("\\d+[A-E]")) {
+                    Matcher matcher = pattern.matcher(s);
+                    int number = 0;
+                    if (matcher.find()) {
+                        number = Integer.parseInt(matcher.group());
+                    } else {
+                        logger.error("未检测到题号,qids={}", qids);
+                        continue;
+                    }
+                    String options = map.get(number);
+                    if (s.contains(options)) {
+                        mind.setCollectNum(mind.getCollectNum() - 1);
+                    }
+                } else {
+                    int number = Integer.parseInt(s);
+                    if (map.containsKey(number) && StringUtils.isBlank(map.get(number))) {
+                        //没做题
+                        mind.setCollectNum(mind.getCollectNum() - 1);
+                    } else if (map.containsKey(number)) {
+                        //答错了
+                        String options = map.get(number);
+                        if (s.contains(options)) {
+                            mind.setCollectNum(mind.getCollectNum() - 1);
+                        }
+                    }
+                }
+            }
+            //设置这个问题有没有错误
+            mind.setMistake(!mind.getQuestionNum().equals(mind.getCollectNum()));
+        }
+        Map<String, List<SpecialMind>> group = list.stream().collect(Collectors.groupingBy(SpecialMind::getStep));
+        List<SpecialMindVo> vos = new ArrayList<>();
+        for (Map.Entry<String, List<SpecialMind>> entry : group.entrySet()) {
+            String step = entry.getKey();
+            List<SpecialMind> minds = entry.getValue();
+            int collectNum = 0;
+            int questionNum = 0;
+            for (SpecialMind mind : minds) {
+                collectNum += mind.getCollectNum();
+                questionNum += mind.getQuestionNum();
+            }
+            if (questionNum == 0) {
+                logger.error("一整个步骤都没考");
+                continue;
+            }
+            SpecialMindVo vo = new SpecialMindVo();
+            double master = collectNum * 100.0 / questionNum;
+            vo.setMasterStatus("red");
+            if (master >= 85) {
+                vo.setMasterStatus("green");
+            } else if (master >= 50) {
+                vo.setMasterStatus("yellow");
+            }
+            vo.setMaster(NumberUtil.format(master));
+            vo.setMinds(minds);
+            vo.setStep(step);
+            vo.setSort(minds.get(0).getSort());
+            vos.add(vo);
+        }
+        return vos;
+    }
+
+    private List<AnswerContrast> convertAnswerContrast(String json) {
+        return ObjectUtil.getGson().fromJson(json, new TypeToken<List<AnswerContrast>>() {
+        }.getType());
+    }
 }

+ 2 - 2
src/main/java/com/yaoxiang/diagnosis/word/KnowledgeUtil.java

@@ -273,7 +273,7 @@ public class KnowledgeUtil {
             XSSFRow row = sheet.getRow(i);
             SpecialMind mind = new SpecialMind();
             String step = row.getCell(0).getStringCellValue();
-            mind.setLevel(toLevel(step));
+            mind.setSort(toSort(step));
             mind.setStep(step);
             mind.setContent(row.getCell(1).getStringCellValue());
             XSSFCell cell = row.getCell(2);
@@ -292,7 +292,7 @@ public class KnowledgeUtil {
         return result;
     }
 
-    private static Integer toLevel(String step) {
+    private static Integer toSort(String step) {
         //有点蠢
         switch (step) {
             case "第一步":

+ 18 - 0
src/test/java/com/yaoxiang/diagnosis/service/StringTest.java

@@ -6,6 +6,8 @@ import org.junit.Test;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class StringTest {
 
@@ -56,4 +58,20 @@ public class StringTest {
         System.out.println(a);
         System.out.println(b);
     }
+
+    @Test
+    public void test1(){
+        String a = "65C";
+        String b = "65ABC";
+        String c = "65ABEF";
+        System.out.println(a.matches("\\d+[A-E]"));
+        System.out.println(b.matches("\\d+[A-E]+"));
+        System.out.println(c.matches("\\d+[A-E]+"));
+
+        Pattern pattern = Pattern.compile("\\d+");
+        Matcher matcher = pattern.matcher(a);
+        System.out.println(matcher.find());
+        System.out.println(matcher.group());
+
+    }
 }