From 60041d6ee9bd2fcd8b6bcb827bf46e0727941665 Mon Sep 17 00:00:00 2001
From: elkers <elkers@163.com>
Date: 星期六, 12 四月 2025 11:24:28 +0800
Subject: [PATCH] 添加报警记录

---
 src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqModifyHeartbeatData.java |   49 ++
 src/main/java/com/nanjing/water/service/DataUploadRecordService.java                     |  124 ++++++
 src/main/java/com/nanjing/water/repository/mapper/HeartbeatDataMapper.java               |   10 
 src/main/java/com/nanjing/water/entity/search/SearchHeartbeatData.java                   |   14 
 src/main/java/com/nanjing/water/repository/po/DataUploadRecordPO.java                    |   12 
 src/test/java/com/nanjing/water/GenCodeGauss.java                                        |    2 
 src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqCreateHeartbeatData.java |   45 ++
 src/main/java/com/nanjing/water/repository/mapper/WaterFacilityParameterMapper.java      |    8 
 src/main/java/com/nanjing/water/repository/impl/WaterFacilityParameterMapperImpl.java    |    4 
 src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java                       |   16 
 src/main/java/com/nanjing/water/host/controller/HeartbeatDataController.java             |  136 +++++++
 src/main/java/com/nanjing/water/repository/impl/HeartbeatDataMapperImpl.java             |  143 +++++++
 src/main/java/com/nanjing/water/repository/po/HeartbeatDataPO.java                       |   74 ++++
 src/main/java/com/nanjing/water/service/WaterFacilityParameterService.java               |   17 
 src/main/java/com/nanjing/water/service/HeartbeatDataService.java                        |  251 +++++++++++++
 src/main/java/com/nanjing/water/service/convert/HeartbeatDataConvert.java                |   48 ++
 src/main/resources/application-dev.yml                                                   |    2 
 src/main/java/com/nanjing/water/repository/vo/FacilityParameterDataVO.java               |   14 
 src/main/java/com/nanjing/water/repository/vo/HeartbeatDataVO.java                       |   54 +++
 19 files changed, 995 insertions(+), 28 deletions(-)

