Przeglądaj źródła

Merge branch 'bug-branch' of chchen/exercise into master

练习册修改
chchen 5 lat temu
rodzic
commit
07e0069b0c
18 zmienionych plików z 634 dodań i 88 usunięć
  1. 11 33
      ssj-common-service/src/main/resources/application-common-dev.properties
  2. 6 6
      ssj-common-service/src/main/resources/application-common-local.properties
  3. 9 8
      ssj-common-service/src/main/resources/application-common-test.properties
  4. 30 0
      ssj-kmt-exercise-api/src/main/java/com/ssj/aijia/kmt/exercise/controller/KmtExerciseController.java
  5. 130 29
      ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseQuestionDealServiceImpl.java
  6. 12 0
      ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseQuestionServiceImpl.java
  7. 7 0
      ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseServiceImpl.java
  8. 1 1
      ssj-kmt-exercise-service-impl/src/main/resources/application.properties
  9. 10 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/ExerciseQuetionDto.java
  10. 27 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/exercise/ExerciseBookEditDto.java
  11. 155 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/exercise/ExerciseQuestionEditDto.java
  12. 76 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/request/rollbackai/ExerciseBooksEditRequest.java
  13. 53 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/request/rollbackai/ExerciseQuestionsEditRequest.java
  14. 17 0
      ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/service/KmtExerciseQuestionDealService.java
  15. 35 4
      ssj-mybatis-service-impl/src/main/java/com/ssj/service/mapper/KmtExerciseMapper.java
  16. 35 1
      ssj-mybatis-service-impl/src/main/resources/mybatis/mapper/KmtExerciseMapper.xml
  17. 13 0
      ssj-sys/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseServiceImpl.java
  18. 7 6
      ssj-sys/src/main/resources/application-test.properties

+ 11 - 33
ssj-common-service/src/main/resources/application-common-dev.properties

@@ -1,18 +1,14 @@
-#\u5F00\u53D1\u73AF\u5883\u6253\u5305\u65B9\u5F0F-\u914D\u7F6E\uFF08\u9ED8\u8BA4\uFF09
-logging.config=classpath:logback.xml
-
-spring.datasource.url=jdbc:mysql://47.112.200.206:8066/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true
-spring.datasource.username=root
-spring.datasource.password=ssj1QAZxsw2!@
-#spring.datasource.url=jdbc:mysql://120.79.215.176:8066/ssj?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
-#spring.datasource.username=ssj_user
-#spring.datasource.password=ssjUser!@123
+logging.config=classpath:logback-test.xml
+spring.datasource.url=jdbc:mysql://47.112.200.206:3306/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+#characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+spring.datasource.username=aijia
+spring.datasource.password=SSJ1QAZxsw2!@
 
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.initialSize=10
 spring.datasource.minIdle=10
-spring.datasource.maxActive=30
+spring.datasource.maxActive=100
 spring.datasource.maxWait=60000
 spring.datasource.timeBetweenEvictionRunsMillis=60000
 spring.datasource.minEvictableIdleTimeMillis=30000
@@ -25,7 +21,7 @@ spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
 spring.datasource.filters=stat,wall,slf4j
 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
 
-
+spring.data.solr.host=http://172.18.121.4:8080/solr
 spring.data.mongodb.uri=mongodb://root:aijia#123@47.106.111.166:27017/aijia
 spring.data.mongodb.option.min-connection-per-host=0 
 spring.data.mongodb.option.max-connection-per-host=100 
@@ -48,17 +44,8 @@ spring.data.mongodb.option.min-heartbeat-frequency=500
 spring.data.mongodb.option.heartbeat-frequency=10000 
 spring.data.mongodb.option.local-threshold=15
 
-
-config-redis.database=4
 spring.redis.database=0
-
-#spring.redis.host=120.79.157.115
-#spring.redis.port=6379
 spring.redis.password=dc1qazxsw2!@
-#spring.redis.pool.max-active=8
-#spring.redis.pool.max-wait=-1
-#spring.redis.pool.max-idle=8
-#spring.redis.pool.min-idle=0
 spring.redis.timeout=3000
 spring.redis.block-when-exhausted=true
 
@@ -76,7 +63,7 @@ spring.redis.cluster.pool.min-idle=0
 
 spring.jmx.enabled=false
 
-spring.rabbitmq.host=120.79.142.254
+spring.rabbitmq.host=47.106.111.166
 spring.rabbitmq.port=5672
 spring.rabbitmq.username=guest
 spring.rabbitmq.password=guest
@@ -85,11 +72,10 @@ spring.rabbitmq.publisher-returns=true
 
 
 dubbo.registry.id=ssj-dubbo-registry
-dubbo.registry.address=zookeeper://120.79.142.152:2181
+dubbo.registry.address=zookeeper://47.112.200.206:2181
 dubbo.protocol.serialization=java
 dubbo.consumer.timeout=50000
-#/**\u6CE8\u610F\u8FD9\u91CC\u7684\u6CE8\u89E3\u662Fdubbo\u7684\u6CE8\u89E3\uFF0C\u8FD9\u91CC\u6CA1\u6709\u4F7F\u7528\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u4E3A\u76F4\u8FDE\u65B9\u5F0F\uFF0C\u5404\u81EA\u672C\u5730\u5F00\u53D1\u53EF\u4EE5\u653E\u5F00 \uFF08dubbo://ip:\u670D\u52A1\u7AEF\u53E3\uFF09
-#dubbo.reference.url = dubbo://127.0.0.1:9394
+
 spring.thymeleaf.cache=false
 
 
@@ -101,12 +87,4 @@ spring.elasticsearch.cluster.host=47.112.200.206
 spring.elasticsearch.cluster.port=9200
 spring.elasticsearch.cluster.scheme=http
 spring.elasticsearch.cluster.username=elastic
-spring.elasticsearch.cluster.password=zhidian@123
-
-
-#spring.elasticsearch.cluster.host=47.112.253.242,47.112.250.240,47.112.232.110
-#spring.elasticsearch.cluster.host=119.23.8.52,120.79.157.115,120.79.229.124
-#mybatis热加载
-mybatis-plus.refresh-mapper=true
-
-
+spring.elasticsearch.cluster.password=zhidian@123

