Browse Source

feat(server): 添加前端接口

Go 5 years ago
parent
commit
ad444efc2b
45 changed files with 1105 additions and 294 deletions
  1. 5 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/QuestionType.java
  2. 1 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/PaperModule.java
  3. 1 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/QuestionModule.java
  4. 1 0
      server/data/src/main/java/com/qxgmat/data/constants/enums/module/ReportModule.java
  5. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/ExercisePaperQuestionMapper.java
  6. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/ExerciseQuestionMapper.java
  7. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/UserCollectMapper.java
  8. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserCollectQuestionMapper.java
  9. 6 6
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseQuestion.java
  10. 6 6
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCollect.java
  11. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExerciseQuestionMapper.xml
  12. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCollectMapper.xml
  13. 3 3
      server/data/src/main/java/com/qxgmat/data/relation/ExerciseQuestionRelationMapper.java
  14. 23 0
      server/data/src/main/java/com/qxgmat/data/relation/UserCollectQuestionRelationMapper.java
  15. 23 0
      server/data/src/main/java/com/qxgmat/data/relation/UserNoteRelationMapper.java
  16. 4 0
      server/data/src/main/java/com/qxgmat/data/relation/UserPaperRelationMapper.java
  17. 39 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserCollectQuestionRelation.java
  18. 39 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserNoteRelation.java
  19. 4 4
      server/data/src/main/java/com/qxgmat/data/relation/mapping/ExerciseQuestionRelationMapper.xml
  20. 1 1
      server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionNoRelationMapper.xml
  21. 48 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCollectQuestionRelationMapper.xml
  22. 60 9
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml
  23. 4 5
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/ExerciseController.java
  24. 3 11
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserPreviewController.java
  25. 63 45
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  26. 48 29
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  27. 1 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java
  28. 56 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionExtendDto.java
  29. 71 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionNoExtendDto.java
  30. 2 2
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserCollectDto.java
  31. 9 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserClassDetailDto.java
  32. 71 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserCollectQuestionDto.java
  33. 61 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserNoteDto.java
  34. 43 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserPaperDto.java
  35. 19 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionListDto.java
  36. 56 15
      server/gateway-api/src/main/java/com/qxgmat/service/HomeworkPreviewService.java
  37. 162 0
      server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java
  38. 63 4
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserNoteService.java
  39. 11 4
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserPaperService.java
  40. 12 14
      server/gateway-api/src/main/java/com/qxgmat/service/inline/ExerciseQuestionService.java
  41. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserClassService.java
  42. 0 113
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCollectService.java
  43. 12 2
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserQuestionService.java
  44. 30 2
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java
  45. 25 0
      server/tools/src/main/java/com/nuliji/tools/PageResult.java

+ 5 - 0
server/data/src/main/java/com/qxgmat/data/constants/enums/QuestionType.java

@@ -13,4 +13,9 @@ public enum QuestionType {
         this.key = key;
         this.title = title;
     }
+
+    public static QuestionType ValueOf(String name){
+        if (name == null) return null;
+        return QuestionType.valueOf(name.toUpperCase());
+    }
 }

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

@@ -8,6 +8,7 @@ public enum PaperModule {
     }
 
     public static PaperModule ValueOf(String name){
+        if (name == null) return null;
         return PaperModule.valueOf(name.toUpperCase());
     }
 }

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

@@ -8,6 +8,7 @@ public enum QuestionModule {
     }
 
     public static QuestionModule ValueOf(String name){
+        if (name == null) return null;
         return QuestionModule.valueOf(name.toUpperCase());
     }
 }

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

@@ -8,6 +8,7 @@ public enum ReportModule {
     }
 
     public static ReportModule ValueOf(String name){
+        if (name == null) return null;
         return ReportModule.valueOf(name.toUpperCase());
     }
 }

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

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

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

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

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

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

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

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

+ 6 - 6
server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseQuestion.java

@@ -4,7 +4,7 @@ import java.io.Serializable;
 import javax.persistence.*;
 
 @Table(name = "exercise_question")