diff --git a/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqCreateHeartbeatData.java b/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqCreateHeartbeatData.java
new file mode 100644
index 0000000..b581c07
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqCreateHeartbeatData.java
@@ -0,0 +1,45 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.entity.request.heartbeatdata;
+
+import lombok.Data;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Data
+public class ReqCreateHeartbeatData {
+	/**
+	 * null
+	 */
+	private String dataKey;
+	/**
+	 * null
+	 */
+	private Integer dataValue;
+	/**
+	 * null
+	 */
+	private String remark;
+}
diff --git a/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqModifyHeartbeatData.java b/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqModifyHeartbeatData.java
new file mode 100644
index 0000000..ea8a3d7
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/request/heartbeatdata/ReqModifyHeartbeatData.java
@@ -0,0 +1,49 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.entity.request.heartbeatdata;
+
+import lombok.Data;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Data
+public class ReqModifyHeartbeatData {
+	/**
+	 * null
+	 */
+	private Long id;
+	/**
+	 * null
+	 */
+	private String dataKey;
+	/**
+	 * null
+	 */
+	private Integer dataValue;
+	/**
+	 * null
+	 */
+	private String remark;
+}
diff --git a/src/main/java/com/nanjing/water/entity/search/SearchHeartbeatData.java b/src/main/java/com/nanjing/water/entity/search/SearchHeartbeatData.java
new file mode 100644
index 0000000..4541e88
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/search/SearchHeartbeatData.java
@@ -0,0 +1,14 @@
+package com.nanjing.water.entity.search;
+
+import lombok.Data;
+
+import com.nanjing.water.entity.dto.SearchBasicDTO;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Data
+public class SearchHeartbeatData extends SearchBasicDTO {
+
+}
diff --git a/src/main/java/com/nanjing/water/host/controller/HeartbeatDataController.java b/src/main/java/com/nanjing/water/host/controller/HeartbeatDataController.java
new file mode 100644
index 0000000..94c4bbc
--- /dev/null
+++ b/src/main/java/com/nanjing/water/host/controller/HeartbeatDataController.java
@@ -0,0 +1,136 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.host.controller;
+
+import com.nanjing.water.common.ExecutedResult;
+import com.nanjing.water.common.PagerResult;
+import com.nanjing.water.common.util.ParameterUtil;
+import com.nanjing.water.common.validator.ParameterValidateResult;
+import com.nanjing.water.common.validator.ParameterValidator;
+import com.nanjing.water.entity.request.ReqListId;
+import com.nanjing.water.host.BasicController;
+import com.nanjing.water.host.api.NonLogin;
+import com.nanjing.water.host.mqtt.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpRange;
+import org.springframework.http.HttpRequest;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import com.nanjing.water.service.HeartbeatDataService;
+import com.nanjing.water.entity.request.heartbeatdata.ReqCreateHeartbeatData;
+import com.nanjing.water.entity.request.heartbeatdata.ReqModifyHeartbeatData;
+import com.nanjing.water.entity.search.SearchHeartbeatData;
+import com.nanjing.water.repository.vo.HeartbeatDataVO;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+/**
+ * 9000.HeartbeatData
+ * @author lin.liu
+ * @order 9000
+ */
+@RestController
+@CrossOrigin
+@RequestMapping(value = "heartbeatData")
+public class HeartbeatDataController extends BasicController {
+    @Autowired
+    private HeartbeatDataService service;
+    @Autowired
+    private WebSocket webSocket;
+
+    /**
+     * 创建[null]
+     * @author lin.liu
+     */
+    @PostMapping(value = "create")
+    public ExecutedResult<Long> create(@RequestBody ReqCreateHeartbeatData request) {
+        //#region 参数验证
+        ParameterValidator validator = new ParameterValidator()
+                // 非空
+                //.addNotNullOrEmpty(ParameterUtil.named("名称"), request.getName())
+                // 限制最大长度
+                //.addLengthMax(ParameterUtil.named("名称"), request.getName(), ConstantFactory.LENGTH_MAX50)
+                ;
+        ParameterValidateResult result = validator.validate();
+        if (result.getIsFiled()) {
+            return failed(result.getErrorMsg());
+        }
+        //#endregion
+        return service.create(request);
+    }
+
+    /**
+     * 编辑[null]
+     * @author lin.liu
+     */
+    @PostMapping(value = "modify")
+    public ExecutedResult<String> modify(@RequestBody ReqModifyHeartbeatData request) {
+        //#region 参数验证
+        ParameterValidator validator = new ParameterValidator()
+                // 必须大于0
+                .addGreater(ParameterUtil.named("[null]id"), request.getId(), 0L)
+                // 非空
+                //.addNotNullOrEmpty(ParameterUtil.named("名称"), request.getName())
+                // 限制最大长度
+                //.addLengthMax(ParameterUtil.named("名称"), request.getName(), ConstantFactory.LENGTH_MAX50)
+                ;
+        ParameterValidateResult result = validator.validate();
+        if (result.getIsFiled()) {
+            return failed(result.getErrorMsg());
+        }
+        //#endregion
+        return service.modify(request);
+    }
+
+    /**
+     * 获取[null]
+     * @author lin.liu
+     */
+    @GetMapping(value = "get/{id}")
+    public ExecutedResult<HeartbeatDataVO> get(@PathVariable Long id) {
+        return service.get(id);
+    }
+    /**
+     * 获取[心跳包]
+     * @author lin.liu
+     */
+    @GetMapping(value = "getByCode")
+    public ExecutedResult<HeartbeatDataVO> getByCode() {
+        return service.getByCode();
+    }
+
+
+    /**
+     * 查询[null]
+     * @author lin.liu
+     */
+    @PostMapping(value = "search")
+    public ExecutedResult<PagerResult<HeartbeatDataVO>> search(@RequestBody SearchHeartbeatData request) {
+        return service.search(request);
+    }
+}
diff --git a/src/main/java/com/nanjing/water/repository/impl/HeartbeatDataMapperImpl.java b/src/main/java/com/nanjing/water/repository/impl/HeartbeatDataMapperImpl.java
new file mode 100644
index 0000000..ad99f7b
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/impl/HeartbeatDataMapperImpl.java
@@ -0,0 +1,143 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nanjing.water.common.PagerResult;
+import com.nanjing.water.common.enums.EYesOrNo;
+import com.nanjing.water.common.util.*;
+import com.nanjing.water.entity.dto.*;
+import com.nanjing.water.entity.enums.*;
+import com.nanjing.water.repository.BasicMapperImpl;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import com.nanjing.water.entity.search.SearchHeartbeatData;
+import com.nanjing.water.repository.mapper.HeartbeatDataMapper;
+import com.nanjing.water.repository.po.HeartbeatDataPO;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Repository
+public class HeartbeatDataMapperImpl extends BasicMapperImpl<HeartbeatDataPO, HeartbeatDataMapper> {
+	HeartbeatDataMapperImpl(HeartbeatDataMapper mapper) {
+		super(mapper);
+	}
+
+	@Override
+	public PagerResult<HeartbeatDataPO> search(SearchBasicDTO request) {
+		// 还原查询条件真实类型
+		SearchHeartbeatData search = (SearchHeartbeatData)request;
+		// 查询条件
+		LambdaQueryWrapper<HeartbeatDataPO> queryWrapper = this.query();
+		// 非逻辑删除
+		queryWrapper.eq(HeartbeatDataPO::getIsDelete, EYesOrNo.NO.getValue());
+		// 状态
+		//queryWrapper.eq(NumericUtil.tryParseInt(search.getStatus()).compareTo(0) > 0, HeartbeatDataPO::getStatus, search.getStatus());
+		// 状态列表
+		//queryWrapper.in(ListUtil.isNotNullOrEmpty(search.getListStatus()), HeartbeatDataPO::getStatus, search.getListStatus());
+
+		// 数据创建时间-起始
+		queryWrapper.ge(NumericUtil.tryParseLong(search.getCreateTimeStart()).compareTo(0L) > 0, HeartbeatDataPO::getCreateTime, search.getCreateTimeStart());
+		// 数据创建时间-截止
+		queryWrapper.le(NumericUtil.tryParseLong(search.getCreateTimeEnd()).compareTo(0L) > 0, HeartbeatDataPO::getCreateTime, search.getCreateTimeEnd());
+		// 关键字
+		//if (StringUtil.isNotNullOrEmpty(search.getKeywords())) {
+		//	queryWrapper.and(q ->
+		//		q.like(HeartbeatDataPO::getName, search.getKeywords())
+		//		.or().like(HeartbeatDataPO::getPhone, search.getKeywords())
+		//	);
+		//}
+
+		// 排序处理
+		if (ListUtil.isNotNullOrEmpty(search.getOrderBy())) {
+			for (OrderByDTO item : search.getOrderBy()) {
+				EOrderBy orderBy = EOrderBy.getByValue(item.getOrderBy());
+				// 顺序排序
+				if (item.getIsAsc()) {
+					switch (orderBy) {
+						// 主键
+						case ID:
+							queryWrapper.orderByAsc(HeartbeatDataPO::getId);
+							break;
+						// 数据创建时间
+						case CREATE_TIME:
+							queryWrapper.orderByAsc(HeartbeatDataPO::getCreateTime);
+							break;
+						// 最后更新时间
+						case UPDATE_TIME:
+							queryWrapper.orderByAsc(HeartbeatDataPO::getUpdateTime);
+							break;
+					}
+				} else {
+					// 倒叙排序
+					switch (orderBy) {
+						// 主键
+						case ID:
+							queryWrapper.orderByDesc(HeartbeatDataPO::getId);
+							break;
+						// 数据创建时间
+						case CREATE_TIME:
+							queryWrapper.orderByDesc(HeartbeatDataPO::getCreateTime);
+							break;
+						// 最后更新时间
+						case UPDATE_TIME:
+							queryWrapper.orderByDesc(HeartbeatDataPO::getUpdateTime);
+							break;
+					}
+				}
+			}
+		} else {
+			queryWrapper.orderByDesc(HeartbeatDataPO::getId);
+		}
+		Page<HeartbeatDataPO> pageResult = super.selectPage(new Page<>(search.getPage(), search.getLimit()), queryWrapper);
+		return new PagerResult<>(pageResult.getSize(), pageResult.getCurrent(), pageResult.getTotal(), pageResult.getRecords());
+	}
+
+	public Boolean add(HeartbeatDataPO item) {
+		int rowCount = super.insert(item);
+		return rowCount == 1;
+	}
+
+	public Boolean addNotIncrement(HeartbeatDataPO item) {
+		int rowCount = super.insert(item);
+		return rowCount == 1;
+	}
+
+	public HeartbeatDataPO getById(Long id) {
+		return super.get(id);
+	}
+
+	public HeartbeatDataPO getByCode(String code) {
+		LambdaQueryWrapper<HeartbeatDataPO> queryWrapper = this.query();
+		queryWrapper.eq(HeartbeatDataPO::getDataKey,code);
+		return super.selectOne(queryWrapper);
+	}
+
+	public List<HeartbeatDataPO> getListById(List<Long> listId) {
+		return super.getList(listId);
+	}
+}
diff --git a/src/main/java/com/nanjing/water/repository/impl/WaterFacilityParameterMapperImpl.java b/src/main/java/com/nanjing/water/repository/impl/WaterFacilityParameterMapperImpl.java
index 7e8a0d1..ab1f93c 100644
--- a/src/main/java/com/nanjing/water/repository/impl/WaterFacilityParameterMapperImpl.java
+++ b/src/main/java/com/nanjing/water/repository/impl/WaterFacilityParameterMapperImpl.java
@@ -33,6 +33,7 @@
 import com.nanjing.water.repository.BasicMapperImpl;
 import com.nanjing.water.repository.mapper.WaterFacilityParameterMapper;
 import com.nanjing.water.repository.po.WaterFacilityParameterPO;
