ソースを参照

Merge branch 'master' of http://47.112.200.206:3000/chchen/JzPeiXun

# Conflicts:
#	pom.xml
#	src/main/java/com/aijia/peixun/controller/JzPeiXunController.java
#	src/main/java/com/aijia/peixun/service/JzPeiXunService.java
#	src/main/java/com/aijia/peixun/service/JzPeiXunServiceImpl.java
shenhao 4 年 前
コミット
f7d823ff69
31 ファイル変更438 行追加179 行削除
  1. 25 31
      pom.xml
  2. 4 4
      src/main/java/com/aijia/KmtApp.java
  3. 0 2
      src/main/java/com/aijia/core/filter/CorsFilter.java
  4. 2 2
      src/main/java/com/aijia/core/utils/HttpRemote.java
  5. 2 2
      src/main/java/com/aijia/core/web/BaseController.java
  6. 20 0
      src/main/java/com/aijia/kmt/common/HttpSessionConfig.java
  7. 1 1
      src/main/java/com/aijia/kmt/common/SpringContextHolder.java
  8. 1 1
      src/main/java/com/aijia/kmt/es/service/base/BaseElasticService.java
  9. 3 3
      src/main/java/com/aijia/kmt/mapper/KmtExerciseMapper.java
  10. 1 1
      src/main/java/com/aijia/kmt/service/impl/KmtExerciseMapperServiceImpl.java
  11. 36 5
      src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionDealServiceImpl.java
  12. 17 10
      src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionListServiceImpl.java
  13. 0 1
      src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionServiceImpl.java
  14. 36 4
      src/main/java/com/aijia/kmt/service/impl/KmtExerciseSubmitServiceImpl.java
  15. 2 2
      src/main/java/com/aijia/kmt/utils/ExerciseUtil.java
  16. 1 19
      src/main/java/com/aijia/kmt/utils/SystemResourceLocator.java
  17. 10 0
      src/main/java/com/aijia/kmt/vo/ExerciseQuestionsRequest.java
  18. 0 0
      src/main/java/com/aijia/peixun/controller/JzPeiXunController.java
  19. 0 0
      src/main/java/com/aijia/peixun/service/JzPeiXunService.java
  20. 0 0
      src/main/java/com/aijia/peixun/service/JzPeiXunServiceImpl.java
  21. 9 10
      src/main/java/com/aijia/questioninfo/service/impl/KmtExerciseQuestionInfoServiceImpl.java
  22. 2 3
      src/main/java/com/aijia/train/controller/ApiTrainController.java
  23. 9 3
      src/main/java/com/aijia/train/service/impl/TrainServiceImpl.java
  24. 141 0
      src/main/java/com/aijia/train/task/ChangeUserStatTask.java
  25. 6 6
      src/main/resources/application-prod.properties
  26. 22 0
      src/main/resources/application-quartz.properties
  27. 1 1
      src/main/resources/application.properties
  28. 57 57
      src/main/resources/mybatis/mapper/KmtExerciseMapper.xml
  29. 4 4
      src/main/resources/mybatis/mybatis-config.xml
  30. 22 0
      src/main/resources/quartz.properties
  31. 4 7
      src/test/java/com/aijia/kmt/TestMain.java

+ 25 - 31
pom.xml

@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
-    <version>2.1.3.RELEASE</version>
+    <version>2.1.6.RELEASE</version>
   </parent>
   <dependencies>
     <dependency>
@@ -38,26 +38,6 @@
       <version>1.1.19</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.dubbo</groupId>
-      <artifactId>dubbo</artifactId>
-      <version>2.7.5</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.dubbo</groupId>
-      <artifactId>dubbo-spring-boot-starter</artifactId>
-      <version>2.7.5</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.dubbo</groupId>
-      <artifactId>dubbo-registry-nacos</artifactId>
-      <version>2.7.5</version>
-    </dependency>
-    <dependency>
-      <groupId>com.alibaba.nacos</groupId>
-      <artifactId>nacos-client</artifactId>
-      <version>1.1.4</version>
-    </dependency>
-    <dependency>
       <groupId>org.elasticsearch.client</groupId>
       <artifactId>elasticsearch-rest-high-level-client</artifactId>
       <exclusions>
@@ -72,6 +52,11 @@
       </exclusions>
     </dependency>
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.10.0</version>
+    </dependency>
+    <dependency>
       <groupId>org.elasticsearch.client</groupId>
       <artifactId>elasticsearch-rest-client</artifactId>
     </dependency>
@@ -141,10 +126,6 @@
       <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.springframework.session</groupId>
-      <artifactId>spring-session-data-redis</artifactId>
-    </dependency>
-    <dependency>
       <groupId>redis.clients</groupId>
       <artifactId>jedis</artifactId>
     </dependency>
@@ -175,11 +156,6 @@
       <version>2.0.1.Final</version>
     </dependency>
     <dependency>
-      <groupId>redis.clients</groupId>
-      <artifactId>jedis</artifactId>
-      <version>3.6.1</version>
-    </dependency>
-    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.16</version>
@@ -224,6 +200,24 @@
           <groupId>org.apache.tomcat.embed</groupId>
           <artifactId>tomcat-embed-core</artifactId>
       </dependency>
+
+    <!-- 任务调度quartz -->
+    <dependency>
+      <groupId>org.quartz-scheduler</groupId>
+      <artifactId>quartz</artifactId>
+      <version>2.2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.quartz-scheduler</groupId>
+      <artifactId>quartz-jobs</artifactId>
+      <version>2.2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.71</version>
+    </dependency>
+
   </dependencies>
 
   <!-- Package as an executable jar -->
@@ -294,4 +288,4 @@
       </properties>
     </profile>
   </profiles>
-</project>
+</project>

+ 4 - 4
src/main/java/com/aijia/KmtApp.java

@@ -1,19 +1,19 @@
 package com.aijia;
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  *
  */
-@SpringBootApplication
-@EnableDubbo
+@SpringBootApplication(scanBasePackages = {"com.aijia"})
 @EnableJpaRepositories
