Browse Source

修复模块二三试题上传bug

Feick 3 năm trước cách đây
mục cha
commit
1424fa3226

+ 1 - 1
deployment.yaml

@@ -25,7 +25,7 @@ spec:
     spec:
       containers:
         - args:
-            - --spring.profiles.active=docker
+            - --spring.profiles.active=dev
           image: feick/diagnosis:${date}
           imagePullPolicy: IfNotPresent
           name: diagnosis

+ 10 - 4
src/main/java/com/yaoxiang/diagnosis/controller/IssueController.java

@@ -1,15 +1,14 @@
 package com.yaoxiang.diagnosis.controller;
 
+import com.yaoxiang.diagnosis.entity.Issue;
 import com.yaoxiang.diagnosis.service.IssueService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @Slf4j
 @Api(tags = "组合卷题目")
@@ -28,4 +27,11 @@ public class IssueController {
         return issueService.delete(subjectId, grade, chapterId, section);
     }
 
+    @GetMapping("listBySection")
+    @ApiOperation("根据科目Id、年级和模块获取所有题目")
+    public List<Issue> listBySection(@RequestParam(defaultValue = "2") Long subjectId,
+                                     String grade, int section) {
+        return issueService.listBySection(subjectId, grade, section);
+    }
+
 }

+ 13 - 0
src/main/java/com/yaoxiang/diagnosis/entity/Issue.java