+import com.nanjing.water.repository.vo.FacilityParameterDataVO;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -148,4 +149,7 @@
 		queryWrapper.in(WaterFacilityParameterPO::getFacilityId, facilityId);
 		return DB.selectList(queryWrapper);
 	}
+	public List<FacilityParameterDataVO> getListNewPump() {
+		return DB.getListNewPump();
+	}
 }
diff --git a/src/main/java/com/nanjing/water/repository/mapper/HeartbeatDataMapper.java b/src/main/java/com/nanjing/water/repository/mapper/HeartbeatDataMapper.java
new file mode 100644
index 0000000..271abeb
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/mapper/HeartbeatDataMapper.java
@@ -0,0 +1,10 @@
+package com.nanjing.water.repository.mapper;
+
+import com.nanjing.water.repository.BasicMapper;import com.nanjing.water.repository.po.HeartbeatDataPO;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+public interface HeartbeatDataMapper extends BasicMapper<HeartbeatDataPO> {
+}
diff --git a/src/main/java/com/nanjing/water/repository/mapper/WaterFacilityParameterMapper.java b/src/main/java/com/nanjing/water/repository/mapper/WaterFacilityParameterMapper.java
index 25c40de..4e6615d 100644
--- a/src/main/java/com/nanjing/water/repository/mapper/WaterFacilityParameterMapper.java
+++ b/src/main/java/com/nanjing/water/repository/mapper/WaterFacilityParameterMapper.java
@@ -2,6 +2,10 @@
 
 import com.nanjing.water.repository.BasicMapper;
 import com.nanjing.water.repository.po.WaterFacilityParameterPO;
+import com.nanjing.water.repository.vo.FacilityParameterDataVO;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * 设备设定参数 mapper
@@ -9,4 +13,8 @@
  * @author lin.liu
  */
 public interface WaterFacilityParameterMapper extends BasicMapper<WaterFacilityParameterPO> {
+
+    @Select("SELECT wf.id,wf.facility_code,wf.facility_name,wfp.columns_code,wfp.columns_show,wfp.column_value,wfp.last_time FROM  water_facility wf right JOIN water_facility_parameter wfp ON wf.id=wfp.facility_id WHERE wf.is_delete=0\n" +
+            "AND (wfp.columns_code='B001StartNumber' OR wfp.columns_code='B002StartNumber')")
+    List<FacilityParameterDataVO> getListNewPump();
 }
diff --git a/src/main/java/com/nanjing/water/repository/po/DataUploadRecordPO.java b/src/main/java/com/nanjing/water/repository/po/DataUploadRecordPO.java
index ca001e9..2dd8934 100644
--- a/src/main/java/com/nanjing/water/repository/po/DataUploadRecordPO.java
+++ b/src/main/java/com/nanjing/water/repository/po/DataUploadRecordPO.java
@@ -52,20 +52,10 @@
 	@TableField(value = "facility_name")
 	private String facilityName;
 	/**
-	 * 字段名
-	 */
-	@TableField(value = "columns_code")
-	private String columnsCode;
-	/**
-	 * 字段展示
-	 */
-	@TableField(value = "columns_show")
-	private String columnsShow;
-	/**
 	 * 字段值
 	 */
 	@TableField(value = "columns_value")
