Browse Source

feat(server): 调整结构

Go 6 years ago
parent
commit
083f22e4d0
90 changed files with 2068 additions and 705 deletions
  1. 35 1
      front/project/Constant.js
  2. 3 3
      front/project/admin/routes/subject/exercise/page.js
  3. 3 3
      front/project/admin/routes/user/ask/page.js
  4. 22 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/QuestionContentType.java
  5. 1 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperModule.java
  6. 1 3
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/QuestionModule.java
  7. 1 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/ReportModule.java
  8. 3 3
      server/data/src/main/java/com/qxgmat/data/constants/enums/status/HomeworkPreviewStatus.java
  9. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/ClassCourseMapper.java
  10. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/HomeworkPreviewMapper.java
  11. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/PreviewPaperMapper.java
  12. 203 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourse.java
  13. 0 35
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExaminationStruct.java
  14. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaper.java
  15. 26 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaperQuestion.java
  16. 105 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseStruct.java
  17. 93 23
      server/data/src/main/java/com/qxgmat/data/dao/entity/HomeworkPreview.java
  18. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/Question.java
  19. 35 35
      server/data/src/main/java/com/qxgmat/data/dao/entity/QuestionNo.java
  20. 14 14
      server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceQuestion.java
  21. 131 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookPaper.java
  22. 106 36
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookQuestion.java
  23. 24 24
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaper.java
  24. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaperQuestion.java
  25. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserQuestion.java
  26. 13 13
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java
  27. 20 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseMapper.xml
  28. 1 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExaminationStructMapper.xml
  29. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExercisePaperMapper.xml
  30. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExercisePaperQuestionMapper.xml
  31. 5 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExerciseStructMapper.xml
  32. 7 5
      server/data/src/main/java/com/qxgmat/data/dao/mapping/HomeworkPreviewMapper.xml
  33. 3 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionMapper.xml
  34. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionNoMapper.xml
  35. 5 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookPaperMapper.xml
  36. 7 4
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookQuestionMapper.xml
  37. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperMapper.xml
  38. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperQuestionMapper.xml
  39. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserQuestionMapper.xml
  40. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml
  41. 4 3
      server/data/src/main/java/com/qxgmat/data/relation/UserPaperRelationMapper.java
  42. 14 0
      server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java
  43. 11 13
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserHomeworkPreviewRelation.java
  44. 34 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserReportLimitRelation.java
  45. 34 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserStudyStatRelation.java
  46. 1 81
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserNoteQuestionRelationMapper.xml
  47. 10 10
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml
  48. 4 3
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserRelationMapper.xml
  49. 44 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml
  50. 2 1
      server/data/src/main/resources/mybatis-generator.xml
  51. 7 7
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/ExerciseController.java
  52. 20 22
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/PreviewController.java
  53. 6 6
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserAskController.java
  54. 17 17
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserPreviewController.java
  55. 113 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/CourseController.java
  56. 38 9
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  57. 34 81
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  58. 42 1
      server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java
  59. 4 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/ExercisePaperExtendDto.java
  60. 3 5
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/HomeworkPreviewExtendDto.java
  61. 4 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserClassExtendDto.java
  62. 4 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserExtendDto.java
  63. 0 1
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserReportExtendDto.java
  64. 4 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserServiceExtendDto.java
  65. 3 5
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/HomeworkPreviewDto.java
  66. 3 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/LoginUserDto.java
  67. 3 5
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewDetailDto.java
  68. 3 4
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewListDto.java
  69. 11 15
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserHomeworkPreviewListDto.java
  70. 1 1
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserHomeworkPreviewExtendDto.java
  71. 2 5
      server/gateway-api/src/main/java/com/qxgmat/dto/response/PaperBaseDto.java
  72. 10 10
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserClassDetailDto.java
  73. 3 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserDto.java
  74. 0 7
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserExerciseGroupDto.java
  75. 5 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionDataDto.java
  76. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionDetailDto.java
  77. 1 1
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionListDto.java
  78. 8 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentencePaperDto.java
  79. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionDetailDto.java
  80. 59 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserStudyDetailDto.java
  81. 62 63
      server/gateway-api/src/main/java/com/qxgmat/service/HomeworkPreviewService.java
  82. 3 3
      server/gateway-api/src/main/java/com/qxgmat/service/UserPaperService.java
  83. 2 0
      server/gateway-api/src/main/java/com/qxgmat/service/UserQuestionService.java
  84. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/annotation/SubmitQuestion.java
  85. 314 35
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java
  86. 6 8
      server/gateway-api/src/main/java/com/qxgmat/service/extend/ToolsService.java
  87. 19 4
      server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionNoService.java
  88. 0 3
      server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionService.java
  89. 74 2
      server/gateway-api/src/main/java/com/qxgmat/service/inline/SentenceQuestionService.java
  90. 35 7
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java

+ 35 - 1
front/project/Constant.js

