diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java new file mode 100644 index 0000000..6a3da3e --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java @@ -0,0 +1,39 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.crypto.digest.DigestUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Date; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; +import org.springnewfiber.dataadapter.xf.mapper.DataAccessRecordMapper; + +/** + * 数据接入记录 服务实现类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Service +@DS("access") +public class DataAccessRecordService extends ServiceImpl { + + public Integer save(EDataAccessType accessType, String dataType, String content){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setAccessType(accessType.getCode()); + dataAccessRecord.setDataType(dataType); + dataAccessRecord.setContent(content); + dataAccessRecord.setContentHash(DigestUtil.md5Hex(content)); + dataAccessRecord.setCreateDatetime(new Date()); + save(dataAccessRecord); + return dataAccessRecord.getId(); + } + + public void refreshResult(Integer id, Integer timeConsume, String result){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setId(id); + dataAccessRecord.setTimeConsume(timeConsume); + dataAccessRecord.setResult(result); + updateById(dataAccessRecord); + } +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java new file mode 100644 index 0000000..6a3da3e --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java @@ -0,0 +1,39 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.crypto.digest.DigestUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Date; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; +import org.springnewfiber.dataadapter.xf.mapper.DataAccessRecordMapper; + +/** + * 数据接入记录 服务实现类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Service +@DS("access") +public class DataAccessRecordService extends ServiceImpl { + + public Integer save(EDataAccessType accessType, String dataType, String content){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setAccessType(accessType.getCode()); + dataAccessRecord.setDataType(dataType); + dataAccessRecord.setContent(content); + dataAccessRecord.setContentHash(DigestUtil.md5Hex(content)); + dataAccessRecord.setCreateDatetime(new Date()); + save(dataAccessRecord); + return dataAccessRecord.getId(); + } + + public void refreshResult(Integer id, Integer timeConsume, String result){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setId(id); + dataAccessRecord.setTimeConsume(timeConsume); + dataAccessRecord.setResult(result); + updateById(dataAccessRecord); + } +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java new file mode 100644 index 0000000..36d00e3 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONObject; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.entity.MqNodeData; +import org.springnewfiber.dataadapter.entity.PtReceiveBaseModel; +import org.springnewfiber.dataadapter.sswj.util.RealTimeSerializer; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorChildenData; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorDataHistoryMongo; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; + +/** + * @author : X.K + * @since : 2022/6/28 下午4:00 + */ +@Slf4j +@Service +@SuppressWarnings("FieldCanBeLocal") +public class HistoryDataService { + + @Resource + private DataAccessRecordService dataAccessRecordService; + + @Resource + private MongoTemplate mongoTemplate; + + private final String ABNORMAL_FORMAT = "%s-%s-%s"; + + /** + * 讯飞历史数据接入 + */ + public Boolean xfInterface(String data, XfDataEnum xfDataEnum){ + Long startTime = System.currentTimeMillis(); + + try{ + // 原始数据保存到MySQL + Integer accessRecordId = dataAccessRecordService.save(EDataAccessType.IflytekHistory, xfDataEnum.getCode(), data); + + // 解析原始数据 + List dataList = XfDataEnum.parse(data, xfDataEnum); + + // 根据ST分组 + Map> stDataMap = dataList.stream().collect(Collectors.groupingBy(BaseXfInterfaceEntity::getStcd)); + + List stList = new ArrayList<>(); + int monitorDataCount = 0; + List abnormalData = new ArrayList<>(); + + // 保存到MongoDB + for(Entry> entry : stDataMap.entrySet()){ + List monitorDataHistoryMongoList = new ArrayList<>(); + List stDataList = entry.getValue(); + + stList.add(entry.getKey()); + monitorDataCount = monitorDataCount + entry.getValue().size(); + + for(T stData : stDataList){ + // 监测基础数据 + MonitorDataHistoryMongo monitorDataHistoryMongo = new MonitorDataHistoryMongo(); + monitorDataHistoryMongo.setSt(entry.getKey()); + monitorDataHistoryMongo.setTt(stData.getTm()); + monitorDataHistoryMongo.setUt(stData.getTm()); + monitorDataHistoryMongo.setCreateTime(new Date()); + + // 监测数据 + PtReceiveBaseModel baseModel = RealTimeSerializer.xfObjectToRealMap(stData); + for(Entry nodeDataEntry : baseModel.getDataMap().entrySet()){ + // 数据异常,则记录并跳过 + if(StringUtils.isBlank(nodeDataEntry.getValue().getValue().toString()) || + !NumberUtil.isNumber(nodeDataEntry.getValue().getValue().toString())){ + abnormalData.add(String.format(ABNORMAL_FORMAT, entry.getKey(), stData.getTm(), nodeDataEntry.getKey())); + continue; + } + + BigDecimal decimalValue = new BigDecimal(nodeDataEntry.getValue().getValue().toString()); + MonitorChildenData monitorChildenData = new MonitorChildenData(); + monitorChildenData.setSn(nodeDataEntry.getValue().getKey()); + monitorChildenData.setValue(nodeDataEntry.getValue().getValue().toString()); + monitorChildenData.setValidateValue(decimalValue); + monitorChildenData.setValidateValueTwo(decimalValue); + monitorChildenData.setChangeRate(BigDecimal.ZERO); + + + monitorDataHistoryMongo.put(nodeDataEntry.getKey(), Collections.singleton(monitorChildenData)); + } + + monitorDataHistoryMongoList.add(monitorDataHistoryMongo); + } + + mongoTemplate.insert(monitorDataHistoryMongoList, entry.getKey()); + } + + Long endTime = System.currentTimeMillis(); + String accessResult = JSONObject.toJSONString(new AccessResult(stList, monitorDataCount, abnormalData)); + dataAccessRecordService.refreshResult(accessRecordId, (int) (endTime - startTime), accessResult); + + log.info("讯飞历史数据接入成功-耗时:{},接入结果:{}", endTime - startTime, accessResult); + + } catch (Exception e){ + log.error("讯飞历史数据接入失败"); + e.printStackTrace(); + return false; + } + + return true; + } + + @Data + static class AccessResult{ + private Integer monitorDataCount; + private Integer stCount; + private List abnormalData; + private String stList; + + public AccessResult(List stList, Integer monitorDataCount, List abnormalData) { + this.stList = String.join(",", stList); + this.stCount = stList.size(); + this.monitorDataCount = monitorDataCount; + this.abnormalData = abnormalData; + } + } +} diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java new file mode 100644 index 0000000..6a3da3e --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java @@ -0,0 +1,39 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.crypto.digest.DigestUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Date; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; +import org.springnewfiber.dataadapter.xf.mapper.DataAccessRecordMapper; + +/** + * 数据接入记录 服务实现类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Service +@DS("access") +public class DataAccessRecordService extends ServiceImpl { + + public Integer save(EDataAccessType accessType, String dataType, String content){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setAccessType(accessType.getCode()); + dataAccessRecord.setDataType(dataType); + dataAccessRecord.setContent(content); + dataAccessRecord.setContentHash(DigestUtil.md5Hex(content)); + dataAccessRecord.setCreateDatetime(new Date()); + save(dataAccessRecord); + return dataAccessRecord.getId(); + } + + public void refreshResult(Integer id, Integer timeConsume, String result){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setId(id); + dataAccessRecord.setTimeConsume(timeConsume); + dataAccessRecord.setResult(result); + updateById(dataAccessRecord); + } +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java new file mode 100644 index 0000000..36d00e3 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONObject; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.entity.MqNodeData; +import org.springnewfiber.dataadapter.entity.PtReceiveBaseModel; +import org.springnewfiber.dataadapter.sswj.util.RealTimeSerializer; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorChildenData; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorDataHistoryMongo; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; + +/** + * @author : X.K + * @since : 2022/6/28 下午4:00 + */ +@Slf4j +@Service +@SuppressWarnings("FieldCanBeLocal") +public class HistoryDataService { + + @Resource + private DataAccessRecordService dataAccessRecordService; + + @Resource + private MongoTemplate mongoTemplate; + + private final String ABNORMAL_FORMAT = "%s-%s-%s"; + + /** + * 讯飞历史数据接入 + */ + public Boolean xfInterface(String data, XfDataEnum xfDataEnum){ + Long startTime = System.currentTimeMillis(); + + try{ + // 原始数据保存到MySQL + Integer accessRecordId = dataAccessRecordService.save(EDataAccessType.IflytekHistory, xfDataEnum.getCode(), data); + + // 解析原始数据 + List dataList = XfDataEnum.parse(data, xfDataEnum); + + // 根据ST分组 + Map> stDataMap = dataList.stream().collect(Collectors.groupingBy(BaseXfInterfaceEntity::getStcd)); + + List stList = new ArrayList<>(); + int monitorDataCount = 0; + List abnormalData = new ArrayList<>(); + + // 保存到MongoDB + for(Entry> entry : stDataMap.entrySet()){ + List monitorDataHistoryMongoList = new ArrayList<>(); + List stDataList = entry.getValue(); + + stList.add(entry.getKey()); + monitorDataCount = monitorDataCount + entry.getValue().size(); + + for(T stData : stDataList){ + // 监测基础数据 + MonitorDataHistoryMongo monitorDataHistoryMongo = new MonitorDataHistoryMongo(); + monitorDataHistoryMongo.setSt(entry.getKey()); + monitorDataHistoryMongo.setTt(stData.getTm()); + monitorDataHistoryMongo.setUt(stData.getTm()); + monitorDataHistoryMongo.setCreateTime(new Date()); + + // 监测数据 + PtReceiveBaseModel baseModel = RealTimeSerializer.xfObjectToRealMap(stData); + for(Entry nodeDataEntry : baseModel.getDataMap().entrySet()){ + // 数据异常,则记录并跳过 + if(StringUtils.isBlank(nodeDataEntry.getValue().getValue().toString()) || + !NumberUtil.isNumber(nodeDataEntry.getValue().getValue().toString())){ + abnormalData.add(String.format(ABNORMAL_FORMAT, entry.getKey(), stData.getTm(), nodeDataEntry.getKey())); + continue; + } + + BigDecimal decimalValue = new BigDecimal(nodeDataEntry.getValue().getValue().toString()); + MonitorChildenData monitorChildenData = new MonitorChildenData(); + monitorChildenData.setSn(nodeDataEntry.getValue().getKey()); + monitorChildenData.setValue(nodeDataEntry.getValue().getValue().toString()); + monitorChildenData.setValidateValue(decimalValue); + monitorChildenData.setValidateValueTwo(decimalValue); + monitorChildenData.setChangeRate(BigDecimal.ZERO); + + + monitorDataHistoryMongo.put(nodeDataEntry.getKey(), Collections.singleton(monitorChildenData)); + } + + monitorDataHistoryMongoList.add(monitorDataHistoryMongo); + } + + mongoTemplate.insert(monitorDataHistoryMongoList, entry.getKey()); + } + + Long endTime = System.currentTimeMillis(); + String accessResult = JSONObject.toJSONString(new AccessResult(stList, monitorDataCount, abnormalData)); + dataAccessRecordService.refreshResult(accessRecordId, (int) (endTime - startTime), accessResult); + + log.info("讯飞历史数据接入成功-耗时:{},接入结果:{}", endTime - startTime, accessResult); + + } catch (Exception e){ + log.error("讯飞历史数据接入失败"); + e.printStackTrace(); + return false; + } + + return true; + } + + @Data + static class AccessResult{ + private Integer monitorDataCount; + private Integer stCount; + private List abnormalData; + private String stList; + + public AccessResult(List stList, Integer monitorDataCount, List abnormalData) { + this.stList = String.join(",", stList); + this.stCount = stList.size(); + this.monitorDataCount = monitorDataCount; + this.abnormalData = abnormalData; + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1791ee4..a9b688b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -29,24 +29,32 @@ routing-key: rtu_message_test exchange: amq.topic - # datasource: -# type: com.alibaba.druid.pool.DruidDataSource -# driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://192.168.16.220:3306/new-water_dev?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: root -# password: admin!@#qwe datasource: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: u_swj -# password: c5Uh5WQRtacH - url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true - username: root - password: admin123!@# -# data: -# mongodb: -# uri: mongodb://pt_mongo:pt_mongo@192.168.16.220:27017/pt_mongo + dynamic: + primary: swj + datasource: + swj: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver +# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true +# username: u_swj +# password: c5Uh5WQRtacH + url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + access: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://192.168.30.92:3306/iflytek_access?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 + + data: + mongodb: + uri: mongodb://pt_mongo:pt_mongo@192.168.30.178:27017/pt_mongo + logging: level: root: info diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java new file mode 100644 index 0000000..6a3da3e --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java @@ -0,0 +1,39 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.crypto.digest.DigestUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Date; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; +import org.springnewfiber.dataadapter.xf.mapper.DataAccessRecordMapper; + +/** + * 数据接入记录 服务实现类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Service +@DS("access") +public class DataAccessRecordService extends ServiceImpl { + + public Integer save(EDataAccessType accessType, String dataType, String content){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setAccessType(accessType.getCode()); + dataAccessRecord.setDataType(dataType); + dataAccessRecord.setContent(content); + dataAccessRecord.setContentHash(DigestUtil.md5Hex(content)); + dataAccessRecord.setCreateDatetime(new Date()); + save(dataAccessRecord); + return dataAccessRecord.getId(); + } + + public void refreshResult(Integer id, Integer timeConsume, String result){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setId(id); + dataAccessRecord.setTimeConsume(timeConsume); + dataAccessRecord.setResult(result); + updateById(dataAccessRecord); + } +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java new file mode 100644 index 0000000..36d00e3 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONObject; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.entity.MqNodeData; +import org.springnewfiber.dataadapter.entity.PtReceiveBaseModel; +import org.springnewfiber.dataadapter.sswj.util.RealTimeSerializer; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorChildenData; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorDataHistoryMongo; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; + +/** + * @author : X.K + * @since : 2022/6/28 下午4:00 + */ +@Slf4j +@Service +@SuppressWarnings("FieldCanBeLocal") +public class HistoryDataService { + + @Resource + private DataAccessRecordService dataAccessRecordService; + + @Resource + private MongoTemplate mongoTemplate; + + private final String ABNORMAL_FORMAT = "%s-%s-%s"; + + /** + * 讯飞历史数据接入 + */ + public Boolean xfInterface(String data, XfDataEnum xfDataEnum){ + Long startTime = System.currentTimeMillis(); + + try{ + // 原始数据保存到MySQL + Integer accessRecordId = dataAccessRecordService.save(EDataAccessType.IflytekHistory, xfDataEnum.getCode(), data); + + // 解析原始数据 + List dataList = XfDataEnum.parse(data, xfDataEnum); + + // 根据ST分组 + Map> stDataMap = dataList.stream().collect(Collectors.groupingBy(BaseXfInterfaceEntity::getStcd)); + + List stList = new ArrayList<>(); + int monitorDataCount = 0; + List abnormalData = new ArrayList<>(); + + // 保存到MongoDB + for(Entry> entry : stDataMap.entrySet()){ + List monitorDataHistoryMongoList = new ArrayList<>(); + List stDataList = entry.getValue(); + + stList.add(entry.getKey()); + monitorDataCount = monitorDataCount + entry.getValue().size(); + + for(T stData : stDataList){ + // 监测基础数据 + MonitorDataHistoryMongo monitorDataHistoryMongo = new MonitorDataHistoryMongo(); + monitorDataHistoryMongo.setSt(entry.getKey()); + monitorDataHistoryMongo.setTt(stData.getTm()); + monitorDataHistoryMongo.setUt(stData.getTm()); + monitorDataHistoryMongo.setCreateTime(new Date()); + + // 监测数据 + PtReceiveBaseModel baseModel = RealTimeSerializer.xfObjectToRealMap(stData); + for(Entry nodeDataEntry : baseModel.getDataMap().entrySet()){ + // 数据异常,则记录并跳过 + if(StringUtils.isBlank(nodeDataEntry.getValue().getValue().toString()) || + !NumberUtil.isNumber(nodeDataEntry.getValue().getValue().toString())){ + abnormalData.add(String.format(ABNORMAL_FORMAT, entry.getKey(), stData.getTm(), nodeDataEntry.getKey())); + continue; + } + + BigDecimal decimalValue = new BigDecimal(nodeDataEntry.getValue().getValue().toString()); + MonitorChildenData monitorChildenData = new MonitorChildenData(); + monitorChildenData.setSn(nodeDataEntry.getValue().getKey()); + monitorChildenData.setValue(nodeDataEntry.getValue().getValue().toString()); + monitorChildenData.setValidateValue(decimalValue); + monitorChildenData.setValidateValueTwo(decimalValue); + monitorChildenData.setChangeRate(BigDecimal.ZERO); + + + monitorDataHistoryMongo.put(nodeDataEntry.getKey(), Collections.singleton(monitorChildenData)); + } + + monitorDataHistoryMongoList.add(monitorDataHistoryMongo); + } + + mongoTemplate.insert(monitorDataHistoryMongoList, entry.getKey()); + } + + Long endTime = System.currentTimeMillis(); + String accessResult = JSONObject.toJSONString(new AccessResult(stList, monitorDataCount, abnormalData)); + dataAccessRecordService.refreshResult(accessRecordId, (int) (endTime - startTime), accessResult); + + log.info("讯飞历史数据接入成功-耗时:{},接入结果:{}", endTime - startTime, accessResult); + + } catch (Exception e){ + log.error("讯飞历史数据接入失败"); + e.printStackTrace(); + return false; + } + + return true; + } + + @Data + static class AccessResult{ + private Integer monitorDataCount; + private Integer stCount; + private List abnormalData; + private String stList; + + public AccessResult(List stList, Integer monitorDataCount, List abnormalData) { + this.stList = String.join(",", stList); + this.stCount = stList.size(); + this.monitorDataCount = monitorDataCount; + this.abnormalData = abnormalData; + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1791ee4..a9b688b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -29,24 +29,32 @@ routing-key: rtu_message_test exchange: amq.topic - # datasource: -# type: com.alibaba.druid.pool.DruidDataSource -# driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://192.168.16.220:3306/new-water_dev?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: root -# password: admin!@#qwe datasource: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: u_swj -# password: c5Uh5WQRtacH - url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true - username: root - password: admin123!@# -# data: -# mongodb: -# uri: mongodb://pt_mongo:pt_mongo@192.168.16.220:27017/pt_mongo + dynamic: + primary: swj + datasource: + swj: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver +# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true +# username: u_swj +# password: c5Uh5WQRtacH + url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + access: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://192.168.30.92:3306/iflytek_access?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 + + data: + mongodb: + uri: mongodb://pt_mongo:pt_mongo@192.168.30.178:27017/pt_mongo + logging: level: root: info diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml index d28585e..d1c156f 100644 --- a/src/main/resources/application-pro.yml +++ b/src/main/resources/application-pro.yml @@ -29,11 +29,28 @@ routing-key: rtu_message_test exchange: amq.topic datasource: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true - username: u_swj - password: c5Uh5WQRtacH + dynamic: + primary: swj + datasource: + swj: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: u_swj + password: c5Uh5WQRtacH + access: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://172.16.3.109:3306/iflytek_access?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: BjpVQu8yrh7c267PJT + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 + + data: + mongodb: + uri: mongodb://pt_mongo:pt_mongo@172.16.3.109:27017/pt_mongo + cloud: nacos: discovery: diff --git a/pom.xml b/pom.xml index 969b7bc..1e6ab8d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,15 @@ org.springframework.boot spring-boot-starter-data-redis + + org.springframework.boot + spring-boot-starter-data-mongodb + + + com.baomidou + dynamic-datasource-spring-boot-starter + 2.5.6 + mysql mysql-connector-java @@ -148,7 +157,22 @@ spring-cloud-starter-alibaba-nacos-discovery 2021.1 - + + org.springframework.boot + spring-boot-test + test + + + junit + junit + test + + + org.springframework + spring-test + test + + diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java index 1a659ca..3d0f82b 100644 --- a/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java +++ b/src/main/java/org/springnewfiber/dataadapter/xf/XfDataEnum.java @@ -1,10 +1,26 @@ package org.springnewfiber.dataadapter.xf; +import com.alibaba.fastjson.JSONObject; +import java.util.ArrayList; +import java.util.List; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.MonitorChnlDataDto; +import org.springnewfiber.dataadapter.xf.entity.MonitorLakeData; +import org.springnewfiber.dataadapter.xf.entity.MonitorMeteorologicalData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPptnData; +import org.springnewfiber.dataadapter.xf.entity.MonitorPumpData; +import org.springnewfiber.dataadapter.xf.entity.MonitorRiverData; +import org.springnewfiber.dataadapter.xf.entity.MonitorSoilData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWasData; +import org.springnewfiber.dataadapter.xf.entity.MonitorWetlogData; @Getter public enum XfDataEnum { + /** + * + */ ChnlData("ChnlData","港渠信息"), ForcastData("ForcastData","汉口水情"), LakeData("LakeData","湖泊监测数据"), @@ -31,4 +47,34 @@ } return null; } + + @SuppressWarnings("unchecked") + public static List parse(String data, XfDataEnum xfDataEnum){ + List result = new ArrayList<>(); + + if (xfDataEnum == XfDataEnum.ChnlData) { + result = (List) JSONObject.parseArray(data, MonitorChnlDataDto.class); +// } else if (xfDataEnum == XfDataEnum.ForcastData) { +// result = JSONObject.parseArray(data, MonitorForcastData.class); + } else if (xfDataEnum == XfDataEnum.LakeData) { + result = (List) JSONObject.parseArray(data, MonitorLakeData.class); + } else if (xfDataEnum == XfDataEnum.Meteorological) { + result = (List) JSONObject.parseArray(data, MonitorMeteorologicalData.class); + } else if (xfDataEnum == XfDataEnum.PptnData) { + result = (List) JSONObject.parseArray(data, MonitorPptnData.class); + } else if (xfDataEnum == XfDataEnum.PumpData) { + result = (List) JSONObject.parseArray(data, MonitorPumpData.class); + } else if (xfDataEnum == XfDataEnum.RiverData) { + result = (List) JSONObject.parseArray(data, MonitorRiverData.class); + } else if (xfDataEnum == XfDataEnum.SoilData) { + result = (List) JSONObject.parseArray(data, MonitorSoilData.class); + } else if (xfDataEnum == XfDataEnum.WasData) { + result = (List) JSONObject.parseArray(data, MonitorWasData.class); + } else if (xfDataEnum == XfDataEnum.WetlogData) { + result = (List) JSONObject.parseArray(data, MonitorWetlogData.class); + } + + return result; + } + } diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java new file mode 100644 index 0000000..e01a25f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/controller/HistoryDataController.java @@ -0,0 +1,32 @@ +package org.springnewfiber.dataadapter.xf.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import javax.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springnewfiber.dataadapter.config.R; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + */ +@RestController +@RequestMapping("/history-data") +@Api(value = "历史数据", tags = "历史数据") +public class HistoryDataController { + + @Resource + private HistoryDataService historyDataService; + + @PostMapping("/xfInterface") + @ApiOperation(value = "讯飞数据接入") + public R xfInterface(@ApiParam(value = "数据json") @RequestParam("data") String data, + @ApiParam(value = "数据类型") @RequestParam("xfBaseData") XfDataEnum xfDataEnum) { + return R.status(historyDataService.xfInterface(data, xfDataEnum)); + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java new file mode 100644 index 0000000..7d90aca --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/DataAccessRecord.java @@ -0,0 +1,69 @@ +package org.springnewfiber.dataadapter.xf.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/** + * 数据接入记录 实体类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Data +@TableName("t_data_access_record") +@ApiModel(value = "DataAccessRecord对象", description = "数据接入记录") +public class DataAccessRecord { + + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + @ApiModelProperty(value = "接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history)") + private String accessType; + + /** + * 接入数据类型 + */ + @ApiModelProperty(value = "接入数据类型") + private String dataType; + + /** + * 接入数据内容 + */ + @ApiModelProperty(value = "接入数据内容") + private String content; + + /** + * 接入数据内容摘要(用于比较是否重复推送) + */ + @ApiModelProperty(value = "接入数据内容摘要(用于比较是否重复推送)") + private String contentHash; + + /** + * 耗时(毫秒) + */ + @ApiModelProperty(value = "耗时(毫秒)") + private Integer timeConsume; + + /** + * 数据接入结果 + */ + @ApiModelProperty(value = "数据接入结果") + private String result; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private Date createDatetime; + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java new file mode 100644 index 0000000..26e73e5 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorChildenData.java @@ -0,0 +1,51 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.math.BigDecimal; +import lombok.Data; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 16:00 + **/ +@Data +public class MonitorChildenData { + /** + * 传感器唯一编码 旧版rtu,,该值是st 的传感器 编码,,如 水位为z 旧版水位2为zb 该值为zb + * plc,应该为点表key + */ + private String sn; + /** + * value + */ + private String value; + /** + * 是否故障 0,无,1 有 + */ + private Integer hasException = 0; + /** + * 是否校验1 0,无,1,校验过 + */ + private Integer hasValidate = 0; + /** + * 校验值1 + */ + private BigDecimal validateValue; + /** + * 效验状态2 + */ + private Integer hasValidateTwo = 0; + /** + * 第二次验证值 + */ + private BigDecimal validateValueTwo; + /** + * 变化率 + */ + private BigDecimal changeRate; + /** + * 是否处理变化率 0,无,1 有 + */ + private Integer hasChangeRate = 0; +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java new file mode 100644 index 0000000..8ae4a86 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/entity/monitor/MonitorDataHistoryMongo.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.entity.monitor; + +import java.util.Date; +import java.util.HashMap; +import lombok.Data; +import org.springframework.util.StringUtils; + +/** + * @program: newwater-data-engine + * @description: + * @author: djt + * @create: 2021-12-24 15:54 + **/ +@Data +public class MonitorDataHistoryMongo extends HashMap { + /** + * 站点编号 + */ + private String st; + /** + * 观测时间 + */ + private Date tt; + + /** + * 上报时间 + */ + private Date ut; + + private Date createTime; + + public void setTt(Date tt) { + this.tt = tt; + this.put(MonitorDataKeyConstant.TT, tt); + } + + public void setSt(String st) { + this.st = st; + this.put(MonitorDataKeyConstant.ST, st); + } + + public void setUt(Date ut) { + this.ut = ut; + this.put(MonitorDataKeyConstant.UT, ut); + } + + public void setCreateTime(Date date) { + this.createTime = date; + this.put(MonitorDataKeyConstant.CRAETETIME, date); + } + + public String getSt() { + if (StringUtils.isEmpty(this.get(MonitorDataKeyConstant.ST))) { + return null; + } + return this.get(MonitorDataKeyConstant.ST).toString(); + } + + public Date getTt() { + if (this.get(MonitorDataKeyConstant.TT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.TT); + } + + public Date getUt() { + if (this.get(MonitorDataKeyConstant.UT) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.UT); + } + + public Date getCreateTime() { + if (this.get(MonitorDataKeyConstant.CRAETETIME) == null) { + return null; + } + return (Date) this.get(MonitorDataKeyConstant.CRAETETIME); + } + + public String getCoverLastValue(MonitorDataHistoryMongo objMap, String lowerCaseMonitorCode) { + return "0"; + } + + interface MonitorDataKeyConstant { + /** + * 观测时间 + */ + public String TT = "tt"; + /** + * 上报时间 + */ + public String UT = "ut"; + /** + * 创建时间 + */ + public String CRAETETIME = "createTime"; + /** + * st号(站点编号) + */ + public String ST = "st"; + /** + * sn(rtu编号) + */ + public String SN = "sn"; + /** + * 传感器key + */ + public String MONITORKEY = "key"; + /** + * 传感器值 + */ + public String MONITORVALUE = "value"; + /** + * 修改时间 + */ + public String UPDATETIME = "updateTime"; + /** + * mongo ID + */ + public String MONGOID="_id"; + /** + * mongo hour 节点key + */ + public String DATE="date"; + /** + * mongo hour 节点key + */ + public String FACTOR="factor"; + + + /** + * mongo hour 节点key + */ + public String AVERAGE="average"; + + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java new file mode 100644 index 0000000..36c315f --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/enums/EDataAccessType.java @@ -0,0 +1,36 @@ +package org.springnewfiber.dataadapter.xf.enums; + +/** + * @author : Silver + * @since : 2019-01-11 22:10 + */ +public enum EDataAccessType { + + /** + * 接入方式(讯飞实时数据 iflytek_realtime | 讯飞历史数据 iflytek_history) + */ + IflytekRealtime("iflytek_realtime", "讯飞实时数据"), + IflytekHistory("iflytek_history", "讯飞历史数据"); + + EDataAccessType(String code, String value) { + this.code = code; + this.value = value; + } + + private final String code; + + private final String value; + + public String getCode() { + return code; + } + + public Integer getIntegerCode(){ + return Integer.valueOf(code); + } + + public String getValue() { + return value; + } + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java new file mode 100644 index 0000000..d6de312 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/mapper/DataAccessRecordMapper.java @@ -0,0 +1,14 @@ +package org.springnewfiber.dataadapter.xf.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; + +/** + * 数据接入记录 Mapper 接口 + * @since 2022-06-28 15:06:03 + */ +@Mapper +public interface DataAccessRecordMapper extends BaseMapper { + +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java new file mode 100644 index 0000000..6a3da3e --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/DataAccessRecordService.java @@ -0,0 +1,39 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.crypto.digest.DigestUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Date; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.xf.entity.DataAccessRecord; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; +import org.springnewfiber.dataadapter.xf.mapper.DataAccessRecordMapper; + +/** + * 数据接入记录 服务实现类 + * @since 2022-06-28 15:06:03 + * @author admin + */ +@Service +@DS("access") +public class DataAccessRecordService extends ServiceImpl { + + public Integer save(EDataAccessType accessType, String dataType, String content){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setAccessType(accessType.getCode()); + dataAccessRecord.setDataType(dataType); + dataAccessRecord.setContent(content); + dataAccessRecord.setContentHash(DigestUtil.md5Hex(content)); + dataAccessRecord.setCreateDatetime(new Date()); + save(dataAccessRecord); + return dataAccessRecord.getId(); + } + + public void refreshResult(Integer id, Integer timeConsume, String result){ + DataAccessRecord dataAccessRecord = new DataAccessRecord(); + dataAccessRecord.setId(id); + dataAccessRecord.setTimeConsume(timeConsume); + dataAccessRecord.setResult(result); + updateById(dataAccessRecord); + } +} diff --git a/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java new file mode 100644 index 0000000..36d00e3 --- /dev/null +++ b/src/main/java/org/springnewfiber/dataadapter/xf/service/HistoryDataService.java @@ -0,0 +1,138 @@ +package org.springnewfiber.dataadapter.xf.service; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONObject; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; +import org.springnewfiber.dataadapter.entity.MqNodeData; +import org.springnewfiber.dataadapter.entity.PtReceiveBaseModel; +import org.springnewfiber.dataadapter.sswj.util.RealTimeSerializer; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.entity.BaseXfInterfaceEntity; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorChildenData; +import org.springnewfiber.dataadapter.xf.entity.monitor.MonitorDataHistoryMongo; +import org.springnewfiber.dataadapter.xf.enums.EDataAccessType; + +/** + * @author : X.K + * @since : 2022/6/28 下午4:00 + */ +@Slf4j +@Service +@SuppressWarnings("FieldCanBeLocal") +public class HistoryDataService { + + @Resource + private DataAccessRecordService dataAccessRecordService; + + @Resource + private MongoTemplate mongoTemplate; + + private final String ABNORMAL_FORMAT = "%s-%s-%s"; + + /** + * 讯飞历史数据接入 + */ + public Boolean xfInterface(String data, XfDataEnum xfDataEnum){ + Long startTime = System.currentTimeMillis(); + + try{ + // 原始数据保存到MySQL + Integer accessRecordId = dataAccessRecordService.save(EDataAccessType.IflytekHistory, xfDataEnum.getCode(), data); + + // 解析原始数据 + List dataList = XfDataEnum.parse(data, xfDataEnum); + + // 根据ST分组 + Map> stDataMap = dataList.stream().collect(Collectors.groupingBy(BaseXfInterfaceEntity::getStcd)); + + List stList = new ArrayList<>(); + int monitorDataCount = 0; + List abnormalData = new ArrayList<>(); + + // 保存到MongoDB + for(Entry> entry : stDataMap.entrySet()){ + List monitorDataHistoryMongoList = new ArrayList<>(); + List stDataList = entry.getValue(); + + stList.add(entry.getKey()); + monitorDataCount = monitorDataCount + entry.getValue().size(); + + for(T stData : stDataList){ + // 监测基础数据 + MonitorDataHistoryMongo monitorDataHistoryMongo = new MonitorDataHistoryMongo(); + monitorDataHistoryMongo.setSt(entry.getKey()); + monitorDataHistoryMongo.setTt(stData.getTm()); + monitorDataHistoryMongo.setUt(stData.getTm()); + monitorDataHistoryMongo.setCreateTime(new Date()); + + // 监测数据 + PtReceiveBaseModel baseModel = RealTimeSerializer.xfObjectToRealMap(stData); + for(Entry nodeDataEntry : baseModel.getDataMap().entrySet()){ + // 数据异常,则记录并跳过 + if(StringUtils.isBlank(nodeDataEntry.getValue().getValue().toString()) || + !NumberUtil.isNumber(nodeDataEntry.getValue().getValue().toString())){ + abnormalData.add(String.format(ABNORMAL_FORMAT, entry.getKey(), stData.getTm(), nodeDataEntry.getKey())); + continue; + } + + BigDecimal decimalValue = new BigDecimal(nodeDataEntry.getValue().getValue().toString()); + MonitorChildenData monitorChildenData = new MonitorChildenData(); + monitorChildenData.setSn(nodeDataEntry.getValue().getKey()); + monitorChildenData.setValue(nodeDataEntry.getValue().getValue().toString()); + monitorChildenData.setValidateValue(decimalValue); + monitorChildenData.setValidateValueTwo(decimalValue); + monitorChildenData.setChangeRate(BigDecimal.ZERO); + + + monitorDataHistoryMongo.put(nodeDataEntry.getKey(), Collections.singleton(monitorChildenData)); + } + + monitorDataHistoryMongoList.add(monitorDataHistoryMongo); + } + + mongoTemplate.insert(monitorDataHistoryMongoList, entry.getKey()); + } + + Long endTime = System.currentTimeMillis(); + String accessResult = JSONObject.toJSONString(new AccessResult(stList, monitorDataCount, abnormalData)); + dataAccessRecordService.refreshResult(accessRecordId, (int) (endTime - startTime), accessResult); + + log.info("讯飞历史数据接入成功-耗时:{},接入结果:{}", endTime - startTime, accessResult); + + } catch (Exception e){ + log.error("讯飞历史数据接入失败"); + e.printStackTrace(); + return false; + } + + return true; + } + + @Data + static class AccessResult{ + private Integer monitorDataCount; + private Integer stCount; + private List abnormalData; + private String stList; + + public AccessResult(List stList, Integer monitorDataCount, List abnormalData) { + this.stList = String.join(",", stList); + this.stCount = stList.size(); + this.monitorDataCount = monitorDataCount; + this.abnormalData = abnormalData; + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1791ee4..a9b688b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -29,24 +29,32 @@ routing-key: rtu_message_test exchange: amq.topic - # datasource: -# type: com.alibaba.druid.pool.DruidDataSource -# driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://192.168.16.220:3306/new-water_dev?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: root -# password: admin!@#qwe datasource: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true -# username: u_swj -# password: c5Uh5WQRtacH - url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true - username: root - password: admin123!@# -# data: -# mongodb: -# uri: mongodb://pt_mongo:pt_mongo@192.168.16.220:27017/pt_mongo + dynamic: + primary: swj + datasource: + swj: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver +# url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true +# username: u_swj +# password: c5Uh5WQRtacH + url: jdbc:mysql://192.168.30.92:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + access: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://192.168.30.92:3306/iflytek_access?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: admin123!@# + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 + + data: + mongodb: + uri: mongodb://pt_mongo:pt_mongo@192.168.30.178:27017/pt_mongo + logging: level: root: info diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml index d28585e..d1c156f 100644 --- a/src/main/resources/application-pro.yml +++ b/src/main/resources/application-pro.yml @@ -29,11 +29,28 @@ routing-key: rtu_message_test exchange: amq.topic datasource: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true - username: u_swj - password: c5Uh5WQRtacH + dynamic: + primary: swj + datasource: + swj: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://172.16.3.38:3306/swj?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: u_swj + password: c5Uh5WQRtacH + access: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://172.16.3.109:3306/iflytek_access?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong&rewriteBatchedStatements=true + username: root + password: BjpVQu8yrh7c267PJT + autoconfigure: + exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置 + + data: + mongodb: + uri: mongodb://pt_mongo:pt_mongo@172.16.3.109:27017/pt_mongo + cloud: nacos: discovery: diff --git a/src/test/java/AccessTest.java b/src/test/java/AccessTest.java new file mode 100644 index 0000000..60400cd --- /dev/null +++ b/src/test/java/AccessTest.java @@ -0,0 +1,29 @@ +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springnewfiber.dataadapter.DataAdapterApplication; +import org.springnewfiber.dataadapter.xf.XfDataEnum; +import org.springnewfiber.dataadapter.xf.service.HistoryDataService; + +/** + * @author : X.K + * @since : 2022/6/29 上午8:51 + */ +@Slf4j +@SpringBootTest(classes = DataAdapterApplication.class) +@RunWith(SpringRunner.class) +public class AccessTest { + + @Resource + private HistoryDataService historyDataService; + + @Test + public void batchTest(){ + String data = + "[{\"id\":\"a9f31f11ef3e35002cc08cb6d5f3c26\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610810\",\"stnm\":\"打鼓渡闸前\",\"tm\":1654012800000,\"wptn\":\"abc\",\"z\":19.270},{\"id\":\"299fbffb22b32f64677de20697323241\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610640\",\"stnm\":\"汉银泵站下游\",\"tm\":1654012800000,\"z\":23.220},{\"id\":\"db9c616ccbf46d5149e252a4312cfe34\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610620\",\"stnm\":\"官莲湖主排水港中间段\",\"tm\":1654012800000,\"z\":19.660},{\"id\":\"8c6bf7c7031a05937608352b9d580a13\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610841\",\"stnm\":\"汉南闸外\",\"tm\":1654012800000,\"wptn\":\"5\",\"z\":21.620},{\"id\":\"cd0fed1f7deb7b738ee64fe53142c4a0\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710290\",\"stnm\":\"烂泥湖泵站前池\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":19.250},{\"id\":\"6690c63a8ddf5c1317e5f4bedcd32d7f\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710320\",\"stnm\":\"汉银泵站前池\",\"tm\":1654012800000,\"wptn\":\"5\",\"z\":20.870},{\"id\":\"94b0ca45768804fd3728a1646e0702f1\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610881\",\"stnm\":\"乌金闸外\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":18.430},{\"id\":\"c3305817614bd51dbb0a4f8d0e285628\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710350\",\"stnm\":\"北支四泵站前池\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":18.640},{\"id\":\"79bb188e01cc0d08857e3791e122b43a\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610250\",\"stnm\":\"汤山渠\",\"tm\":1654012800000,\"z\":18.600},{\"id\":\"6d8cec4664135b897e01ca60e7e58c70\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610880\",\"stnm\":\"乌金闸内\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":17.910},{\"id\":\"e72fae41c806cdfa01be5c8e8a5bcede\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610621\",\"stnm\":\"官莲湖主排水港出口\",\"tm\":1654012800000,\"z\":19.770},{\"id\":\"4e7f8dd843e915fd74fcf978709b9b5d\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610650\",\"stnm\":\"通顺河乌金泵站\",\"tm\":1654012800000,\"wptn\":\"4\",\"z\":32.130},{\"id\":\"d07da0c9b53ed7de9c33abc2aba270a3\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710330\",\"stnm\":\"乌金泵站前池\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":17.870},{\"id\":\"5c05119dc268a9798df16d21d3df79ec\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610851\",\"stnm\":\"蚂蚁闸外\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":20.550},{\"id\":\"8d1a8a60180faaff5d6fe9dd75edcf69\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610860\",\"stnm\":\"南丰闸内\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":17.580},{\"id\":\"fc8c22fc40cc976a083b479172c18868\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610871\",\"stnm\":\"十八家高闸外\",\"tm\":1654012800000,\"wptn\":\"5\",\"z\":22.250},{\"id\":\"7d5050ce76e86dc87f9ac96fa72a35fc\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710280\",\"stnm\":\"长丰泵站拦污栅桥下游(泵站前池)\",\"tm\":1654012800000,\"wptn\":\"4\",\"z\":18.760},{\"id\":\"0b45872c741bd425ac00515a7caf8227\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610180\",\"stnm\":\"新民河\",\"tm\":1654012800000,\"z\":18.620},{\"id\":\"39d3def0205478fc52a8ca1c878603bb\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710310\",\"stnm\":\"银莲湖泵站前池\",\"tm\":1654012800000,\"wptn\":\"5\",\"z\":18.930},{\"id\":\"691c73bafb145602192069afa8c148e2\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610610\",\"stnm\":\"烂泥湖泵站进水港涵桥上游\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":18.830},{\"id\":\"8b2e15b120ee8bf77e6337f876c73183\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610630\",\"stnm\":\"王家寨\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":21.960},{\"id\":\"cff2b5433fcc1a7d99c2d74c771e065b\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710340\",\"stnm\":\"十八家泵站前池\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":26.290},{\"id\":\"fb046a15b63c70bc86e316980958e141\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610861\",\"stnm\":\"南丰闸外\",\"tm\":1654012800000,\"wptn\":\"4\",\"z\":19.290},{\"id\":\"a26eadf08b46681f74723b27130dc63d\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610811\",\"stnm\":\"打鼓渡闸后\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":18.780},{\"id\":\"5f0c1638f959c823586ca1e94b3bbfe8\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710270\",\"stnm\":\"长丰泵站进水港中段\",\"tm\":1654012800000,\"wptn\":\"5\",\"z\":18.550},{\"id\":\"2bc4e91ff320d25eeaca8c746a042c5c\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610150\",\"stnm\":\"东湖泵站进水渠(泵站桥旁)\",\"tm\":1654012800000,\"z\":18.580},{\"id\":\"a1c25c3974bb6f98698e7bf76d1f36e9\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710300\",\"stnm\":\"五豪泵站前池\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":19.690},{\"id\":\"8ebd783d38fbb7e00fa15c2dae4f1a7f\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610890\",\"stnm\":\"蝎子河闸内\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":19.520},{\"id\":\"cd415a4cdebd23590d1b17bb5ae73ae9\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610840\",\"stnm\":\"汉南闸内\",\"tm\":1654012800000,\"wptn\":\"6\",\"z\":17.260},{\"id\":\"40fc2633c56e97d66d0f1ff431086ff3\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610621\",\"stnm\":\"官莲湖主排水港出口\",\"tm\":1654016400000,\"z\":19.770},{\"id\":\"de69f04568f146756e428c9fdfd82668\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610840\",\"stnm\":\"汉南闸内\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":17.260},{\"id\":\"ce55ebb5755db2752711b07ef9876534\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710300\",\"stnm\":\"五豪泵站前池\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":19.690},{\"id\":\"1ce6e79f74b747493a9c5bf5405245b1\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610150\",\"stnm\":\"东湖泵站进水渠(泵站桥旁)\",\"tm\":1654016400000,\"z\":18.580},{\"id\":\"d397723f4d907e507ce258274c4bc0a3\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610650\",\"stnm\":\"通顺河乌金泵站\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":32.150},{\"id\":\"f0b56de54c5b53587a3426d96d20b6d5\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610811\",\"stnm\":\"打鼓渡闸后\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":18.780},{\"id\":\"63f22610437c093c54be3e1ef0f647fd\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610860\",\"stnm\":\"南丰闸内\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":17.590},{\"id\":\"22df9a9e46908a9d01cb8977c1f9a948\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710270\",\"stnm\":\"长丰泵站进水港中段\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":18.550},{\"id\":\"10b8e400a20942cbb4ac4d0237f81030\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610851\",\"stnm\":\"蚂蚁闸外\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":20.550},{\"id\":\"c420280c2fbef77cefe8cf5b9989587e\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710330\",\"stnm\":\"乌金泵站前池\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":17.870},{\"id\":\"b2cf85393df215d931da7838456f3229\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610640\",\"stnm\":\"汉银泵站下游\",\"tm\":1654016400000,\"z\":23.240},{\"id\":\"c03346ea68db4c49d18d9fe47b8ea5a2\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610810\",\"stnm\":\"打鼓渡闸前\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":19.270},{\"id\":\"849e78aa1185c77a6ebb6f77c2b13992\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610620\",\"stnm\":\"官莲湖主排水港中间段\",\"tm\":1654016400000,\"z\":19.650},{\"id\":\"4981438c7d3ce18149b1744a04800449\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610250\",\"stnm\":\"汤山渠\",\"tm\":1654016400000,\"z\":18.600},{\"id\":\"2297425a7be0913d6c480e98e7f3ba5d\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610180\",\"stnm\":\"新民河\",\"tm\":1654016400000,\"z\":18.620},{\"id\":\"1ec1bec53de07d2d9696fdb4f7b2be79\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610861\",\"stnm\":\"南丰闸外\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":19.290},{\"id\":\"09300f8b9ad02969293f9d04baf03936\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710310\",\"stnm\":\"银莲湖泵站前池\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":18.940},{\"id\":\"704aa3f82aeded9398f6a3e76b75b510\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610630\",\"stnm\":\"王家寨\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":21.960},{\"id\":\"329be0160b0fab1e996b4933b098df94\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610610\",\"stnm\":\"烂泥湖泵站进水港涵桥上游\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":18.830},{\"id\":\"530b24456cd44cbf67c7c26c86e92ab6\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710280\",\"stnm\":\"长丰泵站拦污栅桥下游(泵站前池)\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":18.770},{\"id\":\"c7d1a7974072c602e8f46da942edaaa9\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610871\",\"stnm\":\"十八家高闸外\",\"tm\":1654016400000,\"wptn\":\"4\",\"z\":22.050},{\"id\":\"3c47b9c882c73115299d1dcc263a515e\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710340\",\"stnm\":\"十八家泵站前池\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":26.290},{\"id\":\"cc8879c983be717a0dad49b0d89e43ca\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710350\",\"stnm\":\"北支四泵站前池\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":18.650},{\"id\":\"a8d4629f6830a909a975de8a0a2b5492\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610841\",\"stnm\":\"汉南闸外\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":21.620},{\"id\":\"d49f0a9b73a9bd20a6621f31e9d8b42d\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610880\",\"stnm\":\"乌金闸内\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":17.910},{\"id\":\"cf0b244cf8d99608f41ad58cd92d3237\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710320\",\"stnm\":\"汉银泵站前池\",\"tm\":1654016400000,\"wptn\":\"5\",\"z\":20.890},{\"id\":\"4b0f25c42f7472233f1dbe178ee973ac\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710290\",\"stnm\":\"烂泥湖泵站前池\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":19.250},{\"id\":\"91ed763edd00262d345ed67b7bda7c0f\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610890\",\"stnm\":\"蝎子河闸内\",\"tm\":1654016400000,\"wptn\":\"6\",\"z\":19.520},{\"id\":\"1d3a1e12014416e32b9e96fc96fec5c0\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710340\",\"stnm\":\"十八家泵站前池\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":26.290},{\"id\":\"d69ca4721a17ee296121a8e907abdc35\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610180\",\"stnm\":\"新民河\",\"tm\":1654020000000,\"z\":18.620},{\"id\":\"621c3040644aeff650cd9142f0a284df\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610840\",\"stnm\":\"汉南闸内\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":17.260},{\"id\":\"8927c77f00320a39046f176ecb93383d\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710270\",\"stnm\":\"长丰泵站进水港中段\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":18.550},{\"id\":\"8c445c298f96934cf58b753208e80f56\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610890\",\"stnm\":\"蝎子河闸内\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":19.520},{\"id\":\"45e112bfd47b2116cab4f34962936477\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610150\",\"stnm\":\"东湖泵站进水渠(泵站桥旁)\",\"tm\":1654020000000,\"z\":18.590},{\"id\":\"5d7b1c3d00ca38a5eff25f62ff7b925c\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610811\",\"stnm\":\"打鼓渡闸后\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":18.780},{\"id\":\"4e0546d736b2e2655d9319d7eb0792b1\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610851\",\"stnm\":\"蚂蚁闸外\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":20.550},{\"id\":\"a0a7694af9f51c652f8a9c9c2ec7b028\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610650\",\"stnm\":\"通顺河乌金泵站\",\"tm\":1654020000000,\"wptn\":\"5\",\"z\":32.620},{\"id\":\"e9533224bd1e346025c237fdfafa57f0\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610621\",\"stnm\":\"官莲湖主排水港出口\",\"tm\":1654020000000,\"z\":19.760},{\"id\":\"b14ef71d0a5c5d2a233b0a5ce820bce4\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710280\",\"stnm\":\"长丰泵站拦污栅桥下游(泵站前池)\",\"tm\":1654020000000,\"wptn\":\"5\",\"z\":18.780},{\"id\":\"5cb6a82954fcf5af5c02a63ed2609446\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610871\",\"stnm\":\"十八家高闸外\",\"tm\":1654020000000,\"wptn\":\"4\",\"z\":21.990},{\"id\":\"1e599931f621e4d0583dfdc2b5997ad7\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610630\",\"stnm\":\"王家寨\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":21.960},{\"id\":\"266cacaa6cf1956393c145e4a159f87c\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610610\",\"stnm\":\"烂泥湖泵站进水港涵桥上游\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":18.830},{\"id\":\"1e2db75cef0803af38f7c71fbee478ad\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610861\",\"stnm\":\"南丰闸外\",\"tm\":1654020000000,\"wptn\":\"5\",\"z\":19.300},{\"id\":\"e8d79b71487d4e38bf0d5ef69a4cff7d\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710310\",\"stnm\":\"银莲湖泵站前池\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":18.940},{\"id\":\"0e29f26690c68de88d6a66a11c961c24\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610860\",\"stnm\":\"南丰闸内\",\"tm\":1654020000000,\"wptn\":\"5\",\"z\":17.600},{\"id\":\"18e1d1c726fd9fc347c2144242e38a79\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710300\",\"stnm\":\"五豪泵站前池\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":19.690},{\"id\":\"391571ced2710d0e08774d60f746e317\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610640\",\"stnm\":\"汉银泵站下游\",\"tm\":1654020000000,\"z\":23.240},{\"id\":\"c2ff0a644400e8323fb8136694a2c444\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610880\",\"stnm\":\"乌金闸内\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":17.910},{\"id\":\"eb5e53dc761b347d825db8bfa4ea9aae\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610841\",\"stnm\":\"汉南闸外\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":21.620},{\"id\":\"3f68b9ec8eee938e06dfb484583288b1\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710330\",\"stnm\":\"乌金泵站前池\",\"tm\":1654020000000,\"wptn\":\"5\",\"z\":17.880},{\"id\":\"b00bdb02c939ae31746d6c83974c8768\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710290\",\"stnm\":\"烂泥湖泵站前池\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":19.250},{\"id\":\"1655bba146a171914125ca32bbf8c704\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710320\",\"stnm\":\"汉银泵站前池\",\"tm\":1654020000000,\"wptn\":\"4\",\"z\":20.870},{\"id\":\"1dacce7d7aa548695c49528e4e085644\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610250\",\"stnm\":\"汤山渠\",\"tm\":1654020000000,\"z\":18.600},{\"id\":\"fd03c0d26dcbba815e5e0922cf0b3bd5\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610620\",\"stnm\":\"官莲湖主排水港中间段\",\"tm\":1654020000000,\"z\":19.640},{\"id\":\"9ea2c54c91f7cf8a60d42cfd4737ee21\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710350\",\"stnm\":\"北支四泵站前池\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":18.650},{\"id\":\"846a7dc9dc0a7a5b508ae2bad2e0eb1a\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610810\",\"stnm\":\"打鼓渡闸前\",\"tm\":1654020000000,\"wptn\":\"6\",\"z\":19.270},{\"id\":\"d9bdfe5aab4f68fde84153499f180c07\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610620\",\"stnm\":\"官莲湖主排水港中间段\",\"tm\":1654023600000,\"z\":19.640},{\"id\":\"b28728cb494ab58ca6e5922948c34ef7\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610810\",\"stnm\":\"打鼓渡闸前\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":19.270},{\"id\":\"6fefa21e8e64ca7641b6c250320eafc6\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710290\",\"stnm\":\"烂泥湖泵站前池\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":19.250},{\"id\":\"c6b66ee68888787e74bbd56d8ed94042\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610250\",\"stnm\":\"汤山渠\",\"tm\":1654023600000,\"z\":18.600},{\"id\":\"6c5f3a0ef0a9bb35f314283c3394c8d4\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610841\",\"stnm\":\"汉南闸外\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":21.620},{\"id\":\"633752ac0461b47df6ff0c48460bf6a7\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610640\",\"stnm\":\"汉银泵站下游\",\"tm\":1654023600000,\"z\":23.250},{\"id\":\"8488ca917daca1466e7dc0b3d09d3c8a\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710340\",\"stnm\":\"十八家泵站前池\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":26.290},{\"id\":\"c3fd4a4c1e7580f2fe1794d782814fcd\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610861\",\"stnm\":\"南丰闸外\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":19.300},{\"id\":\"8b26ccb46b67bd0f65319c5ff7cf952e\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610610\",\"stnm\":\"烂泥湖泵站进水港涵桥上游\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":18.830},{\"id\":\"6beaeec0a26e24659934d285bf238dc9\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710280\",\"stnm\":\"长丰泵站拦污栅桥下游(泵站前池)\",\"tm\":1654023600000,\"wptn\":\"4\",\"z\":18.750},{\"id\":\"c56244c551a5804332c0e4fea61fbaa1\",\"status\":\"0\",\"stcd\":\"ACCESS_0461610871\",\"stnm\":\"十八家高闸外\",\"tm\":1654023600000,\"wptn\":\"4\",\"z\":21.980},{\"id\":\"1a76351cb4d484573b38e029575dc697\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610630\",\"stnm\":\"王家寨\",\"tm\":1654023600000,\"wptn\":\"5\",\"z\":21.970},{\"id\":\"18e0d9e0c52f907bb5b564ca1a502a90\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710310\",\"stnm\":\"银莲湖泵站前池\",\"tm\":1654023600000,\"wptn\":\"5\",\"z\":18.950},{\"id\":\"23c61ed35bf13617e144b5b33e1063bb\",\"status\":\"0\",\"stcd\":\"ACCESS_0561610180\",\"stnm\":\"新民河\",\"tm\":1654023600000,\"z\":18.620},{\"id\":\"5b42d17b0250ec4c1eee8d74c608308d\",\"status\":\"0\",\"stcd\":\"ACCESS_0761710350\",\"stnm\":\"北支四泵站前池\",\"tm\":1654023600000,\"wptn\":\"6\",\"z\":18.650}]"; + historyDataService.xfInterface(data, XfDataEnum.ChnlData); + } +}