-	private BigDecimal columnsValue;
+	private String columnsValue;
 	/**
 	 * 是否删除(逻辑删除)
 	 */
diff --git a/src/main/java/com/nanjing/water/repository/po/HeartbeatDataPO.java b/src/main/java/com/nanjing/water/repository/po/HeartbeatDataPO.java
new file mode 100644
index 0000000..2902e5b
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/po/HeartbeatDataPO.java
@@ -0,0 +1,74 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.po;
+
+import lombok.Data;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Data
+@TableName("heartbeat_data")
+public class HeartbeatDataPO implements Serializable {
+	/**
+	 * null
+	 */
+	private Long id;
+	/**
+	 * null
+	 */
+	@TableField(value = "data_key")
+	private String dataKey;
+	/**
+	 * null
+	 */
+	@TableField(value = "data_value")
+	private Integer dataValue;
+	/**
+	 * null
+	 */
+	@TableLogic
+	@TableField(value = "is_delete")
+	private Integer isDelete;
+	/**
+	 * null
+	 */
+	@TableField(value = "remark")
+	private String remark;
+	/**
+	 * null
+	 */
+	@TableField(value = "create_time")
+	private Long createTime;
+	/**
+	 * null
+	 */
+	@TableField(value = "update_time")
+	private Timestamp updateTime;
+}
diff --git a/src/main/java/com/nanjing/water/repository/vo/FacilityParameterDataVO.java b/src/main/java/com/nanjing/water/repository/vo/FacilityParameterDataVO.java
new file mode 100644
index 0000000..bc7beca
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/vo/FacilityParameterDataVO.java
@@ -0,0 +1,14 @@
+package com.nanjing.water.repository.vo;
+
+import lombok.Data;
+
+@Data
+public class FacilityParameterDataVO {
+    private Long id;
+    private String facilityCode;
+    private String facilityName;
+    private String columnsCode;
+    private String columnsShow;
+    private String columnValue;
+    private String lastTime;
+}
diff --git a/src/main/java/com/nanjing/water/repository/vo/HeartbeatDataVO.java b/src/main/java/com/nanjing/water/repository/vo/HeartbeatDataVO.java
new file mode 100644
index 0000000..ee81187
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/vo/HeartbeatDataVO.java
@@ -0,0 +1,54 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.vo;
+
+import lombok.Data;
+
+import com.nanjing.water.common.util.LocalDateTimeUtil;
+import com.nanjing.water.common.util.NumericUtil;
+import java.util.Objects;
+import com.nanjing.water.repository.po.HeartbeatDataPO;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Data
+public class HeartbeatDataVO extends HeartbeatDataPO implements BasicVO {
+
+    @Override
+    public String getCreateTimeView() {
+        if (NumericUtil.tryParseLong(this.getCreateTime()).compareTo(0L) > 0) {
+            return LocalDateTimeUtil.toFormatString(this.getCreateTime());
+        }
+        return "";
+    }
+
+    @Override
+    public String getUpdateTimeView() {
+        if (Objects.isNull(this.getUpdateTime())) {
+            return "";
+        }
+        return LocalDateTimeUtil.toFormatFullString(this.getUpdateTime());
+    }
+}
diff --git a/src/main/java/com/nanjing/water/service/DataUploadRecordService.java b/src/main/java/com/nanjing/water/service/DataUploadRecordService.java
index 7e5e689..138dba4 100644
--- a/src/main/java/com/nanjing/water/service/DataUploadRecordService.java
+++ b/src/main/java/com/nanjing/water/service/DataUploadRecordService.java
@@ -23,6 +23,7 @@
 package com.nanjing.water.service;
 
 import com.baomidou.mybatisplus.core.toolkit.Sequence;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
@@ -32,14 +33,21 @@
 import com.nanjing.water.common.model.Tuple;
 import com.nanjing.water.common.util.*;
 import com.nanjing.water.host.mqtt.CountVO;
+import com.nanjing.water.host.mqtt.MQTTServer;
 import com.nanjing.water.repository.impl.*;
 import com.nanjing.water.repository.po.*;
+import com.nanjing.water.repository.vo.FacilityParameterDataVO;
 import org.apache.commons.lang3.BooleanUtils;
+import org.eclipse.paho.client.mqttv3.MqttException;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -68,6 +76,16 @@
     private WaterMonitoryPointMapperImpl waterMonitoryPointMapper;
     @Autowired
     private AlarmHistoryMapperImpl alarmHistoryMapper;
