diff --git a/springboot/wumei-admin/src/main/resources/application-druid.yml b/springboot/wumei-admin/src/main/resources/application-druid.yml
index 9578e066..ad6dbaf8 100644
--- a/springboot/wumei-admin/src/main/resources/application-druid.yml
+++ b/springboot/wumei-admin/src/main/resources/application-druid.yml
@@ -16,6 +16,16 @@ spring:
url:
username:
password:
+
+ #TDengine数据库
+ tdengine-server:
+ enabled: true
+ driverClassName: com.taosdata.jdbc.TSDBDriver
+ url: jdbc:TAOS://127.0.0.1:6030/wumei_smart_log?timezone=Asia/Beijing&charset=utf-8
+ username: root
+ password: taosdata
+ dbName: wumei_smart_log
+
# 初始连接数
initialSize: 5
# 最小连接池数量
diff --git a/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
index 057c9419..d1503d6d 100644
--- a/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
+++ b/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
@@ -1,18 +1,34 @@
package com.ruoyi.framework.config;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
+import java.util.*;
+import javax.servlet.*;
import javax.sql.DataSource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import com.ruoyi.framework.config.properties.DruidProperties;
+import com.ruoyi.framework.datasource.DynamicDataSource;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
@@ -21,17 +37,18 @@ import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.util.ClassUtils;
import com.ruoyi.common.utils.StringUtils;
/**
* Mybatis支持*匹配扫描包
- *
+ *
* @author ruoyi
*/
@Configuration
-public class MyBatisConfig
-{
+@MapperScan(basePackages = {"com.ruoyi.iot.mapper", "com.ruoyi.system.mapper", "com.ruoyi.quartz.mapper", "com.ruoyi.generator.mapper"}, sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
+public class MyBatisConfig {
@Autowired
private Environment env;
@@ -113,11 +130,13 @@ public class MyBatisConfig
return resources.toArray(new Resource[resources.size()]);
}
- @Bean
- public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+ @Bean(name = "mysqlSessionFactory")
+ @Primary
+ public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource) throws Exception
{
- String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
- String mapperLocations = env.getProperty("mybatis.mapperLocations");
+ String typeAliasesPackage = "com.ruoyi.**.domain";//env.getProperty("mybatis.typeAliasesPackage");
+ String mapperLocations = "classpath:mapper/iot/*Mapper.xml,classpath:mapper/system/*Mapper.xml,classpath:mapper/quartz/*Mapper.xml";
+// String typeAliasesPackage = "com.ruoyi.**.domain";
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
@@ -129,4 +148,17 @@ public class MyBatisConfig
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}
+
+ @Bean(name = "mysqlTransactionManager")
+ @Primary
+ public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("dynamicDataSource") DataSource dataSource) {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ @Bean(name = "mysqlSqlSessionTemplate")
+ @Primary
+ public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
+ return new SqlSessionTemplate(sqlSessionFactory);
+ }
+
}
\ No newline at end of file
diff --git a/springboot/wumei-iot/pom.xml b/springboot/wumei-iot/pom.xml
index f0d12628..c716b72a 100644
--- a/springboot/wumei-iot/pom.xml
+++ b/springboot/wumei-iot/pom.xml
@@ -89,6 +89,15 @@
+
+
+ com.taosdata.jdbc
+ taos-jdbcdriver
+ 2.0.38
+
+
+
+
\ No newline at end of file
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/domain/DeviceLog.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/domain/DeviceLog.java
index b2909ef8..83f9c7c8 100644
--- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/domain/DeviceLog.java
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/domain/DeviceLog.java
@@ -5,9 +5,11 @@ import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
+import java.util.Date;
+
/**
* 设备日志对象 iot_device_log
- *
+ *
* @author kerwincui
* @date 2022-01-13
*/
@@ -15,6 +17,8 @@ public class DeviceLog extends BaseEntity
{
private static final long serialVersionUID = 1L;
+ @Excel(name = "时间戳")
+ private Date ts;
/** 设备日志ID */
private Long logId;
@@ -46,6 +50,15 @@ public class DeviceLog extends BaseEntity
@Excel(name = "是否监测数据", readConverterExp = "1==是,0=否")
private Integer isMonitor;
+
+ public Date getTs() {
+ return ts;
+ }
+
+ public void setTs(Date ts) {
+ this.ts = ts;
+ }
+
public String getSerialNumber() {
return serialNumber;
}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/init/ApplicationStarted.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/init/ApplicationStarted.java
new file mode 100644
index 00000000..e809d54e
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/init/ApplicationStarted.java
@@ -0,0 +1,76 @@
+package com.ruoyi.iot.init;
+
+
+//import com.ruoyi.mysql.config.TDengineConfig;
+
+//import com.ruoyi.iot.tdengine.config.TDengineConfig;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.ruoyi.iot.tdengine.config.TDengineConfig;
+ import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.mapper.DeviceMapper;
+import com.ruoyi.iot.tdengine.mapper.TDDeviceLogMapper;
+ import org.mybatis.spring.SqlSessionTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.Date;
+
+/**
+ * 类名: ApplicationStarted
+ * 描述: TODO
+ * 时间: 2022/5/18,0018 1:41
+ * 开发人: wxy
+ */
+@Component
+public class ApplicationStarted implements ApplicationRunner {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationStarted.class);
+
+ @Autowired
+ private TDengineConfig dengineConfig;
+
+ @Autowired
+ private TDDeviceLogMapper deviceLogMapper;
+
+ @Autowired
+ private DeviceMapper deviceMapper;
+
+ @Override
+ public void run(ApplicationArguments args) {
+ deviceMapper.selectDeviceByDeviceId(0L);
+ System.out.println("初始化MySql链接成功");
+ initTDengine();
+ System.out.println("初始化TDengine链接成功");
+ }
+
+ /**
+ * @Method
+ * @Description 开始初始化加载系统参数,创建数据库和超级表
+ * @Param null
+ * @return
+ * @date 2022/5/22,0022 14:27
+ * @author wxy
+ *
+ */
+ public void initTDengine() {
+ try {
+ String dbName = dengineConfig.getDbName();
+ int db = deviceLogMapper.createDB(dbName);
+ deviceLogMapper.createSTable(dbName);
+
+ System.out.println(db);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("ERROR");
+ }
+
+ }
+
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/ILogService.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/ILogService.java
new file mode 100644
index 00000000..829c962a
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/ILogService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.iot.log.service;
+
+import com.ruoyi.iot.domain.DeviceLog;
+
+import com.ruoyi.iot.model.MonitorModel;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @package iot.iot.log
+ * 类名: LogService
+ * 描述: 设备日志记录接口
+ * 时间: 2022/5/19,0019 18:04
+ * 开发人: admin
+ */
+public interface ILogService {
+
+ int saveDeviceLog(DeviceLog deviceLog);
+
+ List selectDeviceLogList(DeviceLog deviceLog);
+
+ List selectMonitorList(DeviceLog deviceLog);
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/factory/LogServiceFactory.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/factory/LogServiceFactory.java
new file mode 100644
index 00000000..acd7be7f
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/factory/LogServiceFactory.java
@@ -0,0 +1,74 @@
+package com.ruoyi.iot.log.service.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.framework.config.MyBatisConfig;
+import com.ruoyi.iot.log.service.impl.MySqlLogServiceImpl;
+import com.ruoyi.iot.log.service.impl.TdengineLogServiceImpl;
+import com.ruoyi.iot.model.MonitorModel;
+import com.ruoyi.iot.tdengine.config.TDengineConfig;
+import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.log.service.ILogService;
+import com.ruoyi.iot.mapper.DeviceLogMapper;
+import com.ruoyi.iot.tdengine.mapper.TDDeviceLogMapper;
+import com.ruoyi.iot.util.SnowflakeIdWorker;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.lang.Nullable;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 类名: DeviceLogServiceImpl
+ * 描述: TODO
+ * 时间: 2022/5/19,0019 18:09
+ * 开发人: wxy
+ */
+@Component
+public class LogServiceFactory {
+
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ @Bean
+ public ILogService getLogService() {
+ //先获取TDengine的配置,检测TDengine是否已经配置
+ if (containBean(TDengineConfig.class)) {
+ TDengineConfig tDengineConfig = applicationContext.getBean(TDengineConfig.class);
+ TDDeviceLogMapper tDDeviceLogMapper = applicationContext.getBean(TDDeviceLogMapper.class);
+ ILogService logService = new TdengineLogServiceImpl(tDengineConfig, tDDeviceLogMapper);
+ return logService;
+ } else if (containBean(MyBatisConfig.class)) {
+ //没有配置TDengine,那么使用MySQL的日志配置
+ DeviceLogMapper deviceLogMapper = applicationContext.getBean( DeviceLogMapper.class);
+ ILogService logService = new MySqlLogServiceImpl(deviceLogMapper);
+ return logService;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @Method containBean
+ * @Description 根据类判断是否有对应bean
+ * @Param 类
+ * @return
+ * @date 2022/5/22,0022 14:12
+ * @author wxy
+ *
+ */
+ private boolean containBean(@Nullable Class> T) {
+ String[] beans = applicationContext.getBeanNamesForType(T);
+ if (beans == null || beans.length == 0) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/MySqlLogServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/MySqlLogServiceImpl.java
new file mode 100644
index 00000000..1ba1f610
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/MySqlLogServiceImpl.java
@@ -0,0 +1,38 @@
+package com.ruoyi.iot.log.service.impl;
+
+import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.log.service.ILogService;
+import com.ruoyi.iot.mapper.DeviceLogMapper;
+import com.ruoyi.iot.model.MonitorModel;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 类名: MySqlLogServiceImpl
+ * 描述: MySQL存储日志实现类
+ * 时间: 2022/5/22,0022 13:37
+ * 开发人: admin
+ */
+public class MySqlLogServiceImpl implements ILogService {
+
+ private DeviceLogMapper deviceLogMapper;
+
+ public MySqlLogServiceImpl(DeviceLogMapper _deviceLogMapper){
+ this.deviceLogMapper=_deviceLogMapper;
+ }
+ @Override
+ public int saveDeviceLog(DeviceLog deviceLog) {
+ return deviceLogMapper.insertDeviceLog(deviceLog);
+ }
+
+ @Override
+ public List selectDeviceLogList(DeviceLog deviceLog) {
+ return deviceLogMapper.selectDeviceLogList(deviceLog);
+ }
+
+ @Override
+ public List selectMonitorList(DeviceLog deviceLog) {
+ return deviceLogMapper.selectMonitorList(deviceLog);
+ }
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/TdengineLogServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/TdengineLogServiceImpl.java
new file mode 100644
index 00000000..58d381a5
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/TdengineLogServiceImpl.java
@@ -0,0 +1,57 @@
+package com.ruoyi.iot.log.service.impl;
+
+import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.log.service.ILogService;
+import com.ruoyi.iot.model.MonitorModel;
+import com.ruoyi.iot.tdengine.config.TDengineConfig;
+import com.ruoyi.iot.tdengine.mapper.TDDeviceLogMapper;
+import com.ruoyi.iot.util.SnowflakeIdWorker;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 类名: TdengineLogServiceImpl
+ * 描述: TDengine存储日志数据实现类
+ * 时间: 2022/5/22,0022 13:38
+ * 开发人: admin
+ */
+public class TdengineLogServiceImpl implements ILogService {
+
+ private ApplicationContext applicationContext;
+
+ private TDDeviceLogMapper tdDeviceLogMapper;
+
+ private TDengineConfig tDengineConfig;
+
+ private SnowflakeIdWorker snowflakeIdWorker;
+
+ private String dbName;
+
+ public TdengineLogServiceImpl(TDengineConfig _tDengineConfig,TDDeviceLogMapper _tdDeviceLogMapper) {
+ this.tdDeviceLogMapper = _tdDeviceLogMapper;
+ this.tDengineConfig = _tDengineConfig;
+ snowflakeIdWorker=new SnowflakeIdWorker(1);
+ this.dbName=_tDengineConfig.getDbName();
+ }
+
+ @Override
+ public int saveDeviceLog(DeviceLog deviceLog) {
+ long logId = snowflakeIdWorker.nextId();
+ deviceLog.setLogId(logId);
+ return tdDeviceLogMapper.save(dbName,deviceLog);
+ }
+
+ @Override
+ public List selectDeviceLogList(DeviceLog deviceLog) {
+ return tdDeviceLogMapper.selectDeviceLogList(dbName,deviceLog);
+ }
+
+ @Override
+ public List selectMonitorList(DeviceLog deviceLog) {
+ return tdDeviceLogMapper.selectMonitorList(dbName,deviceLog);
+ }
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java
index 98de2000..bd875259 100644
--- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mqtt/EmqxService.java
@@ -3,6 +3,7 @@ package com.ruoyi.iot.mqtt;
import com.alibaba.fastjson.JSON;
import com.ruoyi.iot.domain.Device;
import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.log.service.ILogService;
import com.ruoyi.iot.model.NtpModel;
import com.ruoyi.iot.model.ThingsModels.IdentityAndName;
import com.ruoyi.iot.model.ThingsModels.ThingsModelValueItem;
@@ -32,8 +33,11 @@ public class EmqxService {
@Autowired
private IDeviceService deviceService;
+// @Autowired
+// private IDeviceLogService deviceLogService;
+
@Autowired
- private IDeviceLogService deviceLogService;
+ private ILogService logService;
/**
* 订阅的主题
@@ -190,7 +194,8 @@ public class EmqxService {
deviceLog.setIdentity(thingsModelValueRemarkItems.get(i).getId());
deviceLog.setLogType(3);
deviceLog.setIsMonitor(0);
- deviceLogService.insertDeviceLog(deviceLog);
+// deviceLogService.insertDeviceLog(deviceLog);
+ logService.saveDeviceLog(deviceLog);
}
} catch (Exception e) {
logger.error("接收事件,解析数据时异常 message={}", e.getMessage());
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/config/TDengineConfig.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/config/TDengineConfig.java
new file mode 100644
index 00000000..9343ce19
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/config/TDengineConfig.java
@@ -0,0 +1,113 @@
+package com.ruoyi.iot.tdengine.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.iot.tdengine.mapper.TDDeviceLogMapper;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 类名: TDengineConfig
+ * 描述: TDengine配置类
+ * 时间: 2022/5/13,0016 1:14
+ * 开发人: wxy
+ */
+@Configuration
+@MapperScan(basePackages = {"com.ruoyi.iot.tdengine.mapper"}, sqlSessionTemplateRef = "tdengineSqlSessionTemplate")
+@ConditionalOnProperty(name = "spring.datasource.druid.tdengine-server.enabled", havingValue = "true")
+public class TDengineConfig {
+
+ @Autowired
+ private TDDeviceLogMapper deviceLogMapper;
+
+ @Value("${spring.datasource.druid.tdengine-server.dbName}")
+ private String dbName;
+
+
+ @Bean(name = "tDengineDataSource")
+ @ConfigurationProperties(prefix = "spring.datasource.druid.tdengine-server")
+ public DataSource tdengineDataSource() {
+ return new DruidDataSource();
+ }
+
+
+
+ @Bean(name = "tDengineSqlSessionFactory")
+ public SqlSessionFactory tDengineSqlSessionFactory(@Qualifier("tDengineDataSource") DataSource dataSource) throws Exception {
+ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
+ sqlSessionFactoryBean.setMapperLocations(resolveMapperLocations(StringUtils.split("classpath:mapper/tdengine/*Mapper.xml", ",")));
+ sqlSessionFactoryBean.setDataSource(dataSource);
+ return sqlSessionFactoryBean.getObject();
+ }
+
+
+ @Bean(name = "tdengineSqlSessionTemplate")
+ public SqlSessionTemplate tdengineSqlSessionTemplate(@Qualifier("tDengineSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
+ return new SqlSessionTemplate(sqlSessionFactory);
+ }
+
+
+// @Bean
+// @ConditionalOnProperty(name = "spring.datasource.druid.tdengine-server.enabled", havingValue = "true")
+// public TDDeviceLogMapper genTdengineLogMapper(@Qualifier("tDengineDataSource") TDDeviceLogMapper mapper) {
+// if(this.deviceLogMapper==null){
+// this.deviceLogMapper=mapper;
+// }
+// return this.deviceLogMapper;
+// }
+
+ public TDDeviceLogMapper getTDengineLogMapper() {
+ return deviceLogMapper;
+ }
+
+
+
+ public String getDbName() {
+ return dbName;
+ }
+
+ public void setDbName(String dbName) {
+ this.dbName = dbName;
+ }
+ public Resource[] resolveMapperLocations(String[] mapperLocations)
+ {
+ ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
+ List resources = new ArrayList();
+ if (mapperLocations != null)
+ {
+ for (String mapperLocation : mapperLocations)
+ {
+ try
+ {
+ Resource[] mappers = resourceResolver.getResources(mapperLocation);
+ resources.addAll(Arrays.asList(mappers));
+ }
+ catch (IOException e)
+ {
+ // ignore
+ }
+ }
+ }
+ return resources.toArray(new Resource[resources.size()]);
+ }
+
+
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/DatabaseMapper.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/DatabaseMapper.java
new file mode 100644
index 00000000..076e66ac
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/DatabaseMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.iot.tdengine.mapper;
+
+import org.springframework.stereotype.Repository;
+
+/**
+ * @package com.ruoyi.mysql.mysql.tdengine
+ * 类名: DatabaseMapper
+ * 描述: TODO
+ * 时间: 2022/5/16,0016 1:27
+ * 开发人: wxy
+ */
+@Repository
+public interface DatabaseMapper {
+
+ int createDB();
+
+ int dropDatabase();
+
+ int useDatabase();
+
+ int createTable();
+
+
+
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/TDDeviceLogMapper.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/TDDeviceLogMapper.java
new file mode 100644
index 00000000..99aa0f6a
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/tdengine/mapper/TDDeviceLogMapper.java
@@ -0,0 +1,42 @@
+package com.ruoyi.iot.tdengine.mapper;
+
+import com.ruoyi.iot.domain.DeviceLog;
+import com.ruoyi.iot.model.MonitorModel;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.lang.management.MonitorInfo;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @package com.ruoyi.mysql.mysql.tdengine
+ * 类名: DatabaseMapper
+ * 描述: TODO
+ * 时间: 2022/5/16,0016 1:27
+ * 开发人: wxy
+ */
+@Repository
+public interface TDDeviceLogMapper {
+
+
+ int createDB( String database);
+
+ int createSTable(String database);
+
+ int createTable(String database,String deviceId);
+
+ int save(@Param("database") String database,@Param("device") DeviceLog deviceLog);
+
+ List selectSTable(String database,DeviceLog deviceLog);
+
+ int delete(String dbName, DeviceLog deviceLog);
+
+// List selectLogListByPage(String dbName, Integer pageSize, Integer pageNum, String deviceNum, Date beginDate, Date endDate);
+
+ List selectLogList(String dbName, Long deviceId, String serialNumber, Long isMonitor, Long logType, Date beginDate, Date endDate);
+
+ List selectMonitorList(@Param("database") String database, @Param("device") DeviceLog deviceLog);
+
+ List selectDeviceLogList(@Param("database") String database,@Param("device") DeviceLog deviceLog);
+}
diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/util/SnowflakeIdWorker.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/util/SnowflakeIdWorker.java
new file mode 100644
index 00000000..ff5a11d3
--- /dev/null
+++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/util/SnowflakeIdWorker.java
@@ -0,0 +1,104 @@
+package com.ruoyi.iot.util;
+
+public class SnowflakeIdWorker {
+ /**
+ * 开始时间:2020-01-01 00:00:00
+ */
+ private final long beginTs = 1577808000000L;
+
+ private final long workerIdBits = 10;
+
+ /**
+ * 2^10 - 1 = 1023
+ */
+ private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+ private final long sequenceBits = 12;
+
+ /**
+ * 2^12 - 1 = 4095
+ */
+ private final long maxSequence = -1L ^ (-1L << sequenceBits);
+
+ /**
+ * 时间戳左移22位
+ */
+ private final long timestampLeftOffset = workerIdBits + sequenceBits;
+
+ /**
+ * 业务ID左移12位
+ */
+ private final long workerIdLeftOffset = sequenceBits;
+
+ /**
+ * 合并了机器ID和数据标示ID,统称业务ID,10位
+ */
+ private long workerId;
+
+ /**
+ * 毫秒内序列,12位,2^12 = 4096个数字
+ */
+ private long sequence = 0L;
+
+ /**
+ * 上一次生成的ID的时间戳,同一个worker中
+ */
+ private long lastTimestamp = -1L;
+
+ public SnowflakeIdWorker(long workerId) {
+ if (workerId > maxWorkerId || workerId < 0) {
+ throw new IllegalArgumentException(String.format("WorkerId必须大于或等于0且小于或等于%d", maxWorkerId));
+ }
+
+ this.workerId = workerId;
+ }
+
+ public synchronized long nextId() {
+ long ts = System.currentTimeMillis();
+ if (ts < lastTimestamp) {
+ throw new RuntimeException(String.format("系统时钟回退了%d毫秒", (lastTimestamp - ts)));
+ }
+
+ // 同一时间内,则计算序列号
+ if (ts == lastTimestamp) {
+ // 序列号溢出
+ if (++sequence > maxSequence) {
+ ts = tilNextMillis(lastTimestamp);
+ sequence = 0L;
+ }
+ } else {
+ // 时间戳改变,重置序列号
+ sequence = 0L;
+ }
+
+ lastTimestamp = ts;
+
+ // 0 - 00000000 00000000 00000000 00000000 00000000 0 - 00000000 00 - 00000000 0000
+ // 左移后,低位补0,进行按位或运算相当于二进制拼接
+ // 本来高位还有个0<<63,0与任何数字按位或都是本身,所以写不写效果一样
+ return (ts - beginTs) << timestampLeftOffset | workerId << workerIdLeftOffset | sequence;
+ }
+
+ /**
+ * 阻塞到下一个毫秒
+ *
+ * @param lastTimestamp
+ * @return
+ */
+ private long tilNextMillis(long lastTimestamp) {
+ long ts = System.currentTimeMillis();
+ while (ts <= lastTimestamp) {
+ ts = System.currentTimeMillis();
+ }
+
+ return ts;
+ }
+
+ public static void main(String[] args) {
+ SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(7);
+ for (int i = 0; i < 10; i++) {
+ long id = snowflakeIdWorker.nextId();
+ System.out.println(id);
+ }
+ }
+}
\ No newline at end of file
diff --git a/springboot/wumei-iot/src/main/resources/mapper/tdengine/DatabaseMapper.xml b/springboot/wumei-iot/src/main/resources/mapper/tdengine/DatabaseMapper.xml
new file mode 100644
index 00000000..a2925db9
--- /dev/null
+++ b/springboot/wumei-iot/src/main/resources/mapper/tdengine/DatabaseMapper.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+ create database if not exists ${dbName};
+
+
+
+
+ DROP database if exists ${dbName};
+
+
+
+
+ use ${dbName};
+
+
+
+
+ create stable if not exists ${tableName}
+ (ts timestamp,
+ log_id BIGINT,
+ identity NCHAR(100),
+ log_type NCHAR(20),
+ log_value NCHAR(100),
+ device_id BIGINT,
+ device_name NCHAR(100),
+ serial_number NCHAR(100),
+ is_monitor int,
+ create_by NCHAR(100),
+ create_time timestamp,
+ remark NCHAR(1000),
+ );
+
+
+
+ create stable if not exists ${tableName}
+ (ts timestamp,
+ log_id BIGINT,
+ identity NCHAR(100),
+ log_type NCHAR(20),
+ log_value NCHAR(100),
+ device_id BIGINT,
+ device_name NCHAR(100),
+ serial_number NCHAR(100),
+ is_monitor int,
+ create_by NCHAR(100),
+ create_time timestamp,
+ remark NCHAR(1000),
+ );
+
+
+
+
\ No newline at end of file
diff --git a/springboot/wumei-iot/src/main/resources/mapper/tdengine/TDDeviceLogMapper.xml b/springboot/wumei-iot/src/main/resources/mapper/tdengine/TDDeviceLogMapper.xml
new file mode 100644
index 00000000..a17ef4d2
--- /dev/null
+++ b/springboot/wumei-iot/src/main/resources/mapper/tdengine/TDDeviceLogMapper.xml
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ create database if not exists ${database};
+
+
+
+
+ create STABLE if not exists ${database}.device_log
+ (
+ ts timestamp,
+ log_id BIGINT,
+ log_type TINYINT,
+ `identity` BINARY(100),
+ `log_value` BINARY(100),
+ is_monitor TINYINT,
+ create_by BINARY(100),
+ create_time timestamp,
+ remark BINARY(500)
+
+ )
+ TAGS(
+ device_id BIGINT,
+ device_name BINARY(100),
+ serial_number BINARY(50));
+
+
+
+ create TABLE if not exists ${database}.${tableName}
+ USING ${database}.device_${deviceId} TAGS(log_type,is_monitor,create_by,create_time,remark)
+ (ts2 timestamp,
+ log_type BINARY(100)
+ );
+
+
+
+
+
+ INSERT INTO ${database}.device_${device.serialNumber} USING device_log
+ TAGS (#{device.deviceId},#{device.deviceName},#{device.serialNumber})
+ VALUES (now, #{device.logId}, #{device.logType},#{device.identity},#{device.logValue},#{device.isMonitor},#{device.createBy},now,#{device.remark} );
+
+
+
+ delete from ${database}.device_${device.serialNumber}
+
+
+ log_id = #{logId}
+
+
+ device_id = #{deviceId}
+
+
+ serial_number = #{serialNumber}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file