Browse Source

1. 初始化项目
2. 增加定时任务动态cron配置
3. 增加头部数据相关SQL及代码

Jing.Li 4 years ago
commit
d1f25faeb4

+ 35 - 0
.gitignore

@@ -0,0 +1,35 @@
+HELP.md
+target/
+logs
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+.mvn
+mvnw
+mvnw.cmd
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/

+ 194 - 0
pom.xml

@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.yideb</groupId>
+    <artifactId>audit-statistic</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>audit-statistic</name>
+    <description>Audit Business Service Data Statistic</description>
+
+    <properties>
+        <rep.ip>maven.yidab.com</rep.ip>
+        <fastjson.version>1.2.62</fastjson.version>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
+        <mybatis-plus-boot-starter.version>3.1.1</mybatis-plus-boot-starter.version>
+        <dynamic-datasource.version>2.5.4</dynamic-datasource.version>
+        <druid.version>1.1.18</druid.version>
+        <hutool.version>5.0.7</hutool.version>
+        <spring-boot-autoconfigure.version>2.3.0.RELEASE</spring-boot-autoconfigure.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>${mybatis-plus-boot-starter.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>${dynamic-datasource.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-jasper</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-autoconfigure</artifactId>
+            <version>${spring-boot-autoconfigure.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.3.0.RELEASE</version>
+                <configuration>
+                    <mainClass>com.yideb.audit.AuditStatisticApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <env>dev</env>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+            </properties>
+        </profile>
+        <profile>
+            <id>pre</id>
+            <properties>
+                <env>pre</env>
+            </properties>
+        </profile>
+    </profiles>
+
+    <!-- 配置远程发布到私服,mvn deploy -->
+    <distributionManagement>
+        <repository>
+            <id>releases</id>
+            <name>Nexus Release Repository</name>
+            <url>http://${rep.ip}/content/repositories/myzh/</url>
+        </repository>
+        <snapshotRepository>
+            <id>snapshots</id>
+            <name>Nexus Snapshot Repository</name>
+            <url>http://${rep.ip}/content/repositories/snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
+</project>

+ 16 - 0
src/main/java/com/yideb/audit/AuditStatisticApplication.java

@@ -0,0 +1,16 @@
+package com.yideb.audit;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@EnableScheduling
+@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
+public class AuditStatisticApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(AuditStatisticApplication.class, args);
+	}
+
+}

+ 24 - 0
src/main/java/com/yideb/audit/config/MybatisPlusConfig.java

@@ -0,0 +1,24 @@
+package com.yideb.audit.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 10:58 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@Configuration
+@MapperScan("com.yideb.audit.dao")
+public class MybatisPlusConfig {
+
+	@Bean
+	public PaginationInterceptor paginationInterceptor() {
+		return new PaginationInterceptor();
+	}
+}

+ 16 - 0
src/main/java/com/yideb/audit/dao/ScheduleTaskMapper.java

@@ -0,0 +1,16 @@
+package com.yideb.audit.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yideb.audit.entity.ScheduleTask;
+
+/**
+ * <p>
+    *  Mapper 接口
+    * </p>
+ *
+ * @author zhursh
+ * @since 2020-08-05
+ */
+public interface ScheduleTaskMapper extends BaseMapper<ScheduleTask> {
+
+}

+ 60 - 0
src/main/java/com/yideb/audit/dao/TopDataMapper.java

@@ -0,0 +1,60 @@
+package com.yideb.audit.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 14:54 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+public interface TopDataMapper extends BaseMapper {
+
+	/**
+	 * 查找药店注册数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryClinicRegCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	/**
+	 * 查找处方总量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryAuditCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	/**
+	 * 查找药店总量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryClinicCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	/**
+	 * 产生业务的医生数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryDoctorCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	/**
+	 * 产生业务的药师数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryPharmacistCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
+}

+ 55 - 0
src/main/java/com/yideb/audit/entity/ScheduleTask.java

@@ -0,0 +1,55 @@
+package com.yideb.audit.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+    * 
+    * </p>
+ *
+ * @author zhursh
+ * @since 2020-08-05
+ */
+@Data
+public class ScheduleTask extends Model<ScheduleTask> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private String id;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 任务参数
+     */
+    private String cron;
+
+    /**
+     * 完整类名
+     */
+    private String className;
+
+    /**
+     * 方法名
+     */
+    private String methodName;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+}

+ 50 - 0
src/main/java/com/yideb/audit/entity/vo/TopDataVo.java

@@ -0,0 +1,50 @@
+package com.yideb.audit.entity.vo;
+
+import lombok.Data;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 16:58 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@Data
+public class TopDataVo {
+
+	/**
+	 * 累计药店注册数量
+	 */
+	private Integer totalClinicRegCount;
+
+	/**
+	 * 累计处方总量
+	 */
+	private Integer auditCount;
+
+	/**
+	 * 本周注册药店
+	 */
+	private Integer weekClinicRegCount;
+
+	/**
+	 * 今日处方总量
+	 */
+	private Integer todayAuditCount;
+
+	/**
+	 * 今日药店数量 (发生业务数据的)
+	 */
+	private Integer todayClinicCount;
+
+	/**
+	 * 今日医生数量 (发生业务数据的)
+	 */
+	private Integer todayDoctorCount;
+
+	/**
+	 * 今日药师数量 (发生业务数据的)
+	 */
+	private Integer todayPharmacistCount;
+}

+ 19 - 0
src/main/java/com/yideb/audit/service/IScheduleTaskService.java

@@ -0,0 +1,19 @@
+package com.yideb.audit.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yideb.audit.entity.ScheduleTask;
+
+import java.util.List;
+
+/**
+ * <p>
+    *  服务类
+    * </p>
+ *
+ * @author zhursh
+ * @since 2020-08-05
+ */
+public interface IScheduleTaskService extends IService<ScheduleTask> {
+
+	List<ScheduleTask> findAll();
+}

+ 56 - 0
src/main/java/com/yideb/audit/service/ITopDataService.java

@@ -0,0 +1,56 @@
+package com.yideb.audit.service;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 18:40 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+public interface ITopDataService {
+	/**
+	 * 查找药店注册数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryClinicRegCount(String startTime, String endTime);
+
+	/**
+	 * 查找处方总量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryAuditCount(String startTime, String endTime);
+
+	/**
+	 * 查找药店数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryClinicCount(String startTime, String endTime);
+
+	/**
+	 * 产生业务的医生数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryDoctorCount(String startTime, String endTime);
+
+	/**
+	 * 产生业务的药师数量
+	 *
+	 * @param startTime
+	 * @param endTime
+	 * @return
+	 */
+	Integer queryPharmacistCount(String startTime, String endTime);
+}

+ 49 - 0
src/main/java/com/yideb/audit/service/impl/ITopDataServiceImpl.java

@@ -0,0 +1,49 @@
+package com.yideb.audit.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.yideb.audit.dao.TopDataMapper;
+import com.yideb.audit.service.ITopDataService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 18:41 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@DS("audit")
+@Service
+public class ITopDataServiceImpl implements ITopDataService {
+
+	@Resource
+	private TopDataMapper topDataMapper;
+
+	@Override
+	public Integer queryClinicRegCount(String startTime, String endTime) {
+		return topDataMapper.queryClinicRegCount(startTime, endTime);
+	}
+
+	@Override
+	public Integer queryAuditCount(String startTime, String endTime) {
+		return topDataMapper.queryAuditCount(startTime, endTime);
+	}
+
+	@Override
+	public Integer queryClinicCount(String startTime, String endTime) {
+		return topDataMapper.queryClinicCount(startTime, endTime);
+	}
+
+	@Override
+	public Integer queryDoctorCount(String startTime, String endTime) {
+		return topDataMapper.queryDoctorCount(startTime, endTime);
+	}
+
+	@Override
+	public Integer queryPharmacistCount(String startTime, String endTime) {
+		return topDataMapper.queryPharmacistCount(startTime, endTime);
+	}
+}

+ 32 - 0
src/main/java/com/yideb/audit/service/impl/ScheduleTaskServiceImpl.java

@@ -0,0 +1,32 @@
+package com.yideb.audit.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yideb.audit.dao.ScheduleTaskMapper;
+import com.yideb.audit.entity.ScheduleTask;
+import com.yideb.audit.service.IScheduleTaskService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+    *  服务实现类
+    * </p>
+ *
+ * @author zhursh
+ * @since 2020-08-05
+ */
+@Service
+public class ScheduleTaskServiceImpl extends ServiceImpl<ScheduleTaskMapper, ScheduleTask> implements IScheduleTaskService {
+
+	@Resource
+	private ScheduleTaskMapper taskMapper;
+
+	@Override
+	public List<ScheduleTask> findAll() {
+		QueryWrapper<ScheduleTask> wrapper = new QueryWrapper<>();
+		return taskMapper.selectList(wrapper);
+	}
+}

+ 64 - 0
src/main/java/com/yideb/audit/task/TopScheduleTask.java

@@ -0,0 +1,64 @@
+package com.yideb.audit.task;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.yideb.audit.entity.vo.TopDataVo;
+import com.yideb.audit.service.ITopDataService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 18:36 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@Component
+public class TopScheduleTask {
+
+	@Resource
+	private ITopDataService topDataService;
+
+	@Scheduled(cron = "0 0 * * * ?")
+	public void execute() {
+		// 数据容器
+		TopDataVo dataVo = new TopDataVo();
+		// 星期时间
+		String weekStartTime = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -6).toString(DatePattern.NORM_DATETIME_PATTERN);
+		String weekEndTime = DateUtil.endOfDay(new Date()).toString(DatePattern.NORM_DATETIME_PATTERN);
+		// 今天
+		String todayStartTime = DateUtil.beginOfDay(new Date()).toString(DatePattern.NORM_DATETIME_PATTERN);
+		String todayEndTime = DateUtil.endOfDay(new Date()).toString(DatePattern.NORM_DATETIME_PATTERN);
+
+		// 累计注册药店
+		Integer totalClinicRegCount = topDataService.queryClinicRegCount(null, null);
+		// 累计审核处方
+		Integer auditCount = topDataService.queryAuditCount(null, null);
+		// 本周注册药店
+		Integer weekClinicRegCount = topDataService.queryClinicRegCount(weekStartTime, weekEndTime);
+		// 今日处方总量
+		Integer todayAuditCount = topDataService.queryAuditCount(todayStartTime, todayEndTime);
+		// 今日药店数量
+		Integer todayClinicCount = topDataService.queryClinicCount(todayStartTime, todayEndTime);
+		// 今日医生数量
+		Integer todayDoctorCount = topDataService.queryDoctorCount(todayStartTime, todayEndTime);
+		// 今日药师数量
+		Integer todayPharmacistCount = topDataService.queryPharmacistCount(todayStartTime, todayEndTime);
+
+		dataVo.setTotalClinicRegCount(totalClinicRegCount);
+		dataVo.setAuditCount(auditCount);
+		dataVo.setWeekClinicRegCount(weekClinicRegCount);
+		dataVo.setTodayAuditCount(todayAuditCount);
+		dataVo.setTodayClinicCount(todayClinicCount);
+		dataVo.setTodayDoctorCount(todayDoctorCount);
+		dataVo.setTodayPharmacistCount(todayPharmacistCount);
+
+		// 写数据
+	}
+
+}