+    @Autowired
+    private HeartbeatDataMapperImpl heartbeatDataMapper;
+    @Autowired
+    private DataUploadRecordMapperImpl dataUploadRecordMapper;
+    @Autowired
+    private MQTTServer mqttServer;
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+    @Autowired
+    private ObjectMapper objectMapper;
 
     public ExecutedResult<Long> create(ReqCreateDataUploadRecord request) {
         // 转换po
@@ -268,7 +286,7 @@
      * @param topic 主题
      * @param msg 消息内容
      */
-    public void mqttReceived(String topic, String msg) {
+    public void mqttReceived(String topic, String msg) throws MqttException {
         String action = "mqtt收到消息";
         if (StringUtil.isNullOrEmpty(topic)) {
             ERROR_LOGGER.error(action, "主题不能为空");
@@ -278,6 +296,23 @@
             ERROR_LOGGER.error(action, "消息不能为空");
             return;
         }
+        //处理心跳
+        Random random=new Random();
+        int i=random.nextInt(100);
+        BigDecimal delayTime=BigDecimal.valueOf(1.0);
+        List<HeartbeatDataPO> list = heartbeatDataMapper.getList();
+        if(Objects.nonNull(list)){
+            HeartbeatDataPO heartbeatUp = list.stream().filter(item -> item.getDataKey().equals("heartbeat_up")).findFirst().orElse(null);
+            if(Objects.nonNull(heartbeatUp)){
+                heartbeatUp.setDataValue(i);
+                heartbeatDataMapper.updateById(heartbeatUp);
+            }
+            HeartbeatDataPO alarmTime = list.stream().filter(item -> item.getDataKey().equals("alarm_time")).findFirst().orElse(null);
+           if(Objects.nonNull(alarmTime)){
+               delayTime=new BigDecimal(alarmTime.getDataValue()).setScale(1, RoundingMode.DOWN);
+           }
+        }
+        //获取延时报警时间
         Gson gson = new Gson();
         JsonObject object = gson.fromJson(msg, JsonObject.class);
         String asJsonObject = object.get("time").getAsString();
@@ -291,14 +326,32 @@
             vo.setName(split[0]);
             vo.setCode(split[1]);
         }
+
         List<WaterFacilityPO> facilityPOList = waterFacilityMapper.getList();
         List<WaterFacilityParameterPO> parameterPOList = waterFacilityParameterMapper.getList();
+        //获取存入redis每天开始的启泵次数
+        List<FacilityParameterDataVO> dataVOList=new ArrayList<>();
+        String objects = redisTemplate.opsForValue().get("pump_start_number");
+        if(StringUtil.isNotNullOrEmpty(objects)){
+                dataVOList= SerializeUtil.toListObject(objects, FacilityParameterDataVO.class);
+        }
+
        // List<AlarmHistoryPO> historyPOList = alarmHistoryMapper.getList();
         //根据设备编号分组
         Map<String, List<CountVO>> collect = listVo.stream().collect(Collectors.groupingBy(CountVO::getName));
         for (Map.Entry<String, List<CountVO>> entry : collect.entrySet()) {
             //获取设备信息
             WaterFacilityPO facilityPO = facilityPOList.stream().filter(x -> x.getFacilityCode().equals(entry.getKey())).findFirst().orElse(null);
+            //历史记录上报
+            DataUploadRecordPO recordPO=new DataUploadRecordPO();
+            recordPO.setFacilityId(facilityPO.getId());
+            recordPO.setFacilityName(facilityPO.getFacilityName());
+            String json = gson.toJson(entry.getValue());
+            recordPO.setColumnsValue(json);
+            recordPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
+            recordPO.setUploadDate(LocalDateTimeUtil.toDateString(LocalDateTimeUtil.nowTimeStamp()));
+            recordPO.setUploadTime(LocalDateTimeUtil.nowTimeStamp());
+            dataUploadRecordMapper.insert(recordPO);
             //获取设备所属监控点
             List<WaterFacilityParameterPO>parameterList=new ArrayList<>();
             //循环上报数据
@@ -318,39 +371,47 @@
                 switch (vo.getCode()){
                     case "QF1":
                         //1号空开吸合关闭报警
-                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue() );
+                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "QF2":
                         //2号空开吸合关闭报警
-                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "QF3":
                         //3号空开吸合关闭报警
-                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "QF4":
                         //4号空开吸合关闭报警
-                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        QFCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "B001Fault":
                         //1号泵综合故障
-                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "B002Fault":
                         //2号泵综合故障
-                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "SQ":
                         //水侵报警
-                        SQFaultCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        SQFaultCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "H1001Fault":
                         //高水位报警
-                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
                         break;
                     case "L1001Fault":
                         //低水位报警
-                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue());
+                        faultCreateAlarm(facilityPO,parameterPO1, vo.getValue(),gson,delayTime);
+                        break;
+                    case "B001StartNumber":
+                        //1号泵启泵次数
+                        startNumber(facilityPO,parameterPO1, vo.getValue(),dataVOList);
+                        break;
+                    case "B002StartNumber":
+                        //2号泵启泵次数
+                        startNumber(facilityPO,parameterPO1, vo.getValue(),dataVOList);
                         break;
                 }
             }
@@ -359,7 +420,7 @@
         }
     }
 
-     public void QFCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value){
+     public void QFCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value, Gson gson,BigDecimal delayTime) throws MqttException {
         if(value.equals("false")){
                 alarmHistoryMapper.deleteList(parameterPO.getFacilityId(),parameterPO.getColumnsCode());
                 AlarmHistoryPO alarmHistoryPO=new AlarmHistoryPO();
@@ -370,11 +431,15 @@
                 alarmHistoryPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
                 alarmHistoryPO.setLastTime(LocalDateTimeUtil.nowTimeStamp());
                 alarmHistoryMapper.insert(alarmHistoryPO);
-
+                Map<String, Object> map = new HashMap<>();
+                map.put("alarm","true");
+                map.put("alarm_time",delayTime);
+                String dataValue = gson.toJson(map);
+                mqttServer.send("nanjing/alarm",dataValue);
 
         }
      }
-    public void faultCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value){
+    public void faultCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value, Gson gson,BigDecimal delayTime) throws MqttException {
         if(value.equals("true")){
             alarmHistoryMapper.deleteList(parameterPO.getFacilityId(),parameterPO.getColumnsCode());
             AlarmHistoryPO alarmHistoryPO=new AlarmHistoryPO();
@@ -385,11 +450,16 @@
             alarmHistoryPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
             alarmHistoryPO.setLastTime(LocalDateTimeUtil.nowTimeStamp());
             alarmHistoryMapper.insert(alarmHistoryPO);
+            Map<String, Object> map = new HashMap<>();
+            map.put("alarm","true");
+            map.put("alarm_time",delayTime);
+            String dataValue = gson.toJson(map);
+            mqttServer.send("nanjing/alarm",dataValue);
 
 
         }
     }