+ 6 - 6
ssj-common-service/src/main/resources/application-common-local.properties

@@ -1,8 +1,8 @@
 #\u5F00\u53D1\u73AF\u5883\u6253\u5305\u65B9\u5F0F-\u914D\u7F6E\uFF08\u9ED8\u8BA4\uFF09
 logging.config=classpath:logback.xml
-spring.datasource.url=jdbc:mysql://47.112.200.206:8066/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true
-spring.datasource.username=root
-spring.datasource.password=ssj1QAZxsw2!@
+spring.datasource.url=jdbc:mysql://192.168.2.152:3306/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+spring.datasource.username=aijia
+spring.datasource.password=SSJ1QAZxsw2!@
 
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@@ -24,14 +24,14 @@ spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowS
 
 spring.data.solr.host=http://120.79.142.254:8080/solr
 
-spring.redis.password=dc1qazxsw2!@
+spring.redis.password=aijia@78342
 spring.redis.timeout=3000
 spring.redis.block-when-exhausted=true
 
 
 
 #spring.redis.cluster.nodes=120.79.157.115:6379
-spring.redis.cluster.nodes=47.106.111.166:6380,47.106.111.166:6381,47.106.111.166:6382,47.106.111.166:6383,47.106.111.166:6384,47.106.111.166:6385
+spring.redis.cluster.nodes=192.168.2.117:7000,192.168.2.117:7001,192.168.2.117:7002,192.168.2.117:7003,192.168.2.117:7004,192.168.2.117:7005
 spring.redis.cluster.timeout=30
 
 spring.redis.cluster.pool.max-active=8
@@ -61,7 +61,7 @@ spring.thymeleaf.cache=false
 
 
 
-spring.elasticsearch.cluster.host=47.112.200.206
+spring.elasticsearch.cluster.host=192.168.2.152
 spring.elasticsearch.cluster.port=9200
 spring.elasticsearch.cluster.scheme=http
 spring.elasticsearch.cluster.username=elastic

+ 9 - 8
ssj-common-service/src/main/resources/application-common-test.properties

@@ -1,7 +1,8 @@
 logging.config=classpath:logback-test.xml
-spring.datasource.url=jdbc:mysql://172.18.106.198:8066/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true
-spring.datasource.username=root
-spring.datasource.password=ssj1QAZxsw2!@
+spring.datasource.url=jdbc:mysql://172.18.106.198:3306/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+#characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+spring.datasource.username=aijia
+spring.datasource.password=SSJ1QAZxsw2!@
 
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@@ -51,7 +52,7 @@ spring.redis.block-when-exhausted=true
 
 
 #spring.redis.cluster.nodes=120.79.157.115:6379
-spring.redis.cluster.nodes=47.106.111.166:6380,47.106.111.166:6381,47.106.111.166:6382,47.106.111.166:6383,47.106.111.166:6384,47.106.111.166:6385
+spring.redis.cluster.nodes=172.18.30.192:6380,172.18.30.192:6381,172.18.30.192:6382,172.18.30.192:6383,172.18.30.192:6384,172.18.30.192:6385
 spring.redis.cluster.timeout=30
 
 spring.redis.cluster.pool.max-active=8
@@ -62,16 +63,16 @@ spring.redis.cluster.pool.min-idle=0
 
 spring.jmx.enabled=false
 
-spring.rabbitmq.host=172.18.121.4
+spring.rabbitmq.host=172.18.30.192
 spring.rabbitmq.port=5672
-spring.rabbitmq.username=admin1
-spring.rabbitmq.password=admin1
+spring.rabbitmq.username=guest
+spring.rabbitmq.password=guest
 spring.rabbitmq.publisher-confirms=true  
 spring.rabbitmq.publisher-returns=true
 
 
 dubbo.registry.id=ssj-dubbo-registry
-dubbo.registry.address=zookeeper://172.18.121.4:2181
+dubbo.registry.address=zookeeper://172.18.106.198:2181
 dubbo.protocol.serialization=java
 dubbo.consumer.timeout=50000
 

+ 30 - 0
ssj-kmt-exercise-api/src/main/java/com/ssj/aijia/kmt/exercise/controller/KmtExerciseController.java

@@ -22,7 +22,9 @@ import com.ssj.service.kmt.dto.exercise.ExerciseQuestionRollbacks;
 import com.ssj.service.kmt.exercise.request.SubmitAnswerProofreadResultReq;
 import com.ssj.service.kmt.request.*;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionsEditRequest;
 import com.ssj.service.kmt.service.*;
 import com.ssj.service.sys.homework.service.HomeworkService;
 import com.ssj.service.sys.picturepredeal.service.PicturePreDealService;
@@ -675,4 +677,32 @@ public class KmtExerciseController extends BaseController {
         return responseEntity;
     }
 
