Procházet zdrojové kódy

feat(server): 收藏、问答、笔记

Go před 5 roky
rodič
revize
80484211ff
62 změnil soubory, kde provedl 927 přidání a 452 odebrání
  1. 2 2
      front/project/admin/routes/subject/question/page.js
  2. 12 0
      front/project/admin/stores/user.js
  3. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/FeedbackErrorMapper.java
  4. 0 7
      server/data/src/main/java/com/qxgmat/data/dao/UserAskMapper.java
  5. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserAskQuestionMapper.java
  6. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserFeedbackErrorMapper.java
  7. 42 7
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserAsk.java
  8. 76 32
      server/data/src/main/java/com/qxgmat/data/dao/entity/FeedbackError.java
  9. 16 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaperQuestion.java
  10. 12 12
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java
  11. 6 5
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskMapper.xml
  12. 6 5
      server/data/src/main/java/com/qxgmat/data/dao/mapping/FeedbackErrorMapper.xml
  13. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperQuestionMapper.xml
  14. 2 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml
  15. 4 0
      server/data/src/main/java/com/qxgmat/data/relation/QuestionNoRelationMapper.java
  16. 3 3
      server/data/src/main/java/com/qxgmat/data/relation/UserAskRelationMapper.java
  17. 18 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserReportRelation.java
  18. 13 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionNoRelationMapper.xml
  19. 2 2
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskRelationMapper.xml
  20. 20 0
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/ServiceController.java
  21. 15 16
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserAskController.java
  22. 20 10
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/FeedbackErrorController.java
  23. 49 5
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  24. 33 7
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  25. 28 7
      server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java
  26. 2 2
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserAskExtendDto.java
  27. 2 3
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/UserAskDto.java
  28. 2 2
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/UserAskOrderDto.java
  29. 4 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/UserServiceBindDto.java
  30. 2 3
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserAskDetailDto.java
  31. 2 6
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserAskListDto.java
  32. 8 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserFeedbackErrorDetailDto.java
  33. 3 7
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/FeedbackErrorListDto.java
  34. 27 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/SentenceQuestionBaseExtendDto.java
  35. 1 1
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/SentenceQuestionExtendDto.java
  36. 39 0
      server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperExtendDto.java
  37. 38 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserAskDto.java
  38. 0 9
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserCollectDto.java
  39. 27 0
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserFeedbackErrorDto.java
  40. 0 9
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserNoteDto.java
  41. 1 1
      server/gateway-api/src/main/java/com/qxgmat/dto/request/UserCollectBindDto.java
  42. 10 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserQuestionBaseDto.java
  43. 11 0
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserReportDto.java
  44. 8 7
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionBaseDto.java
  45. 7 4
      server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionDetailDto.java
  46. 8 0
      server/gateway-api/src/main/java/com/qxgmat/service/ManagerService.java
  47. 25 13
      server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java
  48. 1 1
      server/gateway-api/src/main/java/com/qxgmat/service/UserPaperService.java
  49. 1 4
      server/gateway-api/src/main/java/com/qxgmat/service/UsersService.java
  50. 21 6
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java
  51. 0 70
      server/gateway-api/src/main/java/com/qxgmat/service/inline/FeedbackErrorService.java
  52. 38 11
      server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionNoService.java
  53. 20 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionService.java
  54. 1 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/RankService.java
  55. 149 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAskQuestionService.java
  56. 0 134
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAskService.java
  57. 68 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserFeedbackErrorService.java
  58. 1 0
      server/gateway-api/src/main/java/com/qxgmat/service/inline/UserReportService.java
  59. 2 2
      server/tools/src/main/java/com/nuliji/tools/AbstractService.java
  60. 1 1
      server/tools/src/main/java/com/nuliji/tools/mybatis/handler/NativeJsonHandler.java
  61. 1 1
      server/tools/src/main/java/com/nuliji/tools/mybatis/handler/IntegerArrayWithJsonHandler.java
  62. 1 8
      server/tools/src/main/java/com/nuliji/tools/mybatis/handler/StringArrayWithJsonHandler.java

+ 2 - 2
front/project/admin/routes/subject/question/page.js

@@ -136,10 +136,10 @@ export default class extends Page {
             break;
           default:
         }
-        data.no = `${nodeString}-${data.no}`;
         data.questionId = data.id || 0;
         delete data.id;
         data.no = data.questionNo;