-    public void SQFaultCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value){
+    public void SQFaultCreateAlarm(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value, Gson gson,BigDecimal delayTime) throws MqttException {
         if(value.equals("1")){
             alarmHistoryMapper.deleteList(parameterPO.getFacilityId(),parameterPO.getColumnsCode());
             AlarmHistoryPO alarmHistoryPO=new AlarmHistoryPO();
@@ -400,8 +470,34 @@
             alarmHistoryPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
             alarmHistoryPO.setLastTime(LocalDateTimeUtil.nowTimeStamp());
             alarmHistoryMapper.insert(alarmHistoryPO);
+            Map<String, Object> map = new HashMap<>();
+            map.put("alarm","true");
+            map.put("alarm_time",delayTime);
+            String dataValue = gson.toJson(map);
+            mqttServer.send("nanjing/alarm",dataValue);
 
+        }
+    }
 
+    public void startNumber(WaterFacilityPO facilityPO,WaterFacilityParameterPO parameterPO,String value,List<FacilityParameterDataVO> dataVOList){
+        if(ListUtil.isNotNullOrEmpty(dataVOList)){
+            FacilityParameterDataVO facilityParameterDataVO = dataVOList.stream().filter(item -> item.getFacilityCode().equals(facilityPO.getFacilityCode()) && item.getColumnsCode().equals(parameterPO.getColumnsCode())).findFirst().orElse(null);
+            if(Objects.nonNull(facilityParameterDataVO)){
+                Integer columnsValue = Integer.valueOf(facilityParameterDataVO.getColumnValue());
+                Integer value1 = Integer.valueOf(value);
+                Integer dataNumber=value1-columnsValue;
+                if(dataNumber>5){
+                    alarmHistoryMapper.deleteList(parameterPO.getFacilityId(),parameterPO.getColumnsCode());
+                    AlarmHistoryPO alarmHistoryPO=new AlarmHistoryPO();
+                    alarmHistoryPO.setFacilityId(facilityPO.getId());
+                    alarmHistoryPO.setFacilityName(facilityPO.getFacilityName());
+                    alarmHistoryPO.setCode(parameterPO.getColumnsCode());
+                    alarmHistoryPO.setDescription(parameterPO.getColumnsShow()+"超过5次");
+                    alarmHistoryPO.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
+                    alarmHistoryPO.setLastTime(LocalDateTimeUtil.nowTimeStamp());
+                    alarmHistoryMapper.insert(alarmHistoryPO);
+                }
+            }
         }
     }
 }