-@ServletComponentScan(basePackages = "com.aijia.core.filter")
+@EnableScheduling
+@ServletComponentScan
 class KmtApp extends SpringBootServletInitializer {
     public static void main(String[] args) throws InterruptedException {
         SpringApplication.run(KmtApp.class);

+ 0 - 2
src/main/java/com/aijia/core/filter/CorsFilter.java

@@ -7,7 +7,6 @@ import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
-
 public class CorsFilter implements Filter {
 
     @Override
@@ -16,7 +15,6 @@ public class CorsFilter implements Filter {
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-        System.out.println("我来了");
         HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
         httpResponse.setHeader("Access-Control-Allow-Headers","DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,x_requested_with,If-Modified-Since,Cache-Control,Content-Type,Authorization");
         httpResponse.setHeader("Access-Control-Allow-Credentials", "true");

+ 2 - 2
src/main/java/com/aijia/core/utils/HttpRemote.java

@@ -1,6 +1,6 @@
 package com.aijia.core.utils;
 
-import org.apache.commons.io.IOUtils;
+
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -53,7 +53,7 @@ public class HttpRemote {
         HttpPost httpPost = new HttpPost(url);
         // 设置参数
         UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(setHttpParams(argsMap), "UTF-8");
-        logger.debug("POST请求参数为:" + IOUtils.toString(encodedFormEntity.getContent()));
+//        logger.debug("POST请求参数为:" + IOUtils.toString(encodedFormEntity.getContent()));
         httpPost.setEntity(encodedFormEntity);
         // 执行请求
         HttpResponse httpResponse = httpClient.execute(httpPost);

+ 2 - 2
src/main/java/com/aijia/core/web/BaseController.java

@@ -49,7 +49,7 @@ public abstract class BaseController {
 		}
 		pageNo = pageNo == 0 ? 0 : pageNo - 1;
 		pageSize = pageSize == 0 ? 10 : pageSize;
-		Pageable page = new PageRequest(pageNo, pageSize);
+		Pageable page = PageRequest.of(pageNo, pageSize);
 		return page;
 	}
 
@@ -71,7 +71,7 @@ public abstract class BaseController {
 		}
 		pageNo = pageNo == 0 ? 0 : pageNo - 1;
 		pageSize = pageSize == 0 ? 10 : pageSize;
-		Pageable page = new PageRequest(pageNo, pageSize, direction, properties);
+		Pageable page =PageRequest.of(pageNo, pageSize, direction, properties);
 		return page;
 	}
 

+ 20 - 0
src/main/java/com/aijia/kmt/common/HttpSessionConfig.java

@@ -0,0 +1,20 @@
+package com.aijia.kmt.common;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.session.data.redis.config.ConfigureRedisAction;
+
+@Configuration
+public class HttpSessionConfig {
+
+    /**
+     *  解决redis集群环境没有开启Keyspace notifications导致的
+     *
+     *  Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource
+     *
+     * */
+    @Bean
+    public static ConfigureRedisAction configureRedisAction() {
+        return ConfigureRedisAction.NO_OP;
+    }
+}

+ 1 - 1
src/main/java/com/aijia/kmt/common/SpringContextHolder.java

@@ -1,10 +1,10 @@
 package com.aijia.kmt.common;
 
-import org.apache.dubbo.config.annotation.Service;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
 
 import java.util.Map;
 

+ 1 - 1
src/main/java/com/aijia/kmt/es/service/base/BaseElasticService.java

@@ -353,7 +353,7 @@ public class BaseElasticService {
         long startTime = System.currentTimeMillis();
         Page<T> page=new PageImpl<T>(new ArrayList<T>());
         if(pageable==null) {
-        	pageable= new PageRequest(1, 500);//默认为第一页,一共500条。
+        	pageable= PageRequest.of(1, 500);//默认为第一页,一共500条。
         }
         try {
         	long total=count(idxName, builder);

+ 3 - 3
src/main/java/com/aijia/kmt/mapper/KmtExerciseMapper.java

@@ -72,7 +72,7 @@ public interface KmtExerciseMapper {
     List<ExerciseQuetionDto> findQuestionByBookCourseIdAndUserIdNew(
             @Param("req") ExerciseQuestionsRequest req,
             @Param("userId") String userId,
-            Page page);
+            Page page,@Param("type") int type);
 
     List<ExerciseQuetionDto> findAllQuestionByGradeDetail(@Param("req") Map<String, Object> req,  Page page);
 
@@ -1135,7 +1135,7 @@ public interface KmtExerciseMapper {
      * @return
      */
     List<ExerciseQuetionDto> findExerciseQuestionByQuestionIdAndBookId (@Param("questionId") String questionId,
-                                                                        @Param("bookId") String bookId);
+                                                                        @Param("bookId") String bookId,@Param("userId") String userId);
 
     /**
      * 查询题目以及题目的小题
@@ -1277,7 +1277,7 @@ public interface KmtExerciseMapper {
                                                      @Param("userId") String userId);
 
     @Update("update tr_train_user_exercise set concise_id=#{startX}, analysis_submit_type=#{startY}, update_type=#{endX}," +
-            " es_loaded=#{endY}, enumerate=#{enumerate} where id=#{questionId} and user_id = #{userId}")
+            " es_loaded=#{endY}, enumerate=#{enumerate} where question_id=#{questionId} and user_id = #{userId}")
     int updateQuestionStartPointAndEndPoint (@Param("startX") int startX,
                                              @Param("startY") int startY,
                                              @Param("endX") int endX,

+ 1 - 1
src/main/java/com/aijia/kmt/service/impl/KmtExerciseMapperServiceImpl.java

@@ -102,7 +102,7 @@ public class KmtExerciseMapperServiceImpl implements KmtExerciseMapperService {
     public List<ExerciseQuetionDto> findQuestionByBookCourseIdAndUserId(ExerciseQuestionsRequest request, Page page, String userId) {
 //        return kmtExerciseMapper.findQuestionByBookCourseIdAndUserId(request.getPeriodId(), request.getDealType(), userId, request.getRollbackType(), 
 //    	request.getExerciseBookId(), page);
-    	return kmtExerciseMapper.findQuestionByBookCourseIdAndUserIdNew(request, userId, page);
+    	return kmtExerciseMapper.findQuestionByBookCourseIdAndUserIdNew(request, userId, page,0);
     }
 
     @Override

+ 36 - 5
src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionDealServiceImpl.java

@@ -29,10 +29,14 @@ import com.aijia.kmt.vo.rollbackai.ExerciseBooksEditRequest;
 import com.aijia.kmt.vo.rollbackai.ExerciseQuestionDealRequest;
 import com.aijia.kmt.vo.rollbackai.ExerciseQuestionsEditRequest;
 import com.aijia.questioninfo.service.KmtExerciseQuestionInfoService;
+import com.aijia.train.bean.TrTrainUserExercise;
+import com.aijia.train.mapper.TrainUserExerciseMapper;
 import com.aijia.utils.DateUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
@@ -78,6 +82,9 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
     @Autowired
     private KmtExerciseQuestionInfoService questionInfoService;
 
+    @Autowired
+    private TrainUserExerciseMapper userExerciseMapper;
+
     @Override
     public ResponseEntity addOrEditExerciseQuestionOld(String userId, AddExerciseQuestionRequest request) {
         ResponseEntity responseEntity = new ResponseEntity();
@@ -597,8 +604,28 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
                     return responseEntity.failure("请把坐标定位在图片内");
                 }
                 // 新加入字段
-                kmtExerciseMapper.updateQuestionStartPointAndEndPoint(request.getStartX(), request.getStartY(),
-                        request.getEndX(), request.getEndY(), request.getQuestionId(),request.getEnumerate(),userId);
+                TrTrainUserExercise questionInfo = userExerciseMapper.selectOne(
+                        new QueryWrapper<TrTrainUserExercise>().eq("question_id",request.getQuestionId())
+                                .eq("user_id", userId));
+                if(Objects.isNull(questionInfo)){
+                    questionInfo = new TrTrainUserExercise();
+                    questionInfo.setUpdateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+                    questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+                    questionInfo.setUserId(userId);
+                    questionInfo.setExerciseId(kmtExerciseQuestion.getBookId());
+                    questionInfo.setQuestionId(request.getQuestionId());
+                    questionInfo.setConciseId(request.getStartX());
+                    questionInfo.setAnalysisSubmitType(request.getStartY());
+                    questionInfo.setUpdateType(request.getEndX());
+                    questionInfo.setEsLoaded(request.getEndY());
+                    questionInfo.setEnumerate(request.getEnumerate());
+                    questionInfo.setStatus(2);
+                    userExerciseMapper.insert(questionInfo);
+                }else{
+                    kmtExerciseMapper.updateQuestionStartPointAndEndPoint(request.getStartX(), request.getStartY(),
+                            request.getEndX(), request.getEndY(), request.getQuestionId(),request.getEnumerate(),userId);
+                }
+
 
                 // 判断为 1
                 if (request.getEnumerate()==1){
@@ -614,6 +641,8 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
                             }
                             map.put("question", "<img src='" + PropertiesUtil.getValue("STATIC_FILE_URL") + path + "'/>");
                             map.put("userId",userId);
+                            map.put("questionPath",path);
+                            map.put("bookId",kmtExerciseQuestion.getBookId());
                             //JSONFileUtil.saveJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + kmtExerciseQuestion.getQuestionPath(), JSON.toJSONString(map));
                             questionInfoService.updateQuestionAndJsonByQuestionId(kmtExerciseQuestion.getId(), map);
                             //AijiaThreadPool.getInstance().submit(new SyncSaveExerciseQuestionsTask(kmtExerciseMapper, exerciseQuestionSearchService,  Collections.singletonList(kmtExerciseQuestion.getId())));
@@ -675,7 +704,7 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
     private String createNewFile (int startX, int startY, int endX, int endY, String relatePath) throws CommonException, IOException {
         String prefix = PropertiesUtil.getValue("file_save_path");
         String dir = relatePath.substring(0, relatePath.lastIndexOf("/") + 1);
-        String fileName = relatePath.substring(relatePath.lastIndexOf("/") + 1, relatePath.lastIndexOf("."));
+        String fileName = UUID.randomUUID().toString();
         String resultFilePath = prefix + dir  + "result_" + fileName + relatePath.substring(relatePath.lastIndexOf("."));
 //        OSSUtils.downloadFile(resultFilePath, relatePath.substring(1));
         boolean result = drawImagePartColorByPosition(startX, startY, endX, endY, resultFilePath, relatePath);
@@ -700,8 +729,9 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
         boolean result = true;
         //有宽高的才处理
         if (maxx > 0 && maxy > 0){
-            String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
+//            String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
 //                String prefix = "https://xt-sharingschool.oss-cn-shenzhen.aliyuncs.com";
+            String prefix = "https://img-sharingschool-new.oss-cn-shenzhen-internal.aliyuncs.com";
             InputStream in = getImageStream(prefix + relatePath);
             logger.info("原图={}", prefix + relatePath);
             if (in == null){
@@ -731,8 +761,9 @@ public class KmtExerciseQuestionDealServiceImpl implements KmtExerciseQuestionDe
     }
 
     public String getContentType(String relatePath) throws IOException {
-        String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
+//        String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
 //        String prefix = "https://xt-sharingschool.oss-cn-shenzhen.aliyuncs.com";
+        String prefix = "https://img-sharingschool-new.oss-cn-shenzhen-internal.aliyuncs.com";
         InputStream in = getImageStream(prefix + relatePath);
         byte[] buf = new byte[10240];
         in.read(buf);

+ 17 - 10
src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionListServiceImpl.java

@@ -12,8 +12,10 @@ import com.aijia.kmt.service.KmtExerciseQuestionListService;
 import com.aijia.kmt.utils.JSONFileUtil;
 import com.aijia.kmt.utils.PropertiesUtil;
 import com.aijia.kmt.vo.ExerciseQuestionsRequest;
+import com.aijia.train.bean.TrTrainPartUser;
 import com.aijia.train.bean.TrTrainUserExercise;
 import com.aijia.train.mapper.TrainUserExerciseMapper;
+import com.aijia.train.mapper.TrainUserServiceMapper;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -40,8 +42,13 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
     @Autowired
     private TrainUserExerciseMapper userExerciseMapper;
 
+    @Autowired
+    private TrainUserServiceMapper userServiceMapper;
+
     @Override
     public ResponseEntity findQuestionList (String userId, ExerciseQuestionsRequest request) {
+        TrTrainPartUser user = userServiceMapper.selectById(userId);
+        String paramUserId = user.getManagerType()==1?request.getUserId():userId;
         ResponseEntity responseEntity = new ResponseEntity();
         Map<String, Object> data = new HashMap<>();
         Page page = new Page(request.getPageNo(), request.getPageSize());
@@ -52,7 +59,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
                //questions = kmtExerciseMapper.findExerciseQuestionByQuestionIdAndBookId(request.getQuestionId().trim(), request.getExerciseBookId());
                 page = new Page(1, 10, 1);
             }
-            questions = kmtExerciseMapper.findQuestionByBookCourseIdAndUserIdNew(request, userId, page);
+            questions = kmtExerciseMapper.findQuestionByBookCourseIdAndUserIdNew(request, paramUserId, page,user.getManagerType());
 //        } else if (request.getExerciseBookId().startsWith("book_")) {
 //            //选择全部
 //            String[] param = request.getExerciseBookId().split("_");
@@ -69,7 +76,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
         //管理员看到的题目列表是两层级, 老师看到的列表是一层级
         List<QuestionListV1Dto> list = null;
         //加工页面必显示大题,统一成两层级,如果大题目是二次查询出来的,设置为不可加工
-        list = changeDbQuestion(questions,true,userId); //默认两层级的结构
+        list = changeDbQuestion(questions,true,paramUserId); //默认两层级的结构
         data.put("list", list);
         data.put("pageNo", page.getCurrent());
         data.put("pageSize", page.getSize());
@@ -178,7 +185,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
             list.forEach(temp -> {
                 QuestionListV1Dto tar = changeExerciseDto2QuestionListDto(temp, questionKnows, users);
                 if (isTwoLevel && StringUtil.isNotBlank(temp.getParentId())){
-                    addTar2Result(tar, result, temp.getParentId(), temp.getExerciseBookId());
+                    addTar2Result(tar, result, temp.getParentId(), temp.getExerciseBookId(),null);
                 } else {
                     result.add(tar);
                 }
@@ -202,7 +209,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
             list.forEach(temp -> {
                 QuestionListV1Dto tar = changeExerciseDto2QuestionListDto(temp, questionKnows, users);
                 if (isTwoLevel && StringUtil.isNotBlank(temp.getParentId())){
-                    addTar2Result(tar, result, temp.getParentId(), temp.getExerciseBookId());
+                    addTar2Result(tar, result, temp.getParentId(), temp.getExerciseBookId(),userId);
                 } else {
                     result.add(tar);
                 }
@@ -235,7 +242,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
         return tar;
     }
 
-    private void addTar2Result (QuestionListV1Dto tar, List<QuestionListV1Dto> result, String parentId, String bookId){
+    private void addTar2Result (QuestionListV1Dto tar, List<QuestionListV1Dto> result, String parentId, String bookId,String userId){
         if (StringUtil.isNotBlank(parentId)){
             boolean exist = false;
             for (QuestionListV1Dto questionListV1Dto : result) {
@@ -248,7 +255,7 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
 
             //如果大题不存在, 新增空大题(只有题目id), 可能大题已经被加工
             if (!exist){
-                QuestionListV1Dto parent = getParentQuestionV1Dto(parentId, bookId);
+                QuestionListV1Dto parent = getParentQuestionV1Dto(parentId, bookId,userId);
                 parent.setIsQuestionCanDeal(1); //大题不可加工
                 parent.getChildQuestions().add(tar);
                 result.add(parent);
@@ -260,20 +267,20 @@ public class KmtExerciseQuestionListServiceImpl implements KmtExerciseQuestionLi
      * 查询父题dto
      * @return
      */
-    private QuestionListV1Dto getParentQuestionV1Dto (String parentId, String bookId) {
+    private QuestionListV1Dto getParentQuestionV1Dto (String parentId, String bookId,String userId) {
         QuestionListV1Dto parent = new QuestionListV1Dto();
         if (StringUtil.isNotBlank(parentId)){
             String temp = kmtExerciseMapper.findDifferentExerciseBookId(parentId);
-            List<ExerciseQuetionDto> questions = kmtExerciseMapper.findExerciseQuestionByQuestionIdAndBookId(parentId, bookId);
+            List<ExerciseQuetionDto> questions = kmtExerciseMapper.findExerciseQuestionByQuestionIdAndBookId(parentId, bookId,userId);
             if (CollectionUtils.isNotEmpty(questions)){
                 if (StringUtil.isNotBlank(temp)){
                     for (ExerciseQuetionDto q : questions){
                         q.setIsCommonFlag(q.getIsCommonFlag() == 0 ? 1 : 0);
                     }
                 }
-                List<QuestionListKnowModel> questionKnows = kmtExerciseMapper.findQuestionKnowByQuestionIds(Collections.singletonList(parentId),null);
+                List<QuestionListKnowModel> questionKnows = kmtExerciseMapper.findQuestionKnowByQuestionIds(Collections.singletonList(parentId),userId);
                 List<TbLibManager> users = getDealUsers(questions);
-                this.appendQuestionDtoDataFromJSONFile(questions);
+                this.appendQuestionDtoDataFromJSONFile(questions,userId);
                 for (ExerciseQuetionDto q : questions){
                     if (StringUtil.isNotBlank(q.getQuestionImage())){
                         q.setQuestion("<img src='" + PropertiesUtil.getValue("STATIC_FILE_URL") + q.getQuestionImage() + "'/>");

+ 0 - 1
src/main/java/com/aijia/kmt/service/impl/KmtExerciseQuestionServiceImpl.java

@@ -32,7 +32,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
-import com.alibaba.nacos.client.naming.utils.RandomUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.elasticsearch.index.query.QueryBuilder;

+ 36 - 4
src/main/java/com/aijia/kmt/service/impl/KmtExerciseSubmitServiceImpl.java

@@ -96,6 +96,7 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
     @Transactional(propagation = Propagation.NOT_SUPPORTED)
     public ResponseEntity submit2Auditing(AuditingV1Request request, String userId) {
         ResponseEntity responseEntity = new ResponseEntity();
+        Map<String,Object> data = new HashMap<>(8);
         if (CollectionUtils.isNotEmpty(request.getQuestions())) {
 //            logger.error("2");
             List<String> questionIds = request.getQuestions().stream().map(QuestionUpdateRequest::getQuestionId).collect(Collectors.toList());
@@ -109,7 +110,7 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
                                         .eq("user_id", userId)
                         );
                         if (questionInfo == null){
-                            //已经提交过的更新
+                            //已经提交过的更新
                             questionInfo = new TrTrainUserExercise();
                             KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(q.getId());
                             questionInfo.setQuestionId(r.getQuestionId());
@@ -124,6 +125,7 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
                             questionInfo.setAnalysis(q.getAnalysis());
                             questionInfo.setAnalysisJson(r.getAnalysisJson());
                             questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+                            questionInfo.setStatus(1);
                             if(CollectionUtils.isNotEmpty(r.getDifficultyLevels())){
                                 questionInfo.setDifficultyLevel(r.getDifficultyLevels().get(0).getType());
                             }
@@ -137,6 +139,34 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
                                 questionInfo.setTrainingSkill(r.getTrainingSkills().stream().map(KnowledgeBaseDto::getName).collect(Collectors.joining(",")));
                             }
                             userExerciseMapper.insert(questionInfo);
+                        }else{
+                            KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(q.getId());
+                            questionInfo.setQuestionId(r.getQuestionId());
+                            questionInfo.setQuestionOrg(kmtExerciseQuestion.getImage());
+                            questionInfo.setUserId(userId);
+                            questionInfo.setExerciseId(q.getBookId());
+                            questionInfo.setQuestion(q.getQuestion());
+                            questionInfo.setQuestionText(r.getQuestionText());
+                            questionInfo.setQuestionJson(q.getQuestionJson());
+                            questionInfo.setAnswer(r.getAnswer());
+                            questionInfo.setAnswerJson(r.getAnswerJson());
+                            questionInfo.setAnalysis(q.getAnalysis());
+                            questionInfo.setAnalysisJson(r.getAnalysisJson());
+                            questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+                            questionInfo.setStatus(1);
+                            if(CollectionUtils.isNotEmpty(r.getDifficultyLevels())){
+                                questionInfo.setDifficultyLevel(r.getDifficultyLevels().get(0).getType());
+                            }
+                            if(CollectionUtils.isNotEmpty(r.getQuestionTypes())){
+                                questionInfo.setQuestionType(r.getQuestionTypes().get(0).getType());
+                            }
+                            if(CollectionUtils.isNotEmpty(r.getRealExamTypes())){
+                                questionInfo.setRealExamType(r.getRealExamTypes().stream().map(k->k.getType()+"").collect(Collectors.joining(",")));
+                            }
+                            if(CollectionUtils.isNotEmpty(r.getTrainingSkills())){
+                                questionInfo.setTrainingSkill(r.getTrainingSkills().stream().map(KnowledgeBaseDto::getName).collect(Collectors.joining(",")));
+                            }
+                            userExerciseMapper.updateById(questionInfo);
                         }
                     }
                 });
@@ -153,17 +183,19 @@ public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
             //查看是否所有的题目都处理提交
             //查询提交题目数
             int count = userExerciseMapper.selectCount(new QueryWrapper<TrTrainUserExercise>()
-                    .eq("user_id",userId).eq("exercise_id",questions.get(0).getExerciseBookId()));
+                    .eq("user_id",userId).eq("exercise_id",questions.get(0).getBookId()).eq("status",1));
             //查询总题目数
             int qCount = kmtExerciseQuestionMapper.selectCount(new QueryWrapper<KmtExerciseQuestion>()
-                    .eq("book_id",questions.get(0).getExerciseBookId()));
+                    .eq("book_id",questions.get(0).getBookId()));
+            data.put("commitAll",1);
             if(count == qCount){
                 TrTrainPartUser user = userServiceMapper.selectById(userId);
                 user.setStudyStatus(4);
                 userServiceMapper.updateById(user);
+                data.put("commitAll",2);
             }
 
-            responseEntity.success("提交成功");
+            responseEntity.success(data,"提交成功");
         }
         return responseEntity;
     }

+ 2 - 2
src/main/java/com/aijia/kmt/utils/ExerciseUtil.java

@@ -34,8 +34,8 @@ public class ExerciseUtil {
     public static Map<String, Integer> getImageWidthAndHeight (String imageUrl){
         Map<String, Integer> result = new HashMap<>();
         try {
-            String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
-//            String prefix = "https://img-sharingschool-new.oss-cn-shenzhen-internal.aliyuncs.com";
+//            String prefix = PropertiesUtil.getValue("OSS_INTERNAL_PATH");
+            String prefix = "https://img-sharingschool-new.oss-cn-shenzhen-internal.aliyuncs.com";
             HttpResponse response = null;
             try{
                  response = HttpUtils.doGet(prefix, imageUrl ,

+ 1 - 19
src/main/java/com/aijia/kmt/utils/SystemResourceLocator.java

@@ -1,6 +1,5 @@
 package com.aijia.kmt.utils;
 
-import org.apache.dubbo.config.spring.ReferenceBean;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -157,24 +156,7 @@ public class SystemResourceLocator implements ApplicationContextAware {
 	}
 
 	public static <T> T getBean(Class<T> requiredType, String version) {
-		T tobj = null;
-		try {
-			tobj = context.getBean(requiredType);
-		} catch (Exception e) {
-		} finally {
-			if (tobj == null) {
-				ReferenceBean<T> referenceBean = new ReferenceBean<T>();
-				try {
-					referenceBean.setInterface(requiredType);
-					referenceBean.setTimeout(50000);
-					referenceBean.setVersion(version);
-					tobj = (T) referenceBean.getObject();
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		return tobj;
+        return context.getBean(requiredType);
 	}
 
 	/**

+ 10 - 0
src/main/java/com/aijia/kmt/vo/ExerciseQuestionsRequest.java

@@ -9,6 +9,8 @@ public class ExerciseQuestionsRequest extends BaseRequest {
 
     @ApiModelProperty(name = "subject", value = "科目", required = true)
     private String  subject;
+    @ApiModelProperty(name = "userId", value = "用户id", required = false)
+    private String  userId;
 
     @ApiModelProperty(name = "versionType", value = "版本类别, 如语文1北师大版,2人教版", required = true)
     private int  versionType;
@@ -205,4 +207,12 @@ public class ExerciseQuestionsRequest extends BaseRequest {
     public void setPublishStatus(int publishStatus) {
         this.publishStatus = publishStatus;
     }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
 }

+ 0 - 0
src/main/java/com/aijia/peixun/controller/JzPeiXunController.java


+ 0 - 0
src/main/java/com/aijia/peixun/service/JzPeiXunService.java


+ 0 - 0
src/main/java/com/aijia/peixun/service/JzPeiXunServiceImpl.java


+ 9 - 10
src/main/java/com/aijia/questioninfo/service/impl/KmtExerciseQuestionInfoServiceImpl.java

@@ -107,6 +107,7 @@ public class KmtExerciseQuestionInfoServiceImpl implements KmtExerciseQuestionIn
             questionInfo.setAnalysis((String)data.get("analysis"));
             questionInfo.setAnalysisJson((String)data.get("analysis_json"));
             questionInfo.setUpdateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setStatus(1);
             userExerciseMapper.updateById(questionInfo);
         } else {
             questionInfo = new TrTrainUserExercise();
@@ -123,6 +124,7 @@ public class KmtExerciseQuestionInfoServiceImpl implements KmtExerciseQuestionIn
             questionInfo.setAnalysis((String)data.get("analysis"));
             questionInfo.setAnalysisJson((String)data.get("analysis_json"));
             questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setStatus(1);
             userExerciseMapper.insert(questionInfo);
         }
     }
@@ -136,22 +138,19 @@ public class KmtExerciseQuestionInfoServiceImpl implements KmtExerciseQuestionIn
             questionInfo.setQuestion((String) data.get("question"));
             questionInfo.setQuestionJson(JSON.toJSONString(data.get("question_json")));
             questionInfo.setUpdateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setQuestionPath(data.get("questionPath").toString());
             userExerciseMapper.updateById(questionInfo);
         } else {
             questionInfo = new TrTrainUserExercise();
-            KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(questionId);
+            questionInfo.setQuestion((String) data.get("question"));
+            questionInfo.setQuestionJson(JSON.toJSONString(data.get("question_json")));
+            questionInfo.setUpdateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setQuestionPath(data.get("questionPath").toString());
             questionInfo.setUserId(MapUtils.getString(data,"userId"));
             questionInfo.setExerciseId(MapUtils.getString(data,"bookId"));
             questionInfo.setQuestionId(questionId);
-            questionInfo.setQuestionOrg(kmtExerciseQuestion.getImage());
-            questionInfo.setQuestion((String)data.get("question"));
-            questionInfo.setQuestionText((String)data.get("question_text"));
-            questionInfo.setQuestionJson((String)data.get("question_json"));
-            questionInfo.setAnswer((String)data.get("option_answer"));
-            questionInfo.setAnswerJson((String)data.get("answer_json"));
-            questionInfo.setAnalysis((String)data.get("analysis"));
-            questionInfo.setAnalysisJson((String)data.get("analysis_json"));
-            questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
+            questionInfo.setStatus(2);
             userExerciseMapper.insert(questionInfo);
             logger.warn("题目({})不存在{}", questionId, JSON.toJSONString(data));
         }

+ 2 - 3
src/main/java/com/aijia/train/controller/ApiTrainController.java

@@ -121,6 +121,7 @@ public class ApiTrainController extends BaseController {
                 data.put("type",user.getManagerType());
                 data.put("roleType",user.getRoleType());
                 data.put("name",StringUtil.isEmpty(user.getName())?"":user.getName());
+                data.put("subject",StringUtil.isEmpty(user.getSubject())?"":user.getSubject());
                 data.put("studyStat",user.getStudyStatus()<3?1:user.getStudyStatus()==3?2:user.getStudyStatus()==4?3:4);
                 responseEntity.success(data,"登录成功!");
             }
@@ -143,9 +144,7 @@ public class ApiTrainController extends BaseController {
             	responseEntity.failure("账号无身份权限");
                 return responseEntity;
             }
-            if(req.getRoleType()==null || req.getRoleType()==0){
-                req.setRoleType(tbLibManager.getRoleType());
-            }
+            req.setRoleType(tbLibManager.getRoleType());
             List<FileVO> list=trainService.findTrainFileList(userId,req.getRoleType());
             data.put("list",list);
             responseEntity.success(data, "查询成功");

+ 9 - 3
src/main/java/com/aijia/train/service/impl/TrainServiceImpl.java

@@ -51,7 +51,7 @@ public class TrainServiceImpl implements ITrainService {
     @Override
     public TrTrainPartUser getTrainUserByMobile(String loginName, int type) {
         TrTrainPartUser user = userServiceMapper.getTrainUserByMobile(loginName);
-        if(Objects.isNull(user)){
+        if(Objects.isNull(user) && type==0){
             user = new TrTrainPartUser();
             user.setMobile(loginName);
             user.setStatus(1);
@@ -133,7 +133,7 @@ public class TrainServiceImpl implements ITrainService {
         //查看本文件是否解锁
         TrTrainUserInfo info = userInfoServiceMapper.selectOne(
                 new QueryWrapper<TrTrainUserInfo>().eq("user_id",userId)
-                        .eq("file_id",id)
+                        .eq("file_id",id).eq("status",1)
         );
         if(Objects.isNull(info)){
             return  responseEntity.failure("不能跳过顺序解锁学习进度!");
@@ -158,6 +158,9 @@ public class TrainServiceImpl implements ITrainService {
         TrTrainFiles firstFiles = fileServiceMapper.findNextFile(1,roleType,subject);
         if(Objects.nonNull(firstFiles)) {
             saveUserInfoData(firstFiles.getId(), roleType, subject, userId);
+            TrTrainPartUser user = userServiceMapper.selectById(userId);
+            user.setStudyStatus(1);
+            userServiceMapper.updateById(user);
         }
     }
 
@@ -207,6 +210,9 @@ public class TrainServiceImpl implements ITrainService {
             if(user.getCheckTimes() == 1){
                 this.startStudy(user.getRoleType(),user.getSubject(),user.getId());
             }
+            //退出
+            String token = tokenManager.getToken(userId,"train");
+            tokenManager.removeToken(token,"train");
         }
     }
 
@@ -247,7 +253,7 @@ public class TrainServiceImpl implements ITrainService {
     private void saveUserInfoData(String id,int roleType,String subject,String userId){
         TrTrainUserInfo info = userInfoServiceMapper.selectOne(
                 new QueryWrapper<TrTrainUserInfo>().eq("user_id",userId)
-                .eq("file_id",id)
+                .eq("file_id",id).eq("status",1)
         );
         if(Objects.isNull(info)){
             info = new TrTrainUserInfo();

+ 141 - 0
src/main/java/com/aijia/train/task/ChangeUserStatTask.java

@@ -0,0 +1,141 @@
+package com.aijia.train.task;
+
+import com.aijia.train.bean.TrTrainFiles;
+import com.aijia.train.bean.TrTrainPartUser;
+import com.aijia.train.bean.TrTrainUserInfo;
+import com.aijia.train.mapper.TrainFileServiceMapper;
+import com.aijia.train.mapper.TrainUserExerciseMapper;
+import com.aijia.train.mapper.TrainUserInfoServiceMapper;
+import com.aijia.train.mapper.TrainUserServiceMapper;
+import com.aijia.train.service.ITrainService;
+import com.aijia.utils.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author sh
+ * @className ChangeUserStatTask
+ * @description 定时器
+ * @date 2021/8/17
+ */
+@Component
+public class ChangeUserStatTask {
+
+    @Autowired
+    private TrainUserServiceMapper userServiceMapper;
+    @Autowired
+    private TrainFileServiceMapper fileServiceMapper;
+
+    @Autowired
+    private TrainUserInfoServiceMapper userInfoServiceMapper;
+
+    @Autowired
+    private TrainUserExerciseMapper userExerciseMapper;
+
+    /**
+     * // 每分钟执行一次
+     * @throws Exception
+     */
+    @Scheduled(cron = "0 0/3 * * * ?")
+    public void work() throws Exception {
+        List<TrTrainPartUser> list = userServiceMapper.selectList(new QueryWrapper<TrTrainPartUser>().eq("status",1));
+        list.forEach(u->{
+            if(u.getStudyStatus() == 1){
+                TrTrainFiles nextFiles = fileServiceMapper.findNextFile(1,u.getRoleType(),u.getSubject());
+                if(Objects.nonNull(nextFiles)){
+                    TrTrainUserInfo info = userInfoServiceMapper.selectOne(
+                            new QueryWrapper<TrTrainUserInfo>().eq("user_id",u.getId())
+                                    .eq("file_id",nextFiles.getId()).eq("status",1));
+                    //相差秒数
+                    long time = (System.currentTimeMillis() - info.getCreateTime().getTime()) / 1000L;
+                    //相差分钟数
+                    long mi = time/60L;
+                    long hi = mi/60L;
+                    if(hi>=48){
+                        u.setStudyStatus(2);
+                        if(u.getStudyTimes()==1){
+                            u.setStudyTimes(2);
+                            u.setStatus(2);
+                            userInfoServiceMapper.updateByUserId(u.getId());
+                        }else{
+                            u.setStudyTimes(1);
+                        }
+                        userServiceMapper.updateById(u);
+                    }
+//                    //相差小时 测试环境注释这个
+//                    long hi = mi/60L;
+//                    if(hi>48){
+//                        u.setStudyStatus(2);
+//                        userServiceMapper.updateById(u);
+//                    }
+                }
+            }else if(u.getStudyStatus() == 3 && u.getCheckTimes()<2){
+                //看接入考核状态是否超过24小时
+                List<TrTrainUserInfo> infoList = userInfoServiceMapper.selectList(
+                        new QueryWrapper<TrTrainUserInfo>().eq("user_id",u.getId()).orderByDesc("create_time"));
+                TrTrainUserInfo info = infoList.get(0);
+                //相差秒数
+                long time = (System.currentTimeMillis() - info.getCreateTime().getTime()) / (1000L);
+                //相差分钟数
+                long mi = time/60L;
+//                if(mi>5){
+//                    u.setStudyStatus(2);
+//                    userServiceMapper.updateById(u);
+//                }
+//                    //相差小时 测试环境注释这个
+                    long hi = mi/60L;
+                    if(hi>=48){
+                        userInfoServiceMapper.updateByUserId(u.getId());
+                        userExerciseMapper.updateByUserId(u.getId());
+                        //审核不通过
+                        if(u.getCheckTimes() == 1){
+                            //两次不通过
+                            u.setCheckTimes(2);
+                            u.setStatus(2);
+                            u.setStudyStatus(6);
+                        }else{
+                            //重新学习
+                            u.setStudyStatus(1);
+                            u.setCheckTimes(1);
+                        }
+                        userServiceMapper.updateById(u);
+                        if(u.getCheckTimes() == 1){
+                            TrTrainFiles firstFiles = fileServiceMapper.findNextFile(1,u.getRoleType(),u.getSubject());
+                            if(Objects.nonNull(firstFiles)) {
+                                TrTrainUserInfo info2 = userInfoServiceMapper.selectOne(
+                                        new QueryWrapper<TrTrainUserInfo>().eq("user_id",u.getId())
+                                                .eq("file_id",firstFiles.getId()).eq("status",1)
+                                );
+                                if(Objects.isNull(info2)){
+                                    info = new TrTrainUserInfo();
+                                    info.setFileId(firstFiles.getId());
+                                    info.setCreateTime(new Date());
+                                    info.setRoleType(u.getRoleType());
+                                    info.setSubject(u.getSubject());
+                                    info.setUserId(u.getId());
+                                    info.setStatus(1);
+                                    userInfoServiceMapper.insert(info);
+                                }
+                            }
+                        }
+                    }
+            }
+
+        });
+    }
+
+//    @Scheduled(fixedRate = 5000)//每5秒执行一次
+//    public void play() throws Exception {
+//        System.out.println("执行Quartz定时器任务:"+new Date());
+//    }
+}

+ 6 - 6
src/main/resources/application-prod.properties

@@ -36,12 +36,12 @@ spring.rabbitmq.password=guest
 spring.rabbitmq.publisher-confirms=true
 spring.rabbitmq.publisher-returns=true
 
-dubbo.registry.id=aijia-kmt
-dubbo.application.name=aijia-kmt
-dubbo.registry.address=nacos://172.18.30.187:8848
-dubbo.protocol.name=dubbo
-dubbo.protocol.port=-1
-nacos.config.server-addr=172.18.30.187:8848
+#dubbo.registry.id=aijia-kmt
+#dubbo.application.name=aijia-kmt
+#dubbo.registry.address=nacos://172.18.30.187:8848
+#dubbo.protocol.name=dubbo
+#dubbo.protocol.port=-1
+#nacos.config.server-addr=172.18.30.187:8848
 
 spring.elasticsearch.cluster.host=172.18.91.9,172.18.91.10,172.18.91.11
 spring.elasticsearch.cluster.port=9200

+ 22 - 0
src/main/resources/application-quartz.properties

@@ -0,0 +1,22 @@
+#ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
+org.quartz.scheduler.instanceId=AUTO
+#指定调度程序的主线程是否应该是守护线程
+org.quartz.scheduler.makeSchedulerThreadDaemon=true
+#ThreadPool实现的类名
+org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+#ThreadPool配置线程守护进程
+org.quartz.threadPool.makeThreadsDaemons=true
+#线程数量
+org.quartz.threadPool.threadCount:40
+#线程优先级
+org.quartz.threadPool.threadPriority:5
+#数据保存方式为持久化
+org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+#StdJDBCDelegate说明支持集群
+org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#quartz内部表的前缀
+org.quartz.jobStore.tablePrefix=GZ_QRTZ_
+#是否加入集群
+org.quartz.jobStore.isClustered=true
+#容许的最大作业延长时间
+org.quartz.jobStore.misfireThreshold=25000

+ 1 - 1
src/main/resources/application.properties

@@ -60,4 +60,4 @@ spring.thymeleaf.encoding=UTF-8
 spring.thymeleaf.servlet.content-type=text/html
 spring.thymeleaf.cash=false
 #引入公共的配置
-spring.profiles.active=@activatedProperties@
+spring.profiles.active=local

+ 57 - 57
src/main/resources/mybatis/mapper/KmtExerciseMapper.xml

@@ -2049,7 +2049,7 @@
         select DISTINCT eb.id exercise_book_id, eb.book_id id, eb.book_year, eb.book_name name, eb.grade, eb.course_name subject, eb.version version_type,
         eb.semester, eb.book_type,eb.ai_rollback_import aiRollbackImport
         from kmt_exercise_book eb, kmt_exercise_questions eq,tr_train_exercise_role er
-        where eb.id=eq.exercise_book_id  and eb.part_flag != 3 and eb.id = er.exercise_id
+        where eb.id=eq.exercise_book_id  and eb.part_flag != 3 and eb.book_id = er.exercise_id
         <if test="questionId != null and questionId != ''">
             and eb.id=#{questionId}
         </if>
@@ -2081,12 +2081,24 @@
         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, qw.is_diff 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, qw.number num, eq.page_index,
-        eq.image question_image, eq.concise_id start_X, eq.analysis_submit_type start_Y, eq.update_type end_X, eq.es_loaded end_Y,eq.enumerate, eq.exercise_book_id
+        ifnull(ue.question_type,eq.question_type) question_types,
+	ifnull(ue.difficulty_level,eq.difficulty_level) difficulty_levels,
+	ifnull(ue.real_exam_type,eq.real_exam_type) real_exam_types,
+	ifnull(ue.training_skill,eq.training_skill) training_skills,
+         eq.parent_id, eq.proofread_status,
+         ifnull(ue.question_path,eq.question_path) as question_path,
+           qw.number num, eq.page_index,
+           ifnull(ue.question_path,eq.image) question_image,
+	ifnull(ue.concise_id,eq.concise_id) start_X,
+	ifnull(ue.analysis_submit_type,eq.analysis_submit_type) start_Y,
+	ifnull(ue.update_type,eq.update_type) end_X,
+	ifnull(ue.es_loaded,eq.es_loaded) end_Y,
+	ifnull(ue.enumerate,eq.enumerate) as enumerate,
+            eq.exercise_book_id
         from kmt_exercise_questions eq
         left join q_question_workbook qw on eq.id=qw.question_id
         left join kmt_exercise_book eb on eq.exercise_book_id=eb.id
+        left join tr_train_user_exercise ue on  eq.id = ue.question_id and ue.user_id=#{userId}
         where eq.id=#{questionId}
         and qw.sub_book_id=#{bookId} and eq.deal_status !=6
     </select>
@@ -2191,11 +2203,9 @@
 	eq.parent_id,
 	eq.proofread_status,
 	ifnull(ue.question_path,eq.question_path) as question_path,
-	<!-- eq.num,
-	eq.page_index, -->
 	t.number as num,
 	t.page_index,
-	eq.image question_image,
+	ifnull(ue.question_path,eq.image) question_image,
 	ifnull(ue.concise_id,eq.concise_id) start_X,
 	ifnull(ue.analysis_submit_type,eq.analysis_submit_type) start_Y,
 	ifnull(ue.update_type,eq.update_type) end_X,
@@ -2206,7 +2216,7 @@
 	  q_question_workbook t 
 	 LEFT JOIN kmt_exercise_questions eq ON t.question_id=eq.id
 	LEFT JOIN kmt_exercise_book eb ON eq.exercise_book_id = eb.id
-	left join tr_train_user_exercise ue on eb.id = ue.exercise_id and ue.user_id=#{userId}
+	left join tr_train_user_exercise ue on  t.question_id = ue.question_id and ue.user_id=#{userId}
     <if test="req.publishStatus==3">
         LEFT JOIN  q_question_info qi on t.question_id=qi.id
     </if>
@@ -2221,6 +2231,10 @@
     <if test="req.questionId !=null and req.questionId !=''">
         and eq.id=#{req.questionId}
     </if>
+    <if test="type == 0">
+        and (ue.id is null or ue.status = 2)
+    </if>
+
         order by t.number
     </select>
 
@@ -2310,55 +2324,41 @@
 			t.unit_name as NAME,
 			t.course_name as book_course_id,
 			t.course_name as book_course
-		FROM
-			q_question_workbook t
-		INNER JOIN kmt_exercise_questions eq ON t.question_id = eq.id
-		LEFT JOIN kmt_exercise_book eb ON eq.exercise_book_id = eb.id
-		where eq.exercise_book_id=#{bookId}
-        <choose>
-            <when test = "dealType == 1">
-                and eq.deal_status in (0, 1) and eb.handle_user_id=#{userId}
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <when test = "dealType == 2">
-                and eq.deal_status in (3, 7) and eb.auditing_user_id=#{userId}
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <when test = "dealType == 4">
-                and eq.deal_status in (5, 8) and eb.analysis_user_id=#{userId}
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <when test = "dealType == 5">
-                and eq.deal_status in (9, 10) and eb.analysis_auditer_id=#{userId}
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <when test = "dealType == 6">
-                and eq.deal_status >= 4 and eq.deal_status != 7 and eb.answer_correcter_id=#{userId} and eq.proofread_status = 0
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <when test = "dealType == 7">
-                and eq.proofread_status > 0 and eb.answer_correcter_id=#{userId}
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </when>
-            <otherwise>
-                <if test="questionId != null and questionId != ''">
-                    and eq.id=#{questionId}
-                </if>
-            </otherwise>
-        </choose>
-        order by t.number
+        FROM
+        (
+        SELECT
+        t.unit_name,
+        t.course_name,
+        @group_row :=
+        CASE
+
+        WHEN @parent_code = t.course_name COLLATE utf8mb4_0900_ai_ci THEN
+        @group_row + 1 ELSE 1
+        END AS groupRow,
+        @group_row2 :=
+        CASE
+
+        WHEN @parent_code = t.course_name COLLATE utf8mb4_0900_ai_ci
+        AND eb.id IS NOT NULL THEN
+        @group_row2 + 1 ELSE 1
+        END AS groupRow2,
+        @parent_code := t.course_name AS parent_code
+        FROM
+        q_question_workbook t
+        INNER JOIN kmt_exercise_questions eq ON t.question_id = eq.id
+        LEFT JOIN tr_train_user_exercise eb ON eq.id = eb.question_id and eb.user_id =#{userId}
+        LEFT JOIN ( SELECT @group_row := 1, @group_row2 := 1, @parent_code := '' ) AS b ON 1 = 1
+        WHERE
+        eq.exercise_book_id =#{bookId}
+        <if test="questionId != null and questionId != ''">
+            and eq.id=#{questionId}
+        </if>
+        ORDER BY
+        t.number
+        ) t
+        WHERE
+        t.groupRow  <![CDATA[ <> ]]> t.groupRow2
+
         ) a,(select @i:=0) num
     </select>
     

+ 4 - 4
src/main/resources/mybatis/mybatis-config.xml

@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
-	<settings>
-		<!--打印sql日志-->
-		<setting name="logImpl" value="STDOUT_LOGGING" />
-	</settings>
+<!--	<settings>-->
+<!--		&lt;!&ndash;打印sql日志&ndash;&gt;-->
+<!--		<setting name="logImpl" value="STDOUT_LOGGING" />-->
+<!--	</settings>-->
 	<typeAliases>
 		<typeAlias alias="Integer" type="java.lang.Integer" />
 		<typeAlias alias="Long" type="java.lang.Long" />

+ 22 - 0
src/main/resources/quartz.properties

@@ -0,0 +1,22 @@
+#ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
+org.quartz.scheduler.instanceId=AUTO
+#指定调度程序的主线程是否应该是守护线程
+org.quartz.scheduler.makeSchedulerThreadDaemon=true
+#ThreadPool实现的类名
+org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+#ThreadPool配置线程守护进程
+org.quartz.threadPool.makeThreadsDaemons=true
+#线程数量
+org.quartz.threadPool.threadCount:20
+#线程优先级
+org.quartz.threadPool.threadPriority:5
+#数据保存方式为持久化
+org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+#StdJDBCDelegate说明支持集群
+org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#quartz内部表的前缀
+org.quartz.jobStore.tablePrefix=GZ_QRTZ_
+#是否加入集群
+org.quartz.jobStore.isClustered=true
+#容许的最大作业延长时间
+org.quartz.jobStore.misfireThreshold=25000

+ 4 - 7
src/test/java/com/aijia/kmt/TestMain.java

@@ -2,23 +2,20 @@ package com.aijia.kmt;
 
 import com.aijia.questioninfo.dto.QuestionDto;
 import com.aijia.questioninfo.service.KmtExerciseQuestionInfoService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
+
 public class TestMain {
 
     @Autowired
     KmtExerciseQuestionInfoService kmtExerciseQuestionInfoService;
 
-    @Test
+
     public void testMain () {
-        QuestionDto result = kmtExerciseQuestionInfoService.getQuestionInfoFromDbByQuestionId("20210205441490097952456704");
-        System.out.println("11111");
+//        QuestionDto result = kmtExerciseQuestionInfoService.getQuestionInfoFromDbByQuestionId("20210205441490097952456704");
+//        System.out.println("11111");
     }
 
 }