+ 122 - 0
src/main/java/com/yideb/audit/task/dynamic/DynamicScheduleTask.java

@@ -0,0 +1,122 @@
+package com.yideb.audit.task.dynamic;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.yideb.audit.entity.ScheduleTask;
+import com.yideb.audit.service.IScheduleTaskService;
+import com.yideb.audit.util.SpringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.Trigger;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 17:57 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@Slf4j
+@Component
+public class DynamicScheduleTask implements SchedulingConfigurer {
+
+	@Resource
+	private IScheduleTaskService taskService;
+
+	@Override
+	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+		List<ScheduleTask> tasks = taskService.findAll();
+		log.info("【定时任务启动】 启动任务数:" + tasks.size() + "; time=" + DateUtil.now());
+
+		List<ScheduleTask> list = checkTaskList(tasks);
+		if (ObjectUtil.isNotEmpty(list)) {
+			for (ScheduleTask task : list) {
+				taskRegistrar.addTriggerTask(getRunnable(task), getTrigger(task));
+			}
+		}
+
+		log.info("【定时任务执行完毕】执行任务数:" + list.size() + "; time=" + DateUtil.now());
+	}
+
+	/**
+	 * 拼装Runnable
+	 *
+	 * @param task
+	 * @return
+	 */
+	private Runnable getRunnable(ScheduleTask task) {
+		return () -> {
+			Object bean = SpringUtil.getBean(task.getClassName());
+			try {
+				Method method = bean.getClass().getMethod(task.getMethodName(), (Class<?>) null);
+				method.invoke(bean);
+			} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+				e.printStackTrace();
+			}
+		};
+	}
+
+	/**
+	 * 获取触发器
+	 *
+	 * @param task
+	 * @return
+	 */
+	private Trigger getTrigger(ScheduleTask task) {
+		return triggerContext -> {
+			CronTrigger trigger = new CronTrigger(task.getCron());
+			return trigger.nextExecutionTime(triggerContext);
+		};
+	}
+
+	/**
+	 * 过滤有效的任务
+	 *
+	 * @param list
+	 * @return
+	 */
+	private List<ScheduleTask> checkTaskList(List<ScheduleTask> list) {
+		return list.stream().filter(this::checkTaskConfig).collect(Collectors.toList());
+	}
+
+	/**
+	 * 检查每个配置是否合规
+	 *
+	 * @param task
+	 * @return
+	 */
+	private boolean checkTaskConfig(ScheduleTask task) {
+		boolean flag = false;
+		String cron = task.getCron();
+
+		try {
+			Class clz = Class.forName(task.getClassName());
+			Object bean = SpringUtil.getBean(clz);
+			bean.getClass().getMethod(task.getMethodName(), (Class<?>) null);
+			if (StrUtil.isBlank(cron)) {
+				log.error("没有找到 ClassName:{}, Cron:{}", task.getClassName(), task.getCron());
+			}
+
+			flag = true;
+		} catch (ClassNotFoundException e) {
+			log.error("没有找到 ClassName:{}", task.getClassName(), e);
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			log.error("没有找到 ClassName:{}, methodName:{}", task.getClassName(), task.getMethodName(), e);
+			e.printStackTrace();
+		}
+
+		return flag;
+	}
+}