diff --git a/src/main/java/com/nanjing/water/service/HeartbeatDataService.java b/src/main/java/com/nanjing/water/service/HeartbeatDataService.java
new file mode 100644
index 0000000..4b999ee
--- /dev/null
+++ b/src/main/java/com/nanjing/water/service/HeartbeatDataService.java
@@ -0,0 +1,251 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.service;
+
+import com.nanjing.water.common.*;
+import com.nanjing.water.common.enums.*;
+import com.nanjing.water.common.model.Tuple;
+import com.nanjing.water.common.util.*;
+import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.*;
+import java.util.stream.Collectors;
+import com.nanjing.water.repository.impl.HeartbeatDataMapperImpl;
+import com.nanjing.water.repository.po.HeartbeatDataPO;
+import com.nanjing.water.entity.request.heartbeatdata.ReqCreateHeartbeatData;
+import com.nanjing.water.entity.request.heartbeatdata.ReqModifyHeartbeatData;
+import com.nanjing.water.entity.search.SearchHeartbeatData;
+import com.nanjing.water.repository.vo.HeartbeatDataVO;
+import com.nanjing.water.service.convert.HeartbeatDataConvert;
+
+/**
+ * HeartbeatData
+ * @author lin.liu
+ */
+@Service
+public class HeartbeatDataService extends BaseService {
+    @Autowired
+    private HeartbeatDataMapperImpl mapper;
+
+    public ExecutedResult<Long> create(ReqCreateHeartbeatData request) {
+        // 转换po
+        HeartbeatDataPO item = HeartbeatDataConvert.INSTANCE.toCreate(request);
+        // 设置状态
+        //item.setStatus(EState.NORMAL.getValue());
+        // 设置记录创建时间
+        item.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
+        // 是否删除(逻辑删除)初始值
+        item.setIsDelete(EYesOrNo.NO.getValue());
+
+        int rowCount = mapper.insert(item);
+        if (rowCount != 1) {
+            return ExecutedResult.failed("创建[null]失败。");
+        }
+        return ExecutedResult.success(item.getId());
+    }
+
+    public ExecutedResult<String> modify(ReqModifyHeartbeatData request) {
+        // 验证记录是否存在
+        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(request.getId());
+        if (checkExists.isFailed()) {
+            return ExecutedResult.failed(checkExists.getMsg());
+        }
+        // 转换po
+        HeartbeatDataPO item = HeartbeatDataConvert.INSTANCE.toModify(request);
+
+        int rowCount = mapper.updateById(item);
+        if (rowCount != 1) {
+            return ExecutedResult.failed("编辑[null]失败。");
+        }
+        return ExecutedResult.success();
+    }
+
+    public ExecutedResult<HeartbeatDataVO> get(Long id) {
+        HeartbeatDataVO result = new HeartbeatDataVO();
+
+        HeartbeatDataPO find = mapper.get(id);
+        if (null != find) {
+            // 转换vo
+            result = HeartbeatDataConvert.INSTANCE.toVo(find);
+        }
+        return ExecutedResult.success(result);
+    }
+    public ExecutedResult<HeartbeatDataVO> getByCode(){
+        HeartbeatDataVO vo=new HeartbeatDataVO();
+        HeartbeatDataPO heartbeatUp = mapper.getByCode("heartbeat_up");
+        if(Objects.nonNull(heartbeatUp)){
+            vo = HeartbeatDataConvert.INSTANCE.toVo(heartbeatUp);
+        }
+        return ExecutedResult.success(vo);
+    }
+//    public ExecutedResult<String> stop(Long id) {
+//        // 验证记录是否存在
+//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(id);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        HeartbeatDataPO item = new HeartbeatDataPO();
+//        item.setId(id);
+//        item.setStatus(EState.DISABLED.getValue());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//           return ExecutedResult.failed("停用[null]失败。");
+//       }
+//       return ExecutedResult.success();
+//   }
+//
+//    public ExecutedResult<String> enable(Long id) {
+//        // 验证记录是否存在
+//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(id);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        HeartbeatDataPO item = new HeartbeatDataPO();
+//        item.setId(id);
+//        item.setStatus(EState.NORMAL.getValue());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//            return ExecutedResult.failed("启用[null]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> setSort(ReqSetSort request) {
+//        // 验证记录是否存在
+//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(request.getId());
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        HeartbeatDataPO item = new HeartbeatDataPO();
+//        item.setId(request.getId());
+//        item.setSort(request.getSort());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//            return ExecutedResult.failed("设置[null]排序值失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> listSetSort(ReqListSetSort request) {
+//        // id列表
+//        List<Long> listId = request.getList().stream().map(ReqSetSort::getId).collect(Collectors.toList());
+//        // 验证记录是否存在
+//        ExecutedResult<List<HeartbeatDataPO>> checkExists = this.check4Id(listId);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//
+//        List<HeartbeatDataPO> listUpdate = request.getList().stream()
+//                .map(c -> {
+//                    HeartbeatDataPO item = new HeartbeatDataPO();
+//                    item.setId(c.getId());
+//                    item.setSort(c.getSort());
+//                    return item;
+//                })
+//                .collect(Collectors.toList());
+//        Boolean result = mapper.modifyList(listUpdate);
+//        if (result) {
+//            return ExecutedResult.success();
+//        }
+//        return ExecutedResult.failed("[null]设置排序值失败");
+//    }
+//
+//    public ExecutedResult<String> remove(Long id) {
+//        Boolean result = mapper.deleteLogic(id);
+//        if (BooleanUtils.isFalse(result)) {
+//            return ExecutedResult.failed("删除[null]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> removeList(List<Long> ids) {
+//        Boolean result = mapper.deleteLogic(ids);
+//        if (BooleanUtils.isFalse(result)) {
+//            return ExecutedResult.failed("删除[null]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+
+    public ExecutedResult<List<HeartbeatDataVO>> getList(List<Long> listId) {
+        List<HeartbeatDataVO> result = new ArrayList<>();
+
+        List<HeartbeatDataPO> list = mapper.getList(listId);
+        if (ListUtil.isNotNullOrEmpty(list)) {
+            // 转换vo
+            result = HeartbeatDataConvert.INSTANCE.toVo(list);
+        }
+        return ExecutedResult.success(result);
+    }
+
+    public ExecutedResult<PagerResult<HeartbeatDataVO>> search(SearchHeartbeatData search) {
+        // 处理创建时间范围-查询参数
+        Tuple<String, String> createTimeRange = ParameterUtil.getTimeRange(search.getCreateTimeRange());
+        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem1())) {
+            search.setCreateTimeStart(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem1()).getTime());
+        }
+        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem2())) {
+            search.setCreateTimeEnd(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem2()).getTime());
+        }
+
+        PagerResult<HeartbeatDataPO> pageList = mapper.search(search);
+        List<HeartbeatDataVO> listVo = new ArrayList<>();
+        List<HeartbeatDataPO> list = pageList.getList();
+        if (ListUtil.isNotNullOrEmpty(list)) {
+            pageList.setLastId(list.get(list.size() - 1).getId());
+            // 转换vo
+            listVo = HeartbeatDataConvert.INSTANCE.toVo(list);
+        }
+        PagerResult<HeartbeatDataVO> result = new PagerResult<>(pageList.getLimit(), pageList.getPage(), pageList.getTotal(), listVo);
+        result.setLastId(pageList.getLastId());
+        return ExecutedResult.success(result);
+    }
+
+    protected ExecutedResult<HeartbeatDataPO> check4Id(Long id) {
+        HeartbeatDataPO exists = mapper.get(id);
+        if (Objects.isNull(exists)) {
+            return ExecutedResult.failed("[null]不存在:" + id);
+        }
+        return ExecutedResult.success(exists);
+    }
+    protected ExecutedResult<List<HeartbeatDataPO>> check4Id(List<Long> listId) {
+        // 从数据库查找null
+        List<HeartbeatDataPO> list = mapper.getList(listId);
+        if (ListUtil.isNullOrEmpty(list)) {
+            return ExecutedResult.failed("[null]不存在." + listId);
+        }
+        // 数据库找到的id列表
+        List<Long> listIdFind = list.stream().map(HeartbeatDataPO::getId).collect(Collectors.toList());
+        // 数量不一致
+        if (listId.size() != listIdFind.size()) {
+            // 筛选数据库不存在的null
+            List<Long> listIdNotFound = listId.stream().filter(c -> !listIdFind.contains(c)).collect(Collectors.toList());
+            if (ListUtil.isNullOrEmpty(list)) {
+                return ExecutedResult.failed("[null]不存在." + listIdNotFound);
+            }
+        }
+        return ExecutedResult.success(list);
+    }}
diff --git a/src/main/java/com/nanjing/water/service/WaterFacilityParameterService.java b/src/main/java/com/nanjing/water/service/WaterFacilityParameterService.java
index 1b456dd..566a5c4 100644
--- a/src/main/java/com/nanjing/water/service/WaterFacilityParameterService.java
+++ b/src/main/java/com/nanjing/water/service/WaterFacilityParameterService.java
@@ -35,9 +35,12 @@
 import com.nanjing.water.repository.impl.WaterMonitoryPointMapperImpl;
 import com.nanjing.water.repository.po.WaterFacilityPO;
 import com.nanjing.water.repository.po.WaterFacilityParameterPO;
