wangliang пре 4 година
родитељ
комит
5c7598f5b4
22 измењених фајлова са 421 додато и 102 уклоњено
  1. 6 2
      distributed-print/pom.xml
  2. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/DistributedPrintApplication.java
  3. 0 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  4. 12 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/TBTaskController.java
  5. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/config/MapApiReader.java
  6. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/config/MetaHandler.java
  7. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/config/MultipartConfig.java
  8. 4 4
      distributed-print/src/main/java/com/qmth/distributed/print/interceptor/AuthInterceptor.java
  9. 42 47
      distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java
  10. 4 4
      distributed-print/src/main/resources/application-dev.properties
  11. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  12. 5 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  13. 10 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RedisUtil.java
  14. 12 4
      teachcloud-report/pom.xml
  15. 119 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MapApiReader.java
  16. 27 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MetaHandler.java
  17. 33 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MultipartConfig.java
  18. 6 6
      teachcloud-report/src/main/resources/application-dev.properties
  19. 18 8
      teachcloud-task/pom.xml
  20. 23 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java
  21. 33 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java
  22. 62 12
      teachcloud-task/src/main/resources/application-task.properties

+ 6 - 2
distributed-print/pom.xml

@@ -14,9 +14,13 @@
     </parent>
 
     <dependencies>
+<!--        <dependency>-->
+<!--            <groupId>com.qmth.teachcloud.task</groupId>-->
+<!--            <artifactId>teachcloud-task</artifactId>-->
+<!--        </dependency>-->
         <dependency>
-            <groupId>com.qmth.teachcloud.task</groupId>
-            <artifactId>teachcloud-task</artifactId>
+            <groupId>com.qmth.distributed.print.business</groupId>
+            <artifactId>distributed-print-business</artifactId>
         </dependency>
         <dependency>
             <groupId>com.qmth.teachcloud.common.api</groupId>

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/DistributedPrintApplication.java

@@ -21,7 +21,7 @@ import javax.annotation.Resource;
 @EntityScan(basePackages = {"com.qmth.distributed.print.business.entity","com.qmth.teachcloud.report.business.entity","com.qmth.teachcloud.common.entity"}) // 用来扫描和发现指定包及其子包中的Entity定义
 @EnableTransactionManagement // spring开启事务支持
 @EnableAsync // 开启异步任务
