Browse Source

feat(个人中心统计信息):

Go 5 years ago
parent
commit
154247de39
62 changed files with 2041 additions and 231 deletions
  1. 14 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/QuestionDifficult.java
  2. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/StatDayMapper.java
  3. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/TextbookLibraryHistoryMapper.java
  4. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/TextbookLibraryMapper.java
  5. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserSentenceRecordMapper.java
  6. 27 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourse.java
  7. 202 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourseNo.java
  8. 63 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookLibrary.java
  9. 125 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookLibraryHistory.java
  10. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookPaper.java
  11. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookQuestion.java
  12. 70 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourse.java
  13. 97 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourseRecord.java
  14. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserQuestion.java
  15. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java
  16. 74 39
      server/data/src/main/java/com/qxgmat/data/dao/entity/StatDay.java
  17. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseMapper.xml
  18. 23 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseNoMapper.xml
  19. 4 6
      server/data/src/main/java/com/qxgmat/data/dao/mapping/StatDayMapper.xml
  20. 10 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookLibraryMapper.xml
  21. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookPaperMapper.xml
  22. 3 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookQuestionMapper.xml
  23. 3 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseMapper.xml
  24. 4 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseRecordMapper.xml
  25. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserQuestionMapper.xml
  26. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml
  27. 21 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserSentenceRecordMapper.xml
  28. 21 0
      server/data/src/main/java/com/qxgmat/data/relation/UserCourseRecordRelationMapper.java
  29. 5 2
      server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java
  30. 17 0
      server/data/src/main/java/com/qxgmat/data/relation/UserSentenceRecordRelationMapper.java
  31. 34 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserCourseStatRelation.java
  32. 38 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserExaminationPaperRelation.java
  33. 20 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserSentenceStatRelation.java
  34. 30 3
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserStudyStatRelation.java
  35. 42 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCourseRecordRelationMapper.xml
  36. 26 8
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml
  37. 39 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserSentenceRecordRelationMapper.xml
  38. 1 0
      server/data/src/main/resources/mybatis-generator.xml
  39. 7 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java
  40. 1 1
      server/gateway-api/src/main/java/com/qxgmat/controller/api/BaseController.java
  41. 181 15
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  42. 1 1
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  43. 2 1
      server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java
  44. 50 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserCourseResultExtendDto.java
  45. 50 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserExerciseExtendDto.java
  46. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperBaseExtendDto.java
  47. 11 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserReportExtendDto.java
  48. 28 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserStudyExtendDto.java
  49. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/QuestionSubmitDto.java
  50. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserSentenceProcessDto.java
  51. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/MyDto.java
  52. 129 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserStudyDayDto.java
  53. 9 19
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserStudyDetailDto.java
  54. 5 3
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java
  55. 10 6
      server/gateway-api/src/main/java/com/qxgmat/service/extend/ToolsService.java
  56. 71 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/ClassCourseNoService.java
  57. 0 68
      server/gateway-api/src/main/java/com/qxgmat/service/inline/StatDayService.java
  58. 0 8
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAskQuestionService.java
  59. 102 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseRecordService.java
  60. 67 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseService.java
  61. 32 9
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java
  62. 109 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserSentenceRecordService.java

+ 14 - 1
server/data/src/main/java/com/qxgmat/data/constants/enums/QuestionDifficult.java

@@ -19,7 +19,7 @@ public enum QuestionDifficult {
         return QuestionDifficult.valueOf(name.toUpperCase());
     }
 
-    public static int GetScore(QuestionDifficult difficult){
+    public static int GetScoreBase(QuestionDifficult difficult){
         switch(difficult){
             case EASY:
                 return 550;
@@ -31,4 +31,17 @@ public enum QuestionDifficult {
                 return 0;
         }
     }
+
+    public static int GetScore(QuestionDifficult difficult){
+        switch(difficult){
+            case EASY:
+                return 500;
+            case MEDIUM:
+                return 600;
+            case HARD:
+                return 700;
+            default:
+                return 0;
+        }
+    }
 }

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

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

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

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

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

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

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

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

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

@@ -1,6 +1,7 @@
 package com.qxgmat.data.dao.entity;
 
 import java.io.Serializable;
+import java.util.Date;
 import javax.persistence.*;
 
 @Table(name = "class_course")
@@ -34,6 +35,9 @@ public class ClassCourse implements Serializable {
     @Column(name = "`title`")
     private String title;
 
+    @Column(name = "`create_time`")
+    private Date createTime;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -122,6 +126,20 @@ public class ClassCourse implements Serializable {
         this.title = title;
     }
 
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -133,6 +151,7 @@ public class ClassCourse implements Serializable {
         sb.append(", parentStructId=").append(parentStructId);
         sb.append(", questionModule=").append(questionModule);
         sb.append(", title=").append(title);
+        sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
     }
@@ -196,6 +215,14 @@ public class ClassCourse implements Serializable {
             return this;
         }
 
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
         public ClassCourse build() {
             return this.obj;
         }

+ 202 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/ClassCourseNo.java

@@ -1,6 +1,7 @@
 package com.qxgmat.data.dao.entity;
 
 import java.io.Serializable;
+import java.util.Date;
 import javax.persistence.*;
 
 @Table(name = "class_course_no")
@@ -10,6 +11,39 @@ public class ClassCourseNo implements Serializable {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
+    /**
+     * 课程id
+     */
+    @Column(name = "`course_id`")
+    private Integer courseId;
+
+    /**
+     * 课时序号
+     */
+    @Column(name = "`no`")
+    private Integer no;
+
+    /**
+     * 资源文件地址
+     */
+    @Column(name = "`resource`")
+    private String resource;
+
+    /**
+     * 课程时长
+     */
+    @Column(name = "`time`")
+    private Integer time;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
+    /**
+     * 课时描述
+     */
+    @Column(name = "`content`")
+    private String content;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -26,6 +60,110 @@ public class ClassCourseNo implements Serializable {
         this.id = id;
     }
 
+    /**
+     * 获取课程id
+     *
+     * @return course_id - 课程id
+     */
+    public Integer getCourseId() {
+        return courseId;
+    }
+
+    /**
+     * 设置课程id
+     *
+     * @param courseId 课程id
+     */
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
+    }
+
+    /**
+     * 获取课时序号
+     *
+     * @return no - 课时序号
+     */
+    public Integer getNo() {
+        return no;
+    }
+
+    /**
+     * 设置课时序号
+     *
+     * @param no 课时序号
+     */
+    public void setNo(Integer no) {
+        this.no = no;
+    }
+
+    /**
+     * 获取资源文件地址
+     *
+     * @return resource - 资源文件地址
+     */
+    public String getResource() {
+        return resource;
+    }
+
+    /**
+     * 设置资源文件地址
+     *
+     * @param resource 资源文件地址
+     */
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    /**
+     * 获取课程时长
+     *
+     * @return time - 课程时长
+     */
+    public Integer getTime() {
+        return time;
+    }
+
+    /**
+     * 设置课程时长
+     *
+     * @param time 课程时长
+     */
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取课时描述
+     *
+     * @return content - 课时描述
+     */
+    public String getContent() {
+        return content;
+    }
+
+    /**
+     * 设置课时描述
+     *
+     * @param content 课时描述
+     */
+    public void setContent(String content) {
+        this.content = content;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -33,6 +171,12 @@ public class ClassCourseNo implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", courseId=").append(courseId);
+        sb.append(", no=").append(no);
+        sb.append(", resource=").append(resource);
+        sb.append(", time=").append(time);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", content=").append(content);
         sb.append("]");
         return sb.toString();
     }
@@ -56,6 +200,64 @@ public class ClassCourseNo implements Serializable {
             return this;
         }
 
+        /**
+         * 设置课程id
+         *
+         * @param courseId 课程id
+         */
+        public Builder courseId(Integer courseId) {
+            obj.setCourseId(courseId);
+            return this;
+        }
+
+        /**
+         * 设置课时序号
+         *
+         * @param no 课时序号
+         */
+        public Builder no(Integer no) {
+            obj.setNo(no);
+            return this;
+        }
+
+        /**
+         * 设置资源文件地址
+         *
+         * @param resource 资源文件地址
+         */
+        public Builder resource(String resource) {
+            obj.setResource(resource);
+            return this;
+        }
+
+        /**
+         * 设置课程时长
+         *
+         * @param time 课程时长
+         */
+        public Builder time(Integer time) {
+            obj.setTime(time);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
+        /**
+         * 设置课时描述
+         *
+         * @param content 课时描述
+         */
+        public Builder content(String content) {
+            obj.setContent(content);
+            return this;
+        }
+
         public ClassCourseNo build() {
             return this.obj;
         }

+ 63 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookLibrary.java

@@ -0,0 +1,63 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import javax.persistence.*;
+
+@Table(name = "textbook_library")
+public class TextbookLibrary implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @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("]");
+        return sb.toString();
+    }
+
+    public static TextbookLibrary.Builder builder() {
+        return new TextbookLibrary.Builder();
+    }
+
+    public static class Builder {
+        private TextbookLibrary obj;
+
+        public Builder() {
+            this.obj = new TextbookLibrary();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        public TextbookLibrary build() {
+            return this.obj;
+        }
+    }
+}

+ 125 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookLibraryHistory.java