+        data.no = `${nodeString}-${data.no}`;
         delete data.questionNo;
         Question.addNo(data).then((result) => {
           const { questionNos = [] } = this.state;
@@ -596,7 +596,7 @@ export default class extends Page {
         dataSource={keys || []}
         handle={'.icon'}
         onMove={(oldIndex, newIndex) => {
-          this.order(index, oldIndex, newIndex);
+          this.orderQuestion(index, oldIndex, newIndex);
         }}
         renderItem={(k) => (
           <List.Item actions={[<Icon type='bars' className='icon' />]}>

+ 12 - 0
front/project/admin/stores/user.js

@@ -37,6 +37,18 @@ export default class UserStore extends BaseStore {
     return this.apiGet('/user/ask/detail', params);
   }
 
+  listFeedbackError(params) {
+    return this.apiGet('/user/feedback_error/list', params);
+  }
+
+  editFeedbackError(params) {
+    return this.apiPut('/user/feedback_error/edit', params);
+  }
+
+  getFeedbackError(params) {
+    return this.apiGet('/user/feedback_error/detail', params);
+  }
+
   listPreview(params) {
     return this.apiGet('/user/preview/list', params);
   }

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

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

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

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

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

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

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

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

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

@@ -4,8 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import javax.persistence.*;
 
-@Table(name = "user_ask")
-public class UserAsk implements Serializable {
+@Table(name = "user_ask_question")
+public class UserAskQuestion implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -18,6 +18,12 @@ public class UserAsk implements Serializable {
     private Integer userId;
 
     /**
+     * 模块:题目模块
+     */
+    @Column(name = "`module`")
+    private String module;
+
+    /**
      * 题目id
      */
     @Column(name = "`question_id`")
@@ -118,6 +124,24 @@ public class UserAsk implements Serializable {
     }
 
     /**
+     * 获取模块:题目模块
+     *
+     * @return module - 模块:题目模块
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * 设置模块:题目模块
+     *
+     * @param module 模块:题目模块
+     */
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
      * 获取题目id
      *
      * @return question_id - 题目id
@@ -333,6 +357,7 @@ public class UserAsk implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
+        sb.append(", module=").append(module);
         sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
         sb.append(", target=").append(target);
@@ -349,15 +374,15 @@ public class UserAsk implements Serializable {
         return sb.toString();
     }
 
-    public static UserAsk.Builder builder() {
-        return new UserAsk.Builder();
+    public static UserAskQuestion.Builder builder() {
+        return new UserAskQuestion.Builder();
     }
 
     public static class Builder {
-        private UserAsk obj;
+        private UserAskQuestion obj;
 
         public Builder() {
-            this.obj = new UserAsk();
+            this.obj = new UserAskQuestion();
         }
 
         /**
@@ -379,6 +404,16 @@ public class UserAsk implements Serializable {
         }
 
         /**
+         * 设置模块:题目模块
+         *
+         * @param module 模块:题目模块
+         */
+        public Builder module(String module) {
+            obj.setModule(module);
+            return this;
+        }
+
+        /**
          * 设置题目id
          *
          * @param questionId 题目id
@@ -494,7 +529,7 @@ public class UserAsk implements Serializable {
             return this;
         }
 
-        public UserAsk build() {
+        public UserAskQuestion build() {
             return this.obj;
         }
     }

+ 76 - 32
server/data/src/main/java/com/qxgmat/data/dao/entity/FeedbackError.java

@@ -4,8 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import javax.persistence.*;
 
-@Table(name = "feedback_error")
-public class FeedbackError implements Serializable {
+@Table(name = "user_feedback_error")
+public class UserFeedbackError implements Serializable {
     @Id
     @Column(name = "`id`")
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -18,14 +18,23 @@ public class FeedbackError implements Serializable {
     private Integer userId;
 
     /**
+     * 模块:题目模块
+     */
+    @Column(name = "`module`")
+    private String module;
+
+    /**
+     * 题目id
+     */
+    @Column(name = "`question_id`")
+    private Integer questionId;
+
+    /**
      * 题目编号id
      */
     @Column(name = "`question_no_id`")
     private Integer questionNoId;
 
-    @Column(name = "`type`")
-    private Integer type;
-
     @Column(name = "`create_time`")
     private Date createTime;
 
@@ -67,35 +76,57 @@ public class FeedbackError implements Serializable {
     }
 
     /**
-     * 获取题目编号id
+     * 获取模块:题目模块
      *
-     * @return question_no_id - 题目编号id
+     * @return module - 模块:题目模块
      */
-    public Integer getQuestionNoId() {
-        return questionNoId;
+    public String getModule() {
+        return module;
     }
 
     /**
-     * 设置题目编号id
+     * 设置模块:题目模块
      *
-     * @param questionNoId 题目编号id
+     * @param module 模块:题目模块
      */
-    public void setQuestionNoId(Integer questionNoId) {
-        this.questionNoId = questionNoId;
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
+     * 获取题目id
+     *
+     * @return question_id - 题目id
+     */
+    public Integer getQuestionId() {
+        return questionId;
+    }
+
+    /**
+     * 设置题目id
+     *
+     * @param questionId 题目id
+     */
+    public void setQuestionId(Integer questionId) {
+        this.questionId = questionId;
     }
 
     /**
-     * @return type
+     * 获取题目编号id
+     *
+     * @return question_no_id - 题目编号id
      */
-    public Integer getType() {
-        return type;
+    public Integer getQuestionNoId() {
+        return questionNoId;
     }
 
     /**
-     * @param type
+     * 设置题目编号id
+     *
+     * @param questionNoId 题目编号id
      */
-    public void setType(Integer type) {
-        this.type = type;
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
     }
 
     /**
@@ -134,23 +165,24 @@ public class FeedbackError implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
+        sb.append(", module=").append(module);
+        sb.append(", questionId=").append(questionId);
         sb.append(", questionNoId=").append(questionNoId);
-        sb.append(", type=").append(type);
         sb.append(", createTime=").append(createTime);
         sb.append(", content=").append(content);
         sb.append("]");
         return sb.toString();
     }
 
-    public static FeedbackError.Builder builder() {
-        return new FeedbackError.Builder();
+    public static UserFeedbackError.Builder builder() {
+        return new UserFeedbackError.Builder();
     }
 
     public static class Builder {
-        private FeedbackError obj;
+        private UserFeedbackError obj;
 
         public Builder() {
-            this.obj = new FeedbackError();
+            this.obj = new UserFeedbackError();
         }
 
         /**
@@ -172,20 +204,32 @@ public class FeedbackError implements Serializable {
         }
 
         /**
-         * 设置题目编号id
+         * 设置模块:题目模块
          *
-         * @param questionNoId 题目编号id
+         * @param module 模块:题目模块
          */
-        public Builder questionNoId(Integer questionNoId) {
-            obj.setQuestionNoId(questionNoId);
+        public Builder module(String module) {
+            obj.setModule(module);
+            return this;
+        }
+
+        /**
+         * 设置题目id
+         *
+         * @param questionId 题目id
+         */
+        public Builder questionId(Integer questionId) {
+            obj.setQuestionId(questionId);
             return this;
         }
 
         /**
-         * @param type
+         * 设置题目编号id
+         *
+         * @param questionNoId 题目编号id
          */
-        public Builder type(Integer type) {
-            obj.setType(type);
+        public Builder questionNoId(Integer questionNoId) {
+            obj.setQuestionNoId(questionNoId);
             return this;
         }
 
@@ -205,7 +249,7 @@ public class FeedbackError implements Serializable {
             return this;
         }
 
-        public FeedbackError build() {
+        public UserFeedbackError build() {
             return this.obj;
         }
     }

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

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

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

@@ -66,8 +66,8 @@ public class UserReport implements Serializable {
     /**
      * 正确题目数
      */
-    @Column(name = "`correct_number`")
-    private Integer correctNumber;
+    @Column(name = "`user_correct`")
+    private Integer userCorrect;
 
     /**
      * 完成答题时间
@@ -267,19 +267,19 @@ public class UserReport implements Serializable {
     /**
      * 获取正确题目数
      *
-     * @return correct_number - 正确题目数
+     * @return user_correct - 正确题目数
      */
-    public Integer getCorrectNumber() {
-        return correctNumber;
+    public Integer getUserCorrect() {
+        return userCorrect;
     }
 
     /**
      * 设置正确题目数
      *
-     * @param correctNumber 正确题目数
+     * @param userCorrect 正确题目数
      */
-    public void setCorrectNumber(Integer correctNumber) {
-        this.correctNumber = correctNumber;
+    public void setUserCorrect(Integer userCorrect) {
+        this.userCorrect = userCorrect;
     }
 
     /**
@@ -366,7 +366,7 @@ public class UserReport implements Serializable {
         sb.append(", time=").append(time);
         sb.append(", userNumber=").append(userNumber);
         sb.append(", userTime=").append(userTime);
-        sb.append(", correctNumber=").append(correctNumber);
+        sb.append(", userCorrect=").append(userCorrect);
         sb.append(", finishTime=").append(finishTime);
         sb.append(", setting=").append(setting);
         sb.append(", detail=").append(detail);
@@ -485,10 +485,10 @@ public class UserReport implements Serializable {
         /**
          * 设置正确题目数
          *
-         * @param correctNumber 正确题目数
+         * @param userCorrect 正确题目数
          */
-        public Builder correctNumber(Integer correctNumber) {
-            obj.setCorrectNumber(correctNumber);
+        public Builder userCorrect(Integer userCorrect) {
+            obj.setUserCorrect(userCorrect);
             return this;
         }
 

+ 6 - 5
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskMapper.xml

@@ -1,12 +1,13 @@
 <?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.UserAskMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserAsk">
+<mapper namespace="com.qxgmat.data.dao.UserAskQuestionMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserAskQuestion">
     <!--
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="module" jdbcType="VARCHAR" property="module" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="target" jdbcType="VARCHAR" property="target" />
@@ -18,7 +19,7 @@
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserAsk">
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserAskQuestion">
     <!--
       WARNING - @mbg.generated
     -->
@@ -29,8 +30,8 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `question_id`, `question_no_id`, `target`, `answer_status`, `manager_id`, 
-    `show_status`, `answer_time`, `order`, `create_time`, `update_time`
+    `id`, `user_id`, `module`, `question_id`, `question_no_id`, `target`, `answer_status`, 
+    `manager_id`, `show_status`, `answer_time`, `order`, `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 6 - 5
server/data/src/main/java/com/qxgmat/data/dao/mapping/FeedbackErrorMapper.xml

@@ -1,17 +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.FeedbackErrorMapper">
-  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.FeedbackError">
+<mapper namespace="com.qxgmat.data.dao.UserFeedbackErrorMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserFeedbackError">
     <!--
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
-    <result column="type" jdbcType="INTEGER" property="type" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.FeedbackError">
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserFeedbackError">
     <!--
       WARNING - @mbg.generated
     -->
@@ -21,7 +22,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `question_no_id`, `type`, `create_time`
+    `id`, `user_id`, `module`, `question_id`, `question_no_id`, `create_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--

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

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

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

@@ -15,7 +15,7 @@
     <result column="time" jdbcType="INTEGER" property="time" />
     <result column="user_number" jdbcType="INTEGER" property="userNumber" />
     <result column="user_time" jdbcType="INTEGER" property="userTime" />
-    <result column="correct_number" jdbcType="INTEGER" property="correctNumber" />
+    <result column="user_correct" jdbcType="INTEGER" property="userCorrect" />
     <result column="finish_time" jdbcType="TIMESTAMP" property="finishTime" />
     <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" />
@@ -26,7 +26,7 @@
       WARNING - @mbg.generated
     -->
     `id`, `user_id`, `paper_id`, `module`, `module_id`, `question_no_ids`, `question_number`, 
-    `time`, `user_number`, `user_time`, `correct_number`, `finish_time`, `setting`, `detail`, 
+    `time`, `user_number`, `user_time`, `user_correct`, `finish_time`, `setting`, `detail`, 
     `create_time`
   </sql>
 </mapper>

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

@@ -17,4 +17,8 @@ public interface QuestionNoRelationMapper {
             @Param("time") Integer time,
             @Param("current") Integer current
     );
+
+    List<QuestionNo> searchStem(
+            @Param("stem") String stem
+    );
 }

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

@@ -1,6 +1,6 @@
 package com.qxgmat.data.relation;
 
-import com.qxgmat.data.dao.entity.UserAsk;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -8,7 +8,7 @@ import java.util.List;
 /**
  * Created by gaojie on 2017/11/9.
  */
-public interface UserAskRelationMapper {
+public interface UserAskQuestionRelationMapper {
     void adjust(
             @Param("questionNoId") Number questionNoId,
             @Param("order") Integer order,
@@ -16,7 +16,7 @@ public interface UserAskRelationMapper {
             @Param("flag") String flag
     );
 
-    List<UserAsk> listWithUser(
+    List<UserAskQuestion> listWithUser(
             @Param("type") String type,
             @Param("category") Number category,
             @Param("userId") Number userId,

+ 18 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserReportRelation.java

@@ -0,0 +1,18 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.*;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public class UserReportRelation extends UserReport {
+    private UserPaper paper;
+
+    public UserPaper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(UserPaper paper) {
+        this.paper = paper;
+    }
+}

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

@@ -25,4 +25,17 @@
     WHERE `id` = #{id, jdbcType=VARCHAR}
   </update>
 
+  <!--
+    按题干搜索相似度80%以上的
+  -->
+  <select id="searchStem" resultMap="IdMap">
+    select
+    <include refid="Id_Column_List" />
+    from `question_no` qn
+    left join `question` q on q.`id` = qn.`question_id`
+      and MATCH (q.`description`) AGAINST (#{stem, jdbcType=VARCHAR} IN NATURAL LANGUAGE MODE) > 0.8
+    where
+      q.`id` != null
+  </select>
+
 </mapper>

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskRelationMapper.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.UserAskRelationMapper">
-  <resultMap id="IdMap" type="com.qxgmat.data.dao.entity.UserAsk">
+<mapper namespace="com.qxgmat.data.relation.UserAskQuestionRelationMapper">
+  <resultMap id="IdMap" type="com.qxgmat.data.dao.entity.UserAskQuestion">
     <!--
       WARNING - @mbg.generated
     -->

+ 20 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/admin/ServiceController.java

@@ -1,11 +1,31 @@
 package com.qxgmat.controller.admin;
 
+import com.nuliji.tools.Response;
+import com.nuliji.tools.ResponseHelp;
+import com.qxgmat.dto.admin.request.UserServiceBindDto;
+import com.qxgmat.service.inline.ManagerLogService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+
 @RestController("AdminServiceController")
 @RequestMapping("/admin/service")
 public class ServiceController {
+    @Autowired
+    private ManagerLogService managerLogService;
+
 
+    @RequestMapping(value = "/bind", method = RequestMethod.PUT)
+    @ApiOperation(value = "绑定用户服务", httpMethod = "PUT")
+    public Response<Boolean> edit(@RequestBody @Validated UserServiceBindDto dto, HttpServletRequest request) {
 
+        managerLogService.log(request);
+        return ResponseHelp.success(true);
+    }
 }

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

@@ -12,7 +12,6 @@ import com.qxgmat.data.constants.enums.user.MoneyRange;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.dto.admin.extend.*;
 import com.qxgmat.dto.admin.request.UserAskDto;
-import com.qxgmat.dto.admin.request.UserAskOrderDto;
 import com.qxgmat.dto.admin.response.UserAskDetailDto;
 import com.qxgmat.dto.admin.response.UserAskListDto;
 import com.qxgmat.help.ShiroHelp;
@@ -21,7 +20,7 @@ import com.qxgmat.service.UsersService;
 import com.qxgmat.service.inline.ManagerLogService;
 import com.qxgmat.service.inline.QuestionNoService;
 import com.qxgmat.service.inline.QuestionService;
-import com.qxgmat.service.inline.UserAskService;
+import com.qxgmat.service.inline.UserAskQuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,7 +44,7 @@ public class UserAskController {
     private ShiroHelp shiroHelp;
 
     @Autowired
-    private UserAskService userAskService;
+    private UserAskQuestionService userAskQuestionService;
 
     @Autowired
     private QuestionService questionService;
@@ -62,7 +61,7 @@ public class UserAskController {
     @RequestMapping(value = "/edit", method = RequestMethod.PUT)
     @ApiOperation(value = "修改提问信息", httpMethod = "PUT")
     public Response<Boolean> edit(@RequestBody @Validated UserAskDto dto, HttpServletRequest request) {
-        UserAsk entity = Transform.dtoToEntity(dto);
+        UserAskQuestion entity = Transform.dtoToEntity(dto);
         if(!entity.getAnswer().isEmpty()){
 
             entity.setAnswerTime(new Date());
@@ -71,10 +70,10 @@ public class UserAskController {
 
         Manager manager = shiroHelp.getLoginManager();
         entity.setManagerId(manager.getId());
-        entity = userAskService.edit(entity);
-        userAskService.updateOrder(dto.getOther());
+        entity = userAskQuestionService.edit(entity);
 
         // 更新回答排序
+        userAskQuestionService.updateOrder(dto.getOther());
 
         managerLogService.log(request);
         return ResponseHelp.success(true);
@@ -83,14 +82,14 @@ public class UserAskController {
 //    @RequestMapping(value = "/order", method = RequestMethod.PUT)
 //    @ApiOperation(value = "修改提问排序", httpMethod = "PUT")
 //    public Response<Boolean> order(@RequestBody @Validated UserAskOrderDto dto, HttpServletRequest request) {
-//        userAskService.order(dto.getId(), dto.getOrder());
+//        userAskQuestionService.order(dto.getId(), dto.getOrder());
 //        return ResponseHelp.success(true);
 //    }
 
-    @RequestMapping(value = "/detail", method = RequestMethod.PUT)
-    @ApiOperation(value = "修改提问排序", httpMethod = "PUT")
+    @RequestMapping(value = "/detail", method = RequestMethod.GET)
+    @ApiOperation(value = "提问详情", httpMethod = "GET")
     public Response<UserAskDetailDto> detail(@RequestParam int id, HttpServletRequest request) {
-        UserAsk entity = userAskService.get(id);
+        UserAskQuestion entity = userAskQuestionService.get(id);
         UserAskDetailDto dto = Transform.convert(entity, UserAskDetailDto.class);
 
         if (entity.getManagerId() != null && entity.getManagerId() > 0){
@@ -109,7 +108,7 @@ public class UserAskController {
         dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
 
         // 所有回答
-        List<UserAsk> userAskList = userAskService.listByQuestion(entity.getQuestionId(), null);
+        List<UserAskQuestion> userAskList = userAskQuestionService.listByQuestion(entity.getQuestionId(), null);
         dto.setOthers(Transform.convert(userAskList, UserAskExtendDto.class));
         return ResponseHelp.success(dto);
     }
@@ -130,26 +129,26 @@ public class UserAskController {
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {
-        Page<UserAsk> p = userAskService.listWithUser(page, size, type, category, userId, questionNoId, AskTarget.ValueOf(target), AskStatus.ValueOf(status), showStatus, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
+        Page<UserAskQuestion> p = userAskQuestionService.listWithUser(page, size, type, category, userId, questionNoId, AskTarget.ValueOf(target), AskStatus.ValueOf(status), showStatus, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
         List<UserAskListDto> pr = Transform.convert(p, UserAskListDto.class);
 
         // 绑定题目
-        Collection questionIds = Transform.getIds(p, UserAsk.class, "questionId");
+        Collection questionIds = Transform.getIds(p, UserAskQuestion.class, "questionId");
         List<Question> questionList = questionService.select(questionIds);
         Transform.combine(pr, questionList, UserAskListDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
 
         // 绑定题目编号
-        Collection questionNoIds = Transform.getIds(p, UserAsk.class, "questionNoId");
+        Collection questionNoIds = Transform.getIds(p, UserAskQuestion.class, "questionNoId");
         List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
         Transform.combine(pr, questionNoList, UserAskListDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
 
         // 绑定用户
-        Collection userIds = Transform.getIds(p, UserAsk.class, "userId");
+        Collection userIds = Transform.getIds(p, UserAskQuestion.class, "userId");
         List<User> userList = usersService.select(userIds);
         Transform.combine(pr, userList, UserAskListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
 
         // 绑定管理员
-        Collection managerIds = Transform.getIds(p, UserAsk.class, "managerId");
+        Collection managerIds = Transform.getIds(p, UserAskQuestion.class, "managerId");
         List<Manager> managerList = managerService.select(managerIds);
         Transform.combine(pr, managerList, UserAskListDto.class, "managerId", "manager", Manager.class, "id", ManagerExtendDto.class);
 

+ 20 - 10
server/gateway-api/src/main/java/com/qxgmat/controller/admin/FeedbackErrorController.java

@@ -7,10 +7,11 @@ import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.dto.admin.extend.UserExtendDto;
-import com.qxgmat.dto.admin.response.FeedbackErrorListDto;
+import com.qxgmat.dto.admin.response.UserFeedbackErrorDetailDto;
+import com.qxgmat.dto.admin.response.UserFeedbackErrorListDto;
 import com.qxgmat.dto.admin.response.UserAskListDto;
 import com.qxgmat.service.UsersService;
-import com.qxgmat.service.inline.FeedbackErrorService;
+import com.qxgmat.service.inline.UserFeedbackErrorService;
 import com.qxgmat.service.inline.ManagerLogService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -18,40 +19,49 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.util.Collection;
 import java.util.List;
 
 @RestController("AdminFeedbackErrorController")
-@RequestMapping("/admin/feedback_error")
+@RequestMapping("/admin/user/feedback_error")
 @Api(tags = "用户勘误接口", description = "用户勘误相关", produces = MediaType.APPLICATION_JSON_VALUE)
-public class FeedbackErrorController {
+public class UserFeedbackErrorController {
     @Autowired
     private ManagerLogService managerLogService;
 
     @Autowired
-    private FeedbackErrorService feedbackErrorService;
+    private UserFeedbackErrorService userFeedbackErrorService;
 
     @Autowired
     private UsersService usersService;
 
 
+    @RequestMapping(value = "/detail", method = RequestMethod.GET)
+    @ApiOperation(value = "修改提问排序", httpMethod = "GET")
+    public Response<UserFeedbackErrorDetailDto> detail(@RequestParam int id, HttpServletRequest request) {
+        UserFeedbackError entity = userFeedbackErrorService.get(id);
+        UserFeedbackErrorDetailDto dto = Transform.convert(entity, UserFeedbackErrorDetailDto.class);
+
+        return ResponseHelp.success(dto);
+    }
+
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ApiOperation(value = "勘误列表", httpMethod = "GET")
-    public Response<PageMessage<FeedbackErrorListDto>> list(
+    public Response<PageMessage<UserFeedbackErrorListDto>> list(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             HttpSession session) {
-        Page<FeedbackError> p = feedbackErrorService.select(page, size);
-        List<FeedbackErrorListDto> pr = Transform.convert(p, FeedbackErrorListDto.class);
+        Page<UserFeedbackError> p = userFeedbackErrorService.select(page, size);
+        List<UserFeedbackErrorListDto> pr = Transform.convert(p, UserFeedbackErrorListDto.class);
 
         // 绑定用户
-        Collection userIds = Transform.getIds(p, UserAsk.class, "userId");
+        Collection userIds = Transform.getIds(p, UserAskQuestion.class, "userId");
         List<User> userList = usersService.select(userIds);
         List<UserExtendDto> userExtendDtoList = Transform.convert(userList, UserExtendDto.class);
         Transform.combine(pr, userExtendDtoList, UserAskListDto.class, "userId", "user", UserExtendDto.class, "id");
 
-
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
 }

+ 49 - 5
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -71,6 +71,9 @@ public class MyController {
     private StatDayService statDayService;
 
     @Autowired
+    private QuestionNoService questionNoService;
+
+    @Autowired
     private UserServiceService userServiceService;
 
     @Autowired
@@ -80,6 +83,12 @@ public class MyController {
     private UserNoteQuestionService userNoteQuestionService;
 
     @Autowired
+    private UserAskQuestionService userAskQuestionService;
+
+    @Autowired
+    private UserFeedbackErrorService userFeedbackErrorService;
+
+    @Autowired
     private UserQuestionService userQuestionService;
 
     @Autowired
@@ -219,23 +228,27 @@ public class MyController {
     public Response<Boolean> addCollect(@RequestBody @Validated UserCollectDto dto)  {
         UserCollectQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
-        userCollectQuestionService.addQuestion(user.getId(), QuestionModule.ValueOf(entity.getModule()), entity.getQuestionNoId());
+        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+        entity.setQuestionId(questionNo.getQuestionId());
+        entity.setModule(questionNo.getModule());
+        entity.setUserId(user.getId());
+        userCollectQuestionService.addQuestion(entity);
 
         return ResponseHelp.success(true);
     }
 
     @RequestMapping(value = "/collect", method = RequestMethod.DELETE)
     @ApiOperation(value = "移除收藏", notes = "移除收藏", httpMethod = "DELETE")
-    public Response<Boolean> deleteCollect(String module, int id)  {
+    public Response<Boolean> deleteCollect(Integer questionNoId)  {
         User user = (User) shiroHelp.getLoginUser();
-        Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), QuestionModule.ValueOf(module), id);
+        Boolean result = userCollectQuestionService.deleteQuestion(user.getId(), questionNoId);
 
         return ResponseHelp.success(result);
     }
 
     @RequestMapping(value = "/collect/bind", method = RequestMethod.POST)
     @ApiOperation(value = "收藏组卷", notes = "收藏组卷", httpMethod = "POST")
-    public Response<Boolean> bindCollect(@RequestBody @Validated UserCollectBindDto dto)  {
+    public Response<Boolean> bindCollect(@RequestBody @Validated UserQuestionIdsDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         return ResponseHelp.success(true);
@@ -291,7 +304,7 @@ public class MyController {
 
     @RequestMapping(value = "/error/clear", method = RequestMethod.POST)
     @ApiOperation(value = "错题移除", notes = "错题移除", httpMethod = "POST")
-    public Response<Boolean> clearError(@RequestBody @Validated UserCollectBindDto dto)  {
+    public Response<Boolean> clearError(@RequestBody @Validated UserQuestionIdsDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         return ResponseHelp.success(true);
@@ -303,6 +316,9 @@ public class MyController {
         UserNoteQuestion entity = Transform.dtoToEntity(dto);
         User user = (User) shiroHelp.getLoginUser();
         entity.setUserId(user.getId());
+        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+        entity.setQuestionId(questionNo.getQuestionId());
+        entity.setModule(questionNo.getModule());
         userNoteQuestionService.update(entity);
 
         return ResponseHelp.success(true);
@@ -357,4 +373,32 @@ public class MyController {
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
+
+    @RequestMapping(value = "/ask", method = RequestMethod.POST)
+    @ApiOperation(value = "添加提问", notes = "添加提问", httpMethod = "POST")
+    public Response<Boolean> addAsk(@RequestBody @Validated UserAskDto dto)  {
+        UserAskQuestion entity = Transform.dtoToEntity(dto);
+        User user = (User) shiroHelp.getLoginUser();
+        entity.setUserId(user.getId());
+        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+        entity.setQuestionId(questionNo.getQuestionId());
+        entity.setModule(questionNo.getModule());
+        userAskQuestionService.add(entity);
+
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/feedback/error", method = RequestMethod.POST)
+    @ApiOperation(value = "添加勘误", notes = "添加勘误", httpMethod = "POST")
+    public Response<Boolean> addFeedbackError(@RequestBody @Validated UserFeedbackErrorDto dto)  {
+        UserFeedbackError entity = Transform.dtoToEntity(dto);
+        User user = (User) shiroHelp.getLoginUser();
+        entity.setUserId(user.getId());
+        QuestionNo questionNo = questionNoService.get(dto.getQuestionNoId());
+        entity.setQuestionId(questionNo.getQuestionId());
+        entity.setModule(questionNo.getModule());
+        userFeedbackErrorService.add(entity);
+
+        return ResponseHelp.success(true);
+    }
 }

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

@@ -10,6 +10,9 @@ import com.qxgmat.data.constants.enums.module.PayModule;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.UserExercisePaperRelation;
 import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
+import com.qxgmat.data.relation.entity.UserReportRelation;
+import com.qxgmat.dto.extend.QuestionExtendDto;
+import com.qxgmat.dto.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.extend.UserExercisePaperExtendDto;
 import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
 import com.qxgmat.dto.request.*;
@@ -17,6 +20,7 @@ import com.qxgmat.dto.response.*;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.service.ExercisePaperService;
 import com.qxgmat.service.HomeworkPreviewService;
+import com.qxgmat.service.UserCollectQuestionService;
 import com.qxgmat.service.UserQuestionService;
 import com.qxgmat.service.extend.QuestionFlowService;
 import com.qxgmat.service.inline.*;
@@ -50,9 +54,15 @@ public class QuestionController {
     private QuestionNoService questionNoService;
 
     @Autowired
+    private QuestionService questionService;
+
+    @Autowired
     private UserQuestionService userQuestionService;
 
     @Autowired
+    private UserCollectQuestionService userCollectQuestionService;
+
+    @Autowired
     private UserClassService userClassService;
 
     @Autowired
@@ -171,6 +181,8 @@ public class QuestionController {
             HttpSession session) {
         Page<ExercisePaper> p = null;
 
+        // todo
+
         return ResponseHelp.success(p, page, size, p.getTotal());
     }
 
@@ -182,6 +194,8 @@ public class QuestionController {
             HttpSession session) {
         Page<ExercisePaper> p = null;
 
+        // todo
+
         return ResponseHelp.success(p, page, size, p.getTotal());
     }
 
@@ -211,18 +225,22 @@ public class QuestionController {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
         setting.put("disorder", dto.getDisorder());
-        UserReport report = questionFlowService.start(user.getId(), PaperModule.HOMEWORK_PREVIEW, dto.getPaperId(), setting);
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.HOMEWORK_PREVIEW, dto.getPaperId(), setting);
 
-        return ResponseHelp.success(Transform.convert(report, UserReportDto.class));
+        UserReportDto userReportDto = Transform.convert(report, UserReportDto.class);
+
+        return ResponseHelp.success(userReportDto);
     }
 
     @RequestMapping(value = "/continue", method = RequestMethod.POST)
     @ApiOperation(value = "继续做题", notes = "获取报告信息", httpMethod = "POST")
     public Response<UserReportDto> continueReport(@RequestBody @Validated ReportContinueDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
-        UserReport report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
+        UserReportRelation report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
 
-        return ResponseHelp.success(Transform.convert(report, UserReportDto.class));
+        UserReportDto userReportDto = Transform.convert(report, UserReportDto.class);
+
+        return ResponseHelp.success(userReportDto);
     }
 
     @RequestMapping(value = "/next", method = RequestMethod.POST)
@@ -232,14 +250,22 @@ public class QuestionController {
         // 根据对应paper获取,以及设定的setting获取下一题
 
         UserQuestion userQuestion = questionFlowService.next(user.getId(), dto.getUserReportId());
+        UserQuestionBaseDto baseDto = Transform.convert(userQuestion, UserQuestionBaseDto.class);
 
         // 绑定questionNos
+        baseDto.setQuestionNos(Transform.convert(questionNoService.listByQuestion(userQuestion.getQuestionId()), QuestionNoExtendDto.class));
 
         // 绑定question
+        baseDto.setQuestion(Transform.convert(questionService.get(userQuestion.getQuestionId()), QuestionExtendDto.class));
+
+        // 绑定questionNo
+        baseDto.setQuestionNo(Transform.convert(questionNoService.get(userQuestion.getQuestionNoId()), QuestionNoExtendDto.class));
 
         // 绑定collect
+        baseDto.setCollect(userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId()) != null);
 
-        return ResponseHelp.success(null);
+
+        return ResponseHelp.success(baseDto);
     }
 
     @RequestMapping(value = "/submit", method = RequestMethod.POST)
@@ -261,11 +287,11 @@ public class QuestionController {
 
     @RequestMapping(value = "/restart", method = RequestMethod.POST)
     @ApiOperation(value = "重置考试", notes = "重置考试", httpMethod = "POST")
-    public Response<User> restart(@RequestBody @Validated PaperRestartDto dto)  {
+    public Response<Boolean> restart(@RequestBody @Validated PaperRestartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         questionFlowService.restart(dto.getUserPaperId(), user.getId());
 
-        return ResponseHelp.success(null);
+        return ResponseHelp.success(true);
     }
 }

+ 28 - 7
server/gateway-api/src/main/java/com/qxgmat/controller/api/SentenceController.java

@@ -9,10 +9,15 @@ import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.logic.SentenceLogic;
 import com.qxgmat.data.constants.enums.module.PaperModule;
 import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.data.relation.entity.UserReportRelation;
+import com.qxgmat.dto.extend.QuestionExtendDto;
+import com.qxgmat.dto.extend.SentenceQuestionBaseExtendDto;
+import com.qxgmat.dto.extend.SentenceQuestionDetailExtendDto;
 import com.qxgmat.dto.request.*;
 import com.qxgmat.dto.response.*;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.service.SentencePaperService;
+import com.qxgmat.service.UserCollectQuestionService;
 import com.qxgmat.service.UsersService;
 import com.qxgmat.service.extend.QuestionFlowService;
 import com.qxgmat.service.inline.*;
@@ -47,6 +52,9 @@ public class SentenceController
     private SentenceCodeService sentenceCodeService;
 
     @Autowired
+    private QuestionService questionService;
+
+    @Autowired
     private SettingService settingService;
 
     @Autowired
@@ -56,6 +64,9 @@ public class SentenceController
     private UserSentenceProcessService userSentenceProcessService;
 
     @Autowired
+    private UserCollectQuestionService userCollectQuestionService;
+
+    @Autowired
     private QuestionFlowService questionFlowService;
 
     @RequestMapping(value = "/info", method = RequestMethod.GET)
@@ -171,8 +182,11 @@ public class SentenceController
     public Response<UserReportDto> start(@RequestBody @Validated SentenceStartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
         JSONObject setting = new JSONObject();
-        UserReport report = questionFlowService.start(user.getId(), PaperModule.SENTENCE, dto.getPaperId(), setting);
-        return ResponseHelp.success(Transform.convert(report, UserReportDto.class));
+        UserReportRelation report = questionFlowService.start(user.getId(), PaperModule.SENTENCE, dto.getPaperId(), setting);
+
+        UserReportDto userReportDto = Transform.convert(report, UserReportDto.class);
+
+        return ResponseHelp.success(userReportDto);
     }
 
 
@@ -180,9 +194,11 @@ public class SentenceController
     @ApiOperation(value = "继续做题", notes = "获取报告信息", httpMethod = "POST")
     public Response<UserReportDto> continueReport(@RequestBody @Validated ReportContinueDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
-        UserReport report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
+        UserReportRelation report = questionFlowService.continueReport(user.getId(), dto.getUserReportId());
 
-        return ResponseHelp.success(Transform.convert(report, UserReportDto.class));
+        UserReportDto userReportDto = Transform.convert(report, UserReportDto.class);
+
+        return ResponseHelp.success(userReportDto);
     }
 
     @RequestMapping(value = "/paper/next", method = RequestMethod.POST)
@@ -192,11 +208,16 @@ public class SentenceController
 
         UserQuestion userQuestion = questionFlowService.next(user.getId(), dto.getUserReportId());
 
-        // 绑定sentenceQuestion
+        UserSentenceQuestionBaseDto baseDto = Transform.convert(userQuestion, UserSentenceQuestionBaseDto.class);
 
         // 绑定question
+        baseDto.setQuestion(Transform.convert(questionService.get(userQuestion.getQuestionId()), QuestionExtendDto.class));
+
+        // 绑定sentenceQuestion
+        baseDto.setSentence(Transform.convert(sentenceQuestionService.get(userQuestion.getQuestionNoId()), SentenceQuestionBaseExtendDto.class));
 
         // 绑定collect
+        baseDto.setCollect(userCollectQuestionService.getByUserAndQuestion(user.getId(), userQuestion.getQuestionId()) != null);
 
         return ResponseHelp.success(null);
     }
@@ -220,11 +241,11 @@ public class SentenceController
 
     @RequestMapping(value = "/paper/restart", method = RequestMethod.POST)
     @ApiOperation(value = "重置考试", notes = "重置考试", httpMethod = "POST")
-    public Response<User> restart(@RequestBody @Validated PaperRestartDto dto)  {
+    public Response<Boolean> restart(@RequestBody @Validated PaperRestartDto dto)  {
         User user = (User) shiroHelp.getLoginUser();
 
         questionFlowService.restart(dto.getUserPaperId(), user.getId());
 
-        return ResponseHelp.success(null);
+        return ResponseHelp.success(true);
     }
 }

+ 2 - 2
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserAskExtendDto.java

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

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

@@ -1,12 +1,11 @@
 package com.qxgmat.dto.admin.request;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.dao.entity.UserAsk;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
 
 import javax.validation.constraints.NotEmpty;
 
-@Dto(entity = UserAsk.class)
+@Dto(entity = UserAskQuestion.class)
 public class UserAskDto {
 
     @NotEmpty(message = "提问id不允许为空!")

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

@@ -1,11 +1,11 @@
 package com.qxgmat.dto.admin.request;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserAsk;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
 
 import javax.validation.constraints.NotEmpty;
 
-@Dto(entity = UserAsk.class)
+@Dto(entity = UserAskQuestion.class)
 public class UserAskOrderDto {
 
     @NotEmpty(message = "提问id不允许为空!")

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

@@ -0,0 +1,4 @@
+package com.qxgmat.dto.admin.request;
+
+public class UserServiceBindDto {
+}

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

@@ -1,13 +1,12 @@
 package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserAsk;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
 import com.qxgmat.dto.admin.extend.*;
 
 import java.util.Collection;
-import java.util.List;
 
-@Dto(entity = UserAsk.class)
+@Dto(entity = UserAskQuestion.class)
 public class UserAskDetailDto {
 
     private Integer id;

+ 2 - 6
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserAskListDto.java

@@ -1,17 +1,13 @@
 package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.UserAsk;
-import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
 import com.qxgmat.dto.admin.extend.ManagerExtendDto;
 import com.qxgmat.dto.admin.extend.QuestionExtendDto;
 import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.admin.extend.UserExtendDto;
 
-import javax.validation.constraints.NotEmpty;
-import java.util.Date;
-
-@Dto(entity = UserAsk.class)
+@Dto(entity = UserAskQuestion.class)
 public class UserAskListDto {
 
     private Integer id;

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

@@ -0,0 +1,8 @@
+package com.qxgmat.dto.admin.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserFeedbackError;
+
+@Dto(entity = UserFeedbackError.class)
+public class UserFeedbackErrorDetailDto {
+}

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

@@ -1,15 +1,11 @@
 package com.qxgmat.dto.admin.response;
 
 import com.nuliji.tools.annotation.Dto;
-import com.qxgmat.data.dao.entity.FeedbackError;
-import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.dao.entity.UserFeedbackError;
 import com.qxgmat.dto.admin.extend.UserExtendDto;
 
-import javax.validation.constraints.NotEmpty;
-import java.util.Date;
-
-@Dto(entity = FeedbackError.class)
-public class FeedbackErrorListDto {
+@Dto(entity = UserFeedbackError.class)
+public class UserFeedbackErrorListDto {
 
     private Integer id;
 

+ 27 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/SentenceQuestionBaseExtendDto.java

@@ -0,0 +1,27 @@
+package com.qxgmat.dto.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.SentenceQuestion;
+
+@Dto(entity = SentenceQuestion.class)
+public class SentenceQuestionBaseExtendDto {
+    private String title;
+
+    private Integer no;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getNo() {
+        return no;
+    }
+
+    public void setNo(Integer no) {
+        this.no = no;
+    }
+}

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

@@ -4,7 +4,7 @@ import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.SentenceQuestion;
 
 @Dto(entity = SentenceQuestion.class)
-public class SentenceQuestionExtendDto {
+public class SentenceQuestionDetailExtendDto {
     private String title;
 
     private Integer no;

+ 39 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/extend/UserPaperExtendDto.java

@@ -0,0 +1,39 @@
+package com.qxgmat.dto.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.inline.PaperStat;
+
+@Dto(entity = UserPaper.class)
+public class UserPaperExtendDto {
+
+    private Integer id;
+
+    private Integer times;
+
+    private String title;
+
+    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 Integer getTimes() {
+        return times;
+    }
+
+    public void setTimes(Integer times) {
+        this.times = times;
+    }
+}

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

@@ -0,0 +1,38 @@
+package com.qxgmat.dto.request;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
+import com.qxgmat.data.dao.entity.UserNoteQuestion;
+
+@Dto(entity = UserAskQuestion.class)
+public class UserAskDto {
+    private String target;
+
+    private Integer questionNoId;
+
+    private String content;
+
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getTarget() {
+        return target;
+    }
+
+    public void setTarget(String target) {
+        this.target = target;
+    }
+}

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

@@ -5,7 +5,6 @@ import com.qxgmat.data.dao.entity.UserCollectQuestion;
 
 @Dto(entity = UserCollectQuestion.class)
 public class UserCollectDto {
-    private String module;
 
     private Integer questionNoId;
 
@@ -16,12 +15,4 @@ public class UserCollectDto {
     public void setQuestionNoId(Integer questionNoId) {
         this.questionNoId = questionNoId;
     }
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
 }

+ 27 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/request/UserFeedbackErrorDto.java

@@ -0,0 +1,27 @@
+package com.qxgmat.dto.request;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserFeedbackError;
+
+@Dto(entity = UserFeedbackError.class)
+public class UserFeedbackErrorDto {
+    private Integer questionNoId;
+
+    private String content;
+
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

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

@@ -5,7 +5,6 @@ import com.qxgmat.data.dao.entity.UserNoteQuestion;
 
 @Dto(entity = UserNoteQuestion.class)
 public class UserNoteDto {
-    private String module;
 
     private Integer questionNoId;
 
@@ -26,12 +25,4 @@ public class UserNoteDto {
     public void setContent(String content) {
         this.content = content;
     }
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
 }

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

@@ -1,6 +1,6 @@
 package com.qxgmat.dto.request;
 
-public class UserCollectBindDto {
+public class UserQuestionIdsDto {
     private Integer[] questionNoIds;
 
     public Integer[] getQuestionNoIds() {

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

@@ -20,6 +20,8 @@ public class UserQuestionBaseDto {
 
     private QuestionBaseExtendDto question;
 
+    private QuestionNoExtendDto questionNo;
+
     private List<QuestionNoExtendDto> questionNos;
 
     private Boolean collect;
@@ -71,4 +73,12 @@ public class UserQuestionBaseDto {
     public void setCollect(Boolean collect) {
         this.collect = collect;
     }
+
+    public QuestionNoExtendDto getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNoExtendDto questionNo) {
+        this.questionNo = questionNo;
+    }
 }

+ 11 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserReportDto.java

@@ -2,6 +2,7 @@ package com.qxgmat.dto.response;
 
 import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.UserReport;
+import com.qxgmat.dto.extend.UserPaperExtendDto;
 
 @Dto(entity = UserReport.class)
 public class UserReportDto {
@@ -9,6 +10,8 @@ public class UserReportDto {
 
     private Integer paperId;
 
+    private UserPaperExtendDto paper;
+
     private String module;
 
     private Integer time;
@@ -74,4 +77,12 @@ public class UserReportDto {
     public void setUserNumber(Integer userNumber) {
         this.userNumber = userNumber;
     }
+
+    public UserPaperExtendDto getPaper() {
+        return paper;
+    }
+
+    public void setPaper(UserPaperExtendDto paper) {
+        this.paper = paper;
+    }
 }

+ 8 - 7
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionBaseDto.java

@@ -1,11 +1,12 @@
 package com.qxgmat.dto.response;
 
-import com.alibaba.fastjson.JSONObject;
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserQuestion;
 import com.qxgmat.dto.extend.QuestionBaseExtendDto;
-import com.qxgmat.dto.extend.QuestionDetailExtendDto;
-import com.qxgmat.dto.extend.SentenceQuestionExtendDto;
-import com.qxgmat.dto.extend.UserNoteExtendDto;
+import com.qxgmat.dto.extend.SentenceQuestionBaseExtendDto;
+import com.qxgmat.dto.extend.SentenceQuestionDetailExtendDto;
 
+@Dto(entity = UserQuestion.class)
 public class UserSentenceQuestionBaseDto {
 
     private Integer id;
@@ -16,7 +17,7 @@ public class UserSentenceQuestionBaseDto {
 
     private QuestionBaseExtendDto question;
 
-    private SentenceQuestionExtendDto sentence;
+    private SentenceQuestionBaseExtendDto sentence;
 
     private Boolean collect;
 
@@ -44,11 +45,11 @@ public class UserSentenceQuestionBaseDto {
         this.questionNoId = questionNoId;
     }
 
-    public SentenceQuestionExtendDto getSentence() {
+    public SentenceQuestionBaseExtendDto getSentence() {
         return sentence;
     }
 
-    public void setSentence(SentenceQuestionExtendDto sentence) {
+    public void setSentence(SentenceQuestionBaseExtendDto sentence) {
         this.sentence = sentence;
     }
 

+ 7 - 4
server/gateway-api/src/main/java/com/qxgmat/dto/response/UserSentenceQuestionDetailDto.java

@@ -1,10 +1,13 @@
 package com.qxgmat.dto.response;
 
 import com.alibaba.fastjson.JSONObject;
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserQuestion;
 import com.qxgmat.dto.extend.QuestionDetailExtendDto;
-import com.qxgmat.dto.extend.SentenceQuestionExtendDto;
+import com.qxgmat.dto.extend.SentenceQuestionDetailExtendDto;
 import com.qxgmat.dto.extend.UserNoteExtendDto;
 
+@Dto(entity = UserQuestion.class)
 public class UserSentenceQuestionDetailDto {
 
     private Integer id;
@@ -19,7 +22,7 @@ public class UserSentenceQuestionDetailDto {
 
     private QuestionDetailExtendDto question;
 
-    private SentenceQuestionExtendDto sentence;
+    private SentenceQuestionDetailExtendDto sentence;
 
     private Boolean collect;
 
@@ -73,11 +76,11 @@ public class UserSentenceQuestionDetailDto {
         this.question = question;
     }
 
-    public SentenceQuestionExtendDto getSentence() {
+    public SentenceQuestionDetailExtendDto getSentence() {
         return sentence;
     }
 
-    public void setSentence(SentenceQuestionExtendDto sentence) {
+    public void setSentence(SentenceQuestionDetailExtendDto sentence) {
         this.sentence = sentence;
     }
 

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

@@ -41,6 +41,10 @@ public class ManagerService extends AbstractService {
 
     public Manager add(Manager manager){
         if(manager.getPassword() != null) manager.setPassword(Tools.stringMD5(Tools.stringMD5(manager.getPassword())));
+        Manager in = getByUserName(manager.getUsername());
+        if (in!=null) {
+            throw new ParameterException("用户名已使用");
+        }
         int result = insert(managerMapper, manager);
         manager = one(managerMapper, manager.getId());
         if(manager == null){
@@ -54,6 +58,10 @@ public class ManagerService extends AbstractService {
         if(in == null){
             throw new ParameterException("用户不存在");
         }
+        in = getByUserName(manager.getUsername());
+        if (in != null && !in.getId().equals(manager.getId())){
+            throw new ParameterException("用户名已使用");
+        }
         if(manager.getPassword() != null) manager.setPassword(Tools.stringMD5(Tools.stringMD5(manager.getPassword())));
         int result = update(managerMapper, manager);
         return manager;

+ 25 - 13
server/gateway-api/src/main/java/com/qxgmat/service/UserCollectQuestionService.java

@@ -79,30 +79,42 @@ public class UserCollectQuestionService extends AbstractService {
     }
 
     /**
-     * 收藏题目编号:包含题目id
+     * 查询用户收藏情况
      * @param userId
-     * @param questionNoId
+     * @param questionId
      * @return
      */
-    @Transactional
-    public UserCollectQuestion addQuestion(Integer userId, QuestionModule module, Integer questionNoId){
+    public UserCollectQuestion getByUserAndQuestion(Integer userId, Integer questionId){
+
         Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()
                         .andEqualTo("userId", userId)
-                        .andEqualTo("questionNoId", questionNoId)
+                        .andEqualTo("questionId", questionId)
+        );
+        UserCollectQuestion in = one(userCollectQuestionMapper, example);
+        return in;
+    }
+
+    /**
+     * 收藏题目编号:包含题目id
+     * @param entity
+     * @return
+     */
+    @Transactional
+    public UserCollectQuestion addQuestion(UserCollectQuestion entity){
+        Example example = new Example(UserCollectQuestion.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("userId", entity.getUserId())
+                        .andEqualTo("questionNoId", entity.getQuestionNoId())
         );
         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;
+        int result = insert(userCollectQuestionMapper, entity);
+        return entity;
     }
 
     /**
@@ -112,7 +124,7 @@ public class UserCollectQuestionService extends AbstractService {
      * @return
      */
     @Transactional
-    public boolean deleteQuestion(Integer userId, QuestionModule module, Integer questionNoId){
+    public boolean deleteQuestion(Integer userId, Integer questionNoId){
         Example example = new Example(UserCollectQuestion.class);
         example.and(
                 example.createCriteria()

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

@@ -99,7 +99,7 @@ public class UserPaperService extends AbstractService {
      * @param report
      */
     public void accumulation(UserReport report){
-        userPaperRelationMapper.accumulation(report.getPaperId(), report.getUserNumber(), report.getUserTime(), report.getCorrectNumber(), 1);
+        userPaperRelationMapper.accumulation(report.getPaperId(), report.getUserNumber(), report.getUserTime(), report.getUserCorrect(), 1);
     }
 
     /**

+ 1 - 4
server/gateway-api/src/main/java/com/qxgmat/service/UsersService.java

@@ -4,17 +4,15 @@ import com.github.pagehelper.Page;
 import com.nuliji.tools.AbstractService;
 import com.nuliji.tools.CipherHelp;
 import com.nuliji.tools.Tools;
-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.nuliji.tools.mybatis.Example;
-import com.nuliji.tools.mybatis.handler.NativeJsonHandler;
+import com.nuliji.tools.mybatis.NativeJsonHandler;
 import com.nuliji.tools.third.OauthData;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.dao.UserMapper;
 import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.dao.entity.UserMessage;
 import com.qxgmat.data.inline.UserToken;
 import com.qxgmat.help.WechatHelp;
 import com.qxgmat.service.inline.UserClassService;
@@ -26,7 +24,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.beans.Transient;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;

+ 21 - 6
server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

@@ -1,12 +1,14 @@
 package com.qxgmat.service.extend;
 
 import com.alibaba.fastjson.JSONObject;
+import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.module.PaperModule;
 import com.qxgmat.data.constants.enums.module.QuestionModule;
 import com.qxgmat.data.dao.entity.*;
 import com.qxgmat.data.relation.entity.QuestionNoRelation;
+import com.qxgmat.data.relation.entity.UserReportRelation;
 import com.qxgmat.service.*;
 import com.qxgmat.service.annotation.*;
 import com.qxgmat.service.inline.QuestionNoService;
@@ -213,7 +215,7 @@ public class QuestionFlowService {
      * @return
      */
     @Transactional
-    public UserReport start(Integer userId, PaperModule module, Integer paperId, JSONObject setting){
+    public UserReportRelation start(Integer userId, PaperModule module, Integer paperId, JSONObject setting){
         UserPaper paper = userPaperService.getByPaper(userId, module, paperId, initPaperCallback.get(module));
         // 查找对应的report是否有,如果没有或reset为1,则添加
         if (paper.getIsReset() > 0) {
@@ -221,8 +223,9 @@ public class QuestionFlowService {
             userPaperService.edit(paper);
         }
         // 记录考试设置
-        UserReport report = userReportService.addByPaper(paper, setting, initReportCallback.get(module));
-        return report;
+        UserReport userReport = userReportService.addByPaper(paper, setting, initReportCallback.get(module));
+
+        return relationReport(userReport);
     }
 
     /**
@@ -231,7 +234,7 @@ public class QuestionFlowService {
      * @param userReportId
      * @return
      */
-    public UserReport continueReport(Integer userId, Integer userReportId){
+    public UserReportRelation continueReport(Integer userId, Integer userReportId){
         UserReport userReport = userReportService.get(userReportId);
         if (!userReport.getUserId().equals(userId)){
             throw new ParameterException("试卷不存在");
@@ -243,8 +246,7 @@ public class QuestionFlowService {
             throw new ParameterException("答题结束,请提交完成");
         }
 
-
-        return userReport;
+        return relationReport(userReport);
     }
 
     /**
@@ -398,4 +400,17 @@ public class QuestionFlowService {
         Integer time = toolsService.computerTime(settingKey, relation);
         question.setTime(time);
     }
+
+    /**
+     * 获取报表关联试卷
+     * @param p
+     * @return
+     */
+    private UserReportRelation relationReport(UserReport p){
+        UserReportRelation relation = Transform.convert(p, UserReportRelation.class);
+
+        UserPaper paper = userPaperService.get(p.getPaperId());
+        relation.setPaper(paper);
+        return relation;
+    }
 }

+ 0 - 70
server/gateway-api/src/main/java/com/qxgmat/service/inline/FeedbackErrorService.java

@@ -1,70 +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.qxgmat.data.dao.AdMapper;
-import com.qxgmat.data.dao.FeedbackErrorMapper;
-import com.qxgmat.data.dao.entity.Ad;
-import com.qxgmat.data.dao.entity.FeedbackError;
-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 FeedbackErrorService extends AbstractService {
-    private static final Logger logger = LoggerFactory.getLogger(FeedbackErrorService.class);
-
-    @Resource
-    private FeedbackErrorMapper feedbackErrorMapper;
-
-    public FeedbackError add(FeedbackError feedbackError){
-        int result = insert(feedbackErrorMapper, feedbackError);
-        feedbackError = one(feedbackErrorMapper, feedbackError.getId());
-        if(feedbackError == null){
-            throw new SystemException("勘误添加失败");
-        }
-        return feedbackError;
-    }
-
-    public FeedbackError edit(FeedbackError feedbackError){
-        FeedbackError in = one(feedbackErrorMapper, feedbackError.getId());
-        if(in == null){
-            throw new ParameterException("勘误不存在");
-        }
-        int result = update(feedbackErrorMapper, feedbackError);
-        return feedbackError;
-    }
-
-    public boolean delete(Number id){
-        FeedbackError in = one(feedbackErrorMapper, id);
-        if(in == null){
-            throw new ParameterException("勘误不存在");
-        }
-        int result = delete(feedbackErrorMapper, id);
-        return result > 0;
-    }
-
-    public FeedbackError get(Number id){
-        FeedbackError in = one(feedbackErrorMapper, id);
-
-        if(in == null){
-            throw new ParameterException("勘误不存在");
-        }
-        return in;
-    }
-
-    public Page<FeedbackError> select(int page, int pageSize){
-        return select(feedbackErrorMapper, page, pageSize);
-    }
-
-    public List<FeedbackError> select(Collection ids){
-        return select(feedbackErrorMapper, ids);
-    }
-
-}

+ 38 - 11
server/gateway-api/src/main/java/com/qxgmat/service/inline/QuestionNoService.java

@@ -18,6 +18,7 @@ import com.qxgmat.data.relation.entity.QuestionNoRelation;
 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.*;
@@ -37,23 +38,34 @@ public class QuestionNoService extends AbstractService {
     @Resource
     private QuestionService questionService;
 
+//    private List<String> stops = new ArrayList<String>(){{
+//       add(".");
+//       add(",");
+//       add("!");
+//       add(":");
+//       add(";");
+//       add("?");
+//    }};
+
     /**
-     * 根据题干搜索相似题目
+     * 根据题干搜索相似题目: 相似度80%
      * @param page
      * @param size
      * @param stem
      * @return
      */
     public PageResult<QuestionNoRelation> searchStem(int page, int size, String stem){
-        // todo 连表查询
-        Example example = new Example(QuestionNo.class);
-        example.and(
-                example.createCriteria()
-                        .andEqualTo("no", stem)
+//        String[] stems = stem.replaceAll("\\.?,?!?:?;?\\??", "").split(" ");
 
-        );
-        Page<QuestionNo> p = page(()->select(questionNoMapper, example), page, size);
-        return new PageResult<>(relation(p), p.getTotal());
+        Page<QuestionNo> p = page(()->{
+            questionNoRelationMapper.searchStem(stem);
+        }, page, size);
+
+        Collection ids = Transform.getIds(p, QuestionNo.class, "id");
+
+        // 获取详细数据
+        List<QuestionNo> list = select(ids);
+        return new PageResult<>(relation(list), p.getTotal());
     }
 
     /**
@@ -149,7 +161,7 @@ public class QuestionNoService extends AbstractService {
                 example.createCriteria()
                         .andIn("id", Arrays.stream(ids).collect(Collectors.toList()))
         );
-        int result = update(questionNoMapper, example, QuestionNo.builder().questionId(questionId).build());
+        int result = update(questionNoMapper, example, QuestionNo.builder().questionId(questionId).deleteTime(null).build());
         return result > 0;
     }
 
@@ -224,7 +236,21 @@ public class QuestionNoService extends AbstractService {
         return relation;
     }
 
+    /**
+     * 通过题目编号获取
+     * @param no
+     * @return
+     */
+    public QuestionNo getByNo(String no, String module){
+        return one(questionNoMapper, QuestionNo.builder().no(no).module(module).build());
+    }
+
+    @Transactional
     public QuestionNo add(QuestionNo question){
+        QuestionNo in = getByNo(question.getNo(), question.getModule());
+        if (in != null){
+            return in;
+        }
         int result = insert(questionNoMapper, question);
         question = one(questionNoMapper, question.getId());
         if(question == null){
@@ -233,6 +259,7 @@ public class QuestionNoService extends AbstractService {
         return question;
     }
 
+    @Deprecated
     public QuestionNo edit(QuestionNo question){
         QuestionNo in = one(questionNoMapper, question.getId());
         if(in == null){
@@ -247,7 +274,7 @@ public class QuestionNoService extends AbstractService {
         if(in == null){
             throw new ParameterException("题目不存在");
         }
-        int result = delete(questionNoMapper, id);
+        int result = delete(questionNoMapper, id, SOFT_FLAG);
         return result > 0;
     }
 

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

@@ -86,6 +86,16 @@ public class QuestionService extends AbstractService {
     }
 
     public Question add(Question question){
+        // 按实际更新更改更新时间
+        if (!question.getQxContent().isEmpty()){
+            question.setQxTime(new Date());
+        }
+        if (!question.getOfficialContent().isEmpty()){
+            question.setOfficialTime(new Date());
+        }
+        if (question.getAssociationContent().length > 0){
+            question.setAssociationTime(new Date());
+        }
         int result = insert(questionMapper, question);
         question = one(questionMapper, question.getId());
         if(question == null){
@@ -99,6 +109,16 @@ public class QuestionService extends AbstractService {
         if(in == null){
             throw new ParameterException("题目不存在");
         }
+        // 按实际更新更改更新时间
+        if (!in.getQxContent().equals(question.getQxContent())){
+            question.setQxTime(new Date());
+        }
+        if (!in.getOfficialContent().equals(question.getOfficialContent())){
+            question.setOfficialTime(new Date());
+        }
+        if (in.getAssociationContent().length != question.getAssociationContent().length){
+            question.setAssociationTime(new Date());
+        }
         int result = update(questionMapper, question);
         return question;
     }

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

@@ -39,6 +39,7 @@ public class RankService extends AbstractService {
                         .andEqualTo("totalScore", totalScore)
                         .andEqualTo("quantScore", quantScore)
         );
+
         return one(rankMapper, example);
     }
 

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

@@ -0,0 +1,149 @@
+package com.qxgmat.service.inline;
+
+import com.github.pagehelper.Page;
+import com.nuliji.tools.AbstractService;
+import com.nuliji.tools.Transform;
+import com.nuliji.tools.exception.ParameterException;
+import com.nuliji.tools.exception.SystemException;
+import com.nuliji.tools.mybatis.Example;
+import com.qxgmat.data.constants.enums.status.AskStatus;
+import com.qxgmat.data.constants.enums.status.DirectionStatus;
+import com.qxgmat.data.constants.enums.user.AskTarget;
+import com.qxgmat.data.constants.enums.user.MoneyRange;
+import com.qxgmat.data.dao.UserAskQuestionMapper;
+import com.qxgmat.data.dao.entity.QuestionNo;
+import com.qxgmat.data.dao.entity.UserAskQuestion;
+import com.qxgmat.data.relation.UserAskQuestionRelationMapper;
+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;
+import java.util.Map;
+
+@Service
+public class UserAskQuestionService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserAskQuestionService.class);
+
+    @Resource
+    private UserAskQuestionMapper userAskQuestionMapper;
+
+    @Resource
+    private UserAskQuestionRelationMapper userAskQuestionRelationMapper;
+
+    public Page<UserAskQuestion> listWithUser(int page, int size, String type, Number category, Number userId, Number questionNoId, AskTarget target, AskStatus status, Integer showStatus, MoneyRange moneyRange, String order, DirectionStatus direction){
+        String tk = target != null ? target.key : "";
+        Integer statusIndex = status != null ? status.index : null;
+        Integer max = moneyRange != null ? moneyRange.max == Integer.MAX_VALUE ? null : moneyRange.max : null;
+        Integer min = moneyRange != null ? moneyRange.min : null;
+        if(order.isEmpty()) order = "id";
+        if (direction == null){
+            direction = DirectionStatus.DESC;
+        }
+        String finalOrder = order;
+        DirectionStatus finalDirection = direction;
+        Page<UserAskQuestion> p = page(
+                ()-> userAskQuestionRelationMapper.listWithUser(type, category, userId, questionNoId, tk, statusIndex, showStatus, min, max, finalOrder, finalDirection.key)
+        , page, size);
+
+        Collection ids = Transform.getIds(p, UserAskQuestion.class, "id");
+        Transform.replace(p, select(ids), UserAskQuestion.class, "id");
+        return p;
+    }
+
+    public List<UserAskQuestion> listByQuestion(Number questionId, Boolean showStatus){
+        Example example = new Example(UserAskQuestion.class);
+        example.and(
+                example.createCriteria()
+                        .andEqualTo("questionId", questionId)
+
+        );
+        if (showStatus != null)
+            example.and(
+                    example.createCriteria()
+                            .andEqualTo("showStatus", showStatus?1:0)
+                            .andEqualTo("answerStatus", 1)
+
+            );
+        example.orderBy("order").desc();
+        return select(userAskQuestionMapper, example);
+    }
+
+    /**
+     * 根据列表顺序全部更新排序:从大到小
+     * @param ids
+     */
+    @Transactional
+    public void updateOrder(Integer[] ids){
+        int order = ids.length;
+        List<UserAskQuestion> UserAskQuestionList = select(userAskQuestionMapper, ids);
+        Map UserAskQuestionMap = Transform.getMap(UserAskQuestionList, UserAskQuestion.class, "id");
+        for (Integer id : ids){
+            UserAskQuestion UserAskQuestion = (UserAskQuestion)UserAskQuestionMap.get(id);
+            if (UserAskQuestion == null) continue;
+            if (UserAskQuestion.getOrder() == order) continue;
+            update(userAskQuestionMapper, UserAskQuestion.builder()
+                    .id(id)
+                    .order(order)
+                    .build()
+            );
+            order -= 1;
+        }
+    }
+
+//    @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());
+        if(message == null){
+            throw new SystemException("提问添加失败");
+        }
+        return message;
+    }
+
+    public UserAskQuestion edit(UserAskQuestion message){
+        UserAskQuestion in = one(userAskQuestionMapper, message.getId());
+        if(in == null){
+            throw new ParameterException("提问不存在");
+        }
+        int result = update(userAskQuestionMapper, message);
+        return message;
+    }
+
+    public boolean delete(Number id){
+        UserAskQuestion in = one(userAskQuestionMapper, id);
+        if(in == null){
+            throw new ParameterException("提问不存在");
+        }
+        int result = delete(userAskQuestionMapper, id);
+        return result > 0;
+    }
+
+    public UserAskQuestion get(Number id){
+        UserAskQuestion in = one(userAskQuestionMapper, id);
+
+        if(in == null){
+            throw new ParameterException("提问不存在");
+        }
+        return in;
+    }
+
+    public Page<UserAskQuestion> select(int page, int pageSize){
+        return select(userAskQuestionMapper, page, pageSize);
+    }
+
+    public List<UserAskQuestion> select(Collection ids){
+        return select(userAskQuestionMapper, ids);
+    }
+
+}

+ 0 - 134
server/gateway-api/src/main/java/com/qxgmat/service/inline/UserAskService.java

@@ -1,134 +0,0 @@
-package com.qxgmat.service.inline;
-
-import com.github.pagehelper.Page;
-import com.nuliji.tools.AbstractService;
-import com.nuliji.tools.Transform;
-import com.nuliji.tools.exception.ParameterException;
-import com.nuliji.tools.exception.SystemException;
-import com.nuliji.tools.mybatis.Example;
-import com.qxgmat.data.constants.enums.status.AskStatus;
-import com.qxgmat.data.constants.enums.status.DirectionStatus;
-import com.qxgmat.data.constants.enums.user.AskTarget;
-import com.qxgmat.data.constants.enums.user.MoneyRange;
-import com.qxgmat.data.dao.UserAskMapper;
-import com.qxgmat.data.dao.entity.UserAsk;
-import com.qxgmat.data.relation.UserAskRelationMapper;
-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 UserAskService extends AbstractService {
-    private static final Logger logger = LoggerFactory.getLogger(UserAskService.class);
-
-    @Resource
-    private UserAskMapper userAskMapper;
-
-    @Resource
-    private UserAskRelationMapper userAskRelationMapper;
-
-    public Page<UserAsk> listWithUser(int page, int size, String type, Number category, Number userId, Number questionNoId, AskTarget target, AskStatus status, Integer showStatus, MoneyRange moneyRange, String order, DirectionStatus direction){
-        String tk = target != null ? target.key : "";
-        Integer statusIndex = status != null ? status.index : null;
-        Integer max = moneyRange != null ? moneyRange.max == Integer.MAX_VALUE ? null : moneyRange.max : null;
-        Integer min = moneyRange != null ? moneyRange.min : null;
-        if(order.isEmpty()) order = "id";
-        if (direction == null){
-            direction = DirectionStatus.DESC;
-        }
-        String finalOrder = order;
-        DirectionStatus finalDirection = direction;
-        Page<UserAsk> p = page(
-                ()-> userAskRelationMapper.listWithUser(type, category, userId, questionNoId, tk, statusIndex, showStatus, min, max, finalOrder, finalDirection.key)
-        , page, size);
-
-        Collection ids = Transform.getIds(p, UserAsk.class, "id");
-        Transform.replace(p, select(ids), UserAsk.class, "id");
-        return p;
-    }
-
-    public List<UserAsk> listByQuestion(Number questionId, Boolean showStatus){
-        Example example = new Example(UserAsk.class);
-        example.and(
-                example.createCriteria()
-                        .andEqualTo("questionId", questionId)
-
-        );
-        if (showStatus != null)
-            example.and(
-                    example.createCriteria()
-                            .andEqualTo("showStatus", showStatus?1:0)
-                            .andEqualTo("answerStatus", 1)
-
-            );
-        example.orderBy("order").desc();
-        return select(userAskMapper, example);
-    }
-
-    @Transactional
-    public void updateOrder(Integer[] ids){
-
-    }
-
-    public void adjust(Number questionId, Integer order, String direction, String flag){
-        userAskRelationMapper.adjust(questionId, order, direction, flag);
-    }
-
-    @Transactional
-    public void order(Number id, Integer order){
-        UserAsk entity = get(id);
-        adjust(entity.getQuestionId(), entity.getOrder(), ">", "-=");
-        adjust(entity.getQuestionId(), order, ">=", "+=");
-        entity.setOrder(order);
-    }
-
-    public UserAsk add(UserAsk message){
-        int result = insert(userAskMapper, message);
-        message = one(userAskMapper, message.getId());
-        if(message == null){
-            throw new SystemException("提问添加失败");
-        }
-        return message;
-    }
-
-    public UserAsk edit(UserAsk message){
-        UserAsk in = one(userAskMapper, message.getId());
-        if(in == null){
-            throw new ParameterException("提问不存在");
-        }
-        int result = update(userAskMapper, message);
-        return message;
-    }
-
-    public boolean delete(Number id){
-        UserAsk in = one(userAskMapper, id);
-        if(in == null){
-            throw new ParameterException("提问不存在");
-        }
-        int result = delete(userAskMapper, id);
-        return result > 0;
-    }
-
-    public UserAsk get(Number id){
-        UserAsk in = one(userAskMapper, id);
-
-        if(in == null){
-            throw new ParameterException("提问不存在");
-        }
-        return in;
-    }
-
-    public Page<UserAsk> select(int page, int pageSize){
-        return select(userAskMapper, page, pageSize);
-    }
-
-    public List<UserAsk> select(Collection ids){
-        return select(userAskMapper, ids);
-    }
-
-}

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

@@ -0,0 +1,68 @@
+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.UserFeedbackErrorMapper;
+import com.qxgmat.data.dao.entity.UserFeedbackError;
+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 UserFeedbackErrorService extends AbstractService {
+    private static final Logger logger = LoggerFactory.getLogger(UserFeedbackErrorService.class);
+
+    @Resource
+    private UserFeedbackErrorMapper userFeedbackErrorMapper;
+
+    public UserFeedbackError add(UserFeedbackError feedbackError){
+        int result = insert(userFeedbackErrorMapper, feedbackError);
+        feedbackError = one(userFeedbackErrorMapper, feedbackError.getId());
+        if(feedbackError == null){
+            throw new SystemException("勘误添加失败");
+        }
+        return feedbackError;
+    }
+
+    public UserFeedbackError edit(UserFeedbackError feedbackError){
+        UserFeedbackError in = one(userFeedbackErrorMapper, feedbackError.getId());
+        if(in == null){
+            throw new ParameterException("勘误不存在");
+        }
+        int result = update(userFeedbackErrorMapper, feedbackError);
+        return feedbackError;
+    }
+
+    public boolean delete(Number id){
+        UserFeedbackError in = one(userFeedbackErrorMapper, id);
+        if(in == null){
+            throw new ParameterException("勘误不存在");
+        }
+        int result = delete(userFeedbackErrorMapper, id);
+        return result > 0;
+    }
+
+    public UserFeedbackError get(Number id){
+        UserFeedbackError in = one(userFeedbackErrorMapper, id);
+
+        if(in == null){
+            throw new ParameterException("勘误不存在");
+        }
+        return in;
+    }
+
+    public Page<UserFeedbackError> select(int page, int pageSize){
+        return select(userFeedbackErrorMapper, page, pageSize);
+    }
+
+    public List<UserFeedbackError> select(Collection ids){
+        return select(userFeedbackErrorMapper, ids);
+    }
+
+}

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

@@ -14,6 +14,7 @@ import com.qxgmat.data.dao.entity.UserQuestion;
 import com.qxgmat.data.dao.entity.UserReport;
 import com.qxgmat.data.relation.UserReportRelationMapper;
 import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
+import com.qxgmat.data.relation.entity.UserReportRelation;
 import com.qxgmat.service.annotation.InitPaper;
 import com.qxgmat.service.annotation.InitReport;
 import com.qxgmat.util.shiro.UserRealm;

+ 2 - 2
server/tools/src/main/java/com/nuliji/tools/AbstractService.java

@@ -353,7 +353,7 @@ public abstract class AbstractService {
         }
         public static CommonObject getDeleteSoft(){
             CommonObject co = new CommonObject();
-            co.setDeleteStatus(new Date());
+            co.setDeleteTime(new Date());
             co.setUpdateTime(new Date());
             return co;
         }
@@ -386,7 +386,7 @@ public abstract class AbstractService {
             return deleteTime;
         }
 
-        public void setDeleteStatus(Date deleteTime) {
+        public void setDeleteTime(Date deleteTime) {
             this.deleteTime = deleteTime;
         }
     }

+ 1 - 1
server/tools/src/main/java/com/nuliji/tools/mybatis/handler/NativeJsonHandler.java

@@ -1,4 +1,4 @@
-package com.nuliji.tools.mybatis.handler;
+package com.nuliji.tools.mybatis;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonInclude;

+ 1 - 1
server/tools/src/main/java/com/nuliji/tools/mybatis/handler/IntegerArrayWithJsonHandler.java

@@ -1,6 +1,6 @@
 package com.nuliji.tools.mybatis.handler;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.nuliji.tools.mybatis.NativeJsonHandler;
 import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.MappedJdbcTypes;
 import org.apache.ibatis.type.MappedTypes;

+ 1 - 8
server/tools/src/main/java/com/nuliji/tools/mybatis/handler/StringArrayWithJsonHandler.java

@@ -1,17 +1,10 @@
 package com.nuliji.tools.mybatis.handler;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.ibatis.type.BaseTypeHandler;
+import com.nuliji.tools.mybatis.NativeJsonHandler;
 import org.apache.ibatis.type.JdbcType;
 import org.apache.ibatis.type.MappedJdbcTypes;
 import org.apache.ibatis.type.MappedTypes;
 
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
 @MappedTypes(String[].class)
 @MappedJdbcTypes({JdbcType.LONGVARCHAR, JdbcType.VARCHAR})
 public class StringArrayWithJsonHandler extends NativeJsonHandler<String[]> {