+import com.nanjing.water.repository.vo.FacilityParameterDataVO;
 import com.nanjing.water.repository.vo.WaterFacilityParameterVO;
 import com.nanjing.water.repository.vo.WaterFacilityVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -45,6 +48,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -59,6 +63,8 @@
     private WaterFacilityMapperImpl waterFacilityMapper;
     @Autowired
     private WaterMonitoryPointMapperImpl waterMonitoryPointMapper;
+    @Autowired
+    private StringRedisTemplate redisTemplate;
 
     public ExecutedResult<String> create(ReqAddParameter request) {
         WaterFacilityPO facilityPO = waterFacilityMapper.get(request.getFacilityId());
@@ -119,6 +125,17 @@
         return ExecutedResult.success(result);
     }
 
+    /**
+     *
+     * @return
+     */
+    public ExecutedResult<String> getNewDataPump(){
+        //获取所有泵房启泵次数
+        List<FacilityParameterDataVO> listNewPump = mapper.getListNewPump();
+        redisTemplate.opsForValue().set("pump_start_number",SerializeUtil.toJson(listNewPump));
+        redisTemplate.expire("pump_start_number",24,TimeUnit.HOURS);
+        return ExecutedResult.success();
+    }
     public ExecutedResult<List<WaterFacilityParameterPO>> getListByFacilityId(Long facilityId) {
         List<WaterFacilityParameterPO> list = new ArrayList<>();
         LambdaQueryWrapper<WaterFacilityParameterPO> wrapper = new LambdaQueryWrapper<>();
diff --git a/src/main/java/com/nanjing/water/service/convert/HeartbeatDataConvert.java b/src/main/java/com/nanjing/water/service/convert/HeartbeatDataConvert.java
new file mode 100644
index 0000000..60dd1ce
--- /dev/null
+++ b/src/main/java/com/nanjing/water/service/convert/HeartbeatDataConvert.java
@@ -0,0 +1,48 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.service.convert;
+
+import com.nanjing.water.entity.request.heartbeatdata.ReqCreateHeartbeatData;
+import com.nanjing.water.entity.request.heartbeatdata.ReqModifyHeartbeatData;
+import com.nanjing.water.repository.po.HeartbeatDataPO;
+import com.nanjing.water.repository.vo.HeartbeatDataVO;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * HeartbeatData
+ * @author {#=author}
+ */
+@Mapper
+public interface HeartbeatDataConvert {
+    HeartbeatDataConvert INSTANCE = Mappers.getMapper(HeartbeatDataConvert.class);
+
+    HeartbeatDataPO toCreate(ReqCreateHeartbeatData request);
+    HeartbeatDataPO toModify(ReqModifyHeartbeatData request);
+
+    HeartbeatDataVO toVo(HeartbeatDataPO item);
+    List<HeartbeatDataVO> toVo(List<HeartbeatDataPO> list);
+}
diff --git a/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java b/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
index 3927379..e73f819 100644
--- a/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
+++ b/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
@@ -10,6 +10,7 @@
 import com.nanjing.water.common.util.StringUtil;
 import com.nanjing.water.repository.impl.QuartzTaskErrorMapperImpl;
 import com.nanjing.water.repository.impl.QuartzTaskRecordMapperImpl;
+import com.nanjing.water.service.WaterFacilityParameterService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +28,8 @@
     private QuartzTaskRecordMapperImpl taskRecordsDao;
     @Autowired
     private QuartzTaskErrorMapperImpl taskErrorsDao;
+    @Autowired
+    private WaterFacilityParameterService waterFacilityParameterService;
 
     /**
      * 执行job
@@ -42,7 +45,18 @@
             return ExecutedResult.failed(e.toString());
         }
     }
-
+    /***
+     * job执行器-查询最新启泵数据
+     * @param jobParameter 执行参数
+     */
+    public ExecutedResult<String> getNewDataPump(String jobParameter) {
+        try {
+            waterFacilityParameterService.getNewDataPump();
+            return ExecutedResult.success();
+        } catch (Exception e) {
+            return ExecutedResult.failed(e.toString());
+        }
+    }
     /***
      * job执行器-清理任务调度日志
      * @param jobParameter 执行参数
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index a7ee327..ab773e8 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -43,7 +43,7 @@
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 mqtt:
   # 是否启用
-  enable: false
+  enable: true
   host: 113.250.189.120
   port: 1885
   user: admin
diff --git a/src/test/java/com/nanjing/water/GenCodeGauss.java b/src/test/java/com/nanjing/water/GenCodeGauss.java
index c60413a..0785f5f 100644
--- a/src/test/java/com/nanjing/water/GenCodeGauss.java
+++ b/src/test/java/com/nanjing/water/GenCodeGauss.java
@@ -244,7 +244,7 @@
      * 只生成以下配置的表
      */
     private static final List<String> ONLY_TABLES = Arrays.asList(
-     "data_upload_record"
+     "heartbeat_data"
     );
 
     public static void main(String[] args) {

--
Gitblit v1.9.3