@@ -54,10 +54,44 @@ export const SentenceOption = [{ label: '平行', value: 'parallel' }, { label:
 //     single: [true, false],
 //     double: [[true, false], [false, true]],
 //   }],
-
+//   // aws作文内容
+//   aws: '',
 //   // sentence
 //   subject: [],
 //   predicate: [],
 //   object: [],
 //   options: [],
 // };
+
+// 备考统计字段格式
+// const PrepareStat = {
+//   status: [{ key: '', value: '' }],
+//   goal: [{ key: '', value: '' }],
+//   examinationTime: [{ key: '', value: '' }],
+//   scoreTime: [{ key: '', value: '' }],
+// };
+
+// 练习报告
+// const exerciseReportDetail = {
+//   pace: [{ no: '', time: '', userTime: '' }],
+//   difficult: [{ key: '', userNumber: '', userCorrect: '', totalNumber: '', totalCorrect: '' }],
+//   place: [{ key: '', userNumber: '', userCorrect: '', userTime: '' }],
+//   limit: { userNumber: '', userCorrect: '' },
+//   info: { times: '', finishTime: '', userTime: '', time: '', questionNumber: '', userNumber: '', userCorrect: '', totalNumber: '', totalCorrect: '', totalTime: '', correctTime: '', incorrectTime: '' },
+// };
+
+// 长难句做题结果
+// const sentenceQuestionDetail = {
+//   subject: true,
+//   predicate: true,
+//   object: true,
+//   options: true,
+// };
+
+// 长难句报告
+// const sentenceReportDetail = {
+//   ability: { score: '', struct: '', logic: '', spped: '' },
+//   info: { times: '', finishTime: '', userTime: '', time: '', questionNumber: '', userNumber: '', userCorrect: '', totalNumber: '', totalCorrect: '', totalTime: '', correctTime: '', incorrectTime: '' },
+// };
+
+// 每日统计

+ 3 - 3
front/project/admin/routes/subject/exercise/page.js

@@ -29,7 +29,7 @@ const filterForm = [
     number: true,
   },
   {
-    key: 'struct_id',
+    key: 'structId',
     type: 'tree',
     allowClear: true,
     name: '分册',
@@ -38,7 +38,7 @@ const filterForm = [
     number: true,
   },
   {
-    key: 'paper_id',
+    key: 'paperId',
     type: 'select',
     allowClear: true,
     name: '练习册',
@@ -70,7 +70,7 @@ const filterForm = [
     name: '修改时间',
   },
   {
-    key: 'question_no_id',
+    key: 'questionNoId',
     type: 'select',
     allowClear: true,
     name: '题目ID',

+ 3 - 3
front/project/admin/routes/user/ask/page.js

@@ -37,7 +37,7 @@ export default class extends Page {
       name: '消费金额',
       select: MoneyRange,
     }, {
-      key: 'show_status',
+      key: 'showStatus',
       type: 'select',
       allowClear: true,
       name: '展示状态',
@@ -49,7 +49,7 @@ export default class extends Page {
       name: '提问内容',
       select: AskTarget,
     }, {
-      key: 'question_no_id',
+      key: 'questionNoId',
       type: 'select',
       allowClear: true,
       name: '题目ID',
@@ -57,7 +57,7 @@ export default class extends Page {
       number: true,
       placeholder: '请输入',
     }, {
-      key: 'user_id',
+      key: 'userId',
       type: 'select',
       name: '用户',
       allowClear: true,

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

@@ -0,0 +1,22 @@
+package com.qxgmat.data.constants.enums;
+
+/**
+ * Created by gaojie on 2017/11/19.
+ */
+public enum QuestionContentType {
+    SINGLE("single"),
+    DOUBLE("double"),
+    INLINE("inline"),
+    ;
+    final static public String message = "题目内容类型";
+
+    public String key;
+    private QuestionContentType(String key){
+        this.key = key;
+    }
+
+    public static QuestionContentType ValueOf(String name){
+        if (name == null) return null;
+        return QuestionContentType.valueOf(name.toUpperCase());
+    }
+}

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

@@ -5,7 +5,7 @@ public enum PaperModule {
     EXAMINATION("examination"),
     COLLECT("collect"),
     ERROR("error"),
-    HOMEWORK_PREVIEW("homework_preview"),
+    PREVIEW("preview"),
     TEXTBOOK("textbook"),
     SENTENCE("sentence"),
     ;

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

@@ -1,7 +1,5 @@
 package com.qxgmat.data.constants.enums.module;
 
-import com.qxgmat.data.dao.entity.Question;
-
 public enum QuestionModule {
     BASE("base"), // 练习、模考、错题、收藏、预习作业
     TEXTBOOK("textbook"), // 机经
@@ -32,7 +30,7 @@ public enum QuestionModule {
             case COLLECT:
             case EXERCISE:
             case EXAMINATION:
-            case HOMEWORK_PREVIEW:
+            case PREVIEW:
                 return BASE;
             default:
                 return null;

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

@@ -1,7 +1,7 @@
 package com.qxgmat.data.constants.enums.module;
 
 public enum ReportModule {
-    EXERCISE("exercise"), EXAMINATION("examination"), SENTENCE("sentence"), HOMEWORK_PREVIEW("homework_preview"), TEXTBOOK("textbook");
+    EXERCISE("exercise"), EXAMINATION("examination"), SENTENCE("sentence"), PREVIEW("preview"), TEXTBOOK("textbook");
     public String key;
     private ReportModule(String key){
         this.key = key;

+ 3 - 3
server/data/src/main/java/com/qxgmat/data/constants/enums/status/HomeworkPreviewStatus.java

@@ -3,15 +3,15 @@ package com.qxgmat.data.constants.enums.status;
 /**
  * Created by gaojie on 2017/11/19.
  */
-public enum HomeworkPreviewStatus {
+public enum PreviewStatus {
     ALL(0), NO_START(1), PROCESS(2), FINISH(3);
     final static public String message = "状态:1未开始,2进行中,3已结束";
 
     public int index;
-    private HomeworkPreviewStatus(int index){
+    private PreviewStatus(int index){
         this.index = index;
     }
-    public static HomeworkPreviewStatus ValueOf(Integer index){
+    public static PreviewStatus ValueOf(Integer index){
         if (index == null) return ALL;
         switch (index){
             case 1:

+ 7 - 0
server/data/src/main/java/com/qxgmat/data/dao/ClassCourseMapper.java

@@ -0,0 +1,7 @@
+package com.qxgmat.data.dao;
+
+import com.nuliji.tools.mybatis.Mapper;
+import com.qxgmat.data.dao.entity.ClassCourse;
+
+public interface ClassCourseMapper extends Mapper<ClassCourse> {
+}

+ 0 - 7
server/data/src/main/java/com/qxgmat/data/dao/HomeworkPreviewMapper.java

@@ -1,7 +0,0 @@
-package com.qxgmat.data.dao;
-
-import com.nuliji.tools.mybatis.Mapper;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
-
-public interface HomeworkPreviewMapper extends Mapper<HomeworkPreview> {
-}

+ 7 - 0
server/data/src/main/java/com/qxgmat/data/dao/PreviewPaperMapper.java

@@ -0,0 +1,7 @@
+package com.qxgmat.data.dao;
+
+import com.nuliji.tools.mybatis.Mapper;
+import com.qxgmat.data.dao.entity.PreviewPaper;
+
+public interface PreviewPaperMapper extends Mapper<PreviewPaper> {
+}

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

@@ -0,0 +1,203 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import javax.persistence.*;
+
+@Table(name = "class_course")
+public class ClassCourse implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 节点id
+     */
+    @Column(name = "`struct_id`")
+    private Integer structId;
+
+    /**
+     * 上级节点id,0为无上级
+     */
+    @Column(name = "`parent_struct_id`")
+    private Integer parentStructId;
+
+    /**
+     * 题目模块:base,sentence,textbook
+     */
+    @Column(name = "`question_module`")
+    private String questionModule;
+
+    /**
+     * 课程名称
+     */
+    @Column(name = "`title`")
+    private String title;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取节点id
+     *
+     * @return struct_id - 节点id
+     */
+    public Integer getStructId() {
+        return structId;
+    }
+
+    /**
+     * 设置节点id
+     *
+     * @param structId 节点id
+     */
+    public void setStructId(Integer structId) {
+        this.structId = structId;
+    }
+
+    /**
+     * 获取上级节点id,0为无上级
+     *
+     * @return parent_struct_id - 上级节点id,0为无上级
+     */
+    public Integer getParentStructId() {
+        return parentStructId;
+    }
+
+    /**
+     * 设置上级节点id,0为无上级
+     *
+     * @param parentStructId 上级节点id,0为无上级
+     */
+    public void setParentStructId(Integer parentStructId) {
+        this.parentStructId = parentStructId;
+    }
+
+    /**
+     * 获取题目模块:base,sentence,textbook
+     *
+     * @return question_module - 题目模块:base,sentence,textbook
+     */
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    /**
+     * 设置题目模块:base,sentence,textbook
+     *
+     * @param questionModule 题目模块:base,sentence,textbook
+     */
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    /**
+     * 获取课程名称
+     *
+     * @return title - 课程名称
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 设置课程名称
+     *
+     * @param title 课程名称
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", structId=").append(structId);
+        sb.append(", parentStructId=").append(parentStructId);
+        sb.append(", questionModule=").append(questionModule);
+        sb.append(", title=").append(title);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static ClassCourse.Builder builder() {
+        return new ClassCourse.Builder();
+    }
+
+    public static class Builder {
+        private ClassCourse obj;
+
+        public Builder() {
+            this.obj = new ClassCourse();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置节点id
+         *
+         * @param structId 节点id
+         */
+        public Builder structId(Integer structId) {
+            obj.setStructId(structId);
+            return this;
+        }
+
+        /**
+         * 设置上级节点id,0为无上级
+         *
+         * @param parentStructId 上级节点id,0为无上级
+         */
+        public Builder parentStructId(Integer parentStructId) {
+            obj.setParentStructId(parentStructId);
+            return this;
+        }
+
+        /**
+         * 设置题目模块:base,sentence,textbook
+         *
+         * @param questionModule 题目模块:base,sentence,textbook
+         */
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
+            return this;
+        }
+
+        /**
+         * 设置课程名称
+         *
+         * @param title 课程名称
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        public ClassCourse build() {
+            return this.obj;
+        }
+    }
+}

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

@@ -41,12 +41,6 @@ public class ExaminationStruct implements Serializable {
     private Integer level;
 
     /**
-     * 付费状态:0关闭,1开启
-     */
-    @Column(name = "`pay_status`")
-    private Integer payStatus;
-
-    /**
      * 说明
      */
     @Column(name = "`description`")
@@ -159,24 +153,6 @@ public class ExaminationStruct implements Serializable {
     }
 
     /**
-     * 获取付费状态:0关闭,1开启
-     *
-     * @return pay_status - 付费状态:0关闭,1开启
-     */
-    public Integer getPayStatus() {
-        return payStatus;
-    }
-
-    /**
-     * 设置付费状态:0关闭,1开启
-     *
-     * @param payStatus 付费状态:0关闭,1开启
-     */
-    public void setPayStatus(Integer payStatus) {
-        this.payStatus = payStatus;
-    }
-
-    /**
      * 获取说明
      *
      * @return description - 说明
@@ -206,7 +182,6 @@ public class ExaminationStruct implements Serializable {
         sb.append(", parentId=").append(parentId);
         sb.append(", order=").append(order);
         sb.append(", level=").append(level);
-        sb.append(", payStatus=").append(payStatus);
         sb.append(", description=").append(description);
         sb.append("]");
         return sb.toString();
@@ -282,16 +257,6 @@ public class ExaminationStruct implements Serializable {
         }
 
         /**
-         * 设置付费状态:0关闭,1开启
-         *
-         * @param payStatus 付费状态:0关闭,1开启
-         */
-        public Builder payStatus(Integer payStatus) {
-            obj.setPayStatus(payStatus);
-            return this;
-        }
-
-        /**
          * 设置说明
          *
          * @param description 说明

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

@@ -13,8 +13,8 @@ public class ExercisePaper implements Serializable {
     /**
      * 题型
      */
-    @Column(name = "`type`")
-    private String type;
+    @Column(name = "`question_type`")
+    private String questionType;
 
     /**
      * 组卷名称
@@ -89,19 +89,19 @@ public class ExercisePaper implements Serializable {
     /**
      * 获取题型
      *
-     * @return type - 题型
+     * @return question_type - 题型
      */
-    public String getType() {
-        return type;
+    public String getQuestionType() {
+        return questionType;
     }
 
     /**
      * 设置题型
      *
-     * @param type 题型
+     * @param questionType 题型
      */
-    public void setType(String type) {
-        this.type = type;
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
     }
 
     /**
@@ -273,7 +273,7 @@ public class ExercisePaper implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
-        sb.append(", type=").append(type);
+        sb.append(", questionType=").append(questionType);
         sb.append(", title=").append(title);
         sb.append(", no=").append(no);
         sb.append(", logic=").append(logic);
@@ -309,10 +309,10 @@ public class ExercisePaper implements Serializable {
         /**
          * 设置题型
          *
-         * @param type 题型
+         * @param questionType 题型
          */
-        public Builder type(String type) {
-            obj.setType(type);
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
             return this;
         }
 

+ 26 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaperQuestion.java

@@ -34,6 +34,9 @@ public class ExercisePaperQuestion implements Serializable {
     @Column(name = "`no`")
     private Integer no;
 
+    @Column(name = "`status`")
+    private Integer status;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -122,6 +125,20 @@ public class ExercisePaperQuestion implements Serializable {
         this.no = no;
     }
 
+    /**
+     * @return status
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * @param status
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -133,6 +150,7 @@ public class ExercisePaperQuestion implements Serializable {
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", no=").append(no);
+        sb.append(", status=").append(status);
         sb.append("]");
         return sb.toString();
     }
@@ -196,6 +214,14 @@ public class ExercisePaperQuestion implements Serializable {
             return this;
         }
 
+        /**
+         * @param status
+         */
+        public Builder status(Integer status) {
+            obj.setStatus(status);
+            return this;
+        }
+
         public ExercisePaperQuestion build() {
             return this.obj;
         }

+ 105 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseStruct.java

@@ -41,12 +41,30 @@ public class ExerciseStruct implements Serializable {
     private Integer level;
 
     /**
+     * 第二层绑定题型
+     */
+    @Column(name = "`type`")
+    private String type;
+
+    /**
+     * 题目模块:sentence,base,textbook
+     */
+    @Column(name = "`module`")
+    private String module;
+
+    /**
      * 提问状态:0关闭,1开启
      */
     @Column(name = "`question_status`")
     private Integer questionStatus;
 
     /**
+     * 是否是长难句:每一层都继承
+     */
+    @Column(name = "`is_sentence`")
+    private Integer isSentence;
+
+    /**
      * 描述
      */
     @Column(name = "`description`")
@@ -159,6 +177,42 @@ public class ExerciseStruct implements Serializable {
     }
 
     /**
+     * 获取第二层绑定题型
+     *
+     * @return type - 第二层绑定题型
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * 设置第二层绑定题型
+     *
+     * @param type 第二层绑定题型
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * 获取题目模块:sentence,base,textbook
+     *
+     * @return module - 题目模块:sentence,base,textbook
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * 设置题目模块:sentence,base,textbook
+     *
+     * @param module 题目模块:sentence,base,textbook
+     */
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
      * 获取提问状态:0关闭,1开启
      *
      * @return question_status - 提问状态:0关闭,1开启
@@ -177,6 +231,24 @@ public class ExerciseStruct implements Serializable {
     }
 
     /**
+     * 获取是否是长难句:每一层都继承
+     *
+     * @return is_sentence - 是否是长难句:每一层都继承
+     */
+    public Integer getIsSentence() {
+        return isSentence;
+    }
+
+    /**
+     * 设置是否是长难句:每一层都继承
+     *
+     * @param isSentence 是否是长难句:每一层都继承
+     */
+    public void setIsSentence(Integer isSentence) {
+        this.isSentence = isSentence;
+    }
+
+    /**
      * 获取描述
      *
      * @return description - 描述
@@ -206,7 +278,10 @@ public class ExerciseStruct implements Serializable {
         sb.append(", parentId=").append(parentId);
         sb.append(", order=").append(order);
         sb.append(", level=").append(level);
+        sb.append(", type=").append(type);
+        sb.append(", module=").append(module);
         sb.append(", questionStatus=").append(questionStatus);
+        sb.append(", isSentence=").append(isSentence);
         sb.append(", description=").append(description);
         sb.append("]");
         return sb.toString();
@@ -282,6 +357,26 @@ public class ExerciseStruct implements Serializable {
         }
 
         /**
+         * 设置第二层绑定题型
+         *
+         * @param type 第二层绑定题型
+         */
+        public Builder type(String type) {
+            obj.setType(type);
+            return this;
+        }
+
+        /**
+         * 设置题目模块:sentence,base,textbook
+         *
+         * @param module 题目模块:sentence,base,textbook
+         */
+        public Builder module(String module) {
+            obj.setModule(module);
+            return this;
+        }
+
+        /**
          * 设置提问状态:0关闭,1开启
          *
          * @param questionStatus 提问状态:0关闭,1开启
@@ -292,6 +387,16 @@ public class ExerciseStruct implements Serializable {
         }
 
         /**
+         * 设置是否是长难句:每一层都继承
+         *
+         * @param isSentence 是否是长难句:每一层都继承
+         */
+        public Builder isSentence(Integer isSentence) {
+            obj.setIsSentence(isSentence);
+            return this;
+        }
+
+        /**
          * 设置描述
          *
          * @param description 描述

+ 93 - 23
server/data/src/main/java/com/qxgmat/data/dao/entity/HomeworkPreview.java

@@ -4,8 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import javax.persistence.*;
 
-@Table(name = "homework_preview")
-public class HomeworkPreview implements Serializable {
+@Table(name = "preview_paper")
+public class PreviewPaper implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -18,10 +18,10 @@ public class HomeworkPreview implements Serializable {
     private String title;
 
     /**
-     * 课程id:读取struct第二层
+     * 课程id
      */
-    @Column(name = "`category`")
-    private Integer category;
+    @Column(name = "`course_id`")
+    private Integer courseId;
 
     /**
      * 题目编号id:json
@@ -30,6 +30,18 @@ public class HomeworkPreview implements Serializable {
     private Integer[] questionNoIds;
 
     /**
+     * 作业模式:0基础作业,1系统作业(自动发送给课程用户)
+     */
+    @Column(name = "`mode`")
+    private Integer mode;
+
+    /**
+     * 题目模块:base,preview,textbook
+     */
+    @Column(name = "`question_module`")
+    private String questionModule;
+
+    /**
      * 制定作业用户id:json
      */
     @Column(name = "`user_ids`")
@@ -94,21 +106,21 @@ public class HomeworkPreview implements Serializable {
     }
 
     /**
-     * 获取课程id:读取struct第二层
+     * 获取课程id
      *
-     * @return category - 课程id:读取struct第二层
+     * @return course_id - 课程id
      */
-    public Integer getCategory() {
-        return category;
+    public Integer getCourseId() {
+        return courseId;
     }
 
     /**
-     * 设置课程id:读取struct第二层
+     * 设置课程id
      *
-     * @param category 课程id:读取struct第二层
+     * @param courseId 课程id
      */
-    public void setCategory(Integer category) {
-        this.category = category;
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
     }
 
     /**
@@ -130,6 +142,42 @@ public class HomeworkPreview implements Serializable {
     }
 
     /**
+     * 获取作业模式:0基础作业,1系统作业(自动发送给课程用户)
+     *
+     * @return mode - 作业模式:0基础作业,1系统作业(自动发送给课程用户)
+     */
+    public Integer getMode() {
+        return mode;
+    }
+
+    /**
+     * 设置作业模式:0基础作业,1系统作业(自动发送给课程用户)
+     *
+     * @param mode 作业模式:0基础作业,1系统作业(自动发送给课程用户)
+     */
+    public void setMode(Integer mode) {
+        this.mode = mode;
+    }
+
+    /**
+     * 获取题目模块:base,preview,textbook
+     *
+     * @return question_module - 题目模块:base,preview,textbook
+     */
+    public String getQuestionModule() {
+        return questionModule;
+    }
+
+    /**
+     * 设置题目模块:base,preview,textbook
+     *
+     * @param questionModule 题目模块:base,preview,textbook
+     */
+    public void setQuestionModule(String questionModule) {
+        this.questionModule = questionModule;
+    }
+
+    /**
      * 获取制定作业用户id:json
      *
      * @return user_ids - 制定作业用户id:json
@@ -237,8 +285,10 @@ public class HomeworkPreview implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", title=").append(title);
-        sb.append(", category=").append(category);
+        sb.append(", courseId=").append(courseId);
         sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", mode=").append(mode);
+        sb.append(", questionModule=").append(questionModule);
         sb.append(", userIds=").append(userIds);
         sb.append(", startTime=").append(startTime);
         sb.append(", endTime=").append(endTime);
@@ -249,15 +299,15 @@ public class HomeworkPreview implements Serializable {
         return sb.toString();
     }
 
-    public static HomeworkPreview.Builder builder() {
-        return new HomeworkPreview.Builder();
+    public static PreviewPaper.Builder builder() {
+        return new PreviewPaper.Builder();
     }
 
     public static class Builder {
-        private HomeworkPreview obj;
+        private PreviewPaper obj;
 
         public Builder() {
-            this.obj = new HomeworkPreview();
+            this.obj = new PreviewPaper();
         }
 
         /**
@@ -279,12 +329,12 @@ public class HomeworkPreview implements Serializable {
         }
 
         /**
-         * 设置课程id:读取struct第二层
+         * 设置课程id
          *
-         * @param category 课程id:读取struct第二层
+         * @param courseId 课程id
          */
-        public Builder category(Integer category) {
-            obj.setCategory(category);
+        public Builder courseId(Integer courseId) {
+            obj.setCourseId(courseId);
             return this;
         }
 
@@ -299,6 +349,26 @@ public class HomeworkPreview implements Serializable {
         }
 
         /**
+         * 设置作业模式:0基础作业,1系统作业(自动发送给课程用户)
+         *
+         * @param mode 作业模式:0基础作业,1系统作业(自动发送给课程用户)
+         */
+        public Builder mode(Integer mode) {
+            obj.setMode(mode);
+            return this;
+        }
+
+        /**
+         * 设置题目模块:base,preview,textbook
+         *
+         * @param questionModule 题目模块:base,preview,textbook
+         */
+        public Builder questionModule(String questionModule) {
+            obj.setQuestionModule(questionModule);
+            return this;
+        }
+
+        /**
          * 设置制定作业用户id:json
          *
          * @param userIds 制定作业用户id:json
@@ -354,7 +424,7 @@ public class HomeworkPreview implements Serializable {
             return this;
         }
 
-        public HomeworkPreview build() {
+        public PreviewPaper build() {
             return this.obj;
         }
     }

+ 12 - 12
server/data/src/main/java/com/qxgmat/data/dao/entity/Question.java

@@ -21,8 +21,8 @@ public class Question implements Serializable {
     /**
      * 题型
      */
-    @Column(name = "`type`")
-    private String type;
+    @Column(name = "`question_type`")
+    private String questionType;
 
     /**
      * 考点: 读取setting
@@ -145,19 +145,19 @@ public class Question implements Serializable {
     /**
      * 获取题型
      *
-     * @return type - 题型
+     * @return question_type - 题型
      */
-    public String getType() {
-        return type;
+    public String getQuestionType() {
+        return questionType;
     }
 
     /**
      * 设置题型
      *
-     * @param type 题型
+     * @param questionType 题型
      */
-    public void setType(String type) {
-        this.type = type;
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
     }
 
     /**
@@ -460,7 +460,7 @@ public class Question implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", keyword=").append(keyword);
-        sb.append(", type=").append(type);
+        sb.append(", questionType=").append(questionType);
         sb.append(", place=").append(place);
         sb.append(", difficult=").append(difficult);
         sb.append(", description=").append(description);
@@ -515,10 +515,10 @@ public class Question implements Serializable {
         /**
          * 设置题型
          *
-         * @param type 题型
+         * @param questionType 题型
          */
-        public Builder type(String type) {
-            obj.setType(type);
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
             return this;
         }
 

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

@@ -12,6 +12,12 @@ public class QuestionNo implements Serializable {
     private Integer id;
 
     /**
+     * 人工id
+     */
+    @Column(name = "`title`")
+    private String title;
+
+    /**
      * 题目id
      */
     @Column(name = "`question_id`")
@@ -24,12 +30,6 @@ public class QuestionNo implements Serializable {
     private String module;
 
     /**
-     * 人工id
-     */
-    @Column(name = "`no`")
-    private String no;
-
-    /**
      * 对应模块结构信息,逗号分隔
      */
     @Column(name = "`module_struct`")
@@ -73,6 +73,24 @@ public class QuestionNo implements Serializable {
     }
 
     /**
+     * 获取人工id
+     *
+     * @return title - 人工id
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 设置人工id
+     *
+     * @param title 人工id
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
      * 获取题目id
      *
      * @return question_id - 题目id
@@ -109,24 +127,6 @@ public class QuestionNo implements Serializable {
     }
 
     /**
-     * 获取人工id
-     *
-     * @return no - 人工id
-     */
-    public String getNo() {
-        return no;
-    }
-
-    /**
-     * 设置人工id
-     *
-     * @param no 人工id
-     */
-    public void setNo(String no) {
-        this.no = no;
-    }
-
-    /**
      * 获取对应模块结构信息,逗号分隔
      *
      * @return module_struct - 对应模块结构信息,逗号分隔
@@ -219,9 +219,9 @@ public class QuestionNo implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", title=").append(title);
         sb.append(", questionId=").append(questionId);
         sb.append(", module=").append(module);
-        sb.append(", no=").append(no);
         sb.append(", moduleStruct=").append(moduleStruct);
         sb.append(", totalTime=").append(totalTime);
         sb.append(", totalNumber=").append(totalNumber);
@@ -251,6 +251,16 @@ public class QuestionNo implements Serializable {
         }
 
         /**
+         * 设置人工id
+         *
+         * @param title 人工id
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        /**
          * 设置题目id
          *
          * @param questionId 题目id
@@ -281,16 +291,6 @@ public class QuestionNo implements Serializable {
         }
 
         /**
-         * 设置人工id
-         *
-         * @param no 人工id
-         */
-        public Builder no(String no) {
-            obj.setNo(no);
-            return this;
-        }
-
-        /**
          * 设置总作答时间
          *
          * @param totalTime 总作答时间

+ 14 - 14
server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceQuestion.java

@@ -11,7 +11,7 @@ public class SentenceQuestion implements Serializable {
     private Integer id;
 
     /**
-     * 标题
+     * 序号:手工录入
      */
     @Column(name = "`title`")
     private String title;
@@ -29,7 +29,7 @@ public class SentenceQuestion implements Serializable {
     private Integer paperId;
 
     /**
-     * 序号:手工录入
+     * 组卷序号
      */
     @Column(name = "`no`")
     private Integer no;
@@ -81,18 +81,18 @@ public class SentenceQuestion implements Serializable {
     }
 
     /**
-     * 获取标题
+     * 获取序号:手工录入
      *
-     * @return title - 标题
+     * @return title - 序号:手工录入
      */
     public String getTitle() {
         return title;
     }
 
     /**
-     * 设置标题
+     * 设置序号:手工录入
      *
-     * @param title 标题
+     * @param title 序号:手工录入
      */
     public void setTitle(String title) {
         this.title = title;
@@ -135,18 +135,18 @@ public class SentenceQuestion implements Serializable {
     }
 
     /**
-     * 获取序号:手工录入
+     * 获取组卷序号
      *
-     * @return no - 序号:手工录入
+     * @return no - 组卷序号
      */
     public Integer getNo() {
         return no;
     }
 
     /**
-     * 设置序号:手工录入
+     * 设置组卷序号
      *
-     * @param no 序号:手工录入
+     * @param no 组卷序号
      */
     public void setNo(Integer no) {
         this.no = no;
@@ -282,9 +282,9 @@ public class SentenceQuestion implements Serializable {
         }
 
         /**
-         * 设置标题
+         * 设置序号:手工录入
          *
-         * @param title 标题
+         * @param title 序号:手工录入
          */
         public Builder title(String title) {
             obj.setTitle(title);
@@ -312,9 +312,9 @@ public class SentenceQuestion implements Serializable {
         }
 
         /**
-         * 设置序号:手工录入
+         * 设置组卷序号
          *
-         * @param no 序号:手工录入
+         * @param no 组卷序号
          */
         public Builder no(Integer no) {
             obj.setNo(no);

+ 131 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookPaper.java

@@ -12,11 +12,32 @@ public class TextbookPaper implements Serializable {
     private Integer id;
 
     /**
+     * 年份
+     */
+    @Column(name = "`year`")
+    private Integer year;
+
+    /**
+     * 组卷逻辑:ps、ds、ps+ds
+     */
+    @Column(name = "`logic`")
+    private String logic;
+
+    /**
+     * 换库id
+     */
+    @Column(name = "`set_id`")
+    private Integer setId;
+
+    /**
      * 题目编号ids:json
      */
     @Column(name = "`question_no_ids`")
     private Integer[] questionNoIds;
 
+    @Column(name = "`question_number`")
+    private Integer questionNumber;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
@@ -37,6 +58,60 @@ public class TextbookPaper implements Serializable {
     }
 
     /**
+     * 获取年份
+     *
+     * @return year - 年份
+     */
+    public Integer getYear() {
+        return year;
+    }
+
+    /**
+     * 设置年份
+     *
+     * @param year 年份
+     */
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    /**
+     * 获取组卷逻辑:ps、ds、ps+ds
+     *
+     * @return logic - 组卷逻辑:ps、ds、ps+ds
+     */
+    public String getLogic() {
+        return logic;
+    }
+
+    /**
+     * 设置组卷逻辑:ps、ds、ps+ds
+     *
+     * @param logic 组卷逻辑:ps、ds、ps+ds
+     */
+    public void setLogic(String logic) {
+        this.logic = logic;
+    }
+
+    /**
+     * 获取换库id
+     *
+     * @return set_id - 换库id
+     */
+    public Integer getSetId() {
+        return setId;
+    }
+
+    /**
+     * 设置换库id
+     *
+     * @param setId 换库id
+     */
+    public void setSetId(Integer setId) {
+        this.setId = setId;
+    }
+
+    /**
      * 获取题目编号ids:json
      *
      * @return question_no_ids - 题目编号ids:json
@@ -55,6 +130,20 @@ public class TextbookPaper implements Serializable {
     }
 
     /**
+     * @return question_number
+     */
+    public Integer getQuestionNumber() {
+        return questionNumber;
+    }
+
+    /**
+     * @param questionNumber
+     */
+    public void setQuestionNumber(Integer questionNumber) {
+        this.questionNumber = questionNumber;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -75,7 +164,11 @@ public class TextbookPaper implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", year=").append(year);
+        sb.append(", logic=").append(logic);
+        sb.append(", setId=").append(setId);
         sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", questionNumber=").append(questionNumber);
         sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
@@ -101,6 +194,36 @@ public class TextbookPaper implements Serializable {
         }
 
         /**
+         * 设置年份
+         *
+         * @param year 年份
+         */
+        public Builder year(Integer year) {
+            obj.setYear(year);
+            return this;
+        }
+
+        /**
+         * 设置组卷逻辑:ps、ds、ps+ds
+         *
+         * @param logic 组卷逻辑:ps、ds、ps+ds
+         */
+        public Builder logic(String logic) {
+            obj.setLogic(logic);
+            return this;
+        }
+
+        /**
+         * 设置换库id
+         *
+         * @param setId 换库id
+         */
+        public Builder setId(Integer setId) {
+            obj.setSetId(setId);
+            return this;
+        }
+
+        /**
          * 设置题目编号ids:json
          *
          * @param questionNoIds 题目编号ids:json
@@ -111,6 +234,14 @@ public class TextbookPaper implements Serializable {
         }
 
         /**
+         * @param questionNumber
+         */
+        public Builder questionNumber(Integer questionNumber) {
+            obj.setQuestionNumber(questionNumber);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {

+ 106 - 36
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookQuestion.java

@@ -13,14 +13,20 @@ public class TextbookQuestion implements Serializable {
     /**
      * 题目编号:人工
      */
+    @Column(name = "`title`")
+    private String title;
+
+    /**
+     * 题目序号
+     */
     @Column(name = "`no`")
-    private String no;
+    private Integer no;
 
     /**
      * 机经版本:关联换库表
      */
-    @Column(name = "`version`")
-    private String version;
+    @Column(name = "`set_id`")
+    private Integer setId;
 
     /**
      * 题目id
@@ -29,10 +35,10 @@ public class TextbookQuestion implements Serializable {
     private Integer questionId;
 
     /**
-     * 学科
+     * 题型
      */
-    @Column(name = "`category`")
-    private Integer category;
+    @Column(name = "`question_type`")
+    private String questionType;
 
     /**
      * 总做题时间
@@ -52,6 +58,12 @@ public class TextbookQuestion implements Serializable {
     @Column(name = "`total_correct`")
     private Integer totalCorrect;
 
+    /**
+     * 自定义题目:0为基础题,组卷,1自定义题,不组卷
+     */
+    @Column(name = "`is_custom`")
+    private Integer isCustom;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -71,37 +83,55 @@ public class TextbookQuestion implements Serializable {
     /**
      * 获取题目编号:人工
      *
-     * @return no - 题目编号:人工
+     * @return title - 题目编号:人工
      */
-    public String getNo() {
-        return no;
+    public String getTitle() {
+        return title;
     }
 
     /**
      * 设置题目编号:人工
      *
-     * @param no 题目编号:人工
+     * @param title 题目编号:人工
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * 获取题目序号
+     *
+     * @return no - 题目序号
+     */
+    public Integer getNo() {
+        return no;
+    }
+
+    /**
+     * 设置题目序号
+     *
+     * @param no 题目序号
      */
-    public void setNo(String no) {
+    public void setNo(Integer no) {
         this.no = no;
     }
 
     /**
      * 获取机经版本:关联换库表
      *
-     * @return version - 机经版本:关联换库表
+     * @return set_id - 机经版本:关联换库表
      */
-    public String getVersion() {
-        return version;
+    public Integer getSetId() {
+        return setId;
     }
 
     /**
      * 设置机经版本:关联换库表
      *
-     * @param version 机经版本:关联换库表
+     * @param setId 机经版本:关联换库表
      */
-    public void setVersion(String version) {
-        this.version = version;
+    public void setSetId(Integer setId) {
+        this.setId = setId;
     }
 
     /**
@@ -123,21 +153,21 @@ public class TextbookQuestion implements Serializable {
     }
 
     /**
-     * 获取学科
+     * 获取题型
      *
-     * @return category - 学科
+     * @return question_type - 题型
      */
-    public Integer getCategory() {
-        return category;
+    public String getQuestionType() {
+        return questionType;
     }
 
     /**
-     * 设置学科
+     * 设置题型
      *
-     * @param category 学科
+     * @param questionType 题型
      */
-    public void setCategory(Integer category) {
-        this.category = category;
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
     }
 
     /**
@@ -194,6 +224,24 @@ public class TextbookQuestion implements Serializable {
         this.totalCorrect = totalCorrect;
     }
 
+    /**
+     * 获取自定义题目:0为基础题,组卷,1自定义题,不组卷
+     *
+     * @return is_custom - 自定义题目:0为基础题,组卷,1自定义题,不组卷
+     */
+    public Integer getIsCustom() {
+        return isCustom;
+    }
+
+    /**
+     * 设置自定义题目:0为基础题,组卷,1自定义题,不组卷
+     *
+     * @param isCustom 自定义题目:0为基础题,组卷,1自定义题,不组卷
+     */
+    public void setIsCustom(Integer isCustom) {
+        this.isCustom = isCustom;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -201,13 +249,15 @@ public class TextbookQuestion implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", title=").append(title);
         sb.append(", no=").append(no);
-        sb.append(", version=").append(version);
+        sb.append(", setId=").append(setId);
         sb.append(", questionId=").append(questionId);
-        sb.append(", category=").append(category);
+        sb.append(", questionType=").append(questionType);
         sb.append(", totalTime=").append(totalTime);
         sb.append(", totalNumber=").append(totalNumber);
         sb.append(", totalCorrect=").append(totalCorrect);
+        sb.append(", isCustom=").append(isCustom);
         sb.append("]");
         return sb.toString();
     }
@@ -234,9 +284,19 @@ public class TextbookQuestion implements Serializable {
         /**
          * 设置题目编号:人工
          *
-         * @param no 题目编号:人工
+         * @param title 题目编号:人工
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        /**
+         * 设置题目序号
+         *
+         * @param no 题目序号
          */
-        public Builder no(String no) {
+        public Builder no(Integer no) {
             obj.setNo(no);
             return this;
         }
@@ -244,10 +304,10 @@ public class TextbookQuestion implements Serializable {
         /**
          * 设置机经版本:关联换库表
          *
-         * @param version 机经版本:关联换库表
+         * @param setId 机经版本:关联换库表
          */
-        public Builder version(String version) {
-            obj.setVersion(version);
+        public Builder setId(Integer setId) {
+            obj.setSetId(setId);
             return this;
         }
 
@@ -262,12 +322,12 @@ public class TextbookQuestion implements Serializable {
         }
 
         /**
-         * 设置学科
+         * 设置题型
          *
-         * @param category 学科
+         * @param questionType 题型
          */
-        public Builder category(Integer category) {
-            obj.setCategory(category);
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
             return this;
         }
 
@@ -301,6 +361,16 @@ public class TextbookQuestion implements Serializable {
             return this;
         }
 
+        /**
+         * 设置自定义题目:0为基础题,组卷,1自定义题,不组卷
+         *
+         * @param isCustom 自定义题目:0为基础题,组卷,1自定义题,不组卷
+         */
+        public Builder isCustom(Integer isCustom) {
+            obj.setIsCustom(isCustom);
+            return this;
+        }
+
         public TextbookQuestion build() {
             return this.obj;
         }

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

@@ -24,10 +24,10 @@ public class UserPaper implements Serializable {
     private String title;
 
     /**
-     * 组卷模块:examination,exercise,collect,error,homework_preview
+     * 组卷模块:examination,exercise,collect,error,preview
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`paper_module`")
+    private String paperModule;
 
     /**
      * 组卷扩展:examination, exercise
@@ -148,21 +148,21 @@ public class UserPaper implements Serializable {
     }
 
     /**
-     * 获取组卷模块:examination,exercise,collect,error,homework_preview
+     * 获取组卷模块:examination,exercise,collect,error,preview
      *
-     * @return module - 组卷模块:examination,exercise,collect,error,homework_preview
+     * @return paper_module - 组卷模块:examination,exercise,collect,error,preview
      */
-    public String getModule() {
-        return module;
+    public String getPaperModule() {
+        return paperModule;
     }
 
     /**
-     * 设置组卷模块:examination,exercise,collect,error,homework_preview
+     * 设置组卷模块:examination,exercise,collect,error,preview
      *
-     * @param module 组卷模块:examination,exercise,collect,error,homework_preview
+     * @param paperModule 组卷模块:examination,exercise,collect,error,preview
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
     }
 
     /**
@@ -372,7 +372,7 @@ public class UserPaper implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", title=").append(title);
-        sb.append(", module=").append(module);
+        sb.append(", paperModule=").append(paperModule);
         sb.append(", moduleExtend=").append(moduleExtend);
         sb.append(", moduleId=").append(moduleId);
         sb.append(", questionNoIds=").append(questionNoIds);
@@ -428,32 +428,32 @@ public class UserPaper implements Serializable {
         }
 
         /**
-         * 设置组卷模块:examination,exercise,collect,error,homework_preview
+         * 设置组卷模块:examination,exercise,collect,error,preview
          *
-         * @param module 组卷模块:examination,exercise,collect,error,homework_preview
+         * @param paperModule 组卷模块:examination,exercise,collect,error,preview
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder paperModule(String paperModule) {
+            obj.setPaperModule(paperModule);
             return this;
         }
 
         /**
-         * 设置对应模块id
+         * 设置组卷扩展:examination, exercise
          *
-         * @param moduleId 对应模块id
+         * @param moduleExtend 组卷扩展:examination, exercise
          */
-        public Builder moduleId(Integer moduleId) {
-            obj.setModuleId(moduleId);
+        public Builder moduleExtend(String moduleExtend) {
+            obj.setModuleExtend(moduleExtend);
             return this;
         }
 
         /**
-         * 设置组卷扩展:examination, exercise
+         * 设置对应模块id
          *
-         * @param moduleExtend 组卷扩展:examination, exercise
+         * @param moduleId 对应模块id
          */
-        public Builder moduleExtend(String moduleExtend) {
-            obj.setModuleExtend(moduleExtend);
+        public Builder moduleId(Integer moduleId) {
+            obj.setModuleId(moduleId);
             return this;
         }
 

+ 12 - 12
server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaperQuestion.java

@@ -31,8 +31,8 @@ public class UserPaperQuestion implements Serializable {
     /**
      * 模块标记:collect,error,remove_error
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`paper_module`")
+    private String paperModule;
 
     private static final long serialVersionUID = 1L;
 
@@ -107,19 +107,19 @@ public class UserPaperQuestion implements Serializable {
     /**
      * 获取模块标记:collect,error,remove_error
      *
-     * @return module - 模块标记:collect,error,remove_error
+     * @return paper_module - 模块标记:collect,error,remove_error
      */
-    public String getModule() {
-        return module;
+    public String getPaperModule() {
+        return paperModule;
     }
 
     /**
      * 设置模块标记:collect,error,remove_error
      *
-     * @param module 模块标记:collect,error,remove_error
+     * @param paperModule 模块标记:collect,error,remove_error
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
     }
 
     @Override
@@ -132,7 +132,7 @@ public class UserPaperQuestion implements Serializable {
         sb.append(", userId=").append(userId);
         sb.append(", paperId=").append(paperId);
         sb.append(", questionNoId=").append(questionNoId);
-        sb.append(", module=").append(module);
+        sb.append(", paperModule=").append(paperModule);
         sb.append("]");
         return sb.toString();
     }
@@ -189,10 +189,10 @@ public class UserPaperQuestion implements Serializable {
         /**
          * 设置模块标记:collect,error,remove_error
          *
-         * @param module 模块标记:collect,error,remove_error
+         * @param paperModule 模块标记:collect,error,remove_error
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder paperModule(String paperModule) {
+            obj.setPaperModule(paperModule);
             return this;
         }
 

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

@@ -69,6 +69,12 @@ public class UserQuestion implements Serializable {
     @Column(name = "`is_correct`")
     private Integer isCorrect;
 
+    /**
+     * 详细信息:长难句逻辑、结构
+     */
+    @Column(name = "`detail`")
+    private JSONObject detail;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -261,6 +267,24 @@ public class UserQuestion implements Serializable {
         this.isCorrect = isCorrect;
     }
 
+    /**
+     * 获取详细信息:长难句逻辑、结构
+     *
+     * @return detail - 详细信息:长难句逻辑、结构
+     */
+    public JSONObject getDetail() {
+        return detail;
+    }
+
+    /**
+     * 设置详细信息:长难句逻辑、结构
+     *
+     * @param detail 详细信息:长难句逻辑、结构
+     */
+    public void setDetail(JSONObject detail) {
+        this.detail = detail;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -278,6 +302,7 @@ public class UserQuestion implements Serializable {
         sb.append(", createTime=").append(createTime);
         sb.append(", userAnswer=").append(userAnswer);
         sb.append(", isCorrect=").append(isCorrect);
+        sb.append(", detail=").append(detail);
         sb.append("]");
         return sb.toString();
     }
@@ -399,6 +424,16 @@ public class UserQuestion implements Serializable {
             return this;
         }
 
+        /**
+         * 设置详细信息:长难句逻辑、结构
+         *
+         * @param detail 详细信息:长难句逻辑、结构
+         */
+        public Builder detail(JSONObject detail) {
+            obj.setDetail(detail);
+            return this;
+        }
+
         public UserQuestion build() {
             return this.obj;
         }

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

@@ -25,10 +25,10 @@ public class UserReport implements Serializable {
     private Integer paperId;
 
     /**
-     * 对应模块:exercise,examination,sentence, homework_preview
+     * 对应模块:exercise,examination,sentence, preview
      */
-    @Column(name = "`module`")
-    private String module;
+    @Column(name = "`paper_module`")
+    private String paperModule;
 
     @Column(name = "`module_id`")
     private Integer moduleId;
@@ -148,19 +148,19 @@ public class UserReport implements Serializable {
     /**
      * 获取对应模块:exercise,examination,sentence, homework_preview
      *
-     * @return module - 对应模块:exercise,examination,sentence, homework_preview
+     * @return paper_module - 对应模块:exercise,examination,sentence, homework_preview
      */
-    public String getModule() {
-        return module;
+    public String getPaperModule() {
+        return paperModule;
     }
 
     /**
      * 设置对应模块:exercise,examination,sentence, homework_preview
      *
-     * @param module 对应模块:exercise,examination,sentence, homework_preview
+     * @param paperModule 对应模块:exercise,examination,sentence, homework_preview
      */
-    public void setModule(String module) {
-        this.module = module;
+    public void setPaperModule(String paperModule) {
+        this.paperModule = paperModule;
     }
 
     /**
@@ -376,7 +376,7 @@ public class UserReport implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", paperId=").append(paperId);
-        sb.append(", module=").append(module);
+        sb.append(", paperModule=").append(paperModule);
         sb.append(", moduleId=").append(moduleId);
         sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", questionNumber=").append(questionNumber);
@@ -435,10 +435,10 @@ public class UserReport implements Serializable {
         /**
          * 设置对应模块:exercise,examination,sentence, homework_preview
          *
-         * @param module 对应模块:exercise,examination,sentence, homework_preview
+         * @param paperModule 对应模块:exercise,examination,sentence, homework_preview
          */
-        public Builder module(String module) {
-            obj.setModule(module);
+        public Builder paperModule(String paperModule) {
+            obj.setPaperModule(paperModule);
             return this;
         }
 

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

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qxgmat.data.dao.ClassCourseMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ClassCourse">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <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="title" jdbcType="VARCHAR" property="title" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `struct_id`, `parent_struct_id`, `question_module`, `title`
+  </sql>
+</mapper>

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

@@ -11,7 +11,6 @@
     <result column="parent_id" jdbcType="INTEGER" property="parentId" />
     <result column="order" jdbcType="INTEGER" property="order" />
     <result column="level" jdbcType="INTEGER" property="level" />
-    <result column="pay_status" jdbcType="INTEGER" property="payStatus" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.ExaminationStruct">
     <!--
@@ -23,7 +22,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title_zh`, `title_en`, `parent_id`, `order`, `level`, `pay_status`
+    `id`, `title_zh`, `title_en`, `parent_id`, `order`, `level`
   </sql>
   <sql id="Blob_Column_List">
     <!--

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

@@ -6,7 +6,7 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="no" jdbcType="INTEGER" property="no" />
     <result column="logic" jdbcType="VARCHAR" property="logic" />
@@ -21,7 +21,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `type`, `title`, `no`, `logic`, `logic_extend`, `struct_id`, `struct_parent`, 
+    `id`, `question_type`, `title`, `no`, `logic`, `logic_extend`, `struct_id`, `struct_parent`, 
     `question_number`, `question_no_ids`, `status`
   </sql>
 </mapper>

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

@@ -10,11 +10,12 @@
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="no" jdbcType="INTEGER" property="no" />
+    <result column="status" jdbcType="INTEGER" property="status" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `paper_id`, `question_id`, `question_no_id`, `no`
+    `id`, `paper_id`, `question_id`, `question_no_id`, `no`, `status`
   </sql>
 </mapper>

+ 5 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/ExerciseStructMapper.xml

@@ -11,7 +11,10 @@
     <result column="parent_id" jdbcType="INTEGER" property="parentId" />
     <result column="order" jdbcType="INTEGER" property="order" />
     <result column="level" jdbcType="INTEGER" property="level" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="module" jdbcType="VARCHAR" property="module" />
     <result column="question_status" jdbcType="INTEGER" property="questionStatus" />
+    <result column="is_sentence" jdbcType="INTEGER" property="isSentence" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.ExerciseStruct">
     <!--
@@ -23,7 +26,8 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title_zh`, `title_en`, `parent_id`, `order`, `level`, `question_status`
+    `id`, `title_zh`, `title_en`, `parent_id`, `order`, `level`, `type`, `module`, `question_status`, 
+    `is_sentence`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 7 - 5
server/data/src/main/java/com/qxgmat/data/dao/mapping/HomeworkPreviewMapper.xml

@@ -1,14 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.qxgmat.data.dao.HomeworkPreviewMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.HomeworkPreview">
+<mapper namespace="com.qxgmat.data.dao.PreviewPaperMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.PreviewPaper">
     <!--
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="title" jdbcType="VARCHAR" property="title" />
-    <result column="category" jdbcType="INTEGER" property="category" />
+    <result column="course_id" jdbcType="INTEGER" property="courseId" />
     <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="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" />
@@ -20,7 +22,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title`, `category`, `question_no_ids`, `user_ids`, `start_time`, `end_time`, 
-    `finish`, `create_time`, `update_time`
+    `id`, `title`, `course_id`, `question_no_ids`, `mode`, `question_module`, `user_ids`, 
+    `start_time`, `end_time`, `finish`, `create_time`, `update_time`
   </sql>
 </mapper>

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

@@ -7,7 +7,7 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="keyword" jdbcType="VARCHAR" property="keyword" typeHandler="com.nuliji.tools.mybatis.handler.StringArrayHandler" />
-    <result column="type" jdbcType="VARCHAR" property="type" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
     <result column="place" jdbcType="VARCHAR" property="place" />
     <result column="difficult" jdbcType="VARCHAR" property="difficult" />
     <result column="description" jdbcType="VARCHAR" property="description" />
@@ -36,8 +36,8 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `keyword`, `type`, `place`, `difficult`, `description`, `content`, `answer`, 
-    `question_time`, `qx_time`, `official_time`, `association_time`, `association_content`, 
+    `id`, `keyword`, `question_type`, `place`, `difficult`, `description`, `content`, 
+    `answer`, `question_time`, `qx_time`, `official_time`, `association_time`, `association_content`, 
     `total_time`, `total_number`, `total_correct`, `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">

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

@@ -6,9 +6,9 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="module" jdbcType="VARCHAR" property="module" />
-    <result column="no" jdbcType="VARCHAR" property="no" />
     <result column="module_struct" jdbcType="VARCHAR" property="moduleStruct" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler" />
     <result column="total_time" jdbcType="INTEGER" property="totalTime" />
     <result column="total_number" jdbcType="INTEGER" property="totalNumber" />
@@ -19,7 +19,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `question_id`, `module`, `no`, `module_struct`, `total_time`, `total_number`, 
+    `id`, `title`, `question_id`, `module`, `module_struct`, `total_time`, `total_number`, 
     `total_correct`, `delete_time`
   </sql>
 </mapper>

+ 5 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookPaperMapper.xml

@@ -6,13 +6,17 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="year" jdbcType="INTEGER" property="year" />
+    <result column="logic" jdbcType="VARCHAR" property="logic" />
+    <result column="set_id" jdbcType="INTEGER" property="setId" />
     <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="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `question_no_ids`, `create_time`
+    `id`, `year`, `logic`, `set_id`, `question_no_ids`, `question_number`, `create_time`
   </sql>
 </mapper>

+ 7 - 4
server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookQuestionMapper.xml

@@ -6,18 +6,21 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="no" jdbcType="VARCHAR" property="no" />
-    <result column="version" jdbcType="VARCHAR" property="version" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="no" jdbcType="INTEGER" property="no" />
+    <result column="set_id" jdbcType="INTEGER" property="setId" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
-    <result column="category" jdbcType="INTEGER" property="category" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
     <result column="total_time" jdbcType="INTEGER" property="totalTime" />
     <result column="total_number" jdbcType="INTEGER" property="totalNumber" />
     <result column="total_correct" jdbcType="INTEGER" property="totalCorrect" />
+    <result column="is_custom" jdbcType="INTEGER" property="isCustom" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `no`, `version`, `question_id`, `category`, `total_time`, `total_number`, `total_correct`
+    `id`, `title`, `no`, `set_id`, `question_id`, `question_type`, `total_time`, `total_number`, 
+    `total_correct`, `is_custom`
   </sql>
 </mapper>

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

@@ -8,7 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="title" jdbcType="VARCHAR" property="title" />
-    <result column="module" jdbcType="VARCHAR" property="module" />
+    <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="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
@@ -25,7 +25,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `title`, `module`, `module_extend`, `module_id`, `question_no_ids`, 
+    `id`, `user_id`, `title`, `paper_module`, `module_extend`, `module_id`, `question_no_ids`, 
     `question_number`, `times`, `time`, `total_time`, `total_number`, `total_correct`, 
     `delete_time`, `is_reset`
   </sql>

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

@@ -9,12 +9,12 @@
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="paper_id" jdbcType="INTEGER" property="paperId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
-    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="paper_module" jdbcType="VARCHAR" property="paperModule" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `paper_id`, `question_no_id`, `module`
+    `id`, `user_id`, `paper_id`, `question_no_id`, `paper_module`
   </sql>
 </mapper>

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

@@ -16,12 +16,13 @@
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="user_answer" jdbcType="VARCHAR" property="userAnswer" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="is_correct" jdbcType="INTEGER" property="isCorrect" />
+    <result column="detail" jdbcType="VARCHAR" property="detail" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
     `id`, `user_id`, `report_id`, `question_id`, `question_no_id`, `no`, `time`, `user_time`, 
-    `create_time`, `user_answer`, `is_correct`
+    `create_time`, `user_answer`, `is_correct`, `detail`
   </sql>
 </mapper>

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

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

+ 4 - 3
server/data/src/main/java/com/qxgmat/data/relation/UserPaperRelationMapper.java

@@ -1,6 +1,7 @@
 package com.qxgmat.data.relation;
 
 import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.relation.entity.UserStudyStatRelation;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
@@ -11,7 +12,7 @@ import java.util.List;
  */
 public interface UserPaperRelationMapper {
 
-    List<UserPaper> listHomeworkPreviewAdmin(
+    List<UserPaper> listPreviewAdmin(
             @Param("category") Number category,
             @Param("userId") Number userId,
             @Param("previewId") Number previewId,
@@ -19,14 +20,14 @@ public interface UserPaperRelationMapper {
             @Param("endTime") String endTime
     );
 
-    List<UserPaper> listHomeworkPreview(
+    List<UserPaper> listPreview(
             @Param("category") Number category,
             @Param("userId") Number userId,
             @Param("endTime") String endTime,
             @Param("finish") Boolean finish
     );
 
-    List<UserPaper> listHomeworkPreviewGroupTop(
+    List<UserPaper> listPreviewGroupTop(
             @Param("userId") Number userId,
             @Param("top") Number top
     );

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

@@ -1,6 +1,8 @@
 package com.qxgmat.data.relation;
 
 import com.qxgmat.data.dao.entity.UserReport;
+import com.qxgmat.data.relation.entity.UserReportLimitRelation;
+import com.qxgmat.data.relation.entity.UserStudyStatRelation;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Collection;
@@ -26,4 +28,16 @@ public interface UserReportRelationMapper {
             @Param("time") Integer time,
             @Param("current") Integer current
     );
+
+    List<UserReportLimitRelation> statLimit(
+            @Param("module") String module,
+            @Param("moduleId") Integer moduleId
+    );
+
+    List<UserStudyStatRelation> statByModule(
+            @Param("userId") Integer userId,
+            @Param("module") String module,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
 }

+ 11 - 13
server/data/src/main/java/com/qxgmat/data/relation/entity/UserHomeworkPreviewRelation.java

@@ -1,30 +1,20 @@
 package com.qxgmat.data.relation.entity;
 
-import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 import com.qxgmat.data.dao.entity.User;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserReport;
 
-import java.util.List;
-
 /**
  * Created by gaojie on 2017/11/9.
  */
-public class UserHomeworkPreviewRelation extends UserPaper {
-    private HomeworkPreview preview;
+public class UserPreviewPaperRelation extends UserPaper {
+    private PreviewPaper paper;
 
     private UserReport report;
 
     private User user;
 
-    public HomeworkPreview getPreview() {
-        return preview;
-    }
-
-    public void setPreview(HomeworkPreview preview) {
-        this.preview = preview;
-    }
-
     public User getUser() {
         return user;
     }
@@ -40,4 +30,12 @@ public class UserHomeworkPreviewRelation extends UserPaper {
     public void setReport(UserReport report) {
         this.report = report;
     }
+
+    public PreviewPaper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(PreviewPaper paper) {
+        this.paper = paper;
+    }
 }

+ 34 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserReportLimitRelation.java

@@ -0,0 +1,34 @@
+package com.qxgmat.data.relation.entity;
+
+import javax.persistence.Column;
+
+public class UserReportLimitRelation {
+
+    /**
+     * 用户做题数
+     */
+    @Column(name = "`user_number`")
+    private Integer userNumber;
+
+    /**
+     * 用户正确题数
+     */
+    @Column(name = "`user_correct`")
+    private String userCorrect;
+
+    public Integer getUserNumber() {
+        return userNumber;
+    }
+
+    public void setUserNumber(Integer userNumber) {
+        this.userNumber = userNumber;
+    }
+
+    public String getUserCorrect() {
+        return userCorrect;
+    }
+
+    public void setUserCorrect(String userCorrect) {
+        this.userCorrect = userCorrect;
+    }
+}

+ 34 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserStudyStatRelation.java

@@ -0,0 +1,34 @@
+package com.qxgmat.data.relation.entity;
+
+import javax.persistence.Column;
+
+public class UserStudyStatRelation {
+
+    /**
+     * 用户做题数
+     */
+    @Column(name = "`user_number`")
+    private Integer userNumber;
+
+    /**
+     * 用户做题时间
+     */
+    @Column(name = "`user_correct`")
+    private String userTime;
+
+    public Integer getUserNumber() {
+        return userNumber;
+    }
+
+    public void setUserNumber(Integer userNumber) {
+        this.userNumber = userNumber;
+    }
+
+    public String getUserTime() {
+        return userTime;
+    }
+
+    public void setUserTime(String userTime) {
+        this.userTime = userTime;
+    }
+}

+ 1 - 81
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserNoteQuestionRelationMapper.xml

@@ -18,7 +18,7 @@
     用户预习作业列表: 后台
     https://blog.csdn.net/t_1007/article/details/52369261
   -->
-  <select id="listHomeworkPreviewAdmin" resultMap="IdMap">
+  <select id="list" resultMap="IdMap">
     select
     <include refid="Id_Column_List" />
     from `user_paper` up
@@ -43,84 +43,4 @@
     </if>
   </select>
 
-  <!--
-    用户预习作业列表: 用户端
-  -->
-  <select id="listHomeworkPreview" resultMap="IdMap">
-    select
-    <include refid="Id_Column_List" />
-    from `user_paper` up
-    left join `homework_preview` hp on hp.`id` = up.`module_id`
-      and up.`module` = "homework_preview"
-      <if test="category != null">
-        and hp.`category` = #{category,jdbcType=VARCHAR}
-      </if>
-      <if test="endTime != null">
-        and hp.`endTime` &lt; #{endTime,jdbcType=VARCHAR}
-      </if>
-    where
-    hp.`id` != null
-    <if test="userId != null">
-      and up.`user_id` = #{userId,jdbcType=VARCHAR}
-    </if>
-    <if test="finish != null">
-      <if test="finish == true">
-      and up.`number` > 1
-      </if>
-      <if test="finish == false">
-        and up.`number` = 0
-      </if>>
-    </if>
-  </select>
-
-  <!--
-    用户预习作业Top列表: 用户端
-  -->
-  <select id="listHomeworkPreviewGroupTop" resultMap="IdMap">
-    select
-    <include refid="Id_Column_List" />
-    from `user_paper` up
-    where
-    hp.`id` != null
-    and up.`module` = "homework_preview"
-    <if test="userId != null">
-      and up.`user_id` = #{userId,jdbcType=VARCHAR}
-    </if>
-    and ( select count(up1.id)
-        from `user_paper` up1
-        where
-        up.`module_id` = up1.`module_id`
-        and up.`module` = "homework_preview"
-        and up1.create_time &gt; up.create_time) &lt; ${top}
-  </select>
-
-  <!--
-    用户练习-练习册列表: 用户端
-  -->
-  <select id="listExercisePaper" resultMap="IdMap">
-    select
-    <include refid="Id_Column_List" />
-    from `user_paper` up
-    left join `exercise_paper` hp on hp.`id` = up.`module_id` and ep.`status` = 1
-    and up.`module` = "homework_preview"
-    <if test="category != null">
-      and hp.`category` = #{category,jdbcType=VARCHAR}
-    </if>
-    <if test="endTime != null">
-      and hp.`endTime` &lt; #{endTime,jdbcType=VARCHAR}
-    </if>
-    where
-    hp.`id` != null
-    <if test="userId != null">
-      and up.`user_id` = #{userId,jdbcType=VARCHAR}
-    </if>
-    <if test="finish != null">
-      <if test="finish == true">
-        and up.`number` > 1
-      </if>
-      <if test="finish == false">
-        and up.`number` = 0
-      </if>>
-    </if>
-  </select>
 </mapper>

+ 10 - 10
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml

@@ -30,12 +30,12 @@
     用户预习作业列表: 后台
     https://blog.csdn.net/t_1007/article/details/52369261
   -->
-  <select id="listHomeworkPreviewAdmin" resultMap="IdMap">
+  <select id="listPreviewAdmin" resultMap="IdMap">
     select
     <include refid="Id_Column_List" />
     from `user_paper` up
-    left join `homework_preview` hp on hp.`id` = up.`module_id`
-      and up.`module` = "homework_preview"
+    left join `preview_paper` hp on hp.`id` = up.`module_id`
+      and up.`module` = "preview"
       <if test="previewId != null">
         and hp.`id` = #{previewId,jdbcType=VARCHAR}
       </if>
@@ -58,12 +58,12 @@
   <!--
     用户预习作业列表: 用户端
   -->
-  <select id="listHomeworkPreview" resultMap="IdMap">
+  <select id="listPreview" resultMap="IdMap">
     select
     <include refid="Id_Column_List" />
     from `user_paper` up
-    left join `homework_preview` hp on hp.`id` = up.`module_id`
-      and up.`module` = "homework_preview"
+    left join `preview_paper` hp on hp.`id` = up.`module_id`
+      and up.`module` = "preview"
       <if test="category != null">
         and hp.`category` = #{category,jdbcType=VARCHAR}
       </if>
@@ -88,13 +88,13 @@
   <!--
     用户预习作业Top列表: 用户端
   -->
-  <select id="listHomeworkPreviewGroupTop" resultMap="IdMap">
+  <select id="listPreviewGroupTop" resultMap="IdMap">
     select
     <include refid="Id_Column_List" />
     from `user_paper` up
     where
     hp.`id` != null
-    and up.`module` = "homework_preview"
+    and up.`module` = "preview"
     <if test="userId != null">
       and up.`user_id` = #{userId,jdbcType=VARCHAR}
     </if>
@@ -102,7 +102,7 @@
         from `user_paper` up1
         where
         up.`module_id` = up1.`module_id`
-        and up.`module` = "homework_preview"
+        and up.`module` = "preview"
         and up1.create_time &gt; up.create_time) &lt; ${top}
   </select>
 
@@ -114,7 +114,7 @@
     <include refid="Id_Column_List" />
     from `user_paper` up
     left join `exercise_paper` hp on hp.`id` = up.`module_id` and ep.`status` = 1
-    and up.`module` = "homework_preview"
+    and up.`module` = "exercise"
     <if test="category != null">
       and hp.`category` = #{category,jdbcType=VARCHAR}
     </if>

+ 4 - 3
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserRelationMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qxgmat.data.relation.UserRelationMapper">
-  <resultMap id="IdMap" type="com.qxgmat.data.relation.entity.UserPrepareRelation">
+  <resultMap id="Prepare" type="com.qxgmat.data.relation.entity.UserPrepareRelation">
     <!--
       WARNING - @mbg.generated
     -->
@@ -19,7 +19,7 @@
   <!--
     字符串字段统计
   -->
-  <select id="groupPrepareString" resultMap="IdMap">
+  <select id="groupPrepareString" resultMap="Prepare">
     select
       `${field}` as `s`, count(*) as `number`
     from `user`
@@ -32,7 +32,7 @@
   <!--
     数字字段统计
   -->
-  <select id="groupPrepareInteger" resultMap="IdMap">
+  <select id="groupPrepareInteger" resultMap="Prepare">
     select
     `${field}` as `i`, count(*) as `number`
     from `user`
@@ -41,4 +41,5 @@
     and `${field}` > 0
     group by `${field}`
   </select>
+
 </mapper>

+ 44 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml

@@ -7,6 +7,20 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
   </resultMap>
+  <resultMap id="limitMap" type="com.qxgmat.data.relation.entity.UserReportLimitRelation">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="user_number" jdbcType="INTEGER" property="user_number" />
+    <id column="user_correct" jdbcType="INTEGER" property="user_correct" />
+  </resultMap>
+  <resultMap id="studyMap" type="com.qxgmat.data.relation.entity.UserStudyStatRelation">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="user_number" jdbcType="INTEGER" property="user_number" />
+    <id column="user_time" jdbcType="INTEGER" property="user_time" />
+  </resultMap>
   <sql id="Id_Column_List">
     <!--
       WARNING - @mbg.generated
@@ -70,4 +84,34 @@
     <!--</if>-->
     group by up.`paper_id`
   </select>
+
+  <!--
+    用户限时完成的统计记录
+  -->
+  <select id="statLimit" resultMap="limitMap">
+    select
+      sum(`user_number`) as `user_number`, sum(`user_correct`) as `user_correct`
+    from `user_report`
+    where
+      `user_time` &lt; `time`
+    and `user_number` = `question_number`
+    and `module` = #{module,jdbcType=VARCHAR}
+    and `module_id` = #{module_id,jdbcType=INTEGER}
+  </select>
+
+
+  <!--
+    用户学习记录统计,分学科
+  -->
+  <select id="statByModule" resultMap="studyMap">
+    select
+    sum(`user_number`) as `user_number`, sum(`user_time`) as `user_time`
+    from `user_report`
+    where
+    `user_id` = #{userId,jdbcType=VARCHAR}
+    and `module` =
+    and `user_number` = `question_number`
+    and `module` = #{module,jdbcType=VARCHAR}
+    and `module_id` = #{module_id,jdbcType=INTEGER}
+  </select>
 </mapper>

+ 2 - 1
server/data/src/main/resources/mybatis-generator.xml

@@ -115,7 +115,7 @@
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
         </table>
-        <table schema="qianxing" tableName="homework_preview" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+        <table schema="qianxing" tableName="preview_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
             <columnOverride column="user_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
@@ -150,6 +150,7 @@
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="user_answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
             <columnOverride column="answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
+            <columnOverride column="detail" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
         </table>
     </context>
 </generatorConfiguration>

+ 7 - 7
server/gateway-api/src/main/java/com/qxgmat/controller/admin/ExerciseController.java

@@ -113,13 +113,13 @@ public class ExerciseController {
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false) String type,
-            @RequestParam(required = false, name = "struct_id") Integer structId,
-            @RequestParam(required = false, name = "question_no_id") Integer questionNoId,
-            @RequestParam(required = false, name="paper_id") Integer paperId,
-            @RequestParam(required = false, name="place") String place,
-            @RequestParam(required = false, name="difficult") String difficult,
-            @RequestParam(required = false, name="start_time") String startTime,
-            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false) Integer structId,
+            @RequestParam(required = false) Integer questionNoId,
+            @RequestParam(required = false) Integer paperId,
+            @RequestParam(required = false) String place,
+            @RequestParam(required = false) String difficult,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {

+ 20 - 22
server/gateway-api/src/main/java/com/qxgmat/controller/admin/PreviewController.java

@@ -5,14 +5,12 @@ import com.nuliji.tools.PageMessage;
 import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
-import com.qxgmat.data.constants.enums.status.HomeworkPreviewStatus;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
-import com.qxgmat.data.relation.entity.QuestionNoRelation;
-import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
-import com.qxgmat.dto.admin.request.HomeworkPreviewDto;
-import com.qxgmat.dto.admin.response.HomeworkPreviewDetailDto;
-import com.qxgmat.dto.admin.response.HomeworkPreviewListDto;
-import com.qxgmat.service.HomeworkPreviewService;
+import com.qxgmat.data.constants.enums.status.PreviewStatus;
+import com.qxgmat.data.dao.entity.PreviewPaper;
+import com.qxgmat.dto.admin.request.PreviewDto;
+import com.qxgmat.dto.admin.response.PreviewDetailDto;
+import com.qxgmat.dto.admin.response.PreviewListDto;
+import com.qxgmat.service.PreviewService;
 import com.qxgmat.service.inline.ManagerLogService;
 import com.qxgmat.service.inline.QuestionNoService;
 import io.swagger.annotations.Api;
@@ -34,25 +32,25 @@ public class PreviewController {
     private ManagerLogService managerLogService;
 
     @Autowired
-    private HomeworkPreviewService homeworkPreviewService;
+    private PreviewService previewService;
 
     @Autowired
     private QuestionNoService questionNoService;
 
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ApiOperation(value = "添加预习作业", httpMethod = "POST")
-    public Response<HomeworkPreview> add(@RequestBody @Validated HomeworkPreviewDto dto, HttpServletRequest request) {
-        HomeworkPreview entity = Transform.dtoToEntity(dto);
-        entity = homeworkPreviewService.edit(entity);
+    public Response<PreviewPaper> add(@RequestBody @Validated PreviewDto dto, HttpServletRequest request) {
+        PreviewPaper entity = Transform.dtoToEntity(dto);
+        entity = previewService.edit(entity);
         managerLogService.log(request);
         return ResponseHelp.success(entity);
     }
 
     @RequestMapping(value = "/edit", method = RequestMethod.PUT)
     @ApiOperation(value = "编辑预习作业", httpMethod = "PUT")
-    public Response<Boolean> edit(@RequestBody @Validated HomeworkPreviewDto dto, HttpServletRequest request) {
-        HomeworkPreview entity = Transform.dtoToEntity(dto);
-        entity = homeworkPreviewService.edit(entity);
+    public Response<Boolean> edit(@RequestBody @Validated PreviewDto dto, HttpServletRequest request) {
+        PreviewPaper entity = Transform.dtoToEntity(dto);
+        entity = previewService.edit(entity);
         managerLogService.log(request);
         return ResponseHelp.success(true);
     }
@@ -61,14 +59,14 @@ public class PreviewController {
     @ApiOperation(value = "删除预习作业", httpMethod = "DELETE")
     public Response<Boolean> delete(@RequestParam int id, HttpServletRequest request) {
         managerLogService.log(request);
-        return ResponseHelp.success(homeworkPreviewService.delete(id));
+        return ResponseHelp.success(previewService.delete(id));
     }
 
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取预习作业", httpMethod = "GET")
-    public Response<HomeworkPreviewDetailDto> detail(@RequestParam int id, HttpSession session) {
-        HomeworkPreview entity = homeworkPreviewService.get(id);
-        HomeworkPreviewDetailDto dto = Transform.convert(entity, HomeworkPreviewDetailDto.class);
+    public Response<PreviewDetailDto> detail(@RequestParam int id, HttpSession session) {
+        PreviewPaper entity = previewService.get(id);
+        PreviewDetailDto dto = Transform.convert(entity, PreviewDetailDto.class);
 
 //        List<QuestionNoRelation> questionNos = questionNoService.listWithRelationByIds(entity.getQuestionNoIds());
 //        List<QuestionNoExtendDto> questionNoExtendDtos = Transform.convert(questionNos, QuestionNoExtendDto.class);
@@ -80,14 +78,14 @@ public class PreviewController {
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiOperation(value = "预习作业列表", httpMethod = "GET")
-    public Response<PageMessage<HomeworkPreviewListDto>> list(
+    public Response<PageMessage<PreviewListDto>> list(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false) Integer category,
             @RequestParam(required = false) Integer status,
             HttpSession session) {
-        Page<HomeworkPreview> p = homeworkPreviewService.select(page, size, category, HomeworkPreviewStatus.ValueOf(status));
-        List<HomeworkPreviewListDto> pr = Transform.convert(p, HomeworkPreviewListDto.class);
+        Page<PreviewPaper> p = previewService.select(page, size, category, PreviewStatus.ValueOf(status));
+        List<PreviewListDto> pr = Transform.convert(p, PreviewListDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }

+ 6 - 6
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserAskController.java

@@ -120,12 +120,12 @@ public class UserAskController {
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false) String type,
             @RequestParam(required = false) Integer category,
-            @RequestParam(required = false, name = "user_id") Number userId,
-            @RequestParam(required = false, name = "question_no_id") Number questionNoId,
-            @RequestParam(required = false, name="target") String target,
-            @RequestParam(required = false, name="status") Integer status,
-            @RequestParam(required = false, name="show_status") Integer showStatus,
-            @RequestParam(required = false, name="money_rang") Integer moneyRang,
+            @RequestParam(required = false) Number userId,
+            @RequestParam(required = false) Number questionNoId,
+            @RequestParam(required = false) String target,
+            @RequestParam(required = false) Integer status,
+            @RequestParam(required = false) Integer showStatus,
+            @RequestParam(required = false) Integer moneyRang,
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {

+ 17 - 17
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserPreviewController.java

@@ -1,12 +1,12 @@
 package com.qxgmat.controller.admin;
 
 import com.nuliji.tools.*;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
-import com.qxgmat.dto.admin.response.UserHomeworkPreviewListDto;
+import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
+import com.qxgmat.dto.admin.response.UserPreviewListDto;
 import com.qxgmat.service.UsersService;
-import com.qxgmat.service.HomeworkPreviewService;
+import com.qxgmat.service.PreviewService;
 import com.qxgmat.service.inline.ManagerLogService;
 import com.qxgmat.service.UserPaperService;
 import io.swagger.annotations.Api;
@@ -33,32 +33,32 @@ public class UserPreviewController {
     private UsersService usersService;
 
     @Autowired
-    private HomeworkPreviewService homeworkPreviewService;
+    private PreviewService previewService;
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiOperation(value = "预习作业列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewListDto>> list(
+    public Response<PageMessage<UserPreviewListDto>> list(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false, defaultValue = "0") int category,
-            @RequestParam(required = false, name = "user_id") Integer userId,
-            @RequestParam(required = false, name = "preview_id") Integer previewId,
-            @RequestParam(required = false, name="start_time") String startTime,
-            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false) Integer userId,
+            @RequestParam(required = false) Integer previewId,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
             HttpSession session) {
-        PageResult<UserHomeworkPreviewRelation> p = homeworkPreviewService.listAdmin(page, size, category, userId, previewId, startTime, endTime);
+        PageResult<UserPreviewPaperRelation> p = previewService.listAdmin(page, size, category, userId, previewId, startTime, endTime);
 
         // 绑定用户
-        Collection userIds = Transform.getIds(p, UserHomeworkPreviewRelation.class, "userId");
+        Collection userIds = Transform.getIds(p, UserPreviewPaperRelation.class, "userId");
         List<User> userList = usersService.select(userIds);
-        Transform.combine(p, userList, UserHomeworkPreviewRelation.class, "userId", "user", User.class, "id");
+        Transform.combine(p, userList, UserPreviewPaperRelation.class, "userId", "user", User.class, "id");
 
         // 绑定预习作业
-        Collection previewIds = Transform.getIds(p, UserHomeworkPreviewRelation.class, "moduleId");
-        List<HomeworkPreview> homeworkPreviewList = homeworkPreviewService.select(previewIds);
-        Transform.combine(p, homeworkPreviewList, UserHomeworkPreviewRelation.class, "moduleId", "preview", HomeworkPreview.class, "id");
+        Collection previewIds = Transform.getIds(p, UserPreviewPaperRelation.class, "moduleId");
+        List<PreviewPaper> previewPaperList = previewService.select(previewIds);
+        Transform.combine(p, previewPaperList, UserPreviewPaperRelation.class, "moduleId", "preview", PreviewPaper.class, "id");
 
-        List<UserHomeworkPreviewListDto> pr = Transform.convert(p, UserHomeworkPreviewListDto.class);
+        List<UserPreviewListDto> pr = Transform.convert(p, UserPreviewListDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }

+ 113 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/CourseController.java

@@ -0,0 +1,113 @@
+package com.qxgmat.controller.api;
+
+
+import com.nuliji.tools.*;
+import com.qxgmat.data.constants.enums.module.PayModule;
+import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
+import com.qxgmat.dto.extend.UserPreviewPaperExtendDto;
+import com.qxgmat.dto.response.*;
+import com.qxgmat.help.ShiroHelp;
+import com.qxgmat.service.*;
+import com.qxgmat.service.inline.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/course")
+@Api(tags = "课程", description = "课程接口")
+public class CourseController {
+
+    @Autowired
+    private ShiroHelp shiroHelp;
+
+    @Autowired
+    private PreviewService previewService;
+
+    @Autowired
+    private QuestionNoService questionNoService;
+
+    @Autowired
+    private QuestionService questionService;
+
+    @Autowired
+    private UserClassService userClassService;
+
+    @Autowired
+    private UserPayService userPayService;
+
+
+    @RequestMapping(value = "/process", method = RequestMethod.GET)
+    @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
+    public Response<List<UserClassDetailDto>> classProcess()  {
+        User user = (User) shiroHelp.getLoginUser();
+        List<UserClass> userClassList = userClassService.getByUser(user.getId());
+        List<UserClassDetailDto> dtos = Transform.convert(userClassList, UserClassDetailDto.class);
+
+        // 获取每个科目的最后2次作业
+        Map<Object, Collection<UserPreviewPaperRelation>> previewMap = previewService.groupByCategory(user.getId(), 3);
+        Transform.combine(dtos, previewMap, UserClassDetailDto.class, "category", "previews", UserPreviewPaperExtendDto.class);
+
+        // 获取课程状态:已购买未开通
+        List<UserPay> pays = userPayService.listUnUse(user.getId(), PayModule.CLASS);
+        Collection ids = Transform.getIds(userClassList, UserClass.class, "category");
+        for(UserPay pay : pays){
+            Integer category = Integer.valueOf(pay.getModuleExtend());
+            if (!ids.contains(category)){
+                UserClassDetailDto dto = new UserClassDetailDto();
+                dto.setCategory(category);
+                dto.setPayed(true);
+                dtos.add(dto);
+            }
+        }
+
+        return ResponseHelp.success(dtos);
+    }
+
+    @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
+    public Response<PageMessage<UserPreviewPaperExtendDto>> listPreview(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false) Number category,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) Boolean finish
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        PageResult<UserPreviewPaperRelation> p = previewService.list(page, size, category, user.getId(), endTime, finish);
+
+        List<UserPreviewPaperExtendDto> pr = Transform.convert(p, UserPreviewPaperExtendDto.class);
+
+        // 获取试卷统计信息
+        Map map = Transform.getMap(p, UserPreviewPaperRelation.class, "id", "paper");
+        Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
+        for(Object value : map.keySet()){
+            Integer key = (Integer) value;
+            PreviewPaper preview = (PreviewPaper) map.get(key);
+            questionNoIdsMap.put(key, preview.getQuestionNoIds());
+        }
+        Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
+        Transform.combine(pr, statMap, UserPreviewPaperExtendDto.class, "id", "stat");
+
+        return ResponseHelp.success(pr, page, size, p.getTotal());
+    }
+
+    @RequestMapping(value = "/preview/paper", method = RequestMethod.GET)
+    @ApiOperation(value = "获取预习作业", notes = "获取预习作业", httpMethod = "GET")
+    public Response<PaperBaseDto> detailPreview(
+            @RequestParam(required = true, name="id") Integer paperId
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        PreviewPaper preview = previewService.get(paperId);
+        PaperBaseDto paperDto = Transform.convert(preview, PaperBaseDto.class);
+
+        return ResponseHelp.success(paperDto);
+    }
+}

+ 38 - 9
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -207,7 +207,7 @@ public class MyController {
 
     @RequestMapping(value = "/study", method = RequestMethod.GET)
     @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
-    public Response<UserStudyDetailDto> studyTime(
+    public Response<JSONObject> studyTime(
             @RequestParam(required = false) String date
     )  {
         User user = (User) shiroHelp.getLoginUser();
@@ -219,9 +219,38 @@ public class MyController {
         UserStudyDetailDto dto = new UserStudyDetailDto();
 
         // todo 获取学习统计
+
+        return ResponseHelp.success(null);
+    }
+
+    @RequestMapping(value = "/study/total", method = RequestMethod.GET)
+    @ApiOperation(value = "获取总学习记录", notes = "获取总学习记录", httpMethod = "GET")
+    public Response<UserStudyDetailDto> studyTotalTime()  {
+        User user = (User) shiroHelp.getLoginUser();
+        UserStudyDetailDto dto = new UserStudyDetailDto();
+        dto.setCreateTime(user.getCreateTime());
+        dto.setDays((int)((user.getCreateTime().getTime() - new Date().getTime()) / (1000*3600*24)));
+        Integer totalTime = 0;
+        // todo 获取学习统计 - 按练习学科(第2层)统计
+        userReportService.statByModule(user.getId(), PaperModule.EXAMINATION.key, "","");
+
+        dto.setTime(totalTime);
         return ResponseHelp.success(dto);
     }
 
+    @RequestMapping(value = "/data", method = RequestMethod.GET)
+    @ApiOperation(value = "获取做题数据", notes = "获取做题数据", httpMethod = "GET")
+    public Response<JSONObject> questionData(
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+
+        // todo 获取学习统计 - 按题型进行分组统计
+
+        return ResponseHelp.success(null);
+    }
+
     @RequestMapping(value = "/collect", method = RequestMethod.PUT)
     @ApiOperation(value = "添加收藏", notes = "添加收藏", httpMethod = "PUT")
     public Response<Boolean> addCollect(@RequestBody @Validated UserCollectDto dto)  {
@@ -260,8 +289,8 @@ public class MyController {
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
             @RequestParam(required = false) String type,
-            @RequestParam(required = false, name="start_time") String startTime,
-            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session)  {
@@ -278,7 +307,7 @@ public class MyController {
 
     @RequestMapping(value = "/error/list", method = RequestMethod.GET)
     @ApiOperation(value = "获取错题列表", notes = "获取错题列表", httpMethod = "GET")
-    public Response<PageMessage<UserQuestionListDto>> listError(
+    public Response<PageMessage<UserQuestionErrorListDto>> listError(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
@@ -286,7 +315,7 @@ public class MyController {
     )  {
         User user = (User) shiroHelp.getLoginUser();
         PageResult<UserQuestion> p = userQuestionService.listError(page, size, user.getId());
-        List<UserQuestionListDto> pr = Transform.convert(p, UserQuestionListDto.class);
+        List<UserQuestionErrorListDto> pr = Transform.convert(p, UserQuestionErrorListDto.class);
 
         // todo 绑定数据
 
@@ -330,8 +359,8 @@ public class MyController {
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
             @RequestParam(required = false) String type,
-            @RequestParam(required = false, name="start_time") String startTime,
-            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session)  {
@@ -351,8 +380,8 @@ public class MyController {
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
             @RequestParam(required = false) String type,
-            @RequestParam(required = false, name="start_time") String startTime,
-            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session)  {

+ 34 - 81
server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java

@@ -7,15 +7,13 @@ 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.PayModule;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.UserExercisePaperRelation;
-import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
 import com.qxgmat.data.relation.entity.UserReportRelation;
 import com.qxgmat.dto.extend.QuestionExtendDto;
 import com.qxgmat.dto.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.extend.UserExercisePaperExtendDto;
-import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
+import com.qxgmat.dto.extend.UserPreviewPaperExtendDto;
 import com.qxgmat.dto.request.*;
 import com.qxgmat.dto.response.*;
 import com.qxgmat.help.ShiroHelp;
@@ -29,7 +27,6 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpSession;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -43,7 +40,7 @@ public class QuestionController {
     private ShiroHelp shiroHelp;
 
     @Autowired
-    private HomeworkPreviewService homeworkPreviewService;
+    private PreviewService previewService;
 
     @Autowired
     private ExercisePaperService exercisePaperService;
@@ -75,60 +72,6 @@ public class QuestionController {
     @Autowired
     private QuestionFlowService questionFlowService;
 
-    @RequestMapping(value = "/class/process", method = RequestMethod.GET)
-    @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
-    public Response<List<UserClassDetailDto>> classProcess()  {
-        User user = (User) shiroHelp.getLoginUser();
-        List<UserClass> userClassList = userClassService.getByUser(user.getId());
-        List<UserClassDetailDto> dtos = Transform.convert(userClassList, UserClassDetailDto.class);
-
-        // 获取每个科目的最后2次作业
-        Map<Object, Collection<UserHomeworkPreviewRelation>> previewMap = homeworkPreviewService.groupByCategory(user.getId(), 3);
-        Transform.combine(dtos, previewMap, UserClassDetailDto.class, "category", "previews", UserHomeworkPreviewExtendDto.class);
-
-        // 获取课程状态:已购买未开通
-        List<UserPay> pays = userPayService.listUnUse(user.getId(), PayModule.CLASS);
-        Collection ids = Transform.getIds(userClassList, UserClass.class, "category");
-        for(UserPay pay : pays){
-            Integer category = Integer.valueOf(pay.getModuleExtend());
-            if (!ids.contains(category)){
-                UserClassDetailDto dto = new UserClassDetailDto();
-                dto.setCategory(category);
-                dto.setPayed(true);
-                dtos.add(dto);
-            }
-        }
-
-        return ResponseHelp.success(dtos);
-    }
-
-    @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
-    @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewExtendDto>> listPreview(
-            @RequestParam(required = false, defaultValue = "1") int page,
-            @RequestParam(required = false, defaultValue = "100") int size,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
-    )  {
-        User user = (User) shiroHelp.getLoginUser();
-        PageResult<UserHomeworkPreviewRelation> p = homeworkPreviewService.list(page, size, category, user.getId(), endTime, finish);
-
-        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
-
-        // 获取试卷统计信息
-        Map map = Transform.getMap(p, UserHomeworkPreviewRelation.class, "id", "preview");
-        Map<Integer, Integer[]> questionNoIdsMap = new HashMap<>();
-        for(Object value : map.keySet()){
-            Integer key = (Integer) value;
-            HomeworkPreview preview = (HomeworkPreview) map.get(key);
-            questionNoIdsMap.put(key, preview.getQuestionNoIds());
-        }
-        Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
-        Transform.combine(pr, statMap, UserHomeworkPreviewExtendDto.class, "id", "stat");
-
-        return ResponseHelp.success(pr, page, size, p.getTotal());
-    }
 
     @RequestMapping(value = "/exercise/process", method = RequestMethod.GET)
     @ApiOperation(value = "练习进度", httpMethod = "GET")
@@ -155,7 +98,7 @@ public class QuestionController {
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) Integer structId,
             @RequestParam(required = true) String logic,
-            @RequestParam(required = false, name = "logic_extend") String logicExtend,
+            @RequestParam(required = false) String logicExtend,
             @RequestParam(required = false)  Integer times,
             HttpSession session) {
         User user = (User) shiroHelp.getLoginUser();
@@ -172,7 +115,7 @@ public class QuestionController {
             questionNoIdsMap.put(key, paper.getQuestionNoIds());
         }
         Map statMap = questionNoService.statPaperMap(questionNoIdsMap);
-        Transform.combine(pr, statMap, UserHomeworkPreviewExtendDto.class, "id", "stat");
+        Transform.combine(pr, statMap, UserPreviewPaperExtendDto.class, "id", "stat");
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
@@ -206,10 +149,19 @@ public class QuestionController {
     @RequestMapping(value = "/question/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取题目详情", notes = "获取题目详情", httpMethod = "GET")
     public Response<UserQuestionDetailDto> detail(
-            @RequestParam(required = true, name="id") Integer userQuestionId
+            @RequestParam(required = true) Integer userQuestionId,
+            @RequestParam(required = true) Integer userReportId,
+            @RequestParam(required = true) Integer no
     )  {
         User user = (User) shiroHelp.getLoginUser();
-        // todo 获取数据
+        if (userQuestionId != null && userQuestionId > 0){
+
+        }else if(userReportId != null && userReportId > 0){
+            if (no == null || no == 0){
+                no = 1;
+            }
+            // 根据题目序号获取
+        }
 
         return ResponseHelp.success(null);
     }
@@ -227,7 +179,7 @@ public class QuestionController {
     }
 
     @RequestMapping(value = "/report/base", method = RequestMethod.GET)
-    @ApiOperation(value = "获取练习记录", notes = "获取练习", httpMethod = "GET")
+    @ApiOperation(value = "获取练习记录", notes = "获取练习记录", httpMethod = "GET")
     public Response<UserReportBaseDto> baseReport(
             @RequestParam(required = true, name="id") Integer userReportId
     )  {
@@ -235,7 +187,6 @@ public class QuestionController {
         UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
 
         UserReportBaseDto userReportDto = Transform.convert(report, UserReportBaseDto.class);
-
         return ResponseHelp.success(userReportDto);
     }
 
@@ -248,40 +199,42 @@ public class QuestionController {
         UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
 
         UserReportDetailDto userReportDto = Transform.convert(report, UserReportDetailDto.class);
+        // todo 绑定数据
 
         return ResponseHelp.success(userReportDto);
     }
 
+    @RequestMapping(value = "/report/question", method = RequestMethod.GET)
+    @ApiOperation(value = "获取练习做题记录", notes = "获取练习卷", httpMethod = "GET")
+    public Response<List<UserQuestionDetailDto>> detailReportQuestion(
+            @RequestParam(required = true, name="id") Integer userReportId
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        List<UserQuestion> userQuestionList = questionFlowService.listByReport(user.getId(), userReportId);
+
+        List<UserQuestionDetailDto> userQuestionDetailDtos = Transform.convert(userQuestionList, UserQuestionDetailDto.class);
+
+        return ResponseHelp.success(userQuestionDetailDtos);
+    }
+
     @RequestMapping(value = "/exercise/start", method = RequestMethod.POST)
     @ApiOperation(value = "开始: 练习", notes = "提交考试设置", httpMethod = "POST")
     public Response<UserReportBaseDto> startExercise(@RequestBody @Validated ExerciseStartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReport report = questionFlowService.start(user.getId(), PaperModule.HOMEWORK_PREVIEW, dto.getPaperId(), setting);
+        UserReport report = questionFlowService.start(user.getId(), PaperModule.PREVIEW, dto.getPaperId(), setting);
 
         return ResponseHelp.success(Transform.convert(report, UserReportBaseDto.class));
     }
 
-    @RequestMapping(value = "/preview/paper", method = RequestMethod.GET)
-    @ApiOperation(value = "获取预习作业", notes = "获取预习作业", httpMethod = "GET")
-    public Response<PaperBaseDto> detailPreview(
-            @RequestParam(required = true, name="id") Integer paperId
-    )  {
-        User user = (User) shiroHelp.getLoginUser();
-        HomeworkPreview preview = homeworkPreviewService.get(paperId);
-        PaperBaseDto paperDto = Transform.convert(preview, PaperBaseDto.class);
-
-        return ResponseHelp.success(paperDto);
-    }
-
     @RequestMapping(value = "/preview/start", method = RequestMethod.POST)
     @ApiOperation(value = "开始: 预习作业", notes = "提交考试设置", httpMethod = "POST")
     public Response<UserReportBaseDto> startPreview(@RequestBody @Validated PreviewStartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.HOMEWORK_PREVIEW, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.PREVIEW, dto.getPaperId(), setting);
 
         UserReportBaseDto userReportBaseDto = Transform.convert(report, UserReportBaseDto.class);
 
@@ -295,7 +248,7 @@ public class QuestionController {
     )  {
         User user = (User) shiroHelp.getLoginUser();
         UserPaper paper = userPaperService.get(paperId);
-        if (!paper.getModule().equals(PaperModule.ERROR.key)){
+        if (!paper.getPaperModule().equals(PaperModule.ERROR.key)){
             throw new ParameterException("试卷不存在");
         }
         if (!paper.getUserId().equals(user.getId())){
@@ -326,7 +279,7 @@ public class QuestionController {
     )  {
         User user = (User) shiroHelp.getLoginUser();
         UserPaper paper = userPaperService.get(paperId);
-        if (!paper.getModule().equals(PaperModule.COLLECT.key)){
+        if (!paper.getPaperModule().equals(PaperModule.COLLECT.key)){
             throw new ParameterException("试卷不存在");
         }
         if (!paper.getUserId().equals(user.getId())){

+ 42 - 1
server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java

@@ -170,9 +170,20 @@ public class SentenceController
     @RequestMapping(value = "/question/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取题目详情", notes = "获取题目详情", httpMethod = "GET")
     public Response<UserSentenceQuestionDetailDto> detailQuestion(
-            @RequestParam(required = true, name="id") Integer questionNoId
+            @RequestParam(required = true) Integer userQuestionId,
+            @RequestParam(required = true) Integer userReportId,
+            @RequestParam(required = true) Integer no
     )  {
         User user = (User) shiroHelp.getLoginUser();
+        if (userQuestionId != null && userQuestionId > 0){
+
+        }else if(userReportId != null && userReportId > 0){
+            if (no == null || no == 0){
+                no = 1;
+            }
+            // 根据题目序号获取
+        }
+
         return ResponseHelp.success(null);
     }
 
@@ -189,6 +200,36 @@ public class SentenceController
         return ResponseHelp.success(paperDto);
     }
 
+    @RequestMapping(value = "/report/detail", method = RequestMethod.GET)
+    @ApiOperation(value = "获取详细记录", notes = "获取报告", httpMethod = "GET")
+    public Response<UserReportDetailDto> detailReport(
+            @RequestParam(required = true, name="id") Integer userReportId
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        UserReportRelation report = questionFlowService.baseReport(user.getId(), userReportId);
+
+        UserReportDetailDto userReportDto = Transform.convert(report, UserReportDetailDto.class);
+
+        // todo 绑定数据
+
+        return ResponseHelp.success(userReportDto);
+    }
+
+    @RequestMapping(value = "/report/question", method = RequestMethod.GET)
+    @ApiOperation(value = "获取练习做题记录", notes = "获取报告题目", httpMethod = "GET")
+    public Response<List<UserSentenceQuestionDetailDto>> detailReportQuestion(
+            @RequestParam(required = true, name="id") Integer userReportId
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        List<UserQuestion> userQuestionList = questionFlowService.listByReport(user.getId(), userReportId);
+
+        List<UserSentenceQuestionDetailDto> userQuestionDetailDtos = Transform.convert(userQuestionList, UserSentenceQuestionDetailDto.class);
+
+        // todo 绑定数据
+
+        return ResponseHelp.success(userQuestionDetailDtos);
+    }
+
     @RequestMapping(value = "/start", method = RequestMethod.POST)
     @ApiOperation(value = "开始做题", notes = "提交考试设置", httpMethod = "POST")
     public Response<UserReportBaseDto> start(@RequestBody @Validated SentenceStartDto dto)  {

+ 4 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/ExercisePaperExtendDto.java

@@ -1,5 +1,9 @@
 package com.qxgmat.dto.admin.extend;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.ExercisePaper;
+
+@Dto(entity = ExercisePaper.class)
 public class ExercisePaperExtendDto {
 
     private Integer id;

+ 3 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/HomeworkPreviewExtendDto.java

@@ -1,12 +1,10 @@
 package com.qxgmat.dto.admin.extend;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 
-import java.util.Date;
-
-@Dto(entity = HomeworkPreview.class)
-public class HomeworkPreviewExtendDto {
+@Dto(entity = PreviewPaper.class)
+public class PreviewPaperExtendDto {
 
     private Integer id;
 

+ 4 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserClassExtendDto.java

@@ -1,7 +1,11 @@
 package com.qxgmat.dto.admin.extend;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserClass;
+
 import java.util.Date;
 
+@Dto(entity = UserClass.class)
 public class UserClassExtendDto {
 
     private Integer id;

+ 4 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserExtendDto.java

@@ -1,5 +1,9 @@
 package com.qxgmat.dto.admin.extend;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.User;
+
+@Dto(entity = User.class)
 public class UserExtendDto {
 
     private Integer id;

+ 0 - 1
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserReportExtendDto.java

@@ -1,7 +1,6 @@
 package com.qxgmat.dto.admin.extend;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
 import com.qxgmat.data.dao.entity.UserReport;
 
 @Dto(entity = UserReport.class)

+ 4 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserServiceExtendDto.java

@@ -1,7 +1,11 @@
 package com.qxgmat.dto.admin.extend;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserService;
+
 import java.util.Date;
 
+@Dto(entity = UserService.class)
 public class UserServiceExtendDto {
 
     private Integer id;

+ 3 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/HomeworkPreviewDto.java

@@ -1,15 +1,13 @@
 package com.qxgmat.dto.admin.request;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
-import com.qxgmat.data.dao.entity.User;
-import org.hibernate.validator.constraints.Length;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 
 import javax.validation.constraints.NotEmpty;
 import java.util.Date;
 
-@Dto(entity = HomeworkPreview.class)
-public class HomeworkPreviewDto {
+@Dto(entity = PreviewPaper.class)
+public class PreviewDto {
 
     private Integer id;
 

+ 3 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/LoginUserDto.java

@@ -1,11 +1,14 @@
 package com.qxgmat.dto.admin.response;
 
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.relation.entity.ManagerRelation;
 import com.qxgmat.dto.admin.extend.ManagerRoleExtendDto;
 
 /**
  * Created by GaoJie on 2017/11/1.
  */
+@Dto(entity = ManagerRelation.class)
 public class LoginUserDto {
 
     /**

+ 3 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewDetailDto.java

@@ -1,14 +1,12 @@
 package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
-import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 
-import java.util.Collection;
 import java.util.Date;
 
-@Dto(entity = HomeworkPreview.class)
-public class HomeworkPreviewDetailDto {
+@Dto(entity = PreviewPaper.class)
+public class PreviewDetailDto {
 
     private Integer id;
 

+ 3 - 4
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewListDto.java

@@ -1,13 +1,12 @@
 package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
-import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 
 import java.util.Date;
 
-@Dto(entity = HomeworkPreview.class)
-public class HomeworkPreviewListDto {
+@Dto(entity = PreviewPaper.class)
+public class PreviewListDto {
 
     private Integer id;
 

+ 11 - 15
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserHomeworkPreviewListDto.java

@@ -2,22 +2,18 @@ package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserPaper;
-import com.qxgmat.data.dao.entity.UserReport;
-import com.qxgmat.dto.admin.extend.HomeworkPreviewExtendDto;
+import com.qxgmat.dto.admin.extend.PreviewPaperExtendDto;
 import com.qxgmat.dto.admin.extend.UserExtendDto;
 import com.qxgmat.dto.admin.extend.UserReportExtendDto;
 
-import javax.validation.constraints.NotEmpty;
-import java.util.Date;
-
 @Dto(entity = UserPaper.class)
-public class UserHomeworkPreviewListDto {
+public class UserPreviewListDto {
 
     private Integer id;
 
     private UserExtendDto user;
 
-    private HomeworkPreviewExtendDto preview;
+    private PreviewPaperExtendDto paper;
 
     private UserReportExtendDto report;
 
@@ -37,14 +33,6 @@ public class UserHomeworkPreviewListDto {
         this.user = user;
     }
 
-    public HomeworkPreviewExtendDto getPreview() {
-        return preview;
-    }
-
-    public void setPreview(HomeworkPreviewExtendDto preview) {
-        this.preview = preview;
-    }
-
     public UserReportExtendDto getReport() {
         return report;
     }
@@ -52,4 +40,12 @@ public class UserHomeworkPreviewListDto {
     public void setReport(UserReportExtendDto report) {
         this.report = report;
     }
+
+    public PreviewPaperExtendDto getPaper() {
+        return paper;
+    }
+
+    public void setPaper(PreviewPaperExtendDto paper) {
+        this.paper = paper;
+    }
 }

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserHomeworkPreviewExtendDto.java

@@ -5,7 +5,7 @@ import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.inline.PaperStat;
 
 @Dto(entity = UserPaper.class)
-public class UserHomeworkPreviewExtendDto {
+public class UserPreviewPaperExtendDto {
 
     private Integer id;
 

+ 2 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/response/PaperBaseDto.java

@@ -1,12 +1,9 @@
 package com.qxgmat.dto.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserClass;
-import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
-
-import java.util.Date;
-import java.util.List;
+import com.qxgmat.data.dao.entity.UserPaper;
 
+@Dto(entity = UserPaper.class)
 public class PaperBaseDto {
     private String title;
     private Integer paperId;

+ 10 - 10
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserClassDetailDto.java

@@ -2,7 +2,7 @@ package com.qxgmat.dto.response;
 
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserClass;
-import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
+import com.qxgmat.dto.extend.UserPreviewPaperExtendDto;
 
 import java.util.Date;
 import java.util.List;
@@ -14,15 +14,7 @@ public class UserClassDetailDto {
     private Date expireTime;
     private Boolean payed;
 
-    private List<UserHomeworkPreviewExtendDto> previews;
-
-    public List<UserHomeworkPreviewExtendDto> getPreviews() {
-        return previews;
-    }
-
-    public void setPreviews(List<UserHomeworkPreviewExtendDto> previews) {
-        this.previews = previews;
-    }
+    private List<UserPreviewPaperExtendDto> papers;
 
     public Date getStartTime() {
         return startTime;
@@ -55,4 +47,12 @@ public class UserClassDetailDto {
     public void setCategory(Integer category) {
         this.category = category;
     }
+
+    public List<UserPreviewPaperExtendDto> getPapers() {
+        return papers;
+    }
+
+    public void setPapers(List<UserPreviewPaperExtendDto> papers) {
+        this.papers = papers;
+    }
 }

+ 3 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserDto.java

@@ -1,5 +1,7 @@
 package com.qxgmat.dto.response;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.User;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
@@ -7,6 +9,7 @@ import java.util.List;
 /**
  * Created by GaoJie on 2017/11/1.
  */
+@Dto(entity = User.class)
 public class UserDto {
     @ApiModelProperty(value = "用户id", required = true)
     private Number id;

+ 0 - 7
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserExerciseGroupDto.java

@@ -1,12 +1,5 @@
 package com.qxgmat.dto.response;
 
-import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserClass;
-import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
-
-import java.util.Date;
-import java.util.List;
-
 public class UserExerciseGroupDto {
     private Integer structId;
 

+ 5 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionDataDto.java

@@ -0,0 +1,5 @@
+package com.qxgmat.dto.response;
+
+public class UserQuestionDataDto {
+
+}

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

@@ -23,6 +23,8 @@ public class UserQuestionDetailDto {
 
     private JSONObject answer;
 
+    private JSONObject detail;
+
     private QuestionDetailExtendDto question;
 
     private Boolean collect;
@@ -100,4 +102,12 @@ public class UserQuestionDetailDto {
     public void setNote(UserNoteExtendDto note) {
         this.note = note;
     }
+
+    public JSONObject getDetail() {
+        return detail;
+    }
+
+    public void setDetail(JSONObject detail) {
+        this.detail = detail;
+    }
 }

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionListDto.java

@@ -8,7 +8,7 @@ import com.qxgmat.dto.extend.QuestionNoExtendDto;
 import java.util.Date;
 
 @Dto(entity = UserQuestion.class)
-public class UserQuestionListDto {
+public class UserQuestionErrorListDto {
     private Integer id;
 
     private QuestionExtendDto question;

+ 8 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentencePaperDto.java

@@ -7,4 +7,12 @@ import com.qxgmat.data.inline.PaperStat;
 @Dto(entity = SentencePaper.class)
 public class UserSentencePaperDto {
     private PaperStat stat;
+
+    public PaperStat getStat() {
+        return stat;
+    }
+
+    public void setStat(PaperStat stat) {
+        this.stat = stat;
+    }
 }

+ 10 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionDetailDto.java

@@ -20,6 +20,8 @@ public class UserSentenceQuestionDetailDto {
 
     private JSONObject answer;
 
+    private JSONObject detail;
+
     private QuestionDetailExtendDto question;
 
     private SentenceQuestionDetailExtendDto sentence;
@@ -99,4 +101,12 @@ public class UserSentenceQuestionDetailDto {
     public void setNote(UserNoteExtendDto note) {
         this.note = note;
     }
+
+    public JSONObject getDetail() {
+        return detail;
+    }
+
+    public void setDetail(JSONObject detail) {
+        this.detail = detail;
+    }
 }

+ 59 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserStudyDetailDto.java

@@ -1,4 +1,63 @@
 package com.qxgmat.dto.response;
 
+import java.util.Date;
+import java.util.Map;
+
 public class UserStudyDetailDto {
+    // 学习天数
+    private Integer days;
+
+    // 学习时长
+    private Integer time;
+
+    // 注册时间
+    private Date createTime;
+
+    // 练习分学科时长
+    private Map<Integer, Integer> categoryMap;
+
+    // 模考时长
+    private Integer examinationTime;
+
+    public Integer getDays() {
+        return days;
+    }
+
+    public void setDays(Integer days) {
+        this.days = days;
+    }
+
+    public Integer getTime() {
+        return time;
+    }
+
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Map<Integer, Integer> getCategoryMap() {
+        return categoryMap;
+    }
+
+    public void setCategoryMap(Map<Integer, Integer> categoryMap) {
+        this.categoryMap = categoryMap;
+    }
+
+    public Integer getExaminationTime() {
+        return examinationTime;
+    }
+
+    public void setExaminationTime(Integer examinationTime) {
+        this.examinationTime = examinationTime;
+    }
+
+    //
 }

+ 62 - 63
server/gateway-api/src/main/java/com/qxgmat/service/HomeworkPreviewService.java

@@ -7,17 +7,16 @@ import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.nuliji.tools.mybatis.Example;
-import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.module.PaperModule;
-import com.qxgmat.data.constants.enums.status.HomeworkPreviewStatus;
-import com.qxgmat.data.dao.HomeworkPreviewMapper;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.constants.enums.status.PreviewStatus;
+import com.qxgmat.data.dao.PreviewPaperMapper;
+import com.qxgmat.data.dao.entity.PreviewPaper;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserReport;
 import com.qxgmat.data.relation.UserPaperRelationMapper;
 import com.qxgmat.data.relation.UserReportRelationMapper;
 import com.qxgmat.data.relation.entity.QuestionNoRelation;
-import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
+import com.qxgmat.data.relation.entity.UserPreviewPaperRelation;
 import com.qxgmat.service.extend.ToolsService;
 import com.qxgmat.service.inline.QuestionNoService;
 import com.qxgmat.service.inline.UserReportService;
@@ -31,11 +30,11 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
-public class HomeworkPreviewService extends AbstractService {
-    private static final Logger logger = LoggerFactory.getLogger(HomeworkPreviewService.class);
+public class PreviewService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(PreviewService.class);
 
     @Resource
-    private HomeworkPreviewMapper homeworkPreviewMapper;
+    private PreviewPaperMapper previewPaperMapper;
 
     @Resource
     private QuestionNoService questionNoService;
@@ -72,23 +71,23 @@ public class HomeworkPreviewService extends AbstractService {
      * @param endTime
      * @return
      */
-    public PageResult<UserHomeworkPreviewRelation> listAdmin(int page, int size, Number category, Number userId, Number previewId, String startTime, String endTime){
+    public PageResult<UserPreviewPaperRelation> listAdmin(int page, int size, Number category, Number userId, Number previewId, String startTime, String endTime){
         Page<UserPaper> p = page(() -> {
-            userPaperRelationMapper.listHomeworkPreviewAdmin(category, userId, previewId, startTime, endTime);
+            userPaperRelationMapper.listPreviewAdmin(category, userId, previewId, startTime, endTime);
         }, page, size);
 
         Collection ids = Transform.getIds(p, UserPaper.class, "id");
 
         // 获取详细数据
         List<UserPaper> list = userPaperService.select(ids);
-        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
+        List<UserPreviewPaperRelation> pr = Transform.convert(list, UserPreviewPaperRelation.class);
 
         // 获取完成度最高的作业结果
         List<UserReport> reportList = userReportRelationMapper.listFinishLast(ids, startTime, endTime);
         Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
         Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
 
-        Transform.combine(p, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
+        Transform.combine(p, reportList, UserPreviewPaperRelation.class, "id", "report", UserReport.class, "paperId");
 
         return new PageResult<>(pr, p.getTotal());
     }
@@ -103,23 +102,23 @@ public class HomeworkPreviewService extends AbstractService {
      * @param finish
      * @return
      */
-    public PageResult<UserHomeworkPreviewRelation> list(int page, int size, Number category, Number userId, String endTime, Boolean finish){
+    public PageResult<UserPreviewPaperRelation> list(int page, int size, Number category, Number userId, String endTime, Boolean finish){
         Page<UserPaper> p = page(()->{
-            userPaperRelationMapper.listHomeworkPreview(category, userId, endTime, finish);
+            userPaperRelationMapper.listPreview(category, userId, endTime, finish);
         },page, size);
 
         Collection ids = Transform.getIds(p, UserPaper.class, "id");
 
         // 获取详细数据
         List<UserPaper> list = userPaperService.select(ids);
-        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
+        List<UserPreviewPaperRelation> pr = Transform.convert(list, UserPreviewPaperRelation.class);
 
         // 获取最后一次作业结果
         List<UserReport> reportList = userReportRelationMapper.listLast(ids);
         Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
         Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
 
-        Transform.combine(p, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
+        Transform.combine(p, reportList, UserPreviewPaperRelation.class, "id", "report", UserReport.class, "paperId");
 
         return new PageResult<>(pr, p.getTotal());
     }
@@ -130,9 +129,9 @@ public class HomeworkPreviewService extends AbstractService {
      * @param top
      * @return
      */
-    public Map<Object, Collection<UserHomeworkPreviewRelation>> groupByCategory(Number userId, Number top){
-        List<UserPaper> p = userPaperRelationMapper.listHomeworkPreviewGroupTop(userId, top);
-        Map<Object, Collection<UserHomeworkPreviewRelation>> relationMap = new HashMap<>();
+    public Map<Object, Collection<UserPreviewPaperRelation>> groupByCategory(Number userId, Number top){
+        List<UserPaper> p = userPaperRelationMapper.listPreviewGroupTop(userId, top);
+        Map<Object, Collection<UserPreviewPaperRelation>> relationMap = new HashMap<>();
 
         if(p.size() == 0) return relationMap;
 
@@ -140,23 +139,23 @@ public class HomeworkPreviewService extends AbstractService {
 
         // 获取详细数据
         List<UserPaper> list = userPaperService.select(ids);
-        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
+        List<UserPreviewPaperRelation> pr = Transform.convert(list, UserPreviewPaperRelation.class);
 
         // 获取最后一次作业结果
         List<UserReport> reportList = userReportRelationMapper.listLast(ids);
         Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
         Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
 
-        Transform.combine(pr, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
+        Transform.combine(pr, reportList, UserPreviewPaperRelation.class, "id", "report", UserReport.class, "paperId");
 
-        for(UserHomeworkPreviewRelation row: pr){
-            List<UserHomeworkPreviewRelation> l;
+        for(UserPreviewPaperRelation row: pr){
+            List<UserPreviewPaperRelation> l;
             Number moduleId = row.getModuleId();
             if(!relationMap.containsKey(moduleId)){
                 l = new ArrayList<>();
                 relationMap.put(moduleId, l);
             }else{
-                l = (List<UserHomeworkPreviewRelation>)relationMap.get(moduleId);
+                l = (List<UserPreviewPaperRelation>)relationMap.get(moduleId);
             }
             l.add(row);
         }
@@ -172,62 +171,62 @@ public class HomeworkPreviewService extends AbstractService {
     }
 
     @Transactional
-    public HomeworkPreview add(HomeworkPreview homeworkPreview){
-        int result = insert(homeworkPreviewMapper, homeworkPreview);
-        homeworkPreview = one(homeworkPreviewMapper, homeworkPreview.getId());
-        if(homeworkPreview == null){
+    public PreviewPaper add(PreviewPaper previewPaper){
+        int result = insert(previewPaperMapper, previewPaper);
+        previewPaper = one(previewPaperMapper, previewPaper.getId());
+        if(previewPaper == null){
             throw new SystemException("预习作业添加失败");
         }
-        Integer[] userIds = homeworkPreview.getUserIds();
+        Integer[] userIds = previewPaper.getUserIds();
 
         // 获取考题时间
-        List<QuestionNoRelation> relationList = questionNoService.listWithRelationByIds(homeworkPreview.getQuestionNoIds());
-        Integer time = toolsService.computerTime(SettingKey.EXERCISE_TIME, relationList);
+        List<QuestionNoRelation> relationList = questionNoService.listWithRelationByIds(previewPaper.getQuestionNoIds());
+        Integer time = toolsService.computerTime(relationList);
         for(Integer userId : userIds){
             userPaperService.add(UserPaper.builder()
-                    .module(PaperModule.HOMEWORK_PREVIEW.key)
+                    .paperModule(PaperModule.PREVIEW.key)
                     .userId(userId)
-                    .title(homeworkPreview.getTitle())
-                    .moduleId(homeworkPreview.getId())
-                    .questionNoIds(homeworkPreview.getQuestionNoIds())
+                    .title(previewPaper.getTitle())
+                    .moduleId(previewPaper.getId())
+                    .questionNoIds(previewPaper.getQuestionNoIds())
                     .time(time)
                     .build()
             );
         }
-        return homeworkPreview;
+        return previewPaper;
     }
 
     @Transactional
-    public HomeworkPreview edit(HomeworkPreview homeworkPreview){
-        HomeworkPreview in = one(homeworkPreviewMapper, homeworkPreview.getId());
+    public PreviewPaper edit(PreviewPaper previewPaper){
+        PreviewPaper in = one(previewPaperMapper, previewPaper.getId());
         if(in == null){
             throw new ParameterException("预习作业不存在");
         }
-        int result = update(homeworkPreviewMapper, homeworkPreview);
+        int result = update(previewPaperMapper, previewPaper);
 
         List<Integer> oldList = Arrays.stream(in.getUserIds()).collect(Collectors.toList());
-        List<Integer> newList = Arrays.stream(homeworkPreview.getUserIds()).collect(Collectors.toList());
+        List<Integer> newList = Arrays.stream(previewPaper.getUserIds()).collect(Collectors.toList());
 
         // 移除旧用户试卷
         oldList.removeAll(newList);
-        userPaperService.removeByUsersAndPaper(oldList, PaperModule.HOMEWORK_PREVIEW, homeworkPreview.getId());
+        userPaperService.removeByUsersAndPaper(oldList, PaperModule.PREVIEW, previewPaper.getId());
 
         // 获取旧用户做为编辑试卷
         List<Integer> editList = Arrays.stream(in.getUserIds()).collect(Collectors.toList());
         editList.removeAll(oldList);
 
         // 获取考题时间
-        List<QuestionNoRelation> relationList = questionNoService.listWithRelationByIds(homeworkPreview.getQuestionNoIds());
-        Integer time = toolsService.computerTime(SettingKey.EXERCISE_TIME, relationList);
+        List<QuestionNoRelation> relationList = questionNoService.listWithRelationByIds(previewPaper.getQuestionNoIds());
+        Integer time = toolsService.computerTime(relationList);
         for(Integer userId : newList){
             if (!editList.contains(userId)){
                 // 添加
                 userPaperService.add(UserPaper.builder()
-                        .module(PaperModule.HOMEWORK_PREVIEW.key)
+                        .paperModule(PaperModule.PREVIEW.key)
                         .userId(userId)
-                        .title(homeworkPreview.getTitle())
-                        .moduleId(homeworkPreview.getId())
-                        .questionNoIds(homeworkPreview.getQuestionNoIds())
+                        .title(previewPaper.getTitle())
+                        .moduleId(previewPaper.getId())
+                        .questionNoIds(previewPaper.getQuestionNoIds())
                         .time(time)
                         .build()
                 );
@@ -236,27 +235,27 @@ public class HomeworkPreviewService extends AbstractService {
         }
         // 修改
         userPaperService.editByUsersAndPaper(UserPaper.builder()
-                .title(homeworkPreview.getTitle())
-                .questionNoIds(homeworkPreview.getQuestionNoIds())
+                .title(previewPaper.getTitle())
+                .questionNoIds(previewPaper.getQuestionNoIds())
                 .time(time)
                 .build(),
                 oldList,
-                PaperModule.HOMEWORK_PREVIEW, homeworkPreview.getId());
+                PaperModule.PREVIEW, previewPaper.getId());
 
-        return homeworkPreview;
+        return previewPaper;
     }
 
     public boolean delete(Number id){
-        HomeworkPreview in = one(homeworkPreviewMapper, id);
+        PreviewPaper in = one(previewPaperMapper, id);
         if(in == null){
             throw new ParameterException("预习作业不存在");
         }
-        int result = delete(homeworkPreviewMapper, id);
+        int result = delete(previewPaperMapper, id);
         return result > 0;
     }
 
-    public HomeworkPreview get(Number id){
-        HomeworkPreview in = one(homeworkPreviewMapper, id);
+    public PreviewPaper get(Number id){
+        PreviewPaper in = one(previewPaperMapper, id);
 
         if(in == null){
             throw new ParameterException("预习作业不存在");
@@ -264,17 +263,17 @@ public class HomeworkPreviewService extends AbstractService {
         return in;
     }
 
-    public Page<HomeworkPreview> select(int page, int pageSize){
-        return select(homeworkPreviewMapper, page, pageSize);
+    public Page<PreviewPaper> select(int page, int pageSize){
+        return select(previewPaperMapper, page, pageSize);
     }
 
-    public Page<HomeworkPreview> select(int page, int pageSize, Integer category, HomeworkPreviewStatus status){
-        Example example = new Example(HomeworkPreview.class);
+    public Page<PreviewPaper> select(int page, int pageSize, Integer category, PreviewStatus status){
+        Example example = new Example(PreviewPaper.class);
         if(category != null && category>0)
             example.and(
                     example.createCriteria().andEqualTo("category", category)
             );
-        if (status!=HomeworkPreviewStatus.ALL){
+        if (status!= PreviewStatus.ALL){
             tk.mybatis.mapper.entity.Example.Criteria criteria = example.createCriteria();
             switch(status){
                 case NO_START:
@@ -290,11 +289,11 @@ public class HomeworkPreviewService extends AbstractService {
             example.and(criteria);
         }
         example.orderBy("id").desc();
-        return select(homeworkPreviewMapper, example, page, pageSize);
+        return select(previewPaperMapper, example, page, pageSize);
     }
 
-    public List<HomeworkPreview> select(Collection ids){
-        return select(homeworkPreviewMapper, ids);
+    public List<PreviewPaper> select(Collection ids){
+        return select(previewPaperMapper, ids);
     }
 
 }

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

@@ -86,7 +86,7 @@ public class UserPaperService extends AbstractService {
 
             paper = one(userPaperMapper, example);
             if (paper == null){
-                paper = UserPaper.builder().userId(userId).module(module.key).moduleId(paperId).build();
+                paper = UserPaper.builder().userId(userId).paperModule(module.key).moduleId(paperId).build();
                 // 回调,根据模块更新设置
                 IInitPaper.callback(paper, paperId);
                 paper = add(paper);
@@ -120,7 +120,7 @@ public class UserPaperService extends AbstractService {
     }
 
     /**
-     * 批量删除用户记录:homework切换可用学生
+     * 批量删除用户记录:preview切换可用学生
      * @param userIds
      * @param module
      * @param paperId
@@ -139,7 +139,7 @@ public class UserPaperService extends AbstractService {
     }
 
     /**
-     * 批量修改用户记录:homework更新内容
+     * 批量修改用户记录:preview更新内容
      * @param userIds
      * @param module
      * @param paperId

+ 2 - 0
server/gateway-api/src/main/java/com/qxgmat/service/UserQuestionService.java

@@ -73,6 +73,8 @@ public class UserQuestionService extends AbstractService {
         UserQuestion question = UserQuestion.builder()
                 .reportId(report.getId())
                 .userId(report.getUserId())
+                // 添加题目序号
+                .no(lastQuestion != null ? lastQuestion.getNo() + 1: 1)
                 .build();
         // 回调,根据模块更新设置
         boolean result = IInitQuestion.callback(question, report, lastQuestion);

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

@@ -9,5 +9,5 @@ import com.qxgmat.data.dao.entity.UserReport;
  */
 @FunctionalInterface
 public interface SubmitQuestion {
-    boolean callback(UserQuestion question);
+    Boolean callback(UserQuestion question);
 }

+ 314 - 35
server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

@@ -1,13 +1,18 @@
 package com.qxgmat.service.extend;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
+import com.qxgmat.data.constants.enums.QuestionContentType;
+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.QuestionModule;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.QuestionNoRelation;
+import com.qxgmat.data.relation.entity.SentenceQuestionRelation;
+import com.qxgmat.data.relation.entity.UserReportLimitRelation;
 import com.qxgmat.data.relation.entity.UserReportRelation;
 import com.qxgmat.service.*;
 import com.qxgmat.service.annotation.*;
@@ -15,7 +20,6 @@ import com.qxgmat.service.inline.QuestionNoService;
 import com.qxgmat.service.inline.QuestionService;
 import com.qxgmat.service.inline.SentenceQuestionService;
 import com.qxgmat.service.inline.UserReportService;
-import com.qxgmat.util.annotation.Callback;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -30,7 +34,7 @@ public class QuestionFlowService {
     private ExercisePaperService exercisePaperService;
 
     @Resource
-    private HomeworkPreviewService homeworkPreviewService;
+    private PreviewService previewService;
 
     @Resource
     private ExaminationPaperService examinationPaperService;
@@ -85,10 +89,10 @@ public class QuestionFlowService {
            exercisePaperService.initUserPaper(paper, id);
             // 获取考题时间
             List<QuestionNoRelation> relationList = questionNoService.listWithRelationByIds(paper.getQuestionNoIds());
-            Integer time = toolsService.computerTime(SettingKey.EXERCISE_TIME, relationList);
+            Integer time = toolsService.computerTime(relationList);
             paper.setTime(time);
         });
-        initPaperCallback.put(PaperModule.HOMEWORK_PREVIEW, (paper, id)->{
+        initPaperCallback.put(PaperModule.PREVIEW, (paper, id)->{
             // 后台主动修改,无需变更
         });
         initPaperCallback.put(PaperModule.ERROR, (paper, id)->{
@@ -108,7 +112,7 @@ public class QuestionFlowService {
                 report.setQuestionNoIds(this.randomQuestionNoIds(paper.getQuestionNoIds()));
             }
         });
-        initReportCallback.put(PaperModule.HOMEWORK_PREVIEW, (report, paper)->{
+        initReportCallback.put(PaperModule.PREVIEW, (report, paper)->{
             JSONObject setting = report.getSetting();
             if (setting.getBoolean("disorder")){
                 // 随机试题
@@ -136,31 +140,27 @@ public class QuestionFlowService {
         nextCallback.put(PaperModule.EXERCISE, (question, report, lastQuestion)->{
             Integer questionNoId = this.nextId(report.getQuestionNoIds(), lastQuestion!=null ? lastQuestion.getQuestionNoId():null);
             if (questionNoId == 0) return false;
-            this.bindQuestionNo(question, questionNoId, SettingKey.EXERCISE_TIME);
+            this.bindQuestionNo(question, questionNoId);
             // 设定最后一次练习记录
             usersService.edit(User.builder().id(question.getUserId()).latestExercise(report.getPaperId()).build());
             return true;
         });
-        nextCallback.put(PaperModule.HOMEWORK_PREVIEW, (question, report, lastQuestion)->{
+        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, SettingKey.EXERCISE_TIME);
+            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;
-            // 根据扩展确定exercise还是examination
-            UserPaper paper = userPaperService.get(report.getPaperId());
-            this.bindQuestionNo(question, questionNoId, SettingKey.getTimeByPaperModule(PaperModule.ValueOf(paper.getModuleExtend())));
+            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;
-            // 根据扩展确定exercise还是examination
-            UserPaper paper = userPaperService.get(report.getPaperId());
-            this.bindQuestionNo(question, questionNoId, SettingKey.getTimeByPaperModule(PaperModule.ValueOf(paper.getModuleExtend())));
+            this.bindQuestionNo(question, questionNoId);
             // 设定最后一次错题记录
             usersService.edit(User.builder().id(question.getUserId()).latestError(report.getPaperId()).build());
             return true;
@@ -177,23 +177,72 @@ public class QuestionFlowService {
 
         submitCallback.put(QuestionModule.BASE, (userQuestion)->{
             // 判断答题情况
-            JSONObject answer = userQuestion.getUserAnswer();
+            JSONObject userAnswer = userQuestion.getUserAnswer();
             Question question = questionService.get(userQuestion.getQuestionId());
-
+            JSONObject answer = question.getAnswer();
+
+            String type = question.getContent().getString("type");
+            QuestionContentType contentType = QuestionContentType.ValueOf(type);
+            JSONArray userQuestions = userAnswer.getJSONArray("questions");
+            JSONArray questions = answer.getJSONArray("questions");
+            for(int i = 0; i< questions.size(); i++){
+                JSONObject userOne = userQuestions.getJSONObject(i);
+                JSONObject one = questions.getJSONObject(i);
+                switch(contentType){
+                    case DOUBLE:
+                        JSONArray userDoubleList = userOne.getJSONArray("double");
+                        JSONArray doubleList = one.getJSONArray("double");
+                        if(JSONObject.toJSON(userDoubleList) != JSONObject.toJSON(doubleList)){
+                            return false;
+                        }
+                        break;
+                    case SINGLE:
+                    case INLINE:
+                    default:
+                        JSONArray userSingleList = userOne.getJSONArray("single");
+                        JSONArray singleList = one.getJSONArray("single");
+                        if(JSONObject.toJSON(userSingleList) != JSONObject.toJSON(singleList)){
+                            return false;
+                        }
+                }
+            }
             return true;
         });
         submitCallback.put(QuestionModule.SENTENCE, (userQuestion)->{
             // 判断答题情况
-            JSONObject answer = userQuestion.getUserAnswer();
+            JSONObject userAnswer = userQuestion.getUserAnswer();
             Question question = questionService.get(userQuestion.getQuestionId());
+            JSONObject answer = question.getAnswer();
 
-            return true;
+            boolean correct = true;
+            JSONObject detail = new JSONObject();
+
+            boolean subjectCorrect = this.sentenceAnswer(userAnswer.getJSONArray("subject"), answer.getJSONArray("subject"));
+            detail.put("subject", subjectCorrect);
+            correct = correct & subjectCorrect;
+
+            boolean predicateCorrect = this.sentenceAnswer(userAnswer.getJSONArray("predicate"), answer.getJSONArray("predicate"));
+            detail.put("predicate", predicateCorrect);
+            correct = correct & predicateCorrect;
+
+            boolean objectCorrect = this.sentenceAnswer(userAnswer.getJSONArray("object"), answer.getJSONArray("object"));
+            detail.put("object", objectCorrect);
+            correct = correct & objectCorrect;
+
+            boolean optionsCorrect = this.sentenceAnswer(userAnswer.getJSONArray("options"), answer.getJSONArray("options"));
+            detail.put("options", optionsCorrect);
+//            correct = correct & optionsCorrect;
+
+            userQuestion.setDetail(detail);
+            // 主谓宾判断正确,答题正确
+            return correct;
         });
 
         submitAfterCallback.put(QuestionModule.BASE, (userQuestion)->{
             // 更新题目及题目编号统计
             questionNoService.accumulation(userQuestion);
             questionService.accumulation(userQuestion);
+            // todo 统计答案分布
         });
         submitAfterCallback.put(QuestionModule.SENTENCE, (userQuestion)->{
             // 更新题目及题目编号统计
@@ -202,14 +251,26 @@ public class QuestionFlowService {
         });
 
         finishCallback.put(PaperModule.EXERCISE, (report, questionList)->{
-            // report
+            report.setDetail(this.statExerciseReport(report, questionList));
         });
-        finishCallback.put(PaperModule.HOMEWORK_PREVIEW, (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));
         });
         finishCallback.put(PaperModule.EXAMINATION, (report, questionList)->{
 
         });
+        finishCallback.put(PaperModule.TEXTBOOK, (report, questionList)->{
+
+        });
     }
 
 
@@ -286,7 +347,7 @@ public class QuestionFlowService {
             if (!report.getUserId().equals(userId)){
                 throw new ParameterException("试卷不存在");
             }
-            userQuestion = userQuestionService.addByReport(report, userQuestion, nextCallback.get(PaperModule.ValueOf(report.getModule())));
+            userQuestion = userQuestionService.addByReport(report, userQuestion, nextCallback.get(PaperModule.ValueOf(report.getPaperModule())));
         }
 
         return userQuestion;
@@ -311,16 +372,20 @@ public class QuestionFlowService {
         UserReport userReport = userReportService.get(userQuestion.getReportId());
 
         // 根据report模块获取试题所属模块
-        QuestionModule module = QuestionModule.WithPaper(PaperModule.ValueOf(userReport.getModule()));
+        QuestionModule module = QuestionModule.WithPaper(PaperModule.ValueOf(userReport.getPaperModule()));
         SubmitQuestion callback = submitCallback.get(module);
-        boolean result = callback.callback(userQuestion);
+        Boolean result = callback.callback(userQuestion);
         userQuestion.setIsCorrect(result ? 1 : 0);
         userQuestionService.edit(userQuestion);
 
         // 根据剔除逻辑判断是否统计
         if (toolsService.filterTime(userQuestion)){
-            SubmitAfterQuestion afterCallback = submitAfterCallback.get(module);
-            afterCallback.callback(userQuestion);
+            Question question = questionService.get(userQuestion.getQuestionId());
+            // 作文不统计
+            if (!question.getQuestionType().equals(QuestionType.AWA.key)){
+                SubmitAfterQuestion afterCallback = submitAfterCallback.get(module);
+                afterCallback.callback(userQuestion);
+            }
         }
 
         // 更新对应report记录
@@ -349,8 +414,9 @@ public class QuestionFlowService {
         userReport.setFinishTime(new Date());
         List<UserQuestion> userQuestionList = userQuestionService.listByReport(userId, userReportId);
         // 分析做题结果
-        StatReport callback = finishCallback.get(PaperModule.ValueOf(userReport.getModule()));
+        StatReport callback = finishCallback.get(PaperModule.ValueOf(userReport.getPaperModule()));
         callback.callback(userReport, userQuestionList);
+        userReportService.edit(userReport);
 
         // 统计: 更新对应paper记录
         userPaperService.accumulation(userReport);
@@ -368,6 +434,18 @@ public class QuestionFlowService {
     }
 
     /**
+     * 获取报告题目列表
+     * @param userReportId
+     * @param userId
+     * @return
+     */
+    public List<UserQuestion> listByReport(Integer userReportId, Integer userId){
+
+        List<UserQuestion> userQuestionList = userQuestionService.listByReport(userId, userReportId);
+        return userQuestionList;
+    }
+
+    /**
      * 乱序生成题目列表
      * @param questionNoIds
      * @return
@@ -408,18 +486,12 @@ public class QuestionFlowService {
      * 关联绑定questionNo类型试题
      * @param question
      * @param questionNoId
-     * @param settingKey
      */
-    private void bindQuestionNo(UserQuestion question, Integer questionNoId, SettingKey settingKey){
+    private void bindQuestionNo(UserQuestion question, Integer questionNoId){
         QuestionNoRelation relation = questionNoService.getWithRelation(questionNoId);
         question.setQuestionNoId(relation.getId());
         question.setQuestionId(relation.getQuestionId());
-        if (settingKey != null) {
-            // 根据试题模块信息,获取对应时间key
-            settingKey = SettingKey.getTimeByPaperModule(PaperModule.ValueOf(relation.getModule()));
-        }
-
-        Integer time = toolsService.computerTime(settingKey, relation);
+        Integer time = toolsService.computerTime(relation);
         question.setTime(time);
     }
 
@@ -435,4 +507,211 @@ public class QuestionFlowService {
         relation.setPaper(paper);
         return relation;
     }
+
+    /**
+     * 长难句单个选项答案判断
+     * @param userAnswer
+     * @param answer
+     * @return
+     */
+    private Boolean sentenceAnswer(JSONArray userAnswer, JSONArray answer){
+        // 数量一致,并且都包含
+        if (userAnswer.size() == answer.size()){
+            for(Object s : userAnswer){
+                if (!answer.contains(s)){
+                    return false;
+                }
+            }
+        }else{
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 根据练习报告格式,统计信息
+     * @param report
+     * @param questionList
+     * @return
+     */
+    private JSONObject statExerciseReport(UserReport report, List<UserQuestion> questionList){
+        UserPaper paper = userPaperService.get(report.getPaperId());
+        Collection questionNoIds = Transform.getIds(questionList, UserQuestion.class, "questionNoId");
+        Map<Number, QuestionNoRelation> relationMap = questionNoService.mapWithRelationByIds((Integer[])questionNoIds.toArray());
+
+        // report
+        JSONObject detail = new JSONObject();
+        JSONArray pace = new JSONArray();
+        for (UserQuestion userQuestion : questionList){
+            // 每题用时
+            JSONObject one = new JSONObject();
+            one.put("time", userQuestion.getTime());
+            one.put("userTime", userQuestion.getUserTime());
+            one.put("no", userQuestion.getNo());
+            pace.add(one);
+        }
+        detail.put("pace", pace);
+
+        JSONObject difficultMap  = new JSONObject();
+        for (UserQuestion userQuestion:questionList){
+            // 难度正确度
+            QuestionNoRelation relation = relationMap.get(userQuestion.getQuestionNoId());
+            String d = relation.getQuestion().getDifficult();
+            JSONObject t = difficultMap.getJSONObject(d);
+            if (t == null){
+                t = new JSONObject();
+                t.put("key", d);
+                t.put("userNumber", 1);
+                t.put("userCorrect", userQuestion.getIsCorrect());
+                t.put("totalNumber", relation.getTotalNumber());
+                t.put("totalCorrect", relation.getTotalCorrect());
+                difficultMap.put(d, t);
+            }else{
+                t.put("userNumber", t.getInteger("userNumber") + 1);
+                t.put("userCorrect", t.getInteger("userCorrect") + userQuestion.getIsCorrect());
+                t.put("totalNumber", t.getInteger("totalNumber") + relation.getTotalNumber());
+                t.put("totalCorrect", t.getInteger("totalCorrect") + relation.getTotalCorrect());
+            }
+        }
+        JSONArray difficult = new JSONArray();
+        difficult.addAll(difficultMap.values());
+        detail.put("difficult", difficult);
+
+        JSONObject placeMap = new JSONObject();
+        for (UserQuestion userQuestion:questionList){
+            // 考点用时,以及正确度
+            QuestionNoRelation relation = relationMap.get(userQuestion.getQuestionNoId());
+            String d = relation.getQuestion().getPlace();
+            JSONObject t = placeMap.getJSONObject(d);
+            if (t == null){
+                t = new JSONObject();
+                t.put("key", d);
+                t.put("userNumber", 1);
+                t.put("userCorrect", userQuestion.getIsCorrect());
+                t.put("userTime", userQuestion.getUserTime());
+                placeMap.put(d, t);
+            }else{
+                t.put("userNumber", t.getInteger("userNumber") + 1);
+                t.put("userCorrect", t.getInteger("userCorrect") + userQuestion.getIsCorrect());
+                t.put("userTime", t.getInteger("userTime") + userQuestion.getUserTime());
+            }
+        }
+        JSONArray place = new JSONArray();
+        place.addAll(placeMap.values());
+        detail.put("place", place);
+
+        JSONObject limit = new JSONObject();
+        // 限时统计考试正确度
+        UserReportLimitRelation relation = userReportService.statLimit(report.getPaperModule(), report.getModuleId());
+        limit.put("userNumber", relation.getUserNumber());
+        limit.put("userCorrect", relation.getUserCorrect());
+        detail.put("limit", limit);
+
+        JSONObject info = new JSONObject();
+        // 基本信息
+        info.put("times", paper.getTimes() + 1); // paper还未计数
+        info.put("finishTime", report.getFinishTime());
+        info.put("userTime", report.getUserTime());
+        info.put("time", report.getTime());
+        info.put("questionNumber", report.getQuestionNumber());
+        info.put("userNumber", report.getUserNumber());
+        info.put("userCorrect", report.getUserCorrect());
+        Integer totalNumber = 0;
+        Integer totalCorrect = 0;
+        Integer totalTime = 0;
+        for (QuestionNoRelation questionNoRelation : relationMap.values()){
+            totalNumber += questionNoRelation.getTotalNumber();
+            totalCorrect += questionNoRelation.getTotalCorrect();
+            totalTime += questionNoRelation.getTotalTime();
+        }
+        Integer correctTime = 0;
+        Integer incorrectTime = 0;
+        for (UserQuestion userQuestion : questionList){
+            if (userQuestion.getIsCorrect() > 0){
+                correctTime += userQuestion.getUserTime();
+            }else{
+                incorrectTime += userQuestion.getUserTime();
+            }
+        }
+
+        info.put("totalNumber", totalNumber);
+        info.put("totalCorrect", totalCorrect);
+        info.put("totalTime", totalTime);
+        info.put("correctTime", correctTime);
+        info.put("incorrectTime", incorrectTime);
+        detail.put("info", info);
+        return detail;
+    }
+
+    /**
+     * 根据长难句报告格式,统计信息
+     * @param report
+     * @param questionList
+     * @return
+     */
+    private JSONObject statSentenceReport(UserReport report, List<UserQuestion> questionList){
+        UserPaper paper = userPaperService.get(report.getPaperId());
+        Collection questionNoIds = Transform.getIds(questionList, UserQuestion.class, "questionNoId");
+        Map<Number, SentenceQuestionRelation> relationMap = sentenceQuestionService.mapWithRelationByIds((Integer[])questionNoIds.toArray());
+
+        // report
+        JSONObject detail = new JSONObject();
+        JSONObject ability = new JSONObject();
+        Integer struct = 0;
+        Integer logic = 0;
+        Integer speed = 0;
+        for (UserQuestion userQuestion:questionList){
+            SentenceQuestionRelation relation = relationMap.get(userQuestion.getQuestionNoId());
+            if (userQuestion.getIsCorrect() > 0){
+                struct += 1;
+            }
+            if (userQuestion.getUserTime() < userQuestion.getTime()){
+                speed += 1;
+            }
+            JSONObject questionDetail = userQuestion.getDetail();
+            if (questionDetail.getBoolean("options")){
+                logic += 1;
+            }
+        }
+        ability.put("struct", struct * 100 / report.getQuestionNumber());
+        ability.put("logic", logic * 100 / report.getQuestionNumber());
+        ability.put("speed", speed * 100 / report.getQuestionNumber());
+        ability.put("score", (struct * 40 + logic * 30 + speed * 30) / report.getQuestionNumber());
+        detail.put("ability", ability);
+
+        JSONObject info = new JSONObject();
+        // 基本信息
+        info.put("times", paper.getTimes() + 1); // paper还未计数
+        info.put("finishTime", report.getFinishTime());
+        info.put("userTime", report.getUserTime());
+        info.put("time", report.getTime());
+        info.put("questionNumber", report.getQuestionNumber());
+        info.put("userNumber", report.getUserNumber());
+        info.put("userCorrect", report.getUserCorrect());
+        Integer totalNumber = 0;
+        Integer totalCorrect = 0;
+        Integer totalTime = 0;
+        for (SentenceQuestionRelation questionNoRelation : relationMap.values()){
+            totalNumber += questionNoRelation.getTotalNumber();
+            totalCorrect += questionNoRelation.getTotalCorrect();
+            totalTime += questionNoRelation.getTotalTime();
+        }
+        Integer correctTime = 0;
+        Integer incorrectTime = 0;
+        for (UserQuestion userQuestion : questionList){
+            if (userQuestion.getIsCorrect() > 0){
+                correctTime += userQuestion.getUserTime();
+            }else{
+                incorrectTime += userQuestion.getUserTime();
+            }
+        }
+
+        info.put("totalNumber", totalNumber);
+        info.put("totalCorrect", totalCorrect);
+        info.put("totalTime", totalTime);
+        info.put("correctTime", correctTime);
+        info.put("incorrectTime", incorrectTime);
+        detail.put("info", info);
+        return detail;
+    }
 }

+ 6 - 8
server/gateway-api/src/main/java/com/qxgmat/service/extend/ToolsService.java

@@ -19,14 +19,13 @@ public class ToolsService {
     private SettingService settingService;
 
     /**
-     * 根据练习或者模考时间设置计算考题考试时间
+     * 根据练习时间设置计算考题考试时间
      *      setting: {struct: {difficult: ""}}
-     * @param settingKey
      * @param relationList
      * @return
      */
-    public Integer computerTime(SettingKey settingKey, List<QuestionNoRelation> relationList){
-        Setting setting = settingService.getByKey(settingKey);
+    public Integer computerTime(List<QuestionNoRelation> relationList){
+        Setting setting = settingService.getByKey(SettingKey.EXERCISE_TIME);
         JSONObject value = setting.getValue();
 
         Integer time = 0;
@@ -47,14 +46,13 @@ public class ToolsService {
     }
 
     /**
-     * 根据练习或者模考时间设置获取单个考题时间
+     * 根据练习时间设置获取单个考题时间
      *      setting: {struct: {difficult: ""}}
-     * @param settingKey
      * @param relation
      * @return
      */
-    public Integer computerTime(SettingKey settingKey, QuestionNoRelation relation){
-        Setting setting = settingService.getByKey(settingKey);
+    public Integer computerTime(QuestionNoRelation relation){
+        Setting setting = settingService.getByKey(SettingKey.EXERCISE_TIME);
         JSONObject value = setting.getValue();
 
         JSONObject difficultMap = null;

+ 19 - 4
server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionNoService.java

@@ -139,6 +139,21 @@ public class QuestionNoService extends AbstractService {
     }
 
     /**
+     * 根据题目编号id列表获取关联题目
+     * @param ids
+     * @return
+     */
+    public Map<Number, QuestionNoRelation> mapWithRelationByIds(Number[] ids){
+        List<QuestionNo> p = select(questionNoMapper, ids);
+        List<QuestionNoRelation> list = relation(p);
+        Map<Number, QuestionNoRelation> map = new HashMap<>();
+        for(QuestionNoRelation relation : list){
+            map.put(relation.getId(), relation);
+        }
+        return map;
+    }
+
+    /**
      * 根据题目编号id获取关联题目
      * @param id
      * @return
@@ -238,16 +253,16 @@ public class QuestionNoService extends AbstractService {
 
     /**
      * 通过题目编号获取
-     * @param no
+     * @param title
      * @return
      */
-    public QuestionNo getByNo(String no, String module){
-        return one(questionNoMapper, QuestionNo.builder().no(no).module(module).build());
+    public QuestionNo getByNo(String title, String module){
+        return one(questionNoMapper, QuestionNo.builder().title(title).module(module).build());
     }
 
     @Transactional
     public QuestionNo add(QuestionNo question){
-        QuestionNo in = getByNo(question.getNo(), question.getModule());
+        QuestionNo in = getByNo(question.getTitle(), question.getModule());
         if (in != null){
             return in;
         }

+ 0 - 3
server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionService.java

@@ -5,10 +5,7 @@ import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
-import com.qxgmat.data.constants.enums.status.DirectionStatus;
-import com.qxgmat.data.dao.HomeworkPreviewMapper;
 import com.qxgmat.data.dao.QuestionMapper;
-import com.qxgmat.data.dao.entity.HomeworkPreview;
 import com.qxgmat.data.dao.entity.Question;
 import com.qxgmat.data.dao.entity.UserQuestion;
 import com.qxgmat.data.inline.PaperStat;

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

@@ -11,6 +11,7 @@ import com.qxgmat.data.dao.entity.Manager;
 import com.qxgmat.data.dao.entity.Question;
 import com.qxgmat.data.dao.entity.SentenceQuestion;
 import com.qxgmat.data.dao.entity.UserQuestion;
+import com.qxgmat.data.inline.PaperStat;
 import com.qxgmat.data.relation.SentenceQuestionRelationMapper;
 import com.qxgmat.data.relation.entity.SentenceQuestionRelation;
 import org.slf4j.Logger;
@@ -18,8 +19,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class SentenceQuestionService extends AbstractService {
@@ -35,6 +36,31 @@ public class SentenceQuestionService extends AbstractService {
     private SentenceQuestionRelationMapper sentenceQuestionRelationMapper;
 
     /**
+     * 根据题目编号id列表获取关联题目
+     * @param ids
+     * @return
+     */
+    public List<SentenceQuestionRelation> listWithRelationByIds(Number[] ids){
+        List<SentenceQuestion> p = select(sentenceQuestionMapper, ids);
+        return relation(p);
+    }
+
+    /**
+     * 根据题目编号id列表获取关联题目
+     * @param ids
+     * @return
+     */
+    public Map<Number, SentenceQuestionRelation> mapWithRelationByIds(Number[] ids){
+        List<SentenceQuestion> p = select(sentenceQuestionMapper, ids);
+        List<SentenceQuestionRelation> list = relation(p);
+        Map<Number, SentenceQuestionRelation> map = new HashMap<>();
+        for(SentenceQuestionRelation relation : list){
+            map.put(relation.getId(), relation);
+        }
+        return map;
+    }
+
+    /**
      * 累加做题记录到sentenceQuestion
      * @param question
      */
@@ -43,6 +69,52 @@ public class SentenceQuestionService extends AbstractService {
     }
 
     /**
+     * 根据题目获取总试卷统计信息
+     * @param questionNoList
+     * @return
+     */
+    public PaperStat statPaper(List<SentenceQuestion> questionNoList){
+        PaperStat stat = new PaperStat();
+        Integer totalTime = 0;
+        Integer totalNumber = 0;
+        Integer totalCorrect = 0;
+        for(SentenceQuestion questionNo : questionNoList){
+            totalTime += questionNo.getTotalTime();
+            totalNumber += questionNo.getTotalNumber();
+            totalCorrect += questionNo.getTotalCorrect();
+        }
+        stat.setTotalCorrect(totalCorrect);
+        stat.setTotalNumber(totalNumber);
+        stat.setTotalTime(totalTime);
+        return stat;
+    }
+
+    /**
+     * 根据试卷分组获取统计信息
+     * @param questionNoIdsMap
+     * @return
+     */
+    public Map<Integer, PaperStat> statPaperMap(Map<Integer, Integer[]> questionNoIdsMap){
+        Map<Integer, PaperStat> relationMap = new HashMap<>();
+        List<Integer> ids = new ArrayList<>();
+        for(Integer[] questionNoIds : questionNoIdsMap.values()){
+            ids.addAll(Arrays.stream(questionNoIds).collect(Collectors.toList()));
+        }
+        List<SentenceQuestion> questionNoList = select(ids);
+        Map questionNoMap = Transform.getMap(questionNoList, SentenceQuestion.class, "id");
+        List<SentenceQuestion> l = new ArrayList<>();
+        for(Integer k: questionNoIdsMap.keySet()){
+            l.clear();
+            for (Integer questionNoId : questionNoIdsMap.get(k)){
+                l.add((SentenceQuestion)questionNoMap.get(questionNoId));
+            }
+            relationMap.put(k, statPaper(l));
+        }
+
+        return relationMap;
+    }
+
+    /**
      * 根据长难句题目关系,获取完整题目:列表
      * @param p
      * @return

+ 35 - 7
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java

@@ -3,21 +3,17 @@ package com.qxgmat.service.inline;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
-import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.nuliji.tools.mybatis.Example;
-import com.qxgmat.data.dao.UserQuestionMapper;
 import com.qxgmat.data.dao.UserReportMapper;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserQuestion;
 import com.qxgmat.data.dao.entity.UserReport;
 import com.qxgmat.data.relation.UserReportRelationMapper;
-import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
-import com.qxgmat.data.relation.entity.UserReportRelation;
-import com.qxgmat.service.annotation.InitPaper;
+import com.qxgmat.data.relation.entity.UserReportLimitRelation;
+import com.qxgmat.data.relation.entity.UserStudyStatRelation;
 import com.qxgmat.service.annotation.InitReport;
-import com.qxgmat.util.shiro.UserRealm;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -64,6 +60,38 @@ public class UserReportService extends AbstractService {
     }
 
     /**
+     * 按report统计在限定时间内的做题结果
+     * @param module
+     * @param moduleId
+     * @return
+     */
+    public UserReportLimitRelation statLimit(String module, Integer moduleId){
+        List<UserReportLimitRelation> relations =  userReportRelationMapper.statLimit(module, moduleId);
+        if (relations.size() > 0){
+            return relations.get(0);
+        }else{
+            return new UserReportLimitRelation();
+        }
+    }
+
+    /**
+     * 按report统计用户的做题记录
+     * @param userId
+     * @param module
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public UserStudyStatRelation statByModule(Integer userId, String module, String startTime, String endTime){
+        List<UserStudyStatRelation> relations =  userReportRelationMapper.statByModule(userId, module, startTime, endTime);
+        if (relations.size() > 0){
+            return relations.get(0);
+        }else{
+            return new UserStudyStatRelation();
+        }
+    }
+
+    /**
      * 根据用户paper生成一份新的report记录
      * @param paper
      * @param setting
@@ -72,7 +100,7 @@ public class UserReportService extends AbstractService {
      */
     public UserReport addByPaper(UserPaper paper, JSONObject setting, InitReport IInitReport){
         UserReport report = UserReport.builder()
-                .module(paper.getModule())
+                .paperModule(paper.getPaperModule())
                 .moduleId(paper.getModuleId())
                 .setting(setting)
                 .userId(paper.getUserId())