-public class ExerciseQuestion implements Serializable {
+public class ExercisePaperQuestion implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -112,15 +112,15 @@ public class ExerciseQuestion implements Serializable {
         return sb.toString();
     }
 
-    public static ExerciseQuestion.Builder builder() {
-        return new ExerciseQuestion.Builder();
+    public static ExercisePaperQuestion.Builder builder() {
+        return new ExercisePaperQuestion.Builder();
     }
 
     public static class Builder {
-        private ExerciseQuestion obj;
+        private ExercisePaperQuestion obj;
 
         public Builder() {
-            this.obj = new ExerciseQuestion();
+            this.obj = new ExercisePaperQuestion();
         }
 
         /**
@@ -161,7 +161,7 @@ public class ExerciseQuestion implements Serializable {
             return this;
         }
 
-        public ExerciseQuestion build() {
+        public ExercisePaperQuestion build() {
             return this.obj;
         }
     }

+ 6 - 6
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCollect.java

@@ -5,7 +5,7 @@ import java.util.Date;
 import javax.persistence.*;
 
 @Table(name = "user_collect")
-public class UserCollect implements Serializable {
+public class UserCollectQuestion implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -131,15 +131,15 @@ public class UserCollect implements Serializable {
         return sb.toString();
     }
 
-    public static UserCollect.Builder builder() {
-        return new UserCollect.Builder();
+    public static UserCollectQuestion.Builder builder() {
+        return new UserCollectQuestion.Builder();
     }
 
     public static class Builder {
-        private UserCollect obj;
+        private UserCollectQuestion obj;
 
         public Builder() {
-            this.obj = new UserCollect();
+            this.obj = new UserCollectQuestion();
         }
 
         /**
@@ -188,7 +188,7 @@ public class UserCollect implements Serializable {
             return this;
         }
 
-        public UserCollect build() {
+        public UserCollectQuestion build() {
             return this.obj;
         }
     }

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

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.qxgmat.data.dao.ExerciseQuestionMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExerciseQuestion">
+<mapper namespace="com.qxgmat.data.dao.ExercisePaperQuestionMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExercisePaperQuestion">
     <!--
       WARNING - @mbg.generated
     -->

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

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.qxgmat.data.dao.UserCollectMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserCollect">
+<mapper namespace="com.qxgmat.data.dao.UserCollectQuestionMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserCollectQuestion">
     <!--
       WARNING - @mbg.generated
     -->

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

@@ -1,6 +1,6 @@
 package com.qxgmat.data.relation;
 
-import com.qxgmat.data.dao.entity.ExerciseQuestion;
+import com.qxgmat.data.dao.entity.ExercisePaperQuestion;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -9,9 +9,9 @@ import java.util.List;
  * Created by gaojie on 2017/11/9.
  */
 public interface ExerciseQuestionRelationMapper {
-    List<ExerciseQuestion> listAdmin(
+    List<ExercisePaperQuestion> listAdmin(
             @Param("structId") Number structId,
-            @Param("questionNo") Number questionNo,
+            @Param("questionNoId") Number questionNoId,
             @Param("paperId") Number paperId,
             @Param("place") String place,
             @Param("difficult") String difficult,

+ 23 - 0
server/data/src/main/java/com/qxgmat/data/relation/UserCollectQuestionRelationMapper.java

@@ -0,0 +1,23 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
+import com.qxgmat.data.dao.entity.UserPaper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface UserCollectQuestionRelationMapper {
+
+    List<UserCollectQuestion> list(
+            @Param("userId") Number userId,
+            @Param("module") String module,
+            @Param("type") String type,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime,
+            @Param("order") String order,
+            @Param("direction") String direction
+    );
+}

+ 23 - 0
server/data/src/main/java/com/qxgmat/data/relation/UserNoteRelationMapper.java

@@ -0,0 +1,23 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
+import com.qxgmat.data.dao.entity.UserNote;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface UserNoteRelationMapper {
+
+    List<UserNote> list(
+            @Param("userId") Number userId,
+            @Param("module") String module,
+            @Param("type") String type,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime,
+            @Param("order") String order,
+            @Param("direction") String direction
+    );
+}

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

@@ -25,4 +25,8 @@ public interface UserPaperRelationMapper {
             @Param("endTime") String endTime,
             @Param("finish") Boolean finish
     );
+    List<UserPaper> listHomeworkPreviewGroupTop(
+            @Param("userId") Number userId,
+            @Param("top") Number top
+    );
 }

+ 39 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserCollectQuestionRelation.java

@@ -0,0 +1,39 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.*;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public class UserCollectQuestionRelation extends UserCollectQuestion {
+
+    private Question question;
+
+    private QuestionNo questionNo;
+
+    private User user;
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public Question getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(Question question) {
+        this.question = question;
+    }
+
+    public QuestionNo getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNo questionNo) {
+        this.questionNo = questionNo;
+    }
+}

+ 39 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserNoteRelation.java

@@ -0,0 +1,39 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.*;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public class UserNoteRelation extends UserNote {
+
+    private Question question;
+
+    private QuestionNo questionNo;
+
+    private User user;
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public Question getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(Question question) {
+        this.question = question;
+    }
+
+    public QuestionNo getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNo questionNo) {
+        this.questionNo = questionNo;
+    }
+}

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

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qxgmat.data.relation.ExerciseQuestionRelationMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExerciseQuestion">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExercisePaperQuestion">
     <!--
       WARNING - @mbg.generated
     -->
@@ -21,7 +21,7 @@
     from `question_no` qn
     left join `question` q on q.`id` = qn.`question_id`
     <if test="paperId != null">
-    left join `exercise_paper_question` epq on q.`id` = epg.`question_id`
+    left join `exercise_paper_question` epq on qn.`id` = epg.`question_no_id`
     left join `exercise_paper` ep on ep.`id` = epg.`paper_id`
         and ep.`id` = #{paperId,jdbcType=VARCHAR}
     </if>
@@ -32,8 +32,8 @@
     <if test="structId != null">
       and find_in_set(#{structId,jdbcType=VARCHAR}, q.`module_struct`)
     </if>
-    <if test="questionNo != null">
-      and qn.`id` =#{questionNo,jdbcType=VARCHAR}
+    <if test="questionNoId != null">
+      and qn.`id` =#{questionNoId,jdbcType=VARCHAR}
     </if>
     <if test="place != null">
       and q.`place` =#{place,jdbcType=VARCHAR}

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

@@ -11,7 +11,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    q.`id`
+    qn.`id`
   </sql>
 
 </mapper>

+ 48 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserCollectQuestionRelationMapper.xml

@@ -0,0 +1,48 @@
+<?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.UserPaperRelationMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserCollectQuestion">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INT" property="id" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    ucq.`id`
+  </sql>
+
+  <!--
+    用户收藏题目列表
+  -->
+  <select id="list" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from `user_collect_question` ucq
+    left join `question_no` qn on qn.`id` = ucq.`question_no_id`
+      <if test="module != null">
+        and qn.`module` = #{module,jdbcType=VARCHAR}
+      </if>
+    left join `question` q on q.`id` = ucq.`question_id`
+      <if test="type != null">
+        and q.`type` = #{type,jdbcType=VARCHAR}
+      </if>
+    where
+    qn.`id` != null
+    and q.`id` != null
+    <if test="userId != null">
+      and ucq.`user_id` = #{userId,jdbcType=VARCHAR}
+    </if>
+    <if test="startTime != null">
+      and ucq.`createTime` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and ucq.`createTime` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+
+    order by ucq.${order} ${direction}
+  </select>
+
+</mapper>

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

@@ -14,7 +14,8 @@
     up.`id`
   </sql>
 
-  <!--用户预习作业列表
+  <!--
+    用户预习作业列表: 后台
     https://blog.csdn.net/t_1007/article/details/52369261
   -->
   <select id="listHomeworkPreviewAdmin" resultMap="BaseResultMap">
@@ -23,14 +24,12 @@
     from `user_paper` up
     left join `homework_preview` hp on hp.`id` = up.`module_id`
       and up.`module` = "homework_preview"
-    left join `user_report` ur on hp.`id` = ur.`module_id`
-      and ur.`module` = "homework_preview"
-    <if test="previewId != null">
-      and up.`module_id` = #{previewId,jdbcType=VARCHAR}
-    </if>
-    <if test="category != null">
-      and hp.`category` = #{category,jdbcType=VARCHAR}
-    </if>
+      <if test="previewId != null">
+        and hp.`id` = #{previewId,jdbcType=VARCHAR}
+      </if>
+      <if test="category != null">
+        and hp.`category` = #{category,jdbcType=VARCHAR}
+      </if>
     where
     hp.`id` != null
     <if test="userId != null">
@@ -43,4 +42,56 @@
       and up.`createTime` &lt; #{endTime,jdbcType=VARCHAR}
     </if>
   </select>
+
+  <!--
+    用户预习作业列表: 用户端
+  -->
+  <select id="listHomeworkPreview" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from `user_paper` up
+    left join `homework_preview` hp on hp.`id` = up.`module_id`
+      and up.`module` = "homework_preview"
+      <if test="category != null">
+        and hp.`category` = #{category,jdbcType=VARCHAR}
+      </if>
+      <if test="endTime != null">
+        and hp.`endTime` &lt; #{endTime,jdbcType=VARCHAR}
+      </if>
+    where
+    hp.`id` != null
+    <if test="userId != null">
+      and up.`user_id` = #{userId,jdbcType=VARCHAR}
+    </if>
+    <if test="finish != null">
+      <if test="finish == true">
+      and up.`number` > 1
+      </if>
+      <if test="finish == false">
+        and up.`number` = 0
+      </if>>
+    </if>
+  </select>
+
+  <!--
+    用户预习作业Top列表: 用户端
+  -->
+  <select id="listHomeworkPreviewGroupTop" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from `user_paper` up
+    where
+    hp.`id` != null
+    and up.`module` = "homework_preview"
+    <if test="userId != null">
+      and up.`user_id` = #{userId,jdbcType=VARCHAR}
+    </if>
+    and ( select count(distinct(up1.id))
+        from `user_paper` up1
+        where
+        up.`module_id` = up1.`module_id`
+        and up.`module` = "homework_preview"
+        and up1.number &lt; up.salary) &lt; ${top}
+    order by
+  </select>
 </mapper>

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

@@ -11,7 +11,6 @@ import com.nuliji.tools.exception.ParameterException;
 import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.entity.*;
-import com.qxgmat.data.relation.entity.QuestionNoRelation;
 import com.qxgmat.dto.admin.extend.ExercisePaperExtendDto;
 import com.qxgmat.dto.admin.extend.QuestionExtendDto;
 import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
@@ -122,21 +121,21 @@ public class ExerciseController {
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {
-        Page<ExerciseQuestion> p = exerciseQuestionService.listAdmin(page, size, structId, questionNoId, paperId, place, difficult, startTime, endTime, order, DirectionStatus.ValueOf(direction));
+        Page<ExercisePaperQuestion> p = exerciseQuestionService.listAdmin(page, size, structId, questionNoId, paperId, place, difficult, startTime, endTime, order, DirectionStatus.ValueOf(direction));
         List<ExerciseQuestionListDto> pr = Transform.convert(p, ExerciseQuestionListDto.class);
 
         // 绑定题目
-        Collection questionIds = Transform.getIds(p, ExerciseQuestion.class, "questionId");
+        Collection questionIds = Transform.getIds(p, ExercisePaperQuestion.class, "questionId");
         List<Question> questionList = questionService.select(questionIds);
         Transform.combine(pr, questionList, ExerciseQuestionListDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
 
         // 绑定题目编号
-        Collection questionNoIds = Transform.getIds(p, ExerciseQuestion.class, "questionNoId");
+        Collection questionNoIds = Transform.getIds(p, ExercisePaperQuestion.class, "questionNoId");
         List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
         Transform.combine(pr, questionNoList, ExerciseQuestionListDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
 
         // 绑定练习册
-        Collection paperIds = Transform.getIds(p, ExerciseQuestion.class, "paperId");
+        Collection paperIds = Transform.getIds(p, ExercisePaperQuestion.class, "paperId");
         List<ExercisePaper> paperList = exercisePaperService.select(paperIds);
         Transform.combine(pr, paperList, ExerciseQuestionListDto.class, "paperId", "paper", ExercisePaper.class, "id", ExercisePaperExtendDto.class);
 

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

@@ -1,22 +1,14 @@
 package com.qxgmat.controller.admin;
 
-import com.github.pagehelper.Page;
-import com.nuliji.tools.PageMessage;
-import com.nuliji.tools.Response;
-import com.nuliji.tools.ResponseHelp;
-import com.nuliji.tools.Transform;
+import com.nuliji.tools.*;
 import com.qxgmat.data.dao.entity.HomeworkPreview;
 import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.dao.entity.UserReport;
 import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
-import com.qxgmat.dto.admin.extend.HomeworkPreviewExtendDto;
-import com.qxgmat.dto.admin.extend.UserExtendDto;
 import com.qxgmat.dto.admin.response.UserHomeworkPreviewListDto;
 import com.qxgmat.service.UsersService;
 import com.qxgmat.service.HomeworkPreviewService;
 import com.qxgmat.service.inline.ManagerLogService;
-import com.qxgmat.service.inline.UserPaperService;
-import com.qxgmat.service.inline.UserReportService;
+import com.qxgmat.service.UserPaperService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,7 +46,7 @@ public class UserPreviewController {
             @RequestParam(required = false, name="start_time") String startTime,
             @RequestParam(required = false, name="end_time") String endTime,
             HttpSession session) {
-        Page<UserHomeworkPreviewRelation> p = homeworkPreviewService.listAdmin(page, size, category, userId, previewId, startTime, endTime);
+        PageResult<UserHomeworkPreviewRelation> p = homeworkPreviewService.listAdmin(page, size, category, userId, previewId, startTime, endTime);
 
         // 绑定用户
         Collection userIds = Transform.getIds(p, UserHomeworkPreviewRelation.class, "userId");

+ 63 - 45
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -2,22 +2,27 @@ package com.qxgmat.controller.api;
 
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.Page;
-import com.nuliji.tools.PageMessage;
-import com.nuliji.tools.Response;
-import com.nuliji.tools.ResponseHelp;
-import com.nuliji.tools.Transform;
+import com.nuliji.tools.*;
 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.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.UserHomeworkPreviewRelation;
+import com.qxgmat.data.relation.entity.UserNoteRelation;
 import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
+import com.qxgmat.dto.extend.UserReportExtendDto;
 import com.qxgmat.dto.request.*;
-import com.qxgmat.dto.response.UserClassDetailDto;
-import com.qxgmat.dto.response.UserPrepareDetailDto;
-import com.qxgmat.dto.response.UserRealDto;
+import com.qxgmat.dto.request.UserNoteDto;
+import com.qxgmat.dto.response.*;
 import com.qxgmat.help.ShiroHelp;
-import com.qxgmat.service.HomeworkPreviewService;
+import com.qxgmat.service.UserCollectQuestionService;
+import com.qxgmat.service.UserNoteService;
+import com.qxgmat.service.UserPaperService;
 import com.qxgmat.service.UsersService;
 import com.qxgmat.service.inline.*;
 import io.swagger.annotations.Api;
@@ -36,9 +41,7 @@ import java.io.File;
 import java.io.IOException;
 import java.text.DateFormat;
 import java.text.ParseException;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * Created by GaoJie on 2017/10/31.
@@ -73,13 +76,10 @@ public class MyController {
     private StatDayService statDayService;
 
     @Autowired
-    private UserClassService userClassService;
-
-    @Autowired
     private UserServiceService userServiceService;
 
     @Autowired
-    private UserCollectService userCollectService;
+    private UserCollectQuestionService userCollectQuestionService;
 
     @Autowired
     private UserNoteService userNoteService;
@@ -87,6 +87,12 @@ public class MyController {
     @Autowired
     private UserQuestionService userQuestionService;
 
+    @Autowired
+    private UserReportService userReportService;
+
+    @Autowired
+    private UserPaperService userPaperService;
+
     @RequestMapping(value = "/email", method = RequestMethod.POST)
     @ApiOperation(value = "绑定邮箱", httpMethod = "POST")
     public Response<Boolean> email(@RequestBody @Validated UserEmailDto dto, HttpSession session, HttpServletRequest request) {
@@ -208,9 +214,9 @@ public class MyController {
     @RequestMapping(value = "/collect", method = RequestMethod.PUT)
     @ApiOperation(value = "添加收藏", notes = "添加收藏", httpMethod = "PUT")
     public Response<Boolean> collectAdd(@RequestBody @Validated UserCollectDto dto)  {
-        UserCollect entity = Transform.dtoToEntity(dto);
+        UserCollectQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
-        userCollectService.addQuestion(user.getId(), entity.getQuestionNoId());
+        userCollectQuestionService.addQuestion(user.getId(), entity.getQuestionNoId());
 
         return ResponseHelp.success(true);
     }
@@ -219,43 +225,46 @@ public class MyController {
     @ApiOperation(value = "移除收藏", notes = "移除收藏", httpMethod = "DELETE")
     public Response<Boolean> collectDelete(int id)  {
         User user = (User) shiroHelp.getLoginUser();
-        Boolean result = userCollectService.deleteQuestion(user.getId(), id);
+        Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), id);
 
         return ResponseHelp.success(result);
     }
 
-    @RequestMapping(value = "/collect/list", method = RequestMethod.GET)
-    @ApiOperation(value = "获取收藏列表", notes = "获取收藏列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewExtendDto>> collectList(
+    @RequestMapping(value = "/collect/question", method = RequestMethod.GET)
+    @ApiOperation(value = "获取收藏题目列表", notes = "获取收藏题目列表", httpMethod = "GET")
+    public Response<PageMessage<UserCollectQuestionDto>> collectList(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
-    )  {
+            @RequestParam(required = false) String type,
+            @RequestParam(required = false, name="start_time") String startTime,
+            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false, defaultValue = "id") String order,
+            @RequestParam(required = false, defaultValue = "desc") String direction,
+            HttpSession session)  {
         User user = (User) shiroHelp.getLoginUser();
-        Page<UserHomeworkPreviewRelation> p = userCollectService.list(page, size, category, user.getId(), endTime, finish);
+        PageResult<UserCollectQuestionRelation> p = userCollectQuestionService.listQuestion(page, size, user.getId(), QuestionModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
+
+        List<UserCollectQuestionDto> pr = Transform.convert(p, UserCollectQuestionDto.class);
+
+        // 绑定做题数据
 
-        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
 
     @RequestMapping(value = "/error/list", method = RequestMethod.GET)
     @ApiOperation(value = "获取错题列表", notes = "获取错题列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewExtendDto>> errorList(
+    public Response<PageMessage<UserQuestionListDto>> errorList(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
+            @RequestParam(required = false) Number category
     )  {
         User user = (User) shiroHelp.getLoginUser();
-        Page<UserHomeworkPreviewRelation> p = userQuestionService.list(page, size, category, user.getId(), endTime, finish);
+        PageResult<UserQuestion> p = userQuestionService.listError(page, size, user.getId());
 
-        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
+        List<UserQuestionListDto> pr = Transform.convert(p, UserQuestionListDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
@@ -277,12 +286,14 @@ public class MyController {
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
-    )  {
+            @RequestParam(required = false) String type,
+            @RequestParam(required = false, name="start_time") String startTime,
+            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false, defaultValue = "id") String order,
+            @RequestParam(required = false, defaultValue = "desc") String direction,
+            HttpSession session)  {
         User user = (User) shiroHelp.getLoginUser();
-        Page<UserHomeworkPreviewRelation> p = userNoteService.list(page, size, category, user.getId(), endTime, finish);
+        PageResult<UserNoteRelation> p = userNoteService.list(page, size, user.getId(), QuestionModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
 
         List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
 
@@ -291,18 +302,25 @@ public class MyController {
 
     @RequestMapping(value = "/report/list", method = RequestMethod.GET)
     @ApiOperation(value = "获取报告列表", notes = "获取报告列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewExtendDto>> reportList(
+    public Response<PageMessage<UserPaperDto>> reportList(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = true) String module,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
-    )  {
+            @RequestParam(required = false) String type,
+            @RequestParam(required = false, name="start_time") String startTime,
+            @RequestParam(required = false, name="end_time") String endTime,
+            @RequestParam(required = false, defaultValue = "id") String order,
+            @RequestParam(required = false, defaultValue = "desc") String direction,
+            HttpSession session)  {
         User user = (User) shiroHelp.getLoginUser();
-        Page<UserHomeworkPreviewRelation> p = userNoteService.list(page, size, category, user.getId(), endTime, finish);
+        PageResult<UserPaper> p = userPaperService.list(page, size, user.getId(), PaperModule.ValueOf(module), QuestionType.ValueOf(type), startTime, endTime, order, DirectionStatus.ValueOf(direction));
 
-        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
+        List<UserPaperDto> pr = Transform.convert(p, UserPaperDto.class);
+
+        Collection paperIds = Transform.getIds(p, UserPaper.class, "id");
+        // 绑定用户报告
+        Map<Object, Collection<UserReport>> reportByPaper = userReportService.mapByPaper(paperIds);
+        Transform.combine(pr, reportByPaper, UserPaperDto.class, "id", "reports", UserReportExtendDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }

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

@@ -2,18 +2,16 @@ package com.qxgmat.controller.api;
 
 
 import com.github.pagehelper.Page;
-import com.nuliji.tools.PageMessage;
-import com.nuliji.tools.Response;
-import com.nuliji.tools.ResponseHelp;
-import com.nuliji.tools.Transform;
+import com.nuliji.tools.*;
 import com.qxgmat.data.dao.entity.ExercisePaper;
-import com.qxgmat.data.dao.entity.ExerciseStruct;
 import com.qxgmat.data.dao.entity.User;
+import com.qxgmat.data.dao.entity.UserClass;
 import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
 import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
 import com.qxgmat.dto.response.UserClassDetailDto;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.service.HomeworkPreviewService;
+import com.qxgmat.service.UserPaperService;
 import com.qxgmat.service.inline.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,7 +22,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpSession;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/api/question")
@@ -49,16 +49,42 @@ public class QuestionController {
     @Autowired
     private HomeworkPreviewService homeworkPreviewService;
 
-    @RequestMapping(value = "/class/list", method = RequestMethod.GET)
-    @ApiOperation(value = "获取课程", notes = "获取所有课程及状态进度", httpMethod = "GET")
-    public Response<List<UserClassDetailDto>> classList()  {
+    @Autowired
+    private UserClassService userClassService;
+
+    @RequestMapping(value = "/class/process", method = RequestMethod.GET)
+    @ApiOperation(value = "获取课程进度", notes = "获取所有课程及状态进度", httpMethod = "GET")
+    public Response<List<UserClassDetailDto>> classProcess()  {
         User user = (User) shiroHelp.getLoginUser();
+        List<UserClass> userClassList = userClassService.getByUser(user.getId());
 
-        return ResponseHelp.success(null);
+        // 获取每个科目的最后3次作业
+        Map<Object, Collection<UserHomeworkPreviewRelation>> previewMap = homeworkPreviewService.groupByCategory(user.getId(), 3);
+
+        List<UserClassDetailDto> dtos = Transform.convert(userClassList, UserClassDetailDto.class);
+        Transform.combine(dtos, previewMap, UserClassDetailDto.class, "moduleId", "previews", UserHomeworkPreviewExtendDto.class);
+        return ResponseHelp.success(dtos);
+    }
+
+    @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
+    public Response<PageMessage<UserHomeworkPreviewExtendDto>> previewList(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false) Number category,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) Boolean finish
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        PageResult<UserHomeworkPreviewRelation> p = homeworkPreviewService.list(page, size, category, user.getId(), endTime, finish);
+
+        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
+
+        return ResponseHelp.success(pr, page, size, p.getTotal());
     }
 
     @RequestMapping(value = "/exercise/process", method = RequestMethod.GET)
-    @ApiOperation(value = "练习组卷列表", httpMethod = "GET")
+    @ApiOperation(value = "练习进度", httpMethod = "GET")
     public Response<PageMessage<ExercisePaper>> exerciseProcess(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
@@ -68,8 +94,19 @@ public class QuestionController {
         return ResponseHelp.success(p, page, size, p.getTotal());
     }
 
-    @RequestMapping(value = "/examination/process", method = RequestMethod.GET)
+    @RequestMapping(value = "/exercise/paper", method = RequestMethod.GET)
     @ApiOperation(value = "练习组卷列表", httpMethod = "GET")
+    public Response<PageMessage<ExercisePaper>> exercisePaperList(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            HttpSession session) {
+        Page<ExercisePaper> p = null;
+
+        return ResponseHelp.success(p, page, size, p.getTotal());
+    }
+
+    @RequestMapping(value = "/examination/process", method = RequestMethod.GET)
+    @ApiOperation(value = "模考进度", httpMethod = "GET")
     public Response<PageMessage<ExercisePaper>> examinationProcess(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
@@ -90,24 +127,6 @@ public class QuestionController {
         return ResponseHelp.success(p, page, size, p.getTotal());
     }
 
-
-    @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
-    @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
-    public Response<PageMessage<UserHomeworkPreviewExtendDto>> previewList(
-            @RequestParam(required = false, defaultValue = "1") int page,
-            @RequestParam(required = false, defaultValue = "100") int size,
-            @RequestParam(required = false) Number category,
-            @RequestParam(required = false) String endTime,
-            @RequestParam(required = false) Boolean finish
-    )  {
-        User user = (User) shiroHelp.getLoginUser();
-        Page<UserHomeworkPreviewRelation> p = homeworkPreviewService.list(page, size, category, user.getId(), endTime, finish);
-
-        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
-
-        return ResponseHelp.success(pr, page, size, p.getTotal());
-    }
-
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取题目详情", notes = "获取题目详情", httpMethod = "GET")
     public Response<User> detail(

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

@@ -11,6 +11,7 @@ import com.qxgmat.dto.request.UserSentenceProcessDto;
 import com.qxgmat.dto.response.UserSentenceArticleDto;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.service.SentencePaperService;
+import com.qxgmat.service.UserPaperService;
 import com.qxgmat.service.UsersService;
 import com.qxgmat.service.inline.*;
 import io.swagger.annotations.Api;

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

@@ -0,0 +1,56 @@
+package com.qxgmat.dto.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.Question;
+
+@Dto(entity = Question.class)
+public class QuestionExtendDto {
+
+    private Integer id;
+
+    private String stem;
+
+    private String type;
+    private String difficult;
+    private String place;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getStem() {
+        return stem;
+    }
+
+    public void setStem(String stem) {
+        this.stem = stem;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public String getPlace() {
+        return place;
+    }
+
+    public void setPlace(String place) {
+        this.place = place;
+    }
+}

+ 71 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/QuestionNoExtendDto.java

@@ -0,0 +1,71 @@
+package com.qxgmat.dto.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.QuestionNo;
+
+import javax.validation.constraints.NotEmpty;
+
+@Dto(entity = QuestionNo.class)
+public class QuestionNoExtendDto {
+    private Integer id;
+
+    /**
+     * 模块:examination, exercise, sentence
+     */
+    @NotEmpty(message = "题目所属模块!")
+    private String module;
+
+    /**
+     * 人工id
+     */
+    @NotEmpty(message = "题目ID!")
+    private String no;
+
+    /**
+     * 对应模块结构信息,逗号分隔
+     */
+    @NotEmpty(message = "对应模块层级!")
+    private Integer[] moduleStruct;
+
+    private QuestionExtendDto question;
+
+    public String getModule() {
+        return module;
+    }
+
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    public String getNo() {
+        return no;
+    }
+
+    public void setNo(String no) {
+        this.no = no;
+    }
+
+    public Integer[] getModuleStruct() {
+        return moduleStruct;
+    }
+
+    public void setModuleStruct(Integer[] moduleStruct) {
+        this.moduleStruct = moduleStruct;
+    }
+
+    public QuestionExtendDto getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(QuestionExtendDto question) {
+        this.question = question;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+}

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

@@ -1,9 +1,9 @@
 package com.qxgmat.dto.request;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserCollect;
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
 
-@Dto(entity = UserCollect.class)
+@Dto(entity = UserCollectQuestion.class)
 public class UserCollectDto {
     private Integer questionNoId;
 

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

@@ -9,6 +9,7 @@ import java.util.List;
 
 @Dto(entity = UserClass.class)
 public class UserClassDetailDto {
+    private Integer category;
     private Date startTime;
     private Date expireTime;
     private Boolean payed;
@@ -46,4 +47,12 @@ public class UserClassDetailDto {
     public void setPayed(Boolean payed) {
         this.payed = payed;
     }
+
+    public Integer getCategory() {
+        return category;
+    }
+
+    public void setCategory(Integer category) {
+        this.category = category;
+    }
 }

+ 71 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserCollectQuestionDto.java

@@ -0,0 +1,71 @@
+package com.qxgmat.dto.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
+import com.qxgmat.dto.extend.QuestionExtendDto;
+import com.qxgmat.dto.extend.QuestionNoExtendDto;
+
+import java.util.Date;
+
+@Dto(entity = UserCollectQuestion.class)
+public class UserCollectQuestionDto {
+    private Integer id;
+
+    private QuestionExtendDto question;
+
+    private QuestionNoExtendDto questionNo;
+
+    private Date createTime;
+
+    private Integer userTime;
+
+    private Integer avgTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public QuestionExtendDto getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(QuestionExtendDto question) {
+        this.question = question;
+    }
+
+    public QuestionNoExtendDto getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNoExtendDto questionNo) {
+        this.questionNo = questionNo;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getAvgTime() {
+        return avgTime;
+    }
+
+    public void setAvgTime(Integer avgTime) {
+        this.avgTime = avgTime;
+    }
+
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+}

+ 61 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserNoteDto.java

@@ -0,0 +1,61 @@
+package com.qxgmat.dto.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserNote;
+import com.qxgmat.dto.extend.QuestionExtendDto;
+import com.qxgmat.dto.extend.QuestionNoExtendDto;
+
+import java.util.Date;
+
+@Dto(entity = UserNote.class)
+public class UserNoteDto {
+    private Integer id;
+
+    private QuestionExtendDto question;
+
+    private QuestionNoExtendDto questionNo;
+
+    private Date createTime;
+
+    private String content;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public QuestionExtendDto getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(QuestionExtendDto question) {
+        this.question = question;
+    }
+
+    public QuestionNoExtendDto getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNoExtendDto questionNo) {
+        this.questionNo = questionNo;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

+ 43 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserPaperDto.java

@@ -0,0 +1,43 @@
+package com.qxgmat.dto.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.dao.entity.UserReport;
+import com.qxgmat.dto.extend.UserReportExtendDto;
+
+import java.util.Date;
+import java.util.List;
+
+@Dto(entity = UserPaper.class)
+public class UserPaperDto {
+
+    private Integer id;
+
+    private String title;
+
+    private List<UserReportExtendDto> reports;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public List<UserReportExtendDto> getReports() {
+        return reports;
+    }
+
+    public void setReports(List<UserReportExtendDto> reports) {
+        this.reports = reports;
+    }
+}

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

@@ -0,0 +1,19 @@
+package com.qxgmat.dto.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserQuestion;
+import com.qxgmat.dto.extend.QuestionExtendDto;
+import com.qxgmat.dto.extend.QuestionNoExtendDto;
+
+import java.util.Date;
+
+@Dto(entity = UserQuestion.class)
+public class UserQuestionListDto {
+    private Integer id;
+
+    private QuestionExtendDto question;
+
+    private QuestionNoExtendDto questionNoExtendDto;
+
+    private Date createTime;
+}

+ 56 - 15
server/gateway-api/src/main/java/com/qxgmat/service/HomeworkPreviewService.java

@@ -2,6 +2,7 @@ package com.qxgmat.service;
 
 import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.PageResult;
 import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
@@ -14,7 +15,6 @@ import com.qxgmat.data.dao.entity.UserReport;
 import com.qxgmat.data.relation.UserPaperRelationMapper;
 import com.qxgmat.data.relation.UserReportRelationMapper;
 import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
-import com.qxgmat.service.inline.UserPaperService;
 import com.qxgmat.service.inline.UserReportService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,9 +22,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class HomeworkPreviewService extends AbstractService {
@@ -56,23 +54,25 @@ public class HomeworkPreviewService extends AbstractService {
      * @param endTime
      * @return
      */
-    public Page<UserHomeworkPreviewRelation> listAdmin(int page, int size, Number category, Number userId, Number previewId, String startTime, String endTime){
-        Page<UserHomeworkPreviewRelation> p = page(() -> {
+    public PageResult<UserHomeworkPreviewRelation> listAdmin(int page, int size, Number category, Number userId, Number previewId, String startTime, String endTime){
+        Page<UserPaper> p = page(() -> {
             userPaperRelationMapper.listHomeworkPreviewAdmin(category, userId, previewId, startTime, endTime);
         }, page, size);
 
-        Collection ids = Transform.getIds(p, UserReport.class, "id");
+        Collection ids = Transform.getIds(p, UserPaper.class, "id");
 
+        // 获取详细数据
         List<UserPaper> list = userPaperService.select(ids);
-        Transform.replace(p, Transform.convert(list, UserHomeworkPreviewRelation.class), UserHomeworkPreviewRelation.class, "id");
+        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
 
+        // 获取完成度最高的作业结果
         List<UserReport> reportList = userReportRelationMapper.listFinishLast(ids, startTime, endTime);
         Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
         Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
 
         Transform.combine(p, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
 
-        return p;
+        return new PageResult<>(pr, p.getTotal());
     }
 
     /**
@@ -85,23 +85,64 @@ public class HomeworkPreviewService extends AbstractService {
      * @param finish
      * @return
      */
-    public Page<UserHomeworkPreviewRelation> list(int page, int size, Number category, Number userId, String endTime, Boolean finish){
-        Page<UserHomeworkPreviewRelation> p = page(()->{
+    public PageResult<UserHomeworkPreviewRelation> list(int page, int size, Number category, Number userId, String endTime, Boolean finish){
+        Page<UserPaper> p = page(()->{
             userPaperRelationMapper.listHomeworkPreview(category, userId, endTime, finish);
         },page, size);
 
-        Collection ids = Transform.getIds(p, UserReport.class, "id");
+        Collection ids = Transform.getIds(p, UserPaper.class, "id");
 
+        // 获取详细数据
         List<UserPaper> list = userPaperService.select(ids);
-        Transform.replace(p, Transform.convert(list, UserHomeworkPreviewRelation.class), UserHomeworkPreviewRelation.class, "id");
+        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
 
+        // 获取最后一次作业结果
         List<UserReport> reportList = userReportRelationMapper.listLast(ids);
         Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
         Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
 
-        Transform.combine(p, reportList, UserHomeworkPreviewRelation.class, "id", "paperId", UserReport.class, "paperId");
+        Transform.combine(p, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
+
+        return new PageResult<>(pr, p.getTotal());
+    }
+
+    /**
+     * 获取用户分组作业列表,并关联用户最后一次作业
+     * @param userId
+     * @param top
+     * @return
+     */
+    public Map<Object, Collection<UserHomeworkPreviewRelation>> groupByCategory(Number userId, Number top){
+        List<UserPaper> p = userPaperRelationMapper.listHomeworkPreviewGroupTop(userId, top);
+        Map<Object, Collection<UserHomeworkPreviewRelation>> relationMap = new HashMap<>();
+
+        if(p.size() == 0) return relationMap;
+
+        Collection ids = Transform.getIds(p, UserPaper.class, "id");
 
-        return p;
+        // 获取详细数据
+        List<UserPaper> list = userPaperService.select(ids);
+        List<UserHomeworkPreviewRelation> pr = Transform.convert(list, UserHomeworkPreviewRelation.class);
+
+        // 获取最后一次作业结果
+        List<UserReport> reportList = userReportRelationMapper.listLast(ids);
+        Collection reportIds = Transform.getIds(reportList, UserReport.class, "id");
+        Transform.replace(reportList, userReportService.select(reportIds), UserReport.class, "id");
+
+        Transform.combine(pr, reportList, UserHomeworkPreviewRelation.class, "id", "report", UserReport.class, "paperId");
+
+        for(UserHomeworkPreviewRelation row: pr){
+            List<UserHomeworkPreviewRelation> l;
+            Number moduleId = row.getModuleId();
+            if(!relationMap.containsKey(moduleId)){
+                l = new ArrayList<>();
+                relationMap.put(moduleId, l);
+            }else{
+                l = (List<UserHomeworkPreviewRelation>)relationMap.get(moduleId);
+            }
+            l.add(row);
+        }
+        return relationMap;
     }
 
     /**

+ 162 - 0
server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java

@@ -0,0 +1,162 @@
+package com.qxgmat.service;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.PageResult;
+import com.nuliji.tools.Transform;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.constants.enums.QuestionType;
+import com.qxgmat.data.constants.enums.module.QuestionModule;
+import com.qxgmat.data.constants.enums.status.DirectionStatus;
+import com.qxgmat.data.dao.UserCollectQuestionMapper;
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.QuestionNo;
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
+import com.qxgmat.data.relation.UserCollectQuestionRelationMapper;
+import com.qxgmat.data.relation.entity.UserCollectQuestionRelation;
+import com.qxgmat.service.inline.QuestionNoService;
+import com.qxgmat.service.inline.QuestionService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class UserCollectQuestionService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserCollectQuestionService.class);
+
+    @Resource
+    private UserCollectQuestionMapper userCollectQuestionMapper;
+
+    @Resource
+    private UserCollectQuestionRelationMapper userCollectQuestionRelationMapper;
+
+    @Resource
+    private QuestionNoService questionNoService;
+
+    @Resource
+    private QuestionService questionService;
+
+    /**
+     * 获取用户题目收藏列表
+     * @param page
+     * @param size
+     * @param userId
+     * @param type
+     * @return
+     */
+    public PageResult<UserCollectQuestionRelation> listQuestion(int page, int size, Integer userId, QuestionModule module, QuestionType type, String startTime, String endTime, String order, DirectionStatus direction){
+        String moduleKey = module == null ? null : module.key;
+        String typeKey = type == null ? null : type.key;
+        Page<UserCollectQuestion> p = page(()->{
+            userCollectQuestionRelationMapper.list(userId, moduleKey, typeKey, startTime, endTime, order, direction.key);
+        }, page, size);
+
+        Collection ids = Transform.getIds(p, UserCollectQuestion.class, "id");
+
+        // 获取详细数据
+        List<UserCollectQuestion> list = select(ids);
+
+        List<UserCollectQuestionRelation> pr = Transform.convert(list, UserCollectQuestionRelation.class);
+
+        // 获取题目信息
+        Collection questionIds = Transform.getIds(pr, UserCollectQuestionRelation.class, "questionId");
+        List<Question> questionList = questionService.select(questionIds);
+        Transform.combine(pr, questionList, UserCollectQuestionRelation.class, "questionId", "question", Question.class, "id");
+
+        // 获取题目编号信息
+        Collection questionNoIds = Transform.getIds(pr, UserCollectQuestionRelation.class, "questionNoId");
+        List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
+        Transform.combine(pr, questionNoList, UserCollectQuestionRelation.class, "questionNoId", "questionNo", Question.class, "id");
+
+        return new PageResult<>(pr, p.getTotal());
+    }
+
+    @Transactional
+    public UserCollectQuestion addQuestion(Integer userId, Integer questionNoId){
+        Example example = new Example(UserCollectQuestion.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("userId", userId)
+                        .andEqualTo("questionNoId", questionNoId)
+        );
+        UserCollectQuestion in = one(userCollectQuestionMapper, example);
+        if (in != null){
+            return in;
+        }
+        QuestionNo no = questionNoService.get(questionNoId);
+        UserCollectQuestion collect = add(UserCollectQuestion.builder()
+                .userId(userId)
+                .questionNoId(questionNoId)
+                .questionId(no.getQuestionId()).build());
+        int result = insert(userCollectQuestionMapper, collect);
+        return collect;
+    }
+
+    @Transactional
+    public boolean deleteQuestion(Integer userId, Integer questionNoId){
+        Example example = new Example(UserCollectQuestion.class);
+        example.and(
+                example.createCriteria()
+                .andEqualTo("userId", userId)
+                .andEqualTo("questionNoId", questionNoId)
+        );
+        UserCollectQuestion in = one(userCollectQuestionMapper, example);
+        if (in == null){
+            return true;
+        }
+        int result = delete(userCollectQuestionMapper, example);
+        return result > 0;
+    }
+
+    public UserCollectQuestion add(UserCollectQuestion collect){
+        int result = insert(userCollectQuestionMapper, collect);
+        collect = one(userCollectQuestionMapper, collect.getId());
+        if(collect == null){
+            throw new SystemException("收藏添加失败");
+        }
+        return collect;
+    }
+
+    public UserCollectQuestion edit(UserCollectQuestion collect){
+        UserCollectQuestion in = one(userCollectQuestionMapper, collect.getId());
+        if(in == null){
+            throw new ParameterException("收藏不存在");
+        }
+        int result = update(userCollectQuestionMapper, collect);
+        return collect;
+    }
+
+    public boolean delete(Number id){
+        UserCollectQuestion in = one(userCollectQuestionMapper, id);
+        if(in == null){
+            throw new ParameterException("收藏不存在");
+        }
+        int result = delete(userCollectQuestionMapper, id);
+        return result > 0;
+    }
+
+    public UserCollectQuestion get(Number id){
+        UserCollectQuestion in = one(userCollectQuestionMapper, id);
+
+        if(in == null){
+            throw new ParameterException("收藏不存在");
+        }
+        return in;
+    }
+
+    public Page<UserCollectQuestion> select(int page, int pageSize){
+        return select(userCollectQuestionMapper, page, pageSize);
+    }
+
+    public List<UserCollectQuestion> select(Collection ids){
+        return select(userCollectQuestionMapper, ids);
+    }
+
+}

+ 63 - 4
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserNoteService.java

@@ -1,14 +1,24 @@
-package com.qxgmat.service.inline;
+package com.qxgmat.service;
 
 import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.PageResult;
+import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.nuliji.tools.mybatis.Example;
-import com.qxgmat.data.dao.UserCollectMapper;
+import com.qxgmat.data.constants.enums.QuestionType;
+import com.qxgmat.data.constants.enums.module.QuestionModule;
+import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.UserNoteMapper;
-import com.qxgmat.data.dao.entity.UserCollect;
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.QuestionNo;
+import com.qxgmat.data.dao.entity.UserCollectQuestion;
 import com.qxgmat.data.dao.entity.UserNote;
+import com.qxgmat.data.relation.UserNoteRelationMapper;
+import com.qxgmat.data.relation.entity.UserNoteRelation;
+import com.qxgmat.service.inline.QuestionNoService;
+import com.qxgmat.service.inline.QuestionService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -25,9 +35,58 @@ public class UserNoteService extends AbstractService {
     @Resource
     private UserNoteMapper userNoteMapper;
 
+    @Resource
+    private UserNoteRelationMapper userNoteRelationMapper;
+
+    @Resource
+    private QuestionNoService questionNoService;
+
+    @Resource
+    private QuestionService questionService;
+
+    /**
+     * 获取用户笔记列表
+     * @param page
+     * @param size
+     * @param userId
+     * @param module
+     * @param type
+     * @param startTime
+     * @param endTime
+     * @param order
+     * @param direction
+     * @return
+     */
+    public PageResult<UserNoteRelation> list(int page, int size, Integer userId, QuestionModule module, QuestionType type, String startTime, String endTime, String order, DirectionStatus direction){
+        String moduleKey = module == null ? null : module.key;
+        String typeKey = type == null ? null : type.key;
+        Page<UserNote> p = page(()->{
+            userNoteRelationMapper.list(userId, moduleKey, typeKey, startTime, endTime, order, direction.key);
+        }, page, size);
+
+        Collection ids = Transform.getIds(p, UserNote.class, "id");
+
+        // 获取详细数据
+        List<UserNote> list = select(ids);
+
+        List<UserNoteRelation> pr = Transform.convert(list, UserNoteRelation.class);
+
+        // 获取题目信息
+        Collection questionIds = Transform.getIds(pr, UserNoteRelation.class, "questionId");
+        List<Question> questionList = questionService.select(questionIds);
+        Transform.combine(pr, questionList, UserNoteRelation.class, "questionId", "question", Question.class, "id");
+
+        // 获取题目编号信息
+        Collection questionNoIds = Transform.getIds(pr, UserNoteRelation.class, "questionNoId");
+        List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
+        Transform.combine(pr, questionNoList, UserNoteRelation.class, "questionNoId", "questionNo", Question.class, "id");
+
+        return new PageResult<>(pr, p.getTotal());
+    }
+
     @Transactional
     public UserNote update(UserNote note){
-        Example example = new Example(UserCollect.class);
+        Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", note.getUserId())

+ 11 - 4
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserPaperService.java

@@ -1,13 +1,15 @@
-package com.qxgmat.service.inline;
+package com.qxgmat.service;
 
 import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
-import com.nuliji.tools.Transform;
+import com.nuliji.tools.PageResult;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
-import com.qxgmat.data.dao.UserCollectMapper;
+import com.qxgmat.data.constants.enums.QuestionType;
+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.UserPaperMapper;
-import com.qxgmat.data.dao.entity.UserCollect;
 import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.relation.UserPaperRelationMapper;
 import org.slf4j.Logger;
@@ -28,6 +30,11 @@ public class UserPaperService extends AbstractService {
     @Resource
     private UserPaperRelationMapper userPaperRelationMapper;
 
+    public PageResult<UserPaper> list(int page, int size, Integer userId, PaperModule module, QuestionType type, String startTime, String endTime, String order, DirectionStatus direction){
+
+        return new PageResult<>(null, 0);
+    }
+
     public UserPaper add(UserPaper paper){
         int result = insert(userPaperMapper, paper);
         paper = one(userPaperMapper, paper.getId());

+ 12 - 14
server/gateway-api/src/main/java/com/qxgmat/service/inline/ExerciseQuestionService.java

@@ -5,31 +5,29 @@ import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
-import com.qxgmat.data.dao.ExerciseQuestionMapper;
-import com.qxgmat.data.dao.entity.ExerciseQuestion;
+import com.qxgmat.data.dao.ExercisePaperQuestionMapper;
+import com.qxgmat.data.dao.entity.ExercisePaperQuestion;
 import com.qxgmat.data.relation.ExerciseQuestionRelationMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.stream.Collectors;
 
 @Service
 public class ExerciseQuestionService extends AbstractService {
     private static final Logger logger = LoggerFactory.getLogger(ExerciseQuestionService.class);
 
     @Resource
-    private ExerciseQuestionMapper exerciseQuestionMapper;
+    private ExercisePaperQuestionMapper exerciseQuestionMapper;
 
     @Resource
     private ExerciseQuestionRelationMapper exerciseQuestionRelationMapper;
 
 
-    public Page<ExerciseQuestion> listAdmin(int page, int pageSize, Number structId, Number questionNo, Number paperId, String place, String difficult, String startTime, String endTime, String order, DirectionStatus direction){
+    public Page<ExercisePaperQuestion> listAdmin(int page, int pageSize, Number structId, Number questionNo, Number paperId, String place, String difficult, String startTime, String endTime, String order, DirectionStatus direction){
         if(order.isEmpty()) order = "id";
         if (direction == null){
             direction = DirectionStatus.DESC;
@@ -42,7 +40,7 @@ public class ExerciseQuestionService extends AbstractService {
         }, page, pageSize);
     }
 
-    public ExerciseQuestion add(ExerciseQuestion question){
+    public ExercisePaperQuestion add(ExercisePaperQuestion question){
         int result = insert(exerciseQuestionMapper, question);
         question = one(exerciseQuestionMapper, question.getId());
         if(question == null){
@@ -51,8 +49,8 @@ public class ExerciseQuestionService extends AbstractService {
         return question;
     }
 
-    public ExerciseQuestion edit(ExerciseQuestion question){
-        ExerciseQuestion in = one(exerciseQuestionMapper, question.getId());
+    public ExercisePaperQuestion edit(ExercisePaperQuestion question){
+        ExercisePaperQuestion in = one(exerciseQuestionMapper, question.getId());
         if(in == null){
             throw new ParameterException("题目不存在");
         }
@@ -61,7 +59,7 @@ public class ExerciseQuestionService extends AbstractService {
     }
 
     public boolean delete(Number id){
-        ExerciseQuestion in = one(exerciseQuestionMapper, id);
+        ExercisePaperQuestion in = one(exerciseQuestionMapper, id);
         if(in == null){
             throw new ParameterException("题目不存在");
         }
@@ -69,8 +67,8 @@ public class ExerciseQuestionService extends AbstractService {
         return result > 0;
     }
 
-    public ExerciseQuestion get(Number id){
-        ExerciseQuestion in = one(exerciseQuestionMapper, id);
+    public ExercisePaperQuestion get(Number id){
+        ExercisePaperQuestion in = one(exerciseQuestionMapper, id);
 
         if(in == null){
             throw new ParameterException("题目不存在");
@@ -78,11 +76,11 @@ public class ExerciseQuestionService extends AbstractService {
         return in;
     }
 
-    public Page<ExerciseQuestion> select(int page, int pageSize){
+    public Page<ExercisePaperQuestion> select(int page, int pageSize){
         return select(exerciseQuestionMapper, page, pageSize);
     }
 
-    public List<ExerciseQuestion> select(Collection ids){
+    public List<ExercisePaperQuestion> select(Collection ids){
         return select(exerciseQuestionMapper, ids);
     }
 

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserClassService.java

@@ -60,7 +60,7 @@ public class UserClassService extends AbstractService {
         update(userClassMapper, example, UserClass.builder().userId(newUserId).build());
     }
 
-    public Collection<UserClass> getByUser(Number userId){
+    public List<UserClass> getByUser(Number userId){
         Example example = new Example(UserService.class);
         example.and(
                 example.createCriteria()

+ 0 - 113
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserCollectService.java

@@ -1,113 +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.UserAskMapper;
-import com.qxgmat.data.dao.UserCollectMapper;
-import com.qxgmat.data.dao.entity.QuestionNo;
-import com.qxgmat.data.dao.entity.UserAsk;
-import com.qxgmat.data.dao.entity.UserCollect;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
-
-@Service
-public class UserCollectService extends AbstractService {
-    private static final Logger logger = LoggerFactory.getLogger(UserCollectService.class);
-
-    @Resource
-    private UserCollectMapper userCollectMapper;
-
-    @Resource
-    private QuestionNoService questionNoService;
-
-    @Transactional
-    public UserCollect addQuestion(Integer userId, Integer questionNoId){
-        Example example = new Example(UserCollect.class);
-        example.and(
-                example.createCriteria()
-                        .andEqualTo("userId", userId)
-                        .andEqualTo("questionNoId", questionNoId)
-        );
-        UserCollect in = one(userCollectMapper, example);
-        if (in != null){
-            return in;
-        }
-        QuestionNo no = questionNoService.get(questionNoId);
-        UserCollect collect = add(UserCollect.builder()
-                .userId(userId)
-                .questionNoId(questionNoId)
-                .questionId(no.getQuestionId()).build());
-        int result = insert(userCollectMapper, collect);
-        return collect;
-    }
-
-    @Transactional
-    public boolean deleteQuestion(Integer userId, Integer questionNoId){
-        Example example = new Example(UserCollect.class);
-        example.and(
-                example.createCriteria()
-                .andEqualTo("userId", userId)
-                .andEqualTo("questionNoId", questionNoId)
-        );
-        UserCollect in = one(userCollectMapper, example);
-        if (in == null){
-            return true;
-        }
-        int result = delete(userCollectMapper, example);
-        return result > 0;
-    }
-
-    public UserCollect add(UserCollect collect){
-        int result = insert(userCollectMapper, collect);
-        collect = one(userCollectMapper, collect.getId());
-        if(collect == null){
-            throw new SystemException("收藏添加失败");
-        }
-        return collect;
-    }
-
-    public UserCollect edit(UserCollect collect){
-        UserCollect in = one(userCollectMapper, collect.getId());
-        if(in == null){
-            throw new ParameterException("收藏不存在");
-        }
-        int result = update(userCollectMapper, collect);
-        return collect;
-    }
-
-    public boolean delete(Number id){
-        UserCollect in = one(userCollectMapper, id);
-        if(in == null){
-            throw new ParameterException("收藏不存在");
-        }
-        int result = delete(userCollectMapper, id);
-        return result > 0;
-    }
-
-    public UserCollect get(Number id){
-        UserCollect in = one(userCollectMapper, id);
-
-        if(in == null){
-            throw new ParameterException("收藏不存在");
-        }
-        return in;
-    }
-
-    public Page<UserCollect> select(int page, int pageSize){
-        return select(userCollectMapper, page, pageSize);
-    }
-
-    public List<UserCollect> select(Collection ids){
-        return select(userCollectMapper, ids);
-    }
-
-}

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

@@ -2,11 +2,10 @@ package com.qxgmat.service.inline;
 
 import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.PageResult;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
-import com.qxgmat.data.dao.UserCollectMapper;
 import com.qxgmat.data.dao.UserQuestionMapper;
-import com.qxgmat.data.dao.entity.UserCollect;
 import com.qxgmat.data.dao.entity.UserQuestion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -23,6 +22,17 @@ public class UserQuestionService extends AbstractService {
     @Resource
     private UserQuestionMapper userQuestionMapper;
 
+    /**
+     * 用户错题记录:相同题目的最后一次做题记录及其编号
+     * @param page
+     * @param size
+     * @param userId
+     * @return
+     */
+    public PageResult<UserQuestion> listError(int page, int size, Integer userId){
+        return new PageResult<>(null, 0);
+    }
+
     public UserQuestion add(UserQuestion question){
         int result = insert(userQuestionMapper, question);
         question = one(userQuestionMapper, question.getId());

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

@@ -5,6 +5,7 @@ import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
 import com.qxgmat.data.dao.UserQuestionMapper;
 import com.qxgmat.data.dao.UserReportMapper;
 import com.qxgmat.data.dao.entity.UserQuestion;
@@ -17,8 +18,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class UserReportService extends AbstractService {
@@ -29,6 +29,34 @@ public class UserReportService extends AbstractService {
     @Resource
     private UserReportRelationMapper userReportRelationMapper;
 
+    /**
+     * 获取所属组卷的所有报告
+     * @param paperIds
+     * @return
+     */
+    public Map<Object, Collection<UserReport>> mapByPaper(Collection paperIds){
+        Map<Object, Collection<UserReport>> relationMap = new HashMap<>();
+        if(paperIds.size() == 0) return relationMap;
+        Example example = new Example(UserReport.class);
+        example.and(
+                example.createCriteria()
+                        .andIn("paperId", paperIds)
+        );
+        List<UserReport> userClassList = select(userReportMapper, example);
+        if(userClassList.size() == 0) return relationMap;
+        for(UserReport row: userClassList){
+            List<UserReport> l;
+            Number paperId = row.getPaperId();
+            if(!relationMap.containsKey(paperId)){
+                l = new ArrayList<>();
+                relationMap.put(paperId, l);
+            }else{
+                l = (List<UserReport>)relationMap.get(paperId);
+            }
+            l.add(row);
+        }
+        return relationMap;
+    }
 
     public UserReport add(UserReport report){
         int result = insert(userReportMapper, report);

+ 25 - 0
server/tools/src/main/java/com/nuliji/tools/PageResult.java

@@ -0,0 +1,25 @@
+package com.nuliji.tools;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/7.
+ */
+
+public class PageResult<T> extends ArrayList<T> implements Serializable {
+    private long total;
+
+    public PageResult(Collection<T> list, long total){
+        super(list);
+        this.total = total;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+}