+    @RequestMapping(value = "/findEditExerciseBooks", method = RequestMethod.POST)
+    @ApiOperation(value = "题目修改查询练习册", httpMethod = "POST", notes = "题目修改查询练习册")
+    public ResponseEntity findEditExerciseBooks(@RequestParam(name = "accessToken") String accessToken,
+                                               @RequestBody ExerciseBooksEditRequest request) {
+        ResponseEntity responseEntity = new ResponseEntity();
+        try {
+            responseEntity = kmtExerciseQuestionDealService.findEditExerciseBooks(request);
+        } catch (Exception e) {
+            logger.error("异常", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+
+    @RequestMapping(value = "/findEditExerciseQuestions", method = RequestMethod.POST)
+    @ApiOperation(value = "题目修改查询练习册", httpMethod = "POST", notes = "题目修改查询练习册")
+    public ResponseEntity findEditExerciseQuestions(@RequestParam(name = "accessToken") String accessToken,
+                                               @RequestBody ExerciseQuestionsEditRequest request) {
+        ResponseEntity responseEntity = new ResponseEntity();
+        try {
+            responseEntity = kmtExerciseQuestionDealService.findEditExerciseQuestions(request);
+        } catch (Exception e) {
+            logger.error("异常", e);
+            responseEntity.failure(ResponseConstant.CODE_500, "系统繁忙,请稍后重试");
+        }
+        return responseEntity;
+    }
+
 }

+ 130 - 29
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseQuestionDealServiceImpl.java

@@ -3,6 +3,7 @@ package com.ssj.service.kmt.kmt.service.impl;
 import com.alibaba.dubbo.config.annotation.Service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ssj.bean.kmt.kmt.domain.KmtExerciseBook;
 import com.ssj.bean.kmt.kmt.domain.KmtExerciseQuestion;
 import com.ssj.bean.weixin.libmy.domain.TbLibManager;
@@ -15,8 +16,13 @@ import com.ssj.framework.core.util.StringUtil;
 import com.ssj.framework.idworker.IdWorker;
 import com.ssj.framework.weixin.util.DateUtil;
 import com.ssj.kmt.utils.JSONFileUtil;
+import com.ssj.service.kmt.constant.KnowledgeVersion;
+import com.ssj.service.kmt.dto.exercise.ExerciseBookEditDto;
+import com.ssj.service.kmt.dto.exercise.ExerciseQuestionEditDto;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionsEditRequest;
 import com.ssj.service.kmt.service.KmtExerciseBookService;
 import com.ssj.service.kmt.service.KmtExerciseQuestionDealService;
 import com.ssj.service.kmt.service.KmtExerciseQuestionService;
@@ -53,6 +59,8 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
     private ExerciseQuestionSearchService exerciseQuestionSearchService;
     @Autowired
     private KmtExerciseBookService kmtExerciseBookService;
+    @Autowired
+    private KnowledgeVersion knowledgeVersion;
 
     @Override
     public ResponseEntity addOrEditExerciseQuestion(String userId, AddExerciseQuestionRequest request) {
@@ -62,19 +70,19 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
             String answerImage = getImagePath(request.getAnswer());
 
             if (StringUtils.isBlank(request.getQuestionId())){
-                //题目id不存在则是新增, 新增需要把一个num减1
+                //题目id不存在则是新增, 前端传过来的是新增题目的上一题
                 KmtExerciseBook book  = kmtExerciseBookService.getById(request.getExerciseBookId());
-                KmtExerciseQuestion nextQuestion = kmtExerciseMapper.findNextByBookIdAndNum(book.getBookId(), request.getNum());
+                KmtExerciseQuestion previousQuestion = kmtExerciseMapper.findPreviousByBookIdAndNum(book.getBookId(), request.getNum());
                 //新增小题
                 if (request.getQuestionClassType() == 2){
-                    KmtExerciseQuestion newQuestion = saveQuestion(book, request, nextQuestion, questionImage, answerImage);
+                    KmtExerciseQuestion newQuestion = saveQuestion(book, request, previousQuestion, questionImage, answerImage);
                     saveJSONFile(newQuestion, request, questionImage);
                     ThreadPool.getInstance().addTask(new SyncSaveExerciseBookTask(kmtExerciseMapper, exerciseQuestionSearchService, book.getBookId()));
                 } else {
                     //新增大题, 如果已存在当前大题号,则报错
-                    String bqi = kmtExerciseMapper.findBigQuestionIndexByBookCourseId(nextQuestion.getBookCourseId(), request.getBigQuestionIndex());
+                    String bqi = kmtExerciseMapper.findBigQuestionIndexByBookCourseId(previousQuestion.getBookCourseId(), request.getBigQuestionIndex());
                     if (StringUtil.isBlank(bqi)){
-                        KmtExerciseQuestion newQuestion = saveQuestion(book, request, nextQuestion, questionImage, answerImage);
+                        KmtExerciseQuestion newQuestion = saveQuestion(book, request, previousQuestion, questionImage, answerImage);
                         saveJSONFile(newQuestion, request, questionImage);
                         ThreadPool.getInstance().addTask(new SyncSaveExerciseBookTask(kmtExerciseMapper, exerciseQuestionSearchService, book.getBookId()));
                     } else {
@@ -175,21 +183,23 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
         return result;
     }
 
-    private KmtExerciseQuestion saveQuestion(KmtExerciseBook book,AddExerciseQuestionRequest request, KmtExerciseQuestion nextQuestion, String questionImage, String answerImage){
-        kmtExerciseMapper.updateQuestionNumByBookIdAndNum(book.getBookId(), request.getNum());
+    private KmtExerciseQuestion saveQuestion(KmtExerciseBook book,AddExerciseQuestionRequest request, KmtExerciseQuestion previousQuestion, String questionImage, String answerImage){
+        kmtExerciseMapper.updateQuestionNumByBookIdAndNum(book.getBookId(), request.getNum() + 1);
         KmtExerciseQuestion kmtExerciseQuestion = new KmtExerciseQuestion();
         String newQuestionId = IdWorker.generateId();
         kmtExerciseQuestion.setId(newQuestionId);
-        kmtExerciseQuestion.setBookId(nextQuestion.getBookId());
-        kmtExerciseQuestion.setUnitId(nextQuestion.getUnitId());
-        kmtExerciseQuestion.setBookCourseId(nextQuestion.getBookCourseId());
+        kmtExerciseQuestion.setBookId(previousQuestion.getBookId());
+        kmtExerciseQuestion.setUnitId(previousQuestion.getUnitId());
+        kmtExerciseQuestion.setBookCourseId(previousQuestion.getBookCourseId());
         if (request.getQuestionClassType() == 2){
-            kmtExerciseQuestion.setBigQuestionIndex(nextQuestion.getBigQuestionIndex());
-            if (StringUtil.isBlank(nextQuestion.getParentId())){
-                kmtExerciseQuestion.setParentId(null);
-                kmtExerciseQuestion.setQuestionClassType(1);
+            kmtExerciseQuestion.setBigQuestionIndex(previousQuestion.getBigQuestionIndex());
+            if (StringUtil.isBlank(previousQuestion.getParentId()) && previousQuestion.getQuestionClassType() == 0){
+                //如果上一题是单题,修改为大标题
+                kmtExerciseMapper.updateKmtExerciseQuestionClassTypeAndParentId(null, 1, previousQuestion.getId());
+                kmtExerciseQuestion.setParentId(previousQuestion.getId());
+                kmtExerciseQuestion.setQuestionClassType(2);
             } else {
-                kmtExerciseQuestion.setParentId(nextQuestion.getParentId());
+                kmtExerciseQuestion.setParentId(previousQuestion.getParentId());
                 kmtExerciseQuestion.setQuestionClassType(2);
             }
         } else {
@@ -197,23 +207,20 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
             kmtExerciseQuestion.setParentId(null);
             kmtExerciseQuestion.setQuestionClassType(0);
         }
-        kmtExerciseQuestion.setPageIndex(nextQuestion.getPageIndex());
+        kmtExerciseQuestion.setPageIndex(previousQuestion.getPageIndex());
         kmtExerciseQuestion.setImage(questionImage);
         kmtExerciseQuestion.setCreateTime(new Date());
         kmtExerciseQuestion.setDealStatus(3);
         kmtExerciseQuestion.setAnswerImage(answerImage);
-        kmtExerciseQuestion.setNum(nextQuestion.getNum());
+        kmtExerciseQuestion.setNum(previousQuestion.getNum() + 1);
         kmtExerciseQuestion.setSmallQuestionName(request.getSmallQuestionIndex());
-        kmtExerciseQuestion.setCourseName(nextQuestion.getCourseName());
-        kmtExerciseQuestion.setIsCommonFlag(nextQuestion.getIsCommonFlag());
-        kmtExerciseQuestion.setExerciseBookId(nextQuestion.getExerciseBookId());
+        kmtExerciseQuestion.setCourseName(previousQuestion.getCourseName());
+        kmtExerciseQuestion.setIsCommonFlag(previousQuestion.getIsCommonFlag());
+        kmtExerciseQuestion.setExerciseBookId(previousQuestion.getExerciseBookId());
         kmtExerciseQuestion.setHandlerSubmitTime(DateUtil.parse_yyyyMMddHHmmss("1970-01-01 00:00:01"));
-        kmtExerciseQuestion.setQuestionPath(nextQuestion.getQuestionPath().substring(0, nextQuestion.getQuestionPath().lastIndexOf("/")) + "/" + newQuestionId + ".json");
+        kmtExerciseQuestion.setQuestionPath(previousQuestion.getQuestionPath().substring(0, previousQuestion.getQuestionPath().lastIndexOf("/")) + "/" + newQuestionId + ".json");
 //        logger.error(JSON.toJSONString(kmtExerciseQuestion));
         kmtExerciseQuestion = kmtExerciseQuestionService.save(kmtExerciseQuestion);
-        if (request.getQuestionClassType() == 2 && StringUtil.isBlank(nextQuestion.getParentId())) {
-            kmtExerciseMapper.updateParentIdAndClassType(kmtExerciseQuestion.getId(), 2, book.getBookId(), request.getNum());
-        }
         return kmtExerciseQuestion;
     }
 
@@ -301,14 +308,59 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
                 if(kmtExerciseQuestion.getQuestionClassType() == 0) {
                     return responseEntity.failure(ResponseConstant.CODE_000, "单题不能移动小题,请使用移动大题功能");
                 }
+                //如果移动到最开始或最末尾, 提示不能再移动
+                String parentId = null;
+                if (StringUtil.isBlank(kmtExerciseQuestion.getParentId())){
+                    parentId = kmtExerciseQuestion.getId();
+                } else {
+                    parentId = kmtExerciseQuestion.getParentId();
+                }
+                List<KmtExerciseQuestion> tempList = kmtExerciseMapper.findQuByParentId(parentId);
                 //移动小题
                 if (request.getType() == 1){
-                    //上移
-                    kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(),kmtExerciseQuestion.getNum() - 1);
-                    kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() - 1);
+                    //第一个小题不能往上移
+                    if (tempList != null && tempList.size() > 0){
+                        if (kmtExerciseQuestion.getId().equals(tempList.get(0).getId())){
+                            return  responseEntity.failure(ResponseConstant.CODE_000, "已移动到第一小题");
+                        }
+                        //如果是第二个小题上移, 修改题目的父子关系
+                        if (kmtExerciseQuestion.getId().equals(tempList.get(1).getId())){
+                            //先特殊修改第一题和第二题, 第三题开始修改父题
+                            kmtExerciseMapper.updateParentIdAndQuestionClassTypeAndNumById(null,
+                                    1, kmtExerciseQuestion.getNum() - 1, kmtExerciseQuestion.getId());
+                            kmtExerciseMapper.updateParentIdAndQuestionClassTypeAndNumById(kmtExerciseQuestion.getId(),
+                                    2, kmtExerciseQuestion.getNum(), tempList.get(0).getId());
+                            for (int i =2; i < tempList.size(); i++){
+                                kmtExerciseMapper.updateParentIdById(kmtExerciseQuestion.getId(), tempList.get(i).getId());
+                            }
+                        } else {
+                            //上移
+                            kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(),kmtExerciseQuestion.getNum() - 1);
+                            kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() - 1);
+                        }
+                    }
                 } else if (request.getType() == 2){
-                    kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(), kmtExerciseQuestion.getNum() + 1);
-                    kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() + 1);
+                    //最后一个小题不能往下移
+                    if (tempList != null && tempList.size() > 0){
+                        if (kmtExerciseQuestion.getId().equals(tempList.get(tempList.size() - 1).getId())){
+                            return responseEntity.failure(ResponseConstant.CODE_000, "已移动到最后一个小题的位置");
+                        }
+                        //如果是第一小题的下移, 修改题目父子关系
+                        if (kmtExerciseQuestion.getId().equals(tempList.get(0).getId())){
+                            //先特殊修改第一题和第二题, 第三题开始修改父题
+                            kmtExerciseMapper.updateParentIdAndQuestionClassTypeAndNumById(tempList.get(1).getId(),
+                                    2, kmtExerciseQuestion.getNum() + 1, kmtExerciseQuestion.getId());
+                            kmtExerciseMapper.updateParentIdAndQuestionClassTypeAndNumById(null,
+                                    1, kmtExerciseQuestion.getNum(), tempList.get(1).getId());
+                            for (int i =2; i < tempList.size(); i++){
+                                kmtExerciseMapper.updateParentIdById(tempList.get(1).getId(), tempList.get(i).getId());
+                            }
+                        } else {
+                            //下移
+                            kmtExerciseMapper.updateByBookIdAndNum(kmtExerciseQuestion.getBookId(), kmtExerciseQuestion.getNum(), kmtExerciseQuestion.getNum() + 1);
+                            kmtExerciseMapper.updateQuestionNumByQuestionId(kmtExerciseQuestion.getId(), kmtExerciseQuestion.getNum() + 1);
+                        }
+                    }
                 }
             } else  if (request.getQuestionClassType() == 1){
                 if (request.getType() == 1){
@@ -366,4 +418,53 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
         return false;
     }
 
+
+    @Override
+    public ResponseEntity findEditExerciseBooks(ExerciseBooksEditRequest request) {
+        ResponseEntity responseEntity = new ResponseEntity();
+        List<ExerciseBookEditDto> list = kmtExerciseMapper.findEditExerciseBooks(request);
+        Map<String, Object> data = new HashMap<>();
+        data.put("books", list);
+        return responseEntity.success(data, "成功");
+    }
+
+    @Override
+    public ResponseEntity findEditExerciseQuestions(ExerciseQuestionsEditRequest request) {
+        Page page = new Page(request.getPageNo(), request.getPageSize());
+        List<ExerciseQuestionEditDto> list = kmtExerciseMapper.findEditExerciseQuestions(request, page);
+        Map<String, String> users = new HashMap<>();
+        for (ExerciseQuestionEditDto questionEditDto : list){
+            String versionStr = knowledgeVersion.getVersionNameBySubjectAndVersionNum(questionEditDto.getCourseName(), questionEditDto.getVersion());
+            questionEditDto.setVersionName(versionStr);
+            if (questionEditDto.getDealStatus() != 2){
+                questionEditDto.setEditStatus(2);
+            }
+
+            if (questionEditDto.getType() == 1){
+                questionEditDto.setBookType("上半");
+            } else if (questionEditDto.getType() == 2){
+                questionEditDto.setBookType("下半");
+            } else if (questionEditDto.getType() == 3) {
+                questionEditDto.setBookType("不同");
+            } else {
+                questionEditDto.setBookType("整本");
+            }
+            if (users.containsKey(questionEditDto.getUserId())){
+                questionEditDto.setCreateUserName(users.get(questionEditDto.getUserId()));
+            } else {
+                TbLibManager libManager = bookManagerDao.findByUserIdAndType(questionEditDto.getUserId(), 17);
+                if (libManager != null){
+                    questionEditDto.setCreateUserName(libManager.getName());
+                    users.put(questionEditDto.getUserId(), libManager.getName());
+                }
+            }
+        }
+        Map<String, Object> data = new HashMap<>();
+        data.put("pageNo", page.getCurrent());
+        data.put("pageSize", page.getSize());
+        data.put("pages", page.getPages());
+        data.put("total", page.getTotal());
+        data.put("list", list);
+        return new ResponseEntity().success(data, "成功");
+    }
 }

