Просмотр исходного кода

'新增data-transfer服务模块'

james 9 месяцев назад
Родитель
Сommit
ef2c12e3f2
82 измененных файлов с 3438 добавлено и 67 удалено
  1. 29 0
      data-transfer/data-transfer-api/pom.xml
  2. 21 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/RemoteTransferService.java
  3. 41 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/DeviceDataInfoVO.java
  4. 43 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/DeviceDataWriteVO.java
  5. 30 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/HistoryRequestVO.java
  6. 19 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/HistoryResultVO.java
  7. 20 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/LastRequestVO.java
  8. 20 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/LastResultVO.java
  9. 20 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/MetricVO.java
  10. 39 0
      data-transfer/data-transfer-api/src/main/java/com/usky/transfer/factory/RemoteTransferFallbackFactory.java
  11. 91 0
      data-transfer/data-transfer-biz/pom.xml
  12. 49 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/ApplicationRun.java
  13. 107 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/MybatisGenerator.java
  14. 41 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/api/DataTransferControllerApi.java
  15. 21 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpDeviceController.java
  16. 21 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpDeviceStatusController.java
  17. 21 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpProductController.java
  18. 31 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/QueryInfluxdbDataController.java
  19. 31 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/SendMessageController.java
  20. 36 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/SysUserController.java
  21. 72 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DataRealTime.java
  22. 131 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpDevice.java
  23. 61 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpDeviceStatus.java
  24. 141 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpProduct.java
  25. 26 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/QueryInfluxdbData.java
  26. 123 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/SysUser.java
  27. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpDeviceMapper.java
  28. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpDeviceStatusMapper.java
  29. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpProductMapper.java
  30. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/QueryInfluxdbDataMapper.java
  31. 27 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/SysUserMapper.java
  32. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpDeviceService.java
  33. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpDeviceStatusService.java
  34. 16 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpProductService.java
  35. 23 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/QueryInfluxdbDataService.java
  36. 17 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/SysUserService.java
  37. 12 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/config/CodeCache.java
  38. 57 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/config/TsdbConfig.java
  39. 20 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpDeviceServiceImpl.java
  40. 20 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpDeviceStatusServiceImpl.java
  41. 20 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpProductServiceImpl.java
  42. 183 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/QueryInfluxdbDataServiceImpl.java
  43. 18 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/SysUserServiceImpl.java
  44. 26 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/MyConsumer.java
  45. 17 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/MyProducer.java
  46. 80 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/SimpleContext.java
  47. 196 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/utils/TsdbUtils.java
  48. 32 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/vo/DeviceMapVO.java
  49. 34 0
      data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/vo/ProductMapVO.java
  50. 25 0
      data-transfer/data-transfer-biz/src/main/resources/bootstrap.yml
  51. 108 0
      data-transfer/data-transfer-biz/src/main/resources/doc/index.adoc
  52. 74 0
      data-transfer/data-transfer-biz/src/main/resources/logback.xml
  53. 30 0
      data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpDeviceMapper.xml
  54. 16 0
      data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpDeviceStatusMapper.xml
  55. 32 0
      data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpProductMapper.xml
  56. 11 0
      data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/QueryInfluxdbDataMapper.xml
  57. 89 0
      data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/SysUserMapper.xml
  58. 15 0
      data-transfer/data-transfer-biz/src/main/resources/smart-doc.json
  59. 17 0
      data-transfer/pom.xml
  60. 6 6
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/RemoteTsdbProxyService.java
  61. 4 4
      data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/factory/RemoteTsdbProxyFallbackFactory.java
  62. 0 1
      data-tsdb-proxy/data-tsdb-proxy-biz/pom.xml
  63. 4 4
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/MybatisGenerator.java
  64. 9 9
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/api/DataTsdbProxyControllerApi.java
  65. 21 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/DmpDeviceController.java
  66. 21 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/DmpProductController.java
  67. 52 4
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/QueryInfluxdbDataController.java
  68. 11 11
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/SendMessageController.java
  69. 131 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/domain/DmpDevice.java
  70. 141 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/domain/DmpProduct.java
  71. 16 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/mapper/DmpDeviceMapper.java
  72. 16 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/mapper/DmpProductMapper.java
  73. 16 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/DmpDeviceService.java
  74. 16 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/DmpProductService.java
  75. 9 1
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/QueryInfluxdbDataService.java
  76. 20 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/DmpDeviceServiceImpl.java
  77. 20 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/DmpProductServiceImpl.java
  78. 201 27
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/QueryInfluxdbDataServiceImpl.java
  79. 32 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/vo/DeviceMapVO.java
  80. 34 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/vo/ProductMapVO.java
  81. 30 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/resources/mapper/demo/DmpDeviceMapper.xml
  82. 32 0
      data-tsdb-proxy/data-tsdb-proxy-biz/src/main/resources/mapper/demo/DmpProductMapper.xml

+ 29 - 0
data-transfer/data-transfer-api/pom.xml

@@ -0,0 +1,29 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-transfer</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-transfer-api</artifactId>
+    <!-- SpringCloud Openfeign -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 21 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/RemoteTransferService.java

@@ -0,0 +1,21 @@
+package com.usky.transfer;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.transfer.domain.*;
+import com.usky.transfer.factory.RemoteTransferFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@FeignClient(contextId = "remoteTransferService", value = "data-transfer", fallbackFactory = RemoteTransferFallbackFactory.class)
+public interface RemoteTransferService {
+
+    /**
+     * 单个设备数据写入
+     * @return
+     */
+    @PostMapping("/sendDeviceData")
+    ApiResult<Void> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO);
+}

+ 41 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/DeviceDataInfoVO.java

@@ -0,0 +1,41 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeviceDataInfoVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 属性值集合
+     */
+    private Map<String,Object> metrics;
+
+    /**
+     * 标签集合
+     */
+    private Map<String,Object> tags;
+
+    /**
+     * 设备编号
+     */
+    private String device_id;
+
+    /**
+     * 产品编码
+     */
+    private String product_code;
+
+    /**
+     * 数据上报时间
+     */
+    private long timestamp;
+}

+ 43 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/DeviceDataWriteVO.java

@@ -0,0 +1,43 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeviceDataWriteVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备Id
+     */
+    private String deviceId;
+
+    /**
+     * 数据上报时间
+     */
+    private long timestamp;
+
+    /**
+     * 标签集合
+     */
+    private Map<String,Object> tags;
+
+    /**
+     * 属性值集合
+     */
+    private Map<String,Object> metrics;
+
+}
+

+ 30 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/HistoryRequestVO.java

@@ -0,0 +1,30 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class HistoryRequestVO implements Serializable {
+
+    /**
+     * 产品编码
+     */
+    private String  productCode;
+
+    /**
+     * 设备Id
+     */
+    private List<String> deviceId;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+}

+ 19 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/HistoryResultVO.java

@@ -0,0 +1,19 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class HistoryResultVO implements Serializable {
+    private String deviceId;
+    private List<MetricVO> metrics;
+
+    public HistoryResultVO(String devId,List<MetricVO> metrics){
+        this.deviceId = devId;
+        this.metrics = metrics;
+    }
+
+}

+ 20 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/LastRequestVO.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class LastRequestVO implements Serializable {
+
+    /**
+     * 产品编码
+     */
+    private String  productCode;
+
+    /**
+     * 设备Id
+     */
+    private List<String> deviceId;
+}

+ 20 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/LastResultVO.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class LastResultVO implements Serializable {
+
+    private String deviceId;
+    private List<Map<String,Object>> metrics;
+
+    public LastResultVO(String devId,List<Map<String,Object>> metrics){
+        this.deviceId = devId;
+        this.metrics = metrics;
+    }
+
+}

+ 20 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/domain/MetricVO.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class MetricVO implements Serializable {
+
+    private String metric;
+    private List<Map<String,Object>> metricItems;
+
+    public MetricVO(String metric,List<Map<String,Object>> metricItems){
+        this.metric = metric;
+        this.metricItems = metricItems;
+    }
+
+}

+ 39 - 0
data-transfer/data-transfer-api/src/main/java/com/usky/transfer/factory/RemoteTransferFallbackFactory.java

@@ -0,0 +1,39 @@
+package com.usky.transfer.factory;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.transfer.RemoteTransferService;
+import com.usky.transfer.domain.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteTransferFallbackFactory implements FallbackFactory<RemoteTransferService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteTransferFallbackFactory.class);
+
+    @Override
+    public RemoteTransferService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteTransferService() {
+            @Override
+            public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO) {
+                throw new BusinessException(throwable.getMessage());
+            }
+        };
+    }
+}

+ 91 - 0
data-transfer/data-transfer-biz/pom.xml

@@ -0,0 +1,91 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-transfer</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-transfer-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- Pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.28</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-spring-boot-starter</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+        <!-- InfluxDB Java 客户端,用于连接和操作 InfluxDB 数据库 -->
+        <dependency>
+            <groupId>org.influxdb</groupId>
+            <artifactId>influxdb-java</artifactId>
+            <version>2.23</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>data-transfer-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.1.1</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 49 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/ApplicationRun.java

@@ -0,0 +1,49 @@
+package com.usky.transfer;
+
+
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 应用启动模块
+ * 
+ */
+
+
+@EnableCustomSwagger2
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.transfer.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class ApplicationRun
+{
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRun.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ApplicationRun.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null==path?"":path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null==path?"":path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null==path?"":path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}