+ 43 - 0
src/main/java/com/yideb/audit/util/SpringUtil.java

@@ -0,0 +1,43 @@
+package com.yideb.audit.util;
+
+import lombok.Data;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 18:15 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+@Data
+@Component
+public class SpringUtil implements ApplicationContextAware {
+
+	private static ApplicationContext applicationContext;
+
+	@Override
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+		SpringUtil.applicationContext = applicationContext;
+	}
+
+	public static ApplicationContext getApplicationContext() {
+		return applicationContext;
+	}
+
+	public static Object getBean(String name) {
+		return getApplicationContext().getBean(name);
+	}
+
+	public static <T> T getBean(Class<T> clazz){
+		return getApplicationContext().getBean(clazz);
+	}
+
+	public static <T> T getBean(String name,Class<T> clazz){
+		return getApplicationContext().getBean(name, clazz);
+	}
+}

+ 25 - 0
src/main/resources/config/application-dev.yml

@@ -0,0 +1,25 @@
+spring:
+  datasource:
+    dynamic:
+      primary: dev
+      datasource:
+        dev:
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://192.168.1.204:3306/yideb-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
+          username: root
+          password: I3CmCne0WYHicNXAOXACXccYdlPGzv4sOTC65DMX20cwzWgcCd060FcrQ06NZy7EvHH0H9F2U4lt2sAsW4Jmqw==
+          druid:
+            publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAINWThlExenD0JcLXyJAToGhihqKDLOSrK7KZkqkEUWmW8JX9pGjah4PEVt2Z3uMVrYH87UX7PEQD9qo0C5L5p0CAwEAAQ==
+            filters: config,stat
+            connectProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAINWThlExenD0JcLXyJAToGhihqKDLOSrK7KZkqkEUWmW8JX9pGjah4PEVt2Z3uMVrYH87UX7PEQD9qo0C5L5p0CAwEAAQ==
+            validationQuery: "SELECT 1"
+        audit:
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://192.168.1.204:3306/yideb-audit?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
+          username: root
+          password: I3CmCne0WYHicNXAOXACXccYdlPGzv4sOTC65DMX20cwzWgcCd060FcrQ06NZy7EvHH0H9F2U4lt2sAsW4Jmqw==
+          druid:
+            publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAINWThlExenD0JcLXyJAToGhihqKDLOSrK7KZkqkEUWmW8JX9pGjah4PEVt2Z3uMVrYH87UX7PEQD9qo0C5L5p0CAwEAAQ==
+            filters: config,stat
+            connectProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAINWThlExenD0JcLXyJAToGhihqKDLOSrK7KZkqkEUWmW8JX9pGjah4PEVt2Z3uMVrYH87UX7PEQD9qo0C5L5p0CAwEAAQ==
+            validationQuery: "SELECT 1"

