瀏覽代碼

feat(server): 笔记收藏扩展

Go 4 年之前
父節點
當前提交
bb62aa4af4
共有 45 個文件被更改,包括 1255 次插入458 次删除
  1. 1 1
      front/project/Constant.js
  2. 1 3
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperModule.java
  3. 22 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperOrigin.java
  4. 2 5
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/QuestionModule.java
  5. 6 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/user/AskTarget.java
  6. 16 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourse.java
  7. 7 7
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaper.java
  8. 16 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/PreviewPaper.java
  9. 16 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserAskQuestion.java
  10. 16 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCollectQuestion.java
  11. 255 21
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserNoteQuestion.java
  12. 39 39
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaper.java
  13. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserQuestion.java
  14. 54 19
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java
  15. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseMapper.xml
  16. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/PreviewPaperMapper.xml
  17. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskQuestionMapper.xml
  18. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCollectQuestionMapper.xml
  19. 13 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserNoteQuestionMapper.xml
  20. 3 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperMapper.xml
  21. 3 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserQuestionMapper.xml
  22. 5 4
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml
  23. 14 7
      server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java
  24. 28 6
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml
  25. 93 24
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  26. 8 7
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  27. 14 2
      server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java
  28. 9 9
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionExtendDto.java
  29. 9 41
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionNoExtendDto.java
  30. 132 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserNoteExtendDto.java
  31. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserAskDto.java
  32. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserCollectDto.java
  33. 1 1
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserErrorBindDto.java
  34. 50 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserNoteDto.java
  35. 143 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserNoteDetailDto.java
  36. 9 9
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionDetailDto.java
  37. 19 9
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserReportBaseDto.java
  38. 5 3
      server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java
  39. 37 1
      server/gateway-api/src/main/java/com/qxgmat/service/UserNoteQuestionService.java
  40. 14 9
      server/gateway-api/src/main/java/com/qxgmat/service/UserPaperService.java
  41. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/annotation/InitPaper.java
  42. 98 141
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java
  43. 2 2
      server/gateway-api/src/main/java/com/qxgmat/service/inline/RankService.java
  44. 15 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserPaperQuestionService.java
  45. 16 6
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java

+ 1 - 1
front/project/Constant.js