+ 107 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/MybatisGenerator.java

@@ -0,0 +1,107 @@
+package com.usky.transfer;//package com.usky.demo.controller;//package com.usky.dm.controller.web.business;//package com.usky.dm.controller.web;
+
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class MybatisGenerator {
+    public static void main(String[] args) {
+
+            shell("data-transfer","data-transfer-biz");
+    }
+
+    private static void shell(String parentName,String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        //1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath+="/"+parentName;
+        projectPath+="/"+model;
+        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
+        //修改为自己的名字
+        gc.setAuthor("ya"); //设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); //生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        //2、数据源配置
+        //修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.transfer");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+//        pc.setXml("mapper.demo");
+        //pc.setModuleName("test");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); //使用lombok
+        //修改自己想要生成的表
+        strategy.setInclude("dmp_device_status");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        //修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        //如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/transfer" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 41 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/api/DataTransferControllerApi.java

@@ -0,0 +1,41 @@
+package com.usky.transfer.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.BeanMapperUtils;
+import com.usky.common.core.util.FileUtils;
+import com.usky.common.core.util.GlobalUtils;
+import com.usky.transfer.RemoteTransferService;
+import com.usky.transfer.domain.*;
+import com.usky.transfer.service.QueryInfluxdbDataService;
+import com.usky.transfer.service.SysUserService;
+import com.usky.system.RemoteUserService;
+import com.usky.system.domain.SysUserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@RestController
+public class DataTransferControllerApi implements RemoteTransferService {
+
+    @Autowired
+    private QueryInfluxdbDataService queryInfluxdbDataService;
+
+    /**
+     * 单个设备数据写入
+     * @return
+     */
+    @Override
+    public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO){
+        queryInfluxdbDataService.sendDeviceDataToMQ(writeVO);
+        return ApiResult.success();
+    }
+}

+ 21 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpDeviceController.java

@@ -0,0 +1,21 @@
+package com.usky.transfer.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 设备信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Controller
+@RequestMapping("/dmpDevice")
+public class DmpDeviceController {
+
+}
+

+ 21 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpDeviceStatusController.java

@@ -0,0 +1,21 @@
+package com.usky.transfer.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 设备状态表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Controller
+@RequestMapping("/dmpDeviceStatus")
+public class DmpDeviceStatusController {
+
+}
+

+ 21 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/DmpProductController.java

@@ -0,0 +1,21 @@
+package com.usky.transfer.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 产品信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Controller
+@RequestMapping("/dmpProduct")
+public class DmpProductController {
+
+}
+

+ 31 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/QueryInfluxdbDataController.java

@@ -0,0 +1,31 @@
+package com.usky.transfer.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.transfer.domain.HistoryRequestVO;
+import com.usky.transfer.domain.HistoryResultVO;
+import com.usky.transfer.domain.LastRequestVO;
+import com.usky.transfer.domain.LastResultVO;
+import com.usky.transfer.service.QueryInfluxdbDataService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-07-29
+ */
+@RestController
+@Api(tags = "数据统一查询")
+@RequestMapping("/dataQuery")
+public class QueryInfluxdbDataController {
+
+
+}
+

+ 31 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/SendMessageController.java

@@ -0,0 +1,31 @@
+package com.usky.transfer.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.transfer.domain.DeviceDataWriteVO;
+import com.usky.transfer.service.QueryInfluxdbDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author :
+ * @CreateTime : 2024/2/29
+ * @Description :
+ **/
+@RestController
+@RequestMapping("/dataWrite")
+public class SendMessageController {
+    @Autowired
+    private QueryInfluxdbDataService queryInfluxdbDataService;
+
+    /**
+     * 单个设备数据写入
+     * @return
+     */
+    @PostMapping("/sendDeviceData")
+    public ApiResult<Map<String,Object>> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO){
+        return ApiResult.success(queryInfluxdbDataService.sendDeviceDataToMQ(writeVO));
+    }
+
+}

+ 36 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/controller/web/SysUserController.java

@@ -0,0 +1,36 @@
+package com.usky.transfer.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.transfer.domain.SysUser;
+import com.usky.transfer.service.SysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+@RestController
+@RequestMapping("/sysUser")
+public class SysUserController {
+
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @GetMapping("/list")
+    public ApiResult<List<SysUser>> list(){
+        return ApiResult.success(sysUserService.list());
+    }
+}
+

+ 72 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DataRealTime.java

@@ -0,0 +1,72 @@
+package com.usky.transfer.domain;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 实时数据表
+ * </p>
+ *
+ * @author ya
+ * @since 2023-06-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DataRealTime implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备类型
+     */
+    private Integer deviceType;
+
+    /**
+     * 属性名称
+     */
+    private String attributeName;
+
+    /**
+     * 属性值
+     */
+    private String attributeData;
+
+    /**
+     * 数据时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime dataTime;
+
+    /**
+     * 插入时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime insertTime;
+
+
+}
+

+ 131 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpDevice.java

@@ -0,0 +1,131 @@
+package com.usky.transfer.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 设备信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 设备类型(501、监控系统  502、门禁系统  503、梯控系统  504、机房系统  509、环境系统  510、照明系统)
+     */
+    private Integer deviceType;
+
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 物联网卡号
+     */
+    private String simCode;
+
+    /**
+     * 国际移动用户识别码
+     */
+    private String imsiCode;
+
+    /**
+     * 自动订阅标识(0:否,1:是)
+     */
+    private Integer subscribeFlag;
+
+    /**
+     * 节点类型
+     */
+    private Integer nodeType;
+
+    /**
+     * 分组id
+     */
+    private Integer groupId;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 单位编号
+     */
+    private String companyCode;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+
+
+}

+ 61 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpDeviceStatus.java

@@ -0,0 +1,61 @@
+package com.usky.transfer.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 设备状态表
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpDeviceStatus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceId;
+
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 设备状态;1:在线,2:离线
+     */
+    private Integer deviceStatus;
+
+    /**
+     * 最后上线时间
+     */
+    private LocalDateTime lastOnlineTime;
+
+    /**
+     * 最后离线时间
+     */
+    private LocalDateTime lastOfflineTime;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+
+}

+ 141 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/DmpProduct.java

@@ -0,0 +1,141 @@
+package com.usky.transfer.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 产品信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpProduct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 接入方式(1、设备直连  2、网关接入)
+     */
+    private Integer accessMode;
+
+    /**
+     * 网络类型(1、WIFI  2、移动蜂窝数据 3、NB-IoT 4、以太网)
+     */
+    private Integer networkType;
+
+    /**
+     * 设备类型(501、监控系统  502、门禁系统  503、梯控系统  504、机房系统  509、环境系统  510、照明系统)
+     */
+    private Integer deviceType;
+
+    /**
+     * 通信协议(1、MQTT  2、TCP设备直连 3、HTTP)
+     */
+    private Integer comProtocol;
+
+    /**
+     * 认证方式
+     */
+    private String authMode;
+
+    /**
+     * 设备型号
+     */
+    private String deviceModel;
+
+    /**
+     * 产品描述
+     */
+    private String productDescribe;
+
+    /**
+     * 厂家名称
+     */
+    private String factoryName;
+
+    /**
+     * 厂家联系人
+     */
+    private String factoryPerson;
+
+    /**
+     * 厂家联系电话
+     */
+    private String factoryPhone;
+
+    /**
+     * 资质证书1
+     */
+    private String certificateUrl1;
+
+    /**
+     * 资质证书2
+     */
+    private String certificateUrl2;
+
+    /**
+     * 资质证书3
+     */
+    private String certificateUrl3;
+
+    /**
+     * 协议文档
+     */
+    private String agreementUrl;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+
+}

+ 26 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/QueryInfluxdbData.java

@@ -0,0 +1,26 @@
+package com.usky.transfer.domain;
+
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author ya
+ * @since 2024-07-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class QueryInfluxdbData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String influxdbName;
+
+
+}

+ 123 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/domain/SysUser.java