@@ -0,0 +1,125 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "textbook_library_history")
+public class TextbookLibraryHistory implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 换库id
+     */
+    @Column(name = "`library_id`")
+    private Integer libraryId;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
+    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 library_id - 换库id
+     */
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    /**
+     * 设置换库id
+     *
+     * @param libraryId 换库id
+     */
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @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(", libraryId=").append(libraryId);
+        sb.append(", createTime=").append(createTime);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static TextbookLibraryHistory.Builder builder() {
+        return new TextbookLibraryHistory.Builder();
+    }
+
+    public static class Builder {
+        private TextbookLibraryHistory obj;
+
+        public Builder() {
+            this.obj = new TextbookLibraryHistory();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置换库id
+         *
+         * @param libraryId 换库id
+         */
+        public Builder libraryId(Integer libraryId) {
+            obj.setLibraryId(libraryId);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
+        public TextbookLibraryHistory build() {
+            return this.obj;
+        }
+    }
+}

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

@@ -38,8 +38,8 @@ public class TextbookPaper implements Serializable {
     /**
      * 换库id
      */
-    @Column(name = "`set_id`")
-    private Integer setId;
+    @Column(name = "`library_id`")
+    private Integer libraryId;
 
     /**
      * 题目编号ids:json
@@ -150,19 +150,19 @@ public class TextbookPaper implements Serializable {
     /**
      * 获取换库id
      *
-     * @return set_id - 换库id
+     * @return library_id - 换库id
      */
-    public Integer getSetId() {
-        return setId;
+    public Integer getLibraryId() {
+        return libraryId;
     }
 
     /**
      * 设置换库id
      *
-     * @param setId 换库id
+     * @param libraryId 换库id
      */
-    public void setSetId(Integer setId) {
-        this.setId = setId;
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
     }
 
     /**
@@ -240,7 +240,7 @@ public class TextbookPaper implements Serializable {
         sb.append(", title=").append(title);
         sb.append(", logic=").append(logic);
         sb.append(", no=").append(no);
-        sb.append(", setId=").append(setId);
+        sb.append(", libraryId=").append(libraryId);
         sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", questionNumber=").append(questionNumber);
         sb.append(", createTime=").append(createTime);
@@ -311,10 +311,10 @@ public class TextbookPaper implements Serializable {
         /**
          * 设置换库id
          *
-         * @param setId 换库id
+         * @param libraryId 换库id
          */
-        public Builder setId(Integer setId) {
-            obj.setSetId(setId);
+        public Builder libraryId(Integer libraryId) {
+            obj.setLibraryId(libraryId);
             return this;
         }
 

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

@@ -26,8 +26,8 @@ public class TextbookQuestion implements Serializable {
     /**
      * 机经版本:关联换库表
      */
-    @Column(name = "`set_id`")
-    private Integer setId;
+    @Column(name = "`library_id`")
+    private Integer libraryId;
 
     /**
      * 题目id
@@ -126,19 +126,19 @@ public class TextbookQuestion implements Serializable {
     /**
      * 获取机经版本:关联换库表
      *
-     * @return set_id - 机经版本:关联换库表
+     * @return library_id - 机经版本:关联换库表
      */
-    public Integer getSetId() {
-        return setId;
+    public Integer getLibraryId() {
+        return libraryId;
     }
 
     /**
      * 设置机经版本:关联换库表
      *
-     * @param setId 机经版本:关联换库表
+     * @param libraryId 机经版本:关联换库表
      */
-    public void setSetId(Integer setId) {
-        this.setId = setId;
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
     }
 
     /**
@@ -286,7 +286,7 @@ public class TextbookQuestion implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", title=").append(title);
         sb.append(", no=").append(no);
-        sb.append(", setId=").append(setId);
+        sb.append(", libraryId=").append(libraryId);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", totalTime=").append(totalTime);
@@ -341,10 +341,10 @@ public class TextbookQuestion implements Serializable {
         /**
          * 设置机经版本:关联换库表
          *
-         * @param setId 机经版本:关联换库表
+         * @param libraryId 机经版本:关联换库表
          */
-        public Builder setId(Integer setId) {
-            obj.setSetId(setId);
+        public Builder libraryId(Integer libraryId) {
+            obj.setLibraryId(libraryId);
             return this;
         }
 

+ 70 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourse.java

@@ -22,6 +22,18 @@ public class UserCourse implements Serializable {
     @Column(name = "`course_id`")
     private Integer courseId;
 
+    /**
+     * 课时id
+     */
+    @Column(name = "`course_no_id`")
+    private Integer courseNoId;
+
+    /**
+     * 已学习时间
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -74,6 +86,42 @@ public class UserCourse implements Serializable {
         this.courseId = courseId;
     }
 
+    /**
+     * 获取课时id
+     *
+     * @return course_no_id - 课时id
+     */
+    public Integer getCourseNoId() {
+        return courseNoId;
+    }
+
+    /**
+     * 设置课时id
+     *
+     * @param courseNoId 课时id
+     */
+    public void setCourseNoId(Integer courseNoId) {
+        this.courseNoId = courseNoId;
+    }
+
+    /**
+     * 获取已学习时间
+     *
+     * @return user_time - 已学习时间
+     */
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    /**
+     * 设置已学习时间
+     *
+     * @param userTime 已学习时间
+     */
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -83,6 +131,8 @@ public class UserCourse implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", courseId=").append(courseId);
+        sb.append(", courseNoId=").append(courseNoId);
+        sb.append(", userTime=").append(userTime);
         sb.append("]");
         return sb.toString();
     }
@@ -126,6 +176,26 @@ public class UserCourse implements Serializable {
             return this;
         }
 
+        /**
+         * 设置课时id
+         *
+         * @param courseNoId 课时id
+         */
+        public Builder courseNoId(Integer courseNoId) {
+            obj.setCourseNoId(courseNoId);
+            return this;
+        }
+
+        /**
+         * 设置已学习时间
+         *
+         * @param userTime 已学习时间
+         */
+        public Builder userTime(Integer userTime) {
+            obj.setUserTime(userTime);
+            return this;
+        }
+
         public UserCourse build() {
             return this.obj;
         }

+ 97 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourseRecord.java

@@ -1,6 +1,7 @@
 package com.qxgmat.data.dao.entity;
 
 import java.io.Serializable;
+import java.util.Date;
 import javax.persistence.*;
 
 @Table(name = "user_course_record")
@@ -22,6 +23,21 @@ public class UserCourseRecord implements Serializable {
     @Column(name = "`course_id`")
     private Integer courseId;
 
+    /**
+     * 访问时长
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
+    /**
+     * 课时id
+     */
+    @Column(name = "`course_no_id`")
+    private Integer courseNoId;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -74,6 +90,56 @@ public class UserCourseRecord implements Serializable {
         this.courseId = courseId;
     }
 
+    /**
+     * 获取访问时长
+     *
+     * @return user_time - 访问时长
+     */
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    /**
+     * 设置访问时长
+     *
+     * @param userTime 访问时长
+     */
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+
+    /**
+     * 获取课时id
+     *
+     * @return course_no_id - 课时id
+     */
+    public Integer getCourseNoId() {
+        return courseNoId;
+    }
+
+    /**
+     * 设置课时id
+     *
+     * @param courseNoId 课时id
+     */
+    public void setCourseNoId(Integer courseNoId) {
+        this.courseNoId = courseNoId;
+    }
+
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -83,6 +149,9 @@ public class UserCourseRecord implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", courseId=").append(courseId);
+        sb.append(", userTime=").append(userTime);
+        sb.append(", courseNoId=").append(courseNoId);
+        sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
     }
@@ -126,6 +195,34 @@ public class UserCourseRecord implements Serializable {
             return this;
         }
 
+        /**
+         * 设置访问时长
+         *
+         * @param userTime 访问时长
+         */
+        public Builder userTime(Integer userTime) {
+            obj.setUserTime(userTime);
+            return this;
+        }
+
+        /**
+         * 设置课时id
+         *
+         * @param courseNoId 课时id
+         */
+        public Builder courseNoId(Integer courseNoId) {
+            obj.setCourseNoId(courseNoId);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
         public UserCourseRecord build() {
             return this.obj;
         }

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

@@ -67,6 +67,12 @@ public class UserQuestion implements Serializable {
     private Integer isCorrect;
 
     /**
+     * 题目设置
+     */
+    @Column(name = "`setting`")
+    private JSONObject setting;
+
+    /**
      * 详细信息:长难句逻辑、结构,模考题分数
      */
     @Column(name = "`detail`")
@@ -254,6 +260,24 @@ public class UserQuestion implements Serializable {
     }
 
     /**
+     * 获取题目设置
+     *
+     * @return setting - 题目设置
+     */
+    public JSONObject getSetting() {
+        return setting;
+    }
+
+    /**
+     * 设置题目设置
+     *
+     * @param setting 题目设置
+     */
+    public void setSetting(JSONObject setting) {
+        this.setting = setting;
+    }
+
+    /**
      * 获取详细信息:长难句逻辑、结构,模考题分数
      *
      * @return detail - 详细信息:长难句逻辑、结构,模考题分数
@@ -301,6 +325,7 @@ public class UserQuestion implements Serializable {
         sb.append(", userTime=").append(userTime);
         sb.append(", userAnswer=").append(userAnswer);
         sb.append(", isCorrect=").append(isCorrect);
+        sb.append(", setting=").append(setting);
         sb.append(", detail=").append(detail);
         sb.append(", createTime=").append(createTime);
         sb.append("]");
@@ -417,6 +442,16 @@ public class UserQuestion implements Serializable {
         }
 
         /**
+         * 设置题目设置
+         *
+         * @param setting 题目设置
+         */
+        public Builder setting(JSONObject setting) {
+            obj.setSetting(setting);
+            return this;
+        }
+
+        /**
          * 设置详细信息:长难句逻辑、结构,模考题分数
          *
          * @param detail 详细信息:长难句逻辑、结构,模考题分数

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

@@ -93,6 +93,12 @@ public class UserReport implements Serializable {
     @Column(name = "`detail`")
     private JSONObject detail;
 
+    /**
+     * 是否完成答卷:0未完成,1完成
+     */
+    @Column(name = "`is_finish`")
+    private Integer isFinish;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
@@ -364,6 +370,24 @@ public class UserReport implements Serializable {
     }
 
     /**
+     * 获取是否完成答卷:0未完成,1完成
+     *
+     * @return is_finish - 是否完成答卷:0未完成,1完成
+     */
+    public Integer getIsFinish() {
+        return isFinish;
+    }
+
+    /**
+     * 设置是否完成答卷:0未完成,1完成
+     *
+     * @param isFinish 是否完成答卷:0未完成,1完成
+     */
+    public void setIsFinish(Integer isFinish) {
+        this.isFinish = isFinish;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -412,6 +436,7 @@ public class UserReport implements Serializable {
         sb.append(", setting=").append(setting);
         sb.append(", score=").append(score);
         sb.append(", detail=").append(detail);
+        sb.append(", isFinish=").append(isFinish);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
         sb.append("]");
@@ -576,6 +601,16 @@ public class UserReport implements Serializable {
         }
 
         /**
+         * 设置是否完成答卷:0未完成,1完成
+         *
+         * @param isFinish 是否完成答卷:0未完成,1完成
+         */
+        public Builder isFinish(Integer isFinish) {
+            obj.setIsFinish(isFinish);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {

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

@@ -4,8 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import javax.persistence.*;
 
-@Table(name = "stat_day")
-public class StatDay implements Serializable {
+@Table(name = "user_sentence_record")
+public class UserSentenceRecord implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -18,16 +18,22 @@ public class StatDay implements Serializable {
     private Integer userId;
 
     /**
-     * 统计项:exericse,examination
+     * 章节
      */
-    @Column(name = "`key`")
-    private String key;
+    @Column(name = "`chapter`")
+    private Integer chapter;
 
     /**
-     * 时间
+     * 段落
      */
-    @Column(name = "`time`")
-    private Integer time;
+    @Column(name = "`part`")
+    private Integer part;
+
+    /**
+     * 访问时长
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
 
     @Column(name = "`create_time`")
     private Date createTime;
@@ -67,39 +73,57 @@ public class StatDay implements Serializable {
     }
 
     /**
-     * 获取统计项:exericse,examination
+     * 获取章节
+     *
+     * @return chapter - 章节
+     */
+    public Integer getChapter() {
+        return chapter;
+    }
+
+    /**
+     * 设置章节
      *
-     * @return key - 统计项:exericse,examination
+     * @param chapter 章节
      */
-    public String getKey() {
-        return key;
+    public void setChapter(Integer chapter) {
+        this.chapter = chapter;
     }
 
     /**
-     * 设置统计项:exericse,examination
+     * 获取段落
      *
-     * @param key 统计项:exericse,examination
+     * @return part - 段落
      */
-    public void setKey(String key) {
-        this.key = key;
+    public Integer getPart() {
+        return part;
     }
 
     /**
-     * 获取时间
+     * 设置段落
      *
-     * @return time - 时间
+     * @param part 段落
      */
-    public Integer getTime() {
-        return time;
+    public void setPart(Integer part) {
+        this.part = part;
     }
 
     /**
-     * 设置时间
+     * 获取访问时长
      *
-     * @param time 时间
+     * @return user_time - 访问时长
      */
-    public void setTime(Integer time) {
-        this.time = time;
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    /**
+     * 设置访问时长
+     *
+     * @param userTime 访问时长
+     */
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
     }
 
     /**
@@ -124,22 +148,23 @@ public class StatDay implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
-        sb.append(", key=").append(key);
-        sb.append(", time=").append(time);
+        sb.append(", chapter=").append(chapter);
+        sb.append(", part=").append(part);
+        sb.append(", userTime=").append(userTime);
         sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
     }
 
-    public static StatDay.Builder builder() {
-        return new StatDay.Builder();
+    public static UserSentenceRecord.Builder builder() {
+        return new UserSentenceRecord.Builder();
     }
 
     public static class Builder {
-        private StatDay obj;
+        private UserSentenceRecord obj;
 
         public Builder() {
-            this.obj = new StatDay();
+            this.obj = new UserSentenceRecord();
         }
 
         /**
@@ -161,22 +186,32 @@ public class StatDay implements Serializable {
         }
 
         /**
-         * 设置统计项:exericse,examination
+         * 设置章节
+         *
+         * @param chapter 章节
+         */
+        public Builder chapter(Integer chapter) {
+            obj.setChapter(chapter);
+            return this;
+        }
+
+        /**
+         * 设置段落
          *
-         * @param key 统计项:exericse,examination
+         * @param part 段落
          */
-        public Builder key(String key) {
-            obj.setKey(key);
+        public Builder part(Integer part) {
+            obj.setPart(part);
             return this;
         }
 
         /**
-         * 设置时间
+         * 设置访问时长
          *
-         * @param time 时间
+         * @param userTime 访问时长
          */
-        public Builder time(Integer time) {
-            obj.setTime(time);
+        public Builder userTime(Integer userTime) {
+            obj.setUserTime(userTime);
             return this;
         }
 
@@ -188,7 +223,7 @@ public class StatDay implements Serializable {
             return this;
         }
 
-        public StatDay build() {
+        public UserSentenceRecord build() {
             return this.obj;
         }
     }

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

@@ -10,11 +10,12 @@
     <result column="parent_struct_id" jdbcType="INTEGER" property="parentStructId" />
     <result column="question_module" jdbcType="VARCHAR" property="questionModule" />
     <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `struct_id`, `parent_struct_id`, `question_module`, `title`
+    `id`, `struct_id`, `parent_struct_id`, `question_module`, `title`, `create_time`
   </sql>
 </mapper>

+ 23 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/ClassCourseNoMapper.xml

@@ -6,5 +6,28 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="no" jdbcType="INTEGER" property="no" />
+    <result column="resource" jdbcType="VARCHAR" property="resource" />
+    <result column="time" jdbcType="INTEGER" property="time" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.ClassCourseNo">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <result column="content" jdbcType="LONGVARCHAR" property="content" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `course_id`, `no`, `resource`, `time`, `create_time`
+  </sql>
+  <sql id="Blob_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `content`
+  </sql>
 </mapper>

+ 4 - 6
server/data/src/main/java/com/qxgmat/data/dao/mapping/StatDayMapper.xml

@@ -1,20 +1,18 @@
 <?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.StatDayMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.StatDay">
+<mapper namespace="com.qxgmat.data.dao.TextbookLibraryHistoryMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.TextbookLibraryHistory">
     <!--
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="user_id" jdbcType="INTEGER" property="userId" />
-    <result column="key" jdbcType="VARCHAR" property="key" />
-    <result column="time" jdbcType="INTEGER" property="time" />
+    <result column="library_id" jdbcType="INTEGER" property="libraryId" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `key`, `time`, `create_time`
+    `id`, `library_id`, `create_time`
   </sql>
 </mapper>

+ 10 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookLibraryMapper.xml

@@ -0,0 +1,10 @@
+<?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.TextbookLibraryMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.TextbookLibrary">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+  </resultMap>
+</mapper>

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

@@ -10,7 +10,7 @@
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="logic" jdbcType="VARCHAR" property="logic" />
     <result column="no" jdbcType="INTEGER" property="no" />
-    <result column="set_id" jdbcType="INTEGER" property="setId" />
+    <result column="library_id" jdbcType="INTEGER" property="libraryId" />
     <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" />
@@ -20,7 +20,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `year`, `title`, `logic`, `no`, `set_id`, `question_no_ids`, `question_number`, 
+    `id`, `year`, `title`, `logic`, `no`, `library_id`, `question_no_ids`, `question_number`, 
     `create_time`, `status`
   </sql>
 </mapper>

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

@@ -8,7 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="no" jdbcType="INTEGER" property="no" />
-    <result column="set_id" jdbcType="INTEGER" property="setId" />
+    <result column="library_id" jdbcType="INTEGER" property="libraryId" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="total_time" jdbcType="INTEGER" property="totalTime" />
@@ -22,7 +22,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title`, `no`, `set_id`, `question_id`, `question_no_id`, `total_time`, `total_number`, 
-    `total_correct`, `is_custom`, `start_time`, `end_time`
+    `id`, `title`, `no`, `library_id`, `question_id`, `question_no_id`, `total_time`, 
+    `total_number`, `total_correct`, `is_custom`, `start_time`, `end_time`
   </sql>
 </mapper>

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

@@ -8,11 +8,13 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="course_no_id" jdbcType="INTEGER" property="courseNoId" />
+    <result column="user_time" jdbcType="INTEGER" property="userTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `course_id`
+    `id`, `user_id`, `course_id`, `course_no_id`, `user_time`
   </sql>
 </mapper>

+ 4 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseRecordMapper.xml

@@ -8,11 +8,14 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="user_time" jdbcType="INTEGER" property="userTime" />
+    <result column="course_no_id" jdbcType="INTEGER" property="courseNoId" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `course_id`
+    `id`, `user_id`, `course_id`, `user_time`, `course_no_id`, `create_time`
   </sql>
 </mapper>

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

@@ -15,6 +15,7 @@
     <result column="user_time" jdbcType="INTEGER" property="userTime" />
     <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="setting" jdbcType="VARCHAR" property="setting" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="detail" jdbcType="VARCHAR" property="detail" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
@@ -23,6 +24,6 @@
       WARNING - @mbg.generated
     -->
     `id`, `user_id`, `report_id`, `question_id`, `question_no_id`, `no`, `time`, `user_time`, 
-    `user_answer`, `is_correct`, `detail`, `create_time`
+    `user_answer`, `is_correct`, `setting`, `detail`, `create_time`
   </sql>
 </mapper>

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

@@ -20,6 +20,7 @@
     <result column="setting" jdbcType="VARCHAR" property="setting" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="score" jdbcType="VARCHAR" property="score" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="detail" jdbcType="VARCHAR" property="detail" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
+    <result column="is_finish" jdbcType="INTEGER" property="isFinish" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
   </resultMap>
@@ -29,6 +30,6 @@
     -->
     `id`, `user_id`, `paper_id`, `paper_module`, `module_id`, `question_no_ids`, `question_number`, 
     `time`, `user_number`, `user_time`, `user_correct`, `finish_time`, `setting`, `score`, 
-    `detail`, `create_time`, `update_time`
+    `detail`, `is_finish`, `create_time`, `update_time`
   </sql>
 </mapper>

+ 21 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserSentenceRecordMapper.xml

@@ -0,0 +1,21 @@
+<?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.UserSentenceRecordMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserSentenceRecord">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="chapter" jdbcType="INTEGER" property="chapter" />
+    <result column="part" jdbcType="INTEGER" property="part" />
+    <result column="user_time" jdbcType="INTEGER" property="userTime" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `user_id`, `chapter`, `part`, `user_time`, `create_time`
+  </sql>
+</mapper>

+ 21 - 0
server/data/src/main/java/com/qxgmat/data/relation/UserCourseRecordRelationMapper.java

@@ -0,0 +1,21 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.dao.entity.UserReport;
+import com.qxgmat.data.relation.entity.UserCourseStatRelation;
+import com.qxgmat.data.relation.entity.UserReportLimitRelation;
+import com.qxgmat.data.relation.entity.UserStudyStatRelation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface UserCourseRecordRelationMapper {
+    List<UserCourseStatRelation> statGroupType(
+            @Param("userId") Integer userId,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
+}

+ 5 - 2
server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java

@@ -34,9 +34,12 @@ public interface UserReportRelationMapper {
             @Param("moduleId") Integer moduleId
     );
 
-    List<UserStudyStatRelation> statByModule(
+    List<UserStudyStatRelation> statGroupModule(
+            @Param("userId") Integer userId
+    );
+
+    List<UserStudyStatRelation> statGroupExerciseType(
             @Param("userId") Integer userId,
-            @Param("module") String module,
             @Param("startTime") String startTime,
             @Param("endTime") String endTime
     );

+ 17 - 0
server/data/src/main/java/com/qxgmat/data/relation/UserSentenceRecordRelationMapper.java

@@ -0,0 +1,17 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.relation.entity.UserSentenceStatRelation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface UserSentenceRecordRelationMapper {
+    List<UserSentenceStatRelation> stat(
+            @Param("userId") Integer userId,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime
+    );
+}

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

@@ -0,0 +1,34 @@
+package com.qxgmat.data.relation.entity;
+
+import javax.persistence.Column;
+
+public class UserCourseStatRelation {
+    /**
+     * 对应模块或题型
+     */
+    @Column(name = "`module`")
+    private String module;
+
+    /**
+     * 用户做题时间
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+
+    public String getModule() {
+        return module;
+    }
+
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+}

+ 38 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserExaminationPaperRelation.java

@@ -0,0 +1,38 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.*;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public class UserExaminationPaperRelation extends UserPaper {
+    private ExaminationPaper paper;
+
+    private UserReport report;
+
+    private User user;
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public UserReport getReport() {
+        return report;
+    }
+
+    public void setReport(UserReport report) {
+        this.report = report;
+    }
+
+    public ExaminationPaper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(ExaminationPaper paper) {
+        this.paper = paper;
+    }
+}

+ 20 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserSentenceStatRelation.java

@@ -0,0 +1,20 @@
+package com.qxgmat.data.relation.entity;
+
+import javax.persistence.Column;
+
+public class UserSentenceStatRelation {
+    /**
+     * 用户做题时间
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+
+}

+ 30 - 3
server/data/src/main/java/com/qxgmat/data/relation/entity/UserStudyStatRelation.java

@@ -3,6 +3,11 @@ package com.qxgmat.data.relation.entity;
 import javax.persistence.Column;
 
 public class UserStudyStatRelation {
+    /**
+     * 对应模块或题型
+     */
+    @Column(name = "`module`")
+    private String module;
 
     /**
      * 用户做题数
@@ -13,8 +18,14 @@ public class UserStudyStatRelation {
     /**
      * 用户做题时间
      */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
+    /**
+     * 用户做题正确数
+     */
     @Column(name = "`user_correct`")
-    private String userTime;
+    private Integer userCorrect;
 
     public Integer getUserNumber() {
         return userNumber;
@@ -24,11 +35,27 @@ public class UserStudyStatRelation {
         this.userNumber = userNumber;
     }
 
-    public String getUserTime() {
+    public Integer getUserTime() {
         return userTime;
     }
 
-    public void setUserTime(String userTime) {
+    public void setUserTime(Integer userTime) {
         this.userTime = userTime;
     }
+
+    public String getModule() {
+        return module;
+    }
+
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    public Integer getUserCorrect() {
+        return userCorrect;
+    }
+
+    public void setUserCorrect(Integer userCorrect) {
+        this.userCorrect = userCorrect;
+    }
 }

+ 42 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCourseRecordRelationMapper.xml

@@ -0,0 +1,42 @@
+<?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.UserReportRelationMapper">
+  <resultMap id="IdMap" type="com.qxgmat.data.dao.entity.UserCourseRecord">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+  </resultMap>
+  <resultMap id="studyMap" type="com.qxgmat.data.relation.entity.UserCourseStatRelation">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="module" jdbcType="VERCHAR" property="module" />
+    <id column="user_time" jdbcType="INTEGER" property="user_time" />
+  </resultMap>
+  <sql id="Id_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    ur.`id`
+  </sql>
+
+  <!--
+    用户听课记录统计,分题型
+  -->
+  <select id="statGroupType" resultMap="studyMap">
+    select
+    sum(ucr.`user_time`) as `user_time`, cc.`question_type` as `module`
+    from `user_course_record` ucr
+      left join `class_course` cc on cc.`id` = ucr.`course_id`
+    where
+    ucr.`user_id` = #{userId,jdbcType=VARCHAR}
+    <if test="startTime != null">
+      and ur.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and ur.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+    group cc.`question_type`
+  </select>
+</mapper>

+ 26 - 8
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml

@@ -18,8 +18,10 @@
     <!--
       WARNING - @mbg.generated
     -->
+    <id column="module" jdbcType="VERCHAR" property="module" />
     <id column="user_number" jdbcType="INTEGER" property="user_number" />
     <id column="user_time" jdbcType="INTEGER" property="user_time" />
+    <id column="user_correct" jdbcType="INTEGER" property="user_correct" />
   </resultMap>
   <sql id="Id_Column_List">
     <!--
@@ -99,19 +101,35 @@
     and `module_id` = #{module_id,jdbcType=INTEGER}
   </select>
 
-
   <!--
-    用户学习记录统计,分学科
+    用户不同模块记录统计,分学科
   -->
-  <select id="statByModule" resultMap="studyMap">
+  <select id="statGroupModule" resultMap="studyMap">
     select
-    sum(`user_number`) as `user_number`, sum(`user_time`) as `user_time`
+    sum(`user_number`) as `user_number`, sum(`user_time`) as `user_time`, sum(`user_correct`) as `user_correct`, `paper_module` as `module`
     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}
+    group `module`
+  </select>
+
+  <!--
+    用户练习模块记录统计,分题型
+  -->
+  <select id="statGroupExerciseType" resultMap="studyMap">
+    select
+    sum(ur.`user_number`) as `user_number`, sum(ur.`user_time`) as `user_time`, sum(ur.`user_correct`) as `user_correct`, ep.`question_type` as `module`
+    from `user_report` ur
+      left join `exercise_paper` ep on ep.`id` = ur.`module_id`
+    where
+    ur.`user_id` = #{userId,jdbcType=VARCHAR}
+    and ur.`paper_module` = 'exercise'
+    <if test="startTime != null">
+      and ur.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and ur.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+    group eq.`question_type`
   </select>
 </mapper>

+ 39 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserSentenceRecordRelationMapper.xml

@@ -0,0 +1,39 @@
+<?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.UserReportRelationMapper">
+  <resultMap id="IdMap" type="com.qxgmat.data.dao.entity.UserSentenceRecord">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+  </resultMap>
+  <resultMap id="studyMap" type="com.qxgmat.data.relation.entity.UserSentenceStatRelation">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="user_time" jdbcType="INTEGER" property="user_time" />
+  </resultMap>
+  <sql id="Id_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    ur.`id`
+  </sql>
+
+  <!--
+    用户阅读记录统计
+  -->
+  <select id="stat" resultMap="studyMap">
+    select
+    sum(usr.`user_time`) as `user_time`
+    from `user_sentence_record` usr
+    where
+    ucr.`user_id` = #{userId,jdbcType=VARCHAR}
+    <if test="startTime != null">
+      and ur.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and ur.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+  </select>
+</mapper>

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

@@ -151,6 +151,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="setting" 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>

+ 7 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java

@@ -7,6 +7,7 @@ import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.AuthException;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
+import com.qxgmat.data.constants.enums.ServiceKey;
 import com.qxgmat.data.dao.entity.User;
 import com.qxgmat.dto.request.*;
 import com.qxgmat.dto.response.MyDto;
@@ -14,6 +15,7 @@ import com.qxgmat.help.CaptchaHelp;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.help.SmsHelp;
 import com.qxgmat.service.UsersService;
+import com.qxgmat.service.inline.UserServiceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,6 +51,9 @@ public class AuthController {
     @Autowired
     private UsersService usersService;
 
+    @Autowired
+    private UserServiceService userServiceService;
+
 
     @RequestMapping(value = "/token", method = RequestMethod.POST)
     @ApiOperation(value = "验证token", httpMethod = "POST")
@@ -79,6 +84,7 @@ public class AuthController {
         if(!entity.getPrepareStatus().isEmpty()){
             dto.setBindPrepare(true);
         }
+        dto.setVip(userServiceService.HasService(entity.getId(), ServiceKey.VIP));
         return ResponseHelp.success(dto);
     }
 
@@ -109,6 +115,7 @@ public class AuthController {
         if(!entity.getPrepareStatus().isEmpty()){
             dto.setBindPrepare(true);
         }
+        dto.setVip(userServiceService.HasService(entity.getId(), ServiceKey.VIP));
         return ResponseHelp.success(dto);
     }
 

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

@@ -102,7 +102,7 @@ public class BaseController {
     }
 
     @RequestMapping(value = "/examination/children", method = RequestMethod.GET)
-    @ApiOperation(value = "所有练习层级", httpMethod = "GET")
+    @ApiOperation(value = "所有模考层级", httpMethod = "GET")
     public Response<List<ExaminationStruct>> examinationChildren(
             @RequestParam(required = true) Integer id,
             @RequestParam(required = false, defaultValue = "false") boolean children,

+ 181 - 15
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -7,14 +7,12 @@ import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.qxgmat.data.constants.enums.QuestionType;
 import com.qxgmat.data.constants.enums.SettingKey;
-import com.qxgmat.data.constants.enums.module.FeedbackModule;
 import com.qxgmat.data.constants.enums.module.PaperModule;
 import com.qxgmat.data.constants.enums.module.QuestionModule;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.entity.*;
-import com.qxgmat.data.relation.entity.UserCollectQuestionRelation;
-import com.qxgmat.data.relation.entity.UserNoteQuestionRelation;
-import com.qxgmat.dto.extend.UserReportExtendDto;
+import com.qxgmat.data.relation.entity.*;
+import com.qxgmat.dto.extend.*;
 import com.qxgmat.dto.request.*;
 import com.qxgmat.dto.request.UserNoteDto;
 import com.qxgmat.dto.response.*;
@@ -60,6 +58,15 @@ public class MyController {
     private ShiroHelp shiroHelp;
 
     @Autowired
+    private ExerciseStructService exerciseStructService;
+
+    @Autowired
+    private ClassCourseService classCourseService;
+
+    @Autowired
+    private ClassCourseNoService classCourseNoService;
+
+    @Autowired
     private UsersService usersService;
 
     @Autowired
@@ -69,7 +76,10 @@ public class MyController {
     private SettingService settingService;
 
     @Autowired
-    private StatDayService statDayService;
+    private UserCourseRecordService userCourseRecordService;
+
+    @Autowired
+    private UserSentenceRecordService userSentenceRecordService;
 
     @Autowired
     private QuestionNoService questionNoService;
@@ -208,20 +218,91 @@ public class MyController {
 
     @RequestMapping(value = "/study", method = RequestMethod.GET)
     @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
-    public Response<JSONObject> studyTime(
+    public Response<UserStudyDayDto> studyTime(
             @RequestParam(required = false) String date
     )  {
         User user = (User) shiroHelp.getLoginUser();
+        Date day;
         try {
-            Date day = DateFormat.getDateInstance().parse(date);
+            day = DateFormat.getDateInstance().parse(date);
         } catch (ParseException e) {
             throw new ParameterException("日期格式错误");
         }
-        UserStudyDetailDto dto = new UserStudyDetailDto();
+        Date endDay = Tools.addDate(day, 1);
+        String startTime = day.toString();
+        String endTime = endDay.toString();
+        UserStudyDayDto dto = new UserStudyDayDto();
+
+        List<ExerciseStruct> p = exerciseStructService.main();
+        Map<String, String> m = new HashMap<>();
+        for (ExerciseStruct struct : p){
+            if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
+            m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
+        }
 
-        // todo 获取学习统计
+        // 获取练习统计 - 按题型进行分组统计
+        Integer exerciseTime = 0;
+        Integer exerciseQuestion = 0;
+        List<UserExerciseExtendDto> exerciseList = new ArrayList<>();
+        List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), startTime, endTime);
+        for(UserStudyStatRelation type:typeList){
+            exerciseTime += type.getUserTime();
+            exerciseQuestion += type.getUserNumber();
+            exerciseList.add(new UserExerciseExtendDto(m.get(type.getModule()), type.getUserNumber(), type.getUserTime(), type.getUserCorrect()));
+        }
+        // todo 练习统计排行
+
+        dto.setExerciseTime(exerciseTime);
+        dto.setExerciseQuestion(exerciseQuestion);
+        dto.setExerciseList(exerciseList);
+
+        // 获取模考统计 - 按卷子
+        Integer examinationTime = 0;
+        Integer examinationPaper = 0;
+        List<UserReport> userReportList = userReportService.getByModule(user.getId(), PaperModule.EXAMINATION, startTime, endTime);
+        Collection paperIds = Transform.getIds(userReportList, UserReport.class, "paperId");
+        List<UserPaper> userPaperList = userPaperService.select(paperIds);
+        Map userPaper = Transform.getMap(userPaperList, UserPaper.class, "id");
+        List<UserPaperBaseExtendDto> examinationPaperList = new ArrayList<>(userReportList.size());
+        for(UserReport report: userReportList){
+            examinationTime += report.getUserTime();
+            examinationPaper += 1;
+            UserPaperBaseExtendDto d = Transform.convert(userPaper.get(report.getPaperId()), UserPaperBaseExtendDto.class);
+            d.setReport(Transform.convert(report, UserReportExtendDto.class));
+            examinationPaperList.add(d);
+        }
+        // todo 模考统计排行
+
+        dto.setExaminationTime(examinationTime);
+        dto.setExaminationPaper(examinationPaper);
+        dto.setExaminationList(examinationPaperList);
+
+        // 获取课程访问记录 - 按课时
+        Integer classTime = 0;
+        Integer classCourse = 0;
+        List<UserCourseRecord> userCourseRecordList = userCourseRecordService.getByTime(user.getId(), startTime, endTime);
+        Collection courseIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "courseId");
+        Collection courseNoIds = Transform.getIds(userCourseRecordList, UserCourseRecord.class, "noId");
+        List<ClassCourse> classCourseList = classCourseService.select(courseIds);
+        Map classCourseMap = Transform.getMap(classCourseList, ClassCourse.class, "id", "title");
+        List<ClassCourseNo> classCourseNoList = classCourseNoService.select(courseNoIds);
+        Map classCourseNoMap = Transform.getMap(classCourseNoList, ClassCourseNo.class, "id", "content");
+        List<UserCourseResultExtendDto> courseResultList = new ArrayList<>(userCourseRecordList.size());
+        for(UserCourseRecord record:userCourseRecordList){
+            classTime += record.getUserTime();
+            classCourse += 1;
+            UserCourseResultExtendDto d = Transform.convert(record, UserCourseResultExtendDto.class);
+            d.setTitle((String)classCourseMap.get(record.getCourseId()));
+            d.setContent((String)classCourseNoMap.get(record.getCourseNoId()));
+            courseResultList.add(d);
+        }
+        // todo 听课统计排行
+
+        dto.setClassTime(classTime);
+        dto.setClassCourse(classCourse);
+        dto.setClassList(courseResultList);
 
-        return ResponseHelp.success(null);
+        return ResponseHelp.success(dto);
     }
 
     @RequestMapping(value = "/study/total", method = RequestMethod.GET)
@@ -232,24 +313,109 @@ public class MyController {
         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, "","");
+        Map<String, Integer> categoryMap = new HashMap<>();
+        // 按模块类型分组查询: module=> sentence, examination, collect+error, 忽略exercise
+        List<UserStudyStatRelation> moduleList = userReportService.statGroupModule(user.getId());
+        for(UserStudyStatRelation module:moduleList){
+            // 练习时间过滤
+            if (module.getModule().equals(PaperModule.EXERCISE.key)){
+                continue;
+            }
+            Integer time = module.getUserTime();
+            String key = module.getModule();
+            totalTime += time;
+            // 收藏及错误组卷合并
+            if (module.getModule().equals(PaperModule.COLLECT.key)
+                    || module.getModule().equals(PaperModule.ERROR.key)){
+                key = "freedom";
+                time += categoryMap.getOrDefault(key, 0);
+            }
+            categoryMap.put(key, time);
+        }
+        // 按题型统计练习
+        List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), null, null);
+        for(UserStudyStatRelation type:typeList){
+            totalTime += type.getUserTime();
+            categoryMap.put(type.getModule(), type.getUserTime());
+        }
+        // 按题型统计课程
+        List<UserCourseStatRelation> recordList = userCourseRecordService.statGroupType(user.getId(), null, null);
+        for (UserCourseStatRelation record : recordList){
+            totalTime += record.getUserTime();
+            // 累加同类型时间
+            Integer time = categoryMap.getOrDefault(record.getModule(), 0);
+            categoryMap.put(record.getModule(), time);
+        }
+        // 获取长难句阅读统计
+        UserSentenceStatRelation sentenceStatRelation = userSentenceRecordService.stat(user.getId(), null, null);
+        if (sentenceStatRelation != null){
+            Integer sentenceTime = categoryMap.getOrDefault(PaperModule.SENTENCE.key, 0);
+            categoryMap.put(PaperModule.SENTENCE.key, sentenceTime + sentenceStatRelation.getUserTime());
+        }
+
+        List<ExerciseStruct> p = exerciseStructService.main();
+        Map<String, String> m = new HashMap<>();
+        for (ExerciseStruct struct : p){
+            if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
+            m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
+        }
+
+        // 组装数据
+        List<UserStudyExtendDto> categorys = new ArrayList<>();
+        if (categoryMap.containsKey(PaperModule.SENTENCE.key)) categorys.add(new UserStudyExtendDto(m.get(PaperModule.SENTENCE.key), categoryMap.get(PaperModule.SENTENCE.key)));
+        if (categoryMap.containsKey(QuestionType.SC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.SC.key), categoryMap.get(QuestionType.SC.key)));
+        if (categoryMap.containsKey(QuestionType.RC.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.RC.key), categoryMap.get(QuestionType.RC.key)));
+        if (categoryMap.containsKey(QuestionType.CR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.CR.key), categoryMap.get(QuestionType.CR.key)));
+        if (categoryMap.containsKey(QuestionType.PS.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.PS.key), categoryMap.get(QuestionType.PS.key)));
+        if (categoryMap.containsKey(QuestionType.DS.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.DS.key), categoryMap.get(QuestionType.DS.key)));
+        if (categoryMap.containsKey(QuestionType.IR.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.IR.key), categoryMap.get(QuestionType.IR.key)));
+        if (categoryMap.containsKey(QuestionType.AWA.key)) categorys.add(new UserStudyExtendDto(m.get(QuestionType.AWA.key), categoryMap.get(QuestionType.AWA.key)));
+        if (categoryMap.containsKey(PaperModule.EXAMINATION.key)) categorys.add(new UserStudyExtendDto("模考", categoryMap.get(PaperModule.EXAMINATION.key)));
+        if (categoryMap.containsKey("freedom")) categorys.add(new UserStudyExtendDto("自由组卷", categoryMap.get("freedom")));
 
         dto.setTime(totalTime);
+        dto.setCategorys(categorys);
         return ResponseHelp.success(dto);
     }
 
     @RequestMapping(value = "/data", method = RequestMethod.GET)
     @ApiOperation(value = "获取做题数据", notes = "获取做题数据", httpMethod = "GET")
-    public Response<JSONObject> questionData(
+    public Response<UserStudyDayDto> questionData(
             @RequestParam(required = false) String startTime,
             @RequestParam(required = false) String endTime
     )  {
         User user = (User) shiroHelp.getLoginUser();
+        UserStudyDayDto dto = new UserStudyDayDto();
 
-        // todo 获取学习统计 - 按题型进行分组统计
+        List<ExerciseStruct> p = exerciseStructService.main();
+        Map<String, String> m = new HashMap<>();
+        for (ExerciseStruct struct : p){
+            if (struct.getExtend() == null || struct.getExtend().isEmpty()) continue;
+            m.put(struct.getExtend(), struct.getTitleZh() + (struct.getTitleEn().isEmpty() ? "":" "+struct.getTitleEn()));
+        }
+
+        // 获取练习统计 - 按题型进行分组统计
+        Integer exerciseTime = 0;
+        Integer exerciseQuestion = 0;
+        List<UserExerciseExtendDto> exerciseList = new ArrayList<>();
+        List<UserStudyStatRelation> typeList = userReportService.statGroupExerciseType(user.getId(), startTime, endTime);
+        for(UserStudyStatRelation type:typeList){
+            exerciseTime += type.getUserTime();
+            exerciseQuestion += type.getUserNumber();
+            exerciseList.add(new UserExerciseExtendDto(m.get(type.getModule()), type.getUserNumber(), type.getUserTime(), type.getUserCorrect()));
+        }
+
+        dto.setExerciseTime(exerciseTime);
+        dto.setExerciseQuestion(exerciseQuestion);
+        dto.setExerciseList(exerciseList);
 
-        return ResponseHelp.success(null);
+        // 获取模考统计 - 按卷子
+
+        // 获取课程访问记录 - 按课时
+        Integer classTime = 0;
+        Integer classCourse = 0;
+
+        return ResponseHelp.success(dto);
     }
 
     @RequestMapping(value = "/collect", method = RequestMethod.PUT)

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

@@ -352,7 +352,7 @@ public class QuestionController {
     @ApiOperation(value = "提交题目答案", notes = "提交题目", httpMethod = "POST")
     public Response<Boolean> submit(@RequestBody @Validated QuestionSubmitDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
-        Boolean result = questionFlowService.submit(user.getId(), dto.getUserQuestionId(), dto.getTime(), dto.getAnswer());
+        Boolean result = questionFlowService.submit(user.getId(), dto.getUserQuestionId(), dto.getTime(), dto.getAnswer(), dto.getSetting());
         return ResponseHelp.success(result);
     }
 

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

@@ -143,6 +143,7 @@ public class SentenceController
 
         // 获取本章节的最大part数
         Integer max = sentenceArticleService.maxPart(dto.getChapter());
+        // todo 添加阅读记录
 
         userSentenceProcessService.updateProcess(user.getId(), dto.getChapter(), dto.getPart(), dto.getProcess(), max);
         return ResponseHelp.success(true);
@@ -278,7 +279,7 @@ public class SentenceController
     @ApiOperation(value = "提交题目答案", notes = "提交题目", httpMethod = "POST")
     public Response<Boolean> submit(@RequestBody @Validated QuestionSubmitDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
-        Boolean result = questionFlowService.submit(user.getId(), dto.getUserQuestionId(), dto.getTime(), dto.getAnswer());
+        Boolean result = questionFlowService.submit(user.getId(), dto.getUserQuestionId(), dto.getTime(), dto.getAnswer(), dto.getSetting());
         return ResponseHelp.success(result);
     }
 

+ 50 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserCourseResultExtendDto.java

@@ -0,0 +1,50 @@
+package com.qxgmat.dto.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserCourseRecord;
+import com.qxgmat.data.dao.entity.UserNoteQuestion;
+
+import java.util.Date;
+
+@Dto(entity = UserCourseRecord.class)
+public class UserCourseResultExtendDto {
+    private String title;
+
+    private String content;
+
+    private Integer userTime;
+
+    private Date createTime;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+}

+ 50 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserExerciseExtendDto.java

@@ -0,0 +1,50 @@
+package com.qxgmat.dto.extend;
+
+public class UserExerciseExtendDto {
+    private String title;
+
+    private Integer number;
+
+    private Integer time;
+
+    private Integer correct;
+
+    public UserExerciseExtendDto(String title, Integer number, Integer time, Integer correct) {
+        this.title = title;
+        this.number = number;
+        this.time = time;
+        this.correct = correct;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public Integer getTime() {
+        return time;
+    }
+
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+
+    public Integer getCorrect() {
+        return correct;
+    }
+
+    public void setCorrect(Integer correct) {
+        this.correct = correct;
+    }
+}

+ 10 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperBaseExtendDto.java

@@ -13,6 +13,8 @@ public class UserPaperBaseExtendDto {
 
     private String title;
 
+    private UserReportExtendDto report;
+
     public Integer getId() {
         return id;
     }
@@ -36,4 +38,12 @@ public class UserPaperBaseExtendDto {
     public void setTimes(Integer times) {
         this.times = times;
     }
+
+    public UserReportExtendDto getReport() {
+        return report;
+    }
+
+    public void setReport(UserReportExtendDto report) {
+        this.report = report;
+    }
 }

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

@@ -1,5 +1,6 @@
 package com.qxgmat.dto.extend;
 
+import com.alibaba.fastjson.JSONObject;
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserReport;
@@ -25,6 +26,8 @@ public class UserReportExtendDto {
 
     private Date updateTime;
 
+    private JSONObject score;
+
     public Integer getId() {
         return id;
     }
@@ -88,4 +91,12 @@ public class UserReportExtendDto {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public JSONObject getScore() {
+        return score;
+    }
+
+    public void setScore(JSONObject score) {
+        this.score = score;
+    }
 }

+ 28 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserStudyExtendDto.java

@@ -0,0 +1,28 @@
+package com.qxgmat.dto.extend;
+
+public class UserStudyExtendDto {
+    private String title;
+
+    private Integer time;
+
+    public UserStudyExtendDto(String title, Integer time) {
+        this.title = title;
+        this.time = time;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getTime() {
+        return time;
+    }
+
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+}

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

@@ -9,6 +9,8 @@ public class QuestionSubmitDto {
 
     private JSONObject answer;
 
+    private JSONObject setting;
+
     public Integer getUserQuestionId() {
         return userQuestionId;
     }
@@ -32,4 +34,12 @@ public class QuestionSubmitDto {
     public void setTime(Integer time) {
         this.time = time;
     }
+
+    public JSONObject getSetting() {
+        return setting;
+    }
+
+    public void setSetting(JSONObject setting) {
+        this.setting = setting;
+    }
 }

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

@@ -12,6 +12,8 @@ public class UserSentenceProcessDto {
 
     private Integer process;
 
+    private Integer time;
+
     public Integer getChapter() {
         return chapter;
     }
@@ -35,4 +37,12 @@ public class UserSentenceProcessDto {
     public void setProcess(Integer process) {
         this.process = process;
     }
+
+    public Integer getTime() {
+        return time;
+    }
+
+    public void setTime(Integer time) {
+        this.time = time;
+    }
 }

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

@@ -28,6 +28,8 @@ public class MyDto extends UserDto {
 
     private Integer latestExercise;
 
+    private Boolean vip;
+
     @ApiModelProperty(value = "未读消息数", required = true)
     private int messageNum;
 
@@ -120,4 +122,12 @@ public class MyDto extends UserDto {
     public void setLatestExercise(Integer latestExercise) {
         this.latestExercise = latestExercise;
     }
+
+    public Boolean getVip() {
+        return vip;
+    }
+
+    public void setVip(Boolean vip) {
+        this.vip = vip;
+    }
 }

+ 129 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserStudyDayDto.java

@@ -0,0 +1,129 @@
+package com.qxgmat.dto.response;
+
+import com.qxgmat.dto.extend.UserCourseResultExtendDto;
+import com.qxgmat.dto.extend.UserExerciseExtendDto;
+import com.qxgmat.dto.extend.UserPaperBaseExtendDto;
+
+import java.util.List;
+
+public class UserStudyDayDto {
+    private Integer exerciseTime;
+
+    private Integer exerciseQuestion;
+
+    private Integer exerciseExceed;
+
+    private List<UserExerciseExtendDto> exerciseList;
+
+    private Integer examinationTime;
+
+    private Integer examinationPaper;
+
+    private Integer examinationExceed;
+
+    private List<UserPaperBaseExtendDto> examinationList;
+
+    private Integer classTime;
+
+    private Integer classCourse;
+
+    private Integer classExceed;
+
+    private List<UserCourseResultExtendDto> classList;
+
+    public Integer getExerciseTime() {
+        return exerciseTime;
+    }
+
+    public void setExerciseTime(Integer exerciseTime) {
+        this.exerciseTime = exerciseTime;
+    }
+
+    public Integer getExerciseQuestion() {
+        return exerciseQuestion;
+    }
+
+    public void setExerciseQuestion(Integer exerciseQuestion) {
+        this.exerciseQuestion = exerciseQuestion;
+    }
+
+    public Integer getExerciseExceed() {
+        return exerciseExceed;
+    }
+
+    public void setExerciseExceed(Integer exerciseExceed) {
+        this.exerciseExceed = exerciseExceed;
+    }
+
+    public List<UserExerciseExtendDto> getExerciseList() {
+        return exerciseList;
+    }
+
+    public void setExerciseList(List<UserExerciseExtendDto> exerciseList) {
+        this.exerciseList = exerciseList;
+    }
+
+    public Integer getExaminationTime() {
+        return examinationTime;
+    }
+
+    public void setExaminationTime(Integer examinationTime) {
+        this.examinationTime = examinationTime;
+    }
+
+    public Integer getExaminationPaper() {
+        return examinationPaper;
+    }
+
+    public void setExaminationPaper(Integer examinationPaper) {
+        this.examinationPaper = examinationPaper;
+    }
+
+    public Integer getExaminationExceed() {
+        return examinationExceed;
+    }
+
+    public void setExaminationExceed(Integer examinationExceed) {
+        this.examinationExceed = examinationExceed;
+    }
+
+    public List<UserPaperBaseExtendDto> getExaminationList() {
+        return examinationList;
+    }
+
+    public void setExaminationList(List<UserPaperBaseExtendDto> examinationList) {
+        this.examinationList = examinationList;
+    }
+
+    public Integer getClassTime() {
+        return classTime;
+    }
+
+    public void setClassTime(Integer classTime) {
+        this.classTime = classTime;
+    }
+
+    public Integer getClassCourse() {
+        return classCourse;
+    }
+
+    public void setClassCourse(Integer classCourse) {
+        this.classCourse = classCourse;
+    }
+
+    public Integer getClassExceed() {
+        return classExceed;
+    }
+
+    public void setClassExceed(Integer classExceed) {
+        this.classExceed = classExceed;
+    }
+
+    public List<UserCourseResultExtendDto> getClassList() {
+        return classList;
+    }
+
+    public void setClassList(List<UserCourseResultExtendDto> classList) {
+        this.classList = classList;
+    }
+}

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

@@ -1,6 +1,9 @@
 package com.qxgmat.dto.response;
 
+import com.qxgmat.dto.extend.UserStudyExtendDto;
+
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 public class UserStudyDetailDto {
@@ -13,11 +16,8 @@ public class UserStudyDetailDto {
     // 注册时间
     private Date createTime;
 
-    // 练习分学科时长
-    private Map<Integer, Integer> categoryMap;
-
-    // 模考时长
-    private Integer examinationTime;
+    // 各部分时长
+    private List<UserStudyExtendDto> categorys;
 
     public Integer getDays() {
         return days;
@@ -43,21 +43,11 @@ public class UserStudyDetailDto {
         this.createTime = createTime;
     }
 
-    public Map<Integer, Integer> getCategoryMap() {
-        return categoryMap;
-    }
-
-    public void setCategoryMap(Map<Integer, Integer> categoryMap) {
-        this.categoryMap = categoryMap;
+    public List<UserStudyExtendDto> getCategorys() {
+        return categorys;
     }
 
-    public Integer getExaminationTime() {
-        return examinationTime;
+    public void setCategorys(List<UserStudyExtendDto> categorys) {
+        this.categorys = categorys;
     }
-
-    public void setExaminationTime(Integer examinationTime) {
-        this.examinationTime = examinationTime;
-    }
-
-    //
 }

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

@@ -483,13 +483,14 @@ public class QuestionFlowService {
      * @return
      */
     @Transactional
-    public Boolean submit(Integer userId, Integer userQuestionId, Integer time, JSONObject answer){
+    public Boolean submit(Integer userId, Integer userQuestionId, Integer time, JSONObject answer, JSONObject setting){
         UserQuestion userQuestion = userQuestionService.get(userQuestionId);
         if (!userQuestion.getUserId().equals(userId)){
             throw new ParameterException("题目不存在");
         }
         userQuestion.setTime(time);
         userQuestion.setUserAnswer(answer);
+        userQuestion.setSetting(setting);
 
         UserReport userReport = userReportService.get(userQuestion.getReportId());
 
@@ -531,6 +532,7 @@ public class QuestionFlowService {
             throw new ParameterException("做题结束");
         }
         userReport.setFinishTime(new Date());
+        userReport.setIsFinish(1);
         List<UserQuestion> userQuestionList = userQuestionService.listByReport(userId, userReportId);
         // 分析做题结果
         StatReport callback = finishCallback.get(PaperModule.ValueOf(userReport.getPaperModule()));
@@ -1098,9 +1100,9 @@ public class QuestionFlowService {
             Integer difficultScore = QuestionDifficult.GetScore(questionDifficult);
 
             if (userQuestion.getIsCorrect() > 0){
-                typeInfo.put("diffCorrect", typeInfo.getFloatValue("diffCorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), difficultScore));
+                typeInfo.put("diffCorrect", typeInfo.getFloatValue("diffCorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), questionDifficult));
             }else{
-                typeInfo.put("diffIncorrect", typeInfo.getFloatValue("diffIncorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), difficultScore));
+                typeInfo.put("diffIncorrect", typeInfo.getFloatValue("diffIncorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), questionDifficult));
             }
 
             subjectInfo.put("difficultScore", subjectInfo.getIntValue("difficultScore")+difficultScore);

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

@@ -2,6 +2,7 @@ package com.qxgmat.service.extend;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.qxgmat.data.constants.enums.QuestionDifficult;
 import com.qxgmat.data.constants.enums.QuestionSubject;
 import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.dao.entity.*;
@@ -252,25 +253,28 @@ public class ToolsService {
     }
 
     /**
-     * avg diff correct=[(550*0.3+550*0.5+550*0.4)+(650*0.6+650*0.8)+(750*0.9)]➗(3+2+1)
+     * avg diff correct= [500 + 10*(1-0.7)+500+10*(1-0.6)+500+10*(1-0.5)
+     * +600+10*(1-0.4)+600+10*(1-0.7)+700+10*(1-0.1)+700+10*(1-0.9)] / (3+2+2)
      * @param totalNumber
      * @param totalCorrect
-     * @param difficultScore
+     * @param questionDifficult
      * @return
      */
-    public float diffScore(Integer totalNumber, Integer totalCorrect, Integer difficultScore){
+    public float diffScore(Integer totalNumber, Integer totalCorrect, QuestionDifficult questionDifficult){
         Setting setting = settingService.getByKey(SettingKey.EXAMINATION_SCORE);
         JSONObject value = setting.getValue();
         if (value.getBooleanValue("difficult")){
-            return difficultScore * (1- (float)totalCorrect / totalNumber);
+            Integer difficultScore = QuestionDifficult.GetScore(questionDifficult);
+            return difficultScore + 10 * (1 - (float)totalCorrect / totalNumber);
         }else{
-            return difficultScore;
+            return QuestionDifficult.GetScoreBase(questionDifficult);
         }
     }
 
     /**
      * 当这个结果低于500的时候统一显示为500,
      * 高于500时,是多少就显示多少,且必须为10的倍数,722=720,754=750,756=760
+     * 四舍五入
      * @param totalDiffScore
      * @param number
      * @return
@@ -280,7 +284,7 @@ public class ToolsService {
         if (avg < 500){
             return 500;
         }
-        return (int) (Math.floor((int)(avg / 10)) * 10);
+        return (int) (Math.round((int)(avg / 10)) * 10);
     }
 
     /**

+ 71 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/ClassCourseNoService.java

@@ -0,0 +1,71 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.dao.ClassCourseMapper;
+import com.qxgmat.data.dao.ClassCourseNoMapper;
+import com.qxgmat.data.dao.entity.ClassCourse;
+import com.qxgmat.data.dao.entity.ClassCourseNo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class ClassCourseNoService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(ClassCourseNoService.class);
+
+    @Resource
+    private ClassCourseNoMapper classCourseNoMapper;
+
+    public ClassCourseNo add(ClassCourseNo course){
+        int result = insert(classCourseNoMapper, course);
+        course = one(classCourseNoMapper, course.getId());
+        if(course == null){
+            throw new SystemException("课时添加失败");
+        }
+        return course;
+    }
+
+    public ClassCourseNo edit(ClassCourseNo course){
+        ClassCourseNo in = one(classCourseNoMapper, course.getId());
+        if(in == null){
+            throw new ParameterException("课时不存在");
+        }
+        int result = update(classCourseNoMapper, course);
+        return course;
+    }
+
+    public boolean delete(Number id){
+        ClassCourseNo in = one(classCourseNoMapper, id);
+        if(in == null){
+            throw new ParameterException("课时不存在");
+        }
+        int result = delete(classCourseNoMapper, id);
+        return result > 0;
+    }
+
+    public ClassCourseNo get(Number id){
+        ClassCourseNo in = one(classCourseNoMapper, id);
+
+        if(in == null){
+            throw new ParameterException("课时不存在");
+        }
+        return in;
+    }
+
+    public Page<ClassCourseNo> select(int page, int pageSize){
+        return select(classCourseNoMapper, page, pageSize);
+    }
+
+    public List<ClassCourseNo> select(Collection ids){
+        return select(classCourseNoMapper, ids);
+    }
+
+}

+ 0 - 68
server/gateway-api/src/main/java/com/qxgmat/service/inline/StatDayService.java

@@ -1,68 +0,0 @@
-package com.qxgmat.service.inline;
-
-import com.github.pagehelper.Page;
-import com.nuliji.tools.AbstractService;
-import com.nuliji.tools.exception.ParameterException;
-import com.nuliji.tools.exception.SystemException;
-import com.nuliji.tools.mybatis.Example;
-import com.qxgmat.data.dao.StatDayMapper;
-import com.qxgmat.data.dao.entity.StatDay;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
-
-@Service
-public class StatDayService extends AbstractService {
-    private static final Logger logger = LoggerFactory.getLogger(SettingService.class);
-
-    @Resource
-    private StatDayMapper statDayMapper;
-
-    public StatDay add(StatDay day){
-        int result = insert(statDayMapper, day);
-        day = one(statDayMapper, day.getId());
-        if(day == null){
-            throw new SystemException("统计添加失败");
-        }
-        return day;
-    }
-
-    public StatDay edit(StatDay setting){
-        StatDay in = one(statDayMapper, setting.getId());
-        if(in == null){
-            throw new ParameterException("统计不存在");
-        }
-        int result = update(statDayMapper, setting);
-        return setting;
-    }
-
-    public boolean delete(Number id){
-        StatDay in = one(statDayMapper, id);
-        if(in == null){
-            throw new ParameterException("统计不存在");
-        }
-        int result = delete(statDayMapper, id);
-        return result > 0;
-    }
-
-    public StatDay get(Number id){
-        StatDay in = one(statDayMapper, id);
-
-        if(in == null){
-            throw new ParameterException("统计不存在");
-        }
-        return in;
-    }
-
-    public Page<StatDay> select(int page, int pageSize){
-        return select(statDayMapper, page, pageSize);
-    }
-
-    public List<StatDay> select(Collection ids){
-        return select(statDayMapper, ids);
-    }
-}

+ 0 - 8
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAskQuestionService.java

@@ -94,14 +94,6 @@ public class UserAskQuestionService extends AbstractService {
         }
     }
 
-//    @Transactional
-//    public void order(Number id, Integer order){
-//        UserAskQuestion entity = get(id);
-//        adjust(entity.getQuestionId(), entity.getOrder(), ">", "-=");
-//        adjust(entity.getQuestionId(), order, ">=", "+=");
-//        entity.setOrder(order);
-//    }
-
     public UserAskQuestion add(UserAskQuestion message){
         int result = insert(userAskQuestionMapper, message);
         message = one(userAskQuestionMapper, message.getId());

+ 102 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseRecordService.java

@@ -0,0 +1,102 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.dao.UserCourseRecordMapper;
+import com.qxgmat.data.dao.entity.UserCourseRecord;
+import com.qxgmat.data.relation.UserCourseRecordRelationMapper;
+import com.qxgmat.data.relation.entity.UserCourseStatRelation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class UserCourseRecordService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserCourseRecordService.class);
+
+    @Resource
+    private UserCourseRecordMapper userCourseRecordMapper;
+
+    @Resource
+    private UserCourseRecordRelationMapper userCourseRecordRelationMapper;
+
+
+    /**
+     * 获取指定时间内的听课记录
+     * @param userId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public List<UserCourseRecord> getByTime(Integer userId, String startTime, String endTime){
+        Example example = new Example(UserCourseRecord.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("userId", userId)
+                        .andGreaterThanOrEqualTo("createTime", startTime)
+                        .andLessThan("createTime", endTime)
+        );
+        return select(userCourseRecordMapper, example);
+    }
+    /**
+     * 统计不同题型用户的听课记录
+     * @param userId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public List<UserCourseStatRelation> statGroupType(Integer userId, String startTime, String endTime){
+        return userCourseRecordRelationMapper.statGroupType(userId, startTime, endTime);
+    }
+
+    public UserCourseRecord add(UserCourseRecord record){
+        int result = insert(userCourseRecordMapper, record);
+        record = one(userCourseRecordMapper, record.getId());
+        if(record == null){
+            throw new SystemException("统计添加失败");
+        }
+        return record;
+    }
+
+    public UserCourseRecord edit(UserCourseRecord record){
+        UserCourseRecord in = one(userCourseRecordMapper, record.getId());
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = update(userCourseRecordMapper, record);
+        return record;
+    }
+
+    public boolean delete(Number id){
+        UserCourseRecord in = one(userCourseRecordMapper, id);
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = delete(userCourseRecordMapper, id);
+        return result > 0;
+    }
+
+    public UserCourseRecord get(Number id){
+        UserCourseRecord in = one(userCourseRecordMapper, id);
+
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        return in;
+    }
+
+    public Page<UserCourseRecord> select(int page, int pageSize){
+        return select(userCourseRecordMapper, page, pageSize);
+    }
+
+    public List<UserCourseRecord> select(Collection ids){
+        return select(userCourseRecordMapper, ids);
+    }
+}

+ 67 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCourseService.java

@@ -0,0 +1,67 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.qxgmat.data.dao.UserCourseMapper;
+import com.qxgmat.data.dao.entity.UserCourse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class UserCourseService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserCourseService.class);
+
+    @Resource
+    private UserCourseMapper userCourseMapper;
+
+    public UserCourse add(UserCourse userCourse){
+        int result = insert(userCourseMapper, userCourse);
+        userCourse = one(userCourseMapper, userCourse.getId());
+        if(userCourse == null){
+            throw new SystemException("统计添加失败");
+        }
+        return userCourse;
+    }
+
+    public UserCourse edit(UserCourse userCourse){
+        UserCourse in = one(userCourseMapper, userCourse.getId());
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = update(userCourseMapper, userCourse);
+        return userCourse;
+    }
+
+    public boolean delete(Number id){
+        UserCourse in = one(userCourseMapper, id);
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = delete(userCourseMapper, id);
+        return result > 0;
+    }
+
+    public UserCourse get(Number id){
+        UserCourse in = one(userCourseMapper, id);
+
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        return in;
+    }
+
+    public Page<UserCourse> select(int page, int pageSize){
+        return select(userCourseMapper, page, pageSize);
+    }
+
+    public List<UserCourse> select(Collection ids){
+        return select(userCourseMapper, ids);
+    }
+}

+ 32 - 9
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java

@@ -6,6 +6,7 @@ import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.constants.enums.module.PaperModule;
 import com.qxgmat.data.dao.UserReportMapper;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserQuestion;
@@ -75,20 +76,42 @@ public class UserReportService extends AbstractService {
     }
 
     /**
-     * 按report统计用户的做题记录
+     * 获取指定时间内的模块做题记录
      * @param userId
-     * @param module
+     * @param paperModule
      * @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();
-        }
+    public List<UserReport> getByModule(Integer userId, PaperModule paperModule, String startTime, String endTime){
+        Example example = new Example(UserReport.class);
+        example.and(
+                example.createCriteria()
+                .andEqualTo("userId", userId)
+                .andEqualTo("paperModule", paperModule.key)
+                        // todo createTime or finishTime
+                .andGreaterThanOrEqualTo("createTime", startTime)
+                .andLessThan("createTime", endTime)
+        );
+        return select(userReportMapper, example);
+    }
+
+    /**
+     * 按report统计不同模块用户的做题记录
+     * @param userId
+     * @return
+     */
+    public List<UserStudyStatRelation> statGroupModule(Integer userId){
+       return userReportRelationMapper.statGroupModule(userId);
+    }
+
+    /**
+     * 按report统计练习模块不同题型用户的做题记录
+     * @param userId
+     * @return
+     */
+    public List<UserStudyStatRelation> statGroupExerciseType(Integer userId, String startTime, String endTime){
+        return userReportRelationMapper.statGroupExerciseType(userId, startTime, endTime);
     }
 
     /**

+ 109 - 0
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserSentenceRecordService.java

@@ -0,0 +1,109 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.dao.UserCourseRecordMapper;
+import com.qxgmat.data.dao.UserSentenceRecordMapper;
+import com.qxgmat.data.dao.entity.UserCourseRecord;
+import com.qxgmat.data.dao.entity.UserSentenceRecord;
+import com.qxgmat.data.relation.UserCourseRecordRelationMapper;
+import com.qxgmat.data.relation.UserSentenceRecordRelationMapper;
+import com.qxgmat.data.relation.entity.UserCourseStatRelation;
+import com.qxgmat.data.relation.entity.UserSentenceStatRelation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class UserSentenceRecordService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserSentenceRecordService.class);
+
+    @Resource
+    private UserSentenceRecordMapper userSentenceRecordMapper;
+
+    @Resource
+    private UserSentenceRecordRelationMapper userSentenceRecordRelationMapper;
+
+    /**
+     * 统计用户的阅读记录
+     * @param userId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public UserSentenceStatRelation stat(Integer userId, String startTime, String endTime){
+        List<UserSentenceStatRelation> list = userSentenceRecordRelationMapper.stat(userId, startTime, endTime);
+        if (list!=null && list.size() > 0){
+            return list.get(1);
+        }
+        return null;
+    }
+    /**
+     * 获取指定时间内的阅读记录
+     * @param userId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public List<UserSentenceRecord> getByTime(Integer userId, String startTime, String endTime){
+        Example example = new Example(UserCourseRecord.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("userId", userId)
+                        .andGreaterThanOrEqualTo("createTime", startTime)
+                        .andLessThan("createTime", endTime)
+        );
+        return select(userSentenceRecordMapper, example);
+    }
+
+    public UserSentenceRecord add(UserSentenceRecord record){
+        int result = insert(userSentenceRecordMapper, record);
+        record = one(userSentenceRecordMapper, record.getId());
+        if(record == null){
+            throw new SystemException("统计添加失败");
+        }
+        return record;
+    }
+
+    public UserSentenceRecord edit(UserSentenceRecord record){
+        UserSentenceRecord in = one(userSentenceRecordMapper, record.getId());
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = update(userSentenceRecordMapper, record);
+        return record;
+    }
+
+    public boolean delete(Number id){
+        UserSentenceRecord in = one(userSentenceRecordMapper, id);
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        int result = delete(userSentenceRecordMapper, id);
+        return result > 0;
+    }
+
+    public UserSentenceRecord get(Number id){
+        UserSentenceRecord in = one(userSentenceRecordMapper, id);
+
+        if(in == null){
+            throw new ParameterException("统计不存在");
+        }
+        return in;
+    }
+
+    public Page<UserSentenceRecord> select(int page, int pageSize){
+        return select(userSentenceRecordMapper, page, pageSize);
+    }
+
+    public List<UserSentenceRecord> select(Collection ids){
+        return select(userSentenceRecordMapper, ids);
+    }
+}