@@ -30,6 +30,9 @@ public class Issue extends BaseIssue {
     @Column
     private Long chapterId;
 
+    @ApiModelProperty("题目编号,模块一编号会在组卷里面重新编号")
+    private Integer number;
+
     @Column
     private String grade;
 
@@ -54,9 +57,11 @@ public class Issue extends BaseIssue {
     private Date updatetime;
 
     @Transient
+    @ApiModelProperty("题目选项,模块一二使用,模块三忽略")
     private List<IssueOption> options;
 
     @Transient
+    @ApiModelProperty("题目小题,模块三使用")
     private List<IssueLite> lites;
 
     public Long getId() {
@@ -91,6 +96,14 @@ public class Issue extends BaseIssue {
         this.chapterId = chapterId;
     }
 
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
     public String getGrade() {
         return grade;
     }

+ 15 - 1
src/main/java/com/yaoxiang/diagnosis/entity/IssueLite.java

@@ -2,6 +2,7 @@ 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;
 import org.hibernate.annotations.UpdateTimestamp;
 
@@ -10,7 +11,7 @@ import java.util.Date;
 import java.util.List;
 
 @Entity
-@ApiModel("模块三的小题")
+@ApiModel("模块三的小题")
 public class IssueLite extends BaseIssue {
 
     @Id
@@ -21,8 +22,12 @@ public class IssueLite extends BaseIssue {
 
     private Integer correctNum;
 
+    @ApiModelProperty("题目编号")
+    private Integer number;
+
     private String answer;
 
+    @ApiModelProperty("大题Id")
     private Long issueId;
 
     @CreationTimestamp
@@ -33,6 +38,7 @@ public class IssueLite extends BaseIssue {
     private Date updatetime;
 
     @Transient
+    @ApiModelProperty("模块三题目选项")
     private List<IssueOption> options;
 
     public Long getId() {
@@ -61,6 +67,14 @@ public class IssueLite extends BaseIssue {
         this.correctNum = correctNum;
     }
 
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
     public String getAnswer() {
         return answer;
     }

+ 15 - 5
src/main/java/com/yaoxiang/diagnosis/issue/BaseIssue.java

@@ -7,16 +7,18 @@ import java.util.List;
 
 public class BaseIssue {
 
-    private String content;
+    protected String content;
 
-    private Integer section;
+    protected Integer section;
 
-    private Integer correctNum;
+    protected Integer correctNum;
 
-    private String answer;
+    protected Integer number;
+
+    protected String answer;
 
     @Transient
-    private List<IssueOption> options;
+    protected List<IssueOption> options;
 
     public String getContent() {
         return content;
@@ -42,6 +44,14 @@ public class BaseIssue {
         this.correctNum = correctNum;
     }
 
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
     public String getAnswer() {
         return answer;
     }

+ 2 - 1
src/main/java/com/yaoxiang/diagnosis/issue/IssueParseAdapter.java

@@ -91,6 +91,7 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
         Assert.notEmpty(options, noOptions);
         //TODO 选项数量可能不止5个?
         Assert.isTrue(options.size() >= Constants.OPTION_NUMS, lostOptions);
+        issue.setNumber(Integer.valueOf(code));
         issue.setContent(content.toString());
         issue.setOptions(options);
     }
@@ -127,7 +128,7 @@ public abstract class IssueParseAdapter implements IssueParseHandler {
             //识别上下标
             WordUtil.parseSubScript(paragraph);
             //识别图片
-            WordUtil.parsePicture(paragraph, PICTURE_PATTERN, (data, fileName) -> fileService.upload(data, fileName));
+            WordUtil.parsePicture(paragraph, PICTURE_PATTERN, fileService::upload);
             //识别公式
             WordUtil.parseFormula(paragraph);
             //重新获取text

+ 14 - 8
src/main/java/com/yaoxiang/diagnosis/issue/IssueParseMultiMindHandler.java

@@ -68,15 +68,21 @@ public class IssueParseMultiMindHandler extends IssueParseAdapter implements Iss
         Issue issue = init(subjectId, grade, chapterId, getSection());
         String title = getTitle(list);
         issue.setContent(title);
+        Matcher issueMatcher = issuePattern.matcher(issueIndex);
+        if(issueMatcher.find()) {
+            String code = issueMatcher.group();
+            issue.setNumber(Integer.valueOf(code));
+        }
         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);
+            Map<String, List<XWPFParagraph>> group = initGroup(entry.getValue(), TOPIC3);
             IssueLite lite = new IssueLite();
-            Matcher matcher = issuePattern.matcher(issueLiteIndex);
-            if (issueLiteIndex.matches(LITE_QUESTION_PATTERN) && matcher.find()) {
-                String code = matcher.group();
+            lite.setSection(getSection());
+            Matcher issueLiteMatcher = issuePattern.matcher(issueLiteIndex);
+            if (issueLiteIndex.matches(LITE_QUESTION_PATTERN) && issueLiteMatcher.find()) {
+                String code = issueLiteMatcher.group();
                 log.info("parsing issue,code={}", code);
                 parseQuestion(lite, code, group.get(LITE_QUESTION_PATTERN));
                 parseAnswer(lite, group.get(ANSWER_PATTERN));
@@ -99,15 +105,15 @@ public class IssueParseMultiMindHandler extends IssueParseAdapter implements Iss
         while (it.hasNext()) {
             XWPFParagraph p = it.next();
             //边遍历边删除
-            it.remove();
             String text = p.getText();
+            if (text.matches(LITE_QUESTION_PATTERN)) {
+                break;
+            }
+            it.remove();
             if (text.matches(QUESTION_PATTERN)) {
                 continue;
             }
             result.append("<p>").append(text).append("</p>");
-            if (text.matches(LITE_QUESTION_PATTERN)) {
-                break;
-            }
         }
         return result.toString();
     }

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

@@ -31,6 +31,7 @@ public class IssueParseSingleMindHandler extends IssueParseWordHandler implement
         Matcher matcher = issuePattern.matcher(issueIndex);
         if (issueIndex.matches(QUESTION_PATTERN) && matcher.find()) {
             String code = matcher.group();
+            issue.setNumber(Integer.valueOf(code));
             log.info("parsing issue,code={}", code);
             parseQuestion(issue, code, group.get(QUESTION_PATTERN));
             parseAnswer(issue, group.get(ANSWER_PATTERN));

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

@@ -33,6 +33,7 @@ public class IssueParseWordHandler extends IssueParseAdapter implements IssuePar
         if (issueIndex.matches(QUESTION_PATTERN) && matcher.find()) {
             String code = matcher.group();
             log.info("parsing issue,code={}", code);
+            issue.setNumber(Integer.valueOf(code));
             parseQuestion(issue, code, group.get(QUESTION_PATTERN));
             parseAnswer(issue, group.get(ANSWER_PATTERN));
             parseTag(issue, group.get(TAG_PATTERN));

+ 3 - 0
src/main/java/com/yaoxiang/diagnosis/service/IssueLiteService.java

@@ -3,6 +3,7 @@ package com.yaoxiang.diagnosis.service;
 import com.yaoxiang.diagnosis.dao.IssueLiteDao;
 import com.yaoxiang.diagnosis.entity.IssueLite;
 import com.yaoxiang.diagnosis.entity.IssueOption;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -13,6 +14,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class IssueLiteService {
 
@@ -24,6 +26,7 @@ public class IssueLiteService {
 
     @Transactional(rollbackFor = Exception.class)
     public boolean addIssueLites(Long issueId, List<IssueLite> list) {
+        log.info("add issue lites,issueId={},size={}", issueId, list.size());
         for (IssueLite lite : list) {
             lite.setIssueId(issueId);
             issueLiteDao.save(lite);

+ 19 - 5
src/main/java/com/yaoxiang/diagnosis/service/IssueService.java

@@ -30,13 +30,15 @@ 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.addIssueOptions(issue.getId(), issue.getOptions());
+        issueDao.saveAll(list);
+        for (Issue issue : list) {
             if (issue.getSection() == 3) {
                 issueLiteService.addIssueLites(issue.getId(), issue.getLites());
+            } else {
+                issueOptionService.addIssueOptions(issue.getId(), issue.getOptions());
             }
         }
+        log.info("add issues finish,size={}", list.size());
         return true;
     }
 
@@ -132,7 +134,7 @@ public class IssueService {
      * @param section   2
      * @return result
      */
-    private List<Issue> listWithOption(Long subjectId, String grade, int section) {
+    public List<Issue> listWithOption(Long subjectId, String grade, int section) {
         List<Issue> list = list(subjectId, grade, section);
         List<IssueOption> options = issueOptionService.findByIssueIds(list.stream().map(Issue::getId).collect(Collectors.toList()));
         options.sort(Comparator.comparing(IssueOption::getIssueId));
@@ -156,7 +158,9 @@ public class IssueService {
         List<IssueLite> lites = issueLiteService.listAll(list.stream().map(Issue::getId).collect(Collectors.toList()));
         Map<Long, List<IssueLite>> group = lites.stream().collect(Collectors.groupingBy(IssueLite::getIssueId));
         for (Issue issue : list) {
-            issue.setLites(group.getOrDefault(issue.getId(), new ArrayList<>()));
+            List<IssueLite> liteGroup = group.getOrDefault(issue.getId(), new ArrayList<>());
+            liteGroup.forEach(it -> it.setNumber((it.getNumber() - 1) % liteGroup.size() + 1));
+            issue.setLites(liteGroup);
         }
         return list;
     }
@@ -184,4 +188,14 @@ public class IssueService {
         return issueDao.findBySubjectIdAndGradeAndSection(subjectId, grade, section);
     }
 
+    public List<Issue> listBySection(Long subjectId, String grade, int section) {
+        switch (section) {
+            case 1:
+            case 2:
+                return listWithOption(subjectId, grade, section);
+            case 3:
+                return listWithLite(subjectId, grade, section);
+        }
+        return new ArrayList<>();
+    }
 }