diff --git a/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java index 1d4dc1f7..d4e1a102 100644 --- a/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java +++ b/springboot/wumei-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java @@ -12,11 +12,11 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; * * @author ruoyi */ -@Configuration -// 表示通过aop框架暴露该代理对象,AopContext能够访问 -@EnableAspectJAutoProxy(exposeProxy = true) -// 指定要扫描的Mapper类的包的路径 -@MapperScan("com.ruoyi.**.mapper") +//@Configuration +//// 表示通过aop框架暴露该代理对象,AopContext能够访问 +//@EnableAspectJAutoProxy(exposeProxy = true) +//// 指定要扫描的Mapper类的包的路径 +//@MapperScan("com.ruoyi.**.mapper") public class ApplicationConfig { /** 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..6248a92a --- /dev/null +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/init/ApplicationStarted.java @@ -0,0 +1,87 @@ +package com.ruoyi.iot.init; + + +//import com.ruoyi.mysql.config.TDengineConfig; + +//import com.ruoyi.iot.tdengine.config.TDengineConfig; +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 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 ApplicationContext applicationContext; + + @Autowired + private DeviceMapper deviceMapper; + + @Autowired + @Qualifier("mysqlSqlSessionTemplate") + private SqlSessionTemplate mysqlSqlSessionTemplate; + + @Autowired + @Qualifier("tdengineSqlSessionTemplate") + private SqlSessionTemplate tdengineSqlSessionTemplate; + + @Override + public void run(ApplicationArguments args) { + printBean(); + deviceMapper.selectDeviceByDeviceId(0L); + System.out.println("初始化MySql链接成功"); + initTDengine(); + System.out.println("初始化TDengine链接成功"); + } + + /** + * 开始初始化加载系统参数 + */ + 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"); + } + + } + + private void printBean(){ + String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); + for (int i = 0; i < beanDefinitionNames.length; i++) { + System.out.println(beanDefinitionNames[i]); + + } + } +} 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..f1a20036 --- /dev/null +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/ILogService.java @@ -0,0 +1,33 @@ +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 + * 描述: TODO + * 时间: 2022/5/19,0019 18:04 + * 开发人: admin + */ +public interface ILogService { + + int saveDeviceLog(DeviceLog deviceLog); + + int deleteDeviceLogById(Long logId); + + int deleteDeviceLogByDeviceId(Long deviceId); + + List selectLogList(Long deviceId, String serialNumber, Long isMonitor, Long logType, Date beginDate, Date endDate); + + void save(String topic, String message); + + List selectDeviceLogList(DeviceLog deviceLog); + + List selectMonitorList(DeviceLog deviceLog); +} diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/LogServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/LogServiceImpl.java new file mode 100644 index 00000000..da330a78 --- /dev/null +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/log/service/impl/LogServiceImpl.java @@ -0,0 +1,203 @@ +package com.ruoyi.iot.log.service.impl; + +import com.alibaba.fastjson.JSONObject; +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.scheduling.annotation.Async; +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 + * 开发人: admin + */ +@Service +public class LogServiceImpl implements ILogService { + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private DeviceLogMapper deviceLogMapper; + + private TDDeviceLogMapper tdDeviceLogMapper; + + @Autowired + private TDengineConfig dengineConfig; + + private SnowflakeIdWorker snowflakeIdWorker; + + private String dbName; + + @PostConstruct + private void initDeviceLogMapper() { + if (dengineConfig != null) { + dbName = dengineConfig.getDbName(); + snowflakeIdWorker = new SnowflakeIdWorker(1); + this.tdDeviceLogMapper = dengineConfig.getTDengineLogMapper(); + } + } + + @Override + public int saveDeviceLog(DeviceLog deviceLog) { + if (tdDeviceLogMapper != null) { + { + String dbName = dengineConfig.getDbName(); + long logId = snowflakeIdWorker.nextId(); + deviceLog.setLogId(logId); + return tdDeviceLogMapper.save(dbName, deviceLog); + } + } else if (deviceLogMapper != null) { + deviceLog.setCreateTime(new Date()); + return deviceLogMapper.insertDeviceLog(deviceLog); + } else { + return -1; + } + } + + @Override + public int deleteDeviceLogById(Long logId) { + if (logId == null) return 0; + if (tdDeviceLogMapper != null) { + { + String dbName = dengineConfig.getDbName(); + DeviceLog deviceLog = new DeviceLog(); + deviceLog.setLogId(logId); + return tdDeviceLogMapper.delete(dbName, deviceLog); + } + } else if (deviceLogMapper != null) { + return deviceLogMapper.deleteDeviceLogByLogId(logId); + } else { + return -1; + } + } + + @Override + public int deleteDeviceLogByDeviceId(Long deviceId) { + if (deviceId == null) return 0; + if (tdDeviceLogMapper != null) { + { + String dbName = dengineConfig.getDbName(); + DeviceLog deviceLog = new DeviceLog(); + deviceLog.setDeviceId(deviceId); + return tdDeviceLogMapper.delete(dbName, deviceLog); + } + } else if (deviceLogMapper != null) { + Long[] ids = new Long[1]; + ids[0] = deviceId; + return deviceLogMapper.deleteDeviceLogByDeviceIds(ids); + } else { + return -1; + } + } + + @Override + public List selectLogList(Long deviceId, String serialNumber, Long isMonitor, Long logType, Date beginDate, Date endDate) { + return null; + } + +// @Override +// public List selectLogList(Long deviceId, String serialNumber, Long isMonitor, Long logType, Date beginDate, Date endDate) { +// List list = new ArrayList<>(); +// if (tdDeviceLogMapper != null) { +// { +// String dbName = dengineConfig.getDbName(); +// list = tdDeviceLogMapper.selectLogList(dbName, deviceId, serialNumber, isMonitor, logType, beginDate, endDate); +// +// return list; +// } +// } else if (deviceLogMapper != null) { +// list = deviceLogMapper.selectLogList(deviceId, serialNumber, isMonitor, logType, beginDate, endDate); +// } +// return list; +// } + + @Override + @Async + public void save(String topic, String message) { + System.out.println("topic:" + topic); + System.out.println("message:" + message); + String[] topicItem = topic.split("/"); + String subTopic = topicItem[0]; + String deviceNum = topicItem[1]; + JSONObject jsonObject = JSONObject.parseObject(message); + for (String key : jsonObject.keySet()) { + DeviceLog deviceLog = new DeviceLog(); + deviceLog.setLogId(new Date().getTime()); + deviceLog.setSerialNumber(deviceNum); + deviceLog.setDeviceName(subTopic); + deviceLog.setDeviceId(Long.parseLong(deviceNum)); + deviceLog.setDeviceName("灌溉机:" + deviceNum); + deviceLog.setTs(new Date()); + deviceLog.setIsMonitor(1); + deviceLog.setLogType(1); + deviceLog.setIdentity(key); + deviceLog.setLogValue(jsonObject.getString(key)); + deviceLog.setRemark(message); + tdDeviceLogMapper.save(dbName, deviceLog); + } + + + } + + @Override + public List selectDeviceLogList(DeviceLog deviceLog) { + List list = new ArrayList<>(); + if (tdDeviceLogMapper != null) { + { + String dbName = dengineConfig.getDbName(); + list = tdDeviceLogMapper.selectDeviceLogList(dbName, deviceLog); + + return list; + } + } else if (deviceLogMapper != null) { + list = deviceLogMapper.selectDeviceLogList(deviceLog); + } + return list; + } + + @Override + public List selectMonitorList(DeviceLog deviceLog) { + List list = new ArrayList<>(); + if (tdDeviceLogMapper != null) { + { + String dbName = dengineConfig.getDbName(); + list = tdDeviceLogMapper.selectMonitorList(dbName, deviceLog); + + return list; + } + } else if (deviceLogMapper != null) { + list = deviceLogMapper.selectMonitorList(deviceLog); + } + return list; + } + +// @Override +// public List selectLogListPage(Integer pageSize, Integer pageNum,Long deviceId,String serialNumber,Long isMonitor,Long logType, Date beginDate, Date endDate) { +// if (tdDeviceLogMapper != null) { +// { +// String dbName = dengineConfig.getDbName(); +// List list= tdDeviceLogMapper.selectLogListByPage(dbName,pageSize,pageNum,deviceNum,beginDate,endDate); +// +// return +// } +// } else if (deviceLogMapper != null) { +// return deviceLogMapper.deleteDeviceLogByLogId(logId); +// } else { +// return -1; +// } +// } +} diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mapper/DeviceLogMapper.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mapper/DeviceLogMapper.java index 619d0d57..73b66fc9 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mapper/DeviceLogMapper.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/mapper/DeviceLogMapper.java @@ -4,11 +4,12 @@ import com.ruoyi.iot.domain.DeviceLog; import com.ruoyi.iot.model.MonitorModel; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; /** * 设备日志Mapper接口 - * + * * @author kerwincui * @date 2022-01-13 */ @@ -17,7 +18,7 @@ public interface DeviceLogMapper { /** * 查询设备日志 - * + * * @param logId 设备日志主键 * @return 设备日志 */ @@ -25,7 +26,7 @@ public interface DeviceLogMapper /** * 查询设备日志列表 - * + * * @param deviceLog 设备日志 * @return 设备日志集合 */ @@ -41,7 +42,7 @@ public interface DeviceLogMapper /** * 新增设备日志 - * + * * @param deviceLog 设备日志 * @return 结果 */ @@ -49,7 +50,7 @@ public interface DeviceLogMapper /** * 修改设备日志 - * + * * @param deviceLog 设备日志 * @return 结果 */ @@ -57,7 +58,7 @@ public interface DeviceLogMapper /** * 删除设备日志 - * + * * @param logId 设备日志主键 * @return 结果 */ @@ -65,7 +66,7 @@ public interface DeviceLogMapper /** * 批量删除设备日志 - * + * * @param logIds 需要删除的数据主键集合 * @return 结果 */ @@ -78,4 +79,7 @@ public interface DeviceLogMapper * @return 结果 */ public int deleteDeviceLogByDeviceIds(Long[] deviceIds); + + +// List selectLogList(Long deviceId,String serialNumber,Long isMonitor,Long logType, Date beginDate, Date endDate); } 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/service/impl/DeviceLogServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceLogServiceImpl.java index c0fbd020..da92a13d 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceLogServiceImpl.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceLogServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.iot.service.impl; import com.ruoyi.common.utils.DateUtils; 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 com.ruoyi.iot.service.IDeviceLogService; @@ -22,6 +23,9 @@ public class DeviceLogServiceImpl implements IDeviceLogService @Autowired private DeviceLogMapper deviceLogMapper; + @Autowired + private ILogService logService; + /** * 查询设备日志 * @@ -43,7 +47,8 @@ public class DeviceLogServiceImpl implements IDeviceLogService @Override public List selectDeviceLogList(DeviceLog deviceLog) { - return deviceLogMapper.selectDeviceLogList(deviceLog); +// deviceLogMapper.selectDeviceLogList(deviceLog); + return logService.selectDeviceLogList(deviceLog); } /** @@ -55,7 +60,8 @@ public class DeviceLogServiceImpl implements IDeviceLogService @Override public List selectMonitorList(DeviceLog deviceLog) { - return deviceLogMapper.selectMonitorList(deviceLog); +// return deviceLogMapper.selectMonitorList(deviceLog); + return logService.selectMonitorList(deviceLog); } /** @@ -68,7 +74,8 @@ public class DeviceLogServiceImpl implements IDeviceLogService public int insertDeviceLog(DeviceLog deviceLog) { deviceLog.setCreateTime(DateUtils.getNowDate()); - return deviceLogMapper.insertDeviceLog(deviceLog); +// return deviceLogMapper.insertDeviceLog(deviceLog); + return logService.saveDeviceLog(deviceLog); } /** diff --git a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java index c32a0408..b40e0112 100644 --- a/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java +++ b/springboot/wumei-iot/src/main/java/com/ruoyi/iot/service/impl/DeviceServiceImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.iot.domain.Device; import com.ruoyi.iot.domain.DeviceLog; import com.ruoyi.iot.domain.Product; +import com.ruoyi.iot.log.service.ILogService; import com.ruoyi.iot.mapper.DeviceLogMapper; import com.ruoyi.iot.mapper.DeviceMapper; import com.ruoyi.iot.mapper.DeviceUserMapper; @@ -22,6 +23,7 @@ import com.ruoyi.iot.service.IDeviceService; import com.ruoyi.iot.service.IProductService; import com.ruoyi.iot.service.IToolService; import com.ruoyi.system.service.ISysUserService; +import org.checkerframework.checker.units.qual.A; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,8 +75,11 @@ public class DeviceServiceImpl implements IDeviceService { @Autowired private ISysUserService userService; +// @Autowired +// private IDeviceLogService deviceLogService; + @Autowired - private IDeviceLogService deviceLogService; + private ILogService logService; /** * 查询设备 @@ -196,7 +201,8 @@ public class DeviceServiceImpl implements IDeviceService { deviceLog.setCreateTime(DateUtils.getNowDate()); deviceLog.setIsMonitor(valueList.get(k).getIsMonitor()); deviceLog.setLogType(type); - deviceLogMapper.insertDeviceLog(deviceLog); + logService.saveDeviceLog(deviceLog); +// deviceLogMapper.insertDeviceLog(deviceLog); break; } } @@ -588,7 +594,8 @@ public class DeviceServiceImpl implements IDeviceService { deviceLog.setIdentity("offline"); deviceLog.setLogType(6); } - deviceLogService.insertDeviceLog(deviceLog); + logService.saveDeviceLog(deviceLog); +// deviceLogService.insertDeviceLog(deviceLog); return result; } 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