From 59b881833049af0619dbe6cd34a490bf8830c770 Mon Sep 17 00:00:00 2001 From: swordmeng Date: Fri, 14 Feb 2025 09:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4=E9=A1=B9=E7=9B=AE=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data-framework/pom.xml | 33 ++- .../com/huaxing/common/constant/AppConstant.java | 23 --- .../com/huaxing/common/constant/MqttConstant.java | 17 -- .../huaxing/common/exception/BaseException.java | 50 ----- .../com/huaxing/common/exception/BizException.java | 23 --- .../java/com/huaxing/common/result/ResultVo.java | 60 ------ .../java/com/huaxing/common/util/JacksonUtil.java | 75 ------- .../java/com/huaxing/common/util/StrUtils.java | 26 --- .../dolphindb/abstracts/SqlConverterStatement.java | 25 --- .../com/huaxing/dolphindb/base/CommonService.java | 95 --------- .../base/SqlConverterStatementHandle.java | 71 ------- .../dolphindb/config/DolphinDbConfiguration.java | 69 ------- .../config/DolphinDbPoolConfiguration.java | 32 --- .../dolphindb/connection/AbstractDbConnector.java | 26 --- .../dolphindb/connection/DbConnectorHelper.java | 42 ---- .../huaxing/iot/common/constant/AppConstant.java | 23 +++ .../huaxing/iot/common/constant/MqttConstant.java | 17 ++ .../iot/common/exception/BaseException.java | 50 +++++ .../huaxing/iot/common/exception/BizException.java | 23 +++ .../com/huaxing/iot/common/result/ResultVo.java | 60 ++++++ .../com/huaxing/iot/common/util/JacksonUtil.java | 75 +++++++ .../java/com/huaxing/iot/common/util/StrUtils.java | 26 +++ .../huaxing/iot/mqtt/config/MqttConfiguration.java | 143 +++++++++++++ .../iot/mqtt/config/MqttConsumerConfiguration.java | 96 +++++++++ .../iot/mqtt/config/MqttProducerConfiguration.java | 65 ++++++ .../huaxing/iot/mqtt/processor/MqttGateway.java | 46 +++++ .../iot/mqtt/processor/MqttMessageReceiver.java | 14 ++ .../iot/mqtt/processor/MqttMessageSender.java | 52 +++++ .../com/huaxing/mqtt/config/MqttConfiguration.java | 143 ------------- .../mqtt/config/MqttConsumerConfiguration.java | 96 --------- .../mqtt/config/MqttProducerConfiguration.java | 65 ------ .../com/huaxing/mqtt/processor/MqttGateway.java | 46 ----- .../mqtt/processor/MqttMessageReceiver.java | 14 -- .../huaxing/mqtt/processor/MqttMessageSender.java | 52 ----- data-storage-api/pom.xml | 24 ++- .../com/huaxing/feign/IDatabaseClientFeign.java | 126 ------------ .../fallback/DatabaseFeignFallbackFactory.java | 97 --------- .../huaxing/iot/feign/IDatabaseClientFeign.java | 126 ++++++++++++ .../fallback/DatabaseFeignFallbackFactory.java | 97 +++++++++ .../com/huaxing/iot/pojo/dto/DataQueryDTO.java | 26 +++ .../java/com/huaxing/iot/pojo/dto/DatabaseDTO.java | 24 +++ .../com/huaxing/iot/pojo/dto/TableColumnDTO.java | 41 ++++ .../java/com/huaxing/iot/pojo/dto/TableDTO.java | 99 +++++++++ .../java/com/huaxing/pojo/dto/DataQueryDTO.java | 26 --- .../java/com/huaxing/pojo/dto/DatabaseDTO.java | 24 --- .../java/com/huaxing/pojo/dto/TableColumnDTO.java | 41 ---- .../main/java/com/huaxing/pojo/dto/TableDTO.java | 99 --------- data-storage/pom.xml | 120 +++++++++-- .../java/com/huaxing/IotDataBridgeApplication.java | 23 --- .../main/java/com/huaxing/TestDBConnection.java | 25 --- .../data/api/controller/DataQueryController.java | 31 --- .../database/controller/DatabaseController.java | 118 ----------- .../data/database/service/IDatabaseService.java | 18 -- .../database/service/ITableStructureService.java | 47 ----- .../database/service/impl/DatabaseServiceImpl.java | 59 ------ .../service/impl/TableStructureService.java | 151 -------------- .../database/template/ISqlTemplateService.java | 44 ---- .../database/template/SqlTemplateServiceImpl.java | 199 ------------------ .../data/storage/domain/DataAnalysisDTO.java | 34 ---- .../storage/mapper/IDeviceDataQueryDfsMapper.java | 21 -- .../mapper/IDeviceDataQueryStreamMapper.java | 21 -- .../storage/mapper/IDeviceDataStoredMapper.java | 20 -- .../data/storage/service/IDataAnalysisService.java | 13 -- .../service/IDeviceDataQueryDfsService.java | 18 -- .../service/IDeviceDataQueryStreamService.java | 18 -- .../storage/service/IDeviceDataStoredService.java | 19 -- .../storage/service/impl/DataAnalysisService.java | 43 ---- .../impl/DeviceDataQueryDfsServiceImpl.java | 39 ---- .../impl/DeviceDataQueryStreamServiceImpl.java | 39 ---- .../service/impl/DeviceDataStoredServiceImpl.java | 49 ----- .../com/huaxing/iot/IotDataBridgeApplication.java | 25 +++ .../java/com/huaxing/iot/TestDBConnection.java | 25 +++ .../data/api/controller/DataQueryController.java | 31 +++ .../database/controller/DatabaseController.java | 118 +++++++++++ .../data/database/service/IDatabaseService.java | 18 ++ .../database/service/ITableStructureService.java | 47 +++++ .../database/service/impl/DatabaseServiceImpl.java | 58 ++++++ .../service/impl/TableStructureService.java | 151 ++++++++++++++ .../database/template/ISqlTemplateService.java | 44 ++++ .../database/template/SqlTemplateServiceImpl.java | 199 ++++++++++++++++++ .../iot/data/storage/domain/DataAnalysisDTO.java | 34 ++++ .../storage/mapper/IDeviceDataQueryDfsMapper.java | 21 ++ .../mapper/IDeviceDataQueryStreamMapper.java | 21 ++ .../storage/mapper/IDeviceDataStoredMapper.java | 20 ++ .../data/storage/service/IDataAnalysisService.java | 13 ++ .../service/IDeviceDataQueryDfsService.java | 18 ++ .../service/IDeviceDataQueryStreamService.java | 18 ++ .../storage/service/IDeviceDataStoredService.java | 19 ++ .../storage/service/impl/DataAnalysisService.java | 43 ++++ .../impl/DeviceDataQueryDfsServiceImpl.java | 39 ++++ .../impl/DeviceDataQueryStreamServiceImpl.java | 39 ++++ .../service/impl/DeviceDataStoredServiceImpl.java | 49 +++++ .../dolphindb/abstracts/SqlConverterStatement.java | 25 +++ .../huaxing/iot/dolphindb/base/CommonService.java | 94 +++++++++ .../base/SqlConverterStatementHandle.java | 71 +++++++ .../dolphindb/config/DolphinDbConfiguration.java | 69 +++++++ .../config/DolphinDbPoolConfiguration.java | 32 +++ .../dolphindb/connection/AbstractDbConnector.java | 26 +++ .../dolphindb/connection/DbConnectorHelper.java | 42 ++++ .../com/huaxing/iot/mqtt/MqttMessageConsumer.java | 70 +++++++ .../java/com/huaxing/iot/test/TestController.java | 225 +++++++++++++++++++++ .../java/com/huaxing/mqtt/MqttMessageConsumer.java | 70 ------- .../main/java/com/huaxing/test/TestController.java | 225 --------------------- .../src/main/resources/application-dev.yaml | 3 +- .../src/main/resources/application-uat.yaml | 46 +++++ data-storage/src/main/resources/application.yaml | 6 +- .../resources/mapper/DeviceDataStoredStream.xml | 2 +- pom.xml | 107 +++++----- 108 files changed, 3071 insertions(+), 2884 deletions(-) delete mode 100644 data-framework/src/main/java/com/huaxing/common/constant/AppConstant.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/constant/MqttConstant.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/exception/BaseException.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/exception/BizException.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/result/ResultVo.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/util/JacksonUtil.java delete mode 100644 data-framework/src/main/java/com/huaxing/common/util/StrUtils.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/abstracts/SqlConverterStatement.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/base/CommonService.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/base/SqlConverterStatementHandle.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbConfiguration.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbPoolConfiguration.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/connection/AbstractDbConnector.java delete mode 100644 data-framework/src/main/java/com/huaxing/dolphindb/connection/DbConnectorHelper.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/constant/AppConstant.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/constant/MqttConstant.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/exception/BaseException.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/exception/BizException.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/result/ResultVo.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/util/JacksonUtil.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/common/util/StrUtils.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConfiguration.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConsumerConfiguration.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttProducerConfiguration.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttGateway.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageReceiver.java create mode 100644 data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageSender.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/config/MqttConfiguration.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/config/MqttConsumerConfiguration.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/config/MqttProducerConfiguration.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/processor/MqttGateway.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageReceiver.java delete mode 100644 data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageSender.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/feign/IDatabaseClientFeign.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/feign/fallback/DatabaseFeignFallbackFactory.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/feign/IDatabaseClientFeign.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/feign/fallback/DatabaseFeignFallbackFactory.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DataQueryDTO.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DatabaseDTO.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableColumnDTO.java create mode 100644 data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableDTO.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/pojo/dto/DataQueryDTO.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/pojo/dto/DatabaseDTO.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/pojo/dto/TableColumnDTO.java delete mode 100644 data-storage-api/src/main/java/com/huaxing/pojo/dto/TableDTO.java delete mode 100644 data-storage/src/main/java/com/huaxing/IotDataBridgeApplication.java delete mode 100644 data-storage/src/main/java/com/huaxing/TestDBConnection.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/api/controller/DataQueryController.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/controller/DatabaseController.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/service/IDatabaseService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/service/ITableStructureService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/service/impl/DatabaseServiceImpl.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/service/impl/TableStructureService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/template/ISqlTemplateService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/database/template/SqlTemplateServiceImpl.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/domain/DataAnalysisDTO.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryDfsMapper.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryStreamMapper.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataStoredMapper.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/IDataAnalysisService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryDfsService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryStreamService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataStoredService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/impl/DataAnalysisService.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java delete mode 100644 data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataStoredServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/IotDataBridgeApplication.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/TestDBConnection.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/api/controller/DataQueryController.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/controller/DatabaseController.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/service/IDatabaseService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/service/ITableStructureService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/DatabaseServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/TableStructureService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/template/ISqlTemplateService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/database/template/SqlTemplateServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/domain/DataAnalysisDTO.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryDfsMapper.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryStreamMapper.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataStoredMapper.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDataAnalysisService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryDfsService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryStreamService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataStoredService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DataAnalysisService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataStoredServiceImpl.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/abstracts/SqlConverterStatement.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/base/CommonService.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/base/SqlConverterStatementHandle.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbConfiguration.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbPoolConfiguration.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/AbstractDbConnector.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/DbConnectorHelper.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/mqtt/MqttMessageConsumer.java create mode 100644 data-storage/src/main/java/com/huaxing/iot/test/TestController.java delete mode 100644 data-storage/src/main/java/com/huaxing/mqtt/MqttMessageConsumer.java delete mode 100644 data-storage/src/main/java/com/huaxing/test/TestController.java create mode 100644 data-storage/src/main/resources/application-uat.yaml diff --git a/data-framework/pom.xml b/data-framework/pom.xml index 1217d55..78bc239 100644 --- a/data-framework/pom.xml +++ b/data-framework/pom.xml @@ -4,18 +4,25 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.huaxing + com.huaxing.iot data-bridge 1.0.0 data-framework framework + + + + 1.8 + 1.8 + + org.springframework spring-beans - 6.2.1 + 5.3.20 io.swagger.core.v3 @@ -25,8 +32,28 @@ org.springframework spring-context - 6.2.1 + 5.3.20 + + + org.springframework + spring-core + 5.3.20 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + \ No newline at end of file diff --git a/data-framework/src/main/java/com/huaxing/common/constant/AppConstant.java b/data-framework/src/main/java/com/huaxing/common/constant/AppConstant.java deleted file mode 100644 index ecbfde2..0000000 --- a/data-framework/src/main/java/com/huaxing/common/constant/AppConstant.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.huaxing.common.constant; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.base.constant - * @ClassName: AppConstant - * @Author: swordmeng8@163.com - * @Description: 系统常量 - * @Date: 2025/1/10 10:53 - * @Version: 1.0 - */ - -public class AppConstant { - public static final String APP_NAME = "iot-data-bridge"; - - /** 网络请求 - 成功 */ - public static final String REQUEST_SUCCESS_CODE = "0"; - /** 网络请求 - 失败(默认) */ - public static final String REQUEST_CODE_FAIL = "-1"; - - /** 异常代码 - 业务类型 */ - public static final String CODE_BIZ = "-1"; -} diff --git a/data-framework/src/main/java/com/huaxing/common/constant/MqttConstant.java b/data-framework/src/main/java/com/huaxing/common/constant/MqttConstant.java deleted file mode 100644 index eba93f5..0000000 --- a/data-framework/src/main/java/com/huaxing/common/constant/MqttConstant.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.huaxing.common.constant; -/** - * 常量 - */ -public class MqttConstant { - - /** - * 客户端id消费者后缀 - */ - public static final String CLIENT_SUFFIX_CONSUMERS = "_consumers"; - /** - * 客户端id生产者后缀 - */ - public static final String CLIENT_SUFFIX_PRODUCERS = "_producers"; - -} - diff --git a/data-framework/src/main/java/com/huaxing/common/exception/BaseException.java b/data-framework/src/main/java/com/huaxing/common/exception/BaseException.java deleted file mode 100644 index f970671..0000000 --- a/data-framework/src/main/java/com/huaxing/common/exception/BaseException.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.huaxing.common.exception; - -import com.huaxing.common.constant.AppConstant; -import lombok.Getter; -import lombok.ToString; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Getter -@ToString -public abstract class BaseException extends RuntimeException { - - private static final Logger Logger = LoggerFactory.getLogger(BizException.class); - - protected final String code; - - protected Object data; - - protected BaseException(String code, String message) { - super(message); - if (code == null){ - this.code = AppConstant.CODE_BIZ; - }else { - this.code = code; - } - } - - public final void print(){ - Logger.error("exception info print: start"); - Logger.error(this.getMessage(),this); - Logger.error("data:{}", data); - Logger.error("exception info print: end"); - } - - public final BaseException setData(Object data){ - this.data = data; - return this; - } - - public final D getData(){ - return (D)data; - } - - protected static String buildMsg(String msg,String hint){ - if (hint != null){ - msg = msg + ":" + hint; - } - return msg; - } -} diff --git a/data-framework/src/main/java/com/huaxing/common/exception/BizException.java b/data-framework/src/main/java/com/huaxing/common/exception/BizException.java deleted file mode 100644 index 07af54f..0000000 --- a/data-framework/src/main/java/com/huaxing/common/exception/BizException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.huaxing.common.exception; - -import com.huaxing.common.constant.AppConstant; -import org.springframework.util.StringUtils; - -public class BizException extends BaseException { - - private BizException(String msg) { - super(AppConstant.CODE_BIZ, msg); - } - - /** tag!(msg:hint) */ - public static BizException custom(String tag, String msg, String hint){ - return BizException.custom(tag,BaseException.buildMsg(msg,hint)); - } - /** tag!(msg) */ - public static BizException custom(String tag, String msg){ - if (!StringUtils.isEmpty(msg)){ - tag += "!(" + msg + ")"; - } - return new BizException(tag); - } -} diff --git a/data-framework/src/main/java/com/huaxing/common/result/ResultVo.java b/data-framework/src/main/java/com/huaxing/common/result/ResultVo.java deleted file mode 100644 index 2c7f8b3..0000000 --- a/data-framework/src/main/java/com/huaxing/common/result/ResultVo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.huaxing.common.result; - -import com.huaxing.common.constant.AppConstant; -import com.huaxing.common.exception.BaseException; -import lombok.Getter; - -import java.io.Serializable; - -@Getter -public class ResultVo implements Serializable { - - final String code; - - final String msg; - - final T data; - - private ResultVo(String code, String msg, T data) { - this.code = code; - this.msg = msg; - this.data = data; - } - - private ResultVo(BaseException exception) { - this.code = exception.getCode(); - this.msg = exception.getMessage(); - this.data = exception.getData(); - } - - public static ResultVo ok() { - return ResultVo.ok(null); - } - - public static ResultVo ok(D data) { - return new ResultVo<>(AppConstant.REQUEST_SUCCESS_CODE,"操作成功!",data); - } - - public static ResultVo ok(String msg,D data) { - return new ResultVo<>(AppConstant.REQUEST_SUCCESS_CODE,msg,data); - } - - public static ResultVo fail(String msg) { - return ResultVo.fail(msg,null); - } - - public static ResultVo fail(String msg,D data) { - return new ResultVo<>(AppConstant.REQUEST_CODE_FAIL,msg,data); - } - - public static ResultVo fail(BaseException exception) { - return new ResultVo<>(exception); - } - - public static ResultVo status(boolean flag) { - return flag ? ResultVo.ok() : ResultVo.fail("操作失败!"); - } - public static ResultVo status(boolean flag,String successMsg,String failMsg) { - return flag ? ResultVo.ok(successMsg, null) : ResultVo.fail(failMsg); - } -} diff --git a/data-framework/src/main/java/com/huaxing/common/util/JacksonUtil.java b/data-framework/src/main/java/com/huaxing/common/util/JacksonUtil.java deleted file mode 100644 index 39f8742..0000000 --- a/data-framework/src/main/java/com/huaxing/common/util/JacksonUtil.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.huaxing.common.util; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author kwl99 - * @since 2024-08-08 14:31 - */ -public class JacksonUtil { - - /** - * 将对象转为json字符串 - */ - public static String objectStr(Object object) { - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - return mapper.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - /** - * 将json字符串转为对象 - */ - public static T strToObject(String str, Class clazz) { - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return mapper.readValue(str, clazz); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - - - /** - * 将json字符串转为对象列表 - */ - public static List strToObjectList(String str, Class clazz) { - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(List.class, clazz)); - } catch (Exception e) { - throw new RuntimeException(e); - - } - } - - /** - * 将json字符串转为对象列表 - */ - public static List> strToMapList(String str) { - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(List.class, HashMap.class)); - } catch (Exception e) { - throw new RuntimeException(e); - - } - } - -} diff --git a/data-framework/src/main/java/com/huaxing/common/util/StrUtils.java b/data-framework/src/main/java/com/huaxing/common/util/StrUtils.java deleted file mode 100644 index 5738737..0000000 --- a/data-framework/src/main/java/com/huaxing/common/util/StrUtils.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.huaxing.common.util; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.common.util - * @ClassName: StrUtils - * @Author: swordmeng8@163.com - * @Description: 字符串工具类 - * @Date: 2025/2/12 15:23 - * @Version: 1.0 - */ - -public class StrUtils { - - /** - * 判断字符串是否以指定前缀开头 - * @param str - * @param prefix - * @return - */ - public static boolean checkStringStartsWithExample(String str, String prefix) { - // 使用 startsWith 方法进行判断 - return str.startsWith(prefix); - } - -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/abstracts/SqlConverterStatement.java b/data-framework/src/main/java/com/huaxing/dolphindb/abstracts/SqlConverterStatement.java deleted file mode 100644 index b22c9eb..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/abstracts/SqlConverterStatement.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.huaxing.dolphindb.abstracts; - -import java.util.Map; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.base - * @ClassName: SqlConverterStatement - * @Author: swordmeng8@163.com - * @Description: SQL转换语句 - * @Date: 2025/1/14 14:01 - * @Version: 1.0 - */ - -abstract public class SqlConverterStatement { - - /** - * 生成插入语句 - * @param tableName - * @param map - * @return - */ - public abstract String generateInsertStreamStatement(String tableName, Map map); - -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/base/CommonService.java b/data-framework/src/main/java/com/huaxing/dolphindb/base/CommonService.java deleted file mode 100644 index 3306798..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/base/CommonService.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.huaxing.dolphindb.base; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.dolphindb.connection.AbstractDbConnector; -import com.xxdb.DBConnection; -import com.xxdb.data.BasicBoolean; -import com.xxdb.data.Entity; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.IOException; -import java.util.List; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.base - * @ClassName: CommonService - * @Author: swordmeng8@163.com - * @Description: 全局通用 - * @Date: 2025/1/15 15:19 - * @Version: 1.0 - */ -@Slf4j -public class CommonService extends SqlConverterStatementHandle { - - @Autowired - private AbstractDbConnector dbPool; - - /** - * 执行单条sql - * - * @param sql - */ - public void executeOnce(String sql) { - DBConnection connection = dbPool.getConnection(); - try { - connection.run(sql); - } catch (IOException e) { - log.error("AbstractDbConnector.executeOnce() Method执行异常:{}", e.getMessage()); - throw new RuntimeException(e); - } finally { - connection.close(); - } - } - - /** - * 执行单条sql bool返回值 - * - * @param sql - */ - public Entity exec(String sql) { - Entity result = null; - DBConnection connection = dbPool.getConnection(); - try { - result = connection.run(sql); - } catch (IOException e) { - log.error("AbstractDbConnector.exec() Method执行异常:{}", e.getMessage()); - throw new RuntimeException(e); - } finally { - connection.close(); - } - return result; - } - - /** - * 执行批量sql - * @param sqlList - */ - public void executeBatch(List sqlList) { - DBConnection connection = dbPool.getConnection(); - sqlList.forEach(sql -> { - try { - connection.run(sql); - } catch (IOException e) { - log.error("AbstractDbConnector.executeBatch() Method执行异常:{}", e.getMessage()); - throw new RuntimeException(e); - } - }); - connection.close(); - } - - /** - * 解析bool返回值 - * @param result - * @return - */ - public boolean parseBoolResult(Entity result) { - boolean dbExists = false; - if (result instanceof BasicBoolean) { - dbExists = ((BasicBoolean) result).getBoolean(); - } - return dbExists; - } - -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/base/SqlConverterStatementHandle.java b/data-framework/src/main/java/com/huaxing/dolphindb/base/SqlConverterStatementHandle.java deleted file mode 100644 index fab7143..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/base/SqlConverterStatementHandle.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.huaxing.dolphindb.base; - -import com.huaxing.dolphindb.abstracts.SqlConverterStatement; - -import java.util.List; -import java.util.Map; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.base - * @ClassName: SqlConverterStatementHandle - * @Author: swordmeng8@163.com - * @Description: sql处理类 - * @Date: 2025/1/14 14:05 - * @Version: 1.0 - */ - -public class SqlConverterStatementHandle extends SqlConverterStatement { - - /** - * 生成插入语句 - * - * @param tableName 表名 - * @param map 键值对 - * @return 插入语句 - */ - @Override - public String generateInsertStreamStatement(String tableName, Map map) { - StringBuilder columnBuilder = new StringBuilder(); - StringBuilder valueBuilder = new StringBuilder(); - int index = 0; - for (Map.Entry entry : map.entrySet()) { - // 处理列名 - columnBuilder.append(entry.getKey()); - // 处理值 - if (entry.getValue() instanceof String) { - valueBuilder.append("'").append(entry.getValue()).append("'"); - } else if (entry.getValue() == null) { - valueBuilder.append("NULL"); - } else { - valueBuilder.append(entry.getValue()); - } - if (index < map.size() - 1) { - columnBuilder.append(", "); - valueBuilder.append(", "); - } - index++; - } - return "INSERT INTO " + tableName + " (" + columnBuilder + ") VALUES (" + valueBuilder + ")"; - } - - - /** - * 生成流表Stream查询语句 - * @param tableName - * @param columnNameList - * @return - */ - public String generateSelectStreamStatement(String tableName, List columnNameList) { - StringBuilder columnBuilder = new StringBuilder(); - if (columnNameList.isEmpty()) { - columnBuilder.append(" * "); - } else { - columnNameList.forEach(columnName -> columnBuilder.append(columnName).append(", ")); - } - return "SELECT " + columnBuilder.toString() + " FROM " + tableName; - } - - - -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbConfiguration.java b/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbConfiguration.java deleted file mode 100644 index fa1338f..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbConfiguration.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.huaxing.dolphindb.config; - -import com.xxdb.*; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - - -/** - * mqtt全局相关配置信息 - */ -@Slf4j -@Setter -@Getter -@Configuration -@ConfigurationProperties("dolphindb") -@SuppressWarnings("all") -public class DolphinDbConfiguration extends SimpleDBConnectionPoolConfig { - - /** - * 连接地址 dfs://ZBdb - */ - private String dbPath; - /** - * 主机名 - */ - private String host; - /** - * 端口号 - */ - private int port; - /** - * 用户名 - */ - private String username; - /** - * 密码 - */ - private String password; - /** - * 连接池初始化大小 - */ - private int initPoolSize; - /** - * 表示连接池中最小连接数,正整数,默认值为 5 - */ - private boolean minimumPoolSize; - /** - * 是否开启高可用 - */ - private boolean enableHighAvailability; - - /** - * 创建连接池配置初始化方法 - * @return SimpleDBConnectionPoolConfig - */ - public SimpleDBConnectionPoolConfig loadConfig() { - SimpleDBConnectionPoolConfig config = new SimpleDBConnectionPoolConfig(); - config.setHostName(host); - config.setPort(port); - config.setUserId(username); - config.setPassword(password); - config.setInitialPoolSize(initPoolSize); - config.setEnableHighAvailability(enableHighAvailability); - return config; - } -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbPoolConfiguration.java b/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbPoolConfiguration.java deleted file mode 100644 index 4fe73f1..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/config/DolphinDbPoolConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.huaxing.dolphindb.config; - -import com.xxdb.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.dolphindb.config - * @ClassName: DbClient - * @Author: swordmeng8@163.com - * @Description: 数据库客户端 - * @Date: 2025/1/15 9:58 - * @Version: 1.0 - */ -@Slf4j -@Configuration -public class DolphinDbPoolConfiguration extends SimpleDBConnectionPool { - - public DBConnection dbConn = null; - - /** - * 构造方法 - * @param dbConfiguration - */ - - public DolphinDbPoolConfiguration(DolphinDbConfiguration dbConfiguration) { - super(dbConfiguration.loadConfig()); - this.dbConn = super.getConnection(); - log.info("【初始化 DolphinDbPool 连接池】"); - } -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/connection/AbstractDbConnector.java b/data-framework/src/main/java/com/huaxing/dolphindb/connection/AbstractDbConnector.java deleted file mode 100644 index 7718361..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/connection/AbstractDbConnector.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.huaxing.dolphindb.connection; - -import com.xxdb.DBConnection; -import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.dolphindb.connection - * @ClassName: DbConnector - * @Author: swordmeng8@163.com - * @Description: dolphindb 连接器 - * @Date: 2025/1/13 14:29 - * @Version: 1.0 - */ -@Accessors(chain = true) -@Slf4j -public abstract class AbstractDbConnector { - - /** - * 连接 dolphindb - */ - public abstract DBConnection getConnection(); - - -} diff --git a/data-framework/src/main/java/com/huaxing/dolphindb/connection/DbConnectorHelper.java b/data-framework/src/main/java/com/huaxing/dolphindb/connection/DbConnectorHelper.java deleted file mode 100644 index f731ef5..0000000 --- a/data-framework/src/main/java/com/huaxing/dolphindb/connection/DbConnectorHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.huaxing.dolphindb.connection; - -import com.huaxing.dolphindb.config.DolphinDbConfiguration; -import com.huaxing.dolphindb.config.DolphinDbPoolConfiguration; -import com.xxdb.DBConnection; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.dolphindb.connection - * @ClassName: DbConnectorHelper - * @Author: swordmeng8@163.com - * @Description: 数据库处理器 - * @Date: 2025/1/13 17:53 - * @Version: 1.0 - */ - -@Component -@SuppressWarnings("all") -public class DbConnectorHelper extends AbstractDbConnector { - - final DolphinDbPoolConfiguration dbPool; - final DolphinDbConfiguration dbConfiguration; - public DbConnectorHelper(DolphinDbConfiguration dbConfiguration, DolphinDbPoolConfiguration dbPool) { - this.dbConfiguration = dbConfiguration; - this.dbPool = dbPool; - } - - - - /** - * 获取数据库连接 - * @return DBConnection - */ - @PostConstruct - @Override - public DBConnection getConnection() { - return dbPool.dbConn; - } -} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/constant/AppConstant.java b/data-framework/src/main/java/com/huaxing/iot/common/constant/AppConstant.java new file mode 100644 index 0000000..e2daa20 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/constant/AppConstant.java @@ -0,0 +1,23 @@ +package com.huaxing.iot.common.constant; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.base.constant + * @ClassName: AppConstant + * @Author: swordmeng8@163.com + * @Description: 系统常量 + * @Date: 2025/1/10 10:53 + * @Version: 1.0 + */ + +public class AppConstant { + public static final String APP_NAME = "iot-data-bridge"; + + /** 网络请求 - 成功 */ + public static final String REQUEST_SUCCESS_CODE = "0"; + /** 网络请求 - 失败(默认) */ + public static final String REQUEST_CODE_FAIL = "-1"; + + /** 异常代码 - 业务类型 */ + public static final String CODE_BIZ = "-1"; +} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/constant/MqttConstant.java b/data-framework/src/main/java/com/huaxing/iot/common/constant/MqttConstant.java new file mode 100644 index 0000000..21734c9 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/constant/MqttConstant.java @@ -0,0 +1,17 @@ +package com.huaxing.iot.common.constant; +/** + * 常量 + */ +public class MqttConstant { + + /** + * 客户端id消费者后缀 + */ + public static final String CLIENT_SUFFIX_CONSUMERS = "_consumers"; + /** + * 客户端id生产者后缀 + */ + public static final String CLIENT_SUFFIX_PRODUCERS = "_producers"; + +} + diff --git a/data-framework/src/main/java/com/huaxing/iot/common/exception/BaseException.java b/data-framework/src/main/java/com/huaxing/iot/common/exception/BaseException.java new file mode 100644 index 0000000..1047ed8 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/exception/BaseException.java @@ -0,0 +1,50 @@ +package com.huaxing.iot.common.exception; + +import com.huaxing.iot.common.constant.AppConstant; +import lombok.Getter; +import lombok.ToString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Getter +@ToString +public abstract class BaseException extends RuntimeException { + + private static final Logger Logger = LoggerFactory.getLogger(BizException.class); + + protected final String code; + + protected Object data; + + protected BaseException(String code, String message) { + super(message); + if (code == null){ + this.code = AppConstant.CODE_BIZ; + }else { + this.code = code; + } + } + + public final void print(){ + Logger.error("exception info print: start"); + Logger.error(this.getMessage(),this); + Logger.error("data:{}", data); + Logger.error("exception info print: end"); + } + + public final BaseException setData(Object data){ + this.data = data; + return this; + } + + public final D getData(){ + return (D)data; + } + + protected static String buildMsg(String msg,String hint){ + if (hint != null){ + msg = msg + ":" + hint; + } + return msg; + } +} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/exception/BizException.java b/data-framework/src/main/java/com/huaxing/iot/common/exception/BizException.java new file mode 100644 index 0000000..1f89071 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/exception/BizException.java @@ -0,0 +1,23 @@ +package com.huaxing.iot.common.exception; + +import com.huaxing.iot.common.constant.AppConstant; +import org.springframework.util.StringUtils; + +public class BizException extends BaseException { + + private BizException(String msg) { + super(AppConstant.CODE_BIZ, msg); + } + + /** tag!(msg:hint) */ + public static BizException custom(String tag, String msg, String hint){ + return BizException.custom(tag,BaseException.buildMsg(msg,hint)); + } + /** tag!(msg) */ + public static BizException custom(String tag, String msg){ + if (!StringUtils.isEmpty(msg)){ + tag += "!(" + msg + ")"; + } + return new BizException(tag); + } +} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/result/ResultVo.java b/data-framework/src/main/java/com/huaxing/iot/common/result/ResultVo.java new file mode 100644 index 0000000..92d32ae --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/result/ResultVo.java @@ -0,0 +1,60 @@ +package com.huaxing.iot.common.result; + +import com.huaxing.iot.common.constant.AppConstant; +import com.huaxing.iot.common.exception.BaseException; +import lombok.Getter; + +import java.io.Serializable; + +@Getter +public class ResultVo implements Serializable { + + final String code; + + final String msg; + + final T data; + + private ResultVo(String code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + private ResultVo(BaseException exception) { + this.code = exception.getCode(); + this.msg = exception.getMessage(); + this.data = exception.getData(); + } + + public static ResultVo ok() { + return ResultVo.ok(null); + } + + public static ResultVo ok(D data) { + return new ResultVo<>(AppConstant.REQUEST_SUCCESS_CODE,"操作成功!",data); + } + + public static ResultVo ok(String msg,D data) { + return new ResultVo<>(AppConstant.REQUEST_SUCCESS_CODE,msg,data); + } + + public static ResultVo fail(String msg) { + return ResultVo.fail(msg,null); + } + + public static ResultVo fail(String msg,D data) { + return new ResultVo<>(AppConstant.REQUEST_CODE_FAIL,msg,data); + } + + public static ResultVo fail(BaseException exception) { + return new ResultVo<>(exception); + } + + public static ResultVo status(boolean flag) { + return flag ? ResultVo.ok() : ResultVo.fail("操作失败!"); + } + public static ResultVo status(boolean flag,String successMsg,String failMsg) { + return flag ? ResultVo.ok(successMsg, null) : ResultVo.fail(failMsg); + } +} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/util/JacksonUtil.java b/data-framework/src/main/java/com/huaxing/iot/common/util/JacksonUtil.java new file mode 100644 index 0000000..4cbf146 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/util/JacksonUtil.java @@ -0,0 +1,75 @@ +package com.huaxing.iot.common.util; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author kwl99 + * @since 2024-08-08 14:31 + */ +public class JacksonUtil { + + /** + * 将对象转为json字符串 + */ + public static String objectStr(Object object) { + ObjectMapper mapper = new ObjectMapper(); + try { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + return mapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * 将json字符串转为对象 + */ + public static T strToObject(String str, Class clazz) { + ObjectMapper mapper = new ObjectMapper(); + try { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper.readValue(str, clazz); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + + /** + * 将json字符串转为对象列表 + */ + public static List strToObjectList(String str, Class clazz) { + ObjectMapper mapper = new ObjectMapper(); + try { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (Exception e) { + throw new RuntimeException(e); + + } + } + + /** + * 将json字符串转为对象列表 + */ + public static List> strToMapList(String str) { + ObjectMapper mapper = new ObjectMapper(); + try { + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return mapper.readValue(str, mapper.getTypeFactory().constructCollectionType(List.class, HashMap.class)); + } catch (Exception e) { + throw new RuntimeException(e); + + } + } + +} diff --git a/data-framework/src/main/java/com/huaxing/iot/common/util/StrUtils.java b/data-framework/src/main/java/com/huaxing/iot/common/util/StrUtils.java new file mode 100644 index 0000000..ea5b930 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/common/util/StrUtils.java @@ -0,0 +1,26 @@ +package com.huaxing.iot.common.util; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.common.util + * @ClassName: StrUtils + * @Author: swordmeng8@163.com + * @Description: 字符串工具类 + * @Date: 2025/2/12 15:23 + * @Version: 1.0 + */ + +public class StrUtils { + + /** + * 判断字符串是否以指定前缀开头 + * @param str + * @param prefix + * @return + */ + public static boolean checkStringStartsWithExample(String str, String prefix) { + // 使用 startsWith 方法进行判断 + return str.startsWith(prefix); + } + +} diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConfiguration.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConfiguration.java new file mode 100644 index 0000000..a65d9fb --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConfiguration.java @@ -0,0 +1,143 @@ +package com.huaxing.iot.mqtt.config; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; +import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * mqtt全局相关配置信息 + */ +@Slf4j +@Setter +@Getter +@Configuration +@ConfigurationProperties("mqtt") +@IntegrationComponentScan(basePackages = "com.huaxing.iot.mqtt.*") +public class MqttConfiguration { + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 连接地址 + */ + private String hostUrl; + + /** + * 客户Id + */ + private String clientId; + + /** + * 默认连接话题 + */ + private String defaultTopic; + + /** + * 超时时间 + */ + private int timeout; + + /** + * qos + */ + private int qos; + + /** + * 订阅超时时间 + */ + private int completionTimeout; + + /** + * 保持连接数 + */ + private int keepalive; + + /** + * 2024-12-06新增 + * 要订阅的其他主题 + */ + private List topics; + + /** + * 客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息 + */ + private static final byte[] WILL_DATA = "offline".getBytes(); + + + /** + * 获取所有订阅的主题 + * @return 所有订阅的主题 + */ + public String[] getAllTopics() { + // 校验配置文件是否配置 + if (CollectionUtils.isEmpty(topics)) { + this.topics = new ArrayList<>(); + } + // 将默认主题条件到其他主题里 + this.topics.add(defaultTopic); + // 返回主题数组 + return topics.toArray(new String[0]); + } + + /** + * 注册MQTT客户端工厂 + * @return MqttPahoClientFactory + */ + @Bean + public MqttPahoClientFactory mqttClientFactory() { + // 客户端工厂 + DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); + + MqttConnectOptions options = new MqttConnectOptions(); + // 设置连接的用户名 + options.setUserName(username); + // 设置连接的密码 + options.setPassword(password.toCharArray()); + // 设置连接的地址 + options.setServerURIs(new String[]{hostUrl}); + + // 如果设置为 false,客户端和服务器将在客户端、服务器和连接重新启动时保持状态。随着状态的保持: + // 即使客户端、服务器或连接重新启动,消息传递也将可靠地满足指定的 QOS。服务器将订阅视为持久的。 + // 如果设置为 true,客户端和服务器将不会在客户端、服务器或连接重新启动时保持状态。 + options.setCleanSession(true); + + // 设置超时时间,该值以秒为单位,必须>0,定义了客户端等待与 MQTT 服务器建立网络连接的最大时间间隔。 + // 默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等待直到网络连接成功或失败。 + options.setConnectionTimeout(10); + + // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线 + // 此值以秒为单位,定义发送或接收消息之间的最大时间间隔,必须>0 + // 但这个方法并没有重连的机制 + options.setKeepAliveInterval(20); + + // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。 + options.setWill("willTopic", WILL_DATA, 2, false); + + //自动重新连接 + options.setAutomaticReconnect(true); + factory.setConnectionOptions(options); + + log.info("【初始化 MQTT 配置】"); + + return factory; + } +} diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConsumerConfiguration.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConsumerConfiguration.java new file mode 100644 index 0000000..d1d7494 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttConsumerConfiguration.java @@ -0,0 +1,96 @@ +package com.huaxing.iot.mqtt.config; + +import com.huaxing.iot.common.constant.MqttConstant; +import com.huaxing.iot.mqtt.processor.MqttMessageReceiver; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.endpoint.MessageProducerSupport; +import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; + +import java.util.UUID; + + +/** + * MQTT消费者配置 + */ +@Slf4j +@Configuration +@IntegrationComponentScan +public class MqttConsumerConfiguration { + + final MqttConfiguration mqttConfiguration; + final MqttMessageReceiver mqttMessageReceiver; + + public MqttConsumerConfiguration(MqttConfiguration mqttConfiguration, MqttMessageReceiver mqttMessageReceiver) { + this.mqttConfiguration = mqttConfiguration; + this.mqttMessageReceiver = mqttMessageReceiver; + } + + + /** + * 此处可以使用其他消息通道 + * MQTT信息通道(消费者) + * Spring Integration默认的消息通道,它允许将消息发送给一个订阅者,然后阻碍发送直到消息被接收。 + */ + @Bean + public MessageChannel mqttInBoundChannel() { + return new DirectChannel(); + } + + /** + * mqtt入站消息处理工具,对于指定消息入站通道接收到生产者生产的消息后处理消息的工具。 + */ + @Bean + @ServiceActivator(inputChannel = "mqttInBoundChannel") + public MessageHandler mqttMessageHandler() { + return this.mqttMessageReceiver; + } + + /** + * MQTT消息订阅绑定(消费者) + * 适配器, 两个topic共用一个adapter + * 客户端作为消费者,订阅主题,消费消息 + */ + @Bean + public MessageProducerSupport mqttInbound() { + // 获取客户端id + String clientId = mqttConfiguration.getClientId(); + // 获取默认主题 +// String defaultTopic = mqttConfiguration.getDefaultTopic(); + + // 获取所有配置的主题 + String[] topics = mqttConfiguration.getAllTopics(); + + // 获取客户端工厂 + MqttPahoClientFactory mqttPahoClientFactory = mqttConfiguration.mqttClientFactory(); + + // Paho客户端消息驱动通道适配器,主要用来订阅主题 + MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( + UUID.randomUUID() + clientId + MqttConstant.CLIENT_SUFFIX_CONSUMERS, + mqttPahoClientFactory, + // 所有需要订阅的topic + topics + ); + adapter.setCompletionTimeout(mqttConfiguration.getCompletionTimeout()); + // Paho消息转换器 + DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter(); + // 按字节接收消息 + // defaultPahoMessageConverter.setPayloadAsBytes(true); + adapter.setConverter(defaultPahoMessageConverter); + // 设置QoS + adapter.setQos(mqttConfiguration.getQos()); + // 设置订阅通道 + adapter.setOutputChannel(mqttInBoundChannel()); + return adapter; + } + +} + diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttProducerConfiguration.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttProducerConfiguration.java new file mode 100644 index 0000000..4562d46 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/config/MqttProducerConfiguration.java @@ -0,0 +1,65 @@ +package com.huaxing.iot.mqtt.config; + +import com.huaxing.iot.common.constant.MqttConstant; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; +import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; + +import javax.annotation.Resource; + + +/** + * MQTT生产者配置 + */ +@Slf4j +@Configuration +@AllArgsConstructor +public class MqttProducerConfiguration { + + @Resource + private MqttConfiguration mqttConfiguration; + + /** + * MQTT信息通道(生产者) + */ + @Bean + public MessageChannel mqttOutboundChannel() { + return new DirectChannel(); + } + + /** + * MQTT消息处理器(生产者) + */ + @Bean + @ServiceActivator(inputChannel = "mqttOutboundChannel") + public MessageHandler mqttOutbound() { + // 客户端id + String clientId = mqttConfiguration.getClientId(); + // 默认主题 + String defaultTopic = mqttConfiguration.getDefaultTopic(); + MqttPahoClientFactory mqttPahoClientFactory = mqttConfiguration.mqttClientFactory(); + + // 发送消息和消费消息Channel可以使用相同MqttPahoClientFactory + MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + MqttConstant.CLIENT_SUFFIX_PRODUCERS, mqttPahoClientFactory); + // true,异步,发送消息时将不会阻塞。 + messageHandler.setAsync(true); + messageHandler.setDefaultTopic(defaultTopic); + // 默认QoS + messageHandler.setDefaultQos(1); + // Paho消息转换器 + DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter(); + // defaultPahoMessageConverter.setPayloadAsBytes(true); + // 发送默认按字节类型发送消息 + messageHandler.setConverter(defaultPahoMessageConverter); + return messageHandler; + } + +} diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttGateway.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttGateway.java new file mode 100644 index 0000000..68bf120 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttGateway.java @@ -0,0 +1,46 @@ +package com.huaxing.iot.mqtt.processor; + +import org.springframework.integration.annotation.MessagingGateway; +import org.springframework.integration.mqtt.support.MqttHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +/** + * 生产者处理器 + */ +@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") +public interface MqttGateway { + + /** + * 发送mqtt消息 + * + * @param topic 主题 + * @param payload 内容 + */ + void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload); + + /** + * 发送包含qos的消息 + * + * @param topic 主题 + * @param qos 对消息处理的几种机制。 + * * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。
+ * * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。
+ * * 2 多了一次去重的动作,确保订阅者收到的消息有一次。 + * @param payload 消息体 + */ + void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); + + /** + * 发送包含qos的消息 + * + * @param topic 主题 + * @param qos 对消息处理的几种机制。 + * * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。
+ * * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。
+ * * 2 多了一次去重的动作,确保订阅者收到的消息有一次。 + * @param payload 消息体 + */ + void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload); +} diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageReceiver.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageReceiver.java new file mode 100644 index 0000000..27fc164 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageReceiver.java @@ -0,0 +1,14 @@ +package com.huaxing.iot.mqtt.processor; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.MessageHandler; +import org.springframework.stereotype.Component; + +/** + * 消费者处理器 + */ +@Slf4j +@Component +@SuppressWarnings("all") +public abstract class MqttMessageReceiver implements MessageHandler { } + diff --git a/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageSender.java b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageSender.java new file mode 100644 index 0000000..24bf8a5 --- /dev/null +++ b/data-framework/src/main/java/com/huaxing/iot/mqtt/processor/MqttMessageSender.java @@ -0,0 +1,52 @@ +package com.huaxing.iot.mqtt.processor; + +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +/** + * 生产者处理器 + */ +@Component +public class MqttMessageSender { + + @Autowired + private MqttGateway mqttGateway; + + + /** + * 发送mqtt消息 + * + * @param topic 主题 + * @param message 内容 + * @return void + */ + public void send(String topic, String message) { + mqttGateway.sendToMqtt(topic, message); + } + + /** + * 发送包含qos的消息 + * + * @param topic 主题 + * @param qos 质量 + * @param messageBody 消息体 + * @return void + */ + public void send(String topic, int qos, JSONObject messageBody) { + mqttGateway.sendToMqtt(topic, qos, messageBody.toString()); + } + + /** + * 发送包含qos的消息 + * + * @param topic 主题 + * @param qos 质量 + * @param message 消息体 + * @return void + */ + public void send(String topic, int qos, byte[] message) { + mqttGateway.sendToMqtt(topic, qos, message); + } +} diff --git a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConfiguration.java b/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConfiguration.java deleted file mode 100644 index fb12312..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConfiguration.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.huaxing.mqtt.config; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.eclipse.paho.client.mqttv3.MqttConnectOptions; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.integration.annotation.IntegrationComponentScan; -import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; -import org.springframework.integration.mqtt.core.MqttPahoClientFactory; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * mqtt全局相关配置信息 - */ -@Slf4j -@Setter -@Getter -@Configuration -@ConfigurationProperties("mqtt") -@IntegrationComponentScan(basePackages = "com.huaxing.mqtt.*") -public class MqttConfiguration { - - /** - * 用户名 - */ - private String username; - - /** - * 密码 - */ - private String password; - - /** - * 连接地址 - */ - private String hostUrl; - - /** - * 客户Id - */ - private String clientId; - - /** - * 默认连接话题 - */ - private String defaultTopic; - - /** - * 超时时间 - */ - private int timeout; - - /** - * qos - */ - private int qos; - - /** - * 订阅超时时间 - */ - private int completionTimeout; - - /** - * 保持连接数 - */ - private int keepalive; - - /** - * 2024-12-06新增 - * 要订阅的其他主题 - */ - private List topics; - - /** - * 客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息 - */ - private static final byte[] WILL_DATA = "offline".getBytes(); - - - /** - * 获取所有订阅的主题 - * @return 所有订阅的主题 - */ - public String[] getAllTopics() { - // 校验配置文件是否配置 - if (CollectionUtils.isEmpty(topics)) { - this.topics = new ArrayList<>(); - } - // 将默认主题条件到其他主题里 - this.topics.add(defaultTopic); - // 返回主题数组 - return topics.toArray(new String[0]); - } - - /** - * 注册MQTT客户端工厂 - * @return MqttPahoClientFactory - */ - @Bean - public MqttPahoClientFactory mqttClientFactory() { - // 客户端工厂 - DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); - - MqttConnectOptions options = new MqttConnectOptions(); - // 设置连接的用户名 - options.setUserName(username); - // 设置连接的密码 - options.setPassword(password.toCharArray()); - // 设置连接的地址 - options.setServerURIs(new String[]{hostUrl}); - - // 如果设置为 false,客户端和服务器将在客户端、服务器和连接重新启动时保持状态。随着状态的保持: - // 即使客户端、服务器或连接重新启动,消息传递也将可靠地满足指定的 QOS。服务器将订阅视为持久的。 - // 如果设置为 true,客户端和服务器将不会在客户端、服务器或连接重新启动时保持状态。 - options.setCleanSession(true); - - // 设置超时时间,该值以秒为单位,必须>0,定义了客户端等待与 MQTT 服务器建立网络连接的最大时间间隔。 - // 默认超时为 30 秒。值 0 禁用超时处理,这意味着客户端将等待直到网络连接成功或失败。 - options.setConnectionTimeout(10); - - // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线 - // 此值以秒为单位,定义发送或接收消息之间的最大时间间隔,必须>0 - // 但这个方法并没有重连的机制 - options.setKeepAliveInterval(20); - - // 设置“遗嘱”消息的话题,若客户端与服务器之间的连接意外中断,服务器将发布客户端的“遗嘱”消息。 - options.setWill("willTopic", WILL_DATA, 2, false); - - //自动重新连接 - options.setAutomaticReconnect(true); - factory.setConnectionOptions(options); - - log.info("【初始化 MQTT 配置】"); - - return factory; - } -} diff --git a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConsumerConfiguration.java b/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConsumerConfiguration.java deleted file mode 100644 index 65311e6..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttConsumerConfiguration.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.huaxing.mqtt.config; - -import com.huaxing.common.constant.MqttConstant; -import com.huaxing.mqtt.processor.MqttMessageReceiver; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.integration.annotation.IntegrationComponentScan; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.endpoint.MessageProducerSupport; -import org.springframework.integration.mqtt.core.MqttPahoClientFactory; -import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; -import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; - -import java.util.UUID; - - -/** - * MQTT消费者配置 - */ -@Slf4j -@Configuration -@IntegrationComponentScan -public class MqttConsumerConfiguration { - - final MqttConfiguration mqttConfiguration; - final MqttMessageReceiver mqttMessageReceiver; - - public MqttConsumerConfiguration(MqttConfiguration mqttConfiguration, MqttMessageReceiver mqttMessageReceiver) { - this.mqttConfiguration = mqttConfiguration; - this.mqttMessageReceiver = mqttMessageReceiver; - } - - - /** - * 此处可以使用其他消息通道 - * MQTT信息通道(消费者) - * Spring Integration默认的消息通道,它允许将消息发送给一个订阅者,然后阻碍发送直到消息被接收。 - */ - @Bean - public MessageChannel mqttInBoundChannel() { - return new DirectChannel(); - } - - /** - * mqtt入站消息处理工具,对于指定消息入站通道接收到生产者生产的消息后处理消息的工具。 - */ - @Bean - @ServiceActivator(inputChannel = "mqttInBoundChannel") - public MessageHandler mqttMessageHandler() { - return this.mqttMessageReceiver; - } - - /** - * MQTT消息订阅绑定(消费者) - * 适配器, 两个topic共用一个adapter - * 客户端作为消费者,订阅主题,消费消息 - */ - @Bean - public MessageProducerSupport mqttInbound() { - // 获取客户端id - String clientId = mqttConfiguration.getClientId(); - // 获取默认主题 -// String defaultTopic = mqttConfiguration.getDefaultTopic(); - - // 获取所有配置的主题 - String[] topics = mqttConfiguration.getAllTopics(); - - // 获取客户端工厂 - MqttPahoClientFactory mqttPahoClientFactory = mqttConfiguration.mqttClientFactory(); - - // Paho客户端消息驱动通道适配器,主要用来订阅主题 - MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( - UUID.randomUUID() + clientId + MqttConstant.CLIENT_SUFFIX_CONSUMERS, - mqttPahoClientFactory, - // 所有需要订阅的topic - topics - ); - adapter.setCompletionTimeout(mqttConfiguration.getCompletionTimeout()); - // Paho消息转换器 - DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter(); - // 按字节接收消息 - // defaultPahoMessageConverter.setPayloadAsBytes(true); - adapter.setConverter(defaultPahoMessageConverter); - // 设置QoS - adapter.setQos(mqttConfiguration.getQos()); - // 设置订阅通道 - adapter.setOutputChannel(mqttInBoundChannel()); - return adapter; - } - -} - diff --git a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttProducerConfiguration.java b/data-framework/src/main/java/com/huaxing/mqtt/config/MqttProducerConfiguration.java deleted file mode 100644 index 0e91477..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/config/MqttProducerConfiguration.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.huaxing.mqtt.config; - -import com.huaxing.common.constant.MqttConstant; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.mqtt.core.MqttPahoClientFactory; -import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; -import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; - -import javax.annotation.Resource; - - -/** - * MQTT生产者配置 - */ -@Slf4j -@Configuration -@AllArgsConstructor -public class MqttProducerConfiguration { - - @Resource - private MqttConfiguration mqttConfiguration; - - /** - * MQTT信息通道(生产者) - */ - @Bean - public MessageChannel mqttOutboundChannel() { - return new DirectChannel(); - } - - /** - * MQTT消息处理器(生产者) - */ - @Bean - @ServiceActivator(inputChannel = "mqttOutboundChannel") - public MessageHandler mqttOutbound() { - // 客户端id - String clientId = mqttConfiguration.getClientId(); - // 默认主题 - String defaultTopic = mqttConfiguration.getDefaultTopic(); - MqttPahoClientFactory mqttPahoClientFactory = mqttConfiguration.mqttClientFactory(); - - // 发送消息和消费消息Channel可以使用相同MqttPahoClientFactory - MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + MqttConstant.CLIENT_SUFFIX_PRODUCERS, mqttPahoClientFactory); - // true,异步,发送消息时将不会阻塞。 - messageHandler.setAsync(true); - messageHandler.setDefaultTopic(defaultTopic); - // 默认QoS - messageHandler.setDefaultQos(1); - // Paho消息转换器 - DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter(); - // defaultPahoMessageConverter.setPayloadAsBytes(true); - // 发送默认按字节类型发送消息 - messageHandler.setConverter(defaultPahoMessageConverter); - return messageHandler; - } - -} diff --git a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttGateway.java b/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttGateway.java deleted file mode 100644 index 89c4fa2..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttGateway.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.huaxing.mqtt.processor; - -import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.mqtt.support.MqttHeaders; -import org.springframework.messaging.handler.annotation.Header; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -/** - * 生产者处理器 - */ -@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") -public interface MqttGateway { - - /** - * 发送mqtt消息 - * - * @param topic 主题 - * @param payload 内容 - */ - void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload); - - /** - * 发送包含qos的消息 - * - * @param topic 主题 - * @param qos 对消息处理的几种机制。 - * * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。
- * * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。
- * * 2 多了一次去重的动作,确保订阅者收到的消息有一次。 - * @param payload 消息体 - */ - void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); - - /** - * 发送包含qos的消息 - * - * @param topic 主题 - * @param qos 对消息处理的几种机制。 - * * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失。
- * * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息。
- * * 2 多了一次去重的动作,确保订阅者收到的消息有一次。 - * @param payload 消息体 - */ - void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload); -} diff --git a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageReceiver.java b/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageReceiver.java deleted file mode 100644 index 192febf..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageReceiver.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.huaxing.mqtt.processor; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.messaging.MessageHandler; -import org.springframework.stereotype.Component; - -/** - * 消费者处理器 - */ -@Slf4j -@Component -@SuppressWarnings("all") -public abstract class MqttMessageReceiver implements MessageHandler { } - diff --git a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageSender.java b/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageSender.java deleted file mode 100644 index 27cc2f8..0000000 --- a/data-framework/src/main/java/com/huaxing/mqtt/processor/MqttMessageSender.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.huaxing.mqtt.processor; - -import org.json.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - - -/** - * 生产者处理器 - */ -@Component -public class MqttMessageSender { - - @Autowired - private MqttGateway mqttGateway; - - - /** - * 发送mqtt消息 - * - * @param topic 主题 - * @param message 内容 - * @return void - */ - public void send(String topic, String message) { - mqttGateway.sendToMqtt(topic, message); - } - - /** - * 发送包含qos的消息 - * - * @param topic 主题 - * @param qos 质量 - * @param messageBody 消息体 - * @return void - */ - public void send(String topic, int qos, JSONObject messageBody) { - mqttGateway.sendToMqtt(topic, qos, messageBody.toString()); - } - - /** - * 发送包含qos的消息 - * - * @param topic 主题 - * @param qos 质量 - * @param message 消息体 - * @return void - */ - public void send(String topic, int qos, byte[] message) { - mqttGateway.sendToMqtt(topic, qos, message); - } -} diff --git a/data-storage-api/pom.xml b/data-storage-api/pom.xml index cf583ab..88136a0 100644 --- a/data-storage-api/pom.xml +++ b/data-storage-api/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.huaxing + com.huaxing.iot data-bridge 1.0.0 @@ -13,10 +13,11 @@ jar - 17 - 17 + 1.8 + 1.8 UTF-8 + com.huaxing @@ -31,11 +32,13 @@ 2.2.9.RELEASE + org.springframework.cloud spring-cloud-context - 3.1.4 + 2.2.9.RELEASE + jakarta.validation jakarta.validation-api @@ -43,4 +46,17 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + \ No newline at end of file diff --git a/data-storage-api/src/main/java/com/huaxing/feign/IDatabaseClientFeign.java b/data-storage-api/src/main/java/com/huaxing/feign/IDatabaseClientFeign.java deleted file mode 100644 index b825ee4..0000000 --- a/data-storage-api/src/main/java/com/huaxing/feign/IDatabaseClientFeign.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.huaxing.feign; - -import com.huaxing.common.constant.AppConstant; -import com.huaxing.common.result.ResultVo; -import com.huaxing.feign.fallback.DatabaseFeignFallbackFactory; -import com.huaxing.pojo.dto.DatabaseDTO; -import com.huaxing.pojo.dto.TableDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -/** - * Notice Feign接口类 - * - * @author Chill - */ -@FeignClient(name = AppConstant.APP_NAME, fallbackFactory = DatabaseFeignFallbackFactory.class) -public interface IDatabaseClientFeign { - - // 请求前缀 - String API_PREFIX = "/api/database"; - - // 创建数据库 - String CREATE_DATABASE = API_PREFIX + "/create"; - - // 创建dfs表 - String CREATE_DFS_TABLE = API_PREFIX + "/table/create/dfs"; - - // 创建stream表 - String CREATE_STREAM_TABLE = API_PREFIX + "/table/create/stream"; - - // 创建dfs和stream表并订阅 - String CREATE_DFS_AND_STREAM_TABLE_SUBSCRIBE = API_PREFIX + "/table/create/dfs/stream/subscribe"; - - // 创建dfs和stream表不订阅 - String CREATE_DFS_AND_STREAM_TABLE_UNSUBSCRIBE = API_PREFIX + "/table/create/dfs/stream/unsubscribe"; - - // 订阅流表 - String SUBSCRIBE_STREAM_TABLE = API_PREFIX + "/table/subscribe/stream"; - - // 取消订阅流表 - String UNSUBSCRIBE_STREAM_TABLE = API_PREFIX + "/table/unsubscribe/stream"; - - // 新增dfs表字段 - String ADD_DFS_COLUMNS = API_PREFIX + "/table/add/dfs/columns"; - - // 新增stream表字段 - String ADD_STREAM_COLUMNS = API_PREFIX + "/table/add/stream/columns"; - - - /** - * 创建数据库 - * @param databaseDTO - * @return ResultVo - */ - @PostMapping(CREATE_DATABASE) - ResultVo createDatabase(@RequestBody @Validated DatabaseDTO databaseDTO); - - - /** - * 创建dfs表 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(CREATE_DFS_TABLE) - ResultVo createDfsTable(@RequestBody @Validated TableDTO tableDTO); - - - /** - * 创建stream表 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(CREATE_STREAM_TABLE) - ResultVo createStreamTable(@RequestBody @Validated TableDTO tableDTO); - - /** - * 创建dfs和stream表并订阅 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(CREATE_DFS_AND_STREAM_TABLE_SUBSCRIBE) - ResultVo createDfsAndStreamTableSubscribe(@RequestBody @Validated TableDTO tableDTO); - - /** - * 创建dfs和stream表不订阅 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(CREATE_DFS_AND_STREAM_TABLE_UNSUBSCRIBE) - ResultVo createDfsAndStreamTableUnsubscribe(@RequestBody @Validated TableDTO tableDTO); - - /** - * 订阅流表 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(SUBSCRIBE_STREAM_TABLE) - ResultVo subscribeStreamTable(@RequestBody @Validated TableDTO tableDTO); - - /** - * 取消订阅流表 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(UNSUBSCRIBE_STREAM_TABLE) - ResultVo unsubscribeStreamTable(@RequestBody @Validated TableDTO tableDTO); - - /** - * 新增dfs表字段 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(ADD_DFS_COLUMNS) - ResultVo addDfsColumns(@RequestBody @Validated TableDTO tableDTO); - - /** - * 新增stream表字段 - * @param tableDTO - * @return ResultVo - */ - @PostMapping(ADD_STREAM_COLUMNS) - ResultVo addStreamColumns(@RequestBody @Validated TableDTO tableDTO); - -} diff --git a/data-storage-api/src/main/java/com/huaxing/feign/fallback/DatabaseFeignFallbackFactory.java b/data-storage-api/src/main/java/com/huaxing/feign/fallback/DatabaseFeignFallbackFactory.java deleted file mode 100644 index 65f6da6..0000000 --- a/data-storage-api/src/main/java/com/huaxing/feign/fallback/DatabaseFeignFallbackFactory.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.huaxing.feign.fallback; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.feign.IDatabaseClientFeign; -import com.huaxing.pojo.dto.DatabaseDTO; -import com.huaxing.pojo.dto.TableDTO; -import feign.hystrix.FallbackFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.fallback - * @ClassName: DataStorageFeignFallbackFactory - * @Author: swordmeng8@163.com - * @Description: 1 - * @Date: 2025/2/12 10:29 - * @Version: 1.0 - */ -@Component -public class DatabaseFeignFallbackFactory implements FallbackFactory { - - private static final Logger logger = LoggerFactory.getLogger(DatabaseFeignFallbackFactory.class); - - @Override - public IDatabaseClientFeign create(Throwable throwable) { - - /** - * 请求失败处理 - * 1. 创建数据库 - * 2. 创建Dfs表 - * 3. 创建Stream表 - * 4. 创建Dfs和Stream表订阅 - * 5. 创建Dfs和Stream表取消订阅 - * 6. 创建Stream表订阅 - * 7. 创建Stream表取消订阅 - * 8. 添加Dfs表字段 - * 9. 添加Stream表字段 - */ - return new IDatabaseClientFeign() { - @Override - public ResultVo createDatabase(DatabaseDTO query) { - logger.error("调用 data-storage-api 的 createDatabase 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo createDfsTable(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 createDfsTable 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo createStreamTable(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 createStreamTable 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 createDfsAndStreamTableSubscribe 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 createDfsAndStreamTableUnsubscribe 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo subscribeStreamTable(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 subscribeStreamTable 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo unsubscribeStreamTable(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 unsubscribeStreamTable 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo addDfsColumns(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 addDfsColumns 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - - @Override - public ResultVo addStreamColumns(TableDTO tableDTO) { - logger.error("调用 data-storage-api 的 addStreamColumns 方法失败,原因: {}", throwable.getMessage()); - return ResultVo.fail(throwable.getMessage()); - } - }; - } -} diff --git a/data-storage-api/src/main/java/com/huaxing/iot/feign/IDatabaseClientFeign.java b/data-storage-api/src/main/java/com/huaxing/iot/feign/IDatabaseClientFeign.java new file mode 100644 index 0000000..c14629d --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/feign/IDatabaseClientFeign.java @@ -0,0 +1,126 @@ +package com.huaxing.iot.feign; + +import com.huaxing.iot.common.constant.AppConstant; +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.feign.fallback.DatabaseFeignFallbackFactory; +import com.huaxing.iot.pojo.dto.DatabaseDTO; +import com.huaxing.iot.pojo.dto.TableDTO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * Notice Feign接口类 + * + * @author Chill + */ +@FeignClient(name = AppConstant.APP_NAME, fallbackFactory = DatabaseFeignFallbackFactory.class) +public interface IDatabaseClientFeign { + + // 请求前缀 + String API_PREFIX = "/api/database"; + + // 创建数据库 + String CREATE_DATABASE = API_PREFIX + "/create"; + + // 创建dfs表 + String CREATE_DFS_TABLE = API_PREFIX + "/table/create/dfs"; + + // 创建stream表 + String CREATE_STREAM_TABLE = API_PREFIX + "/table/create/stream"; + + // 创建dfs和stream表并订阅 + String CREATE_DFS_AND_STREAM_TABLE_SUBSCRIBE = API_PREFIX + "/table/create/dfs/stream/subscribe"; + + // 创建dfs和stream表不订阅 + String CREATE_DFS_AND_STREAM_TABLE_UNSUBSCRIBE = API_PREFIX + "/table/create/dfs/stream/unsubscribe"; + + // 订阅流表 + String SUBSCRIBE_STREAM_TABLE = API_PREFIX + "/table/subscribe/stream"; + + // 取消订阅流表 + String UNSUBSCRIBE_STREAM_TABLE = API_PREFIX + "/table/unsubscribe/stream"; + + // 新增dfs表字段 + String ADD_DFS_COLUMNS = API_PREFIX + "/table/add/dfs/columns"; + + // 新增stream表字段 + String ADD_STREAM_COLUMNS = API_PREFIX + "/table/add/stream/columns"; + + + /** + * 创建数据库 + * @param databaseDTO + * @return ResultVo + */ + @PostMapping(CREATE_DATABASE) + ResultVo createDatabase(@RequestBody @Validated DatabaseDTO databaseDTO); + + + /** + * 创建dfs表 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(CREATE_DFS_TABLE) + ResultVo createDfsTable(@RequestBody @Validated TableDTO tableDTO); + + + /** + * 创建stream表 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(CREATE_STREAM_TABLE) + ResultVo createStreamTable(@RequestBody @Validated TableDTO tableDTO); + + /** + * 创建dfs和stream表并订阅 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(CREATE_DFS_AND_STREAM_TABLE_SUBSCRIBE) + ResultVo createDfsAndStreamTableSubscribe(@RequestBody @Validated TableDTO tableDTO); + + /** + * 创建dfs和stream表不订阅 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(CREATE_DFS_AND_STREAM_TABLE_UNSUBSCRIBE) + ResultVo createDfsAndStreamTableUnsubscribe(@RequestBody @Validated TableDTO tableDTO); + + /** + * 订阅流表 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(SUBSCRIBE_STREAM_TABLE) + ResultVo subscribeStreamTable(@RequestBody @Validated TableDTO tableDTO); + + /** + * 取消订阅流表 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(UNSUBSCRIBE_STREAM_TABLE) + ResultVo unsubscribeStreamTable(@RequestBody @Validated TableDTO tableDTO); + + /** + * 新增dfs表字段 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(ADD_DFS_COLUMNS) + ResultVo addDfsColumns(@RequestBody @Validated TableDTO tableDTO); + + /** + * 新增stream表字段 + * @param tableDTO + * @return ResultVo + */ + @PostMapping(ADD_STREAM_COLUMNS) + ResultVo addStreamColumns(@RequestBody @Validated TableDTO tableDTO); + +} diff --git a/data-storage-api/src/main/java/com/huaxing/iot/feign/fallback/DatabaseFeignFallbackFactory.java b/data-storage-api/src/main/java/com/huaxing/iot/feign/fallback/DatabaseFeignFallbackFactory.java new file mode 100644 index 0000000..66cd5b7 --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/feign/fallback/DatabaseFeignFallbackFactory.java @@ -0,0 +1,97 @@ +package com.huaxing.iot.feign.fallback; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.feign.IDatabaseClientFeign; +import com.huaxing.iot.pojo.dto.DatabaseDTO; +import com.huaxing.iot.pojo.dto.TableDTO; +import feign.hystrix.FallbackFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.fallback + * @ClassName: DataStorageFeignFallbackFactory + * @Author: swordmeng8@163.com + * @Description: 1 + * @Date: 2025/2/12 10:29 + * @Version: 1.0 + */ +@Component +public class DatabaseFeignFallbackFactory implements FallbackFactory { + + private static final Logger logger = LoggerFactory.getLogger(DatabaseFeignFallbackFactory.class); + + @Override + public IDatabaseClientFeign create(Throwable throwable) { + + /** + * 请求失败处理 + * 1. 创建数据库 + * 2. 创建Dfs表 + * 3. 创建Stream表 + * 4. 创建Dfs和Stream表订阅 + * 5. 创建Dfs和Stream表取消订阅 + * 6. 创建Stream表订阅 + * 7. 创建Stream表取消订阅 + * 8. 添加Dfs表字段 + * 9. 添加Stream表字段 + */ + return new IDatabaseClientFeign() { + @Override + public ResultVo createDatabase(DatabaseDTO query) { + logger.error("调用 data-storage-api 的 createDatabase 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo createDfsTable(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 createDfsTable 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo createStreamTable(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 createStreamTable 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 createDfsAndStreamTableSubscribe 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 createDfsAndStreamTableUnsubscribe 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo subscribeStreamTable(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 subscribeStreamTable 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo unsubscribeStreamTable(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 unsubscribeStreamTable 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo addDfsColumns(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 addDfsColumns 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + + @Override + public ResultVo addStreamColumns(TableDTO tableDTO) { + logger.error("调用 data-storage-api 的 addStreamColumns 方法失败,原因: {}", throwable.getMessage()); + return ResultVo.fail(throwable.getMessage()); + } + }; + } +} diff --git a/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DataQueryDTO.java b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DataQueryDTO.java new file mode 100644 index 0000000..cae3e3a --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DataQueryDTO.java @@ -0,0 +1,26 @@ +package com.huaxing.iot.pojo.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.domain + * @ClassName: CommonDeviceControl + * @Author: swordmeng8@163.com + * @Description: 数据查询DTO + * @Date: 2025/1/10 18:11 + * @Version: 1.0 + */ + +@Accessors(chain = true) +@Data +public class DataQueryDTO { + // 表名 + private String tableName; + // 设备数据集 + private List tableColumns; + +} \ No newline at end of file diff --git a/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DatabaseDTO.java b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DatabaseDTO.java new file mode 100644 index 0000000..2700e15 --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/DatabaseDTO.java @@ -0,0 +1,24 @@ +package com.huaxing.iot.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.pojo.entity + * @ClassName: DatabaseDTO + * @Author: swordmeng8@163.com + * @Description: 数据库建库接参对象 + * @Date: 2025/2/12 17:25 + * @Version: 1.0 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) +public class DatabaseDTO { + private String databaseName; + private String databaseComment; +} diff --git a/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableColumnDTO.java b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableColumnDTO.java new file mode 100644 index 0000000..a509ce5 --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableColumnDTO.java @@ -0,0 +1,41 @@ +package com.huaxing.iot.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.database.domain + * @ClassName: TableColumnDTO + * @Author: swordmeng8@163.com + * @Description: 表列DTO + * @Date: 2025/1/15 16:05 + * @Version: 1.0 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) +public class TableColumnDTO { + /** + * 列名 + */ + @NotEmpty(message = "列名不能为空") + private String columnName; + + /** + * 列类型 + */ + @NotEmpty(message = "列类型") + private String columnType; + + /** + * 列描述 + */ + private String columnDesc; + +} diff --git a/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableDTO.java b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableDTO.java new file mode 100644 index 0000000..60d801f --- /dev/null +++ b/data-storage-api/src/main/java/com/huaxing/iot/pojo/dto/TableDTO.java @@ -0,0 +1,99 @@ +package com.huaxing.iot.pojo.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.pojo.entity + * @ClassName: TableDTO + * @Author: swordmeng8@163.com + * @Description: 表结构接参类 + * @Date: 2025/2/12 17:40 + * @Version: 1.0 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) +public class TableDTO { + /** + * 数据库名 + */ + @NotEmpty(message = "数据库名不能为空") + private String databaseName; + + /** + * dfs表名 + */ + @NotEmpty(message = "Dfs表名不能为空") + private String dfsTableName; + + /** + * stream表名 + */ + @NotEmpty(message = "Stream表名不能为空") + private String streamTableName; + + /** + * 表描述 + */ + private String tableDesc; + + /** + * 表列信息 + */ + private List tableColumnList; + + /** + * 获取列名的拼接字符串并返回 + * + * @param tableColumnList + * @return String + */ + public String handleTableColumnName(List tableColumnList) { + return tableColumnList.stream().map(TableColumnDTO::getColumnName).reduce((a, b) -> a + "`" + b).get(); + } + + /** + * 获取列类型的拼接字符串并返回 + * + * @param tableColumnList + * @return String + */ + public String handleTableColumnType(List tableColumnList) { + return tableColumnList.stream().map(TableColumnDTO::getColumnType).reduce((a, b) -> a + "," + b).get(); + } + + /** + * 获取列与描述的拼接字符串并返回 + * + * @param tableColumnList + * @return String + */ + public String handleTableColumnDesc(List tableColumnList) { + StringBuilder columnDesc = new StringBuilder(); + // 获取列与描述的拼接字符串并返回 + Iterator iterator = tableColumnList.iterator(); + while (iterator.hasNext()) { + TableColumnDTO tableColumn = iterator.next(); + if (Objects.isNull(tableColumn.getColumnDesc())) { + columnDesc.append(tableColumn.getColumnName()).append(":").append("\"-\""); + } else { + columnDesc.append(tableColumn.getColumnName()).append(":\"").append(tableColumn.getColumnDesc()).append("\""); + } + if (iterator.hasNext()) { + columnDesc.append(","); + } + } + return columnDesc.toString(); + } + +} diff --git a/data-storage-api/src/main/java/com/huaxing/pojo/dto/DataQueryDTO.java b/data-storage-api/src/main/java/com/huaxing/pojo/dto/DataQueryDTO.java deleted file mode 100644 index 3c08bf6..0000000 --- a/data-storage-api/src/main/java/com/huaxing/pojo/dto/DataQueryDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.huaxing.pojo.dto; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.List; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.domain - * @ClassName: CommonDeviceControl - * @Author: swordmeng8@163.com - * @Description: 数据查询DTO - * @Date: 2025/1/10 18:11 - * @Version: 1.0 - */ - -@Accessors(chain = true) -@Data -public class DataQueryDTO { - // 表名 - private String tableName; - // 设备数据集 - private List tableColumns; - -} \ No newline at end of file diff --git a/data-storage-api/src/main/java/com/huaxing/pojo/dto/DatabaseDTO.java b/data-storage-api/src/main/java/com/huaxing/pojo/dto/DatabaseDTO.java deleted file mode 100644 index f0f22f1..0000000 --- a/data-storage-api/src/main/java/com/huaxing/pojo/dto/DatabaseDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.huaxing.pojo.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.pojo.entity - * @ClassName: DatabaseDTO - * @Author: swordmeng8@163.com - * @Description: 数据库建库接参对象 - * @Date: 2025/2/12 17:25 - * @Version: 1.0 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) -public class DatabaseDTO { - private String databaseName; - private String databaseComment; -} diff --git a/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableColumnDTO.java b/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableColumnDTO.java deleted file mode 100644 index a4deb8b..0000000 --- a/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableColumnDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.huaxing.pojo.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.database.domain - * @ClassName: TableColumnDTO - * @Author: swordmeng8@163.com - * @Description: 表列DTO - * @Date: 2025/1/15 16:05 - * @Version: 1.0 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) -public class TableColumnDTO { - /** - * 列名 - */ - @NotEmpty(message = "列名不能为空") - private String columnName; - - /** - * 列类型 - */ - @NotEmpty(message = "列类型") - private String columnType; - - /** - * 列描述 - */ - private String columnDesc; - -} diff --git a/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableDTO.java b/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableDTO.java deleted file mode 100644 index 232761c..0000000 --- a/data-storage-api/src/main/java/com/huaxing/pojo/dto/TableDTO.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.huaxing.pojo.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.pojo.entity - * @ClassName: TableDTO - * @Author: swordmeng8@163.com - * @Description: 表结构接参类 - * @Date: 2025/2/12 17:40 - * @Version: 1.0 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder(builderClassName = "Builder", buildMethodName = "build", toBuilder = true) -public class TableDTO { - /** - * 数据库名 - */ - @NotEmpty(message = "数据库名不能为空") - private String databaseName; - - /** - * dfs表名 - */ - @NotEmpty(message = "Dfs表名不能为空") - private String dfsTableName; - - /** - * stream表名 - */ - @NotEmpty(message = "Stream表名不能为空") - private String streamTableName; - - /** - * 表描述 - */ - private String tableDesc; - - /** - * 表列信息 - */ - private List tableColumnList; - - /** - * 获取列名的拼接字符串并返回 - * - * @param tableColumnList - * @return String - */ - public String handleTableColumnName(List tableColumnList) { - return tableColumnList.stream().map(TableColumnDTO::getColumnName).reduce((a, b) -> a + "`" + b).get(); - } - - /** - * 获取列类型的拼接字符串并返回 - * - * @param tableColumnList - * @return String - */ - public String handleTableColumnType(List tableColumnList) { - return tableColumnList.stream().map(TableColumnDTO::getColumnType).reduce((a, b) -> a + "," + b).get(); - } - - /** - * 获取列与描述的拼接字符串并返回 - * - * @param tableColumnList - * @return String - */ - public String handleTableColumnDesc(List tableColumnList) { - StringBuilder columnDesc = new StringBuilder(); - // 获取列与描述的拼接字符串并返回 - Iterator iterator = tableColumnList.iterator(); - while (iterator.hasNext()) { - TableColumnDTO tableColumn = iterator.next(); - if (Objects.isNull(tableColumn.getColumnDesc())) { - columnDesc.append(tableColumn.getColumnName()).append(":").append("\"-\""); - } else { - columnDesc.append(tableColumn.getColumnName()).append(":\"").append(tableColumn.getColumnDesc()).append("\""); - } - if (iterator.hasNext()) { - columnDesc.append(","); - } - } - return columnDesc.toString(); - } - -} diff --git a/data-storage/pom.xml b/data-storage/pom.xml index 6e3093e..97bab60 100644 --- a/data-storage/pom.xml +++ b/data-storage/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.huaxing + com.huaxing.iot data-bridge 1.0.0 @@ -12,8 +12,15 @@ data-storage jar + + + 1.8 + 1.8 + UTF-8 + + - + com.huaxing data-framework @@ -23,53 +30,47 @@ org.springframework.boot spring-boot-starter - 3.4.1 + 2.2.6.RELEASE - + com.baomidou mybatis-plus-core - 3.5.8 + 3.3.2 + org.aspectj aspectjweaver 1.9.22.1 - - com.fasterxml.jackson.core - jackson-databind - 2.18.2 - org.springframework spring-web - 6.2.1 + 5.3.20 + org.springframework.cloud spring-cloud-starter-openfeign 2.2.9.RELEASE - - com.huaxing - data-storage-api - 0.0.1-SNAPSHOT - compile - + jakarta.validation jakarta.validation-api 2.0.2 + org.projectlombok lombok 1.18.30 provided + com.huaxing data-storage-api @@ -78,20 +79,99 @@ + + + com.dolphindb + jdbc + 3.00.0.1 + + + + com.dolphindb + dolphindb-javaapi + 3.00.2.3 + + + org.slf4j + slf4j-simple + + + + + + + + org.springframework.integration + spring-integration-mqtt + 5.3.10.RELEASE + + + + + + org.mybatis + mybatis + 3.5.5 + + + org.mybatis + mybatis-spring + 2.1.2 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.3.2 + + + + + org.springframework.boot + spring-boot-starter-jdbc + 2.2.13.RELEASE + + + org.springframework.boot + spring-boot-starter-web + 2.2.13.RELEASE + + + + org.mybatis + mybatis-spring + 2.1.2 + compile + + + + org.springframework.cloud spring-cloud-dependencies - 2021.0.5 + Hoxton.SR12 pom import - - + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + \ No newline at end of file diff --git a/data-storage/src/main/java/com/huaxing/IotDataBridgeApplication.java b/data-storage/src/main/java/com/huaxing/IotDataBridgeApplication.java deleted file mode 100644 index 0c56ad7..0000000 --- a/data-storage/src/main/java/com/huaxing/IotDataBridgeApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.huaxing; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; - -@EnableFeignClients -@SpringBootApplication -public class IotDataBridgeApplication { - - public static void main(String[] args) { - SpringApplication.run(IotDataBridgeApplication.class, args); - String banner = - "===========================================\n" + - " 中联创信(山东)低碳科技有限公司 \n" + - " http://localhost:8088 \n" + - " iot-data-bridge started! \n" + - "===========================================\n"; - System.out.println(banner); - - } - -} diff --git a/data-storage/src/main/java/com/huaxing/TestDBConnection.java b/data-storage/src/main/java/com/huaxing/TestDBConnection.java deleted file mode 100644 index 89730fd..0000000 --- a/data-storage/src/main/java/com/huaxing/TestDBConnection.java +++ /dev/null @@ -1,25 +0,0 @@ -//package com.huaxing; -// -//import com.xxdb.DBConnection; -//import com.xxdb.data.Entity; -//import org.junit.Test; -// -//import java.io.IOException; -// -//public class TestDBConnection { -// // host -// private static final String HOST = "localhost"; -// // port -// private static final int PORT = 8848; -// -// DBConnection dbConnection = new DBConnection(); -// -// @Test -// public void testDBConnectAndRun() throws IOException { -// dbConnection.connect(HOST, PORT); -// dbConnection.login("admin", "123456", true); -// Entity entity = dbConnection.run("INSERT INTO ZbWaterMeterStream (WM_WFA_Unit, temperature, humidity, time, projectId, deviceId) VALUES ('m3', 5.6, 4.5, 1736388176712, '48', '0jZU2102_0806_0000')"); -// Entity entity2 = dbConnection.run("addColumn(loadTable(\"dfs://ZbDB\", \"ZbWaterMeterDfs\"),`test3,STRING)"); -// dbConnection.close(); -// } -//} \ No newline at end of file diff --git a/data-storage/src/main/java/com/huaxing/data/api/controller/DataQueryController.java b/data-storage/src/main/java/com/huaxing/data/api/controller/DataQueryController.java deleted file mode 100644 index 67321e3..0000000 --- a/data-storage/src/main/java/com/huaxing/data/api/controller/DataQueryController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.huaxing.data.api.controller; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.pojo.dto.DataQueryDTO; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.data.api.controller - * @ClassName: DataQueryController - * @Author: swordmeng8@163.com - * @Description: 数据查询控制器 - * @Date: 2025/1/20 16:02 - * @Version: 1.0 - */ -@RestController -@RequestMapping("/data") -public class DataQueryController { - - @PostMapping("/query") - public ResultVo> query(DataQueryDTO queryDTO) { - // TODO 编写你的查询业务逻辑。。。 - return ResultVo.ok(null); - } - - -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/controller/DatabaseController.java b/data-storage/src/main/java/com/huaxing/data/database/controller/DatabaseController.java deleted file mode 100644 index 4bc9837..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/controller/DatabaseController.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.huaxing.data.database.controller; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.data.database.service.IDatabaseService; -import com.huaxing.data.database.service.ITableStructureService; -import com.huaxing.pojo.dto.DatabaseDTO; -import com.huaxing.pojo.dto.TableDTO; -import lombok.AllArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 与 IDatabaseClientFeign 对应的 Controller - * - * @author YourName - */ -@RestController -@AllArgsConstructor -@RequestMapping("/api/database") -public class DatabaseController { - /** 表结构 */ - private final ITableStructureService tableStructureService; - /** 数据库 */ - private final IDatabaseService databaseService; - - /** - * 创建数据库 - * @param databaseDTO 数据库信息 - * @return ResultVo - */ - @PostMapping("/create") - public ResultVo createDatabase(@RequestBody @Validated DatabaseDTO databaseDTO) { - return databaseService.createDatabase(databaseDTO); - } - - /** - * 创建 dfs 表 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/create/dfs") - public ResultVo createDfsTable(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.createDfsTable(tableDTO); - } - - /** - * 创建 stream 表 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/create/stream") - public ResultVo createStreamTable(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.createStreamTable(tableDTO); - } - - /** - * 创建 dfs 和 stream 表并订阅 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/create/dfs/stream/subscribe") - public ResultVo createDfsAndStreamTableSubscribe(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.createDfsAndStreamTableSubscribe(tableDTO); - } - - /** - * 创建 dfs 和 stream 表不订阅 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/create/dfs/stream/unsubscribe") - public ResultVo createDfsAndStreamTableUnsubscribe(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.createDfsAndStreamTableUnsubscribe(tableDTO); - } - - /** - * 订阅流表 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/subscribe/stream") - public ResultVo subscribeStreamTable(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.subscribeStreamTable(tableDTO); - } - - /** - * 取消订阅流表 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/unsubscribe/stream") - public ResultVo unsubscribeStreamTable(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.unsubscribeStreamTable(tableDTO); - } - - /** - * 新增 dfs 表字段 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/add/dfs/columns") - public ResultVo addDfsColumns(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.addDfsColumns(tableDTO); - } - - /** - * 新增 stream 表字段 - * @param tableDTO 表信息 - * @return ResultVo - */ - @PostMapping("/table/add/stream/columns") - public ResultVo addStreamColumns(@RequestBody @Validated TableDTO tableDTO) { - return tableStructureService.addStreamColumns(tableDTO); - } -} \ No newline at end of file diff --git a/data-storage/src/main/java/com/huaxing/data/database/service/IDatabaseService.java b/data-storage/src/main/java/com/huaxing/data/database/service/IDatabaseService.java deleted file mode 100644 index 2564102..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/service/IDatabaseService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.huaxing.data.database.service; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.pojo.dto.DatabaseDTO; - -/** - * 数据库操作 - * @author 孟剑 - * @date 2025-02-12 13:47 - */ -public interface IDatabaseService { - - // 检查数据库是否存在 - boolean checkExistsDatabase(String databaseName); - - // 创建数据库 - ResultVo createDatabase(DatabaseDTO databaseDTO); -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/service/ITableStructureService.java b/data-storage/src/main/java/com/huaxing/data/database/service/ITableStructureService.java deleted file mode 100644 index af8486c..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/service/ITableStructureService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.huaxing.data.database.service; - - -import com.huaxing.common.result.ResultVo; -import com.huaxing.pojo.dto.TableDTO; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service - * @ClassName: ITableStructureService - * @Author: swordmeng8@163.com - * @Description: 表结构操作service - * @Date: 2025/1/13 11:02 - * @Version: 1.0 - */ -public interface ITableStructureService { - - // 添加dfs表多列 - ResultVo addDfsColumns(TableDTO tableDTO); - - // 添加Stream流表多列 - ResultVo addStreamColumns(TableDTO tableDTO); - - // 创建dfs表 - ResultVo createDfsTable(TableDTO tableDTO); - - // 创建Stream流表 - ResultVo createStreamTable(TableDTO tableDTO); - - // 取消订阅 - ResultVo unsubscribeStreamTable(TableDTO tableDTO); - - // 订阅流表 - ResultVo subscribeStreamTable(TableDTO tableDTO); - - // 判断表是否存在 - boolean dfsTableExistStatus(String databaseName, String dfsTableName); - - // 判断表是否存在 - boolean streamTableExistStatus(String streamTableName); - - // 创建dfs表和Stream表并订阅 - ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO); - - // 创建dfs表和Stream表不订阅 - ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO); -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/service/impl/DatabaseServiceImpl.java b/data-storage/src/main/java/com/huaxing/data/database/service/impl/DatabaseServiceImpl.java deleted file mode 100644 index 3530932..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/service/impl/DatabaseServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.huaxing.data.database.service.impl; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.data.database.service.IDatabaseService; -import com.huaxing.data.database.template.ISqlTemplateService; -import com.huaxing.dolphindb.base.CommonService; -import com.huaxing.pojo.dto.DatabaseDTO; -import com.xxdb.data.BasicBoolean; -import com.xxdb.data.Entity; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.data.database.service.impl - * @ClassName: DatabaseServiceImpl - * @Author: swordmeng8@163.com - * @Description: 数据库操作实现类 - * @Date: 2025/2/12 13:48 - * @Version: 1.0 - */ -@Slf4j -@Service -@AllArgsConstructor -public class DatabaseServiceImpl extends CommonService implements IDatabaseService { - - private final ISqlTemplateService tableTemplateService; - - /** - * @description: 检查数据库是否存在 - * @param databaseName 数据库名 - * @return com.huaxing.common.result.ResultVo - * @author swordmeng8@163.com - * @date 2025/2/12 13:48 - */ - @Override - public boolean checkExistsDatabase(String databaseName) { - Entity result = exec(tableTemplateService.checkExistsDatabaseTemplate(databaseName)); - return parseBoolResult(result); - } - - /** - * @description: 创建数据库 - * @param databaseName 数据库名 - * @return void - * @author swordmeng8@163.com - * @date 2025/2/12 13:48 - */ - @Override - public ResultVo createDatabase(DatabaseDTO databaseDTO) { - if (this.checkExistsDatabase(databaseDTO.getDatabaseName())) { - return ResultVo.fail("数据库已存在"); - } - // 创建数据库操作 - exec(tableTemplateService.createDatabaseTemplate(databaseDTO.getDatabaseName())); - return ResultVo.status(this.checkExistsDatabase(databaseDTO.getDatabaseName()), "创建数据库成功","创建数据库失败"); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/service/impl/TableStructureService.java b/data-storage/src/main/java/com/huaxing/data/database/service/impl/TableStructureService.java deleted file mode 100644 index 38d1669..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/service/impl/TableStructureService.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.huaxing.data.database.service.impl; - -import com.huaxing.common.result.ResultVo; -import com.huaxing.data.database.template.ISqlTemplateService; -import com.huaxing.dolphindb.base.CommonService; -import com.huaxing.data.database.service.ITableStructureService; -import com.huaxing.pojo.dto.TableDTO; -import com.xxdb.data.BasicBoolean; -import com.xxdb.data.Entity; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.impl - * @ClassName: TableStructureService - * @Author: swordmeng8@163.com - * @Description: 表结构操作service - * @Date: 2025/1/13 11:02 - * @Version: 1.0 - */ -@Service -@AllArgsConstructor -@SuppressWarnings("all") -public class TableStructureService extends CommonService implements ITableStructureService { - - final ISqlTemplateService tableTemplateService; - - /** - * 添加dfs表列 - * @param tableDTO - */ - @Override - public ResultVo addDfsColumns(TableDTO tableDTO) { - StringBuilder script = new StringBuilder(); - script.append("pt = loadTable(\"dfs://").append(tableDTO.getDatabaseName()).append("\", `").append(tableDTO.getDfsTableName()).append(");"); - tableDTO.getTableColumnList().forEach(columnItem -> { - script.append("alter table pt add ").append(columnItem.getColumnName()).append(" ").append(columnItem.getColumnType()).append(";"); - }); - exec(script.toString()); - return ResultVo.status(true); - } - - /** - * 添加流表列 - * @param tableDTO - */ - @Override - public ResultVo addStreamColumns(TableDTO tableDTO) { - StringBuilder streamScript = new StringBuilder(); - tableDTO.getTableColumnList().forEach(columnItem -> { - streamScript.append("addColumn(").append(tableDTO.getStreamTableName()).append(", `").append(columnItem.getColumnName()).append(",").append(columnItem.getColumnType()).append(");"); - }); - exec(streamScript.toString()); - return ResultVo.status(true); - } - - /** - * 创建dfs表 - * @param tableDTO - */ - @Override - public ResultVo createDfsTable(TableDTO tableDTO) { - exec(tableTemplateService.createDfsTableTemplate(tableDTO)); - Entity result = exec(tableTemplateService.checkExistsDfsTableTemplate(tableDTO.getDatabaseName(), tableDTO.getDfsTableName())); - return ResultVo.status(parseBoolResult(result), "创建dfs表成功","创建dfs表失败"); - } - - /** - * 创建流表 - * @param tableDTO - */ - @Override - public ResultVo createStreamTable(TableDTO tableDTO) { - exec(tableTemplateService.createStreamTableTemplate(tableDTO)); - Entity result = exec(tableTemplateService.checkExistsStreamTableTemplate(tableDTO.getStreamTableName())); - return ResultVo.status(parseBoolResult(result), "创建Stream表成功","创建Stream表失败"); - } - - /** - * 取消流表订阅 - * @param tableDTO - */ - @Override - public ResultVo unsubscribeStreamTable(TableDTO tableDTO) { - exec(tableTemplateService.unsubscribeStreamTableTemplate(tableDTO)); - return ResultVo.ok("取消流表订阅成功",null); - } - - /** - * 订阅流表 - * @param tableDTO - */ - @Override - public ResultVo subscribeStreamTable(TableDTO tableDTO) { - exec(tableTemplateService.subscribeStreamTableTemplate(tableDTO)); - return ResultVo.ok("流表订阅成功",null); - } - - /** - * 判断DFS表是否存在 - * @param databaseName,tableName - */ - @Override - public boolean dfsTableExistStatus(String databaseName, String tableName) { - boolean tableExist = false; - Entity result = exec(tableTemplateService.checkExistsDfsTableTemplate(databaseName, tableName)); - if (result instanceof BasicBoolean) { - tableExist = ((BasicBoolean) result).getBoolean(); - } - return tableExist; - } - - /** - * 判断Stream表是否存在 - * @param streamTableName - */ - @Override - public boolean streamTableExistStatus(String streamTableName) { - boolean tableExist = false; - Entity result = exec(tableTemplateService.checkExistsStreamTableTemplate(streamTableName)); - if (result instanceof BasicBoolean) { - tableExist = ((BasicBoolean) result).getBoolean(); - } - return tableExist; - } - - /** - * 创建dfs表和流表并订阅 - * @param tableDTO - */ - @Override - public ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO) { - exec(tableTemplateService.createDfsAndStreamTableSubscribe(tableDTO)); - boolean dfsStatus = dfsTableExistStatus(tableDTO.getDatabaseName(), tableDTO.getDfsTableName()); - boolean streamStatus = streamTableExistStatus(tableDTO.getStreamTableName()); - return ResultVo.status(dfsStatus && streamStatus, "创建dfs表和流表并订阅成功","创建dfs表和流表并订阅失败"); - } - - /** - * 创建dfs表和流表并取消订阅 - * @param tableDTO - */ - @Override - public ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { - exec(tableTemplateService.createDfsAndStreamTableUnsubscribe(tableDTO)); - boolean dfsStatus = dfsTableExistStatus(tableDTO.getDatabaseName(), tableDTO.getDfsTableName()); - boolean streamStatus = streamTableExistStatus(tableDTO.getStreamTableName()); - return ResultVo.status(dfsStatus && streamStatus, "创建dfs表和流表成功","创建dfs表和流表失败"); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/template/ISqlTemplateService.java b/data-storage/src/main/java/com/huaxing/data/database/template/ISqlTemplateService.java deleted file mode 100644 index ac7898e..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/template/ISqlTemplateService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.huaxing.data.database.template; - - -import com.huaxing.pojo.dto.TableDTO; - -/** - * 表创建模板 - * @author 孟剑 - * @date 2025-01-20 10:32 - */ -public interface ISqlTemplateService { - - // 检查数据库是否存在SQL模板 - String checkExistsDatabaseTemplate(String databaseName); - - // 创建数据库SQL模板 - String createDatabaseTemplate(String databaseName); - - // 创建dfs表模板 - String createDfsTableTemplate(TableDTO tableDTO); - - // 创建流表模板 - String createStreamTableTemplate(TableDTO tableDTO); - - // 取消订阅流表模板 - String unsubscribeStreamTableTemplate(TableDTO tableDTO); - - // 订阅流表模板 - String subscribeStreamTableTemplate(TableDTO tableDTO); - - // 创建dfs和流表订阅模板 - String createDfsAndStreamTableSubscribe(TableDTO tableDTO); - - // 创建dfs和流表取消订阅模板 - String createDfsAndStreamTableUnsubscribe(TableDTO tableDTO); - - // 检查表是否存在 - String checkExistsDfsTableTemplate(String databaseName, String tableName); - - // 检查流表是否存在 - String checkExistsStreamTableTemplate(String streamTableName); - - -} diff --git a/data-storage/src/main/java/com/huaxing/data/database/template/SqlTemplateServiceImpl.java b/data-storage/src/main/java/com/huaxing/data/database/template/SqlTemplateServiceImpl.java deleted file mode 100644 index 593d7d3..0000000 --- a/data-storage/src/main/java/com/huaxing/data/database/template/SqlTemplateServiceImpl.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.huaxing.data.database.template; - -import com.huaxing.dolphindb.base.CommonService; -import com.huaxing.pojo.dto.TableDTO; -import org.springframework.stereotype.Service; - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.data.database.service.impl - * @ClassName: TableTemplateServiceImpl - * @Author: swordmeng8@163.com - * @Description: 表操作模板 - * @Date: 2025/1/20 10:38 - * @Version: 1.0 - */ -@Service -public class SqlTemplateServiceImpl extends CommonService implements ISqlTemplateService { - - /** - * @Description 检查数据库是否存在 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String checkExistsDatabaseTemplate(String databaseName) { - return "existsDatabase(\"dfs://" + databaseName + "\")"; - } - - /** - * @Description 创建数据库模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String createDatabaseTemplate(String databaseName) { - return "database(directory=\"dfs://" + databaseName + "\", partitionType=VALUE, partitionScheme=2025.01M..2050.12M, engine='TSDB')"; - } - - /** - * @Description 创建 DFS 表模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String createDfsTableTemplate(TableDTO tableDTO) { - String sql = ""; - String colNames = tableDTO.handleTableColumnName(tableDTO.getTableColumnList()); - String colTypes = tableDTO.handleTableColumnType(tableDTO.getTableColumnList()); - String colDesc = tableDTO.handleTableColumnDesc(tableDTO.getTableColumnList()); - sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + - "ptName = \"" + tableDTO.getDfsTableName() + "Dfs\"\n" + - "def createPT(dbPath,ptName){\n" + - " db = database(dbPath)\n" + - " if (existsTable(dbPath, ptName)){\n" + - " pt = loadTable(db,ptName)\n" + - " return pt\n" + - " }\n" + - " else{\n" + - " colNames = `time`projectId`deviceId`" + colNames + "\n" + - " colTypes = [DATETIME,STRING,STRING," + colTypes + "]\n" + - " t = table(1:0, colNames, colTypes)\n" + - " pt = db.createPartitionedTable(table=t, tableName=ptName, partitionColumns=`time, sortColumns=`deviceId`time, keepDuplicates=LAST)\n" + - " setColumnComment(pt,{time:\"时间\",projectId:\"项目ID\",deviceId:\"设备编号\"," + colDesc + "})\n" + - " setTableComment(table=pt, comment=\"" + tableDTO.getTableDesc() + "\")\n" + - " return pt\n" + - " }\n" + - "}\n" + - "createPT(dbPath,ptName);"; - return sql; - } - - /** - * @Description 创建流表模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String createStreamTableTemplate(TableDTO tableDTO) { - String sql = ""; - String colNames = tableDTO.handleTableColumnName(tableDTO.getTableColumnList()); - String colTypes = tableDTO.handleTableColumnType(tableDTO.getTableColumnList()); -// String colDesc = tableDTO.handleTableColumnDesc(tableDTO.getTableColumnList()); - sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + - "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + - "def createST(stName){\n" + - " if(not existsStreamTable(stName)){\n" + - " colNames = `time`projectId`deviceId`" + colNames + "\n" + - " colTypes = [DATETIME,STRING,STRING,"+ colTypes +"]\n" + - " st = streamTable(150000:0, colNames, colTypes)\n" + - " enableTableShareAndPersistence(table=st, tableName=stName, retentionMinutes=10, cacheSize=100000, preCache=100000 )\n" + - " return st\n" + - " }\n" + - " else{\n" + - " return objByName(stName, true)\n" + - " }\n" + - "}\n" + - "createST(stName);"; - return sql; - } - - /** - * @Description 取消订阅流表模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String unsubscribeStreamTableTemplate(TableDTO tableDTO) { - String sql = ""; - sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + - "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + - "ptName = \"" + tableDTO.getStreamTableName() + "Dfs\"\n" + - "unsubscribeTable(tableName=stName, actionName=`" + tableDTO.getDfsTableName() + "ChgTime);"; - return sql; - } - - /** - * @Description 订阅流表模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String subscribeStreamTableTemplate(TableDTO tableDTO) { - String sql = ""; - sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + - "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + - "ptName = \"" + tableDTO.getStreamTableName() + "Dfs\"\n" + - "subscribeTable(tableName=stName, actionName=`" + tableDTO.getDfsTableName() + "ChgTime, offset=-1, handler=loadTable(dbPath,ptName), msgAsTable=true);"; - return sql; - } - - /** - * @Description 创建 DFS 和流表订阅模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String createDfsAndStreamTableSubscribe(TableDTO tableDTO) { - StringBuilder script = new StringBuilder(); - // 执行创建 DFS 表模板 - script.append(createDfsTableTemplate(tableDTO)); - // 执行创建流表模板 - script.append(createStreamTableTemplate(tableDTO)); - // 取消订阅流表模板 - script.append(unsubscribeStreamTableTemplate(tableDTO)); - // 订阅流表模板 - script.append(subscribeStreamTableTemplate(tableDTO)); - return script.toString(); - } - - /** - * @Description 创建 DFS 和流表取消订阅模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { - StringBuilder script = new StringBuilder(); - // 执行创建 DFS 表模板 - script.append(createDfsTableTemplate(tableDTO)); - // 执行创建流表模板 - script.append(createStreamTableTemplate(tableDTO)); - // 取消订阅流表模板 - script.append(unsubscribeStreamTableTemplate(tableDTO)); - return script.toString(); - } - - /** - * @Description 检查表是否存在模板 - * @Author swordmeng8@163.com - * @param databaseName - * @param tableName - * @Date 2025/1/20 10:46 - * @Version v1.0 - **/ - @Override - public String checkExistsDfsTableTemplate(String databaseName, String tableName) { - return String.format("existsTable(\"dfs://%s\", \"%s\")", databaseName, tableName); - } - - /** - * @Description 检查流表是否存在模板 - * @Author swordmeng8@163.com - * @Date 2025/1/20 10:46 - * @param streamTableName - * @return - */ - @Override - public String checkExistsStreamTableTemplate(String streamTableName) { - return String.format("existsStreamTable(\"%s\")", streamTableName); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/domain/DataAnalysisDTO.java b/data-storage/src/main/java/com/huaxing/data/storage/domain/DataAnalysisDTO.java deleted file mode 100644 index 59cf0a5..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/domain/DataAnalysisDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.huaxing.data.storage.domain; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.util.List; -import java.util.Map; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.domain - * @ClassName: CommonDeviceControl - * @Author: swordmeng8@163.com - * @Description: 设备入库数据接收实体 - * @Date: 2025/1/10 18:11 - * @Version: 1.0 - */ -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -@Data -public class DataAnalysisDTO { - - // 表名 - private String tableName; - - // 设备数据集 - private List> dataList; - -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryDfsMapper.java b/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryDfsMapper.java deleted file mode 100644 index b150bca..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryDfsMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.huaxing.data.storage.mapper; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; -import java.util.Map; - -/** - * ClassName: IDeviceDataQuery - * Description: 查询Dfs表数据 - * @author 孟剑 - * @date 2025-01-16 16:49 - */ -@Mapper -@SuppressWarnings("all") -public interface IDeviceDataQueryDfsMapper { - - @Select("${sql}") - List> selectList(String sql); -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryStreamMapper.java b/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryStreamMapper.java deleted file mode 100644 index 8cba124..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataQueryStreamMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.huaxing.data.storage.mapper; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; -import java.util.Map; - -/** - * ClassName: IDeviceDataQuery - * Description: 查询Stream表数据 - * @author 孟剑 - * @date 2025-01-16 16:49 - */ -@Mapper -@SuppressWarnings("all") -public interface IDeviceDataQueryStreamMapper { - - @Select("${sql}") - List> selectList(String sql); -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataStoredMapper.java b/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataStoredMapper.java deleted file mode 100644 index f1f7b82..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/mapper/IDeviceDataStoredMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.huaxing.data.storage.mapper; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; -import java.util.Map; - -/** - * @author 孟剑 - * @date 2025-01-16 15:23 - */ -@Mapper -@SuppressWarnings("all") -public interface IDeviceDataStoredMapper { - - @Select("${sql}") - List> selectList (String sql); - -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/IDataAnalysisService.java b/data-storage/src/main/java/com/huaxing/data/storage/service/IDataAnalysisService.java deleted file mode 100644 index bd099b2..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/IDataAnalysisService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.huaxing.data.storage.service; - -/** - * 入库数据解析服务 - * @author 孟剑 - * @date 2025-01-13 11:16 - */ -public interface IDataAnalysisService { - - // 解析入库数据 - void parseStoreData (String jsonData); - -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryDfsService.java b/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryDfsService.java deleted file mode 100644 index 20dbe11..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryDfsService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.huaxing.data.storage.service; - -import java.util.List; -import java.util.Map; - -/** - * @author 孟剑 - * @date 2025-01-16 16:45 - */ -public interface IDeviceDataQueryDfsService { - - /** - * 查询Dfs表 list数据 - * @param sql - * @return - */ - List> selectList(String sql); -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryStreamService.java b/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryStreamService.java deleted file mode 100644 index 232bf24..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataQueryStreamService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.huaxing.data.storage.service; - -import java.util.List; -import java.util.Map; - -/** - * @author 孟剑 - * @date 2025-01-16 16:45 - */ -public interface IDeviceDataQueryStreamService { - - /** - * 查询Dfs表 list数据 - * @param sql - * @return - */ - List> selectList(String sql); -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataStoredService.java b/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataStoredService.java deleted file mode 100644 index 387056e..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/IDeviceDataStoredService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.huaxing.data.storage.service; - -import com.huaxing.data.storage.domain.DataAnalysisDTO; - -/** - * ClassName: IDeviceDataStoredService - * Description: 设备采集入库与查询通用业务接口 - */ -public interface IDeviceDataStoredService { - - /** - * 设备采集入库 - * @param analysisDTO - */ - void insert(DataAnalysisDTO analysisDTO); - - void execute(String sql); - -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DataAnalysisService.java b/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DataAnalysisService.java deleted file mode 100644 index 9509643..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DataAnalysisService.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.huaxing.data.storage.service.impl; - -import com.huaxing.data.storage.domain.DataAnalysisDTO; -import com.huaxing.data.storage.service.IDataAnalysisService; -import com.huaxing.data.storage.service.IDeviceDataStoredService; -import com.huaxing.common.util.JacksonUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.impl - * @ClassName: DataAnalysisService - * @Author: swordmeng8@163.com - * @Description: 入库数据解析服务 - * @Date: 2025/1/13 11:16 - * @Version: 1.0 - */ -@Slf4j -@Service -public class DataAnalysisService implements IDataAnalysisService { - - final IDeviceDataStoredService dataStoredService; - - public DataAnalysisService(IDeviceDataStoredService dataStoredService) { - this.dataStoredService = dataStoredService; - } - - /** - * @author: swordmeng8@163.com - * @date: 2025/1/13 11:16 - * @desc: 解析入库数据 - * @param jsonData - * @return void - */ - @Override - public void parseStoreData(String jsonData) { - DataAnalysisDTO dataAnalysisDTO = JacksonUtil.strToObject(jsonData, DataAnalysisDTO.class); - log.info("入库数据解析完成"); - dataStoredService.insert(dataAnalysisDTO); - log.info("入库数据入库完成"); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java b/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java deleted file mode 100644 index 0df8687..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.huaxing.data.storage.service.impl; - -import com.huaxing.data.storage.mapper.IDeviceDataQueryDfsMapper; -import com.huaxing.data.storage.service.IDeviceDataQueryDfsService; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.impl - * @ClassName: DeviceDataQueryDfsServiceImpl - * @Author: swordmeng8@163.com - * @Description: 设备数据查询业务层 - * @Date: 2025/1/16 16:45 - * @Version: 1.0 - */ -@Service -public class DeviceDataQueryDfsServiceImpl implements IDeviceDataQueryDfsService { - // 构造器注入 - private final IDeviceDataQueryDfsMapper deviceDataQueryDfsMapper; - public DeviceDataQueryDfsServiceImpl(IDeviceDataQueryDfsMapper deviceDataQueryDfsMapper) { - this.deviceDataQueryDfsMapper = deviceDataQueryDfsMapper; - } - - - /** - * @author: swordmeng8@163.com - * @date: 2025/1/16 16:45 - * @desc: 查询数据 - * @param sql - * @return java.util.List> - */ - @Override - public List> selectList(String sql) { - return deviceDataQueryDfsMapper.selectList(sql); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java b/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java deleted file mode 100644 index 93cb09c..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.huaxing.data.storage.service.impl; - -import com.huaxing.data.storage.mapper.IDeviceDataQueryStreamMapper; -import com.huaxing.data.storage.service.IDeviceDataQueryStreamService; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Map; - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.service.impl - * @ClassName: DeviceDataQueryStreamServiceImpl - * @Author: swordmeng8@163.com - * @Description: 设备数据查询业务层 - * @Date: 2025/1/16 16:45 - * @Version: 1.0 - */ -@Service -public class DeviceDataQueryStreamServiceImpl implements IDeviceDataQueryStreamService { - // 构造器注入 - private final IDeviceDataQueryStreamMapper dataQueryStreamMapper; - public DeviceDataQueryStreamServiceImpl(IDeviceDataQueryStreamMapper dataQueryStreamMapper) { - this.dataQueryStreamMapper = dataQueryStreamMapper; - } - - - /** - * @author: swordmeng8@163.com - * @date: 2025/1/16 16:45 - * @desc: 查询数据 - * @param sql - * @return java.util.List> - */ - @Override - public List> selectList(String sql) { - return dataQueryStreamMapper.selectList(sql); - } -} diff --git a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataStoredServiceImpl.java b/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataStoredServiceImpl.java deleted file mode 100644 index 0a68e5c..0000000 --- a/data-storage/src/main/java/com/huaxing/data/storage/service/impl/DeviceDataStoredServiceImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.huaxing.data.storage.service.impl; - -import com.huaxing.data.storage.domain.DataAnalysisDTO; -import com.huaxing.data.storage.mapper.IDeviceDataStoredMapper; -import com.huaxing.data.storage.service.IDeviceDataStoredService; -import com.huaxing.dolphindb.base.CommonService; -import com.huaxing.common.util.JacksonUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - - -/** - * @ClassName DeviceDataStoredServiceImpl - * @Description 设备采集入库与查询服务实现类 - * @Author swordmeng8@163.com - * @Date 2024/12/2 18:59 - * @Version 1.0 - **/ -@Slf4j -@Service -@SuppressWarnings("all") -public class DeviceDataStoredServiceImpl extends CommonService implements IDeviceDataStoredService { - - final IDeviceDataStoredMapper deviceDataStoredMapper; - - public DeviceDataStoredServiceImpl(IDeviceDataStoredMapper deviceDataStoredMapper) { - this.deviceDataStoredMapper = deviceDataStoredMapper; - } - - /** - * 插入数据 - * @param dataAnalysis - */ - @Override - public void insert(DataAnalysisDTO dataAnalysis) { - String tableName = dataAnalysis.getTableName(); - dataAnalysis.getDataList().forEach(map -> { - log.info("入库数据:{}", JacksonUtil.objectStr(map)); - executeOnce(generateInsertStreamStatement(tableName, map)); - }); - } - - @Override - public void execute(String sql) { - executeOnce(sql); - } - - -} diff --git a/data-storage/src/main/java/com/huaxing/iot/IotDataBridgeApplication.java b/data-storage/src/main/java/com/huaxing/iot/IotDataBridgeApplication.java new file mode 100644 index 0000000..34c5b29 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/IotDataBridgeApplication.java @@ -0,0 +1,25 @@ +package com.huaxing.iot; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients +@MapperScan("com.huaxing.iot.data.storage.mapper") +@SpringBootApplication(scanBasePackages = {"com.huaxing.iot"}) +public class IotDataBridgeApplication { + + public static void main(String[] args) { + SpringApplication.run(IotDataBridgeApplication.class, args); + String banner = + "===========================================\n" + + " 中联创信(山东)低碳科技有限公司 \n" + + " http://localhost:8088 \n" + + " iot-data-bridge started! \n" + + "===========================================\n"; + System.out.println(banner); + + } + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/TestDBConnection.java b/data-storage/src/main/java/com/huaxing/iot/TestDBConnection.java new file mode 100644 index 0000000..89730fd --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/TestDBConnection.java @@ -0,0 +1,25 @@ +//package com.huaxing; +// +//import com.xxdb.DBConnection; +//import com.xxdb.data.Entity; +//import org.junit.Test; +// +//import java.io.IOException; +// +//public class TestDBConnection { +// // host +// private static final String HOST = "localhost"; +// // port +// private static final int PORT = 8848; +// +// DBConnection dbConnection = new DBConnection(); +// +// @Test +// public void testDBConnectAndRun() throws IOException { +// dbConnection.connect(HOST, PORT); +// dbConnection.login("admin", "123456", true); +// Entity entity = dbConnection.run("INSERT INTO ZbWaterMeterStream (WM_WFA_Unit, temperature, humidity, time, projectId, deviceId) VALUES ('m3', 5.6, 4.5, 1736388176712, '48', '0jZU2102_0806_0000')"); +// Entity entity2 = dbConnection.run("addColumn(loadTable(\"dfs://ZbDB\", \"ZbWaterMeterDfs\"),`test3,STRING)"); +// dbConnection.close(); +// } +//} \ No newline at end of file diff --git a/data-storage/src/main/java/com/huaxing/iot/data/api/controller/DataQueryController.java b/data-storage/src/main/java/com/huaxing/iot/data/api/controller/DataQueryController.java new file mode 100644 index 0000000..8f8c3a0 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/api/controller/DataQueryController.java @@ -0,0 +1,31 @@ +package com.huaxing.iot.data.api.controller; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.pojo.dto.DataQueryDTO; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.data.api.controller + * @ClassName: DataQueryController + * @Author: swordmeng8@163.com + * @Description: 数据查询控制器 + * @Date: 2025/1/20 16:02 + * @Version: 1.0 + */ +@RestController +@RequestMapping("/data") +public class DataQueryController { + + @PostMapping("/query") + public ResultVo> query(DataQueryDTO queryDTO) { + // TODO 编写你的查询业务逻辑。。。 + return ResultVo.ok(null); + } + + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/controller/DatabaseController.java b/data-storage/src/main/java/com/huaxing/iot/data/database/controller/DatabaseController.java new file mode 100644 index 0000000..ca87a24 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/controller/DatabaseController.java @@ -0,0 +1,118 @@ +package com.huaxing.iot.data.database.controller; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.data.database.service.IDatabaseService; +import com.huaxing.iot.data.database.service.ITableStructureService; +import com.huaxing.iot.pojo.dto.DatabaseDTO; +import com.huaxing.iot.pojo.dto.TableDTO; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 与 IDatabaseClientFeign 对应的 Controller + * + * @author YourName + */ +@RestController +@AllArgsConstructor +@RequestMapping("/api/database") +public class DatabaseController { + /** 表结构 */ + private final ITableStructureService tableStructureService; + /** 数据库 */ + private final IDatabaseService databaseService; + + /** + * 创建数据库 + * @param databaseDTO 数据库信息 + * @return ResultVo + */ + @PostMapping("/create") + public ResultVo createDatabase(@RequestBody @Validated DatabaseDTO databaseDTO) { + return databaseService.createDatabase(databaseDTO); + } + + /** + * 创建 dfs 表 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/create/dfs") + public ResultVo createDfsTable(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.createDfsTable(tableDTO); + } + + /** + * 创建 stream 表 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/create/stream") + public ResultVo createStreamTable(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.createStreamTable(tableDTO); + } + + /** + * 创建 dfs 和 stream 表并订阅 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/create/dfs/stream/subscribe") + public ResultVo createDfsAndStreamTableSubscribe(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.createDfsAndStreamTableSubscribe(tableDTO); + } + + /** + * 创建 dfs 和 stream 表不订阅 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/create/dfs/stream/unsubscribe") + public ResultVo createDfsAndStreamTableUnsubscribe(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.createDfsAndStreamTableUnsubscribe(tableDTO); + } + + /** + * 订阅流表 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/subscribe/stream") + public ResultVo subscribeStreamTable(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.subscribeStreamTable(tableDTO); + } + + /** + * 取消订阅流表 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/unsubscribe/stream") + public ResultVo unsubscribeStreamTable(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.unsubscribeStreamTable(tableDTO); + } + + /** + * 新增 dfs 表字段 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/add/dfs/columns") + public ResultVo addDfsColumns(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.addDfsColumns(tableDTO); + } + + /** + * 新增 stream 表字段 + * @param tableDTO 表信息 + * @return ResultVo + */ + @PostMapping("/table/add/stream/columns") + public ResultVo addStreamColumns(@RequestBody @Validated TableDTO tableDTO) { + return tableStructureService.addStreamColumns(tableDTO); + } +} \ No newline at end of file diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/service/IDatabaseService.java b/data-storage/src/main/java/com/huaxing/iot/data/database/service/IDatabaseService.java new file mode 100644 index 0000000..d2c7e0c --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/service/IDatabaseService.java @@ -0,0 +1,18 @@ +package com.huaxing.iot.data.database.service; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.pojo.dto.DatabaseDTO; + +/** + * 数据库操作 + * @author 孟剑 + * @date 2025-02-12 13:47 + */ +public interface IDatabaseService { + + // 检查数据库是否存在 + boolean checkExistsDatabase(String databaseName); + + // 创建数据库 + ResultVo createDatabase(DatabaseDTO databaseDTO); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/service/ITableStructureService.java b/data-storage/src/main/java/com/huaxing/iot/data/database/service/ITableStructureService.java new file mode 100644 index 0000000..49a530b --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/service/ITableStructureService.java @@ -0,0 +1,47 @@ +package com.huaxing.iot.data.database.service; + + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.pojo.dto.TableDTO; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service + * @ClassName: ITableStructureService + * @Author: swordmeng8@163.com + * @Description: 表结构操作service + * @Date: 2025/1/13 11:02 + * @Version: 1.0 + */ +public interface ITableStructureService { + + // 添加dfs表多列 + ResultVo addDfsColumns(TableDTO tableDTO); + + // 添加Stream流表多列 + ResultVo addStreamColumns(TableDTO tableDTO); + + // 创建dfs表 + ResultVo createDfsTable(TableDTO tableDTO); + + // 创建Stream流表 + ResultVo createStreamTable(TableDTO tableDTO); + + // 取消订阅 + ResultVo unsubscribeStreamTable(TableDTO tableDTO); + + // 订阅流表 + ResultVo subscribeStreamTable(TableDTO tableDTO); + + // 判断表是否存在 + boolean dfsTableExistStatus(String databaseName, String dfsTableName); + + // 判断表是否存在 + boolean streamTableExistStatus(String streamTableName); + + // 创建dfs表和Stream表并订阅 + ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO); + + // 创建dfs表和Stream表不订阅 + ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/DatabaseServiceImpl.java b/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/DatabaseServiceImpl.java new file mode 100644 index 0000000..a4fd544 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/DatabaseServiceImpl.java @@ -0,0 +1,58 @@ +package com.huaxing.iot.data.database.service.impl; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.data.database.service.IDatabaseService; +import com.huaxing.iot.data.database.template.ISqlTemplateService; +import com.huaxing.iot.dolphindb.base.CommonService; +import com.huaxing.iot.pojo.dto.DatabaseDTO; +import com.xxdb.data.Entity; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.data.database.service.impl + * @ClassName: DatabaseServiceImpl + * @Author: swordmeng8@163.com + * @Description: 数据库操作实现类 + * @Date: 2025/2/12 13:48 + * @Version: 1.0 + */ +@Slf4j +@Service +@AllArgsConstructor +public class DatabaseServiceImpl extends CommonService implements IDatabaseService { + + private final ISqlTemplateService tableTemplateService; + + /** + * @description: 检查数据库是否存在 + * @param databaseName 数据库名 + * @return com.huaxing.iot.result.common.ResultVo + * @author swordmeng8@163.com + * @date 2025/2/12 13:48 + */ + @Override + public boolean checkExistsDatabase(String databaseName) { + Entity result = exec(tableTemplateService.checkExistsDatabaseTemplate(databaseName)); + return parseBoolResult(result); + } + + /** + * @description: 创建数据库 + * @param databaseName 数据库名 + * @return void + * @author swordmeng8@163.com + * @date 2025/2/12 13:48 + */ + @Override + public ResultVo createDatabase(DatabaseDTO databaseDTO) { + if (this.checkExistsDatabase(databaseDTO.getDatabaseName())) { + return ResultVo.fail("数据库已存在"); + } + // 创建数据库操作 + exec(tableTemplateService.createDatabaseTemplate(databaseDTO.getDatabaseName())); + return ResultVo.status(this.checkExistsDatabase(databaseDTO.getDatabaseName()), "创建数据库成功","创建数据库失败"); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/TableStructureService.java b/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/TableStructureService.java new file mode 100644 index 0000000..d32c3b3 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/service/impl/TableStructureService.java @@ -0,0 +1,151 @@ +package com.huaxing.iot.data.database.service.impl; + +import com.huaxing.iot.common.result.ResultVo; +import com.huaxing.iot.data.database.template.ISqlTemplateService; +import com.huaxing.iot.dolphindb.base.CommonService; +import com.huaxing.iot.data.database.service.ITableStructureService; +import com.huaxing.iot.pojo.dto.TableDTO; +import com.xxdb.data.BasicBoolean; +import com.xxdb.data.Entity; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.impl + * @ClassName: TableStructureService + * @Author: swordmeng8@163.com + * @Description: 表结构操作service + * @Date: 2025/1/13 11:02 + * @Version: 1.0 + */ +@Service +@AllArgsConstructor +@SuppressWarnings("all") +public class TableStructureService extends CommonService implements ITableStructureService { + + final ISqlTemplateService tableTemplateService; + + /** + * 添加dfs表列 + * @param tableDTO + */ + @Override + public ResultVo addDfsColumns(TableDTO tableDTO) { + StringBuilder script = new StringBuilder(); + script.append("pt = loadTable(\"dfs://").append(tableDTO.getDatabaseName()).append("\", `").append(tableDTO.getDfsTableName()).append(");"); + tableDTO.getTableColumnList().forEach(columnItem -> { + script.append("alter table pt add ").append(columnItem.getColumnName()).append(" ").append(columnItem.getColumnType()).append(";"); + }); + exec(script.toString()); + return ResultVo.status(true); + } + + /** + * 添加流表列 + * @param tableDTO + */ + @Override + public ResultVo addStreamColumns(TableDTO tableDTO) { + StringBuilder streamScript = new StringBuilder(); + tableDTO.getTableColumnList().forEach(columnItem -> { + streamScript.append("addColumn(").append(tableDTO.getStreamTableName()).append(", `").append(columnItem.getColumnName()).append(",").append(columnItem.getColumnType()).append(");"); + }); + exec(streamScript.toString()); + return ResultVo.status(true); + } + + /** + * 创建dfs表 + * @param tableDTO + */ + @Override + public ResultVo createDfsTable(TableDTO tableDTO) { + exec(tableTemplateService.createDfsTableTemplate(tableDTO)); + Entity result = exec(tableTemplateService.checkExistsDfsTableTemplate(tableDTO.getDatabaseName(), tableDTO.getDfsTableName())); + return ResultVo.status(parseBoolResult(result), "创建dfs表成功","创建dfs表失败"); + } + + /** + * 创建流表 + * @param tableDTO + */ + @Override + public ResultVo createStreamTable(TableDTO tableDTO) { + exec(tableTemplateService.createStreamTableTemplate(tableDTO)); + Entity result = exec(tableTemplateService.checkExistsStreamTableTemplate(tableDTO.getStreamTableName())); + return ResultVo.status(parseBoolResult(result), "创建Stream表成功","创建Stream表失败"); + } + + /** + * 取消流表订阅 + * @param tableDTO + */ + @Override + public ResultVo unsubscribeStreamTable(TableDTO tableDTO) { + exec(tableTemplateService.unsubscribeStreamTableTemplate(tableDTO)); + return ResultVo.ok("取消流表订阅成功",null); + } + + /** + * 订阅流表 + * @param tableDTO + */ + @Override + public ResultVo subscribeStreamTable(TableDTO tableDTO) { + exec(tableTemplateService.subscribeStreamTableTemplate(tableDTO)); + return ResultVo.ok("流表订阅成功",null); + } + + /** + * 判断DFS表是否存在 + * @param databaseName,tableName + */ + @Override + public boolean dfsTableExistStatus(String databaseName, String tableName) { + boolean tableExist = false; + Entity result = exec(tableTemplateService.checkExistsDfsTableTemplate(databaseName, tableName)); + if (result instanceof BasicBoolean) { + tableExist = ((BasicBoolean) result).getBoolean(); + } + return tableExist; + } + + /** + * 判断Stream表是否存在 + * @param streamTableName + */ + @Override + public boolean streamTableExistStatus(String streamTableName) { + boolean tableExist = false; + Entity result = exec(tableTemplateService.checkExistsStreamTableTemplate(streamTableName)); + if (result instanceof BasicBoolean) { + tableExist = ((BasicBoolean) result).getBoolean(); + } + return tableExist; + } + + /** + * 创建dfs表和流表并订阅 + * @param tableDTO + */ + @Override + public ResultVo createDfsAndStreamTableSubscribe(TableDTO tableDTO) { + exec(tableTemplateService.createDfsAndStreamTableSubscribe(tableDTO)); + boolean dfsStatus = dfsTableExistStatus(tableDTO.getDatabaseName(), tableDTO.getDfsTableName()); + boolean streamStatus = streamTableExistStatus(tableDTO.getStreamTableName()); + return ResultVo.status(dfsStatus && streamStatus, "创建dfs表和流表并订阅成功","创建dfs表和流表并订阅失败"); + } + + /** + * 创建dfs表和流表并取消订阅 + * @param tableDTO + */ + @Override + public ResultVo createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { + exec(tableTemplateService.createDfsAndStreamTableUnsubscribe(tableDTO)); + boolean dfsStatus = dfsTableExistStatus(tableDTO.getDatabaseName(), tableDTO.getDfsTableName()); + boolean streamStatus = streamTableExistStatus(tableDTO.getStreamTableName()); + return ResultVo.status(dfsStatus && streamStatus, "创建dfs表和流表成功","创建dfs表和流表失败"); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/template/ISqlTemplateService.java b/data-storage/src/main/java/com/huaxing/iot/data/database/template/ISqlTemplateService.java new file mode 100644 index 0000000..42f1d35 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/template/ISqlTemplateService.java @@ -0,0 +1,44 @@ +package com.huaxing.iot.data.database.template; + + +import com.huaxing.iot.pojo.dto.TableDTO; + +/** + * 表创建模板 + * @author 孟剑 + * @date 2025-01-20 10:32 + */ +public interface ISqlTemplateService { + + // 检查数据库是否存在SQL模板 + String checkExistsDatabaseTemplate(String databaseName); + + // 创建数据库SQL模板 + String createDatabaseTemplate(String databaseName); + + // 创建dfs表模板 + String createDfsTableTemplate(TableDTO tableDTO); + + // 创建流表模板 + String createStreamTableTemplate(TableDTO tableDTO); + + // 取消订阅流表模板 + String unsubscribeStreamTableTemplate(TableDTO tableDTO); + + // 订阅流表模板 + String subscribeStreamTableTemplate(TableDTO tableDTO); + + // 创建dfs和流表订阅模板 + String createDfsAndStreamTableSubscribe(TableDTO tableDTO); + + // 创建dfs和流表取消订阅模板 + String createDfsAndStreamTableUnsubscribe(TableDTO tableDTO); + + // 检查表是否存在 + String checkExistsDfsTableTemplate(String databaseName, String tableName); + + // 检查流表是否存在 + String checkExistsStreamTableTemplate(String streamTableName); + + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/database/template/SqlTemplateServiceImpl.java b/data-storage/src/main/java/com/huaxing/iot/data/database/template/SqlTemplateServiceImpl.java new file mode 100644 index 0000000..ee6b2bd --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/database/template/SqlTemplateServiceImpl.java @@ -0,0 +1,199 @@ +package com.huaxing.iot.data.database.template; + +import com.huaxing.iot.dolphindb.base.CommonService; +import com.huaxing.iot.pojo.dto.TableDTO; +import org.springframework.stereotype.Service; + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.data.database.service.impl + * @ClassName: TableTemplateServiceImpl + * @Author: swordmeng8@163.com + * @Description: 表操作模板 + * @Date: 2025/1/20 10:38 + * @Version: 1.0 + */ +@Service +public class SqlTemplateServiceImpl extends CommonService implements ISqlTemplateService { + + /** + * @Description 检查数据库是否存在 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String checkExistsDatabaseTemplate(String databaseName) { + return "existsDatabase(\"dfs://" + databaseName + "\")"; + } + + /** + * @Description 创建数据库模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String createDatabaseTemplate(String databaseName) { + return "database(directory=\"dfs://" + databaseName + "\", partitionType=VALUE, partitionScheme=2025.01M..2050.12M, engine='TSDB')"; + } + + /** + * @Description 创建 DFS 表模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String createDfsTableTemplate(TableDTO tableDTO) { + String sql = ""; + String colNames = tableDTO.handleTableColumnName(tableDTO.getTableColumnList()); + String colTypes = tableDTO.handleTableColumnType(tableDTO.getTableColumnList()); + String colDesc = tableDTO.handleTableColumnDesc(tableDTO.getTableColumnList()); + sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + + "ptName = \"" + tableDTO.getDfsTableName() + "Dfs\"\n" + + "def createPT(dbPath,ptName){\n" + + " db = database(dbPath)\n" + + " if (existsTable(dbPath, ptName)){\n" + + " pt = loadTable(db,ptName)\n" + + " return pt\n" + + " }\n" + + " else{\n" + + " colNames = `time`projectId`deviceId`" + colNames + "\n" + + " colTypes = [DATETIME,STRING,STRING," + colTypes + "]\n" + + " t = table(1:0, colNames, colTypes)\n" + + " pt = db.createPartitionedTable(table=t, tableName=ptName, partitionColumns=`time, sortColumns=`deviceId`time, keepDuplicates=LAST)\n" + + " setColumnComment(pt,{time:\"时间\",projectId:\"项目ID\",deviceId:\"设备编号\"," + colDesc + "})\n" + + " setTableComment(table=pt, comment=\"" + tableDTO.getTableDesc() + "\")\n" + + " return pt\n" + + " }\n" + + "}\n" + + "createPT(dbPath,ptName);"; + return sql; + } + + /** + * @Description 创建流表模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String createStreamTableTemplate(TableDTO tableDTO) { + String sql = ""; + String colNames = tableDTO.handleTableColumnName(tableDTO.getTableColumnList()); + String colTypes = tableDTO.handleTableColumnType(tableDTO.getTableColumnList()); +// String colDesc = tableDTO.handleTableColumnDesc(tableDTO.getTableColumnList()); + sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + + "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + + "def createST(stName){\n" + + " if(not existsStreamTable(stName)){\n" + + " colNames = `time`projectId`deviceId`" + colNames + "\n" + + " colTypes = [DATETIME,STRING,STRING,"+ colTypes +"]\n" + + " st = streamTable(150000:0, colNames, colTypes)\n" + + " enableTableShareAndPersistence(table=st, tableName=stName, retentionMinutes=10, cacheSize=100000, preCache=100000 )\n" + + " return st\n" + + " }\n" + + " else{\n" + + " return objByName(stName, true)\n" + + " }\n" + + "}\n" + + "createST(stName);"; + return sql; + } + + /** + * @Description 取消订阅流表模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String unsubscribeStreamTableTemplate(TableDTO tableDTO) { + String sql = ""; + sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + + "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + + "ptName = \"" + tableDTO.getStreamTableName() + "Dfs\"\n" + + "unsubscribeTable(tableName=stName, actionName=`" + tableDTO.getDfsTableName() + "ChgTime);"; + return sql; + } + + /** + * @Description 订阅流表模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String subscribeStreamTableTemplate(TableDTO tableDTO) { + String sql = ""; + sql = "dbPath = \"dfs://" + tableDTO.getDatabaseName() + "\"\n" + + "stName = \"" + tableDTO.getDfsTableName() + "Stream\"\n" + + "ptName = \"" + tableDTO.getStreamTableName() + "Dfs\"\n" + + "subscribeTable(tableName=stName, actionName=`" + tableDTO.getDfsTableName() + "ChgTime, offset=-1, handler=loadTable(dbPath,ptName), msgAsTable=true);"; + return sql; + } + + /** + * @Description 创建 DFS 和流表订阅模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String createDfsAndStreamTableSubscribe(TableDTO tableDTO) { + StringBuilder script = new StringBuilder(); + // 执行创建 DFS 表模板 + script.append(createDfsTableTemplate(tableDTO)); + // 执行创建流表模板 + script.append(createStreamTableTemplate(tableDTO)); + // 取消订阅流表模板 + script.append(unsubscribeStreamTableTemplate(tableDTO)); + // 订阅流表模板 + script.append(subscribeStreamTableTemplate(tableDTO)); + return script.toString(); + } + + /** + * @Description 创建 DFS 和流表取消订阅模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String createDfsAndStreamTableUnsubscribe(TableDTO tableDTO) { + StringBuilder script = new StringBuilder(); + // 执行创建 DFS 表模板 + script.append(createDfsTableTemplate(tableDTO)); + // 执行创建流表模板 + script.append(createStreamTableTemplate(tableDTO)); + // 取消订阅流表模板 + script.append(unsubscribeStreamTableTemplate(tableDTO)); + return script.toString(); + } + + /** + * @Description 检查表是否存在模板 + * @Author swordmeng8@163.com + * @param databaseName + * @param tableName + * @Date 2025/1/20 10:46 + * @Version v1.0 + **/ + @Override + public String checkExistsDfsTableTemplate(String databaseName, String tableName) { + return String.format("existsTable(\"dfs://%s\", \"%s\")", databaseName, tableName); + } + + /** + * @Description 检查流表是否存在模板 + * @Author swordmeng8@163.com + * @Date 2025/1/20 10:46 + * @param streamTableName + * @return + */ + @Override + public String checkExistsStreamTableTemplate(String streamTableName) { + return String.format("existsStreamTable(\"%s\")", streamTableName); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/domain/DataAnalysisDTO.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/domain/DataAnalysisDTO.java new file mode 100644 index 0000000..07b1289 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/domain/DataAnalysisDTO.java @@ -0,0 +1,34 @@ +package com.huaxing.iot.data.storage.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.Map; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.domain + * @ClassName: CommonDeviceControl + * @Author: swordmeng8@163.com + * @Description: 设备入库数据接收实体 + * @Date: 2025/1/10 18:11 + * @Version: 1.0 + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Data +public class DataAnalysisDTO { + + // 表名 + private String tableName; + + // 设备数据集 + private List> dataList; + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryDfsMapper.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryDfsMapper.java new file mode 100644 index 0000000..ee79b14 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryDfsMapper.java @@ -0,0 +1,21 @@ +package com.huaxing.iot.data.storage.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * ClassName: IDeviceDataQuery + * Description: 查询Dfs表数据 + * @author 孟剑 + * @date 2025-01-16 16:49 + */ +@Mapper +@SuppressWarnings("all") +public interface IDeviceDataQueryDfsMapper { + + @Select("${sql}") + List> selectList(String sql); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryStreamMapper.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryStreamMapper.java new file mode 100644 index 0000000..d2ec550 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataQueryStreamMapper.java @@ -0,0 +1,21 @@ +package com.huaxing.iot.data.storage.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * ClassName: IDeviceDataQuery + * Description: 查询Stream表数据 + * @author 孟剑 + * @date 2025-01-16 16:49 + */ +@Mapper +@SuppressWarnings("all") +public interface IDeviceDataQueryStreamMapper { + + @Select("${sql}") + List> selectList(String sql); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataStoredMapper.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataStoredMapper.java new file mode 100644 index 0000000..41994ec --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/mapper/IDeviceDataStoredMapper.java @@ -0,0 +1,20 @@ +package com.huaxing.iot.data.storage.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * @author 孟剑 + * @date 2025-01-16 15:23 + */ +@Mapper +@SuppressWarnings("all") +public interface IDeviceDataStoredMapper { + + @Select("${sql}") + List> selectList (String sql); + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDataAnalysisService.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDataAnalysisService.java new file mode 100644 index 0000000..9af28d6 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDataAnalysisService.java @@ -0,0 +1,13 @@ +package com.huaxing.iot.data.storage.service; + +/** + * 入库数据解析服务 + * @author 孟剑 + * @date 2025-01-13 11:16 + */ +public interface IDataAnalysisService { + + // 解析入库数据 + void parseStoreData (String jsonData); + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryDfsService.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryDfsService.java new file mode 100644 index 0000000..6a59d5d --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryDfsService.java @@ -0,0 +1,18 @@ +package com.huaxing.iot.data.storage.service; + +import java.util.List; +import java.util.Map; + +/** + * @author 孟剑 + * @date 2025-01-16 16:45 + */ +public interface IDeviceDataQueryDfsService { + + /** + * 查询Dfs表 list数据 + * @param sql + * @return + */ + List> selectList(String sql); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryStreamService.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryStreamService.java new file mode 100644 index 0000000..c542f07 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataQueryStreamService.java @@ -0,0 +1,18 @@ +package com.huaxing.iot.data.storage.service; + +import java.util.List; +import java.util.Map; + +/** + * @author 孟剑 + * @date 2025-01-16 16:45 + */ +public interface IDeviceDataQueryStreamService { + + /** + * 查询Dfs表 list数据 + * @param sql + * @return + */ + List> selectList(String sql); +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataStoredService.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataStoredService.java new file mode 100644 index 0000000..c01143d --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/IDeviceDataStoredService.java @@ -0,0 +1,19 @@ +package com.huaxing.iot.data.storage.service; + +import com.huaxing.iot.data.storage.domain.DataAnalysisDTO; + +/** + * ClassName: IDeviceDataStoredService + * Description: 设备采集入库与查询通用业务接口 + */ +public interface IDeviceDataStoredService { + + /** + * 设备采集入库 + * @param analysisDTO + */ + void insert(DataAnalysisDTO analysisDTO); + + void execute(String sql); + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DataAnalysisService.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DataAnalysisService.java new file mode 100644 index 0000000..8bedf07 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DataAnalysisService.java @@ -0,0 +1,43 @@ +package com.huaxing.iot.data.storage.service.impl; + +import com.huaxing.iot.data.storage.domain.DataAnalysisDTO; +import com.huaxing.iot.data.storage.service.IDataAnalysisService; +import com.huaxing.iot.data.storage.service.IDeviceDataStoredService; +import com.huaxing.iot.common.util.JacksonUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.impl + * @ClassName: DataAnalysisService + * @Author: swordmeng8@163.com + * @Description: 入库数据解析服务 + * @Date: 2025/1/13 11:16 + * @Version: 1.0 + */ +@Slf4j +@Service +public class DataAnalysisService implements IDataAnalysisService { + + final IDeviceDataStoredService dataStoredService; + + public DataAnalysisService(IDeviceDataStoredService dataStoredService) { + this.dataStoredService = dataStoredService; + } + + /** + * @author: swordmeng8@163.com + * @date: 2025/1/13 11:16 + * @desc: 解析入库数据 + * @param jsonData + * @return void + */ + @Override + public void parseStoreData(String jsonData) { + DataAnalysisDTO dataAnalysisDTO = JacksonUtil.strToObject(jsonData, DataAnalysisDTO.class); + log.info("入库数据解析完成"); + dataStoredService.insert(dataAnalysisDTO); + log.info("入库数据入库完成"); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java new file mode 100644 index 0000000..6c8a5b4 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryDfsServiceImpl.java @@ -0,0 +1,39 @@ +package com.huaxing.iot.data.storage.service.impl; + +import com.huaxing.iot.data.storage.mapper.IDeviceDataQueryDfsMapper; +import com.huaxing.iot.data.storage.service.IDeviceDataQueryDfsService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.impl + * @ClassName: DeviceDataQueryDfsServiceImpl + * @Author: swordmeng8@163.com + * @Description: 设备数据查询业务层 + * @Date: 2025/1/16 16:45 + * @Version: 1.0 + */ +@Service +public class DeviceDataQueryDfsServiceImpl implements IDeviceDataQueryDfsService { + // 构造器注入 + private final IDeviceDataQueryDfsMapper deviceDataQueryDfsMapper; + public DeviceDataQueryDfsServiceImpl(IDeviceDataQueryDfsMapper deviceDataQueryDfsMapper) { + this.deviceDataQueryDfsMapper = deviceDataQueryDfsMapper; + } + + + /** + * @author: swordmeng8@163.com + * @date: 2025/1/16 16:45 + * @desc: 查询数据 + * @param sql + * @return java.util.List> + */ + @Override + public List> selectList(String sql) { + return deviceDataQueryDfsMapper.selectList(sql); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java new file mode 100644 index 0000000..6909d1f --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataQueryStreamServiceImpl.java @@ -0,0 +1,39 @@ +package com.huaxing.iot.data.storage.service.impl; + +import com.huaxing.iot.data.storage.mapper.IDeviceDataQueryStreamMapper; +import com.huaxing.iot.data.storage.service.IDeviceDataQueryStreamService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.impl + * @ClassName: DeviceDataQueryStreamServiceImpl + * @Author: swordmeng8@163.com + * @Description: 设备数据查询业务层 + * @Date: 2025/1/16 16:45 + * @Version: 1.0 + */ +@Service +public class DeviceDataQueryStreamServiceImpl implements IDeviceDataQueryStreamService { + // 构造器注入 + private final IDeviceDataQueryStreamMapper dataQueryStreamMapper; + public DeviceDataQueryStreamServiceImpl(IDeviceDataQueryStreamMapper dataQueryStreamMapper) { + this.dataQueryStreamMapper = dataQueryStreamMapper; + } + + + /** + * @author: swordmeng8@163.com + * @date: 2025/1/16 16:45 + * @desc: 查询数据 + * @param sql + * @return java.util.List> + */ + @Override + public List> selectList(String sql) { + return dataQueryStreamMapper.selectList(sql); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataStoredServiceImpl.java b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataStoredServiceImpl.java new file mode 100644 index 0000000..b0bb0cb --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/data/storage/service/impl/DeviceDataStoredServiceImpl.java @@ -0,0 +1,49 @@ +package com.huaxing.iot.data.storage.service.impl; + +import com.huaxing.iot.data.storage.domain.DataAnalysisDTO; +import com.huaxing.iot.data.storage.mapper.IDeviceDataStoredMapper; +import com.huaxing.iot.data.storage.service.IDeviceDataStoredService; +import com.huaxing.iot.dolphindb.base.CommonService; +import com.huaxing.iot.common.util.JacksonUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + + +/** + * @ClassName DeviceDataStoredServiceImpl + * @Description 设备采集入库与查询服务实现类 + * @Author swordmeng8@163.com + * @Date 2024/12/2 18:59 + * @Version 1.0 + **/ +@Slf4j +@Service +@SuppressWarnings("all") +public class DeviceDataStoredServiceImpl extends CommonService implements IDeviceDataStoredService { + + final IDeviceDataStoredMapper deviceDataStoredMapper; + + public DeviceDataStoredServiceImpl(IDeviceDataStoredMapper deviceDataStoredMapper) { + this.deviceDataStoredMapper = deviceDataStoredMapper; + } + + /** + * 插入数据 + * @param dataAnalysis + */ + @Override + public void insert(DataAnalysisDTO dataAnalysis) { + String tableName = dataAnalysis.getTableName(); + dataAnalysis.getDataList().forEach(map -> { + log.info("入库数据:{}", JacksonUtil.objectStr(map)); + executeOnce(generateInsertStreamStatement(tableName, map)); + }); + } + + @Override + public void execute(String sql) { + executeOnce(sql); + } + + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/abstracts/SqlConverterStatement.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/abstracts/SqlConverterStatement.java new file mode 100644 index 0000000..8bdcc94 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/abstracts/SqlConverterStatement.java @@ -0,0 +1,25 @@ +package com.huaxing.iot.dolphindb.abstracts; + +import java.util.Map; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.base + * @ClassName: SqlConverterStatement + * @Author: swordmeng8@163.com + * @Description: SQL转换语句 + * @Date: 2025/1/14 14:01 + * @Version: 1.0 + */ + +abstract public class SqlConverterStatement { + + /** + * 生成插入语句 + * @param tableName + * @param map + * @return + */ + public abstract String generateInsertStreamStatement(String tableName, Map map); + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/CommonService.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/CommonService.java new file mode 100644 index 0000000..bd1cf0d --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/CommonService.java @@ -0,0 +1,94 @@ +package com.huaxing.iot.dolphindb.base; + +import com.huaxing.iot.dolphindb.connection.AbstractDbConnector; +import com.xxdb.DBConnection; +import com.xxdb.data.BasicBoolean; +import com.xxdb.data.Entity; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.List; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.base + * @ClassName: CommonService + * @Author: swordmeng8@163.com + * @Description: 全局通用 + * @Date: 2025/1/15 15:19 + * @Version: 1.0 + */ +@Slf4j +public class CommonService extends SqlConverterStatementHandle { + + @Autowired + private AbstractDbConnector dbPool; + + /** + * 执行单条sql + * + * @param sql + */ + public void executeOnce(String sql) { + DBConnection connection = dbPool.getConnection(); + try { + connection.run(sql); + } catch (IOException e) { + log.error("AbstractDbConnector.executeOnce() Method执行异常:{}", e.getMessage()); + throw new RuntimeException(e); + } finally { + connection.close(); + } + } + + /** + * 执行单条sql bool返回值 + * + * @param sql + */ + public Entity exec(String sql) { + Entity result = null; + DBConnection connection = dbPool.getConnection(); + try { + result = connection.run(sql); + } catch (IOException e) { + log.error("AbstractDbConnector.exec() Method执行异常:{}", e.getMessage()); + throw new RuntimeException(e); + } finally { + connection.close(); + } + return result; + } + + /** + * 执行批量sql + * @param sqlList + */ + public void executeBatch(List sqlList) { + DBConnection connection = dbPool.getConnection(); + sqlList.forEach(sql -> { + try { + connection.run(sql); + } catch (IOException e) { + log.error("AbstractDbConnector.executeBatch() Method执行异常:{}", e.getMessage()); + throw new RuntimeException(e); + } + }); + connection.close(); + } + + /** + * 解析bool返回值 + * @param result + * @return + */ + public boolean parseBoolResult(Entity result) { + boolean dbExists = false; + if (result instanceof BasicBoolean) { + dbExists = ((BasicBoolean) result).getBoolean(); + } + return dbExists; + } + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/SqlConverterStatementHandle.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/SqlConverterStatementHandle.java new file mode 100644 index 0000000..e253ebe --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/base/SqlConverterStatementHandle.java @@ -0,0 +1,71 @@ +package com.huaxing.iot.dolphindb.base; + +import com.huaxing.iot.dolphindb.abstracts.SqlConverterStatement; + +import java.util.List; +import java.util.Map; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.service.base + * @ClassName: SqlConverterStatementHandle + * @Author: swordmeng8@163.com + * @Description: sql处理类 + * @Date: 2025/1/14 14:05 + * @Version: 1.0 + */ + +public class SqlConverterStatementHandle extends SqlConverterStatement { + + /** + * 生成插入语句 + * + * @param tableName 表名 + * @param map 键值对 + * @return 插入语句 + */ + @Override + public String generateInsertStreamStatement(String tableName, Map map) { + StringBuilder columnBuilder = new StringBuilder(); + StringBuilder valueBuilder = new StringBuilder(); + int index = 0; + for (Map.Entry entry : map.entrySet()) { + // 处理列名 + columnBuilder.append(entry.getKey()); + // 处理值 + if (entry.getValue() instanceof String) { + valueBuilder.append("'").append(entry.getValue()).append("'"); + } else if (entry.getValue() == null) { + valueBuilder.append("NULL"); + } else { + valueBuilder.append(entry.getValue()); + } + if (index < map.size() - 1) { + columnBuilder.append(", "); + valueBuilder.append(", "); + } + index++; + } + return "INSERT INTO " + tableName + " (" + columnBuilder + ") VALUES (" + valueBuilder + ")"; + } + + + /** + * 生成流表Stream查询语句 + * @param tableName + * @param columnNameList + * @return + */ + public String generateSelectStreamStatement(String tableName, List columnNameList) { + StringBuilder columnBuilder = new StringBuilder(); + if (columnNameList.isEmpty()) { + columnBuilder.append(" * "); + } else { + columnNameList.forEach(columnName -> columnBuilder.append(columnName).append(", ")); + } + return "SELECT " + columnBuilder.toString() + " FROM " + tableName; + } + + + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbConfiguration.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbConfiguration.java new file mode 100644 index 0000000..84971ff --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbConfiguration.java @@ -0,0 +1,69 @@ +package com.huaxing.iot.dolphindb.config; + +import com.xxdb.*; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + + +/** + * mqtt全局相关配置信息 + */ +@Slf4j +@Setter +@Getter +@Configuration +@ConfigurationProperties("dolphindb") +@SuppressWarnings("all") +public class DolphinDbConfiguration extends SimpleDBConnectionPoolConfig { + + /** + * 连接地址 dfs://ZBdb + */ + private String dbPath; + /** + * 主机名 + */ + private String host; + /** + * 端口号 + */ + private int port; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 连接池初始化大小 + */ + private int initPoolSize; + /** + * 表示连接池中最小连接数,正整数,默认值为 5 + */ + private boolean minimumPoolSize; + /** + * 是否开启高可用 + */ + private boolean enableHighAvailability; + + /** + * 创建连接池配置初始化方法 + * @return SimpleDBConnectionPoolConfig + */ + public SimpleDBConnectionPoolConfig loadConfig() { + SimpleDBConnectionPoolConfig config = new SimpleDBConnectionPoolConfig(); + config.setHostName(host); + config.setPort(port); + config.setUserId(username); + config.setPassword(password); + config.setInitialPoolSize(initPoolSize); + config.setEnableHighAvailability(enableHighAvailability); + return config; + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbPoolConfiguration.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbPoolConfiguration.java new file mode 100644 index 0000000..2cd499f --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/config/DolphinDbPoolConfiguration.java @@ -0,0 +1,32 @@ +package com.huaxing.iot.dolphindb.config; + +import com.xxdb.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.dolphindb.config + * @ClassName: DbClient + * @Author: swordmeng8@163.com + * @Description: 数据库客户端 + * @Date: 2025/1/15 9:58 + * @Version: 1.0 + */ +@Slf4j +@Configuration +public class DolphinDbPoolConfiguration extends SimpleDBConnectionPool { + + public DBConnection dbConn = null; + + /** + * 构造方法 + * @param dbConfiguration + */ + + public DolphinDbPoolConfiguration(DolphinDbConfiguration dbConfiguration) { + super(dbConfiguration.loadConfig()); + this.dbConn = super.getConnection(); + log.info("【初始化 DolphinDbPool 连接池】"); + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/AbstractDbConnector.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/AbstractDbConnector.java new file mode 100644 index 0000000..cb73266 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/AbstractDbConnector.java @@ -0,0 +1,26 @@ +package com.huaxing.iot.dolphindb.connection; + +import com.xxdb.DBConnection; +import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.dolphindb.connection + * @ClassName: DbConnector + * @Author: swordmeng8@163.com + * @Description: dolphindb 连接器 + * @Date: 2025/1/13 14:29 + * @Version: 1.0 + */ +@Accessors(chain = true) +@Slf4j +public abstract class AbstractDbConnector { + + /** + * 连接 dolphindb + */ + public abstract DBConnection getConnection(); + + +} diff --git a/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/DbConnectorHelper.java b/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/DbConnectorHelper.java new file mode 100644 index 0000000..4f4de56 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/dolphindb/connection/DbConnectorHelper.java @@ -0,0 +1,42 @@ +package com.huaxing.iot.dolphindb.connection; + +import com.huaxing.iot.dolphindb.config.DolphinDbConfiguration; +import com.huaxing.iot.dolphindb.config.DolphinDbPoolConfiguration; +import com.xxdb.DBConnection; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.dolphindb.connection + * @ClassName: DbConnectorHelper + * @Author: swordmeng8@163.com + * @Description: 数据库处理器 + * @Date: 2025/1/13 17:53 + * @Version: 1.0 + */ + +@Component +@SuppressWarnings("all") +public class DbConnectorHelper extends AbstractDbConnector { + + final DolphinDbPoolConfiguration dbPool; + final DolphinDbConfiguration dbConfiguration; + public DbConnectorHelper(DolphinDbConfiguration dbConfiguration, DolphinDbPoolConfiguration dbPool) { + this.dbConfiguration = dbConfiguration; + this.dbPool = dbPool; + } + + + + /** + * 获取数据库连接 + * @return DBConnection + */ + @PostConstruct + @Override + public DBConnection getConnection() { + return dbPool.dbConn; + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/mqtt/MqttMessageConsumer.java b/data-storage/src/main/java/com/huaxing/iot/mqtt/MqttMessageConsumer.java new file mode 100644 index 0000000..a7a569f --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/mqtt/MqttMessageConsumer.java @@ -0,0 +1,70 @@ +package com.huaxing.iot.mqtt; + +import com.huaxing.iot.data.storage.service.IDataAnalysisService; +import com.huaxing.iot.mqtt.processor.MqttMessageReceiver; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.integration.mqtt.support.MqttHeaders; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.MessagingException; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CompletableFuture; + + +/** + * @ProjectName: data-bridge + * @Package: com.huaxing.data.mqtt + * @ClassName: MqttMessageConsumer + * @Author: swordmeng8@163.com + * @Description: 消费者 + * @Date: 2025/1/20 11:23 + * @Version: 1.0 + */ +@Slf4j +@Component +@AllArgsConstructor +public class MqttMessageConsumer extends MqttMessageReceiver { + + /** + * 数据处理服务 + */ + final IDataAnalysisService analysisService; +// public MqttMessageConsumer(IDataAnalysisService analysisService) { +// this.analysisService = analysisService; +// } + + + @Override + @Async("handleMessage") + public void handleMessage(Message message) throws MessagingException { + try { + MessageHeaders headers = message.getHeaders(); + String topic = String.valueOf(headers.get(MqttHeaders.RECEIVED_TOPIC)); + log.info("[获取到的消息的topic]:{} ", topic); + String payload = (String) message.getPayload(); + log.info("[获取到的消息的payload]:{} ", payload); + // 数据库入库消息 + if (topic.contains("iot/test1/in-storage")) { + log.info("接收到iot/test1/in-storage的消息啦,快去处理"); + CompletableFuture.runAsync(() -> { + analysisService.parseStoreData(payload); + }); + } else if (topic.contains("table-update/")){ + // TODO 更新数据表字段 + log.info("接收到table-update/的消息啦,快去处理"); + + + } else if (topic.contains("table-add/")){ + // TODO 创建Dfs/Stream数据表 建立订阅关系 + log.info("接收到table-add/的消息啦,快去处理"); + + + } + } catch (Exception e) { + log.error(e.toString()); + } + } +} diff --git a/data-storage/src/main/java/com/huaxing/iot/test/TestController.java b/data-storage/src/main/java/com/huaxing/iot/test/TestController.java new file mode 100644 index 0000000..6352159 --- /dev/null +++ b/data-storage/src/main/java/com/huaxing/iot/test/TestController.java @@ -0,0 +1,225 @@ +package com.huaxing.iot.test; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * @ProjectName: iot-data-bridge + * @Package: com.huaxing.data.storage.controller + * @ClassName: TestController + * @Author: swordmeng8@163.com + * @Description: 测试controller + * @Date: 2025/1/15 17:08 + * @Version: 1.0 + */ +@Slf4j +@RestController +@RequestMapping("/test") +@SuppressWarnings("all") +public class TestController { + +// @Autowired +// private MqttMessageSender messageSender; +// final IDeviceDataStoredService dataStoredService; +// final IDeviceDataQueryDfsService dataQueryDfsService; +// final IDeviceDataQueryStreamService dataQueryStreamService; +// final ITableStructureService tableStructureService; +// +// +// // =============================================== 测试构造器 ====================================== +// public TestController(IDeviceDataStoredService dataStoredService, IDeviceDataQueryDfsService dataQueryDfsService, IDeviceDataQueryStreamService dataQueryStreamService, ITableStructureService tableStructureService, ISqlTemplateService tableTemplateService) { +// this.dataStoredService = dataStoredService; +// this.dataQueryDfsService = dataQueryDfsService; +// this.dataQueryStreamService = dataQueryStreamService; +// this.tableStructureService = tableStructureService; +// } +// +// +// // =============================================== 测试插入数据 ====================================== +// +// /** +// * 测试数据插入 +// */ +// @GetMapping(value = "/testInsert") +// public void testInsert() { +// String tableName = "MyTable2Stream"; +// String sql = "INSERT INTO " + tableName + " (time, projectId, deviceId, test) VALUES (2025.01.11 00:00:00,'48', '0jZU2102_0806_0011', 'testVal')"; +// dataStoredService.execute(sql); +// log.info("SUCCESS"); +// } +// +// // =============================================== 测试Dfs表查询 ====================================== +// +// /** +// * 测试Dfs表查询 +// */ +// @GetMapping(value = "/testSelectDfs") +// public ResultVo>> testSelectDfs() { +// String dbPath = "dfs://ZbDB"; +// String sql = String.format("select * from loadTable('%s','%s')", dbPath, "ZbWaterMeter1Dfs"); +// return ResultVo.ok(dataQueryDfsService.selectList(sql)); +// } +// +// // =============================================== 测试订阅流表查询 ====================================== +// +// /** +// * 测试订阅流表查询 +// */ +// @GetMapping(value = "/testSelectStream") +// public ResultVo>> testSelectStream() { +// String sql = "select * from WaterMeterTset1Stream"; +// return ResultVo.ok(dataQueryStreamService.selectList(sql)); +// } +// +// // =============================================== 给指定的流表增加列字段 ====================================== +// +// /** +// * 测试给指定的流表增加列字段 +// */ +// @GetMapping(value = "/testStreamAddColumn") +// public void testStreamAddColumn() { +// String tableName = "WaterMeterTsetStream"; +// String columnName = "test"; +// String columnType = "STRING"; +// String columnDesc = "test"; +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setTableName(tableName); +// tableDTO.setTableColumnList(Arrays.asList(new TableColumnDTO(columnName, columnType, columnDesc))); +// try { +// tableStructureService.addStreamColumns(tableDTO); +// log.info("SUCCESS"); +// } catch (Exception e) { +// log.error("FAIL"); +// e.printStackTrace(); +// } +// } +// +// // =============================================== 给指定的Dfs表增加列字段 ====================================== +// /** +// * 测试给指定的Dfs表增加列字段 +// */ +// @GetMapping(value = "/testDfsAddColumn") +// public void testDfsAddColumn() { +// String tableName = "WaterMeterTsetDfs"; +// String columnName = "test"; +// String columnType = "STRING"; +// String columnDesc = "test描述"; +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setTableName(tableName); +// tableDTO.setTableColumnList(Arrays.asList(new TableColumnDTO(columnName, columnType, columnDesc))); +// try { +// tableStructureService.addDfsColumns(tableDTO); +// log.info("SUCCESS"); +// } catch (Exception e) { +// log.error("FAIL"); +// e.printStackTrace(); +// } +// } +// +// +// // ===================================== mqtt消息发送-测试数据入库 START ============================== +// +// /** +// * 测试发送mqtt消息 +// */ +// @GetMapping(value = "/testSendMessage") +// public void testSendMessage() { +// for (int i = 0; i < 2; i++) { +// List> dataList = new ArrayList<>(); +// dataList.add(handleMapByIndex(i)); +// DataAnalysisDTO dataAnalysisDTO = DataAnalysisDTO.builder().tableName( "WaterMeterTsetStream").dataList(dataList).build(); +// messageSender.send("iot/test1/in-storage", JacksonUtil.objectStr(dataAnalysisDTO)); +// } +// } +// +// /** +// * 根据索引生成测试数据 +// * @param index 索引 +// * @return +// */ +// private Map handleMapByIndex(int index) { +// Map map = new HashMap<>(); +// map.put("time", new Date()); +// map.put("projectId", "0jZU2102"); +// map.put("deviceId", "0jZU2102_0806_0011"); +// map.put("WM_WFA", 124.656 + index); +// map.put("WM_WFA_Unit", "m³"); +// map.put("test", "test"); +// return map; +// } +// +// // =============================================== 创建Dfs表 Stream流表 取消订阅 添加订阅 创建 ====================================== +// +// /** +// * 测试创建Dfs表 +// */ +// @GetMapping(value = "/testCreateDfsTable") +// public void testCreateDfsTable() { +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setDatabaseName("ZbDB"); +// tableDTO.setTableName("Test1"); +// List tableColumnList = new ArrayList<>(); +// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); +// tableColumnList.add(new TableColumnDTO("test1", "STRING","test1")); +// tableColumnList.add(new TableColumnDTO("test2", "STRING","test2")); +// tableDTO.setTableColumnList(tableColumnList); +// tableStructureService.createDfsTable(tableDTO); +// } +// +// /** +// * 测试创建流表 +// */ +// @GetMapping(value = "/testCreateStreamTable") +// public void testCreateStreamTable() { +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setDatabaseName("ZbDB"); +// tableDTO.setTableName("Test1"); +// List tableColumnList = new ArrayList<>(); +// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); +// tableColumnList.add(new TableColumnDTO("test1", "STRING","test1")); +// tableColumnList.add(new TableColumnDTO("test2", "STRING","test2")); +// tableDTO.setTableColumnList(tableColumnList); +// tableStructureService.createStreamTable(tableDTO); +// } +// +// /** +// * 取消订阅流表 +// */ +// @GetMapping(value = "/testUnsubscribeStreamTable") +// public void testUnsubscribeStreamTable() { +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setDatabaseName("ZbDB"); +// tableDTO.setTableName("Test1"); +// tableStructureService.unsubscribeStreamTable(tableDTO); +// } +// +// /** +// * 订阅流表 +// */ +// @GetMapping(value = "/testSubscribeStreamTable") +// public void testSubscribeStreamTable() { +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setDatabaseName("ZbDB"); +// tableDTO.setTableName("Test1"); +// tableStructureService.subscribeStreamTable(tableDTO); +// } +// +// /** +// * 创建Dfs和Stream表并添加订阅 +// */ +// @GetMapping(value = "/testCreateDfsAndStreamTableSubscribe") +// public void testCreateDfsAndStreamTableSubscribe() { +// TableDTO tableDTO = new TableDTO(); +// tableDTO.setDatabaseName("ZbDB"); +// tableDTO.setTableName("MyTe2"); +// tableDTO.setTableDesc("MyTe2测试表"); +// List tableColumnList = new ArrayList<>(); +// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); +// tableDTO.setTableColumnList(tableColumnList); +// tableStructureService.createDfsAndStreamTableSubscribe(tableDTO); +// } + + +} diff --git a/data-storage/src/main/java/com/huaxing/mqtt/MqttMessageConsumer.java b/data-storage/src/main/java/com/huaxing/mqtt/MqttMessageConsumer.java deleted file mode 100644 index a6dcd46..0000000 --- a/data-storage/src/main/java/com/huaxing/mqtt/MqttMessageConsumer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.huaxing.mqtt; - -import com.huaxing.data.storage.service.IDataAnalysisService; -import com.huaxing.mqtt.processor.MqttMessageReceiver; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.integration.mqtt.support.MqttHeaders; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; -import org.springframework.messaging.MessagingException; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import java.util.concurrent.CompletableFuture; - - -/** - * @ProjectName: data-bridge - * @Package: com.huaxing.data.mqtt - * @ClassName: MqttMessageConsumer - * @Author: swordmeng8@163.com - * @Description: 消费者 - * @Date: 2025/1/20 11:23 - * @Version: 1.0 - */ -@Slf4j -@Component -@AllArgsConstructor -public class MqttMessageConsumer extends MqttMessageReceiver { - - /** - * 数据处理服务 - */ - final IDataAnalysisService analysisService; -// public MqttMessageConsumer(IDataAnalysisService analysisService) { -// this.analysisService = analysisService; -// } - - - @Override - @Async("handleMessage") - public void handleMessage(Message message) throws MessagingException { - try { - MessageHeaders headers = message.getHeaders(); - String topic = String.valueOf(headers.get(MqttHeaders.RECEIVED_TOPIC)); - log.info("[获取到的消息的topic]:{} ", topic); - String payload = (String) message.getPayload(); - log.info("[获取到的消息的payload]:{} ", payload); - // 数据库入库消息 - if (topic.contains("iot/test1/in-storage")) { - log.info("接收到iot/test1/in-storage的消息啦,快去处理"); - CompletableFuture.runAsync(() -> { - analysisService.parseStoreData(payload); - }); - } else if (topic.contains("table-update/")){ - // TODO 更新数据表字段 - log.info("接收到table-update/的消息啦,快去处理"); - - - } else if (topic.contains("table-add/")){ - // TODO 创建Dfs/Stream数据表 建立订阅关系 - log.info("接收到table-add/的消息啦,快去处理"); - - - } - } catch (Exception e) { - log.error(e.toString()); - } - } -} diff --git a/data-storage/src/main/java/com/huaxing/test/TestController.java b/data-storage/src/main/java/com/huaxing/test/TestController.java deleted file mode 100644 index 9555f7d..0000000 --- a/data-storage/src/main/java/com/huaxing/test/TestController.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.huaxing.test; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -/** - * @ProjectName: iot-data-bridge - * @Package: com.huaxing.data.storage.controller - * @ClassName: TestController - * @Author: swordmeng8@163.com - * @Description: 测试controller - * @Date: 2025/1/15 17:08 - * @Version: 1.0 - */ -@Slf4j -@RestController -@RequestMapping("/test") -@SuppressWarnings("all") -public class TestController { - -// @Autowired -// private MqttMessageSender messageSender; -// final IDeviceDataStoredService dataStoredService; -// final IDeviceDataQueryDfsService dataQueryDfsService; -// final IDeviceDataQueryStreamService dataQueryStreamService; -// final ITableStructureService tableStructureService; -// -// -// // =============================================== 测试构造器 ====================================== -// public TestController(IDeviceDataStoredService dataStoredService, IDeviceDataQueryDfsService dataQueryDfsService, IDeviceDataQueryStreamService dataQueryStreamService, ITableStructureService tableStructureService, ISqlTemplateService tableTemplateService) { -// this.dataStoredService = dataStoredService; -// this.dataQueryDfsService = dataQueryDfsService; -// this.dataQueryStreamService = dataQueryStreamService; -// this.tableStructureService = tableStructureService; -// } -// -// -// // =============================================== 测试插入数据 ====================================== -// -// /** -// * 测试数据插入 -// */ -// @GetMapping(value = "/testInsert") -// public void testInsert() { -// String tableName = "MyTable2Stream"; -// String sql = "INSERT INTO " + tableName + " (time, projectId, deviceId, test) VALUES (2025.01.11 00:00:00,'48', '0jZU2102_0806_0011', 'testVal')"; -// dataStoredService.execute(sql); -// log.info("SUCCESS"); -// } -// -// // =============================================== 测试Dfs表查询 ====================================== -// -// /** -// * 测试Dfs表查询 -// */ -// @GetMapping(value = "/testSelectDfs") -// public ResultVo>> testSelectDfs() { -// String dbPath = "dfs://ZbDB"; -// String sql = String.format("select * from loadTable('%s','%s')", dbPath, "ZbWaterMeter1Dfs"); -// return ResultVo.ok(dataQueryDfsService.selectList(sql)); -// } -// -// // =============================================== 测试订阅流表查询 ====================================== -// -// /** -// * 测试订阅流表查询 -// */ -// @GetMapping(value = "/testSelectStream") -// public ResultVo>> testSelectStream() { -// String sql = "select * from WaterMeterTset1Stream"; -// return ResultVo.ok(dataQueryStreamService.selectList(sql)); -// } -// -// // =============================================== 给指定的流表增加列字段 ====================================== -// -// /** -// * 测试给指定的流表增加列字段 -// */ -// @GetMapping(value = "/testStreamAddColumn") -// public void testStreamAddColumn() { -// String tableName = "WaterMeterTsetStream"; -// String columnName = "test"; -// String columnType = "STRING"; -// String columnDesc = "test"; -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setTableName(tableName); -// tableDTO.setTableColumnList(Arrays.asList(new TableColumnDTO(columnName, columnType, columnDesc))); -// try { -// tableStructureService.addStreamColumns(tableDTO); -// log.info("SUCCESS"); -// } catch (Exception e) { -// log.error("FAIL"); -// e.printStackTrace(); -// } -// } -// -// // =============================================== 给指定的Dfs表增加列字段 ====================================== -// /** -// * 测试给指定的Dfs表增加列字段 -// */ -// @GetMapping(value = "/testDfsAddColumn") -// public void testDfsAddColumn() { -// String tableName = "WaterMeterTsetDfs"; -// String columnName = "test"; -// String columnType = "STRING"; -// String columnDesc = "test描述"; -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setTableName(tableName); -// tableDTO.setTableColumnList(Arrays.asList(new TableColumnDTO(columnName, columnType, columnDesc))); -// try { -// tableStructureService.addDfsColumns(tableDTO); -// log.info("SUCCESS"); -// } catch (Exception e) { -// log.error("FAIL"); -// e.printStackTrace(); -// } -// } -// -// -// // ===================================== mqtt消息发送-测试数据入库 START ============================== -// -// /** -// * 测试发送mqtt消息 -// */ -// @GetMapping(value = "/testSendMessage") -// public void testSendMessage() { -// for (int i = 0; i < 2; i++) { -// List> dataList = new ArrayList<>(); -// dataList.add(handleMapByIndex(i)); -// DataAnalysisDTO dataAnalysisDTO = DataAnalysisDTO.builder().tableName( "WaterMeterTsetStream").dataList(dataList).build(); -// messageSender.send("iot/test1/in-storage", JacksonUtil.objectStr(dataAnalysisDTO)); -// } -// } -// -// /** -// * 根据索引生成测试数据 -// * @param index 索引 -// * @return -// */ -// private Map handleMapByIndex(int index) { -// Map map = new HashMap<>(); -// map.put("time", new Date()); -// map.put("projectId", "0jZU2102"); -// map.put("deviceId", "0jZU2102_0806_0011"); -// map.put("WM_WFA", 124.656 + index); -// map.put("WM_WFA_Unit", "m³"); -// map.put("test", "test"); -// return map; -// } -// -// // =============================================== 创建Dfs表 Stream流表 取消订阅 添加订阅 创建 ====================================== -// -// /** -// * 测试创建Dfs表 -// */ -// @GetMapping(value = "/testCreateDfsTable") -// public void testCreateDfsTable() { -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setDatabaseName("ZbDB"); -// tableDTO.setTableName("Test1"); -// List tableColumnList = new ArrayList<>(); -// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); -// tableColumnList.add(new TableColumnDTO("test1", "STRING","test1")); -// tableColumnList.add(new TableColumnDTO("test2", "STRING","test2")); -// tableDTO.setTableColumnList(tableColumnList); -// tableStructureService.createDfsTable(tableDTO); -// } -// -// /** -// * 测试创建流表 -// */ -// @GetMapping(value = "/testCreateStreamTable") -// public void testCreateStreamTable() { -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setDatabaseName("ZbDB"); -// tableDTO.setTableName("Test1"); -// List tableColumnList = new ArrayList<>(); -// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); -// tableColumnList.add(new TableColumnDTO("test1", "STRING","test1")); -// tableColumnList.add(new TableColumnDTO("test2", "STRING","test2")); -// tableDTO.setTableColumnList(tableColumnList); -// tableStructureService.createStreamTable(tableDTO); -// } -// -// /** -// * 取消订阅流表 -// */ -// @GetMapping(value = "/testUnsubscribeStreamTable") -// public void testUnsubscribeStreamTable() { -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setDatabaseName("ZbDB"); -// tableDTO.setTableName("Test1"); -// tableStructureService.unsubscribeStreamTable(tableDTO); -// } -// -// /** -// * 订阅流表 -// */ -// @GetMapping(value = "/testSubscribeStreamTable") -// public void testSubscribeStreamTable() { -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setDatabaseName("ZbDB"); -// tableDTO.setTableName("Test1"); -// tableStructureService.subscribeStreamTable(tableDTO); -// } -// -// /** -// * 创建Dfs和Stream表并添加订阅 -// */ -// @GetMapping(value = "/testCreateDfsAndStreamTableSubscribe") -// public void testCreateDfsAndStreamTableSubscribe() { -// TableDTO tableDTO = new TableDTO(); -// tableDTO.setDatabaseName("ZbDB"); -// tableDTO.setTableName("MyTe2"); -// tableDTO.setTableDesc("MyTe2测试表"); -// List tableColumnList = new ArrayList<>(); -// tableColumnList.add(new TableColumnDTO("test", "STRING", "test")); -// tableDTO.setTableColumnList(tableColumnList); -// tableStructureService.createDfsAndStreamTableSubscribe(tableDTO); -// } - - -} diff --git a/data-storage/src/main/resources/application-dev.yaml b/data-storage/src/main/resources/application-dev.yaml index afcb30d..ae5e8c8 100644 --- a/data-storage/src/main/resources/application-dev.yaml +++ b/data-storage/src/main/resources/application-dev.yaml @@ -10,6 +10,7 @@ spring: main: lazy-initialization: false + mybatis: mapper-locations: classpath:com/huaxing/**/mapper/*.xml type-aliases-package: com.huaxing.**.entity @@ -41,5 +42,5 @@ dolphindb: username: admin password: 123456 init-pool-size: 10 - minimum-pool-size: 5 + minimum-pool-size: true enable-high-availability: false \ No newline at end of file diff --git a/data-storage/src/main/resources/application-uat.yaml b/data-storage/src/main/resources/application-uat.yaml new file mode 100644 index 0000000..ae5e8c8 --- /dev/null +++ b/data-storage/src/main/resources/application-uat.yaml @@ -0,0 +1,46 @@ +spring: + application: + name: iot-data-bridge + version: 1.0.0 + datasource: + url: jdbc:dolphindb://localhost:8848?databasePath=dfs://ZbDB + username: admin + password: 123456 + driver-class-name: com.dolphindb.jdbc.Driver + main: + lazy-initialization: false + + +mybatis: + mapper-locations: classpath:com/huaxing/**/mapper/*.xml + type-aliases-package: com.huaxing.**.entity + configuration: + map-underscore-to-camel-case: true + sql-session-factory: + data-source: ${spring.datasource} + sql-session-template: + executor-type: BATCH + sql-session-factory-ref: sqlSessionFactory + +mqtt: + username: admin + password: 123456 + host-url: tcp://8.130.65.74:1883 + client-id: iot + timeout: 100 + keepalive: 100 + completion-timeout: 5000 + qos: 1 + default-topic: iot/data/# + topics: + - iot/test1/# + - iot/test2/# + +dolphindb: + host: 127.0.0.1 + port: 8848 + username: admin + password: 123456 + init-pool-size: 10 + minimum-pool-size: true + enable-high-availability: false \ No newline at end of file diff --git a/data-storage/src/main/resources/application.yaml b/data-storage/src/main/resources/application.yaml index 10af456..91033c2 100644 --- a/data-storage/src/main/resources/application.yaml +++ b/data-storage/src/main/resources/application.yaml @@ -4,4 +4,8 @@ server: context-path: /api spring: profiles: - active: dev \ No newline at end of file + active: dev + +feign: + hystrix: + enabled: true \ No newline at end of file diff --git a/data-storage/src/main/resources/mapper/DeviceDataStoredStream.xml b/data-storage/src/main/resources/mapper/DeviceDataStoredStream.xml index 1d6785a..377daba 100644 --- a/data-storage/src/main/resources/mapper/DeviceDataStoredStream.xml +++ b/data-storage/src/main/resources/mapper/DeviceDataStoredStream.xml @@ -1,6 +1,6 @@ - + diff --git a/pom.xml b/pom.xml index c56b010..b7184f0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.huaxing + com.huaxing.iot data-bridge 1.0.0 pom data-bridge data-bridge + + + 1.8 + 1.8 + UTF-8 + + data-framework data-storage @@ -17,8 +24,6 @@ - - org.json json @@ -28,7 +33,7 @@ org.projectlombok lombok - RELEASE + 1.18.30 provided @@ -40,7 +45,7 @@ org.mybatis mybatis-spring - 3.0.4 + 2.1.2 @@ -49,75 +54,86 @@ 2.3.2 + org.springframework.boot spring-boot-starter-jdbc - 3.4.1 + 2.2.13.RELEASE org.springframework.boot spring-boot-starter-web - 3.4.1 + 2.2.13.RELEASE - + + + org.mybatis mybatis-spring - 3.0.4 + 2.1.2 compile - + + + + + org.slf4j + slf4j-api + 1.7.36 + + - com.dolphindb - jdbc - 3.00.0.1 + ch.qos.logback + logback-classic + 1.2.11 - + + - com.dolphindb - dolphindb-javaapi - 3.00.2.3 + com.fasterxml.jackson.core + jackson-databind + 2.11.4 + + + + + - - - - - - - - - - - - - - - - - - - org.springframework.integration - spring-integration-mqtt - 6.4.1 - - + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + org.apache.maven.plugins maven-antrun-plugin @@ -125,7 +141,4 @@ - - - - + \ No newline at end of file