@@ -0,0 +1,123 @@
+package com.usky.transfer.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户ID
+     */
+    @TableId(value = "user_id", type = IdType.AUTO)
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户类型(00系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 头像地址
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpDeviceMapper.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.mapper;
+
+import com.usky.transfer.domain.DmpDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 设备信息表 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceMapper extends CrudMapper<DmpDevice> {
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpDeviceStatusMapper.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.mapper;
+
+import com.usky.transfer.domain.DmpDeviceStatus;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 设备状态表 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceStatusMapper extends CrudMapper<DmpDeviceStatus> {
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/DmpProductMapper.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.mapper;
+
+import com.usky.transfer.domain.DmpProduct;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 产品信息表 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpProductMapper extends CrudMapper<DmpProduct> {
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/QueryInfluxdbDataMapper.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.mapper;
+
+import com.usky.transfer.domain.QueryInfluxdbData;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-07-29
+ */
+public interface QueryInfluxdbDataMapper extends CrudMapper<QueryInfluxdbData> {
+
+}

+ 27 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/mapper/SysUserMapper.java

@@ -0,0 +1,27 @@
+package com.usky.transfer.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.transfer.domain.DataRealTime;
+import com.usky.transfer.domain.SysUser;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @since 2022-04-21
+ */
+@Repository
+public interface SysUserMapper extends CrudMapper<SysUser> {
+    void DeviceRealDataToDB(@Param("list") List<DataRealTime> list);
+
+    void DeviceDataToDB(@Param("list") List<DataRealTime> list,@Param("deviceId") String deviceId);
+
+    Integer existTable(@Param("tableName") String tableName);
+
+    void createTable(@Param("tableName") String tableName);
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpDeviceService.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.service;
+
+import com.usky.transfer.domain.DmpDevice;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 设备信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceService extends CrudService<DmpDevice> {
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpDeviceStatusService.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.service;
+
+import com.usky.transfer.domain.DmpDeviceStatus;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 设备状态表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceStatusService extends CrudService<DmpDeviceStatus> {
+
+}

+ 16 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/DmpProductService.java

@@ -0,0 +1,16 @@
+package com.usky.transfer.service;
+
+import com.usky.transfer.domain.DmpProduct;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 产品信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpProductService extends CrudService<DmpProduct> {
+
+}

+ 23 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/QueryInfluxdbDataService.java

@@ -0,0 +1,23 @@
+package com.usky.transfer.service;
+
+import com.usky.transfer.domain.*;
+import com.usky.common.mybatis.core.CrudService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-07-29
+ */
+public interface QueryInfluxdbDataService extends CrudService<QueryInfluxdbData> {
+
+    Map<String,Object> sendDeviceDataToMQ(DeviceDataWriteVO writeVO);
+
+
+
+}

+ 17 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/SysUserService.java

@@ -0,0 +1,17 @@
+package com.usky.transfer.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.transfer.domain.SysUser;
+
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+public interface SysUserService extends CrudService<SysUser> {
+
+}

+ 12 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/config/CodeCache.java

@@ -0,0 +1,12 @@
+package com.usky.transfer.service.config;
+
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class CodeCache {
+    public static List<String> tablesList = new ArrayList<>();
+
+}

+ 57 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/config/TsdbConfig.java

@@ -0,0 +1,57 @@
+package com.usky.transfer.service.config;
+
+import com.usky.common.core.util.StringUtils;
+import org.influxdb.InfluxDB;
+import org.influxdb.InfluxDBFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class TsdbConfig {
+
+    @Value("${spring.influx.url}")
+    private String influxDBUrl;
+
+    @Value("${spring.influx.username}")
+    private String userName;
+
+    @Value("${spring.influx.password}")
+    private String password;
+    @Value("${spring.influx.retention_policy}")
+    private String retention_policy;
+
+    @Value("${spring.influx.database}")
+    private String database;
+
+    @Bean
+    public InfluxDB influxdb() {
+        InfluxDB influxDB = null;
+        if (StringUtils.isEmpty(userName)) {
+            influxDB = InfluxDBFactory.connect(influxDBUrl);
+        } else {
+            influxDB = InfluxDBFactory.connect(influxDBUrl, userName, password);
+        }
+        try {
+
+            /**
+             * 异步插入:
+             * enableBatch这里第一个是point的个数,第二个是时间,单位毫秒
+             * point的个数和时间是联合使用的,如果满100条或者60 * 1000毫秒
+             * 满足任何一个条件就会发送一次写的请求。
+             */
+//            influxDB.setDatabase(database).enableBatch(100, 1000 * 60, TimeUnit.MILLISECONDS);
+            influxDB.setDatabase(database);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            //设置默认策略
+            this.retention_policy = retention_policy == null || "".equals(retention_policy) ? "autogen" : retention_policy;
+            influxDB.setRetentionPolicy(retention_policy);
+        }
+        //设置日志输出级别
+        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
+        return influxDB;
+    }
+
+}

+ 20 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpDeviceServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.service.impl;
+
+import com.usky.transfer.domain.DmpDevice;
+import com.usky.transfer.mapper.DmpDeviceMapper;
+import com.usky.transfer.service.DmpDeviceService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 设备信息表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Service
+public class DmpDeviceServiceImpl extends AbstractCrudService<DmpDeviceMapper, DmpDevice> implements DmpDeviceService {
+
+}

+ 20 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpDeviceStatusServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.service.impl;
+
+import com.usky.transfer.domain.DmpDeviceStatus;
+import com.usky.transfer.mapper.DmpDeviceStatusMapper;
+import com.usky.transfer.service.DmpDeviceStatusService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 设备状态表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Service
+public class DmpDeviceStatusServiceImpl extends AbstractCrudService<DmpDeviceStatusMapper, DmpDeviceStatus> implements DmpDeviceStatusService {
+
+}

+ 20 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/DmpProductServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.transfer.service.impl;
+
+import com.usky.transfer.domain.DmpProduct;
+import com.usky.transfer.mapper.DmpProductMapper;
+import com.usky.transfer.service.DmpProductService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 产品信息表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Service
+public class DmpProductServiceImpl extends AbstractCrudService<DmpProductMapper, DmpProduct> implements DmpProductService {
+
+}

+ 183 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/QueryInfluxdbDataServiceImpl.java

@@ -0,0 +1,183 @@
+package com.usky.transfer.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.sun.media.jfxmedia.logging.Logger;
+import com.usky.common.core.util.UUIDUtils;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.transfer.domain.*;
+import com.usky.transfer.mapper.QueryInfluxdbDataMapper;
+import com.usky.transfer.service.DmpDeviceService;
+import com.usky.transfer.service.DmpDeviceStatusService;
+import com.usky.transfer.service.DmpProductService;
+import com.usky.transfer.service.QueryInfluxdbDataService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.transfer.service.rocketmq.MyProducer;
+import com.usky.transfer.service.utils.TsdbUtils;
+import com.usky.transfer.service.vo.DeviceMapVO;
+import com.usky.transfer.service.vo.ProductMapVO;
+import lombok.extern.slf4j.Slf4j;
+import org.influxdb.dto.QueryResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-07-29
+ */
+@Slf4j
+@Service
+public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInfluxdbDataMapper, QueryInfluxdbData> implements QueryInfluxdbDataService {
+    @Autowired
+    private TsdbUtils tsdbUtils;
+    @Autowired
+    private DmpProductService dmpProductService;
+    @Autowired
+    private DmpDeviceService dmpDeviceService;
+    @Autowired
+    private DmpDeviceStatusService dmpDeviceStatusService;
+
+    @Resource
+    private MyProducer myProducer;
+
+
+    @Override
+    public Map<String,Object> sendDeviceDataToMQ(DeviceDataWriteVO writeVO){
+        Map<String,Object> rec_map = new HashMap<>();
+        DeviceDataInfoVO dataInfo = new DeviceDataInfoVO();
+        Map<String,Object> metrics = writeVO.getMetrics();
+        Map<String,Object> tags = writeVO.getTags();
+        if(metrics.size() > 0){
+            Map<String,Object> mp = new HashMap<>();
+            for(Map.Entry<String,Object> map:metrics.entrySet()){
+                mp.put(map.getKey(),map.getValue());
+            }
+            dataInfo.setMetrics(mp);
+            if(tags != null && tags.size() > 0){
+                mp.clear();
+                for(Map.Entry<String,Object> map:tags.entrySet()){
+                    mp.put(map.getKey(),map.getValue().toString());
+                }
+                dataInfo.setTags(mp);
+            }else{
+                dataInfo.setTags(new HashMap<>());
+            }
+
+            String productCode = writeVO.getProductCode();
+            String deviceId = writeVO.getDeviceId();
+
+            //判断上报数据对应产品是否注册,如未注册则为非法
+            Map<String,ProductMapVO> productMapList = getProductMap();
+            if(!productMapList.containsKey(productCode)){
+                //通过查询数据库再确认下产品是否注册
+                LambdaQueryWrapper<DmpProduct> queryWrapper = Wrappers.lambdaQuery();
+                queryWrapper.eq(DmpProduct::getDeleteFlag,0)
+                        .eq(DmpProduct::getProductCode,productCode);
+                DmpProduct one = dmpProductService.getOne(queryWrapper);
+                if(one == null){
+                    rec_map.put("code",201);
+                    rec_map.put("message","产品未注册!");
+                    log.info("产品未注册");
+                    return rec_map;
+                }
+            }
+            //判断上报数据设备是否已注册,未注册自动注册
+            Map<String,DeviceMapVO> deviceMapList = getDeviceMap();
+            if(!deviceMapList.containsKey(deviceId)){
+                DmpDevice dmpDeviceInfo = new DmpDevice();
+                ProductMapVO productMapVO = productMapList.get(productCode);
+                dmpDeviceInfo.setDeviceId(deviceId);
+                dmpDeviceInfo.setDeviceType(productMapVO.getDeviceType());
+                dmpDeviceInfo.setProductId(productMapVO.getProductId());
+                dmpDeviceInfo.setCreatedBy(productMapVO.getCreatedBy());
+                dmpDeviceInfo.setCreatedTime(LocalDateTime.now());
+                dmpDeviceInfo.setTenantId(productMapVO.getTenantId());
+                dmpDeviceInfo.setServiceStatus(1);
+                dmpDeviceInfo.setDeviceUuid(UUIDUtils.uuid());
+                dmpDeviceService.save(dmpDeviceInfo);
+
+
+                DmpDeviceStatus dmpDeviceStatus = new DmpDeviceStatus();
+                dmpDeviceStatus.setDeviceId(dmpDeviceInfo.getDeviceId());
+                dmpDeviceStatus.setProductId(dmpDeviceInfo.getProductId());
+                dmpDeviceStatus.setDeviceStatus(2);
+                dmpDeviceStatus.setLastOfflineTime(LocalDateTime.now());
+                dmpDeviceStatus.setProductCode(dmpDeviceInfo.getProductCode());
+                dmpDeviceStatusService.save(dmpDeviceStatus);
+            }
+
+            dataInfo.setProduct_code(productCode);
+            dataInfo.setDevice_id(deviceId);
+            dataInfo.setTimestamp(writeVO.getTimestamp());
+
+            myProducer.sendMessage("data-tsdb", JSONArray.toJSON(dataInfo).toString());
+        }
+
+        rec_map.put("code",200);
+        rec_map.put("message","操作成功!");
+        return rec_map;
+    }
+
+    @Cacheable(cacheNames = "productList",sync = true)
+    public Map<String, ProductMapVO> getProductMap(){
+        Map<String,ProductMapVO> productMap = new HashMap<>();
+        LambdaQueryWrapper<DmpProduct> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(DmpProduct::getDeleteFlag,0)
+                .orderByDesc(DmpProduct::getId);
+        List<DmpProduct> list = dmpProductService.list(queryWrapper);
+        if(CollectionUtils.isNotEmpty(list)){
+            for (int i = 0; i < list.size(); i++) {
+                String productCode = list.get(i).getProductCode();
+                ProductMapVO mapVO = new ProductMapVO();
+                mapVO.setProductId(list.get(i).getId());
+                mapVO.setProductCode(list.get(i).getProductCode());
+                mapVO.setCreatedBy(list.get(i).getCreatedBy());
+                mapVO.setTenantId(list.get(i).getTenantId());
+                mapVO.setDeviceType(list.get(i).getDeviceType());
+
+                productMap.put(productCode,mapVO);
+            }
+        }
+
+
+        return productMap;
+    }
+
+    @Cacheable(cacheNames = "deviceList",sync = true)
+    public Map<String, DeviceMapVO> getDeviceMap(){
+        Map<String,DeviceMapVO> deviceMap = new HashMap<>();
+        LambdaQueryWrapper<DmpDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(DmpDevice::getDeleteFlag,0)
+                .orderByDesc(DmpDevice::getId);
+        List<DmpDevice> list = dmpDeviceService.list(queryWrapper);
+        if(CollectionUtils.isNotEmpty(list)){
+            for (int i = 0; i < list.size(); i++) {
+                String deviceId = list.get(i).getDeviceId();
+                DeviceMapVO mapVO = new DeviceMapVO();
+                mapVO.setProductCode(list.get(i).getProductCode());
+                mapVO.setDeviceId(list.get(i).getDeviceId());
+                mapVO.setDeviceUuid(list.get(i).getDeviceUuid());
+                mapVO.setDeviceStatus(list.get(i).getServiceStatus());
+
+                deviceMap.put(deviceId,mapVO);
+            }
+        }
+
+        return deviceMap;
+    }
+
+}

+ 18 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,18 @@
+package com.usky.transfer.service.impl;
+
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.transfer.domain.SysUser;
+import com.usky.transfer.mapper.SysUserMapper;
+import com.usky.transfer.service.SysUserService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ */
+@Service
+public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUser> implements SysUserService {
+
+}

+ 26 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/MyConsumer.java

@@ -0,0 +1,26 @@
+package com.usky.transfer.service.rocketmq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.shaded.com.google.gson.JsonObject;
+import com.usky.transfer.service.rocketmq.SimpleContext;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Slf4j
+@Component
+@RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.group}", topic = "${rocketmq.consumer.topic}")
+public class MyConsumer implements RocketMQListener<String> {
+    @Autowired
+    private SimpleContext simpleContext;
+
+    @Override
+    public void onMessage(String message){
+        System.out.println("DirectReceiver消费者收到消息: " + message);
+        simpleContext.disposeMessageToDB(message);
+    }
+}

+ 17 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/MyProducer.java

@@ -0,0 +1,17 @@
+package com.usky.transfer.service.rocketmq;
+
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+public class MyProducer {
+    @Resource
+    private RocketMQTemplate rocketMQTemplate;
+    //发送普通消息的示例
+    public void sendMessage(String topic, String msg) {
+        rocketMQTemplate.convertAndSend(topic, msg);
+
+    }
+}

+ 80 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/rocketmq/SimpleContext.java

@@ -0,0 +1,80 @@
+package com.usky.transfer.service.rocketmq;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.shaded.com.google.gson.JsonArray;
+import com.usky.common.core.util.JsonUtils;
+import com.usky.transfer.domain.DeviceDataInfoVO;
+import com.usky.transfer.domain.DeviceDataWriteVO;
+import com.usky.transfer.service.QueryInfluxdbDataService;
+import com.usky.transfer.service.utils.TsdbUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.*;
+
+/**
+ * 中间处理消息转发
+ */
+@Service
+@Repository
+public class SimpleContext {
+    @Resource
+    private MyProducer myProducer;
+    @Autowired
+    private QueryInfluxdbDataService queryInfluxdbDataService;
+
+    /**
+     * 设备数据推送到MQ队列
+     * @param
+     */
+    public void disposeMessageToDB(String message){
+        Map<String, Object> tags = new HashMap<>();
+        Map<String, Object> fields = new HashMap<>();
+        Map map_data = JsonUtils.fromJson(message,Map.class);
+        String deviceId = map_data.get("device_id").toString();
+        String productCode = map_data.get("product_code").toString().toLowerCase();
+        Long timestamp = Long.valueOf(map_data.get("timestamp").toString());
+
+        String tableName = deviceId;
+
+        Object tg = JSONObject.toJSONString(map_data.get("tags"));
+        JSONObject tag = JSON.parseObject(tg.toString());
+        for (String entry : tag.keySet()){
+            tags.put(entry.toLowerCase(),tag.get(entry).toString());
+        }
+
+        Object met = JSONObject.toJSONString(map_data.get("metrics"));
+        JSONObject metrics = JSON.parseObject(met.toString());
+        for(String entry : metrics.keySet()){
+            fields.put(entry.toLowerCase(),metrics.get(entry));
+        }
+
+        DeviceDataWriteVO deviceDataWriteVO = new DeviceDataWriteVO();
+        deviceDataWriteVO.setDeviceId(deviceId);
+        deviceDataWriteVO.setProductCode(productCode);
+        deviceDataWriteVO.setTimestamp(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+        deviceDataWriteVO.setTags(tags);
+        deviceDataWriteVO.setMetrics(metrics);
+
+        queryInfluxdbDataService.sendDeviceDataToMQ(deviceDataWriteVO);
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 196 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/utils/TsdbUtils.java

@@ -0,0 +1,196 @@
+package com.usky.transfer.service.utils;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.usky.common.core.influx.core.InfluxDbUtils;
+import com.usky.common.core.util.DateUtils;
+import org.influxdb.InfluxDB;
+import org.influxdb.dto.BatchPoints;
+import org.influxdb.dto.Point;
+import org.influxdb.dto.Query;
+import org.influxdb.dto.QueryResult;
+import org.influxdb.impl.TimeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.convert.Jsr310Converters;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class TsdbUtils extends InfluxDbUtils {
+
+    @Resource
+    private InfluxDB influxDB;
+
+    @Value("${spring.influx.database}")
+    private String database;
+
+    /**
+     * 插入单条数据写法2
+     *
+     * @param measurement
+     */
+    public void insertOne(String measurement, Map<String, String> tags, Map<String, Object> fields) {
+        //构建
+        Point.Builder builder = Point.measurement(measurement);
+        //可指定时间戳
+        builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+        //tag属性只能存储String类型
+        builder.tag(tags);
+        //设置field
+        builder.fields(fields);
+        influxDB.write(builder.build());
+    }
+
+    /**
+     * 插入单条数据写法2
+     *
+     * @param measurement
+     */
+    public void insertOne1(String measurement, Map<String, String> tags, Map<String, Object> fields, Long timestamp) {
+        //构建
+        Point.Builder builder = Point.measurement(measurement);
+        //可指定时间戳
+        builder.time(timestamp, TimeUnit.MILLISECONDS);
+        //tag属性只能存储String类型
+        builder.tag(tags);
+        //设置field
+        builder.fields(fields);
+        influxDB.write(builder.build());
+    }
+
+    /**
+     * 插入单条数据
+     * influxDB开启UDP功能, 默认端口:8089,默认数据库:udp,没提供代码传数据库功能接口
+     * 使用UDP的原因
+     * TCP数据传输慢,UDP数据传输快。
+     * 网络带宽需求较小,而实时性要求高。
+     * InfluxDB和服务器在同机房,发生数据丢包的可能性较小,即使真的发生丢包,对整个请求流量的收集影响也较小。
+     *
+     * @param measurement
+     * @param tags
+     * @param fields
+     */
+    public void insertUDPOne(String measurement, Map<String, String> tags, Map<String, Object> fields) {
+        //构建
+        Point.Builder builder = Point.measurement(measurement);
+        //可指定时间戳
+        builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+        //tag属性只能存储String类型
+        builder.tag(tags);
+        //设置field
+        builder.fields(fields);
+        int udpPort = 8089;
+        influxDB.write(udpPort, builder.build());
+    }
+
+
+    //批量插入1
+    public void insertBatchByRecords() {
+        List<String> lines = new ArrayList<String>();
+        String measurement = "test-inset-one";
+        for (int i = 0; i < 2; i++) {
+            Point.Builder builder = Point.measurement(measurement);
+            //tag属性只能存储String类型
+            builder.tag("name", "zhanggang" + i);
+            //设置field
+            builder.addField("filed", "fileValue" + i);
+            lines.add(builder.build().lineProtocol());
+        }
+        influxDB.write(lines);
+    }
+
+
+    //批量插入2
+    public void insertBatchByPoints() {
+        BatchPoints batchPoints = BatchPoints.database(database)
+                .consistency(InfluxDB.ConsistencyLevel.ALL)
+                .build();
+        String measurement = "test-inset-one";
+        for (int i = 0; i < 2; i++) {
+            Point.Builder builder = Point.measurement(measurement);
+            //tag属性只能存储String类型
+            builder.tag("name", "zhanggang" + i);
+            //设置field
+            builder.addField("filed", "fileValue" + i);
+            batchPoints.point(builder.build());
+        }
+        influxDB.write(batchPoints);
+    }
+
+    /**
+     * 查询,返回Map集合
+     *
+     * @param query 完整的查询语句
+     * @return
+     */
+    public List<Map<String, Object>> fetchRecords(String query) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+        List<Map<String, Object>> results = new ArrayList<>();
+        QueryResult queryResult = influxDB.query(new Query(query, database));
+        if(queryResult.getResults().get(0).getSeries() != null){
+            queryResult.getResults().forEach(result -> {
+                result.getSeries().forEach(serial -> {
+                    List<String> columns = serial.getColumns();
+                    int fieldSize = columns.size();
+                    serial.getValues().forEach(value -> {
+                        Map<String, Object> obj = new HashMap<String,Object>();
+                        for (int i = 0; i < fieldSize; i++) {
+                            if(columns.get(i).equals("time")){
+                                Date time = null;
+                                try {
+                                    time = simpleDateFormat1.parse(value.get(i).toString());
+                                } catch (ParseException e) {
+                                    e.printStackTrace();
+                                }
+                                //String dateStr = simpleDateFormat.format(time);
+                                obj.put(columns.get(i), time.getTime());
+                            } else if(columns.get(i).equals("timestamp")){
+                                Date time = null;
+                                try {
+                                    time = simpleDateFormat1.parse(value.get(i).toString());
+                                } catch (ParseException e) {
+                                    e.printStackTrace();
+                                }
+                                //String dateStr = simpleDateFormat.format(time);
+                                obj.put(columns.get(i), time.getTime());
+                            }else{
+                                obj.put(columns.get(i), value.get(i));
+                            }
+                        }
+                        results.add(obj);
+                    });
+                });
+            });
+        }
+
+        return results;
+    }
+
+    /**
+     * 查询
+     *
+     * @param command 查询语句
+     * @return
+     */
+    public QueryResult query(String command) {
+        return influxDB.query(new Query(command, database));
+    }
+
+    /**
+     * 创建数据保留策略
+     * 设置数据保存策略 defalut 策略名 /database 数据库名/ 30d 数据保存时限30天/ 1 副本个数为1/ 结尾DEFAULT
+     * 表示 设为默认的策略
+     */
+    public void createRetentionPolicy() {
+        String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",
+                "defalut", database, "30d", 1);
+        this.query(command);
+    }
+
+}

+ 32 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/vo/DeviceMapVO.java

@@ -0,0 +1,32 @@
+package com.usky.transfer.service.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DeviceMapVO implements Serializable {
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备uuid;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceUuid;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 设备状态;1:在线,2:离线
+     */
+    @TableField(exist = false)
+    private Integer deviceStatus;
+
+}

+ 34 - 0
data-transfer/data-transfer-biz/src/main/java/com/usky/transfer/service/vo/ProductMapVO.java

@@ -0,0 +1,34 @@
+package com.usky.transfer.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProductMapVO implements Serializable {
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 设备类型
+     */
+    private Integer deviceType;
+
+}

+ 25 - 0
data-transfer/data-transfer-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 9896
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: data-transfer
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 108 - 0
data-transfer/data-transfer-biz/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= 安防项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 74 - 0
data-transfer/data-transfer-biz/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/var/log/uskycloud/usky-demo" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.usky" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 30 - 0
data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpDeviceMapper.xml

@@ -0,0 +1,30 @@
+<?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.usky.transfer.mapper.DmpDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.transfer.domain.DmpDevice">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="device_type" property="deviceType" />
+        <result column="product_id" property="productId" />
+        <result column="sim_code" property="simCode" />
+        <result column="imsi_code" property="imsiCode" />
+        <result column="subscribe_flag" property="subscribeFlag" />
+        <result column="node_type" property="nodeType" />
+        <result column="group_id" property="groupId" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_by" property="createdBy" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="company_code" property="companyCode" />
+        <result column="install_address" property="installAddress" />
+        <result column="service_status" property="serviceStatus" />
+        <result column="product_code" property="productCode" />
+        <result column="device_uuid" property="deviceUuid" />
+    </resultMap>
+
+</mapper>

+ 16 - 0
data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpDeviceStatusMapper.xml

@@ -0,0 +1,16 @@
+<?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.usky.transfer.mapper.DmpDeviceStatusMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.transfer.domain.DmpDeviceStatus">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="product_id" property="productId" />
+        <result column="device_status" property="deviceStatus" />
+        <result column="last_online_time" property="lastOnlineTime" />
+        <result column="last_offline_time" property="lastOfflineTime" />
+        <result column="product_code" property="productCode" />
+    </resultMap>
+
+</mapper>

+ 32 - 0
data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/DmpProductMapper.xml

@@ -0,0 +1,32 @@
+<?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.usky.transfer.mapper.DmpProductMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.transfer.domain.DmpProduct">
+        <id column="id" property="id" />
+        <result column="product_name" property="productName" />
+        <result column="access_mode" property="accessMode" />
+        <result column="network_type" property="networkType" />
+        <result column="device_type" property="deviceType" />
+        <result column="com_protocol" property="comProtocol" />
+        <result column="auth_mode" property="authMode" />
+        <result column="device_model" property="deviceModel" />
+        <result column="product_describe" property="productDescribe" />
+        <result column="factory_name" property="factoryName" />
+        <result column="factory_person" property="factoryPerson" />
+        <result column="factory_phone" property="factoryPhone" />
+        <result column="certificate_url1" property="certificateUrl1" />
+        <result column="certificate_url2" property="certificateUrl2" />
+        <result column="certificate_url3" property="certificateUrl3" />
+        <result column="agreement_url" property="agreementUrl" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_by" property="createdBy" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="product_code" property="productCode" />
+    </resultMap>
+
+</mapper>

+ 11 - 0
data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/QueryInfluxdbDataMapper.xml

@@ -0,0 +1,11 @@
+<?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.usky.transfer.mapper.QueryInfluxdbDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.transfer.domain.QueryInfluxdbData">
+        <result column="id" property="id" />
+        <result column="influxdb_name" property="influxdbName" />
+    </resultMap>
+
+</mapper>

+ 89 - 0
data-transfer/data-transfer-biz/src/main/resources/mapper/transfer/SysUserMapper.xml

@@ -0,0 +1,89 @@
+<?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.usky.transfer.mapper.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.transfer.domain.SysUser">
+        <id column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+        <result column="user_name" property="userName" />
+        <result column="nick_name" property="nickName" />
+        <result column="user_type" property="userType" />
+        <result column="email" property="email" />
+        <result column="phonenumber" property="phonenumber" />
+        <result column="sex" property="sex" />
+        <result column="avatar" property="avatar" />
+        <result column="password" property="password" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_date" property="loginDate" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+    </resultMap>
+    <insert id="DeviceRealDataToDB" parameterType="java.util.List">
+    insert into data_real_time(
+    device_id,
+    product_code,
+    device_type,
+    attribute_name,
+    attribute_data,
+    data_time,
+    insert_time)
+    values
+    <foreach collection="list" item="item" separator=",">
+        (#{item.deviceId},
+        #{item.productCode},
+        #{item.deviceType},
+        #{item.attributeName},
+        #{item.attributeData},
+        #{item.dataTime},
+        #{item.insertTime})
+    </foreach>
+        ON DUPLICATE KEY UPDATE  attribute_data = values(attribute_data),data_time = values(data_time),insert_time = values(insert_time);
+    </insert>
+    <insert id="DeviceDataToDB" parameterType="java.util.List">
+        insert into sp_d${deviceId}(
+            device_id,
+            product_code,
+            device_type,
+            attribute_name,
+            attribute_data,
+            data_time,
+            insert_time)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.deviceId},
+            #{item.productCode},
+            #{item.deviceType},
+            #{item.attributeName},
+            #{item.attributeData},
+            #{item.dataTime},
+            #{item.insertTime})
+        </foreach>
+        ON DUPLICATE KEY UPDATE  attribute_data = values(attribute_data),insert_time = values(insert_time);
+    </insert>
+    <!-- 判断表是否存在 -->
+    <select id="existTable" parameterType="string" resultType="java.lang.Integer">
+        SELECT COUNT(*) as count FROM information_schema.TABLES WHERE table_name = #{tableName}
+    </select>
+    <!-- 创建对应设备历史数据表 -->
+    <update id="createTable" parameterType="string">
+        CREATE TABLE IF NOT EXISTS ${tableName} (
+        `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+        `device_id` VARCHAR(50) DEFAULT NULL COMMENT '设备ID',
+        `product_code` VARCHAR(50) DEFAULT NULL COMMENT '产品编码',
+        `device_type` INT(5) DEFAULT NULL COMMENT '设备类型',
+        `attribute_name` VARCHAR(50) DEFAULT NULL COMMENT '属性名称',
+        `attribute_data` VARCHAR(20) DEFAULT NULL COMMENT '属性值',
+        `data_time` DATETIME DEFAULT NULL COMMENT '数据时间',
+        `insert_time` DATETIME DEFAULT NULL COMMENT '插入时间',
+        PRIMARY KEY (`id`) USING BTREE,
+        UNIQUE KEY `uid_dad` (`device_id`,`attribute_name`,`data_time`)
+        ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
+    </update>
+
+</mapper>

+ 15 - 0
data-transfer/data-transfer-biz/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:8082/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.demo.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "安防项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"36bde2426ad546a5a50311bb747e7e61",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}

+ 17 - 0
data-transfer/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-data</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-transfer</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>data-transfer-biz</module>
+        <module>data-transfer-api</module>
+  </modules>
+
+</project>

+ 6 - 6
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/RemoteTsdbProxyService.java

@@ -12,12 +12,12 @@ import java.util.List;
 @FeignClient(contextId = "remoteTsdbProxyService", value = "data-tsdb-proxy", fallbackFactory = RemoteTsdbProxyFallbackFactory.class)
 public interface RemoteTsdbProxyService {
 
-    /**
-     * 单个设备数据写入
-     * @return
-     */
-    @PostMapping("/sendDeviceData")
-    ApiResult<Void> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO);
+//    /**
+//     * 单个设备数据写入
+//     * @return
+//     */
+//    @PostMapping("/sendDeviceData")
+//    ApiResult<Void> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO);
 
     /**
      * 单个设备实时数据查询

+ 4 - 4
data-tsdb-proxy/data-tsdb-proxy-api/src/main/java/com/usky/demo/factory/RemoteTsdbProxyFallbackFactory.java

@@ -30,10 +30,10 @@ public class RemoteTsdbProxyFallbackFactory implements FallbackFactory<RemoteTsd
     {
         log.error("用户服务调用失败:{}", throwable.getMessage());
         return new RemoteTsdbProxyService() {
-            @Override
-            public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO) {
-                throw new BusinessException(throwable.getMessage());
-            }
+//            @Override
+//            public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
 
             @Override
             public ApiResult<LastResultVO> queryLastDeviceData(String productCode,String deviceId)

+ 0 - 1
data-tsdb-proxy/data-tsdb-proxy-biz/pom.xml

@@ -51,7 +51,6 @@
             <groupId>com.usky</groupId>
             <artifactId>data-tsdb-proxy-api</artifactId>
             <version>0.0.1</version>
-            <scope>compile</scope>
         </dependency>
 
     </dependencies>

+ 4 - 4
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/MybatisGenerator.java

@@ -42,10 +42,10 @@ public class MybatisGenerator {
         //2、数据源配置
         //修改数据源
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-data?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.jdbc.Driver");
-        dsc.setUsername("usky");
-        dsc.setPassword("Yt#75Usky");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
         mpg.setDataSource(dsc);
 
         // 3、包配置
@@ -70,7 +70,7 @@ public class MybatisGenerator {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("query_influxdb_data");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("dmp_device","dmp_product");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 9 - 9
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/api/DataTsdbProxyControllerApi.java

@@ -29,15 +29,15 @@ public class DataTsdbProxyControllerApi implements RemoteTsdbProxyService {
     @Autowired
     private QueryInfluxdbDataService queryInfluxdbDataService;
 
-    /**
-     * 单个设备数据写入
-     * @return
-     */
-    @Override
-    public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO){
-        queryInfluxdbDataService.sendDeviceData(writeVO);
-        return ApiResult.success();
-    }
+//    /**
+//     * 单个设备数据写入
+//     * @return
+//     */
+//    @Override
+//    public ApiResult<Void> sendDeviceData(DeviceDataWriteVO writeVO){
+//        queryInfluxdbDataService.sendDeviceData(writeVO);
+//        return ApiResult.success();
+//    }
 
     /**
      * 单个设备实时数据查询

+ 21 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/DmpDeviceController.java

@@ -0,0 +1,21 @@
+package com.usky.demo.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 设备信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Controller
+@RequestMapping("/dmpDevice")
+public class DmpDeviceController {
+
+}
+

+ 21 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/DmpProductController.java

@@ -0,0 +1,21 @@
+package com.usky.demo.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 产品信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Controller
+@RequestMapping("/dmpProduct")
+public class DmpProductController {
+
+}
+

+ 52 - 4
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/QueryInfluxdbDataController.java

@@ -29,7 +29,7 @@ public class QueryInfluxdbDataController {
     private QueryInfluxdbDataService queryInfluxdbDataService;
 
     /**
-     * 单个设备实时数据查询
+     * 单个设备实时数据查询(内部)
      * @param productCode
      * @param deviceId
      * @return
@@ -41,7 +41,7 @@ public class QueryInfluxdbDataController {
     }
 
     /**
-     * 批量设备实时数据查询
+     * 批量设备实时数据查询(内部)
      * @param requestVO
      * @return
      */
@@ -51,7 +51,7 @@ public class QueryInfluxdbDataController {
     }
 
     /**
-     * 单个设备历史数据查询
+     * 单个设备历史数据查询(内部)
      * @param productCode
      * @param deviceId
      * @param startTime
@@ -67,7 +67,7 @@ public class QueryInfluxdbDataController {
     }
 
     /**
-     * 批量设备历史数据查询
+     * 批量设备历史数据查询(内部)
      * @param requestVO
      * @return
      */
@@ -76,5 +76,53 @@ public class QueryInfluxdbDataController {
         return ApiResult.success(queryInfluxdbDataService.queryHistoryDeviceData(requestVO));
     }
 
+    /**
+     * 单个设备实时数据查询(对外)
+     * @param productCode
+     * @param deviceId
+     * @return
+     */
+    @GetMapping("/lastOuter")
+    public ApiResult<LastResultVO> queryOuterLastDeviceData(@RequestParam(value = "productCode") String productCode,
+                                                       @RequestParam(value = "deviceId") String deviceId){
+        return ApiResult.success(queryInfluxdbDataService.queryOuterLastDeviceData(productCode,deviceId));
+    }
+
+    /**
+     * 批量设备实时数据查询(对外)
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("/lastOuter")
+    public ApiResult<List<LastResultVO>> queryOuterLastDeviceData(@RequestBody LastRequestVO requestVO){
+        return ApiResult.success(queryInfluxdbDataService.queryOuterLastDeviceData(requestVO));
+    }
+
+    /**
+     * 单个设备历史数据查询(对外)
+     * @param productCode
+     * @param deviceId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @GetMapping("/historyOuter")
+    public ApiResult<HistoryResultVO> queryOuterHistoryDeviceData(@RequestParam(value = "productCode") String productCode,
+                                                             @RequestParam(value = "deviceId") String deviceId,
+                                                             @RequestParam(value = "startTime") String startTime,
+                                                             @RequestParam(value = "endTime") String endTime){
+        return ApiResult.success(queryInfluxdbDataService.queryOuterHistoryDeviceData(productCode,deviceId,startTime,endTime));
+    }
+
+    /**
+     * 批量设备历史数据查询(对外)
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("/historyOuter")
+    public ApiResult<List<HistoryResultVO>> queryOuterHistoryDeviceData(@RequestBody HistoryRequestVO requestVO){
+        return ApiResult.success(queryInfluxdbDataService.queryOuterHistoryDeviceData(requestVO));
+    }
+
 }
 

+ 11 - 11
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/controller/web/SendMessageController.java

@@ -16,16 +16,16 @@ import java.util.Map;
 @RestController
 @RequestMapping("/dataWrite")
 public class SendMessageController {
-    @Autowired
-    private QueryInfluxdbDataService queryInfluxdbDataService;
-
-    /**
-     * 单个设备数据写入
-     * @return
-     */
-    @PostMapping("/sendDeviceData")
-    public ApiResult<Map<String,Object>> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO){
-        return ApiResult.success(queryInfluxdbDataService.sendDeviceData(writeVO));
-    }
+//    @Autowired
+//    private QueryInfluxdbDataService queryInfluxdbDataService;
+//
+//    /**
+//     * 单个设备数据写入
+//     * @return
+//     */
+//    @PostMapping("/sendDeviceData")
+//    public ApiResult<Map<String,Object>> sendDeviceData(@RequestBody DeviceDataWriteVO writeVO){
+//        return ApiResult.success(queryInfluxdbDataService.sendDeviceData(writeVO));
+//    }
 
 }

+ 131 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/domain/DmpDevice.java

@@ -0,0 +1,131 @@
+package com.usky.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 设备信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 设备类型(501、监控系统  502、门禁系统  503、梯控系统  504、机房系统  509、环境系统  510、照明系统)
+     */
+    private Integer deviceType;
+
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 物联网卡号
+     */
+    private String simCode;
+
+    /**
+     * 国际移动用户识别码
+     */
+    private String imsiCode;
+
+    /**
+     * 自动订阅标识(0:否,1:是)
+     */
+    private Integer subscribeFlag;
+
+    /**
+     * 节点类型
+     */
+    private Integer nodeType;
+
+    /**
+     * 分组id
+     */
+    private Integer groupId;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 单位编号
+     */
+    private String companyCode;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+
+
+}

+ 141 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/domain/DmpProduct.java

@@ -0,0 +1,141 @@
+package com.usky.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 产品信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpProduct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 接入方式(1、设备直连  2、网关接入)
+     */
+    private Integer accessMode;
+
+    /**
+     * 网络类型(1、WIFI  2、移动蜂窝数据 3、NB-IoT 4、以太网)
+     */
+    private Integer networkType;
+
+    /**
+     * 设备类型(501、监控系统  502、门禁系统  503、梯控系统  504、机房系统  509、环境系统  510、照明系统)
+     */
+    private Integer deviceType;
+
+    /**
+     * 通信协议(1、MQTT  2、TCP设备直连 3、HTTP)
+     */
+    private Integer comProtocol;
+
+    /**
+     * 认证方式
+     */
+    private String authMode;
+
+    /**
+     * 设备型号
+     */
+    private String deviceModel;
+
+    /**
+     * 产品描述
+     */
+    private String productDescribe;
+
+    /**
+     * 厂家名称
+     */
+    private String factoryName;
+
+    /**
+     * 厂家联系人
+     */
+    private String factoryPerson;
+
+    /**
+     * 厂家联系电话
+     */
+    private String factoryPhone;
+
+    /**
+     * 资质证书1
+     */
+    private String certificateUrl1;
+
+    /**
+     * 资质证书2
+     */
+    private String certificateUrl2;
+
+    /**
+     * 资质证书3
+     */
+    private String certificateUrl3;
+
+    /**
+     * 协议文档
+     */
+    private String agreementUrl;
+
+    /**
+     * 删除标识
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+
+}

+ 16 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/mapper/DmpDeviceMapper.java

@@ -0,0 +1,16 @@
+package com.usky.demo.mapper;
+
+import com.usky.demo.domain.DmpDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 设备信息表 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceMapper extends CrudMapper<DmpDevice> {
+
+}

+ 16 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/mapper/DmpProductMapper.java

@@ -0,0 +1,16 @@
+package com.usky.demo.mapper;
+
+import com.usky.demo.domain.DmpProduct;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 产品信息表 Mapper 接口
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpProductMapper extends CrudMapper<DmpProduct> {
+
+}

+ 16 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/DmpDeviceService.java

@@ -0,0 +1,16 @@
+package com.usky.demo.service;
+
+import com.usky.demo.domain.DmpDevice;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 设备信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpDeviceService extends CrudService<DmpDevice> {
+
+}

+ 16 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/DmpProductService.java

@@ -0,0 +1,16 @@
+package com.usky.demo.service;
+
+import com.usky.demo.domain.DmpProduct;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 产品信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+public interface DmpProductService extends CrudService<DmpProduct> {
+
+}

+ 9 - 1
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/QueryInfluxdbDataService.java

@@ -24,6 +24,14 @@ public interface QueryInfluxdbDataService extends CrudService<QueryInfluxdbData>
 
     List<HistoryResultVO> queryHistoryDeviceData(HistoryRequestVO requestVO);
 
-    Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO);
+    LastResultVO queryOuterLastDeviceData(String productCode, String deviceId);
+
+    List<LastResultVO> queryOuterLastDeviceData(LastRequestVO requestVO);
+
+    HistoryResultVO queryOuterHistoryDeviceData(String productCode, String deviceId, String startTime, String endTime);
+
+    List<HistoryResultVO> queryOuterHistoryDeviceData(HistoryRequestVO requestVO);
+
+//    Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO);
 
 }

+ 20 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/DmpDeviceServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.demo.service.impl;
+
+import com.usky.demo.domain.DmpDevice;
+import com.usky.demo.mapper.DmpDeviceMapper;
+import com.usky.demo.service.DmpDeviceService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 设备信息表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Service
+public class DmpDeviceServiceImpl extends AbstractCrudService<DmpDeviceMapper, DmpDevice> implements DmpDeviceService {
+
+}

+ 20 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/DmpProductServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.demo.service.impl;
+
+import com.usky.demo.domain.DmpProduct;
+import com.usky.demo.mapper.DmpProductMapper;
+import com.usky.demo.service.DmpProductService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 产品信息表 服务实现类
+ * </p>
+ *
+ * @author ya
+ * @since 2024-09-19
+ */
+@Service
+public class DmpProductServiceImpl extends AbstractCrudService<DmpProductMapper, DmpProduct> implements DmpProductService {
+
+}

+ 201 - 27
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/impl/QueryInfluxdbDataServiceImpl.java

@@ -1,15 +1,23 @@
 package com.usky.demo.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.demo.domain.*;
 import com.usky.demo.mapper.QueryInfluxdbDataMapper;
+import com.usky.demo.service.DmpDeviceService;
+import com.usky.demo.service.DmpProductService;
 import com.usky.demo.service.QueryInfluxdbDataService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.demo.service.rocketmq.MyProducer;
 import com.usky.demo.service.utils.TsdbUtils;
+import com.usky.demo.service.vo.DeviceMapVO;
+import com.usky.demo.service.vo.ProductMapVO;
 import org.influxdb.dto.QueryResult;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -30,41 +38,93 @@ import java.util.Map;
 public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInfluxdbDataMapper, QueryInfluxdbData> implements QueryInfluxdbDataService {
     @Autowired
     private TsdbUtils tsdbUtils;
+    @Autowired
+    private DmpProductService dmpProductService;
+    @Autowired
+    private DmpDeviceService dmpDeviceService;
 
     @Resource
     private MyProducer myProducer;
 
-    @Override
-    public Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO){
-        Map<String,Object> rec_map = new HashMap<>();
-        DeviceDataInfoVO dataInfo = new DeviceDataInfoVO();
-        Map<String,Object> metrics = writeVO.getMetrics();
-        Map<String,String> tags = writeVO.getTags();
-        if(metrics.size() > 0){
-            Map<String,Object> mp = new HashMap<>();
-            for(Map.Entry<String,Object> map:metrics.entrySet()){
-                mp.put(map.getKey(),map.getValue());
-            }
-            dataInfo.setMetrics(mp);
-            if(tags != null && tags.size() > 0){
-                mp.clear();
-                for(Map.Entry<String,String> map:tags.entrySet()){
-                    mp.put(map.getKey(),map.getValue());
-                }
-                dataInfo.setTags(mp);
-            }else{
-                dataInfo.setTags(new HashMap<>());
+//    @Override
+//    public Map<String,Object> sendDeviceData(DeviceDataWriteVO writeVO){
+//        Map<String,Object> rec_map = new HashMap<>();
+//        DeviceDataInfoVO dataInfo = new DeviceDataInfoVO();
+//        Map<String,Object> metrics = writeVO.getMetrics();
+//        Map<String,String> tags = writeVO.getTags();
+//        if(metrics.size() > 0){
+//            Map<String,Object> mp = new HashMap<>();
+//            for(Map.Entry<String,Object> map:metrics.entrySet()){
+//                mp.put(map.getKey(),map.getValue());
+//            }
+//            dataInfo.setMetrics(mp);
+//            if(tags != null && tags.size() > 0){
+//                mp.clear();
+//                for(Map.Entry<String,String> map:tags.entrySet()){
+//                    mp.put(map.getKey(),map.getValue());
+//                }
+//                dataInfo.setTags(mp);
+//            }else{
+//                dataInfo.setTags(new HashMap<>());
+//            }
+//            dataInfo.setProduct_code(writeVO.getProductCode());
+//            dataInfo.setDevice_id(writeVO.getDeviceId());
+//            dataInfo.setTimestamp(writeVO.getTimestamp());
+//
+//            myProducer.sendMessage("data-collector", JSONArray.toJSON(dataInfo).toString());
+//        }
+//
+//        rec_map.put("code",200);
+//        rec_map.put("message","操作成功!");
+//        return rec_map;
+//    }
+
+    @Cacheable(cacheNames = "productList",sync = true)
+    public Map<String, ProductMapVO> getProductMap(){
+        Map<String,ProductMapVO> productMap = new HashMap<>();
+        LambdaQueryWrapper<DmpProduct> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(DmpProduct::getDeleteFlag,0)
+                .orderByDesc(DmpProduct::getId);
+        List<DmpProduct> list = dmpProductService.list(queryWrapper);
+        if(CollectionUtils.isNotEmpty(list)){
+            for (int i = 0; i < list.size(); i++) {
+                String productCode = list.get(i).getProductCode();
+                ProductMapVO mapVO = new ProductMapVO();
+                mapVO.setProductId(list.get(i).getId());
+                mapVO.setProductCode(list.get(i).getProductCode());
+                mapVO.setCreatedBy(list.get(i).getCreatedBy());
+                mapVO.setTenantId(list.get(i).getTenantId());
+                mapVO.setDeviceType(list.get(i).getDeviceType());
+
+                productMap.put(productCode,mapVO);
             }
-            dataInfo.setProduct_code(writeVO.getProductCode());
-            dataInfo.setDevice_id(writeVO.getDeviceId());
-            dataInfo.setTimestamp(writeVO.getTimestamp());
+        }
 
-            myProducer.sendMessage("data-collector", JSONArray.toJSON(dataInfo).toString());
+
+        return productMap;
+    }
+
+    @Cacheable(cacheNames = "deviceList",sync = true)
+    public Map<String, DeviceMapVO> getDeviceMap(){
+        Map<String,DeviceMapVO> deviceMap = new HashMap<>();
+        LambdaQueryWrapper<DmpDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(DmpDevice::getDeleteFlag,0)
+                .orderByDesc(DmpDevice::getId);
+        List<DmpDevice> list = dmpDeviceService.list(queryWrapper);
+        if(CollectionUtils.isNotEmpty(list)){
+            for (int i = 0; i < list.size(); i++) {
+                String deviceId = list.get(i).getDeviceId();
+                DeviceMapVO mapVO = new DeviceMapVO();
+                mapVO.setProductCode(list.get(i).getProductCode());
+                mapVO.setDeviceId(list.get(i).getDeviceId());
+                mapVO.setDeviceUuid(list.get(i).getDeviceUuid());
+                mapVO.setDeviceStatus(list.get(i).getServiceStatus());
+
+                deviceMap.put(deviceId,mapVO);
+            }
         }
 
-        rec_map.put("code",200);
-        rec_map.put("message","操作成功!");
-        return rec_map;
+        return deviceMap;
     }
 
     @Override
@@ -180,4 +240,118 @@ public class QueryInfluxdbDataServiceImpl extends AbstractCrudService<QueryInflu
         return list;
     }
 
+
+    @Override
+    public LastResultVO queryOuterLastDeviceData(String productCode, String deviceId){
+
+        String tableName = productCode + "_" + deviceId;
+        String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')";
+        List<Map<String, Object>> metrics = tsdbUtils.fetchRecords(query);
+        LastResultVO resultVO = new LastResultVO(deviceId,metrics);
+
+        return resultVO;
+    }
+
+    @Override
+    public List<LastResultVO> queryOuterLastDeviceData(LastRequestVO requestVO){
+        List<LastResultVO> result = new ArrayList<>();
+        String productCode = requestVO.getProductCode();
+        List<String> deviceIds = requestVO.getDeviceId();
+        if(CollectionUtils.isNotEmpty(deviceIds)){
+            for (int i = 0; i < deviceIds.size(); i++) {
+                String tableName = productCode + "_" + deviceIds.get(i);
+                String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')";
+                List<Map<String, Object>> metrics = tsdbUtils.fetchRecords(query);
+                LastResultVO resultVO = new LastResultVO(deviceIds.get(i),metrics);
+                result.add(resultVO);
+            }
+        }
+
+        return result;
+
+    }
+
+    @Override
+    public HistoryResultVO queryOuterHistoryDeviceData(String productCode,String deviceId,String startTime,String endTime){
+        List<MetricVO> metricList = new ArrayList<>();
+        String tableName = productCode + "_" + deviceId;
+        String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')";
+        QueryResult queryResult = tsdbUtils.query(query);
+        if(queryResult.getResults().get(0).getSeries() != null){
+            List<String> fields = queryResult.getResults().get(0).getSeries().get(0).getColumns();
+            if(CollectionUtils.isNotEmpty(fields)){
+                String fieldQuery = "SELECT *::field FROM \""+tableName+"\" where time >= '"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')";
+                List<Map<String,Object>> metircs = tsdbUtils.fetchRecords(fieldQuery);
+
+                if(CollectionUtils.isNotEmpty(metircs)){
+                    for (int j = 0; j < fields.size(); j++) {
+                        List<Map<String,Object>> metircItems = new ArrayList<>();
+                        if(!"time".equals(fields.get(j))){
+                            for (int k = 0; k < metircs.size(); k++) {
+                                String field = fields.get(j);
+                                Map<String,Object> map = new HashMap<>();
+                                map.put("timestamp",metircs.get(k).get("time"));
+                                map.put("value",metircs.get(k).get(field));
+                                metircItems.add(map);
+                            }
+                            MetricVO metricVO = new MetricVO(fields.get(j),metircItems);
+                            metricList.add(metricVO);
+                        }
+
+                    }
+                }
+
+            }
+        }
+
+        HistoryResultVO resultVO = new HistoryResultVO(deviceId,metricList);
+        return resultVO;
+    }
+
+    @Override
+    public List<HistoryResultVO> queryOuterHistoryDeviceData(HistoryRequestVO requestVO){
+        List<HistoryResultVO> list = new ArrayList<>();
+        String productCode = requestVO.getProductCode();
+        List<String> deviceIds = requestVO.getDeviceId();
+        String startTime = requestVO.getStartTime();
+        String endTime = requestVO.getEndTime();
+        for (int i = 0; i < deviceIds.size(); i++) {
+            List<MetricVO> metricList = new ArrayList<>();
+            String tableName = productCode + "_" + deviceIds.get(i);
+            String query = "SELECT *::field FROM \""+tableName+"\" order by desc limit 1 tz('Asia/Shanghai')";
+            QueryResult queryResult = tsdbUtils.query(query);
+            if(queryResult.getResults().get(0).getSeries() != null){
+                List<String> fields = queryResult.getResults().get(0).getSeries().get(0).getColumns();
+                if(CollectionUtils.isNotEmpty(fields)){
+                    String fieldQuery = "SELECT *::field FROM \""+tableName+"\" where time >= '"+startTime+"' and time <= '"+endTime+"' tz('Asia/Shanghai')";
+                    List<Map<String,Object>> metircs = tsdbUtils.fetchRecords(fieldQuery);
+
+                    if(CollectionUtils.isNotEmpty(metircs)){
+                        for (int j = 0; j < fields.size(); j++) {
+                            List<Map<String,Object>> metircItems = new ArrayList<>();
+                            if(!"time".equals(fields.get(j))){
+                                for (int k = 0; k < metircs.size(); k++) {
+                                    String field = fields.get(j);
+                                    Map<String,Object> map = new HashMap<>();
+                                    map.put("timestamp",metircs.get(k).get("time"));
+                                    map.put("value",metircs.get(k).get(field));
+                                    metircItems.add(map);
+                                }
+                                MetricVO metricVO = new MetricVO(fields.get(j),metircItems);
+                                metricList.add(metricVO);
+                            }
+
+                        }
+                    }
+
+                }
+            }
+
+            HistoryResultVO resultVO = new HistoryResultVO(deviceIds.get(i),metricList);
+            list.add(resultVO);
+        }
+
+        return list;
+    }
+
 }

+ 32 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/vo/DeviceMapVO.java

@@ -0,0 +1,32 @@
+package com.usky.demo.service.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class DeviceMapVO implements Serializable {
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备uuid;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceUuid;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 设备状态;1:在线,2:离线
+     */
+    @TableField(exist = false)
+    private Integer deviceStatus;
+
+}

+ 34 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/java/com/usky/demo/service/vo/ProductMapVO.java

@@ -0,0 +1,34 @@
+package com.usky.demo.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ProductMapVO implements Serializable {
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 设备类型
+     */
+    private Integer deviceType;
+
+}

+ 30 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/resources/mapper/demo/DmpDeviceMapper.xml

@@ -0,0 +1,30 @@
+<?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.usky.demo.mapper.DmpDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.demo.domain.DmpDevice">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="device_type" property="deviceType" />
+        <result column="product_id" property="productId" />
+        <result column="sim_code" property="simCode" />
+        <result column="imsi_code" property="imsiCode" />
+        <result column="subscribe_flag" property="subscribeFlag" />
+        <result column="node_type" property="nodeType" />
+        <result column="group_id" property="groupId" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_by" property="createdBy" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="company_code" property="companyCode" />
+        <result column="install_address" property="installAddress" />
+        <result column="service_status" property="serviceStatus" />
+        <result column="product_code" property="productCode" />
+        <result column="device_uuid" property="deviceUuid" />
+    </resultMap>
+
+</mapper>

+ 32 - 0
data-tsdb-proxy/data-tsdb-proxy-biz/src/main/resources/mapper/demo/DmpProductMapper.xml

@@ -0,0 +1,32 @@
+<?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.usky.demo.mapper.DmpProductMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.demo.domain.DmpProduct">
+        <id column="id" property="id" />
+        <result column="product_name" property="productName" />
+        <result column="access_mode" property="accessMode" />
+        <result column="network_type" property="networkType" />
+        <result column="device_type" property="deviceType" />
+        <result column="com_protocol" property="comProtocol" />
+        <result column="auth_mode" property="authMode" />
+        <result column="device_model" property="deviceModel" />
+        <result column="product_describe" property="productDescribe" />
+        <result column="factory_name" property="factoryName" />
+        <result column="factory_person" property="factoryPerson" />
+        <result column="factory_phone" property="factoryPhone" />
+        <result column="certificate_url1" property="certificateUrl1" />
+        <result column="certificate_url2" property="certificateUrl2" />
+        <result column="certificate_url3" property="certificateUrl3" />
+        <result column="agreement_url" property="agreementUrl" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_by" property="createdBy" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="product_code" property="productCode" />
+    </resultMap>
+
+</mapper>