+ 12 - 0
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseQuestionServiceImpl.java

@@ -145,9 +145,21 @@ public class KmtExerciseQuestionServiceImpl extends BaseServiceImpl<KmtExerciseQ
         if (StringUtils.isNotBlank(request.getPeriodId())){
             List<ExerciseQuetionDto> questions = null;
             if (StringUtil.isNotBlank(request.getQuestionId())){
+                String temp = kmtExerciseMapper.findDifferentExerciseBookId(request.getQuestionId().trim());
                 questions = kmtExerciseMapper.findExerciseQuestionByQuestionId(request.getQuestionId().trim(), page);
+                if (StringUtil.isNotBlank(temp)){
+                    for (ExerciseQuetionDto q : questions){
+                        q.setIsCommonFlag(q.getIsCommonFlag() == 0 ? 1 : 0);
+                    }
+                }
             } else {
+                String temp = kmtExerciseMapper.findDifferentExerciseBookIdByBookId(request.getBookId());
                 questions = kmtExerciseMapperService.findQuestionByBookCourseIdAndUserId(request, page,  userId);
+                if (StringUtil.isNotBlank(temp)){
+                    for (ExerciseQuetionDto q : questions){
+                        q.setIsCommonFlag(q.getIsCommonFlag() == 0 ? 1 : 0);
+                    }
+                }
             }
             kmtExerciseService.appendQuestionDtoDataFromJSONFile(questions);
             list = this.getQuestionGroupList(questions, true);

+ 7 - 0
ssj-kmt-exercise-service-impl/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseServiceImpl.java

@@ -343,6 +343,13 @@ public class KmtExerciseServiceImpl implements KmtExerciseService {
         ResponseEntity responseEntity = new ResponseEntity();
         responseEntity.success(ResponseConstant.CODE_999, "发布成功");
         List<KmtExerciseQuestion> kmtExerciseQuestions = kmtExerciseMapperService.findKmtExerciseQuestionsByIdIn(request.getQuestionIds());
+
+        for  (KmtExerciseQuestion kmtExerciseQuestion : kmtExerciseQuestions){
+            if (kmtExerciseQuestion.getDealStatus() == 2){
+                return  responseEntity.failure(ResponseConstant.CODE_000, "打回AI的题目无法发布");
+            }
+        }
+
         this.appendQuestionDataFromJSONFile(kmtExerciseQuestions);
         if (CollectionUtils.isNotEmpty(kmtExerciseQuestions)){
             String exerciseBookId = kmtExerciseQuestions.get(0).getExerciseBookId();  //练习册id

+ 1 - 1
ssj-kmt-exercise-service-impl/src/main/resources/application.properties

@@ -1,7 +1,7 @@
 #\u670D\u52A1\u542F\u52A8\u7AEF\u53E3
 server.port=9090
 spring.application.name=ssj-kmt-exercise-service-provider
-logger.level=info
+logger.level=trace
 dubbo.scan.base-packages=com.ssj
 dubbo.application.id=ssj-kmt-exercise-service-provider
 dubbo.application.name=ssj-kmt-exercise-service-provider

+ 10 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/ExerciseQuetionDto.java

@@ -90,6 +90,8 @@ public class ExerciseQuetionDto implements Serializable {
 
     private String questionImage;
 
+    private int isCommonFlag;
+
     @JSONField(serialize = false)
     private String handleUserId;
 
@@ -708,4 +710,12 @@ public class ExerciseQuetionDto implements Serializable {
     public void setOriginAnswer(String originAnswer) {
         this.originAnswer = originAnswer;
     }
+
+    public int getIsCommonFlag() {
+        return isCommonFlag;
+    }
+
+    public void setIsCommonFlag(int isCommonFlag) {
+        this.isCommonFlag = isCommonFlag;
+    }
 }

+ 27 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/exercise/ExerciseBookEditDto.java

@@ -0,0 +1,27 @@
+package com.ssj.service.kmt.dto.exercise;
+
+import java.io.Serializable;
+
+public class ExerciseBookEditDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String exerciseBookId;
+
+    private String exerciseBookName;
+
+    public String getExerciseBookId() {
+        return exerciseBookId;
+    }
+
+    public void setExerciseBookId(String exerciseBookId) {
+        this.exerciseBookId = exerciseBookId;
+    }
+
+    public String getExerciseBookName() {
+        return exerciseBookName;
+    }
+
+    public void setExerciseBookName(String exerciseBookName) {
+        this.exerciseBookName = exerciseBookName;
+    }
+}

+ 155 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/dto/exercise/ExerciseQuestionEditDto.java

@@ -0,0 +1,155 @@
+package com.ssj.service.kmt.dto.exercise;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class ExerciseQuestionEditDto  implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String questionId;
+
+    private String exerciseBookName;
+
+    private String courseName;
+
+    private String grade;
+
+    @JSONField(serialize = false)
+    private int version;
+
+    private String versionName;
+
+    private int semester;
+
+    @JSONField(serialize = false)
+    private int dealStatus;
+
+    @JSONField(serialize = false)
+    private int type;
+
+    private String bookType;
+
+    private Date createTime;
+
+    @JSONField(serialize = false)
+    private String userId;
+
+    private String createUserName;
+
+    private int editStatus = 1;
+
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+
+    public String getExerciseBookName() {
+        return exerciseBookName;
+    }
+
+    public void setExerciseBookName(String exerciseBookName) {
+        this.exerciseBookName = exerciseBookName;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getGrade() {
+        return grade;
+    }
+
+    public void setGrade(String grade) {
+        this.grade = grade;
+    }
+
+    public int getVersion() {
+        return version;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public int getSemester() {
+        return semester;
+    }
+
+    public void setSemester(int semester) {
+        this.semester = semester;
+    }
+
+    public int getDealStatus() {
+        return dealStatus;
+    }
+
+    public void setDealStatus(int dealStatus) {
+        this.dealStatus = dealStatus;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getVersionName() {
+        return versionName;
+    }
+
+    public void setVersionName(String versionName) {
+        this.versionName = versionName;
+    }
+
+    public String getBookType() {
+        return bookType;
+    }
+
+    public void setBookType(String bookType) {
+        this.bookType = bookType;
+    }
+
+    public String getCreateUserName() {
+        return createUserName;
+    }
+
+    public void setCreateUserName(String createUserName) {
+        this.createUserName = createUserName;
+    }
+
+    public int getEditStatus() {
+        return editStatus;
+    }
+
+    public void setEditStatus(int editStatus) {
+        this.editStatus = editStatus;
+    }
+}

+ 76 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/request/rollbackai/ExerciseBooksEditRequest.java

@@ -0,0 +1,76 @@
+package com.ssj.service.kmt.request.rollbackai;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+public class ExerciseBooksEditRequest implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(name = "subject", value = "科目", required = true)
+    private String  subject;
+
+    @ApiModelProperty(name = "versionType", value = "版本号", required = true)
+    private int  versionType;
+
+    @ApiModelProperty(name = "grade", value = "年级", required = true)
+    private String  grade;
+
+    @ApiModelProperty(name = "semester", value = "上下册,1上2下", required = true)
+    private int  semester;
+
+    @ApiModelProperty(name = "bookName", value = "练习册名称", required = false)
+    private String  bookName;
+
+    @ApiModelProperty(name = "questionId", value = "题目id", required = false)
+    private String questionId;
+
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public int getVersionType() {
+        return versionType;
+    }
+
+    public void setVersionType(int versionType) {
+        this.versionType = versionType;
+    }
+
+    public String getGrade() {
+        return grade;
+    }
+
+    public void setGrade(String grade) {
+        this.grade = grade;
+    }
+
+    public int getSemester() {
+        return semester;
+    }
+
+    public void setSemester(int semester) {
+        this.semester = semester;
+    }
+
+    public String getBookName() {
+        return bookName;
+    }
+
+    public void setBookName(String bookName) {
+        this.bookName = bookName;
+    }
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+}

+ 53 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/request/rollbackai/ExerciseQuestionsEditRequest.java

@@ -0,0 +1,53 @@
+package com.ssj.service.kmt.request.rollbackai;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+public class ExerciseQuestionsEditRequest implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(name = "questionId", value = "题目id", required = false)
+    private String questionId;
+
+    @ApiModelProperty(name = "exerciseBookId", value = "练习册id", required = true)
+    private String  exerciseBookId;
+
+    @ApiModelProperty(name = "pageNo", value = "页码", required = true)
+    private int  pageNo;
+
+    @ApiModelProperty(name = "pageSize", value = "每页条数", required = true)
+    private int  pageSize;
+
+    public String getExerciseBookId() {
+        return exerciseBookId;
+    }
+
+    public void setExerciseBookId(String exerciseBookId) {
+        this.exerciseBookId = exerciseBookId;
+    }
+
+    public int getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(int pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public String getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(String questionId) {
+        this.questionId = questionId;
+    }
+}

+ 17 - 0
ssj-kmt-exercise-service/src/main/java/com/ssj/service/kmt/service/KmtExerciseQuestionDealService.java

@@ -2,7 +2,9 @@ package com.ssj.service.kmt.service;
 
 import com.ssj.framework.core.util.ResponseEntity;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
 import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionDealRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionsEditRequest;
 
 public interface KmtExerciseQuestionDealService {
 
@@ -28,4 +30,19 @@ public interface KmtExerciseQuestionDealService {
      * @return
      */
     ResponseEntity moveExerciseQuestion(String userId, ExerciseQuestionDealRequest request);
+
+    /**
+     * 查询修改的练习册
+     * @param request
+     * @return
+     */
+    ResponseEntity findEditExerciseBooks(ExerciseBooksEditRequest request);
+
+
+    /**
+     * 查询待修改的题目
+     * @param request
+     * @return
+     */
+    ResponseEntity findEditExerciseQuestions (ExerciseQuestionsEditRequest request);
 }

+ 35 - 4
ssj-mybatis-service-impl/src/main/java/com/ssj/service/mapper/KmtExerciseMapper.java

@@ -13,14 +13,13 @@ import com.ssj.service.conch.parents.v2.dto.TrainRecommendQuestionDTO;
 import com.ssj.service.kmt.dto.ExerciseBookDto;
 import com.ssj.service.kmt.dto.ExerciseQuetionDto;
 import com.ssj.service.kmt.dto.OriginalQuestionDTO;
-import com.ssj.service.kmt.dto.exercise.ExerciseQuestionRollbacks;
-import com.ssj.service.kmt.dto.exercise.ExerciseUnitBookcourseDto;
-import com.ssj.service.kmt.dto.exercise.KmtExerciseBookLibDto;
-import com.ssj.service.kmt.dto.exercise.KmtExerciseQuestionRollBackInfo;
+import com.ssj.service.kmt.dto.exercise.*;
 import com.ssj.service.kmt.exercisesys.dto.*;
 import com.ssj.service.kmt.exercisesys.request.*;
 import com.ssj.service.kmt.request.UnitAndPeriodListRequest;
 import com.ssj.service.kmt.request.rollbackai.AddExerciseQuestionRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseBooksEditRequest;
+import com.ssj.service.kmt.request.rollbackai.ExerciseQuestionsEditRequest;
 import com.ssj.service.sys.homework.vo.HomeworkExerciseBookDto;
 import org.apache.ibatis.annotations.*;
 
@@ -1158,6 +1157,14 @@ public interface KmtExerciseMapper {
     @Select("select id, num from kmt_exercise_questions where id=#{questionId} or parent_id=#{questionId} order by num")
     List<String> findQuestionIdByParentId (@Param("questionId")String questionId);
 
+    /**
+     * 查询题目以及题目的小题
+     * @param questionId
+     * @return
+     */
+    @Select("select * from kmt_exercise_questions where id=#{questionId} or parent_id=#{questionId} order by num")
+    List<KmtExerciseQuestion> findQuByParentId (@Param("questionId")String questionId);
+
     @Update("update kmt_exercise_questions set parent_id=#{parentId}, question_class_type=#{questionClassType}" +
             " where id=#{id}")
     int updateKmtExerciseQuestionClassTypeAndParentId (@Param("parentId")String parentId,
@@ -1222,4 +1229,28 @@ public interface KmtExerciseMapper {
     @Update("update kmt_exercise_questions set big_question_index=#{bigQuestionIndex} where parent_id=#{parentId}")
     int updateBigQuestionIndexByParentId (@Param("bigQuestionIndex") String bigQuestionIndex,
                                           @Param("parentId") String parentId);
+
+    List<ExerciseBookEditDto> findEditExerciseBooks (@Param("request")ExerciseBooksEditRequest request);
+
+
+    List<ExerciseQuestionEditDto> findEditExerciseQuestions (@Param("request")ExerciseQuestionsEditRequest request,
+                                    Page page);
+
+    @Select("select eb.id from kmt_exercise_book eb, kmt_exercise_questions eq where eb.book_id=eq.book_id" +
+            " and eq.id=#{questionId} and eb.book_type=3 limit 1")
+    String findDifferentExerciseBookId (@Param("questionId") String questionId);
+
+    @Select("select eb.id from kmt_exercise_book eb where eb.book_id=#{bookId} and eb.book_type=3 limit 1")
+    String findDifferentExerciseBookIdByBookId (@Param("bookId") String bookId);
+
+    @Update("update kmt_exercise_questions set parent_id=#{parentId} where id=#{id}")
+    int updateParentIdById (@Param("parentId") String parentId,
+                            @Param("id") String id);
+
+    @Update("update kmt_exercise_questions set parent_id=#{parentId}, question_class_type=#{questionClassType}," +
+            " num = #{num} where id=#{id}")
+    int updateParentIdAndQuestionClassTypeAndNumById (@Param("parentId") String parentId,
+                                                      @Param("questionClassType") int questionClassType,
+                                                      @Param("num") int num,
+                                                      @Param("id") String id);
 }

+ 35 - 1
ssj-mybatis-service-impl/src/main/resources/mybatis/mapper/KmtExerciseMapper.xml

@@ -2013,7 +2013,7 @@
 
     <select id="findExerciseQuestionByQuestionId" resultType="com.ssj.service.kmt.dto.ExerciseQuetionDto">
         select eq.id question_id, eq.course_name, eb.handle_user_id, eb.auditing_user_id, eb.analysis_user_id, eb.analysis_auditer_id, eq.book_course_id course_id,
-        eq.big_question_index, eq.small_question_name small_question_index,
+        eq.big_question_index, eq.small_question_name small_question_index, eq.is_common_flag,
         eq.deal_status question_status, eq.create_time, eq.remark reason, eq.from_user_id, eq.to_user_id,
         eq.question_type question_types, eq.difficulty_level difficulty_levels, eq.real_exam_type real_exam_types,
         eq.training_skill training_skills, eq.parent_id, eq.proofread_status, eq.question_path, eq.num, eq.create_time
@@ -2034,4 +2034,38 @@
             #{id}
         </foreach>
     </update>
+
+    <select id="findEditExerciseBooks" resultType="com.ssj.service.kmt.dto.exercise.ExerciseBookEditDto">
+        select distinct eb.id exercise_book_id, eb.book_name exercise_book_name from kmt_exercise_question_rollback rb, kmt_exercise_questions eq, kmt_exercise_book eb
+        where rb.question_id=eq.id and eq.exercise_book_id=eb.id and  rb.type=2
+        <choose>
+            <when test="request.questionId != null and request.questionId != ''">
+                and eq.id=#{request.questionId}
+            </when>
+            <otherwise>
+                and eb.grade=#{request.grade}
+                and eb.course_name=#{request.subject}
+                and eb.version=#{request.versionType} and eb.semester=#{request.semester}
+                <if test="request.bookName != null and request.bookName != ''">
+                    and eb.book_name like concat('%',#{request.bookName},'%')
+                </if>
+            </otherwise>
+        </choose>
+    </select>
+
+    <select id="findEditExerciseQuestions" resultType="com.ssj.service.kmt.dto.exercise.ExerciseQuestionEditDto">
+        select eq.id question_id, eb.book_name exercise_book_name, eb.course_name, eb.grade, eb.version, eb.semester,
+        eq.deal_status, eb.book_type type, rb.create_time, rb.user_id from kmt_exercise_question_rollback rb,
+        kmt_exercise_questions eq, kmt_exercise_book eb
+        where rb.question_id=eq.id and eq.exercise_book_id=eb.id and  rb.type=2
+        <choose>
+            <when test="request.questionId != null and request.questionId != ''">
+                and eq.id=#{request.questionId}
+            </when>
+            <otherwise>
+                and eb.id=#{request.exerciseBookId}
+            </otherwise>
+        </choose>
+        order by rb.create_time desc
+    </select>
 </mapper>

+ 13 - 0
ssj-sys/src/main/java/com/ssj/service/kmt/kmt/service/impl/KmtExerciseServiceImpl.java

@@ -128,6 +128,12 @@ public class KmtExerciseServiceImpl implements KmtExerciseService {
             return responseEntity;
         }
         List<KmtExerciseQuestion> kmtExerciseQuestions = kmtExerciseMapperService.findKmtExerciseQuestionsByIdIn(questionIdList);
+        for (KmtExerciseQuestion kmtExerciseQuestion : kmtExerciseQuestions){
+            if (kmtExerciseQuestion.getDealStatus() == 2 && request.getDealType() == 1){
+                return responseEntity.failure(ResponseConstant.CODE_000, "请勿重复打回");
+            }
+        }
+
         if (CollectionUtils.isNotEmpty(kmtExerciseQuestions)){
             this.appendQuestionDataFromJSONFile(kmtExerciseQuestions);
         }
@@ -343,6 +349,13 @@ public class KmtExerciseServiceImpl implements KmtExerciseService {
         ResponseEntity responseEntity = new ResponseEntity();
         responseEntity.success(ResponseConstant.CODE_999, "发布成功");
         List<KmtExerciseQuestion> kmtExerciseQuestions = kmtExerciseMapperService.findKmtExerciseQuestionsByIdIn(request.getQuestionIds());
+
+        for  (KmtExerciseQuestion kmtExerciseQuestion : kmtExerciseQuestions){
+            if (kmtExerciseQuestion.getDealStatus() == 2){
+                return  responseEntity.failure(ResponseConstant.CODE_000, "打回AI的题目无法发布");
+            }
+        }
+
         this.appendQuestionDataFromJSONFile(kmtExerciseQuestions);
         if (CollectionUtils.isNotEmpty(kmtExerciseQuestions)){
             String exerciseBookId = kmtExerciseQuestions.get(0).getExerciseBookId();  //练习册id

+ 7 - 6
ssj-sys/src/main/resources/application-test.properties

@@ -1,5 +1,6 @@
 logging.config=classpath:logback-test.xml
-spring.datasource.url=jdbc:mysql://192.168.2.152:3306/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+spring.datasource.url=jdbc:mysql://172.18.106.198:3306/aijia?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+#characterEncoding=utf8&useSSL=false&serverTimezone=UTC
 spring.datasource.username=aijia
 spring.datasource.password=SSJ1QAZxsw2!@
 
@@ -44,8 +45,8 @@ spring.data.mongodb.option.heartbeat-frequency=10000
 spring.data.mongodb.option.local-threshold=15
 
 #spring.redis.cluster.nodes=120.79.157.115:6379
-spring.redis.cluster.nodes=192.168.2.117:7000,192.168.2.117:7001,192.168.2.117:7002,192.168.2.117:7003,192.168.2.117:7004,192.168.2.117:7005
-spring.redis.password=aijia@78342
+spring.redis.cluster.nodes=172.18.30.192:6380,172.18.30.192:6381,172.18.30.192:6382,172.18.30.192:6383,172.18.30.192:6384,172.18.30.192:6385
+spring.redis.password=dc1qazxsw2!@
 spring.redis.database=0
 spring.redis.timeout=3000
 spring.redis.block-when-exhausted=true
@@ -58,7 +59,7 @@ spring.redis.cluster.pool.min-idle=0
 
 spring.jmx.enabled=false
 
-spring.rabbitmq.host=192.168.2.117
+spring.rabbitmq.host=172.18.30.192
 spring.rabbitmq.port=5672
 spring.rabbitmq.username=guest
 spring.rabbitmq.password=guest
@@ -67,14 +68,14 @@ spring.rabbitmq.publisher-returns=true
 
 
 dubbo.registry.id=ssj-dubbo-registry
-dubbo.registry.address=zookeeper://120.79.192.45:2181
+dubbo.registry.address=zookeeper://39.108.210.183:2181
 dubbo.protocol.serialization=java
 dubbo.protocol.name=dubbo
 dubbo.protocol.port=-1
 dubbo.consumer.timeout=50000
 
 
-spring.elasticsearch.cluster.host=192.168.2.152
+spring.elasticsearch.cluster.host=172.18.106.198
 spring.elasticsearch.cluster.port=9200
 spring.elasticsearch.cluster.scheme=http
 spring.elasticsearch.cluster.username=elastic