@@ -8,7 +8,7 @@ export const TextbookType = [{ label: 'PS/数学', value: 'ps' }, { label: 'DS/
 
 export const MoneyRange = [{ label: '0', value: 0 }, { label: '1-1000', value: 1 }, { label: '1000-5000', value: 2 }, { label: '5000-10000', value: 3 }, { label: '10000以上', value: 4 }];
 
-export const AskTarget = [{ label: '题目', value: 'question' }, { label: '官方', value: 'official' }, { label: '千行解析', value: 'qx' }, { label: '题源联想', value: 'association' }];
+export const AskTarget = [{ label: '题目', value: 'question' }, { label: '官方', value: 'official' }, { label: '千行解析', value: 'qx' }, { label: '题源联想', value: 'association' }, { label: '相关问答', value: 'qa' }];
 
 export const PreviewStatus = [{ label: '全部', value: 0 }, { label: '未开始', value: 1 }, { label: '进行中', value: 2 }, { label: '已结束', value: 3 }];
 

+ 1 - 3
server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperModule.java

@@ -1,11 +1,9 @@
 package com.qxgmat.data.constants.enums.module;
 
+// 组卷模块
 public enum PaperModule {
     EXERCISE("exercise"),
     EXAMINATION("examination"),
-    COLLECT("collect"),
-    ERROR("error"),
-    PREVIEW("preview"),
     TEXTBOOK("textbook"),
     SENTENCE("sentence"),
     ;

+ 22 - 0
server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperOrigin.java

@@ -0,0 +1,22 @@
+package com.qxgmat.data.constants.enums.module;
+
+// 组卷来源
+public enum PaperOrigin {
+    EXERCISE("exercise"),
+    EXAMINATION("examination"),
+    COLLECT("collect"),
+    ERROR("error"),
+    PREVIEW("preview"),
+    TEXTBOOK("textbook"),
+    SENTENCE("sentence"),
+    ;
+    public String key;
+    private PaperOrigin(String key){
+        this.key = key;
+    }
+
+    public static PaperOrigin ValueOf(String name){
+        if (name == null) return null;
+        return PaperOrigin.valueOf(name.toUpperCase());
+    }
+}

+ 2 - 5
server/data/src/main/java/com/qxgmat/data/constants/enums/module/QuestionModule.java

@@ -1,9 +1,9 @@
 package com.qxgmat.data.constants.enums.module;
 
 public enum QuestionModule {
-    BASE("base"), // 练习、模考、错题、收藏、预习作业
-    TEXTBOOK("textbook"), // 机经
+    BASE("base"), // 练习、模考
     SENTENCE("sentence"), // 长难句
+    TEXTBOOK("textbook"), // 机经
     ;
     public String key;
     private QuestionModule(String key){
@@ -26,11 +26,8 @@ public enum QuestionModule {
                 return SENTENCE;
             case TEXTBOOK:
                 return TEXTBOOK;
-            case ERROR:
-            case COLLECT:
             case EXERCISE:
             case EXAMINATION:
-            case PREVIEW:
                 return BASE;
             default:
                 return null;

+ 6 - 1
server/data/src/main/java/com/qxgmat/data/constants/enums/user/AskTarget.java

@@ -2,7 +2,12 @@ package com.qxgmat.data.constants.enums.user;
 
 
 public enum AskTarget {
-    QUESTION("question"), OFFICIAL("official"), QX("qx"), ASSOCIATION("association");
+    QUESTION("question"),
+    OFFICIAL("official"),
+    QX("qx"),
+    ASSOCIATION("association"),
+    QA("qa"),
+    ;
     public String key;
     private AskTarget(String key){
         this.key = key;

+ 16 - 16
server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourse.java

@@ -24,10 +24,10 @@ public class ClassCourse implements Serializable {
     private Integer parentStructId;
 
     /**
-     * 题目模块:base,sentence,textbook
+     * 题型:从struct上获取extend
      */
-    @Column(name = "`question_module`")
-    private String questionModule;
+    @Column(name = "`question_type`")
+    private String questionType;
 
     /**
      * 课程名称
@@ -91,21 +91,21 @@ public class ClassCourse implements Serializable {
     }
 
     /**
-     * 获取题目模块:base,sentence,textbook
+     * 获取题型:从struct上获取extend
      *
-     * @return question_module - 题目模块:base,sentence,textbook
+     * @return question_type - 题型:从struct上获取extend
      */
-    public String getQuestionModule() {
-        return questionModule;
+    public String getQuestionType() {
+        return questionType;
     }
 
     /**
-     * 设置题目模块:base,sentence,textbook
+     * 设置题型:从struct上获取extend
      *
-     * @param questionModule 题目模块:base,sentence,textbook
+     * @param questionType 题型:从struct上获取extend
      */
-    public void setQuestionModule(String questionModule) {
-        this.questionModule = questionModule;
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
     }
 
     /**
@@ -149,7 +149,7 @@ public class ClassCourse implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", structId=").append(structId);
         sb.append(", parentStructId=").append(parentStructId);
-        sb.append(", questionModule=").append(questionModule);
+        sb.append(", questionType=").append(questionType);
         sb.append(", title=").append(title);
         sb.append(", createTime=").append(createTime);
         sb.append("]");
@@ -196,12 +196,12 @@ public class ClassCourse implements Serializable {
         }
 
         /**
-         * 设置题目模块:base,sentence,textbook
+         * 设置题型:从struct上获取extend
          *
-         * @param questionModule 题目模块:base,sentence,textbook
+         * @param questionType 题型:从struct上获取extend
          */
-        public Builder questionModule(String questionModule) {
-            obj.setQuestionModule(questionModule);
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
             return this;
         }
 

+ 7 - 7
server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaper.java

@@ -11,7 +11,7 @@ public class ExercisePaper implements Serializable {
     private Integer id;
 
     /**
-     * 题型
+     * 题型:从struct上获取extend
      */
     @Column(name = "`question_type`")
     private String questionType;
@@ -87,18 +87,18 @@ public class ExercisePaper implements Serializable {
     }
 
     /**
-     * 获取题型
+     * 获取题型:从struct上获取extend
      *
-     * @return question_type - 题型
+     * @return question_type - 题型:从struct上获取extend
      */
     public String getQuestionType() {
         return questionType;
     }
 
     /**
-     * 设置题型
+     * 设置题型:从struct上获取extend
      *
-     * @param questionType 题型
+     * @param questionType 题型:从struct上获取extend
      */
     public void setQuestionType(String questionType) {
         this.questionType = questionType;
@@ -307,9 +307,9 @@ public class ExercisePaper implements Serializable {
         }
 
         /**
-         * 设置题型
+         * 设置题型:从struct上获取extend
          *
-         * @param questionType 题型
+         * @param questionType 题型:从struct上获取extend
          */
         public Builder questionType(String questionType) {
             obj.setQuestionType(questionType);

+ 16 - 16
server/data/src/main/java/com/qxgmat/data/dao/entity/PreviewPaper.java

@@ -42,10 +42,10 @@ public class PreviewPaper implements Serializable {
     private Integer mode;
 
     /**
-     * 题目模块:base,preview,textbook
+     * 题目类型
      */
-    @Column(name = "`question_module`")
-    private String questionModule;
+    @Column(name = "`question_type`")
+    private String questionType;
 
     /**
      * 制定作业用户id:json
@@ -184,21 +184,21 @@ public class PreviewPaper implements Serializable {
     }
 
     /**
-     * 获取题目模块:base,preview,textbook
+     * 获取题目类型
      *
-     * @return question_module - 题目模块:base,preview,textbook
+     * @return question_type - 题目类型
      */
-    public String getQuestionModule() {
-        return questionModule;
+    public String getQuestionType() {
+        return questionType;
     }
 
     /**
-     * 设置题目模块:base,preview,textbook
+     * 设置题目类型
      *
-     * @param questionModule 题目模块:base,preview,textbook
+     * @param questionType 题目类型
      */
-    public void setQuestionModule(String questionModule) {
-        this.questionModule = questionModule;
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
     }
 
     /**
@@ -313,7 +313,7 @@ public class PreviewPaper implements Serializable {
         sb.append(", courseNo=").append(courseNo);
         sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", mode=").append(mode);
-        sb.append(", questionModule=").append(questionModule);
+        sb.append(", questionType=").append(questionType);
         sb.append(", userIds=").append(userIds);
         sb.append(", startTime=").append(startTime);
         sb.append(", endTime=").append(endTime);
@@ -394,12 +394,12 @@ public class PreviewPaper implements Serializable {
         }
 
         /**
-         * 设置题目模块:base,preview,textbook
+         * 设置题目类型
          *
-         * @param questionModule 题目模块:base,preview,textbook
+         * @param questionType 题目类型
          */
-        public Builder questionModule(String questionModule) {
-            obj.setQuestionModule(questionModule);
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
             return this;
         }
 

+ 16 - 16
server/data/src/main/java/com/qxgmat/data/dao/entity/UserAskQuestion.java

@@ -18,10 +18,10 @@ public class UserAskQuestion implements Serializable {
     private Integer userId;
 
     /**
-     * 模块:题目模块
+     * 题目模块
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`question_module`")
+    private String questionModule;
 
     /**
      * 题目id
@@ -124,21 +124,21 @@ public class UserAskQuestion implements Serializable {
     }
 
     /**
-     * 获取模块:题目模块
+     * 获取题目模块
      *
-     * @return module - 模块:题目模块
+     * @return question_module - 题目模块
      */
-    public String getModule() {
-        return module;
+    public String getQuestionModule() {
+        return questionModule;
     }
 
     /**
-     * 设置模块:题目模块
+     * 设置题目模块
      *
-     * @param module 模块:题目模块
+     * @param questionModule 题目模块
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
     }
 
     /**
@@ -357,7 +357,7 @@ public class UserAskQuestion implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
-        sb.append(", module=").append(module);
+        sb.append(", questionModule=").append(questionModule);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", target=").append(target);
@@ -404,12 +404,12 @@ public class UserAskQuestion implements Serializable {
         }
 
         /**
-         * 设置模块:题目模块
+         * 设置题目模块
          *
-         * @param module 模块:题目模块
+         * @param questionModule 题目模块
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
             return this;
         }
 

+ 16 - 16
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCollectQuestion.java

@@ -18,10 +18,10 @@ public class UserCollectQuestion implements Serializable {
     private Integer userId;
 
     /**
-     * 模块:exercise, examination, sentence
+     * 模块:base, sentence, textbook
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`question_module`")
+    private String questionModule;
 
     /**
      * 题目id
@@ -73,21 +73,21 @@ public class UserCollectQuestion implements Serializable {
     }
 
     /**
-     * 获取模块:exercise, examination, sentence
+     * 获取模块:base, sentence, textbook
      *
-     * @return module - 模块:exercise, examination, sentence
+     * @return question_module - 模块:base, sentence, textbook
      */
-    public String getModule() {
-        return module;
+    public String getQuestionModule() {
+        return questionModule;
     }
 
     /**
-     * 设置模块:exercise, examination, sentence
+     * 设置模块:base, sentence, textbook
      *
-     * @param module 模块:exercise, examination, sentence
+     * @param questionModule 模块:base, sentence, textbook
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
     }
 
     /**
@@ -148,7 +148,7 @@ public class UserCollectQuestion implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
-        sb.append(", module=").append(module);
+        sb.append(", questionModule=").append(questionModule);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", createTime=").append(createTime);
@@ -186,12 +186,12 @@ public class UserCollectQuestion implements Serializable {
         }
 
         /**
-         * 设置模块:exercise, examination, sentence
+         * 设置模块:base, sentence, textbook
          *
-         * @param module 模块:exercise, examination, sentence
+         * @param questionModule 模块:base, sentence, textbook
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
             return this;
         }
 

+ 255 - 21
server/data/src/main/java/com/qxgmat/data/dao/entity/UserNoteQuestion.java

@@ -18,10 +18,10 @@ public class UserNoteQuestion implements Serializable {
     private Integer userId;
 
     /**
-     * 模块:exercise, exaination, sentence
+     * 模块:exercise, exaination, sentence, textbook
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`question_module`")
+    private String questionModule;
 
     /**
      * 题目id
@@ -35,18 +35,45 @@ public class UserNoteQuestion implements Serializable {
     @Column(name = "`question_no_id`")
     private Integer questionNoId;
 
+    @Column(name = "`content_time`")
+    private Date contentTime;
+
+    @Column(name = "`official_time`")
+    private Date officialTime;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
     @Column(name = "`update_time`")
     private Date updateTime;
 
+    @Column(name = "`qx_time`")
+    private Date qxTime;
+
+    @Column(name = "`association_time`")
+    private Date associationTime;
+
+    @Column(name = "`qa_time`")
+    private Date qaTime;
+
     /**
      * 笔记内容
      */
     @Column(name = "`content`")
     private String content;
 
+    @Column(name = "`official_content`")
+    private String officialContent;
+
+    @Column(name = "`qx_content`")
+    private String qxContent;
+
+    @Column(name = "`association_content`")
+    private String associationContent;
+
+    @Column(name = "`qa_content`")
+    private String qaContent;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -82,21 +109,21 @@ public class UserNoteQuestion implements Serializable {
     }
 
     /**
-     * 获取模块:exercise, exaination, sentence
+     * 获取模块:exercise, exaination, sentence, textbook
      *
-     * @return module - 模块:exercise, exaination, sentence
+     * @return question_module - 模块:exercise, exaination, sentence, textbook
      */
-    public String getModule() {
-        return module;
+    public String getQuestionModule() {
+        return questionModule;
     }
 
     /**
-     * 设置模块:exercise, exaination, sentence
+     * 设置模块:exercise, exaination, sentence, textbook
      *
-     * @param module 模块:exercise, exaination, sentence
+     * @param questionModule 模块:exercise, exaination, sentence, textbook
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
     }
 
     /**
@@ -136,6 +163,34 @@ public class UserNoteQuestion implements Serializable {
     }
 
     /**
+     * @return content_time
+     */
+    public Date getContentTime() {
+        return contentTime;
+    }
+
+    /**
+     * @param contentTime
+     */
+    public void setContentTime(Date contentTime) {
+        this.contentTime = contentTime;
+    }
+
+    /**
+     * @return official_time
+     */
+    public Date getOfficialTime() {
+        return officialTime;
+    }
+
+    /**
+     * @param officialTime
+     */
+    public void setOfficialTime(Date officialTime) {
+        this.officialTime = officialTime;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -164,6 +219,48 @@ public class UserNoteQuestion implements Serializable {
     }
 
     /**
+     * @return qx_time
+     */
+    public Date getQxTime() {
+        return qxTime;
+    }
+
+    /**
+     * @param qxTime
+     */
+    public void setQxTime(Date qxTime) {
+        this.qxTime = qxTime;
+    }
+
+    /**
+     * @return association_time
+     */
+    public Date getAssociationTime() {
+        return associationTime;
+    }
+
+    /**
+     * @param associationTime
+     */
+    public void setAssociationTime(Date associationTime) {
+        this.associationTime = associationTime;
+    }
+
+    /**
+     * @return qa_time
+     */
+    public Date getQaTime() {
+        return qaTime;
+    }
+
+    /**
+     * @param qaTime
+     */
+    public void setQaTime(Date qaTime) {
+        this.qaTime = qaTime;
+    }
+
+    /**
      * 获取笔记内容
      *
      * @return content - 笔记内容
@@ -181,6 +278,62 @@ public class UserNoteQuestion implements Serializable {
         this.content = content;
     }
 
+    /**
+     * @return official_content
+     */
+    public String getOfficialContent() {
+        return officialContent;
+    }
+
+    /**
+     * @param officialContent
+     */
+    public void setOfficialContent(String officialContent) {
+        this.officialContent = officialContent;
+    }
+
+    /**
+     * @return qx_content
+     */
+    public String getQxContent() {
+        return qxContent;
+    }
+
+    /**
+     * @param qxContent
+     */
+    public void setQxContent(String qxContent) {
+        this.qxContent = qxContent;
+    }
+
+    /**
+     * @return association_content
+     */
+    public String getAssociationContent() {
+        return associationContent;
+    }
+
+    /**
+     * @param associationContent
+     */
+    public void setAssociationContent(String associationContent) {
+        this.associationContent = associationContent;
+    }
+
+    /**
+     * @return qa_content
+     */
+    public String getQaContent() {
+        return qaContent;
+    }
+
+    /**
+     * @param qaContent
+     */
+    public void setQaContent(String qaContent) {
+        this.qaContent = qaContent;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -189,12 +342,21 @@ public class UserNoteQuestion implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
-        sb.append(", module=").append(module);
+        sb.append(", questionModule=").append(questionModule);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
+        sb.append(", contentTime=").append(contentTime);
+        sb.append(", officialTime=").append(officialTime);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
+        sb.append(", qxTime=").append(qxTime);
+        sb.append(", associationTime=").append(associationTime);
+        sb.append(", qaTime=").append(qaTime);
         sb.append(", content=").append(content);
+        sb.append(", officialContent=").append(officialContent);
+        sb.append(", qxContent=").append(qxContent);
+        sb.append(", associationContent=").append(associationContent);
+        sb.append(", qaContent=").append(qaContent);
         sb.append("]");
         return sb.toString();
     }
@@ -229,12 +391,12 @@ public class UserNoteQuestion implements Serializable {
         }
 
         /**
-         * 设置模块:exercise, exaination, sentence
+         * 设置模块:exercise, exaination, sentence, textbook
          *
-         * @param module 模块:exercise, exaination, sentence
+         * @param questionModule 模块:exercise, exaination, sentence, textbook
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
             return this;
         }
 
@@ -259,6 +421,32 @@ public class UserNoteQuestion implements Serializable {
         }
 
         /**
+         * 设置笔记内容
+         *
+         * @param content 笔记内容
+         */
+        public Builder content(String content) {
+            obj.setContent(content);
+            return this;
+        }
+
+        /**
+         * @param contentTime
+         */
+        public Builder contentTime(Date contentTime) {
+            obj.setContentTime(contentTime);
+            return this;
+        }
+
+        /**
+         * @param officialTime
+         */
+        public Builder officialTime(Date officialTime) {
+            obj.setOfficialTime(officialTime);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {
@@ -275,12 +463,58 @@ public class UserNoteQuestion implements Serializable {
         }
 
         /**
-         * 设置笔记内容
-         *
-         * @param content 笔记内容
+         * @param qxTime
          */
-        public Builder content(String content) {
-            obj.setContent(content);
+        public Builder qxTime(Date qxTime) {
+            obj.setQxTime(qxTime);
+            return this;
+        }
+
+        /**
+         * @param associationTime
+         */
+        public Builder associationTime(Date associationTime) {
+            obj.setAssociationTime(associationTime);
+            return this;
+        }
+
+        /**
+         * @param qaTime
+         */
+        public Builder qaTime(Date qaTime) {
+            obj.setQaTime(qaTime);
+            return this;
+        }
+
+        /**
+         * @param officialContent
+         */
+        public Builder officialContent(String officialContent) {
+            obj.setOfficialContent(officialContent);
+            return this;
+        }
+
+        /**
+         * @param qxContent
+         */
+        public Builder qxContent(String qxContent) {
+            obj.setQxContent(qxContent);
+            return this;
+        }
+
+        /**
+         * @param associationContent
+         */
+        public Builder associationContent(String associationContent) {
+            obj.setAssociationContent(associationContent);
+            return this;
+        }
+
+        /**
+         * @param qaContent
+         */
+        public Builder qaContent(String qaContent) {
+            obj.setQaContent(qaContent);
             return this;
         }
 

+ 39 - 39
server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaper.java

@@ -24,22 +24,22 @@ public class UserPaper implements Serializable {
     private String title;
 
     /**
-     * 组卷模块:examination,exercise,collect,error,preview
+     * 组卷模块:examination,exercise, sentence
      */
     @Column(name = "`paper_module`")
     private String paperModule;
 
     /**
-     * 组卷扩展:examination, exercise
+     * 组卷来源:examination, exercise, collect, error, preview
      */
-    @Column(name = "`module_extend`")
-    private String moduleExtend;
+    @Column(name = "`paper_origin`")
+    private String paperOrigin;
 
     /**
-     * 对应模块id
+     * 对应来源id
      */
-    @Column(name = "`module_id`")
-    private Integer moduleId;
+    @Column(name = "`origin_id`")
+    private Integer originId;
 
     /**
      * 题目编号id列表:json
@@ -148,57 +148,57 @@ public class UserPaper implements Serializable {
     }
 
     /**
-     * 获取组卷模块:examination,exercise,collect,error,preview
+     * 获取组卷模块:examination,exercise, sentence
      *
-     * @return paper_module - 组卷模块:examination,exercise,collect,error,preview
+     * @return paper_module - 组卷模块:examination,exercise, sentence
      */
     public String getPaperModule() {
         return paperModule;
     }
 
     /**
-     * 设置组卷模块:examination,exercise,collect,error,preview
+     * 设置组卷模块:examination,exercise, sentence
      *
-     * @param paperModule 组卷模块:examination,exercise,collect,error,preview
+     * @param paperModule 组卷模块:examination,exercise, sentence
      */
     public void setPaperModule(String paperModule) {
         this.paperModule = paperModule;
     }
 
     /**
-     * 获取组卷扩展:examination, exercise
+     * 获取组卷来源:examination, exercise, collect, error, preview
      *
-     * @return module_extend - 组卷扩展:examination, exercise
+     * @return paper_origin - 组卷来源:examination, exercise, collect, error, preview
      */
-    public String getModuleExtend() {
-        return moduleExtend;
+    public String getPaperOrigin() {
+        return paperOrigin;
     }
 
     /**
-     * 设置组卷扩展:examination, exercise
+     * 设置组卷来源:examination, exercise, collect, error, preview
      *
-     * @param moduleExtend 组卷扩展:examination, exercise
+     * @param paperOrigin 组卷来源:examination, exercise, collect, error, preview
      */
-    public void setModuleExtend(String moduleExtend) {
-        this.moduleExtend = moduleExtend;
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
     }
 
     /**
-     * 获取对应模块id
+     * 获取对应来源id
      *
-     * @return module_id - 对应模块id
+     * @return origin_id - 对应来源id
      */
-    public Integer getModuleId() {
-        return moduleId;
+    public Integer getOriginId() {
+        return originId;
     }
 
     /**
-     * 设置对应模块id
+     * 设置对应来源id
      *
-     * @param moduleId 对应模块id
+     * @param originId 对应来源id
      */
-    public void setModuleId(Integer moduleId) {
-        this.moduleId = moduleId;
+    public void setOriginId(Integer originId) {
+        this.originId = originId;
     }
 
     /**
@@ -373,8 +373,8 @@ public class UserPaper implements Serializable {
         sb.append(", userId=").append(userId);
         sb.append(", title=").append(title);
         sb.append(", paperModule=").append(paperModule);
-        sb.append(", moduleExtend=").append(moduleExtend);
-        sb.append(", moduleId=").append(moduleId);
+        sb.append(", paperOrigin=").append(paperOrigin);
+        sb.append(", originId=").append(originId);
         sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", questionNumber=").append(questionNumber);
         sb.append(", times=").append(times);
@@ -428,9 +428,9 @@ public class UserPaper implements Serializable {
         }
 
         /**
-         * 设置组卷模块:examination,exercise,collect,error,preview
+         * 设置组卷模块:examination,exercise, sentence
          *
-         * @param paperModule 组卷模块:examination,exercise,collect,error,preview
+         * @param paperModule 组卷模块:examination,exercise, sentence
          */
         public Builder paperModule(String paperModule) {
             obj.setPaperModule(paperModule);
@@ -438,22 +438,22 @@ public class UserPaper implements Serializable {
         }
 
         /**
-         * 设置组卷扩展:examination, exercise
+         * 设置组卷来源:examination, exercise, collect, error, preview
          *
-         * @param moduleExtend 组卷扩展:examination, exercise
+         * @param paperOrigin 组卷来源:examination, exercise, collect, error, preview
          */
-        public Builder moduleExtend(String moduleExtend) {
-            obj.setModuleExtend(moduleExtend);
+        public Builder paperOrigin(String paperOrigin) {
+            obj.setPaperOrigin(paperOrigin);
             return this;
         }
 
         /**
-         * 设置对应模块id
+         * 设置对应来源id
          *
-         * @param moduleId 对应模块id
+         * @param originId 对应来源id
          */
-        public Builder moduleId(Integer moduleId) {
-            obj.setModuleId(moduleId);
+        public Builder originId(Integer originId) {
+            obj.setOriginId(originId);
             return this;
         }
 

+ 35 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserQuestion.java

@@ -25,6 +25,12 @@ public class UserQuestion implements Serializable {
     private Integer reportId;
 
     /**
+     * 题目模块:exercise, examination, sentence, textbook
+     */
+    @Column(name = "`question_module`")
+    private String questionModule;
+
+    /**
      * 题目id
      */
     @Column(name = "`question_id`")
@@ -134,6 +140,24 @@ public class UserQuestion implements Serializable {
     }
 
     /**
+     * 获取题目模块:exercise, examination, sentence, textbook
+     *
+     * @return question_module - 题目模块:exercise, examination, sentence, textbook
+     */
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    /**
+     * 设置题目模块:exercise, examination, sentence, textbook
+     *
+     * @param questionModule 题目模块:exercise, examination, sentence, textbook
+     */
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    /**
      * 获取题目id
      *
      * @return question_id - 题目id
@@ -318,6 +342,7 @@ public class UserQuestion implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", reportId=").append(reportId);
+        sb.append(", questionModule=").append(questionModule);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", no=").append(no);
@@ -372,6 +397,16 @@ public class UserQuestion implements Serializable {
         }
 
         /**
+         * 设置题目模块:exercise, examination, sentence, textbook
+         *
+         * @param questionModule 题目模块:exercise, examination, sentence, textbook
+         */
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
+            return this;
+        }
+
+        /**
          * 设置题目id
          *
          * @param questionId 题目id

+ 54 - 19
server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java

@@ -25,13 +25,19 @@ public class UserReport implements Serializable {
     private Integer paperId;
 
     /**
-     * 对应模块:exercise,examination,sentence, homework_preview
+     * 组卷模块:exercise,examination,sentence
      */
     @Column(name = "`paper_module`")
     private String paperModule;
 
-    @Column(name = "`module_id`")
-    private Integer moduleId;
+    /**
+     * 组卷来源
+     */
+    @Column(name = "`paper_origin`")
+    private String paperOrigin;
+
+    @Column(name = "`origin_id`")
+    private Integer originId;
 
     /**
      * 题目编号id列表:json
@@ -158,35 +164,53 @@ public class UserReport implements Serializable {
     }
 
     /**
-     * 获取对应模块:exercise,examination,sentence, homework_preview
+     * 获取组卷模块:exercise,examination,sentence
      *
-     * @return paper_module - 对应模块:exercise,examination,sentence, homework_preview
+     * @return paper_module - 组卷模块:exercise,examination,sentence
      */
     public String getPaperModule() {
         return paperModule;
     }
 
     /**
-     * 设置对应模块:exercise,examination,sentence, homework_preview
+     * 设置组卷模块:exercise,examination,sentence
      *
-     * @param paperModule 对应模块:exercise,examination,sentence, homework_preview
+     * @param paperModule 组卷模块:exercise,examination,sentence
      */
     public void setPaperModule(String paperModule) {
         this.paperModule = paperModule;
     }
 
     /**
-     * @return module_id
+     * 获取组卷来源
+     *
+     * @return paper_origin - 组卷来源
+     */
+    public String getPaperOrigin() {
+        return paperOrigin;
+    }
+
+    /**
+     * 设置组卷来源
+     *
+     * @param paperOrigin 组卷来源
      */
-    public Integer getModuleId() {
-        return moduleId;
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
     }
 
     /**
-     * @param moduleId
+     * @return origin_id
      */
-    public void setModuleId(Integer moduleId) {
-        this.moduleId = moduleId;
+    public Integer getOriginId() {
+        return originId;
+    }
+
+    /**
+     * @param originId
+     */
+    public void setOriginId(Integer originId) {
+        this.originId = originId;
     }
 
     /**
@@ -425,7 +449,8 @@ public class UserReport implements Serializable {
         sb.append(", userId=").append(userId);
         sb.append(", paperId=").append(paperId);
         sb.append(", paperModule=").append(paperModule);
-        sb.append(", moduleId=").append(moduleId);
+        sb.append(", paperOrigin=").append(paperOrigin);
+        sb.append(", originId=").append(originId);
         sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", questionNumber=").append(questionNumber);
         sb.append(", time=").append(time);
@@ -483,9 +508,9 @@ public class UserReport implements Serializable {
         }
 
         /**
-         * 设置对应模块:exercise,examination,sentence, homework_preview
+         * 设置组卷模块:exercise,examination,sentence
          *
-         * @param paperModule 对应模块:exercise,examination,sentence, homework_preview
+         * @param paperModule 组卷模块:exercise,examination,sentence
          */
         public Builder paperModule(String paperModule) {
             obj.setPaperModule(paperModule);
@@ -493,10 +518,20 @@ public class UserReport implements Serializable {
         }
 
         /**
-         * @param moduleId
+         * 设置组卷来源
+         *
+         * @param paperOrigin 组卷来源
+         */
+        public Builder paperOrigin(String paperOrigin) {
+            obj.setPaperOrigin(paperOrigin);
+            return this;
+        }
+
+        /**
+         * @param originId
          */
-        public Builder moduleId(Integer moduleId) {
-            obj.setModuleId(moduleId);
+        public Builder originId(Integer originId) {
+            obj.setOriginId(originId);
             return this;
         }
 

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseMapper.xml

@@ -8,7 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="struct_id" jdbcType="INTEGER" property="structId" />
     <result column="parent_struct_id" jdbcType="INTEGER" property="parentStructId" />
-    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
@@ -16,6 +16,6 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `struct_id`, `parent_struct_id`, `question_module`, `title`, `create_time`
+    `id`, `struct_id`, `parent_struct_id`, `question_type`, `title`, `create_time`
   </sql>
 </mapper>

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/PreviewPaperMapper.xml

@@ -11,7 +11,7 @@
     <result column="course_no" jdbcType="INTEGER" property="courseNo" />
     <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="mode" jdbcType="INTEGER" property="mode" />
-    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
     <result column="user_ids" jdbcType="VARCHAR" property="userIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
     <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
@@ -23,7 +23,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title`, `course_id`, `course_no`, `question_no_ids`, `mode`, `question_module`, 
+    `id`, `title`, `course_id`, `course_no`, `question_no_ids`, `mode`, `question_type`, 
     `user_ids`, `start_time`, `end_time`, `finish`, `create_time`, `update_time`
   </sql>
 </mapper>

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskQuestionMapper.xml

@@ -7,7 +7,7 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
-    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="target" jdbcType="VARCHAR" property="target" />
@@ -30,7 +30,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `module`, `question_id`, `question_no_id`, `target`, `answer_status`, 
+    `id`, `user_id`, `question_module`, `question_id`, `question_no_id`, `target`, `answer_status`, 
     `manager_id`, `show_status`, `answer_time`, `order`, `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCollectQuestionMapper.xml

@@ -7,7 +7,7 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
-    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@@ -16,6 +16,6 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `module`, `question_id`, `question_no_id`, `create_time`
+    `id`, `user_id`, `question_module`, `question_id`, `question_no_id`, `create_time`
   </sql>
 </mapper>

+ 13 - 3
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserNoteQuestionMapper.xml

@@ -7,28 +7,38 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
-    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
+    <result column="content_time" jdbcType="TIMESTAMP" property="contentTime" />
+    <result column="official_time" jdbcType="TIMESTAMP" property="officialTime" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="qx_time" jdbcType="TIMESTAMP" property="qxTime" />
+    <result column="association_time" jdbcType="TIMESTAMP" property="associationTime" />
+    <result column="qa_time" jdbcType="TIMESTAMP" property="qaTime" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserNoteQuestion">
     <!--
       WARNING - @mbg.generated
     -->
     <result column="content" jdbcType="LONGVARCHAR" property="content" />
+    <result column="official_content" jdbcType="LONGVARCHAR" property="officialContent" />
+    <result column="qx_content" jdbcType="LONGVARCHAR" property="qxContent" />
+    <result column="association_content" jdbcType="LONGVARCHAR" property="associationContent" />
+    <result column="qa_content" jdbcType="LONGVARCHAR" property="qaContent" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `module`, `question_id`, `question_no_id`, `create_time`, `update_time`
+    `id`, `user_id`, `question_module`, `question_id`, `question_no_id`, `content_time`, 
+    `official_time`, `create_time`, `update_time`, `qx_time`, `association_time`, `qa_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `content`
+    `content`, `official_content`, `qx_content`, `association_content`, `qa_content`
   </sql>
 </mapper>

+ 3 - 3
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperMapper.xml

@@ -9,8 +9,8 @@
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="paper_module" jdbcType="VARCHAR" property="paperModule" />
-    <result column="module_extend" jdbcType="VARCHAR" property="moduleExtend" />
-    <result column="module_id" jdbcType="INTEGER" property="moduleId" />
+    <result column="paper_origin" jdbcType="VARCHAR" property="paperOrigin" />
+    <result column="origin_id" jdbcType="INTEGER" property="originId" />
     <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="question_number" jdbcType="INTEGER" property="questionNumber" />
     <result column="times" jdbcType="INTEGER" property="times" />
@@ -25,7 +25,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `title`, `paper_module`, `module_extend`, `module_id`, `question_no_ids`, 
+    `id`, `user_id`, `title`, `paper_module`, `paper_origin`, `origin_id`, `question_no_ids`, 
     `question_number`, `times`, `time`, `total_time`, `total_number`, `total_correct`, 
     `delete_time`, `is_reset`
   </sql>

+ 3 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserQuestionMapper.xml

@@ -8,6 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="report_id" jdbcType="INTEGER" property="reportId" />
+    <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="no" jdbcType="INTEGER" property="no" />
@@ -23,7 +24,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `report_id`, `question_id`, `question_no_id`, `no`, `time`, `user_time`, 
-    `user_answer`, `is_correct`, `setting`, `detail`, `create_time`
+    `id`, `user_id`, `report_id`, `question_module`, `question_id`, `question_no_id`, 
+    `no`, `time`, `user_time`, `user_answer`, `is_correct`, `setting`, `detail`, `create_time`
   </sql>
 </mapper>

+ 5 - 4
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml

@@ -9,7 +9,8 @@
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="paper_id" jdbcType="INTEGER" property="paperId" />
     <result column="paper_module" jdbcType="VARCHAR" property="paperModule" />
-    <result column="module_id" jdbcType="INTEGER" property="moduleId" />
+    <result column="paper_origin" jdbcType="VARCHAR" property="paperOrigin" />
+    <result column="origin_id" jdbcType="INTEGER" property="originId" />
     <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="question_number" jdbcType="INTEGER" property="questionNumber" />
     <result column="time" jdbcType="INTEGER" property="time" />
@@ -28,8 +29,8 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `paper_id`, `paper_module`, `module_id`, `question_no_ids`, `question_number`, 
-    `time`, `user_number`, `user_time`, `user_correct`, `finish_time`, `setting`, `score`, 
-    `detail`, `is_finish`, `create_time`, `update_time`
+    `id`, `user_id`, `paper_id`, `paper_module`, `paper_origin`, `origin_id`, `question_no_ids`, 
+    `question_number`, `time`, `user_number`, `user_time`, `user_correct`, `finish_time`, 
+    `setting`, `score`, `detail`, `is_finish`, `create_time`, `update_time`
   </sql>
 </mapper>

+ 14 - 7
server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java

@@ -13,6 +13,14 @@ import java.util.List;
  * Created by gaojie on 2017/11/9.
  */
 public interface UserReportRelationMapper {
+
+    void accumulation(
+            @Param("id") Number reportId,
+            @Param("number") Integer number,
+            @Param("time") Integer time,
+            @Param("current") Integer current
+    );
+
     List<UserReport> listFinishLast(
             @Param("paperIds") Collection paperIds,
             @Param("startTime") String startTime,
@@ -23,13 +31,6 @@ public interface UserReportRelationMapper {
             @Param("paperIds") Collection paperIds
     );
 
-    void accumulation(
-            @Param("id") Number reportId,
-            @Param("number") Integer number,
-            @Param("time") Integer time,
-            @Param("current") Integer current
-    );
-
     List<UserReportLimitRelation> statLimit(
             @Param("module") String module,
             @Param("moduleId") Integer moduleId
@@ -45,6 +46,12 @@ public interface UserReportRelationMapper {
             @Param("endTime") String endTime
     );
 
+    List<UserStudyStatRelation> statGroupPreviewType(
+            @Param("userId") Integer userId,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
+
     List<UserRankStatRelation> rankExerciseByTime(
         @Param("userId") Integer userId,
         @Param("startTime") String startTime,

+ 28 - 6
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml

@@ -104,20 +104,20 @@
     where
       `user_time` &lt; `time`
     and `user_number` = `question_number`
-    and `module` = #{module,jdbcType=VARCHAR}
+    and `paper_origin` = #{module,jdbcType=VARCHAR}
     and `module_id` = #{module_id,jdbcType=INTEGER}
   </select>
 
   <!--
-    用户不同模块记录统计,分学科
+    用户不同来源记录统计
   -->
   <select id="statGroupModule" resultMap="studyMap">
     select
-    sum(`user_number`) as `user_number`, sum(`user_time`) as `user_time`, sum(`user_correct`) as `user_correct`, `paper_module` as `module`
+    sum(`user_number`) as `user_number`, sum(`user_time`) as `user_time`, sum(`user_correct`) as `user_correct`, `paper_origin` as `module`
     from `user_report`
     where
     `user_id` = #{userId,jdbcType=VARCHAR}
-    group `module`
+    group `paper_origin`
   </select>
 
   <!--
@@ -130,14 +130,36 @@
       left join `exercise_paper` ep on ep.`id` = ur.`module_id`
     where
     ur.`user_id` = #{userId,jdbcType=VARCHAR}
-    and ur.`paper_module` = 'exercise'
+    and ur.`paper_origin` = 'exercise'
+    and ep.`id` != null
     <if test="startTime != null">
       and ur.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
     </if>
     <if test="endTime != null">
       and ur.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
     </if>
-    group eq.`question_type`
+    group ep.`question_type`
+  </select>
+
+  <!--
+    用户预习作业模块记录统计,分题型
+  -->
+  <select id="statGroupPreviewType" resultMap="studyMap">
+    select
+    sum(ur.`user_number`) as `user_number`, sum(ur.`user_time`) as `user_time`, sum(ur.`user_correct`) as `user_correct`, ep.`question_type` as `module`
+    from `user_report` ur
+    left join `preview_paper` pp on pp.`id` = ur.`module_id`
+    where
+    ur.`user_id` = #{userId,jdbcType=VARCHAR}
+    and ur.`paper_origin` = 'preview'
+    and pp.`id` != null
+    <if test="startTime != null">
+      and ur.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and ur.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+    group pp.`question_type`
   </select>
 
   <!--

+ 93 - 24
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -8,6 +8,7 @@ import com.nuliji.tools.exception.SystemException;
 import com.qxgmat.data.constants.enums.QuestionType;
 import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.module.PaperModule;
+import com.qxgmat.data.constants.enums.module.PaperOrigin;
 import com.qxgmat.data.constants.enums.module.QuestionModule;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.entity.*;
@@ -58,6 +59,9 @@ public class MyController {
     private ShiroHelp shiroHelp;
 
     @Autowired
+    private SettingService settingService;
+
+    @Autowired
     private ExerciseStructService exerciseStructService;
 
     @Autowired
@@ -67,22 +71,25 @@ public class MyController {
     private ClassCourseNoService classCourseNoService;
 
     @Autowired
-    private UsersService usersService;
+    private QuestionNoService questionNoService;
 
     @Autowired
-    private UserMessageService userMessageService;
+    private SentenceQuestionService sentenceQuestionService;
 
     @Autowired
-    private SettingService settingService;
+    private TextbookQuestionService textbookQuestionService;
 
     @Autowired
-    private UserCourseRecordService userCourseRecordService;
+    private UsersService usersService;
 
     @Autowired
-    private UserSentenceRecordService userSentenceRecordService;
+    private UserMessageService userMessageService;
 
     @Autowired
-    private QuestionNoService questionNoService;
+    private UserCourseRecordService userCourseRecordService;
+
+    @Autowired
+    private UserSentenceRecordService userSentenceRecordService;
 
     @Autowired
     private UserServiceService userServiceService;
@@ -327,7 +334,7 @@ public class MyController {
         dto.setDays((int)((user.getCreateTime().getTime() - new Date().getTime()) / (1000*3600*24)));
         Integer totalTime = 0;
         Map<String, Integer> categoryMap = new HashMap<>();
-        // 按模块类型分组查询: module=> sentence, examination, collect+error, 忽略exercise
+        // 按模块来源分组查询: module=> sentence, examination, collect+error, 忽略exercise,preview
         List<UserStudyStatRelation> moduleList = userReportService.statGroupModule(user.getId());
         for(UserStudyStatRelation module:moduleList){
             // 练习时间过滤
@@ -338,16 +345,24 @@ public class MyController {
             String key = module.getModule();
             totalTime += time;
             // 收藏及错误组卷合并
-            if (module.getModule().equals(PaperModule.COLLECT.key)
-                    || module.getModule().equals(PaperModule.ERROR.key)){
+            if (module.getModule().equals(PaperOrigin.COLLECT.key)
+                    || module.getModule().equals(PaperOrigin.ERROR.key)){
                 key = "freedom";
                 time += categoryMap.getOrDefault(key, 0);
+            }else if (module.getModule().equals(PaperOrigin.PREVIEW.key)){
+                key = PaperOrigin.EXERCISE.key;
             }
             categoryMap.put(key, time);
         }
         // 按题型统计练习
-        List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), null, null);
-        for(UserStudyStatRelation type:typeList){
+        List<UserStudyStatRelation> exerciseList = userReportService.statGroupExerciseType(user.getId(), null, null);
+        for(UserStudyStatRelation type:exerciseList){
+            totalTime += type.getUserTime();
+            categoryMap.put(type.getModule(), type.getUserTime());
+        }
+        // 按题型统计预习作业
+        List<UserStudyStatRelation> previewList = userReportService.statGroupExerciseType(user.getId(), null, null);
+        for(UserStudyStatRelation type:previewList){
             totalTime += type.getUserTime();
             categoryMap.put(type.getModule(), type.getUserTime());
         }
@@ -400,6 +415,8 @@ public class MyController {
         User user = (User) shiroHelp.getLoginUser();
         UserStudyDayDto dto = new UserStudyDayDto();
 
+        // todo
+
         return ResponseHelp.success(dto);
     }
 
@@ -408,9 +425,26 @@ public class MyController {
     public Response<Boolean> addCollect(@RequestBody @Validated UserCollectDto dto)  {
         UserCollectQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
-        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
-        entity.setQuestionId(questionNo.getQuestionId());
-        entity.setModule(questionNo.getModule());
+        switch (QuestionModule.ValueOf(dto.getQuestionModule())){
+            case BASE:
+                entity.setQuestionModule(QuestionModule.BASE.key);
+                QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+                entity.setQuestionId(questionNo.getQuestionId());
+                entity.setQuestionNoId(questionNo.getId());
+                break;
+            case SENTENCE:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(sentenceQuestion.getQuestionId());
+                entity.setQuestionNoId(sentenceQuestion.getId());
+                break;
+            case TEXTBOOK:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(textbookQuestion.getQuestionId());
+                entity.setQuestionNoId(textbookQuestion.getId());
+                break;
+        }
         entity.setUserId(user.getId());
         userCollectQuestionService.addQuestion(entity);
 
@@ -419,16 +453,16 @@ public class MyController {
 
     @RequestMapping(value = "/collect", method = RequestMethod.DELETE)
     @ApiOperation(value = "移除收藏", notes = "移除收藏", httpMethod = "DELETE")
-    public Response<Boolean> deleteCollect(Integer questionNoId)  {
+    public Response<Boolean> deleteCollect(String questionModule, Integer questionNoId)  {
         User user = (User) shiroHelp.getLoginUser();
-        Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), questionNoId);
+        Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), QuestionModule.ValueOf(questionModule), questionNoId);
 
         return ResponseHelp.success(result);
     }
 
     @RequestMapping(value = "/collect/bind", method = RequestMethod.POST)
     @ApiOperation(value = "收藏组卷", notes = "收藏组卷", httpMethod = "POST")
-    public Response<Boolean> bindCollect(@RequestBody @Validated UserQuestionIdsDto dto)  {
+    public Response<Boolean> bindCollect(@RequestBody @Validated UserCustomBindDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         // todo 绑定数据
@@ -477,7 +511,7 @@ public class MyController {
 
     @RequestMapping(value = "/error/bind", method = RequestMethod.POST)
     @ApiOperation(value = "错题组卷", notes = "错题组卷", httpMethod = "POST")
-    public Response<Boolean> bindError(@RequestBody @Validated UserErrorBindDto dto)  {
+    public Response<Boolean> bindError(@RequestBody @Validated UserCustomBindDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         // todo 绑定数据
@@ -498,9 +532,27 @@ public class MyController {
         UserNoteQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
         entity.setUserId(user.getId());
-        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
-        entity.setQuestionId(questionNo.getQuestionId());
-        entity.setModule(questionNo.getModule());
+        switch (QuestionModule.ValueOf(dto.getQuestionModule())){
+            case BASE:
+                entity.setQuestionModule(QuestionModule.BASE.key);
+                QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+                entity.setQuestionId(questionNo.getQuestionId());
+                entity.setQuestionNoId(questionNo.getId());
+                break;
+            case SENTENCE:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(sentenceQuestion.getQuestionId());
+                entity.setQuestionNoId(sentenceQuestion.getId());
+                break;
+            case TEXTBOOK:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(textbookQuestion.getQuestionId());
+                entity.setQuestionNoId(textbookQuestion.getId());
+                break;
+        }
+
         userNoteQuestionService.update(entity);
 
         return ResponseHelp.success(true);
@@ -562,9 +614,26 @@ public class MyController {
         UserAskQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
         entity.setUserId(user.getId());
-        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
-        entity.setQuestionId(questionNo.getQuestionId());
-        entity.setModule(questionNo.getModule());
+        switch (QuestionModule.ValueOf(dto.getQuestionModule())){
+            case BASE:
+                entity.setQuestionModule(QuestionModule.BASE.key);
+                QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+                entity.setQuestionId(questionNo.getQuestionId());
+                entity.setQuestionNoId(questionNo.getId());
+                break;
+            case SENTENCE:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                SentenceQuestion sentenceQuestion = sentenceQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(sentenceQuestion.getQuestionId());
+                entity.setQuestionNoId(sentenceQuestion.getId());
+                break;
+            case TEXTBOOK:
+                entity.setQuestionModule(QuestionModule.SENTENCE.key);
+                TextbookQuestion textbookQuestion = textbookQuestionService.get(dto.getQuestionNoId());
+                entity.setQuestionId(textbookQuestion.getQuestionId());
+                entity.setQuestionNoId(textbookQuestion.getId());
+                break;
+        }
         userAskQuestionService.add(entity);
 
         return ResponseHelp.success(true);

+ 8 - 7
server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java

@@ -7,6 +7,7 @@ import com.nuliji.tools.*;
 import com.nuliji.tools.exception.ParameterException;
 import com.qxgmat.data.constants.enums.logic.ExerciseLogic;
 import com.qxgmat.data.constants.enums.module.PaperModule;
+import com.qxgmat.data.constants.enums.module.PaperOrigin;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.UserExercisePaperRelation;
 import com.qxgmat.data.relation.entity.UserReportRelation;
@@ -224,7 +225,7 @@ public class QuestionController {
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
         setting.put("order", dto.getOrder());
-        UserReport report = questionFlowService.start(user.getId(), PaperModule.EXAMINATION, dto.getPaperId(), setting);
+        UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXAMINATION, dto.getPaperId(), setting);
 
         return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
     }
@@ -235,7 +236,7 @@ public class QuestionController {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReport report = questionFlowService.start(user.getId(), PaperModule.EXERCISE, dto.getPaperId(), setting);
+        UserReport report = questionFlowService.start(user.getId(), PaperOrigin.EXERCISE, dto.getPaperId(), setting);
 
         return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
     }
@@ -246,7 +247,7 @@ public class QuestionController {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.PREVIEW, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.PREVIEW, dto.getPaperId(), setting);
 
         UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
 
@@ -260,7 +261,7 @@ public class QuestionController {
     )  {
         User user = (User) shiroHelp.getLoginUser();
         UserPaper paper = userPaperService.get(paperId);
-        if (!paper.getPaperModule().equals(PaperModule.ERROR.key)){
+        if (!paper.getPaperOrigin().equals(PaperOrigin.ERROR.key)){
             throw new ParameterException("试卷不存在");
         }
         if (!paper.getUserId().equals(user.getId())){
@@ -277,7 +278,7 @@ public class QuestionController {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.ERROR, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.ERROR, dto.getPaperId(), setting);
 
         UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
 
@@ -291,7 +292,7 @@ public class QuestionController {
     )  {
         User user = (User) shiroHelp.getLoginUser();
         UserPaper paper = userPaperService.get(paperId);
-        if (!paper.getPaperModule().equals(PaperModule.COLLECT.key)){
+        if (!paper.getPaperOrigin().equals(PaperOrigin.COLLECT.key)){
             throw new ParameterException("试卷不存在");
         }
         if (!paper.getUserId().equals(user.getId())){
@@ -308,7 +309,7 @@ public class QuestionController {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.COLLECT, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.COLLECT, dto.getPaperId(), setting);
 
         UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
 

+ 14 - 2
server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java

@@ -8,6 +8,7 @@ import com.nuliji.tools.exception.AuthException;
 import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.logic.SentenceLogic;
 import com.qxgmat.data.constants.enums.module.PaperModule;
+import com.qxgmat.data.constants.enums.module.PaperOrigin;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.UserReportRelation;
 import com.qxgmat.dto.extend.QuestionExtendDto;
@@ -63,6 +64,9 @@ public class SentenceController
     private UserSentenceProcessService userSentenceProcessService;
 
     @Autowired
+    private UserSentenceRecordService userSentenceRecordService;
+
+    @Autowired
     private UserCollectQuestionService userCollectQuestionService;
 
     @Autowired
@@ -143,8 +147,16 @@ public class SentenceController
 
         // 获取本章节的最大part数
         Integer max = sentenceArticleService.maxPart(dto.getChapter());
-        // todo 添加阅读记录
 
+        // 添加阅读记录
+        userSentenceRecordService.add(UserSentenceRecord.builder()
+                .userId(user.getId())
+                .chapter(dto.getChapter())
+                .part(dto.getPart())
+                .userTime(dto.getTime())
+                .build());
+
+        // 更新阅读进度
         userSentenceProcessService.updateProcess(user.getId(), dto.getChapter(), dto.getPart(), dto.getProcess(), max);
         return ResponseHelp.success(true);
     }
@@ -236,7 +248,7 @@ public class SentenceController
     public Response<UserReportBaseDto> start(@RequestBody @Validated SentenceStartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
-        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.SENTENCE, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperOrigin.SENTENCE, dto.getPaperId(), setting);
 
         UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
 

+ 9 - 9
server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionExtendDto.java

@@ -8,7 +8,7 @@ public class QuestionExtendDto {
 
     private Integer id;
 
-    private String stem;
+    private String description;
 
     private String type;
     private String difficult;
@@ -22,14 +22,6 @@ public class QuestionExtendDto {
         this.id = id;
     }
 
-    public String getStem() {
-        return stem;
-    }
-
-    public void setStem(String stem) {
-        this.stem = stem;
-    }
-
     public String getType() {
         return type;
     }
@@ -53,4 +45,12 @@ public class QuestionExtendDto {
     public void setPlace(String place) {
         this.place = place;
     }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
 }

+ 9 - 41
server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionNoExtendDto.java

@@ -9,50 +9,10 @@ import javax.validation.constraints.NotEmpty;
 public class QuestionNoExtendDto {
     private Integer id;
 
-    /**
-     * 模块:examination, exercise, sentence
-     */
-    @NotEmpty(message = "题目所属模块!")
-    private String module;
-
-    /**
-     * 人工id
-     */
-    @NotEmpty(message = "题目ID!")
-    private String no;
-
-    /**
-     * 对应模块结构信息,逗号分隔
-     */
-    @NotEmpty(message = "对应模块层级!")
-    private Integer[] moduleStruct;
+    private String title;
 
     private QuestionExtendDto question;
 
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-
-    public String getNo() {
-        return no;
-    }
-
-    public void setNo(String no) {
-        this.no = no;
-    }
-
-    public Integer[] getModuleStruct() {
-        return moduleStruct;
-    }
-
-    public void setModuleStruct(Integer[] moduleStruct) {
-        this.moduleStruct = moduleStruct;
-    }
-
     public QuestionExtendDto getQuestion() {
         return question;
     }
@@ -68,4 +28,12 @@ public class QuestionNoExtendDto {
     public void setId(Integer id) {
         this.id = id;
     }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
 }

+ 132 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserNoteExtendDto.java

@@ -3,10 +3,70 @@ package com.qxgmat.dto.extend;
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserNoteQuestion;
 
+import java.util.Date;
+
 @Dto(entity = UserNoteQuestion.class)
 public class UserNoteExtendDto {
+    private Integer id;
+
+    private String questionModule;
+
+    private Integer questionId;
+
+    private Integer questionNoId;
+
     private String content;
 
+    private String officialContent;
+
+    private String qxContent;
+
+    private String associationContent;
+
+    private String qaContent;
+
+    private Date contentTime;
+
+    private Date officialTime;
+
+    private Date qxTime;
+
+    private Date associationTime;
+
+    private Date qaTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    public Integer getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Integer questionId) {
+        this.questionId = questionId;
+    }
+
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
     public String getContent() {
         return content;
     }
@@ -14,4 +74,76 @@ public class UserNoteExtendDto {
     public void setContent(String content) {
         this.content = content;
     }
+
+    public String getOfficialContent() {
+        return officialContent;
+    }
+
+    public void setOfficialContent(String officialContent) {
+        this.officialContent = officialContent;
+    }
+
+    public String getQxContent() {
+        return qxContent;
+    }
+
+    public void setQxContent(String qxContent) {
+        this.qxContent = qxContent;
+    }
+
+    public String getAssociationContent() {
+        return associationContent;
+    }
+
+    public void setAssociationContent(String associationContent) {
+        this.associationContent = associationContent;
+    }
+
+    public Date getContentTime() {
+        return contentTime;
+    }
+
+    public void setContentTime(Date contentTime) {
+        this.contentTime = contentTime;
+    }
+
+    public Date getOfficialTime() {
+        return officialTime;
+    }
+
+    public void setOfficialTime(Date officialTime) {
+        this.officialTime = officialTime;
+    }
+
+    public Date getQxTime() {
+        return qxTime;
+    }
+
+    public void setQxTime(Date qxTime) {
+        this.qxTime = qxTime;
+    }
+
+    public Date getAssociationTime() {
+        return associationTime;
+    }
+
+    public void setAssociationTime(Date associationTime) {
+        this.associationTime = associationTime;
+    }
+
+    public String getQaContent() {
+        return qaContent;
+    }
+
+    public void setQaContent(String qaContent) {
+        this.qaContent = qaContent;
+    }
+
+    public Date getQaTime() {
+        return qaTime;
+    }
+
+    public void setQaTime(Date qaTime) {
+        this.qaTime = qaTime;
+    }
 }

+ 10 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserAskDto.java

@@ -8,6 +8,8 @@ import com.qxgmat.data.dao.entity.UserNoteQuestion;
 public class UserAskDto {
     private String target;
 
+    private String questionModule;
+
     private Integer questionNoId;
 
     private String content;
@@ -35,4 +37,12 @@ public class UserAskDto {
     public void setTarget(String target) {
         this.target = target;
     }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
 }

+ 10 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserCollectDto.java

@@ -6,6 +6,8 @@ import com.qxgmat.data.dao.entity.UserCollectQuestion;
 @Dto(entity = UserCollectQuestion.class)
 public class UserCollectDto {
 
+    private String questionModule;
+
     private Integer questionNoId;
 
     public Integer getQuestionNoId() {
@@ -15,4 +17,12 @@ public class UserCollectDto {
     public void setQuestionNoId(Integer questionNoId) {
         this.questionNoId = questionNoId;
     }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
 }

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserErrorBindDto.java

@@ -1,6 +1,6 @@
 package com.qxgmat.dto.request;
 
-public class UserErrorBindDto {
+public class UserCustomBindDto {
     private Integer[] questionNoIds;
 
     // 过滤已组卷n次的题目

+ 50 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserNoteDto.java

@@ -6,10 +6,20 @@ import com.qxgmat.data.dao.entity.UserNoteQuestion;
 @Dto(entity = UserNoteQuestion.class)
 public class UserNoteDto {
 
+    private String questionModule;
+
     private Integer questionNoId;
 
     private String content;
 
+    private String qxContent;
+
+    private String officialContent;
+
+    private String associationContent;
+
+    private String qaContent;
+
     public Integer getQuestionNoId() {
         return questionNoId;
     }
@@ -25,4 +35,44 @@ public class UserNoteDto {
     public void setContent(String content) {
         this.content = content;
     }
+
+    public String getQxContent() {
+        return qxContent;
+    }
+
+    public void setQxContent(String qxContent) {
+        this.qxContent = qxContent;
+    }
+
+    public String getOfficialContent() {
+        return officialContent;
+    }
+
+    public void setOfficialContent(String officialContent) {
+        this.officialContent = officialContent;
+    }
+
+    public String getAssociationContent() {
+        return associationContent;
+    }
+
+    public void setAssociationContent(String associationContent) {
+        this.associationContent = associationContent;
+    }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    public String getQaContent() {
+        return qaContent;
+    }
+
+    public void setQaContent(String qaContent) {
+        this.qaContent = qaContent;
+    }
 }

+ 143 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserNoteDetailDto.java

@@ -2,11 +2,42 @@ package com.qxgmat.dto.response;
 
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserNoteQuestion;
+import com.qxgmat.dto.extend.QuestionNoExtendDto;
+
+import java.util.Date;
 
 @Dto(entity = UserNoteQuestion.class)
 public class UserNoteDetailDto {
     private Integer id;
 
+    private String questionModule;
+
+    private Integer questionId;
+
+    private Integer questionNoId;
+
+    private QuestionNoExtendDto questionNo;
+
+    private String content;
+
+    private String officialContent;
+
+    private String qxContent;
+
+    private String associationContent;
+
+    private String qaContent;
+
+    private Date contentTime;
+
+    private Date officialTime;
+
+    private Date qxTime;
+
+    private Date associationTime;
+
+    private Date qaTime;
+
     public Integer getId() {
         return id;
     }
@@ -14,4 +45,116 @@ public class UserNoteDetailDto {
     public void setId(Integer id) {
         this.id = id;
     }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    public Integer getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Integer questionId) {
+        this.questionId = questionId;
+    }
+
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
+    public QuestionNoExtendDto getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNoExtendDto questionNo) {
+        this.questionNo = questionNo;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getOfficialContent() {
+        return officialContent;
+    }
+
+    public void setOfficialContent(String officialContent) {
+        this.officialContent = officialContent;
+    }
+
+    public String getQxContent() {
+        return qxContent;
+    }
+
+    public void setQxContent(String qxContent) {
+        this.qxContent = qxContent;
+    }
+
+    public String getAssociationContent() {
+        return associationContent;
+    }
+
+    public void setAssociationContent(String associationContent) {
+        this.associationContent = associationContent;
+    }
+
+    public Date getContentTime() {
+        return contentTime;
+    }
+
+    public void setContentTime(Date contentTime) {
+        this.contentTime = contentTime;
+    }
+
+    public Date getOfficialTime() {
+        return officialTime;
+    }
+
+    public void setOfficialTime(Date officialTime) {
+        this.officialTime = officialTime;
+    }
+
+    public Date getQxTime() {
+        return qxTime;
+    }
+
+    public void setQxTime(Date qxTime) {
+        this.qxTime = qxTime;
+    }
+
+    public Date getAssociationTime() {
+        return associationTime;
+    }
+
+    public void setAssociationTime(Date associationTime) {
+        this.associationTime = associationTime;
+    }
+
+    public String getQaContent() {
+        return qaContent;
+    }
+
+    public void setQaContent(String qaContent) {
+        this.qaContent = qaContent;
+    }
+
+    public Date getQaTime() {
+        return qaTime;
+    }
+
+    public void setQaTime(Date qaTime) {
+        this.qaTime = qaTime;
+    }
 }

+ 9 - 9
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionDetailDto.java

@@ -13,7 +13,7 @@ import java.util.List;
 public class UserQuestionDetailDto {
     private Integer id;
 
-    private String module;
+    private String questionModule;
 
     private Integer questionId;
 
@@ -39,14 +39,6 @@ public class UserQuestionDetailDto {
         this.id = id;
     }
 
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-
     public Integer getQuestionId() {
         return questionId;
     }
@@ -110,4 +102,12 @@ public class UserQuestionDetailDto {
     public void setDetail(JSONObject detail) {
         this.detail = detail;
     }
+
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
 }

+ 19 - 9
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserReportBaseDto.java

@@ -14,7 +14,9 @@ public class UserReportBaseDto {
 
     private UserPaperBaseExtendDto paper;
 
-    private String module;
+    private String paperModule;
+
+    private String paperOrigin;
 
     private Integer time;
 
@@ -42,14 +44,6 @@ public class UserReportBaseDto {
         this.paperId = paperId;
     }
 
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-
     public Integer getTime() {
         return time;
     }
@@ -97,4 +91,20 @@ public class UserReportBaseDto {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public String getPaperModule() {
+        return paperModule;
+    }
+
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
+    }
+
+    public String getPaperOrigin() {
+        return paperOrigin;
+    }
+
+    public void setPaperOrigin(String paperOrigin) {
+        this.paperOrigin = paperOrigin;
+    }
 }

+ 5 - 3
server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java

@@ -107,6 +107,7 @@ public class UserCollectQuestionService extends AbstractService {
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", entity.getUserId())
+                        .andEqualTo("questionModule", entity.getQuestionModule())
                         .andEqualTo("questionNoId", entity.getQuestionNoId())
         );
         UserCollectQuestion in = one(userCollectQuestionMapper, example);
@@ -124,12 +125,13 @@ public class UserCollectQuestionService extends AbstractService {
      * @return
      */
     @Transactional
-    public boolean deleteQuestion(Integer userId, Integer questionNoId){
+    public boolean deleteQuestion(Integer userId, QuestionModule module, Integer questionNoId){
         Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()
-                .andEqualTo("userId", userId)
-                .andEqualTo("questionNoId", questionNoId)
+                        .andEqualTo("userId", userId)
+                        .andEqualTo("questionModule", module.key)
+                        .andEqualTo("questionNoId", questionNoId)
         );
         UserCollectQuestion in = one(userCollectQuestionMapper, example);
         if (in == null){

+ 37 - 1
server/gateway-api/src/main/java/com/qxgmat/service/UserNoteQuestionService.java

@@ -26,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 @Service
@@ -91,11 +92,12 @@ public class UserNoteQuestionService extends AbstractService {
      */
     @Transactional
     public UserNoteQuestion update(UserNoteQuestion note){
+
         Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", note.getUserId())
-                        .andEqualTo("module", note.getModule())
+                        .andEqualTo("questionModule", note.getQuestionModule())
         );
         example.and(
                 example.createCriteria()
@@ -103,10 +105,44 @@ public class UserNoteQuestionService extends AbstractService {
                         .orEqualTo("questionNoId", note.getQuestionNoId())
         );
         UserNoteQuestion in = one(userNoteQuestionMapper, example);
+        Date now = new Date();
         if(in == null){
+            // 按实际更新更改更新时间
+            if (!note.getContent().isEmpty()){
+                note.setContentTime(now);
+            }
+            if (!note.getOfficialContent().isEmpty()){
+                note.setOfficialTime(now);
+            }
+            if (!note.getQxContent().isEmpty()){
+                note.setQxTime(now);
+            }
+            if (!note.getAssociationContent().isEmpty()){
+                note.setAssociationTime(now);
+            }
+            if (!note.getQaContent().isEmpty()){
+                note.setQaTime(now);
+            }
             return add(note);
         }else{
             note.setId(in.getId());
+
+            // 按实际更新更改更新时间
+            if (!note.getContent().equals(in.getContent())){
+                note.setContentTime(now);
+            }
+            if (!note.getOfficialContent().equals(in.getOfficialContent())){
+                note.setOfficialTime(now);
+            }
+            if (!note.getQxContent().equals(in.getQxContent())){
+                note.setQxTime(now);
+            }
+            if (!note.getAssociationContent().equals(in.getAssociationContent())){
+                note.setAssociationTime(now);
+            }
+            if (!note.getQaContent().equals(in.getQaContent())){
+                note.setQaTime(now);
+            }
             return edit(note);
         }
     }

+ 14 - 9
server/gateway-api/src/main/java/com/qxgmat/service/UserPaperService.java

@@ -9,6 +9,7 @@ import com.nuliji.tools.exception.SystemException;
 import com.nuliji.tools.mybatis.Example;
 import com.qxgmat.data.constants.enums.QuestionType;
 import com.qxgmat.data.constants.enums.module.PaperModule;
+import com.qxgmat.data.constants.enums.module.PaperOrigin;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.UserPaperMapper;
 import com.qxgmat.data.dao.entity.UserPaper;
@@ -60,17 +61,17 @@ public class UserPaperService extends AbstractService {
         return new PageResult<>(null, 0);
     }
 
-    public UserPaper getByPaper(Integer userId, PaperModule module, Integer paperId, InitPaper IInitPaper){
+    public UserPaper getByPaper(Integer userId, PaperOrigin origin, Integer originId, InitPaper IInitPaper){
         // 查找对应的paper是否有,没有则添加
         Example example = new Example(UserPaper.class);
         UserPaper paper;
-        if (module.equals(PaperModule.ERROR) || module.equals(PaperModule.COLLECT)){
-            // 错题和收藏组卷,paper即为userPaper的id
+        if (origin.equals(PaperOrigin.ERROR) || origin.equals(PaperOrigin.COLLECT)){
+            // 错题和收藏组卷,originId即为userPaper的id
             example.and(
                     example.createCriteria()
                             .andEqualTo("userId", userId)
-                            .andEqualTo("module", module.key)
-                            .andEqualTo("id", paperId)
+                            .andEqualTo("paperOrigin", origin.key)
+                            .andEqualTo("id", originId)
             );
             paper = one(userPaperMapper, example);
             if (paper == null){
@@ -80,15 +81,19 @@ public class UserPaperService extends AbstractService {
             example.and(
                     example.createCriteria()
                             .andEqualTo("userId", userId)
-                            .andEqualTo("module", module.key)
-                            .andEqualTo("module_id", paperId)
+                            .andEqualTo("paperOrigin", origin.key)
+                            .andEqualTo("originId", originId)
             );
 
             paper = one(userPaperMapper, example);
             if (paper == null){
-                paper = UserPaper.builder().userId(userId).paperModule(module.key).moduleId(paperId).build();
+                paper = UserPaper.builder()
+                        .userId(userId)
+                        .paperOrigin(origin.key)
+                        .originId(originId)
+                        .build();
                 // 回调,根据模块更新设置
-                IInitPaper.callback(paper, paperId);
+                IInitPaper.callback(paper, originId);
                 paper = add(paper);
             }
         }

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/service/annotation/InitPaper.java

@@ -8,5 +8,5 @@ import com.qxgmat.data.dao.entity.UserPaper;
  */
 @FunctionalInterface
 public interface InitPaper {
-    void callback(UserPaper paper, Integer pager);
+    void callback(UserPaper userPaper, Integer originId);
 }

+ 98 - 141
server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

@@ -6,6 +6,7 @@ import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.qxgmat.data.constants.enums.*;
 import com.qxgmat.data.constants.enums.module.PaperModule;
+import com.qxgmat.data.constants.enums.module.PaperOrigin;
 import com.qxgmat.data.constants.enums.module.QuestionModule;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.*;
@@ -92,15 +93,6 @@ public class QuestionFlowService {
             Integer time = toolsService.computerTime(relationList.toArray(new QuestionNoRelation[0]));
             userPaper.setTime(time);
         });
-        initPaperCallback.put(PaperModule.PREVIEW, (userPaper, id)->{
-            // 后台主动修改,无需变更
-        });
-        initPaperCallback.put(PaperModule.ERROR, (userPaper, id)->{
-            // 用户主动添加,无需变更
-        });
-        initPaperCallback.put(PaperModule.COLLECT, (userPaper, id)->{
-            // 用户主动添加,无需变更
-        });
         initPaperCallback.put(PaperModule.SENTENCE, (userPaper, id)->{
             SentencePaper paper = sentencePaperService.get(id);
             userPaper.setTitle(paper.getTitle());
@@ -133,27 +125,6 @@ public class QuestionFlowService {
 //                report.setQuestionNoIds(this.randomQuestionNoIds(paper.getQuestionNoIds()));
             }
         });
-        initReportCallback.put(PaperModule.PREVIEW, (report, paper)->{
-            JSONObject setting = report.getSetting();
-            if (setting.getBoolean("disorder")){
-                // 随机试题
-//                report.setQuestionNoIds(this.randomQuestionNoIds(paper.getQuestionNoIds()));
-            }
-        });
-        initReportCallback.put(PaperModule.COLLECT, (report, paper)->{
-            JSONObject setting = report.getSetting();
-            if (setting.getBoolean("disorder")){
-                // 随机试题
-//                report.setQuestionNoIds(this.randomQuestionNoIds(paper.getQuestionNoIds()));
-            }
-        });
-        initReportCallback.put(PaperModule.ERROR, (report, paper)->{
-            JSONObject setting = report.getSetting();
-            if (setting.getBoolean("disorder")){
-                // 随机试题
-//                report.setQuestionNoIds(this.randomQuestionNoIds(paper.getQuestionNoIds()));
-            }
-        });
         initReportCallback.put(PaperModule.SENTENCE, (report, paper)->{
             // 无特殊设置
         });
@@ -176,24 +147,6 @@ public class QuestionFlowService {
             this.bindQuestionNo(question, questionNoId);
             // 设定最后一次练习记录
             usersService.edit(User.builder().id(question.getUserId()).latestExercise(report.getPaperId()).build());
-            return true;
-        });
-        nextCallback.put(PaperModule.PREVIEW, (question, report, lastQuestion)->{
-            Integer questionNoId = this.nextId(report.getQuestionNoIds(), lastQuestion!=null ? lastQuestion.getQuestionNoId():null);
-            if (questionNoId == 0) return false;
-            this.bindQuestionNo(question, questionNoId);
-            return true;
-        });
-        nextCallback.put(PaperModule.COLLECT, (question, report, lastQuestion)->{
-            Integer questionNoId = this.nextId(report.getQuestionNoIds(), lastQuestion!=null ? lastQuestion.getQuestionNoId():null);
-            if (questionNoId == 0) return false;
-            this.bindQuestionNo(question, questionNoId);
-            return true;
-        });
-        nextCallback.put(PaperModule.ERROR, (question, report, lastQuestion)->{
-            Integer questionNoId = this.nextId(report.getQuestionNoIds(), lastQuestion!=null ? lastQuestion.getQuestionNoId():null);
-            if (questionNoId == 0) return false;
-            this.bindQuestionNo(question, questionNoId);
             // 设定最后一次错题记录
             usersService.edit(User.builder().id(question.getUserId()).latestError(report.getPaperId()).build());
             return true;
@@ -225,7 +178,7 @@ public class QuestionFlowService {
             // 根据设置出题
             QuestionNoRelation relation = null;
             // todo 适应性难度判断
-            ExaminationPaper paper = examinationPaperService.get(report.getModuleId());
+            ExaminationPaper paper = examinationPaperService.get(report.getOriginId());
             if (paper.getIsAdapt() > 0){
 
             }else{
@@ -243,8 +196,7 @@ public class QuestionFlowService {
             JSONObject userAnswer = userQuestion.getUserAnswer();
             Question question = questionService.get(userQuestion.getQuestionId());
             JSONObject answer = question.getAnswer();
-            boolean result = this.baseAnswer(userAnswer, answer, question);
-            return result;
+            return (boolean) this.baseAnswer(userAnswer, answer, question);
         });
         submitCallback.put(QuestionModule.SENTENCE, (userQuestion, userReport)->{
             // 判断答题情况
@@ -292,98 +244,23 @@ public class QuestionFlowService {
             questionNoService.accumulation(userQuestion);
             questionService.accumulation(userQuestion);
             // 统计答案分布
-            JSONObject answerDistributed = question.getAnswerDistributed();
-            JSONObject answer = question.getAnswer();
-            JSONObject userAnswer = userQuestion.getUserAnswer();
-
-            String type = question.getContent().getString("type");
-            QuestionContentType contentType = QuestionContentType.ValueOf(type);
-            JSONArray userQuestions = userAnswer.getJSONArray("questions");
-            JSONArray questions = answer.getJSONArray("questions");
-            JSONArray distributed = answerDistributed.getJSONArray("questions");
-            if (distributed == null || distributed.isEmpty()){
-                distributed = new JSONArray();
-                answerDistributed.put("questions", distributed);
-            }
-            for(int i = 0; i< questions.size(); i++){
-                JSONObject userOne = userQuestions.getJSONObject(i);
-                JSONObject one = questions.getJSONObject(i);
-                JSONObject target = distributed.getJSONObject(i);
-                if (target == null || target.isEmpty()){
-                    target = new JSONObject();
-                    distributed.add(i, target);
-                }
-                switch(contentType){
-                    case DOUBLE:
-                        JSONArray userDoubleList = userOne.getJSONArray("double");
-                        JSONArray doubleList = one.getJSONArray("double");
-                        JSONArray doubleResult = target.getJSONArray("double");
-                        if (doubleResult == null || doubleResult.isEmpty()){
-                            doubleResult = new JSONArray();
-                            target.put("double", doubleResult);
-                        }
-                        for(int j = 0; j < doubleList.size(); j++){
-                            JSONArray singleList = doubleList.getJSONArray(j);
-                            JSONArray userSingleList = userDoubleList.getJSONArray(i);
-                            JSONArray singleResult = doubleResult.getJSONArray(j);
-                            if (singleResult == null){
-                                singleResult = new JSONArray(0);
-                                doubleResult.set(j, singleResult);
-                            }
-                            for (int k = 0; k < singleList.size(); k++){
-                                if (singleResult.get(k) == null){
-                                    singleResult.set(k, 0);
-                                }
-                                if (userSingleList.getBoolean(k)){
-                                    singleResult.set(k, singleResult.getIntValue(k)+1);
-                                }
-                            }
-                        }
-                        break;
-                    case SINGLE:
-                    case INLINE:
-                    default:
-                        JSONArray userSingleList = userOne.getJSONArray("single");
-                        JSONArray singleList = one.getJSONArray("single");
-                        JSONArray singleResult = target.getJSONArray("single");
-                        if (singleResult == null || singleResult.isEmpty()){
-                            singleResult = new JSONArray();
-                            target.put("single", singleResult);
-                        }
-                        for(int j = 0; j < singleList.size(); j++){
-                            if (singleResult.get(j) == null){
-                                singleResult.set(j, 0);
-                            }
-                            if (userSingleList.getBoolean(j)){
-                                singleResult.set(j, singleResult.getIntValue(j)+1);
-                            }
-                        }
-
-                }
-            }
-            questionService.edit(Question.builder().id(question.getId())
-                    .answerDistributed(answerDistributed)
-                    .build());
-
+            this.answerDistributed(userQuestion, question);
         });
         submitAfterCallback.put(QuestionModule.SENTENCE, (userQuestion, question)->{
-            // 更新题目及题目编号统计
-            questionService.accumulation(userQuestion);
+            // 更新题目及长难句统计
             sentenceQuestionService.accumulation(userQuestion);
+            questionService.accumulation(userQuestion);
+        });
+        submitAfterCallback.put(QuestionModule.TEXTBOOK, (userQuestion, question)->{
+            // 更新题目及机经统计
+            textbookQuestionService.accumulation(userQuestion);
+            questionService.accumulation(userQuestion);
+            this.answerDistributed(userQuestion, question);
         });
 
         finishCallback.put(PaperModule.EXERCISE, (report, questionList)->{
             report.setDetail(this.statExerciseReport(report, questionList));
         });
-        finishCallback.put(PaperModule.PREVIEW, (report, questionList)->{
-            report.setDetail(this.statExerciseReport(report, questionList));
-        });
-        finishCallback.put(PaperModule.COLLECT, (report,questionList)->{
-            report.setDetail(this.statExerciseReport(report, questionList));
-        });
-        finishCallback.put(PaperModule.ERROR, (report, questionList)->{
-            report.setDetail(this.statExerciseReport(report, questionList));
-        });
         finishCallback.put(PaperModule.SENTENCE, (report, questionList)->{
             report.setDetail(this.statSentenceReport(report, questionList));
         });
@@ -399,21 +276,21 @@ public class QuestionFlowService {
     /**
      * 开始新一轮做题
      * @param userId
-     * @param module
+     * @param origin
      * @param paperId
      * @param setting
      * @return
      */
     @Transactional
-    public UserReportRelation start(Integer userId, PaperModule module, Integer paperId, JSONObject setting){
-        UserPaper paper = userPaperService.getByPaper(userId, module, paperId, initPaperCallback.get(module));
+    public UserReportRelation start(Integer userId, PaperOrigin origin, Integer paperId, JSONObject setting){
+        UserPaper paper = userPaperService.getByPaper(userId, origin, paperId, initPaperCallback.get(origin));
         // 查找对应的report是否有,如果没有或reset为1,则添加
         if (paper.getIsReset() > 0) {
             paper.setIsReset(0);
             userPaperService.edit(paper);
         }
         // 记录考试设置
-        UserReport userReport = userReportService.addByPaper(paper, setting, initReportCallback.get(module));
+        UserReport userReport = userReportService.addByPaper(paper, setting, initReportCallback.get(PaperModule.ValueOf(paper.getPaperModule())));
 
         return relationReport(userReport);
     }
@@ -713,6 +590,86 @@ public class QuestionFlowService {
     }
 
     /**
+     * 统计答案分布
+     * @param userQuestion
+     * @param question
+     */
+    private void answerDistributed(UserQuestion userQuestion, Question question){
+        JSONObject answerDistributed = question.getAnswerDistributed();
+        JSONObject answer = question.getAnswer();
+        JSONObject userAnswer = userQuestion.getUserAnswer();
+
+        String type = question.getContent().getString("type");
+        QuestionContentType contentType = QuestionContentType.ValueOf(type);
+        JSONArray userQuestions = userAnswer.getJSONArray("questions");
+        JSONArray questions = answer.getJSONArray("questions");
+        JSONArray distributed = answerDistributed.getJSONArray("questions");
+        if (distributed == null || distributed.isEmpty()){
+            distributed = new JSONArray();
+            answerDistributed.put("questions", distributed);
+        }
+        for(int i = 0; i< questions.size(); i++){
+            JSONObject userOne = userQuestions.getJSONObject(i);
+            JSONObject one = questions.getJSONObject(i);
+            JSONObject target = distributed.getJSONObject(i);
+            if (target == null || target.isEmpty()){
+                target = new JSONObject();
+                distributed.add(i, target);
+            }
+            switch(contentType){
+                case DOUBLE:
+                    JSONArray userDoubleList = userOne.getJSONArray("double");
+                    JSONArray doubleList = one.getJSONArray("double");
+                    JSONArray doubleResult = target.getJSONArray("double");
+                    if (doubleResult == null || doubleResult.isEmpty()){
+                        doubleResult = new JSONArray();
+                        target.put("double", doubleResult);
+                    }
+                    for(int j = 0; j < doubleList.size(); j++){
+                        JSONArray singleList = doubleList.getJSONArray(j);
+                        JSONArray userSingleList = userDoubleList.getJSONArray(i);
+                        JSONArray singleResult = doubleResult.getJSONArray(j);
+                        if (singleResult == null){
+                            singleResult = new JSONArray(0);
+                            doubleResult.set(j, singleResult);
+                        }
+                        for (int k = 0; k < singleList.size(); k++){
+                            if (singleResult.get(k) == null){
+                                singleResult.set(k, 0);
+                            }
+                            if (userSingleList.getBoolean(k)){
+                                singleResult.set(k, singleResult.getIntValue(k)+1);
+                            }
+                        }
+                    }
+                    break;
+                case SINGLE:
+                case INLINE:
+                default:
+                    JSONArray userSingleList = userOne.getJSONArray("single");
+                    JSONArray singleList = one.getJSONArray("single");
+                    JSONArray singleResult = target.getJSONArray("single");
+                    if (singleResult == null || singleResult.isEmpty()){
+                        singleResult = new JSONArray();
+                        target.put("single", singleResult);
+                    }
+                    for(int j = 0; j < singleList.size(); j++){
+                        if (singleResult.get(j) == null){
+                            singleResult.set(j, 0);
+                        }
+                        if (userSingleList.getBoolean(j)){
+                            singleResult.set(j, singleResult.getIntValue(j)+1);
+                        }
+                    }
+
+            }
+        }
+        questionService.edit(Question.builder().id(question.getId())
+                .answerDistributed(answerDistributed)
+                .build());
+    }
+
+    /**
      * 根据练习报告格式,统计信息
      * @param report
      * @param questionList
@@ -783,7 +740,7 @@ public class QuestionFlowService {
 
         JSONObject limit = new JSONObject();
         // 限时统计考试正确度
-        UserReportLimitRelation relation = userReportService.statLimit(report.getPaperModule(), report.getModuleId());
+        UserReportLimitRelation relation = userReportService.statLimit(report.getPaperOrigin(), report.getOriginId());
         limit.put("userNumber", relation.getUserNumber());
         limit.put("userCorrect", relation.getUserCorrect());
         detail.put("limit", limit);
@@ -872,7 +829,7 @@ public class QuestionFlowService {
 
         JSONObject limit = new JSONObject();
         // 限时统计考试正确度
-        UserReportLimitRelation relation = userReportService.statLimit(report.getPaperModule(), report.getModuleId());
+        UserReportLimitRelation relation = userReportService.statLimit(report.getPaperOrigin(), report.getOriginId());
         limit.put("userNumber", relation.getUserNumber());
         limit.put("userCorrect", relation.getUserCorrect());
         detail.put("limit", limit);

+ 2 - 2
server/gateway-api/src/main/java/com/qxgmat/service/inline/RankService.java

@@ -45,7 +45,7 @@ public class RankService extends AbstractService {
     }
 
     /**
-     * 计算考分
+     * 计算考分:通过总分Q分
      * @param totalScore
      * @param quantScore
      * @return
@@ -62,7 +62,7 @@ public class RankService extends AbstractService {
     }
 
     /**
-     * 计算考分
+     * 计算考分:通过Q分V分
      * @param quantScore
      * @param verbalScore
      * @return

+ 15 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserPaperQuestionService.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
+import com.qxgmat.data.constants.enums.module.PaperModule;
 import com.qxgmat.data.dao.UserPaperMapper;
 import com.qxgmat.data.dao.UserPaperQuestionMapper;
 import com.qxgmat.data.dao.entity.UserPaper;
@@ -11,6 +12,7 @@ import com.qxgmat.data.dao.entity.UserPaperQuestion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.Collection;
@@ -23,6 +25,19 @@ public class UserPaperQuestionService extends AbstractService {
     @Resource
     private UserPaperQuestionMapper userPaperQuestionMapper;
 
+    /**
+     * 自由组卷:根据题目编号id
+     * @param userId
+     * @param paperModule
+     * @param questionNoIds
+     * @param filterTimes
+     * @return
+     */
+    @Transactional
+    private UserPaper makePaper(Integer userId, PaperModule paperModule, List<Integer> questionNoIds, Integer filterTimes){
+        return null;
+    }
+
     public UserPaperQuestion add(UserPaperQuestion paper){
         int result = insert(userPaperQuestionMapper, paper);
         paper = one(userPaperQuestionMapper, paper.getId());

+ 16 - 6
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java

@@ -63,12 +63,12 @@ public class UserReportService extends AbstractService {
 
     /**
      * 按report统计在限定时间内的做题结果
-     * @param module
-     * @param moduleId
+     * @param origin
+     * @param originId
      * @return
      */
-    public UserReportLimitRelation statLimit(String module, Integer moduleId){
-        List<UserReportLimitRelation> relations =  userReportRelationMapper.statLimit(module, moduleId);
+    public UserReportLimitRelation statLimit(String origin, Integer originId){
+        List<UserReportLimitRelation> relations =  userReportRelationMapper.statLimit(origin, originId);
         if (relations.size() > 0){
             return relations.get(0);
         }else{
@@ -116,6 +116,15 @@ public class UserReportService extends AbstractService {
     }
 
     /**
+     * 按report统计预习模块不同题型用户的做题记录
+     * @param userId
+     * @return
+     */
+    public List<UserStudyStatRelation> statGroupPreviewType(Integer userId, String startTime, String endTime){
+        return userReportRelationMapper.statGroupPreviewType(userId, startTime, endTime);
+    }
+
+    /**
      * 计算用户在指定时间内的练习排行
      * @param userId
      * @param startTime
@@ -157,10 +166,11 @@ public class UserReportService extends AbstractService {
     public UserReport addByPaper(UserPaper paper, JSONObject setting, InitReport IInitReport){
         UserReport report = UserReport.builder()
                 .paperModule(paper.getPaperModule())
-                .moduleId(paper.getModuleId())
+                .paperOrigin(paper.getPaperOrigin())
+                .originId(paper.getOriginId())
+                .paperId(paper.getId())
                 .setting(setting)
                 .userId(paper.getUserId())
-                .paperId(paper.getId())
                 .questionNoIds(paper.getQuestionNoIds())
                 .questionNumber(paper.getQuestionNoIds().length)
                 .time(paper.getTime())