-@EnableCaching // 开启缓存注
+@EnableCaching // 开启缓存注
 public class DistributedPrintApplication {
 
     public static void main(String[] args) {

+ 0 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -84,9 +84,6 @@ public class SysController {
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
-    @Autowired
-    private BasicSchoolService basicSchoolService;
-
     /**
      * 登录
      *

+ 12 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/TBTaskController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.distributed.print.interceptor.AuthInterceptor;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.bean.result.TaskListResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -15,10 +16,11 @@ import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.TBTaskService;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.util.*;
 import io.swagger.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -27,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -40,6 +43,7 @@ import java.util.*;
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.data}")
 public class TBTaskController {
+    private final static Logger log = LoggerFactory.getLogger(TBTaskController.class);
 
     @Resource
     TBTaskService tbTaskService;
@@ -50,6 +54,9 @@ public class TBTaskController {
     @Resource
     AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @ApiOperation(value = "任务管理查询接口")
     @RequestMapping(value = "/task/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "任务管理列表信息", response = TaskListResult.class)})
@@ -91,7 +98,8 @@ public class TBTaskController {
         map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
         map.computeIfAbsent(SystemConstant.USER, v -> sysUser);
         map.computeIfAbsent(SystemConstant.MANUAL, v -> true);
-        asyncCreatePdfTempleteService.createPdf(map, null);
+//        asyncCreatePdfTempleteService.createPdf(map, null);
+        redisUtil.setForLeftList(SystemConstant.PDF_CACHE, map);
         return ResultUtil.ok(new EditResult());
     }
 

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/config/MapApiReader.java → distributed-print/src/main/java/com/qmth/distributed/print/config/MapApiReader.java

@@ -1,4 +1,4 @@
-package com.qmth.teachcloud.common.config;
+package com.qmth.distributed.print.config;
 
 import com.fasterxml.classmate.TypeResolver;
 import com.google.common.base.Optional;

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/config/MetaHandler.java → distributed-print/src/main/java/com/qmth/distributed/print/config/MetaHandler.java

@@ -1,4 +1,4 @@
-package com.qmth.teachcloud.common.config;
+package com.qmth.distributed.print.config;
 
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import org.apache.ibatis.reflection.MetaObject;

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/config/MultipartConfig.java → distributed-print/src/main/java/com/qmth/distributed/print/config/MultipartConfig.java

@@ -1,4 +1,4 @@
-package com.qmth.teachcloud.common.config;
+package com.qmth.distributed.print.config;
 
 /**
 * @Description: Multipart 附件上传配置

+ 4 - 4
distributed-print/src/main/java/com/qmth/distributed/print/interceptor/AuthInterceptor.java

@@ -22,11 +22,11 @@ public class AuthInterceptor extends ExtendInterceptor {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         log.info("preHandle is come in");
-//        if (request.getServletPath().contains(endpoint)) {
+        if (request.getServletPath().contains(endpoint)) {
             return true;
-//        } else {
-//            return AuthUtil.adminAuthInterceptor(request, response);
-//        }
+        } else {
+            return AuthUtil.adminAuthInterceptor(request, response);
+        }
     }
 
     @Override

+ 42 - 47
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -3,18 +3,12 @@ package com.qmth.distributed.print.start;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.service.OrgCenterDataDisposeService;
-import com.qmth.teachcloud.common.service.TBTaskService;
-import com.qmth.teachcloud.task.enums.JobEnum;
-import com.qmth.teachcloud.task.job.*;
-import com.qmth.teachcloud.task.service.QuartzService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
@@ -27,8 +21,8 @@ import java.util.Map;
 public class StartRunning implements CommandLineRunner {
     private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
 
-    @Resource
-    QuartzService quartzService;
+//    @Resource
+//    QuartzService quartzService;
 
     @Resource
     private OrgCenterDataDisposeService orgCenterDataDisposeService;
@@ -44,45 +38,46 @@ public class StartRunning implements CommandLineRunner {
 
         printCommonService.updateStatus();
 
-        log.info("增加学校信息同步定时任务 start");
-        Map schoolJobMap = new HashMap();
-        schoolJobMap.computeIfAbsent("name", v -> TimedSyncSchoolJob.class.getName());
-        quartzService.deleteJob(JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name());
-        // 每天0点定时任务
-        quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name(), "0 0 0 * * ?", schoolJobMap);
-        log.info("增加学校信息同步定时任务 end");
-
-//        log.info("增加重新生成pdf定时任务 start");
-//        Map taskJobMap = new HashMap();
-//        schoolJobMap.computeIfAbsent("name", v -> ResetCreatePdfJob.class.getName());
-//        quartzService.deleteJob(JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name());
-//         //每天0点定时任务
-//        quartzService.addJob(ResetCreatePdfJob.class, JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name(), "0 0/1 * * * ?", taskJobMap);
-//        log.info("增加重新生成pdf定时任务 end");
-
-        log.info("增加任务到期提醒定时任务 start");
-        Map expireJobMap = new HashMap();
-        expireJobMap.computeIfAbsent("name", v -> SendSmsExpireJob.class.getName());
-        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB.name(), JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB_GROUP.name());
-        // 每天15点定时任务
-        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB.name(), JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB_GROUP.name(), "0 0 15 * * ?", expireJobMap);
-        log.info("增加任务到期提醒定时任务 end");
-
-        log.info("增加任务逾期提醒定时任务 start");
-        Map orverdueJobMap = new HashMap();
-        orverdueJobMap.computeIfAbsent("name", v -> SendSmsOverdueJob.class.getName());
-        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name());
-        // 每天9点定时任务
-        quartzService.addJob(SendSmsOverdueJob.class, JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name(), "0 0 9 * * ?", orverdueJobMap);
-        log.info("增加任务逾期提醒定时任务 end");
-
-        log.info("增加短信发送失败重发定时任务 start");
-        Map rensendJobMap = new HashMap();
-        rensendJobMap.computeIfAbsent("name", v -> ResendSmsJob.class.getName());
-        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name());
-        // 每隔1小时定时任务
-        quartzService.addJob(ResendSmsJob.class, JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name(), "0 0/30 * * * ?", rensendJobMap);
-        log.info("增加短信发送失败重发定时任务 end");
+//        log.info("增加学校信息同步定时任务 start");
+//        Map schoolJobMap = new HashMap();
+//        schoolJobMap.computeIfAbsent("name", v -> TimedSyncSchoolJob.class.getName());
+//        quartzService.deleteJob(JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name());
+//        // 每天0点定时任务
+////        quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name(), "0 0 0 * * ?", schoolJobMap);
+//        quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name(), "0 0/1 * * * ?", schoolJobMap);
+//        log.info("增加学校信息同步定时任务 end");
+//
+////        log.info("增加重新生成pdf定时任务 start");
+////        Map taskJobMap = new HashMap();
+////        schoolJobMap.computeIfAbsent("name", v -> ResetCreatePdfJob.class.getName());
+////        quartzService.deleteJob(JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name());
+////         //每天0点定时任务
+////        quartzService.addJob(ResetCreatePdfJob.class, JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name(), "0 0/1 * * * ?", taskJobMap);
+////        log.info("增加重新生成pdf定时任务 end");
+//
+//        log.info("增加任务到期提醒定时任务 start");
+//        Map expireJobMap = new HashMap();
+//        expireJobMap.computeIfAbsent("name", v -> SendSmsExpireJob.class.getName());
+//        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB.name(), JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB_GROUP.name());
+//        // 每天15点定时任务
+//        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB.name(), JobEnum.SMS_NOTICE_TASK_EXPIRE_JOB_GROUP.name(), "0 0 15 * * ?", expireJobMap);
+//        log.info("增加任务到期提醒定时任务 end");
+//
+//        log.info("增加任务逾期提醒定时任务 start");
+//        Map orverdueJobMap = new HashMap();
+//        orverdueJobMap.computeIfAbsent("name", v -> SendSmsOverdueJob.class.getName());
+//        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name());
+//        // 每天9点定时任务
+//        quartzService.addJob(SendSmsOverdueJob.class, JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB.name(), JobEnum.SMS_NOTICE_TASK_OVERDUE_JOB_GROUP.name(), "0 0 9 * * ?", orverdueJobMap);
+//        log.info("增加任务逾期提醒定时任务 end");
+//
+//        log.info("增加短信发送失败重发定时任务 start");
+//        Map rensendJobMap = new HashMap();
+//        rensendJobMap.computeIfAbsent("name", v -> ResendSmsJob.class.getName());
+//        quartzService.deleteJob(JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name());
+//        // 每隔1小时定时任务
+//        quartzService.addJob(ResendSmsJob.class, JobEnum.SMS_NOTICE_TASK_RESEND_JOB.name(), JobEnum.SMS_NOTICE_TASK_RESEND_JOB_GROUP.name(), "0 0/30 * * * ?", rensendJobMap);
+//        log.info("增加短信发送失败重发定时任务 end");
 
         log.info("服务器启动时执行 end");
     }

+ 4 - 4
distributed-print/src/main/resources/application-dev.properties

@@ -12,7 +12,7 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=merge
+db.name=distributed-136
 db.username=root
 db.password=123456789
 
@@ -20,7 +20,7 @@ db.password=123456789
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
 com.qmth.redis.db=0
-#com.qmth.redis.password
+#com.qmth.redis.password=
 
 #mysql\u914D\u7F6E
 com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
@@ -65,7 +65,7 @@ org.center.orgQueryApi=/api/open/org/query
 #com.qmth.api.uri-prefix=/aaa
 #\u7EDF\u8BA1\u9875\u9762\u914D\u7F6E
 com.qmth.api.metrics-endpoint=/metrics-count
-com.qmth.api.global-auth=true
+com.qmth.api.global-auth=false
 #com.qmth.api.global-strict=false
 #com.qmth.api.global-rate-limit=1/5s
 
@@ -94,7 +94,7 @@ com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/Users/king/Downloads/distributed-print.log
 
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
-spring.profiles.include=task
+#spring.profiles.include=task
 
 #\uFFFD\uFFFD\uFFFD\u013E\uFFFD\uFFFD\uFFFD\uFFFDurl
 sync.config.hostUrl=http://localhost:8080/

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -88,6 +88,7 @@ public class SystemConstant {
     public static final String PRIVILEGE_URL_CACHE = "privilege:url:cache";
     public static final String ROLE_PRIVILEGE_CACHE = "role:privilege:cache";
     public static final String USER_ROLE_PRIVILEGE_CACHE = "user:role:privilege:cache";
+    public static final String PDF_CACHE = "pdf:cache";
 
     /**
      * 报表缓存

+ 5 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.boot.core.enums.Platform;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.teachcloud.common.SignatureEntityTest;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.auth.ExpireTimeBean;
 import com.qmth.teachcloud.common.bean.dto.OrgDto;
@@ -637,7 +639,7 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         Set<RoleTypeEnum> roleType = authBean.getRoleList().stream().map(s -> s.getType()).collect(Collectors.toSet());
         String sessionId = SessionUtil.digest(sysUser.getId(), Math.abs(roleType.toString().hashCode()), platform.name());
         //TODO 测试用
-//        String test = SignatureEntityTest.build(SignatureType.TOKEN, sessionId, token);
+        String test = SignatureEntityTest.build(SignatureType.TOKEN, sessionId, token);
         ExpireTimeBean expireTime = AuthUtil.getExpireTime(platform);
         TBSession tbSession = new TBSession(sessionId, String.valueOf(sysUser.getId()), roleType.toString(),
                 platform.name(), platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token,
@@ -645,8 +647,8 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         tbSessionService.saveOrUpdate(tbSession);
         redisUtil.setUserSession(sessionId, tbSession, expireTime.getExpireSeconds());
 
-//        LoginResult loginResult = new LoginResult(sysUser, sessionId, test, roleType, appSource);
-        LoginResult loginResult = new LoginResult(sysUser, sessionId, token, roleType, appSource);
+        LoginResult loginResult = new LoginResult(sysUser, sessionId, test, roleType, appSource);
+//        LoginResult loginResult = new LoginResult(sysUser, sessionId, token, roleType, appSource);
         loginResult.setSchoolInfo(Objects.nonNull(authBean.getSchool()) ? loginResult.new SchoolNativeBean(authBean.getSchool()) : null);
         loginResult.setOrgInfo(Objects.nonNull(authBean.getOrg()) ? loginResult.new OrgNativeBean(authBean.getOrg()) : null);
         loginResult.setTime(System.currentTimeMillis());

+ 10 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RedisUtil.java

@@ -230,10 +230,19 @@ public class RedisUtil {
      * @param key
      * @param Object
      */
-    public void setForList(String key, Object Object) {
+    public void setForLeftList(String key, Object Object) {
         redisTemplate.opsForList().leftPush(key, Object);
     }
 
+    /**
+     * 获取list
+     *
+     * @param key
+     */
+    public Object getForRightList(String key) {
+        return redisTemplate.opsForList().rightPop(key, 0, TimeUnit.SECONDS);
+    }
+
     /**
      * 设置过期时间(秒)
      *

+ 12 - 4
teachcloud-report/pom.xml

@@ -14,10 +14,18 @@
 	</parent>
 
 	<dependencies>
-		<dependency>
-			<groupId>com.qmth.teachcloud.task</groupId>
-			<artifactId>teachcloud-task</artifactId>
-		</dependency>
+<!--		<dependency>-->
+<!--			<groupId>com.qmth.teachcloud.task</groupId>-->
+<!--			<artifactId>teachcloud-task</artifactId>-->
+<!--		</dependency>-->
+        <dependency>
+            <groupId>com.qmth.teachcloud.report.business</groupId>
+            <artifactId>teachcloud-report-business</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.distributed.print.business</groupId>
+            <artifactId>distributed-print-business</artifactId>
+        </dependency>
 		<dependency>
 			<groupId>com.qmth.teachcloud.common.api</groupId>
 			<artifactId>teachcloud-common-api</artifactId>

+ 119 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MapApiReader.java

@@ -0,0 +1,119 @@
+package com.qmth.teachcloud.report.config;
+
+import com.fasterxml.classmate.TypeResolver;
+import com.google.common.base.Optional;
+import com.qmth.teachcloud.common.annotation.ApiJsonObject;
+import com.qmth.teachcloud.common.annotation.ApiJsonProperty;
+import org.apache.ibatis.javassist.*;
+import org.apache.ibatis.javassist.bytecode.AnnotationsAttribute;
+import org.apache.ibatis.javassist.bytecode.ConstPool;
+import org.apache.ibatis.javassist.bytecode.annotation.Annotation;
+import org.apache.ibatis.javassist.bytecode.annotation.BooleanMemberValue;
+import org.apache.ibatis.javassist.bytecode.annotation.StringMemberValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ResolvedMethodParameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.ParameterBuilderPlugin;
+import springfox.documentation.spi.service.contexts.ParameterContext;
+
+import java.util.Map;
+
+/**
+ * @Description: swagger2 map参数说明插件
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/23
+ */
+@Component
+@Order   //plugin加载顺序,默认是最后加载
+public class MapApiReader implements ParameterBuilderPlugin {
+    private final static Logger log = LoggerFactory.getLogger(MapApiReader.class);
+
+    @Autowired
+    private TypeResolver typeResolver;
+
+    @Override
+    public void apply(ParameterContext parameterContext) {
+        ResolvedMethodParameter methodParameter = parameterContext.resolvedMethodParameter();
+
+        if (methodParameter.getParameterType().canCreateSubtype(Map.class) || methodParameter.getParameterType().canCreateSubtype(String.class)) { //判断是否需要修改对象ModelRef,这里我判断的是Map类型和String类型需要重新修改ModelRef对象
+            Optional<ApiJsonObject> optional = methodParameter.findAnnotation(ApiJsonObject.class);  //根据参数上的ApiJsonObject注解中的参数动态生成Class
+            if (optional.isPresent()) {
+                String name = optional.get().name();  //model 名称
+                ApiJsonProperty[] properties = optional.get().value();
+                parameterContext.getDocumentationContext().getAdditionalModels().add(typeResolver.resolve(createRefModel(properties, name)));  //像documentContext的Models中添加我们新生成的Class
+                parameterContext.parameterBuilder()  //修改Map参数的ModelRef为我们动态生成的class
+                        .parameterType("body")
+                        .modelRef(new ModelRef(name))
+                        .name(name);
+            }
+        }
+    }
+
+    private final static String basePackage = "com.qmth.teachcloud.entity.";  //动态生成的Class名
+
+    /**
+     * 根据propertys中的值动态生成含有Swagger注解的javaBeen
+     */
+    private Class createRefModel(ApiJsonProperty[] propertys, String name) {
+        ClassPool pool = ClassPool.getDefault();
+        CtClass ctClass = pool.makeClass(basePackage + name);
+        try {
+            for (ApiJsonProperty property : propertys) {
+                ctClass.addField(createField(property, ctClass));
+            }
+            return ctClass.toClass();
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据property的值生成含有swagger apiModelProperty注解的属性
+     */
+    private CtField createField(ApiJsonProperty property, CtClass ctClass) throws NotFoundException, CannotCompileException {
+        CtField ctField = new CtField(getFieldType(property.type()), property.key(), ctClass);
+        ctField.setModifiers(Modifier.PUBLIC);
+        ConstPool constPool = ctClass.getClassFile().getConstPool();
+        AnnotationsAttribute attr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
+        Annotation ann = new Annotation("io.swagger.annotations.ApiModelProperty", constPool);
+        ann.addMemberValue("value", new StringMemberValue(property.description(), constPool));
+        ann.addMemberValue("required", new BooleanMemberValue(property.required(), constPool));
+        attr.addAnnotation(ann);
+        ctField.getFieldInfo().addAttribute(attr);
+        return ctField;
+    }
+
+    private CtClass getFieldType(String type) throws NotFoundException {
+        CtClass fileType = null;
+        switch (type) {
+            case "string":
+                fileType = ClassPool.getDefault().get(String.class.getName());
+                break;
+            case "int":
+                fileType = ClassPool.getDefault().get(Integer.class.getName());
+                break;
+            case "long":
+                fileType = ClassPool.getDefault().get(Long.class.getName());
+                break;
+            case "boolean":
+                fileType = ClassPool.getDefault().get(Boolean.class.getName());
+                break;
+            default:
+                break;
+        }
+        return fileType;
+    }
+
+    @Override
+    public boolean supports(DocumentationType delimiter) {
+        return true;
+    }
+}

+ 27 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MetaHandler.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.report.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: mybatis 自动插入时间和id
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/20
+ */
+@Component
+public class MetaHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        this.setFieldValByName("createTime", System.currentTimeMillis(), metaObject);
+        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        this.setFieldValByName("updateTime", System.currentTimeMillis(), metaObject);
+    }
+}

+ 33 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/config/MultipartConfig.java

@@ -0,0 +1,33 @@
+package com.qmth.teachcloud.report.config;
+
+/**
+* @Description: Multipart 附件上传配置
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/7/29
+*/
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+@Configuration
+public class MultipartConfig {
+
+    /**
+     * 附件上传配置
+     *
+     * @return
+     */
+    @Bean
+    public MultipartResolver multipartResolver() {
+        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+        resolver.setDefaultEncoding(SystemConstant.CHARSET_NAME);
+        resolver.setResolveLazily(true);// resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
+        resolver.setMaxInMemorySize(2);// 低于此值,只保留在内存里,超过此阈值,生成硬盘上的临时文件。
+        resolver.setMaxUploadSize(200 * 1024 * 1024);// 最大200M
+        return resolver;
+    }
+}

+ 6 - 6
teachcloud-report/src/main/resources/application-dev.properties

@@ -10,19 +10,19 @@ server.tomcat.uri-encoding=UTF-8
 spring.application.name=teachcloud-report
 
 #\u6570\u636E\u6E90\u914D\u7F6E
-db.host=192.168.10.136
-#db.host=localhost
+#db.host=192.168.10.136
+db.host=localhost
 db.port=3306
 db.name=teachcloud-report
 db.username=root
-db.password=Qmth87863577!
-#db.password=123456789
+#db.password=Qmth87863577!
+db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
 com.qmth.redis.db=1
-com.qmth.redis.password=123456
+#com.qmth.redis.password=123456
 
 #mysql\u914D\u7F6E
 com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
@@ -102,7 +102,7 @@ com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/ONLINE_EXAM/teachcloud-report/tomcat/logs/teachcloud-report.log
 
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
-spring.profiles.include=task
+#spring.profiles.include=task
 
 sms.config.smsNormalCode=qmth
 sms.config.codeExpiredTime=2

+ 18 - 8
teachcloud-task/pom.xml

@@ -26,6 +26,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <version>${spring-boot.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -36,20 +46,20 @@
                 <configuration>
                     <includeSystemScope>true</includeSystemScope>
                 </configuration>
-<!--                <executions>-->
-<!--                    <execution>-->
-<!--                        <goals>-->
-<!--                            <goal>repackage</goal>-->
-<!--                        </goals>-->
-<!--                    </execution>-->
-<!--                </executions>-->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
             </plugin>
             <plugin>
                 <groupId>com.spotify</groupId>
                 <artifactId>dockerfile-maven-plugin</artifactId>
                 <version>1.4.12</version>
                 <configuration>
-                    <repository>registry.cn-shenzhen.aliyuncs.com/distributed_print_task</repository>
+                    <repository>registry.cn-shenzhen.aliyuncs.com/teachcloud_task</repository>
                     <tag>${project.version}</tag>
                     <contextDirectory>${project.baseDir}</contextDirectory>
                     <useMavenSettingsForAuth>true</useMavenSettingsForAuth>

+ 23 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java

@@ -0,0 +1,23 @@
+package com.qmth.teachcloud.task;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication(scanBasePackages = "com.qmth.*")
+@MapperScan({"com.qmth.distributed.print.business.mapper","com.qmth.teachcloud.report.business.mapper","com.qmth.teachcloud.common.mapper"})
+//主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
+@EntityScan(basePackages = {"com.qmth.distributed.print.business.entity","com.qmth.teachcloud.report.business.entity","com.qmth.teachcloud.common.entity"}) // 用来扫描和发现指定包及其子包中的Entity定义
+@EnableTransactionManagement // spring开启事务支持
+@EnableAsync // 开启异步任务
+@EnableCaching // 开启缓存注解
+public class TeachcloudTaskApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TeachcloudTaskApplication.class, args);
+    }
+}

+ 33 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

@@ -0,0 +1,33 @@
+package com.qmth.teachcloud.task.start;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.service.OrgCenterDataDisposeService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/3
+ */
+@Component
+public class StartRunning implements CommandLineRunner {
+    private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
+
+    @Resource
+    private OrgCenterDataDisposeService orgCenterDataDisposeService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("服务器启动时执行 start");
+        SystemConstant.initTempFiles();
+//        orgCenterDataDisposeService.updateSchoolInfo();
+        log.info("服务器启动时执行 end");
+    }
+}

+ 62 - 12
teachcloud-task/src/main/resources/application-task.properties

@@ -1,14 +1,64 @@
-##\u7AEF\u53E3\u914D\u7F6E
-#server.port=7002
-##tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
-#server.tomcat.threads.max=2500
-##tomcat\u6700\u5927\u8FDE\u63A5\u6570
-#server.tomcat.max-connections=2500
-##tomcat\u7684URI\u7F16\u7801
-#server.tomcat.uri-encoding=UTF-8
-#
-##\u9879\u76EE\u540D\u79F0
-#spring.application.name=teachcloud-task
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-136
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=0
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.mysql.username=${db.username}
+com.qmth.mysql.password=${db.password}
+com.qmth.mysql.min-idle=40
+com.qmth.mysql.max-pool-size=200
+com.qmth.mysql.log-level=debug
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
 
 #============================================================================
 # \u914D\u7F6EJobStore
@@ -48,4 +98,4 @@ spring.quartz.properties.org.quartz.threadPool.threadCount=10
 spring.quartz.properties.org.quartz.threadPool.threadPriority=5
 
 #\u914D\u7F6E\u6587\u4EF6
-spring.profiles=task
+#spring.profiles=task