Feick пре 3 година
родитељ
комит
58f5c48abb

+ 7 - 4
src/main/java/com/yaoxiang/diagnosis/entity/Issue.java

@@ -1,5 +1,6 @@
 package com.yaoxiang.diagnosis.entity;
 
+import com.yaoxiang.diagnosis.issue.BaseIssue;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.annotations.CreationTimestamp;
@@ -11,7 +12,7 @@ import java.util.List;
 
 @Entity
 @ApiModel("问题")
-public class Issue {
+public class Issue extends BaseIssue {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
@@ -38,7 +39,7 @@ public class Issue {
 
     @Column(nullable = false, columnDefinition = " int default 1")
     @ApiModelProperty("题目所属模块 1 2 3")
-    private int section;
+    private Integer section;
 
     private String answer;
 
@@ -106,11 +107,13 @@ public class Issue {
         this.tag = tag;
     }
 
-    public int getSection() {
+    @Override
+    public Integer getSection() {
         return section;
     }
 
-    public void setSection(int section) {
+    @Override
+    public void setSection(Integer section) {
         this.section = section;
     }
 

+ 24 - 2
src/main/java/com/yaoxiang/diagnosis/entity/IssueLite.java

@@ -1,5 +1,6 @@
 package com.yaoxiang.diagnosis.entity;
 
+import com.yaoxiang.diagnosis.issue.BaseIssue;
 import io.swagger.annotations.ApiModel;
 import org.hibernate.annotations.CreationTimestamp;
 import org.hibernate.annotations.UpdateTimestamp;
@@ -10,12 +11,16 @@ import java.util.List;
 
 @Entity
 @ApiModel("模块二三的小题")
-public class IssueLite {
+public class IssueLite extends BaseIssue {
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
+    private String content;
+
+    private Integer correctNum;
+
     private String answer;
 
     private Long issueId;
@@ -30,7 +35,6 @@ public class IssueLite {
     @Transient
     private List<IssueOption> options;
 
-
     public Long getId() {
         return id;
     }
@@ -39,6 +43,24 @@ public class IssueLite {
         this.id = id;
     }
 
+    public Integer getCorrectNum() {
+        return correctNum;
+    }
+
+    @Override
+    public String getContent() {
+        return content;
+    }
+
+    @Override
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public void setCorrectNum(Integer correctNum) {
+        this.correctNum = correctNum;
+    }
+
     public String getAnswer() {
         return answer;
     }

+ 60 - 0
src/main/java/com/yaoxiang/diagnosis/issue/BaseIssue.java

@@ -0,0 +1,60 @@
+package com.yaoxiang.diagnosis.issue;
+
+import com.yaoxiang.diagnosis.entity.IssueOption;
+
+import javax.persistence.Transient;
+import java.util.List;
+
+public class BaseIssue {
+
+    private String content;
+
+    private Integer section;
+
+    private Integer correctNum;
+
+    private String answer;
+
+    @Transient
+    private List<IssueOption> options;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getSection() {
+        return section;
+    }
+
+    public void setSection(Integer section) {
+        this.section = section;
+    }
+
+    public Integer getCorrectNum() {
+        return correctNum;
+    }
+
+    public void setCorrectNum(Integer correctNum) {
+        this.correctNum = correctNum;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public List<IssueOption> getOptions() {
+        return options;
+    }
+
+    public void setOptions(List<IssueOption> options) {
+        this.options = options;
+    }
+}

+ 72 - 24
src/main/java/com/yaoxiang/diagnosis/service/IssueParseAdapter.java → src/main/java/com/yaoxiang/diagnosis/issue/IssueParseAdapter.java

@@ -1,27 +1,27 @@
-package com.yaoxiang.diagnosis.service;
+package com.yaoxiang.diagnosis.issue;
 
 import com.yaoxiang.diagnosis.config.Constants;
 import com.yaoxiang.diagnosis.entity.Issue;
 import com.yaoxiang.diagnosis.entity.IssueOption;
 import com.yaoxiang.diagnosis.file.FileService;
 import com.yaoxiang.diagnosis.word.WordUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
 
-import javax.annotation.Resource;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+@Slf4j
 public abstract class IssueParseAdapter implements IssueParseHandler {
 
     public static final String QUESTION_PATTERN = "#Q(\\d+)#";
     public static final String ANSWER_PATTERN = "#Ans#";
     public static final String OPTION_PATTERN = "^#[A-Z]#(.*)";
     public static final String OPTION_REPLACE_PATTERN = "#[A-Z]#";
-    public static final String MIND_OPTION = "#M(\\d+)#";
+    public static final String LITE_QUESTION_PATTERN = "#q(\\d+)#";
     public static final String SECTION_PATTERN = "#Section (\\d+)#";
     public static final String TAG_PATTERN = "#Tag#";
     public static final String PICTURE_PATTERN = "#(Small|small|Middle|middle|Large|large)#";
@@ -30,14 +30,72 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
     public static final String SUFFIX_PATTERN = "#";
 
     public static final List<String> TOPIC1 = Arrays.asList(QUESTION_PATTERN, ANSWER_PATTERN, TAG_PATTERN);
-    private static final Logger logger = LoggerFactory.getLogger(IssueParseAdapter.class);
+    public static final List<String> TOPIC2 = Arrays.asList(QUESTION_PATTERN, ANSWER_PATTERN);
+    public static final List<String> TOPIC3 = Arrays.asList(LITE_QUESTION_PATTERN, ANSWER_PATTERN);
     protected final Pattern issuePattern = Pattern.compile("\\d+");
-    @Resource
-    private FileService fileService;
 
-    abstract void parseQuestion(Issue issue, String code, List<XWPFParagraph> ps);
+    private final FileService fileService;
 
-    public void parseAnswer(Issue issue, List<XWPFParagraph> list) {
+    protected IssueParseAdapter(FileService fileService) {
+        this.fileService = fileService;
+    }
+
+
+    protected void parseQuestion(BaseIssue issue, String code, List<XWPFParagraph> ps) {
+        List<IssueOption> options = new ArrayList<>();
+        int i = 0;
+        StringBuilder content = new StringBuilder();
+        boolean hasFormula = false;
+        String index = "";
+        Map<String, List<XWPFParagraph>> indexMap = new LinkedHashMap<>();
+        boolean isQuestion = true;
+        for (XWPFParagraph p : ps) {
+
+            String text = p.getText();
+            if (WordUtil.notContent(p, text)) {
+                continue;
+            }
+            //清除掉#Small#
+            text = text.replaceAll(PICTURE_PATTERN, "");
+            if (text.matches(OPTION_PATTERN)) {
+                isQuestion = false;
+                index = text;
+            }
+
+            if (isQuestion) {
+                content.append("<p>").append(text).append("</p>");
+                continue;
+            }
+            List<XWPFParagraph> list = indexMap.getOrDefault(index, new ArrayList<>());
+            list.add(p);
+            indexMap.put(index, list);
+
+        }
+
+        for (Map.Entry<String, List<XWPFParagraph>> entry : indexMap.entrySet()) {
+            StringBuilder builder = new StringBuilder();
+            for (XWPFParagraph p : entry.getValue()) {
+                builder.append("<p>").append(p.getText()).append("</p>");
+            }
+            String text = builder.toString();
+            IssueOption option = initOption(i++, issue.getSection(), text);
+            String optionNoContent = String.format("parseQuestion,题号为%s的题目选项 %s 未检测到内容,题目内容为“%s”,请检查选项结构", code, text, content);
+            Assert.hasText(option.getContent(), optionNoContent);
+            options.add(option);
+        }
+
+        String noContent = String.format("parseQuestion,题号为 %s 的题目未检测到题干,题目内容为 “%s” ,请检查", code, content);
+        String noOptions = String.format("parseQuestion,题号为 %s 的题目未检测到选项,题目内容为 “%s” ,请检查", code, content);
+        String lostOptions = String.format("parseQuestion,题号为 %s 的题目检测到选项数量为 %s ,题目内容为 “%s” ,请检查选项换行情况", code, options.size(), content);
+        Assert.hasText(content.toString(), noContent);
+        Assert.notEmpty(options, noOptions);
+        //TODO 选项数量可能不止5个?
+        Assert.isTrue(options.size() >= Constants.OPTION_NUMS, lostOptions);
+        issue.setContent(content.toString());
+        issue.setOptions(options);
+    }
+
+    public void parseAnswer(BaseIssue issue, List<XWPFParagraph> list) {
         for (XWPFParagraph p : list) {
             String text = p.getText();
             if (StringUtils.isBlank(text)) {
@@ -79,11 +137,11 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
             if (text.matches(QUESTION_PATTERN)) {
                 tag = text;
             }
-            //过滤掉试题标题
+            //过滤掉试题标题
             if (tag.isEmpty()) {
                 continue;
             }
-            logger.info("initQuestions,current tag is {},current text is {}", tag, text);
+            log.info("initQuestions,current tag is {},current text is {}", tag, text);
             List<XWPFParagraph> list = result.getOrDefault(tag, new ArrayList<>());
             list.add(paragraph);
             result.put(tag, list);
@@ -117,11 +175,11 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
                 //把标签设置成问题标签
                 tag = QUESTION_PATTERN;
             }
-            logger.info("initGroup, current Tag is {},current Text is {}", tag, text);
+            log.info("initGroup, current Tag is {},current Text is {}", tag, text);
             List<XWPFParagraph> ps = map.get(tag);
             //标签不对
             if (ps == null) {
-                logger.error("unknown tag {}", tag);
+                log.error("unknown tag {}", tag);
                 continue;
             }
             ps.add(p);
@@ -150,16 +208,6 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
         return option;
     }
 
-    public Map<String, String> getMapTopic() {
-        Map<String, String> topic = new HashMap<>();
-//        topic.put(Constants.TOPIC_SECTION, template.getSection());
-        topic.put(Constants.TOPIC_QUESTION, QUESTION_PATTERN);
-        topic.put(Constants.TOPIC_ANSWER, ANSWER_PATTERN);
-        topic.put(Constants.TOPIC_TAG, TAG_PATTERN);
-//        topic.put(Constants.TOPIC_ABILITY, template.getAbility());
-        return topic;
-    }
-
     @Override
     public List<Issue> parse(List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
         Map<String, List<XWPFParagraph>> map = split(list);

+ 1 - 1
src/main/java/com/yaoxiang/diagnosis/service/IssueParseHandler.java → src/main/java/com/yaoxiang/diagnosis/issue/IssueParseHandler.java

@@ -1,4 +1,4 @@
-package com.yaoxiang.diagnosis.service;
+package com.yaoxiang.diagnosis.issue;
 
 import com.yaoxiang.diagnosis.entity.Issue;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;

+ 137 - 0
src/main/java/com/yaoxiang/diagnosis/issue/IssueParseMultiMindHandler.java

@@ -0,0 +1,137 @@
+package com.yaoxiang.diagnosis.issue;
+
+import com.yaoxiang.diagnosis.entity.Issue;
+import com.yaoxiang.diagnosis.entity.IssueLite;
+import com.yaoxiang.diagnosis.file.FileService;
+import com.yaoxiang.diagnosis.word.WordUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.regex.Matcher;
+
+@Slf4j
+@Component
+public class IssueParseMultiMindHandler extends IssueParseAdapter implements IssueParseHandler {
+
+    public IssueParseMultiMindHandler(FileService fileService) {
+        super(fileService);
+    }
+
+    @Override
+    public int getSection() {
+        return 3;
+    }
+
+    @Override
+    protected Map<String, List<XWPFParagraph>> initGroup(List<XWPFParagraph> list, List<String> topic) {
+        Map<String, List<XWPFParagraph>> map = new LinkedHashMap<>();
+        topic.forEach(it -> map.put(it, new ArrayList<>()));
+        String tag = "";
+        //后续是不是改成先获取第一行?第一行固定为问题标签
+        for (XWPFParagraph p : list) {
+            String text = p.getText();
+            if (WordUtil.notContent(p, text)) {
+                continue;
+            }
+            //如果是选项标签或者是图片标签
+            if (text.matches(OPTION_PATTERN) || text.matches(PICTURE_PATTERN)) {
+                List<XWPFParagraph> ps = map.get(LITE_QUESTION_PATTERN);
+                ps.add(p);
+                continue;
+            }
+            //如果是其他标签
+            if (text.startsWith(PREFIX_PATTERN) && text.endsWith(SUFFIX_PATTERN)) {
+                tag = text;
+                continue;
+            }
+            //如果是问题标签
+            if (tag.matches(LITE_QUESTION_PATTERN)) {
+                //把标签设置成问题标签
+                tag = LITE_QUESTION_PATTERN;
+            }
+            log.info("initGroup, current Tag is {},current Text is {}", tag, text);
+            List<XWPFParagraph> ps = map.get(tag);
+            //标签不对
+            if (ps == null) {
+                log.error("unknown tag {}", tag);
+                continue;
+            }
+            ps.add(p);
+        }
+        return map;
+    }
+
+    @Override
+    public Issue parse(String issueIndex, List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
+        Issue issue = init(subjectId, grade, chapterId, getSection());
+        String title = getTitle(list);
+        issue.setContent(title);
+        List<IssueLite> lites = new ArrayList<>();
+        Map<String, List<XWPFParagraph>> liteMap = splitLite(list);
+        for (Map.Entry<String, List<XWPFParagraph>> entry : liteMap.entrySet()) {
+            String issueLiteIndex = entry.getKey();
+            Map<String, List<XWPFParagraph>> group = initGroup(list, TOPIC3);
+            IssueLite lite = new IssueLite();
+            Matcher matcher = issuePattern.matcher(issueLiteIndex);
+            if (issueLiteIndex.matches(LITE_QUESTION_PATTERN) && matcher.find()) {
+                String code = matcher.group();
+                log.info("parsing issue,code={}", code);
+                parseQuestion(lite, code, group.get(LITE_QUESTION_PATTERN));
+                parseAnswer(lite, group.get(ANSWER_PATTERN));
+            }
+            lites.add(lite);
+        }
+        issue.setLites(lites);
+        return issue;
+    }
+
+    /**
+     * 获取题干,并删除list里面的题干段落
+     *
+     * @param list 大题
+     * @return 题干
+     */
+    private String getTitle(List<XWPFParagraph> list) {
+        StringBuilder result = new StringBuilder();
+        Iterator<XWPFParagraph> it = list.iterator();
+        while (it.hasNext()) {
+            XWPFParagraph p = it.next();
+            //边遍历边删除
+            it.remove();
+            String text = p.getText();
+            if (text.matches(QUESTION_PATTERN)) {
+                continue;
+            }
+            result.append("<p>").append(text).append("</p>");
+            if (text.matches(LITE_QUESTION_PATTERN)) {
+                break;
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * 对小题进行分段
+     *
+     * @param ps 大题里面的所有小题
+     * @return 分段map
+     */
+    private Map<String, List<XWPFParagraph>> splitLite(List<XWPFParagraph> ps) {
+        Map<String, List<XWPFParagraph>> result = new LinkedHashMap<>();
+        String tag = "";
+        for (XWPFParagraph paragraph : ps) {
+            String text = paragraph.getText();
+            if (text.matches(LITE_QUESTION_PATTERN)) {
+                tag = text;
+            }
+            log.info("split lite,current tag is {},current text is {}", tag, text);
+            List<XWPFParagraph> list = result.getOrDefault(tag, new ArrayList<>());
+            list.add(paragraph);
+            result.put(tag, list);
+        }
+        return result;
+    }
+
+}

+ 40 - 0
src/main/java/com/yaoxiang/diagnosis/issue/IssueParseSingleMindHandler.java

@@ -0,0 +1,40 @@
+package com.yaoxiang.diagnosis.issue;
+
+import com.yaoxiang.diagnosis.entity.Issue;
+import com.yaoxiang.diagnosis.file.FileService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+
+@Slf4j
+@Component
+public class IssueParseSingleMindHandler extends IssueParseWordHandler implements IssueParseHandler {
+
+    public IssueParseSingleMindHandler(FileService fileService) {
+        super(fileService);
+    }
+
+    @Override
+    public int getSection() {
+        return 2;
+    }
+
+    @Override
+    public Issue parse(String issueIndex, List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
+        Issue issue = init(subjectId, grade, chapterId, getSection());
+        Map<String, List<XWPFParagraph>> group = initGroup(list, TOPIC2);
+
+        Matcher matcher = issuePattern.matcher(issueIndex);
+        if (issueIndex.matches(QUESTION_PATTERN) && matcher.find()) {
+            String code = matcher.group();
+            log.info("parsing issue,code={}", code);
+            parseQuestion(issue, code, group.get(QUESTION_PATTERN));
+            parseAnswer(issue, group.get(ANSWER_PATTERN));
+        }
+        return issue;
+    }
+}

+ 47 - 0
src/main/java/com/yaoxiang/diagnosis/issue/IssueParseWordHandler.java

@@ -0,0 +1,47 @@
+package com.yaoxiang.diagnosis.issue;
+
+import com.yaoxiang.diagnosis.entity.Issue;
+import com.yaoxiang.diagnosis.file.FileService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+
+@Slf4j
+@Component
+public class IssueParseWordHandler extends IssueParseAdapter implements IssueParseHandler {
+
+    public IssueParseWordHandler(FileService fileService) {
+        super(fileService);
+    }
+
+    @Override
+    public int getSection() {
+        return 1;
+    }
+
+    @Override
+    public Issue parse(String issueIndex, List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
+        Issue issue = init(subjectId, grade, chapterId, getSection());
+        Map<String, List<XWPFParagraph>> group = initGroup(list, TOPIC1);
+
+        Matcher matcher = issuePattern.matcher(issueIndex);
+        if (issueIndex.matches(QUESTION_PATTERN) && matcher.find()) {
+            String code = matcher.group();
+            log.info("parsing issue,code={}", code);
+            parseQuestion(issue, code, group.get(QUESTION_PATTERN));
+            parseAnswer(issue, group.get(ANSWER_PATTERN));
+            parseTag(issue, group.get(TAG_PATTERN));
+        }
+        return issue;
+    }
+
+    private void parseTag(Issue issue, List<XWPFParagraph> list) {
+        list.stream().filter(p -> StringUtils.isNotBlank(p.getText())).forEach(p -> issue.setTag(p.getText()));
+    }
+
+}

+ 7 - 2
src/main/java/com/yaoxiang/diagnosis/service/IssueLiteService.java

@@ -22,8 +22,13 @@ public class IssueLiteService {
     @Resource
     private IssueOptionService issueOptionService;
 
-    @Transactional
-    public boolean adds(List<IssueLite> list) {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addIssueLites(Long issueId, List<IssueLite> list) {
+        for (IssueLite lite : list) {
+            lite.setIssueId(issueId);
+            issueLiteDao.save(lite);
+            issueOptionService.addIssueLiteOptions(lite.getId(), lite.getOptions());
+        }
         return true;
     }
 

+ 10 - 3
src/main/java/com/yaoxiang/diagnosis/service/IssueOptionService.java

@@ -14,13 +14,20 @@ public class IssueOptionService {
     @Resource
     private IssueOptionDao issueOptionDao;
 
-    @Transactional
-    public boolean adds(Long issueId, List<IssueOption> options) {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addIssueOptions(Long issueId, List<IssueOption> options) {
         options.forEach(o -> o.setIssueId(issueId));
         issueOptionDao.saveAll(options);
         return true;
     }
 
+    @Transactional
+    public boolean addIssueLiteOptions(Long issueLiteId, List<IssueOption> options) {
+        options.forEach(o -> o.setIssueLiteId(issueLiteId));
+        issueOptionDao.saveAll(options);
+        return true;
+    }
+
     public List<IssueOption> findByIssueIds(List<Long> issueIds) {
         return issueOptionDao.findByIssueIdIn(issueIds);
     }
@@ -35,7 +42,7 @@ public class IssueOptionService {
         return true;
     }
 
-    public boolean deleteByIssueLiteIds(List<Long> issueLiteIds){
+    public boolean deleteByIssueLiteIds(List<Long> issueLiteIds) {
         List<IssueOption> list = findByIssueLitIds(issueLiteIds);
         issueOptionDao.deleteAll(list);
         return true;

+ 5 - 0
src/main/java/com/yaoxiang/diagnosis/service/IssueParseService.java

@@ -1,8 +1,10 @@
 package com.yaoxiang.diagnosis.service;
 
 import com.yaoxiang.diagnosis.entity.Issue;
+import com.yaoxiang.diagnosis.issue.IssueParseHandler;
 import com.yaoxiang.diagnosis.model.Result;
 import com.yaoxiang.diagnosis.word.WordUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.springframework.stereotype.Component;
@@ -15,6 +17,7 @@ import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Component
 public class IssueParseService {
 
@@ -42,7 +45,9 @@ public class IssueParseService {
     private List<Issue> parseIssues(XWPFDocument document, Long subjectId, String grade, Long chapterId, int section) {
         List<XWPFParagraph> paragraphs = document.getParagraphs();
         Assert.notEmpty(paragraphs, "未检测到段落,请检查上传的文档");
+        log.info("start parse issues,subjectId={},grade={},chapterId={},section={}", subjectId, grade, chapterId, section);
         List<Issue> result = handlerMap.get(section).parse(paragraphs, subjectId, grade, chapterId);
+        log.info("parse issue finished.");
         return result;
     }
 

+ 0 - 25
src/main/java/com/yaoxiang/diagnosis/service/IssueParseSingleMindHandler.java

@@ -1,25 +0,0 @@
-package com.yaoxiang.diagnosis.service;
-
-import com.yaoxiang.diagnosis.entity.Issue;
-import org.apache.poi.xwpf.usermodel.XWPFParagraph;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-public class IssueParseSingleMindHandler extends IssueParseAdapter implements IssueParseHandler {
-    @Override
-    void parseQuestion(Issue issue, String code, List<XWPFParagraph> ps) {
-
-    }
-
-    @Override
-    public int getSection() {
-        return 2;
-    }
-
-    @Override
-    public Issue parse(String issueIndex, List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
-        return null;
-    }
-}

+ 0 - 103
src/main/java/com/yaoxiang/diagnosis/service/IssueParseWordHandler.java

@@ -1,103 +0,0 @@
-package com.yaoxiang.diagnosis.service;
-
-import com.yaoxiang.diagnosis.config.Constants;
-import com.yaoxiang.diagnosis.entity.Issue;
-import com.yaoxiang.diagnosis.entity.IssueOption;
-import com.yaoxiang.diagnosis.word.WordUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.xwpf.usermodel.XWPFParagraph;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.util.Assert;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-
-@Component
-public class IssueParseWordHandler extends IssueParseAdapter implements IssueParseHandler {
-
-    private static final Logger logger = LoggerFactory.getLogger(IssueParseWordHandler.class);
-
-    @Override
-    public int getSection() {
-        return 1;
-    }
-
-    @Override
-    public Issue parse(String issueIndex, List<XWPFParagraph> list, Long subjectId, String grade, Long chapterId) {
-        Issue issue = init(subjectId, grade, chapterId, getSection());
-        Map<String, List<XWPFParagraph>> group = initGroup(list, TOPIC1);
-
-        Matcher matcher = issuePattern.matcher(issueIndex);
-        if (issueIndex.matches(QUESTION_PATTERN) && matcher.find()) {
-            String code = matcher.group();
-            logger.info("parsing issue,code={}", code);
-            parseQuestion(issue, code, group.get(QUESTION_PATTERN));
-            parseAnswer(issue, group.get(ANSWER_PATTERN));
-            parseTag(issue, group.get(TAG_PATTERN));
-        }
-        return issue;
-    }
-
-    private void parseTag(Issue issue, List<XWPFParagraph> list) {
-        list.stream().filter(p -> StringUtils.isNotBlank(p.getText())).forEach(p -> issue.setTag(p.getText()));
-    }
-
-    public void parseQuestion(Issue issue, String code, List<XWPFParagraph> ps) {
-        List<IssueOption> options = new ArrayList<>();
-        int i = 0;
-        StringBuilder content = new StringBuilder();
-        boolean hasFormula = false;
-        String index = "";
-        Map<String, List<XWPFParagraph>> indexMap = new LinkedHashMap<>();
-        boolean isQuestion = true;
-        for (XWPFParagraph p : ps) {
-
-            String text = p.getText();
-            if (WordUtil.notContent(p, text)) {
-                continue;
-            }
-            //清除掉#Small#
-            text = text.replaceAll(PICTURE_PATTERN, "");
-            if (text.matches(OPTION_PATTERN)) {
-                isQuestion = false;
-                index = text;
-            }
-
-            if (isQuestion) {
-                content.append("<p>").append(text).append("</p>");
-                continue;
-            }
-            List<XWPFParagraph> list = indexMap.getOrDefault(index, new ArrayList<>());
-            list.add(p);
-            indexMap.put(index, list);
-
-        }
-
-        for (Map.Entry<String, List<XWPFParagraph>> entry : indexMap.entrySet()) {
-            StringBuilder builder = new StringBuilder();
-            for (XWPFParagraph p : entry.getValue()) {
-                builder.append("<p>").append(p.getText()).append("</p>");
-            }
-            String text = builder.toString();
-            IssueOption option = initOption(i++, issue.getSection(), text);
-            String optionNoContent = String.format("parseQuestion,题号为%s的题目选项 %s 未检测到内容,题目内容为“%s”,请检查选项结构", code, text, content);
-            Assert.hasText(option.getContent(), optionNoContent);
-            options.add(option);
-        }
-
-        String noContent = String.format("parseQuestion,题号为 %s 的题目未检测到题干,题目内容为 “%s” ,请检查", code, content);
-        String noOptions = String.format("parseQuestion,题号为 %s 的题目未检测到选项,题目内容为 “%s” ,请检查", code, content);
-        String lostOptions = String.format("parseQuestion,题号为 %s 的题目检测到选项数量为 %s ,题目内容为 “%s” ,请检查选项换行情况", code, options.size(), content);
-        Assert.hasText(content.toString(), noContent);
-        Assert.notEmpty(options, noOptions);
-        //TODO 选项数量可能不止5个?
-        Assert.isTrue(options.size() >= Constants.OPTION_NUMS, lostOptions);
-        issue.setContent(content.toString());
-        issue.setOptions(options);
-    }
-}

+ 4 - 3
src/main/java/com/yaoxiang/diagnosis/service/IssueService.java

@@ -29,11 +29,12 @@ public class IssueService {
 
     @Transactional(rollbackFor = Exception.class)
     public boolean adds(List<Issue> list) {
+        log.info("save issues,size={}", list.size());
         List<Issue> data = issueDao.saveAll(list);
         for (Issue issue : data) {
-            issueOptionService.adds(issue.getId(), issue.getOptions());
-            if (issue.getSection() > 1) {
-                issueLiteService.adds(issue.getLites());
+            issueOptionService.addIssueOptions(issue.getId(), issue.getOptions());
+            if (issue.getSection() == 3) {
+                issueLiteService.addIssueLites(issue.getId(), issue.getLites());
             }
         }
         return true;