瀏覽代碼

修改试卷上传解析,将答案及能力分数存储到题目中

4228306 5 年之前
父節點
當前提交
4da36c4ed5

二進制
doc/topic_paper.docx


+ 15 - 2
src/main/java/edu/math/diagnosis/controller/ExcelController.java

@@ -1,15 +1,25 @@
 package edu.math.diagnosis.controller;
 
+import edu.math.diagnosis.entity.SubjectKnowledge;
 import edu.math.diagnosis.model.Result;
+import edu.math.diagnosis.service.KnowledgeService;
+import edu.math.diagnosis.word.KnowledgeUtil;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.List;
+
 @Api(tags = "上传报告能力、知识点、问题、分数段数据")
 @RestController
 @RequestMapping("/excel")
 public class ExcelController {
 
+    @Resource
+    private KnowledgeService knowledgeService;
+
     @PostMapping("/uploadAll")
     public Result uploadAll() {
         return Result.fail("not implement");
@@ -18,7 +28,10 @@ public class ExcelController {
     @PostMapping("/uploadKnowledge")
     public Result uploadKnowledge(@RequestParam(defaultValue = "2") String subjectId,
                                   @RequestParam(defaultValue = "6Y") String grade,
-                                  @RequestBody MultipartFile file) {
-        return Result.fail("not implement");
+                                  @RequestBody MultipartFile file) throws Exception {
+        byte[] data = file.getBytes();
+        List<SubjectKnowledge> list = KnowledgeUtil.getFromExcel(subjectId,grade,data);
+        knowledgeService.addAll(list);
+        return Result.ok(list);
     }
 }

+ 7 - 0
src/main/java/edu/math/diagnosis/dao/SubjectKnowledgeRepo.java

@@ -0,0 +1,7 @@
+package edu.math.diagnosis.dao;
+
+import edu.math.diagnosis.entity.SubjectKnowledge;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface SubjectKnowledgeRepo extends JpaRepository<SubjectKnowledge,Long> {
+}

+ 42 - 11
src/main/java/edu/math/diagnosis/entity/AbilityScore.java

@@ -14,11 +14,15 @@ public class AbilityScore {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    @ApiModelProperty("能力Id")
-    private String abilityId;
+//    @ApiModelProperty("能力Id")
+//    private String abilityId;
 
     @ApiModelProperty("能力")
-    private String ability;
+    private String abilityCode;
+
+    private String grade;
+
+    private String subjectId;
 
     @Column(nullable = false)
     @ApiModelProperty("试卷Id")
@@ -36,6 +40,17 @@ public class AbilityScore {
     @Column(nullable = false)
     private Date createtime;
 
+    public AbilityScore(){}
+
+    public AbilityScore(String abilityCode, String grade, String subjectId, Long pid, Long qid, Double score) {
+        this.abilityCode = abilityCode;
+        this.grade = grade;
+        this.subjectId = subjectId;
+        this.pid = pid;
+        this.qid = qid;
+        this.score = score;
+    }
+
     public Long getId() {
         return id;
     }
@@ -44,20 +59,36 @@ public class AbilityScore {
         this.id = id;
     }
 
-    public String getAbilityId() {
-        return abilityId;
+//    public String getAbilityId() {
+//        return abilityId;
+//    }
+//
+//    public void setAbilityId(String abilityId) {
+//        this.abilityId = abilityId;
+//    }
+
+    public String getAbilityCode() {
+        return abilityCode;
+    }
+
+    public void setAbilityCode(String abilityCode) {
+        this.abilityCode = abilityCode;
+    }
+
+    public String getGrade() {
+        return grade;
     }
 
-    public void setAbilityId(String abilityId) {
-        this.abilityId = abilityId;
+    public void setGrade(String grade) {
+        this.grade = grade;
     }
 
-    public String getAbility() {
-        return ability;
+    public String getSubjectId() {
+        return subjectId;
     }
 
-    public void setAbility(String ability) {
-        this.ability = ability;
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
     }
 
     public Long getPid() {

+ 32 - 7
src/main/java/edu/math/diagnosis/entity/Question.java

@@ -85,9 +85,17 @@ public class Question {
     private String wrongDesc;
 
     @Column
-    @ApiModelProperty("标签")
+    @ApiModelProperty("知识点标签 以,隔开")
     private String tag;
 
+//    @Column
+//    private String abilityTag;
+
+    @Lob
+    @Column
+    @ApiModelProperty("题目各能力分数")
+    private String jsonScore;
+
     @CreationTimestamp
     @Column(nullable = false)
     private Date createtime;
@@ -98,8 +106,8 @@ public class Question {
     private List<QuestionOption> options;
     @Transient
     private List<AbilityScore> scores;
-    @Transient
-    private String ans;
+//    @Transient
+    private String answer;
     @Transient
     private Integer usetime;
 
@@ -271,12 +279,12 @@ public class Question {
         this.scores = scores;
     }
 
-    public String getAns() {
-        return ans;
+    public String getAnswer() {
+        return answer;
     }
 
-    public void setAns(String ans) {
-        this.ans = ans;
+    public void setAnswer(String answer) {
+        this.answer = answer;
     }
 
     public Integer getUsetime() {
@@ -286,4 +294,21 @@ public class Question {
     public void setUsetime(Integer usetime) {
         this.usetime = usetime;
     }
+
+//    public String getAbilityTag() {
+//        return abilityTag;
+//    }
+//
+//    public void setAbilityTag(String abilityTag) {
+//        this.abilityTag = abilityTag;
+//    }
+
+
+    public String getJsonScore() {
+        return jsonScore;
+    }
+
+    public void setJsonScore(String jsonScore) {
+        this.jsonScore = jsonScore;
+    }
 }

+ 24 - 0
src/main/java/edu/math/diagnosis/entity/SubjectKnowledge.java

@@ -27,6 +27,30 @@ public class SubjectKnowledge {
 
     private String abilityCodes;
 
+    public SubjectKnowledge(){}
+
+    public SubjectKnowledge(String subjectId, String grade, String chapter, String code, String content, String abilityCodes) {
+        this.subjectId = subjectId;
+        this.grade = grade;
+        this.chapter = chapter;
+        this.code = code;
+        this.content = content;
+        this.abilityCodes = abilityCodes;
+    }
+
+    @Override
+    public String toString() {
+        return "SubjectKnowledge{" +
+                "id=" + id +
+                ", subjectId='" + subjectId + '\'' +
+                ", grade='" + grade + '\'' +
+                ", chapter='" + chapter + '\'' +
+                ", code='" + code + '\'' +
+                ", content='" + content + '\'' +
+                ", abilityCodes='" + abilityCodes + '\'' +
+                '}';
+    }
+
     public Long getId() {
         return id;
     }

+ 0 - 17
src/main/java/edu/math/diagnosis/service/AbilityScoreService.java

@@ -14,26 +14,9 @@ public class AbilityScoreService {
 
     @Resource
     private AbilityScoreRepo abilityScoreRepo;
-    @Resource
-    private SubjectAbilityRepo subjectAbilityRepo;
 
     public void add(AbilityScore abilityScore) {
         abilityScoreRepo.save(abilityScore);
     }
 
-    public AbilityScore init(Long pid, Long qid, Double score, String abilityId, String ability) {
-        AbilityScore s = new AbilityScore();
-        s.setPid(pid);
-        s.setQid(qid);
-        s.setScore(score);
-        s.setAbilityId(abilityId);
-        s.setAbility(ability);
-        return s;
-    }
-
-    public List<SubjectAbility> listBySubjectId(String subjectId){
-        return subjectAbilityRepo.findAllBySubjectId(subjectId);
-    }
-
-
 }

+ 23 - 0
src/main/java/edu/math/diagnosis/service/KnowledgeService.java

@@ -0,0 +1,23 @@
+package edu.math.diagnosis.service;
+
+import edu.math.diagnosis.dao.SubjectKnowledgeRepo;
+import edu.math.diagnosis.entity.SubjectKnowledge;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class KnowledgeService {
+
+    @Resource
+    private SubjectKnowledgeRepo subjectKnowledgeRepo;
+
+    public SubjectKnowledge add(SubjectKnowledge knowledge){
+        return subjectKnowledgeRepo.save(knowledge);
+    }
+
+    public List<SubjectKnowledge> addAll(List<SubjectKnowledge> list){
+        return subjectKnowledgeRepo.saveAll(list);
+    }
+}

+ 19 - 3
src/main/java/edu/math/diagnosis/service/PaperService.java

@@ -48,6 +48,10 @@ public class PaperService {
     private SectionService sectionService;
     @Resource
     private SubjectService subjectService;
+    @Resource
+    private SubjectAbilityService subjectAbilityService;
+    @Resource
+    private AbilityScoreService abilityScoreService;
 
     @Resource
     private PaperTemplateService paperTemplateService;
@@ -135,16 +139,26 @@ public class PaperService {
             return Result.fail("存在同名试卷");
         }
         paper.setId(null);
+        //保存试卷
         Paper save = paperRepo.save(paper);
         if (save == null) {
             return Result.fail("保存失败,请重试");
         }
         for (Question question : save.getQuestions()) {
             question.setPid(save.getId());
+            //保存问题
             questionService.addQuestion(question);
+            for (AbilityScore score:question.getScores()) {
+                score.setGrade(paper.getGrade());
+                score.setPid(save.getId());
+                score.setQid(question.getId());
+                //保存能力分数
+                abilityScoreService.add(score);
+            }
         }
         for (Section section : save.getSections()) {
             section.setPid(save.getId());
+            //保存段落
             sectionService.add(section);
         }
         logger.info("试卷增加成功");
@@ -281,12 +295,14 @@ public class PaperService {
 //            initQuestions(paper, questionPattern, ps);
 //        });
         Map<String, List<Question>> qs = new HashMap<>();
+        List<String> abilities = subjectAbilityService.list(String.valueOf(paper.getSubjectId()))
+                .stream().map(SubjectAbility::getCode).collect(Collectors.toList());
         sections.keySet().forEach(s -> {
             List<XWPFParagraph> ps = sections.get(s);
 //            Section current = ss.stream().filter(section -> s.contains(section.getNumber().toString())).findFirst().orElse(null);
             Section current = sectionMap.get(s);
             Map<String, List<XWPFParagraph>> questions = initQuestions(current, questionPattern, ps);
-            List<Question> list = parseQuestions(questions, current, template, topic);
+            List<Question> list = parseQuestions(questions, current, template, topic,abilities);
             qs.put(s, list);
         });
         List<Question> list = new ArrayList<>();
@@ -318,7 +334,7 @@ public class PaperService {
         paper.setName(sb.toString());
     }
 
-    private List<Question> parseQuestions(Map<String, List<XWPFParagraph>> questions, Section section, PaperTemplate template, Map<String, String> topic) {
+    private List<Question> parseQuestions(Map<String, List<XWPFParagraph>> questions, Section section, PaperTemplate template, Map<String, String> topic,List<String> abilities) {
         List<Question> list = new ArrayList<>();
         //问题合集
         Pattern pattern = Pattern.compile("\\d+");
@@ -327,7 +343,7 @@ public class PaperService {
             if (k.matches(template.getQuestion()) && matcher.find()) {
                 String number = matcher.group();
                 Question question = questionService.initQuestion(section.getNumber(), Integer.valueOf(number));
-                wordService.parseQuestion(question, v, topic, template);
+                wordService.parseQuestion(question, v, topic, template,abilities);
                 list.add(question);
             }
         });

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

@@ -134,7 +134,7 @@ public class QuestionService {
     public Question initQuestion(Integer section, Integer number) {
         Question question = new Question();
         question.setCreatetime(new Date());
-        question.setScore(0D);
+        question.setScore(1D);
         question.setNumber(number);
         question.setDuration(60);
         question.setSection(section);

+ 23 - 0
src/main/java/edu/math/diagnosis/service/SubjectAbilityService.java

@@ -0,0 +1,23 @@
+package edu.math.diagnosis.service;
+
+import edu.math.diagnosis.dao.SubjectAbilityRepo;
+import edu.math.diagnosis.entity.SubjectAbility;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class SubjectAbilityService {
+
+    @Resource
+    private SubjectAbilityRepo subjectAbilityRepo;
+
+    public SubjectAbility add(SubjectAbility ability){
+        return subjectAbilityRepo.save(ability);
+    }
+
+    public List<SubjectAbility> list(String subjectId){
+        return subjectAbilityRepo.findAllBySubjectId(subjectId);
+    }
+}

+ 43 - 3
src/main/java/edu/math/diagnosis/word/KnowledgeUtil.java

@@ -1,14 +1,54 @@
 package edu.math.diagnosis.word;
 
 import edu.math.diagnosis.entity.SubjectKnowledge;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Component;
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 
-@Component
 public class KnowledgeUtil {
 
-    public List<SubjectKnowledge> getFromExcel() {
-        return null;
+    public static final int START_ROW = 2;
+    public static final int END_ROW = 20;
+    public static final int START_COLUMN = 2;
+    public static final int END_COLUMN = 100;
+
+    public static List<SubjectKnowledge> getFromExcel(String subjectId,String grade,byte[] data) throws Exception{
+        XSSFWorkbook book = new XSSFWorkbook(new ByteArrayInputStream(data));
+        XSSFSheet sheet = book.getSheetAt(1);
+        String[] codes = {"A1","A2","A3","A4","A5","A6"};
+        List<SubjectKnowledge> result = new ArrayList<>();
+        for (int numRow = 2; numRow <= sheet.getLastRowNum(); numRow++) {
+            XSSFRow xRow = sheet.getRow(numRow);
+            //4 9
+//            for (int numCell = 2; numCell <= 9; numCell++) {
+//                String cell = xRow.getCell(numCell) == null ? "_" : xRow.getCell(numCell).toString();
+//                System.out.print(cell+ " ");
+//            }
+            String code = xRow.getCell(2).toString();
+            String chapter = code.replaceAll("[a-z]","");
+            StringBuilder abilityCodes = new StringBuilder();
+            String content = xRow.getCell(3).toString();
+            for (int i = 4;i<=9;i++){
+                double d = xRow.getCell(i) == null ? 0:xRow.getCell(i).getNumericCellValue();
+                if (d == 1){
+                    abilityCodes.append(codes[i-4]).append(",");
+                }
+            }
+            if(StringUtils.isNotBlank(abilityCodes.toString())){
+                abilityCodes.deleteCharAt(abilityCodes.lastIndexOf(","));
+            }
+            SubjectKnowledge k = new SubjectKnowledge(subjectId,grade,chapter,code,content,abilityCodes.toString());
+            result.add(k);
+            System.out.println(k);
+        }
+        return result;
     }
+
 }

+ 37 - 22
src/main/java/edu/math/diagnosis/word/WordService.java

@@ -1,12 +1,11 @@
 package edu.math.diagnosis.word;
 
-import edu.math.diagnosis.entity.PaperTemplate;
-import edu.math.diagnosis.entity.Question;
-import edu.math.diagnosis.entity.QuestionOption;
+import edu.math.diagnosis.entity.*;
 import edu.math.diagnosis.service.FileService;
 import edu.math.diagnosis.service.LocalFileService;
 import edu.math.diagnosis.util.CommonUtil;
 import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.util.ObjectUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.xwpf.usermodel.*;
 import org.apache.xmlbeans.XmlCursor;
@@ -61,24 +60,25 @@ public class WordService {
         return question;
     }
 
-    public Question parseQuestion(Question q, List<XWPFParagraph> ps, Map<String, String> topic, PaperTemplate template) {
+    public Question parseQuestion(Question q, List<XWPFParagraph> ps, Map<String, String> topic, PaperTemplate template, List<String> abilities) {
         logger.info("parsing question,pid={},section={},number={}", q.getPid(), q.getSection(), q.getNumber());
         Map<String, List<XWPFParagraph>> group = initGroup(ps, topic, template);
         //此次是否还需再处理一下?
         parseQuestion(q, group.get(topic.get(Constants.TOPIC_QUESTION)), template.getOptionPattern());
         parseAnswer(q, group.get(topic.get(Constants.TOPIC_ANSWER)));
         parseTag(q, group.get(topic.get(Constants.TOPIC_TAG)));
-        parseAbility(q, group.get(topic.get(Constants.TOPIC_ABILITY)));
+        parseAbility(q, group.get(topic.get(Constants.TOPIC_ABILITY)),abilities);
         logger.info("parse question finish,pid={},section={},number={}", q.getPid(), q.getSection(), q.getNumber());
         return q;
     }
 
     private void parseQuestion(Question q, Map<String, List<XWPFParagraph>> group) {
         logger.info("parsing question,pid={},section={},number={}", q.getPid(), q.getSection(), q.getNumber());
+        String[] a = {"A1","A2","A3","A4","A5"};
         parseQuestion(q, group.get(Constants.TOPIC_QUESTION), "^[A-Z]\\.(.*)");
         parseAnswer(q, group.get(Constants.TOPIC_ANSWER));
         parseTag(q, group.get(Constants.TOPIC_TAG));
-        parseAbility(q, group.get(Constants.TOPIC_ABILITY));
+        parseAbility(q, group.get(Constants.TOPIC_ABILITY),Arrays.asList(a));
         parseCollect(q, group.get(Constants.TOPIC_EVALUATE_CORRECT));
         parseWrong(q, group.get(Constants.TOPIC_EVALUATE_WRONG));
         logger.info("parse question finish,pid={},section={},number={}", q.getPid(), q.getSection(), q.getNumber());
@@ -132,7 +132,7 @@ public class WordService {
                     o.setCorrect(true);
                 }
             });
-            question.setAns(text);
+            question.setAnswer(text);
         }
     }
 
@@ -140,24 +140,39 @@ public class WordService {
         ps.stream().filter(p -> StringUtils.isNotBlank(p.getText())).forEach(p -> question.setTag(p.getText()));
     }
 
-    private void parseAbility(Question question, List<XWPFParagraph> ps) {
+    private void parseAbility(Question question, List<XWPFParagraph> ps,List<String> abilities) {
+        List<AbilityScore> list = new ArrayList<>();
+        Map<String,Double> json = new HashMap<>();
+        //先手动设置1分
+        json.put("A0",1d);
+        AbilityScore a0 = new AbilityScore("A0","","",question.getPid(),0L,0d);
+        list.add(a0);
         for (XWPFParagraph p : ps) {
             String text = p.getText();
-            double score = Integer.parseInt(text.substring(text.indexOf("=") + 1));
-            if (text.contains(Constants.TOPIC_ABILITY_CALC)) {
-                question.setCalculation(score);
-            } else if (text.contains(Constants.TOPIC_ABILITY_INTRO)) {
-                question.setInduction(score);
-            } else if (text.contains(Constants.TOPIC_ABILITY_LOGIC)) {
-                question.setLogic(score);
-            } else if (text.contains(Constants.TOPIC_ABILITY_SPACE)) {
-                question.setSpace(score);
-            } else if (text.contains(Constants.TOPIC_ABILITY_LANGUAGE)) {
-                question.setLanguage(score);
-            } else if (text.contains(Constants.TOPIC_ABILITY_CONVERSION)) {
-                question.setConversion(score);
-            }
+            String[] ss = text.split("=");
+            String abilityCode = ss[0];
+            double score = Double.parseDouble(ss[1]);
+            AbilityScore s = new AbilityScore(abilityCode,"","",question.getPid(),0L,score);
+            list.add(s);
+            json.put(abilityCode,score);
+//            abilities.stream().filter(text::equalsIgnoreCase)
+//            if (text.contains(Constants.TOPIC_ABILITY_CALC)) {
+//                question.setCalculation(score);
+//            } else if (text.contains(Constants.TOPIC_ABILITY_INTRO)) {
+//                question.setInduction(score);
+//            } else if (text.contains(Constants.TOPIC_ABILITY_LOGIC)) {
+//                question.setLogic(score);
+//            } else if (text.contains(Constants.TOPIC_ABILITY_SPACE)) {
+//                question.setSpace(score);
+//            } else if (text.contains(Constants.TOPIC_ABILITY_LANGUAGE)) {
+//                question.setLanguage(score);
+//            } else if (text.contains(Constants.TOPIC_ABILITY_CONVERSION)) {
+//                question.setConversion(score);
+//            }
         }
+        question.setJsonScore(ObjectUtil.object2Json(json));
+        question.setScores(list);
+
     }
 
     private void parseCollect(Question question, List<XWPFParagraph> ps) {

+ 10 - 0
src/test/java/edu/math/diagnosis/service/StringTest.java

@@ -2,6 +2,8 @@ package edu.math.diagnosis.service;
 
 import org.junit.Test;
 
+import java.util.Arrays;
+
 public class StringTest {
 
     @Test
@@ -11,4 +13,12 @@ public class StringTest {
         System.out.println(a.length);
         System.out.println(a);
     }
+
+    @Test
+    public void testString1(){
+        String text = "A=1";
+        String[] a = text.split("=");
+        System.out.println(a.length);
+        System.out.println(Arrays.asList(a));
+    }
 }