diff --git a/hw-api/hw-api-tdengine/pom.xml b/hw-api/hw-api-tdengine/pom.xml
new file mode 100644
index 00000000..ddeb7b41
--- /dev/null
+++ b/hw-api/hw-api-tdengine/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ com.hw
+ hw-api
+ 3.6.3
+
+ 4.0.0
+
+ hw-api-tdengine
+
+
+ hw-api-tdengine时序数据库模块api
+
+
+
+
+
+
+ com.hw
+ hw-common-core
+
+
+
+
+
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/RemoteTdEngineService.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/RemoteTdEngineService.java
new file mode 100644
index 00000000..54a7acaa
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/RemoteTdEngineService.java
@@ -0,0 +1,66 @@
+package com.hw.tdengine.api;
+
+import com.hw.common.core.constant.SecurityConstants;
+import com.hw.common.core.constant.ServiceNameConstants;
+import com.hw.common.core.domain.R;
+import com.hw.common.core.validated.tdengine.AddTdSTableColumn;
+import com.hw.common.core.validated.tdengine.InsertTdTable;
+import com.hw.tdengine.api.domain.*;
+import com.hw.tdengine.api.factory.RemoteTdEngineFallbackFactory;
+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;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(contextId = "remoteTdEngineService", value = ServiceNameConstants.TDENGINE_SERVICE, fallbackFactory = RemoteTdEngineFallbackFactory.class)
+public interface RemoteTdEngineService {
+
+ @PostMapping("/tdengine/createDatabase")
+ R> createDataBase(@RequestBody String databaseName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/createSuperTable")
+ R> createSuperTable(@Validated @RequestBody TdSuperTableVo tdSuperTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/createTable")
+ R> createTable(@Validated @RequestBody TdTableVo tdTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/addSuperTableColumn")
+ R> addSuperTableColumn(@Validated(AddTdSTableColumn.class) @RequestBody TdSuperTableVo tdSuperTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/modifySuperTableColumn")
+ R> modifySuperTableColumn(@Validated(AddTdSTableColumn.class) @RequestBody TdSuperTableVo tdSuperTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/dropSuperTableColumn")
+ R> dropColumnForSuperTable(@Validated(AddTdSTableColumn.class) @RequestBody TdSuperTableVo tdSuperTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/alterTableTag")
+ public R> alterTableTag(@Validated @RequestBody AlterTagVo alterTagVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/insertTable")
+ R> insertTable(@Validated(InsertTdTable.class) @RequestBody TdTableVo tdTableVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getLatestData")
+ R> getLatestData(@Validated @RequestBody TdSelectDto tdSelectDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getLatestDataByTags")
+ R>> getLatestDataByTags(@Validated @RequestBody TdSuperTableSelectVo tdSuperTableSelectVo, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getHistoryData")
+ R getHistoryData(@Validated @RequestBody TdHistorySelectDto tdHistorySelectDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getCountOfHistoryData")
+ R> getCountOfHistoryData(@Validated @RequestBody TdHistorySelectDto tdHistorySelectDto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getOnlineDevicesGroupByDay")
+ R> getOnlineDevicesGroupByDay(@Validated @RequestBody DeviceStatus queryDeviceStatus, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getLastOnlineDevices")
+ R> getLastOnlineDevices(@Validated @RequestBody DeviceStatus queryDeviceStatus, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/tdengine/getDeviceStatusList")
+ R>> getDeviceStatusList(@Validated @RequestBody DeviceStatus queryDeviceStatus, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/AlterTagVo.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/AlterTagVo.java
new file mode 100644
index 00000000..e893304f
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/AlterTagVo.java
@@ -0,0 +1,33 @@
+package com.hw.tdengine.api.domain;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 更新子表tag实体类
+ * @ClassName: AlterTagVo
+ * @Author : xins
+ * @Date :2023-08-30 10:56
+ * @Version :1.0
+ */
+@Data
+public class AlterTagVo {
+
+ //数据库名称
+ @NotBlank(message="databaseName cannot be empty")
+ private String databaseName;
+
+ //子表名称
+ @NotBlank(message="tableName cannot be empty")
+ private String tableName;
+
+ @NotBlank(message="tagName cannot be empty")
+ private String tagName;
+
+ @NotNull(message="tagValue cannot be empty")
+ private Object tagValue;
+
+
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/DeviceStatus.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/DeviceStatus.java
new file mode 100644
index 00000000..b0aefc48
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/DeviceStatus.java
@@ -0,0 +1,104 @@
+package com.hw.tdengine.api.domain;
+
+import com.hw.common.core.web.domain.BaseEntity;
+
+import java.util.List;
+
+/**
+ * @Description: 设备状态对象
+ * @ClassName: DeviceStatus
+ * @Author : xins
+ * @Date :2023-09-05 11:35
+ * @Version :1.0
+ */
+public class DeviceStatus extends BaseEntity {
+
+ private Long ts;
+
+ private Long deviceId;
+
+ private String deviceCode;
+
+ private Integer deviceType;
+
+ private Integer onlineStatus;
+
+ private Long sceneId;
+
+ private Long startTime;
+ private Long endTime;
+
+ private List schemaFields;
+
+ public Long getTs() {
+ return ts;
+ }
+
+ public void setTs(Long ts) {
+ this.ts = ts;
+ }
+
+ public Long getDeviceId() {
+ return deviceId;
+ }
+
+ public void setDeviceId(Long deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ public String getDeviceCode() {
+ return deviceCode;
+ }
+
+ public void setDeviceCode(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public Integer getDeviceType() {
+ return deviceType;
+ }
+
+ public void setDeviceType(Integer deviceType) {
+ this.deviceType = deviceType;
+ }
+
+ public Integer getOnlineStatus() {
+ return onlineStatus;
+ }
+
+ public void setOnlineStatus(Integer onlineStatus) {
+ this.onlineStatus = onlineStatus;
+ }
+
+ public Long getSceneId() {
+ return sceneId;
+ }
+
+ public void setSceneId(Long sceneId) {
+ this.sceneId = sceneId;
+ }
+
+ public Long getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Long startTime) {
+ this.startTime = startTime;
+ }
+
+ public Long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Long endTime) {
+ this.endTime = endTime;
+ }
+
+ public List getSchemaFields() {
+ return schemaFields;
+ }
+
+ public void setSchemaFields(List schemaFields) {
+ this.schemaFields = schemaFields;
+ }
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdField.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdField.java
new file mode 100644
index 00000000..683f6f1e
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdField.java
@@ -0,0 +1,40 @@
+package com.hw.tdengine.api.domain;
+
+import com.hw.common.core.enums.DataTypeEnums;
+import lombok.Data;
+
+/**
+ * @ClassName: TdField
+ * @Author : xins
+ * @Date :2023-08-28 9:47
+ * @Description: TDengine filed,建表的字段实体类
+ * @Version :1.0
+ */
+@Data
+public class TdField {
+
+ //字段名称
+ private String fieldName;
+
+ //字段值
+ private Object fieldValue;
+
+ //字段数据类型code
+ private Integer dataTypeCode;
+
+ //字段数据类型
+ private String dataType;
+
+ //字段字节大小
+ private Integer size;
+
+ public TdField() {
+ }
+
+ public TdField(String fieldName, Integer dataTypeCode, Integer size) {
+ this.fieldName = fieldName;
+ this.dataTypeCode = dataTypeCode;
+ this.dataType = DataTypeEnums.dataCodeTypeMap.get(dataTypeCode);
+ this.size = size;
+ }
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdFieldVo.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdFieldVo.java
new file mode 100644
index 00000000..2f73e9fb
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdFieldVo.java
@@ -0,0 +1,68 @@
+package com.hw.tdengine.api.domain;
+
+import com.hw.common.core.enums.DataTypeEnums;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: Tdengine 创建表的字段实体类
+ * @ClassName: TdFieldsVo
+ * @Author : xins
+ * @Date :2023-08-28 14:34
+ * @Version :1.0
+ */
+public class TdFieldVo {
+ private static final long serialVersionUID = 1L;
+
+ private String fieldName;
+
+ private String dataType;
+
+ private Integer size;
+
+
+ public TdFieldVo(String fieldName, Integer dataTypeCode, Integer size) {
+ this.fieldName = fieldName;
+ this.dataType = DataTypeEnums.dataCodeTypeMap.get(dataTypeCode);
+ this.size = size;
+ }
+
+ /**
+ * @description 将TdFields转换为创建表的实体类TdFieldsVo,主要是datatype转换
+ * @author xins
+ * @date 2023-08-28 14:40
+ * @param field
+ * @return TdFieldsVo
+ */
+ public static TdFieldVo convertField(@Validated TdField field) throws SQLException {
+ String fieldName = field.getFieldName();
+ Integer datatypeCode = field.getDataTypeCode();
+ Integer size = field.getSize();
+ if(StringUtils.isBlank(fieldName) || datatypeCode == null){
+ throw new SQLException("fieldname and datatype cannot be null");
+ }
+ TdFieldVo tdFieldsVo = new TdFieldVo(fieldName, datatypeCode, size);
+ return tdFieldsVo;
+ }
+
+
+ /**
+ * @description 批量转换创建表的字段
+ * @author xins
+ * @date 2023-08-28 14:58
+ * @param fieldList
+ * @return List
+ */
+ public static List batchConvertFields(List fieldList) throws SQLException{
+ List tdFieldsVoList = new ArrayList<>();
+ for(TdField tdField:fieldList){
+ tdFieldsVoList.add(convertField(tdField));
+ }
+ return tdFieldsVoList;
+ }
+
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdHistorySelectDto.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdHistorySelectDto.java
new file mode 100644
index 00000000..bc3f756d
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdHistorySelectDto.java
@@ -0,0 +1,40 @@
+package com.hw.tdengine.api.domain;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class TdHistorySelectDto {
+
+ //数据库名称
+ @NotBlank(message="databaseName cannot be empty")
+ private String databaseName;
+
+ //子表名称
+ @NotBlank(message="tableName cannot be empty")
+ private String tableName;
+
+ //控制输出条数
+ private int limit;
+
+ //指定从第几条之后输出(例如:limit 2,5,输出第3行到第7行的数据)
+ private int offset;
+
+ /**
+ * 第一个字段,数据类型必须是timestamp
+ */
+ private String firstFieldName;
+
+ //过滤条件:开始时间
+ private long startTime;
+
+ //过滤条件:结束时间
+ private long endTime;
+
+ //排序字段
+ private String orderByFieldName;
+
+ //排序方式
+ private String sort;
+}
diff --git a/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdReturnDataVo.java b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdReturnDataVo.java
new file mode 100644
index 00000000..07a01ddd
--- /dev/null
+++ b/hw-api/hw-api-tdengine/src/main/java/com/hw/tdengine/api/domain/TdReturnDataVo.java
@@ -0,0 +1,13 @@
+package com.hw.tdengine.api.domain;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class TdReturnDataVo {
+
+ public int count;
+ public List