+ 0 - 0
src/main/resources/config/application-pre.yml


+ 0 - 0
src/main/resources/config/application-prod.yml


+ 16 - 0
src/main/resources/config/application.yml

@@ -0,0 +1,16 @@
+spring:
+  application:
+    name: audit-statistic
+  profiles:
+    active: dev
+
+server:
+  port: 3001
+
+mybatis-plus:
+  configuration:
+    mapper-locations: classpath:mapper/*TopDataMapper.xml
+    config-location: classpath:config/mybatis-config.xml
+
+logging:
+  config: classpath:config/logback.xml

+ 113 - 0
src/main/resources/config/logback.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+	<property name="LOG_HOME" value="logs" />
+	<property name="BASE_FILE_NAME" value="statistic" />
+	<property name="INFO_FILE_NAME" value="statistic-info" />
+	<property name="ERROR_FILE_NAME" value="statistic-error" />
+	<property name="DEBUG_SQL" value="sql-debug" />
+	<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} %-5level [%class:%line] - %m%n" />
+	<property name="MAX_LOG_FILE_SIZE" value="100MB" />
+	<property name="MAX_LOG_HISTORY" value="30" />
+
+	<!--控制台输出appender-->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<target>System.out</target>
+		<!--设置输出格式-->
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>${PATTERN}</pattern>
+			<!--设置编码-->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+
+	<appender name="fileBase"  class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<File>${LOG_HOME}/${BASE_FILE_NAME}.log</File>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!--日志文件输出的文件名-->
+			<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}-${BASE_FILE_NAME}.log</FileNamePattern>
+			<!--日志文件保留天数-->
+			<MaxHistory>${MAX_LOG_HISTORY}</MaxHistory>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>${PATTERN}</pattern>
+		</encoder>
+		<!--日志文件最大的大小-->
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>${MAX_LOG_FILE_SIZE}</MaxFileSize>
+		</triggeringPolicy>
+	</appender>
+
+	<appender name="fileInfo"  class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>INFO</level>
+		</filter>
+		<File>${LOG_HOME}/${INFO_FILE_NAME}.log</File>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!--日志文件输出的文件名-->
+			<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}-${INFO_FILE_NAME}.log</FileNamePattern>
+			<!--日志文件保留天数-->
+			<MaxHistory>${MAX_LOG_HISTORY}</MaxHistory>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>${PATTERN}</pattern>
+		</encoder>
+		<!--日志文件最大的大小-->
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>${MAX_LOG_FILE_SIZE}</MaxFileSize>
+		</triggeringPolicy>
+	</appender>
+
+	<appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>ERROR</level>
+		</filter>
+		<File>${LOG_HOME}/${ERROR_FILE_NAME}.log</File>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!--日志文件输出的文件名-->
+			<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}-${ERROR_FILE_NAME}.log</FileNamePattern>
+			<!--日志文件保留天数-->
+			<MaxHistory>${MAX_LOG_HISTORY}</MaxHistory>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+			<pattern>${PATTERN}</pattern>
+		</encoder>
+		<!--日志文件最大的大小-->
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>${MAX_LOG_FILE_SIZE}</MaxFileSize>
+		</triggeringPolicy>
+	</appender>
+
+	<appender name="sqlDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${LOG_HOME}/${DEBUG_SQL}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}-${DEBUG_SQL}.log</FileNamePattern>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="java.sql" level="info" additivity="false">
+		<appender-ref ref="console"/>
+		<appender-ref ref="sqlDebug"/>
+	</logger>
+
+	<logger name="com.apache.ibatis" level="TRACE"/>
+	<logger name="java.sql.Connection" level="DEBUG"/>
+	<logger name="java.sql.Statement" level="DEBUG"/>
+	<logger name="java.sql.PreparedStatement" level="DEBUG"/>
+
+	<!--指定基础的日志输出级别-->
+	<root level="INFO">
+		<!--appender将会添加到这个loger-->
+		<appender-ref ref="console"/>
+		<appender-ref ref="fileBase"/>
+		<appender-ref ref="fileInfo"/>
+		<appender-ref ref="fileError"/>
+		<appender-ref ref="sqlDebug"/>
+	</root>
+</configuration>

+ 75 - 0
src/main/resources/mapper/TopDataMapper.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yideb.audit.dao.TopDataMapper">
+    <select id="queryClinicRegCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(1)
+        FROM
+            c_cooperation_clinic
+        WHERE
+            type = 1
+            <if test="startTime != null">
+                AND open_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND open_time &lt; #{endTime}
+            </if>
+    </select>
+
+    <select id="queryAuditCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(1)
+        FROM
+            c_cooperation_audit
+        WHERE
+            <if test="startTime != null">
+                AND launch_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND launch_time &lt; #{endTime}
+            </if>
+    </select>
+
+    <select id="queryClinicCount" resultType="java.lang.Integer">
+        SELECT DISTINCT
+            launch_clinic_id
+        FROM
+            c_cooperation_audit
+        WHERE
+            <if test="startTime != null">
+                AND launch_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND launch_time &lt; #{endTime}
+            </if>
+    </select>
+
+    <select id="queryDoctorCount" resultType="java.lang.Integer">
+        SELECT DISTINCT
+            accept_user_id
+        FROM
+            c_cooperation_audit
+        WHERE
+            <if test="startTime != null">
+                AND launch_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND launch_time &lt; #{endTime}
+            </if>
+    </select>
+
+    <select id="queryPharmacistCount" resultType="java.lang.Integer">
+        SELECT DISTINCT
+            audit_user_id
+        FROM
+            c_cooperation_audit
+        WHERE
+            <if test="startTime != null">
+                AND launch_time &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND launch_time &lt; #{endTime}
+            </if>
+    </select>
+
+</mapper>

+ 13 - 0
src/test/java/com/yideb/audit/AuditStatisticApplicationTests.java

@@ -0,0 +1,13 @@
+package com.yideb.audit;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class AuditStatisticApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}

+ 24 - 0
src/test/java/com/yideb/audit/DateTest.java

@@ -0,0 +1,24 @@
+package com.yideb.audit;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import org.junit.jupiter.api.Test;
+
+import java.util.Date;
+
+/**
+ * <b>Application name:</b> yideb-audit-statistic <br>
+ * <b>Application describing: </b> <br>
+ * <b>Copyright:</b> Copyright &copy; 2019 明医众禾科技(北京)有限责任公司 版权所有。<br>
+ * <b>Company:</b> 明医众禾科技(北京)有限责任公司 <br>
+ * <b>@Date:</b> 2020/8/5 18:54 <br>
+ * <b>@author:</b> <a href="mailto:Lijing@miyzh.com"> Lijing </a> <br>
+ */
+public class DateTest {
+
+	@Test
+	public void test() {
+		System.out.println(DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -6).toString(DatePattern.NORM_DATETIME_PATTERN));
+		System.out.println(DateUtil.endOfDay(new Date()));
+	}
+}