浏览代码

更新专项诊断报告接口,基于知识点列表绑定试卷的方式。

4228306 5 年之前
父节点
当前提交
51117cbb97

+ 1 - 1
src/main/java/com/yaoxiang/diagnosis/config/Swagger2Config.java

@@ -37,7 +37,7 @@ public class Swagger2Config {
     private ApiInfo apiInfo() {
         return new ApiInfoBuilder()
                 //自定义信息可按需求填写
-                .title("Spring Boot中使用Swagger构建restful apis")
+                .title("YaoXiang Diagnosis Rest API")
                 .description("对接")
                 .version("1.0")
                 .build();

+ 5 - 0
src/main/java/com/yaoxiang/diagnosis/controller/SpecialReportController.java

@@ -19,6 +19,11 @@ public class SpecialReportController {
 
     @GetMapping("/generate")
     public SpecialResult generate(Long pid,Long uid){
+        return specialReportService.generate2(pid,uid);
+    }
+
+    @GetMapping("/generate2")
+    public SpecialResult generate2(Long pid,Long uid){
         return specialReportService.generate(pid,uid);
     }
 }

+ 2 - 0
src/main/java/com/yaoxiang/diagnosis/dao/SpecialKnowledgeRepo.java

@@ -12,4 +12,6 @@ public interface SpecialKnowledgeRepo extends JpaRepository<SpecialKnowledge,Lon
     List<SpecialKnowledge> findByGrade(String grade);
 
     List<SpecialKnowledge> findBySubjectIdAndGrade(Long subjectId,String grade);
+
+    List<SpecialKnowledge> findByPid(Long pid);
 }

+ 6 - 1
src/main/java/com/yaoxiang/diagnosis/service/SpecialKnowledgeService.java

@@ -49,6 +49,10 @@ public class SpecialKnowledgeService {
         return specialKnowledgeRepo.findBySubjectId(subjectId);
     }
 
+    public List<SpecialKnowledge> listByPid(Long pid){
+        return specialKnowledgeRepo.findByPid(pid);
+    }
+
     public List<SpecialKnowledge> toTree(List<SpecialKnowledge> list) {
         List<SpecialKnowledge> treeList = new ArrayList<>();
         for (SpecialKnowledge tree : list) {
@@ -75,7 +79,7 @@ public class SpecialKnowledgeService {
         Map<Long, SpecialKnowledge> knowledgeMap = list.stream().collect(Collectors.toMap(SpecialKnowledge::getId, Function.identity()));
         int max = group.keySet().stream().max(Comparator.naturalOrder()).orElse(0);
         if (max == 0) {
-            logger.warn("最大层级为0,请检查数据");
+            logger.error("最大层级为0,请检查数据");
         }
         for (int i = max; i > 1; i--) {
             //全是同一级的
@@ -108,6 +112,7 @@ public class SpecialKnowledgeService {
             }
 
             if (i >= 3) {
+                //剪枝
                 ss.forEach(s -> s.setChildren(null));
             }
         }

+ 66 - 3
src/main/java/com/yaoxiang/diagnosis/service/SpecialReportService.java

@@ -3,15 +3,14 @@ package com.yaoxiang.diagnosis.service;
 import com.yaoxiang.diagnosis.entity.*;
 import com.yaoxiang.diagnosis.util.CommonUtil;
 import io.swagger.models.auth.In;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.transaction.Transactional;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -46,6 +45,20 @@ public class SpecialReportService {
         return generate(commit, paper);
     }
 
+    public SpecialResult generate2(Long pid, Long uid) {
+        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 generate2(commit, paper);
+    }
+
     @Transactional(rollbackOn = Exception.class)
     public SpecialResult generate(PaperCommit commit, Paper paper) {
         PaperResult result = paperResultService.findByPidAndUid(commit.getPid(), commit.getUid());
@@ -58,9 +71,11 @@ public class SpecialReportService {
             return null;
         }
         if (result == null) {
+            //重新生成PaperResult
             result = (PaperResult) paperResultService.parseResult(commit, paper).getT();
         }
         String collect = result.getCollectQuestion();
+        //答对的选项
         List<Integer> collects = Arrays.stream(collect.split(","))
                 .map(Integer::parseInt).collect(Collectors.toList());
 //        String wrong = result.getWrongQuestion();
@@ -95,6 +110,54 @@ public class SpecialReportService {
         return r;
     }
 
+    public SpecialResult generate2(PaperCommit commit, Paper paper) {
+        PaperResult result = paperResultService.findByPidAndUid(commit.getPid(), commit.getUid());
+        List<SpecialKnowledge> list = specialKnowledgeService.listByPid(paper.getId());
+
+        if (CommonUtil.isEmpty(list)) {
+            logger.error("未上传专项诊断知识点,subjectId={},grade={}", paper.getSubjectId(), paper.getGrade());
+            return null;
+        }
+        if (result == null) {
+            //重新生成PaperResult
+            result = (PaperResult) paperResultService.parseResult(commit, paper).getT();
+        }
+        String collect = result.getCollectQuestion();
+        //答对的选项
+        List<Long> collects = Arrays.stream(collect.split(","))
+                .map(Long::parseLong).collect(Collectors.toList());
+
+        for (SpecialKnowledge knowledge : list) {
+            //过滤掉非叶子节点
+            if (StringUtils.isBlank(knowledge.getQids())) {
+                continue;
+            }
+            //这个知识点对应的题号
+            Set<Long> number = Arrays.stream(knowledge.getQids().split(","))
+                    .map(Long::parseLong).collect(Collectors.toSet());
+            //该知识点的题目数量
+            knowledge.setQuestionNum(number.size());
+            number.retainAll(collects);
+            knowledge.setCollectNum(number.size());
+
+        }
+        List<SpecialKnowledge> tree = specialKnowledgeService.toTree(list);
+        //统计结果并且剪枝,剪掉>3的层级
+        specialKnowledgeService.calcCount(list);
+
+        logger.info(tree.toString());
+        SpecialResult r = new SpecialResult();
+        r.setCode(paper.getCode());
+        r.setCollectQuestion(collect);
+        r.setWrongQuestion(result.getWrongQuestion());
+        r.setScore(result.getScore());
+        r.setTotalScore(result.getTotalScore());
+        r.setPid(result.getPid());
+        r.setUid(result.getUid());
+        r.setKnowledges(tree);
+        return r;
+    }
+
     private Integer getCount(List<Question> qs, List<Integer> collects) {
         int count = 0;
         for (Question q : qs) {

+ 7 - 3
src/main/java/com/yaoxiang/diagnosis/word/WordService.java

@@ -280,7 +280,8 @@ public class WordService {
             logger.error(msg, new RuntimeException(msg));
             return;
         }
-        String size = Constants.PICTURE_SIZE_MIDDLE;
+        //图片默认最大宽度
+        String size = Constants.PICTURE_SIZE_LARGE;
         if (matcher.find()) {
             size = matcher.group().replaceAll("#", "");
         }
@@ -300,6 +301,9 @@ public class WordService {
                 String pName = pp.getPictureData().getFileName();
                 //想办法加上长跟宽
                 String suffix = pName.substring(pName.lastIndexOf("."));
+                if (".emf".equals(suffix)) {
+                    logger.error("检测到emf文件,段落内容为{}", p.getText());
+                }
                 String saveName = CommonUtil.randomUUID() + suffix;
                 byte[] pData = pp.getPictureData().getData();
                 int width = getWidth(pData);
@@ -372,7 +376,7 @@ public class WordService {
         //CTOMath 在CTP下面
         XmlCursor c = p.getCTP().newCursor();
         c.selectPath("./*");
-        if(CommonUtil.notEmpty(paras)){
+        if (CommonUtil.notEmpty(paras)) {
             c.toNextSibling();
         }
         int i = 0;
@@ -392,7 +396,7 @@ public class WordService {
                     e.printStackTrace();
                 }
                 logger.debug("CTOMath i = " + i + " " + o.getClass());
-            } else if(o instanceof CTOMathPara){
+            } else if (o instanceof CTOMathPara) {
 //                CTOMathPara m = (CTOMathPara) o;
                 c.toLastChild();
                 XmlObject xmlObject = c.getObject();

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

@@ -1,8 +1,11 @@
 package com.yaoxiang.diagnosis.service;
 
+import io.swagger.models.auth.In;
 import org.junit.Test;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 public class StringTest {
 
@@ -35,4 +38,22 @@ public class StringTest {
         String text = "asdf";
         System.out.println(text.substring(text.length()));
     }
+
+    @Test
+    public void testList(){
+        List<Integer> a = new ArrayList<>();
+        a.add(1);
+        a.add(2);
+        a.add(3);
+        a.add(4);
+
+        List<Integer> b = new ArrayList<>();
+        b.add(1);
+        b.add(3);
+        b.add(5);
+        b.add(6);
+        a.retainAll(b);
+        System.out.println(a);
+        System.out.println(b);
+    }
 }