lihui001 преди 3 години
родител
ревизия
ac758fad3a
променени са 42 файла, в които са добавени 2010 реда и са изтрити 591 реда
  1. 1 1
      common/src/main/java/com/zcxk/exception/GloabalExceptionHandle.java
  2. 2 2
      operation_manager/src/main/java/com/zcxk/process/activiti/model/RejectConfig.java
  3. 1 1
      operation_manager/src/main/java/com/zcxk/process/activiti/model/TaskExtendConfig.java
  4. 22 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/AlarmDetailsAddDto.java
  5. 28 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/AlarmTypeDetailsDto.java
  6. 34 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/DeviceDataDto.java
  7. 28 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/DeviceStateDto.java
  8. 21 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/TimeValueDto.java
  9. 37 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/enums/AlarmStateEnum.java
  10. 16 6
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/enums/DeviceStatusEnum.java
  11. 52 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/AlarmTypeDetailsEntityVo.java
  12. 3 3
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/AlarmTypeVo.java
  13. 32 0
      zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/DeviceSceneVo.java
  14. 145 145
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmDetailMapper.java
  15. 61 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmTypeDetailMapper.java
  16. 9 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmTypeMapper.java
  17. 30 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/DeviceMapper.java
  18. 10 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/DeviceSceneMapper.java
  19. 8 49
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/entity/AlarmDetailsEntity.java
  20. 39 39
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmDetailMapper.xml
  21. 85 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmTypeDetailMapper.xml
  22. 6 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmTypeMapper.xml
  23. 13 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/DeviceMapper.xml
  24. 12 0
      zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/DeviceSceneMapper.xml
  25. 1 1
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/config/ResourceServerConfig.java
  26. 14 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/constants/Constants.java
  27. 18 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/constants/RedisConstants.java
  28. 19 195
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/controller/AlarmDetailsController.java
  29. 48 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/controller/NotifyController.java
  30. 115 115
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmDetailsService.java
  31. 58 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmTypeDetailsService.java
  32. 9 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmTypeService.java
  33. 43 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/NotifyService.java
  34. 244 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/AlarmDataHandle.java
  35. 139 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/DispatchReportHandle.java
  36. 192 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/ReceiveDeviceDataService.java
  37. 216 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/ReportWaterPumpStateHandle.java
  38. 126 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/AlarmTypeDetailsServiceImpl.java
  39. 5 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/AlarmTypeServiceImpl.java
  40. 2 2
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/DeviceServiceImpl.java
  41. 63 0
      zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/NotifyServiceImpl.java
  42. 3 32
      zoniot-water/zoniot-water-xxl-client/src/main/java/com/zcxk/water/xxl/mq/ReceiveClearData.java

+ 1 - 1
common/src/main/java/com/zcxk/exception/GloabalExceptionHandle.java

@@ -61,7 +61,7 @@ public class GloabalExceptionHandle {
 
     /**
      * 捕捉404异常,这个方法只在配置
-     * spring.mvc.throw-exception-if-no-handler-found=true来后起作用
+     * spring.mvc.throw-exception-if-no-handle-found=true来后起作用
      *
      */
     @ResponseStatus(HttpStatus.NOT_FOUND)

+ 2 - 2
operation_manager/src/main/java/com/zcxk/process/activiti/model/RejectConfig.java

@@ -1,9 +1,9 @@
 package com.zcxk.process.activiti.model;
 
 /**
- * {"rejectConfig":[{"from":"usertask2","assignee":"handler"},{"from":"usertask3","assignee":"claimer"}]}
+ * {"rejectConfig":[{"from":"usertask2","assignee":"handle"},{"from":"usertask3","assignee":"claimer"}]}
  * claimer:任务领取人
- * handler:任务处理人
+ * handle:任务处理人
  *
  * @author wilian.peng
  * @Description

+ 1 - 1
operation_manager/src/main/java/com/zcxk/process/activiti/model/TaskExtendConfig.java

@@ -23,7 +23,7 @@ public class TaskExtendConfig {
     }
 
     public static void main(String[] args) {
-        String jsonStr = "{\"rejectConfig\":[{\"from\":\"usertask2\",\"assignee\":\"handler\"},{\"from\":\"usertask3\",\"assignee\":\"claimer\"}]}";
+        String jsonStr = "{\"rejectConfig\":[{\"from\":\"usertask2\",\"assignee\":\"handle\"},{\"from\":\"usertask3\",\"assignee\":\"claimer\"}]}";
         TaskExtendConfig config = JSON.parseObject(jsonStr, TaskExtendConfig.class);
         List<RejectConfig> rejectConfigList = config.getRejectConfig();
         for (RejectConfig cfg : rejectConfigList) {

+ 22 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/AlarmDetailsAddDto.java

@@ -0,0 +1,22 @@
+package com.zcxk.water.api.dto;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description
+ * @author wangli
+ * @data 2020-11-16 11:48
+ */
+@Api("报警信息")
+@Data
+public class AlarmDetailsAddDto {
+
+    @ApiModelProperty(value = "物联网告警Id")
+    private Integer alarmId;
+
+    @ApiModelProperty("告警时间")
+    private Integer alarmStartTime;
+
+}

+ 28 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/AlarmTypeDetailsDto.java

@@ -0,0 +1,28 @@
+package com.zcxk.water.api.dto;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description
+ * @author wangli
+ * @data 2020-11-16 11:48
+ */
+@Api("报警信息")
+@Data
+public class AlarmTypeDetailsDto extends BasePageDto {
+
+    @ApiModelProperty(value = "告警名字")
+    private String alarmName;
+
+    @ApiModelProperty("告警分类")
+    private Integer alarmCategory;
+
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+
+}

+ 34 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/DeviceDataDto.java

@@ -0,0 +1,34 @@
+package com.zcxk.water.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>设备数据</p>
+ *
+ * @Author Andy
+ * @Date 2021/10/16 19:15
+ * @Version 1.0
+ */
+@Data
+public class DeviceDataDto implements Serializable {
+
+    @ApiModelProperty(value = "设备ID")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceNo;
+
+    @ApiModelProperty(value = "上报原始数据")
+    private Object encodeData;
+
+    @ApiModelProperty(value = "上报解析后数据")
+    private List<TimeValueDto> decodeData ;
+
+    @ApiModelProperty(value = "上报时间")
+    private Date eventTime;
+}

+ 28 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/DeviceStateDto.java

@@ -0,0 +1,28 @@
+package com.zcxk.water.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: TODO
+ * @date 2021/10/19
+ **/
+@Data
+public class DeviceStateDto implements Serializable {
+
+    @ApiModelProperty(value = "设备ID")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceNo;
+
+    @ApiModelProperty(value = "详情")
+    private String description ;
+
+    @ApiModelProperty(value = "状态")
+    private int state ;
+}

+ 21 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/dto/TimeValueDto.java

@@ -0,0 +1,21 @@
+package com.zcxk.water.api.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author wilian.peng
+ */
+@Data
+public class TimeValueDto {
+    /**
+     * 采集時間
+     */
+    Date time;
+    /**
+     * 为当前时间点数据
+     */
+    Map<String,Object> value;
+}

+ 37 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/enums/AlarmStateEnum.java

@@ -0,0 +1,37 @@
+package com.zcxk.water.api.enums;
+
+import lombok.Getter;
+
+/**
+ * @author Andy
+ * @version V1.0
+ **/
+@Getter
+public enum AlarmStateEnum {
+
+    /**
+     * 历史报警
+     */
+    HISTORY_ALARM ( 0,"历史报警"),
+
+    /**
+     * 实时报警
+     */
+    REALTIME_ALARM( 1,"实时报警"),
+
+    ;
+
+
+    private int code;
+
+    /**
+     * 消息
+     */
+    private String message;
+
+    AlarmStateEnum(int code, String message){
+        this.code = code;
+        this.message = message;
+    }
+
+}

+ 16 - 6
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/enums/DeviceStatusEnum.java

@@ -11,12 +11,6 @@ import lombok.Getter;
 @Getter
 public enum DeviceStatusEnum {
 
-    /**
-     * 未启用
-     * @return
-     */
-    NOT_ENABLED(0),
-
     /**
      * 正常
      */
@@ -37,6 +31,11 @@ public enum DeviceStatusEnum {
       */
     SCRAP(4),
 
+    /**
+     * 未启用
+     */
+    NOT_ENABLED(5),
+
     ;
 
     private int code;
@@ -44,4 +43,15 @@ public enum DeviceStatusEnum {
     DeviceStatusEnum(int code){
         this.code = code;
     }
+
+    /**
+    * 是否告警
+    * @author Andy
+    * @date 18:10 2021/10/19
+    * @param code:
+    * @return boolean
+    **/
+    public static boolean offline(int code){
+         return  code == DeviceStatusEnum.ALARM.getCode() || code == DeviceStatusEnum.OFF_LINE.getCode();
+    }
 }

+ 52 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/AlarmTypeDetailsEntityVo.java

@@ -0,0 +1,52 @@
+package com.zcxk.water.api.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description
+ * @author wangli
+ * @data 2020-11-16 11:48
+ */
+@Api("报警信息")
+@Data
+public class AlarmTypeDetailsEntityVo {
+
+    private static final long serialVersionUID = -3866939316262264972L;
+
+    @ApiModelProperty(value = "告警名称")
+    @ExcelProperty(value = "告警名称",index = 0 )
+    private String alarmName;
+
+    @ApiModelProperty(value = "场景名称")
+    @ExcelProperty(value = "场景名称",index = 1 )
+    private String sceneName;
+
+    @ApiModelProperty(value = "设备名称")
+    @ExcelProperty(value = "设备名称",index = 2 )
+    private String deviceName;
+
+    @ApiModelProperty(value = "产品")
+    @ExcelProperty(value = "产品",index = 3 )
+    private String productName;
+
+    @ApiModelProperty(value = "告警描述")
+    @ExcelProperty(value = "告警描述",index = 4 )
+    private String desc;
+
+    @ApiModelProperty(value = "地址")
+    @ExcelProperty(value = "地址",index = 5 )
+    private String address;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
+    @ApiModelProperty(value = "告警时间",example = "2020-12-12 12:12:12")
+    @ExcelProperty(value = "告警时间",index = 6)
+    private Date alarmStartTime;
+
+
+}

+ 3 - 3
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/AlarmTypeVo.java

@@ -26,8 +26,8 @@ public class AlarmTypeVo {
     @ApiModelProperty(value="产品名字")
     private String deviceName;
 
-    @ApiModelProperty(value="产品名字")
-    private String deviceId;
+    @ApiModelProperty(value="产品Id")
+    private Long deviceId;
 
     @ApiModelProperty(value="名称")
     private String alarmName;
@@ -38,7 +38,7 @@ public class AlarmTypeVo {
     @ApiModelProperty(value="描述")
     private String desc;
 
-    @ApiModelProperty(value="告警分类 1:业务报警 2:设备故障")
+    @ApiModelProperty(value="告警分类 1:设备告警,2:离线告警")
     private String alarmCategory;
 
     @ApiModelProperty(value="是否启用")

+ 32 - 0
zoniot-water/zoniot-water-api/src/main/java/com/zcxk/water/api/vo/DeviceSceneVo.java

@@ -0,0 +1,32 @@
+package com.zcxk.water.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description 目前只做两级
+ * @author  Andy
+ * @data 2020-11-16 11:47
+ */
+@Data
+@ApiModel("设备信息")
+public class DeviceSceneVo {
+
+
+    @ApiModelProperty(value = "场景ID")
+    private Long sceneId;
+
+    @ApiModelProperty(value = "父场景ID")
+    private Long parentSceneId;
+
+    @ApiModelProperty(value = "场景名字")
+    private String sceneName;
+
+    @ApiModelProperty(value = "父场景名字")
+    private String parentSceneName;
+
+}
+
+
+

+ 145 - 145
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmDetailMapper.java

@@ -21,50 +21,50 @@ import java.util.List;
 public interface AlarmDetailMapper {
 
     /**
-    * 查询单个设备报警
-    * @author Andy
-    * @date 17:49 2021/8/17
-    * @param id:
-    * @return AlarmDetailsEntityVo
-    **/
+     * 查询单个设备报警
+     * @author Andy
+     * @date 17:49 2021/8/17
+     * @param id:
+     * @return AlarmDetailsEntityVo
+     **/
     AlarmDetailsEntityVo selectById(Integer id);
 
     /**
-    * 按设备ID查询报警信息
-    * @author Andy
-    * @date 17:49 2021/8/17
-    * @param sceneId:
-    * @param deviceId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 按设备ID查询报警信息
+     * @author Andy
+     * @date 17:49 2021/8/17
+     * @param sceneId:
+     * @param deviceId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectByDeviceId(@Param("sceneId") Long sceneId, @Param("deviceId") Integer deviceId);
 
 
     /**
-    * 查询设备报警
-    * @author Andy
-    * @date 14:42 2021/8/13
-    * @param ids:
-    * @return java.util.List<AlarmDetailsRealTimeVo>
-    **/
+     * 查询设备报警
+     * @author Andy
+     * @date 14:42 2021/8/13
+     * @param ids:
+     * @return java.util.List<AlarmDetailsRealTimeVo>
+     **/
     List<AlarmDetailsRealTimeVo> selectRealTimeByIds(@Param("ids") List<Integer> ids);
 
     /**
-    * 查询历史
-    * @author Andy
-    * @date 14:42 2021/8/13
-    * @param ids:
-    * @return java.util.List<AlarmDetailsHistoryVo>
-    **/
+     * 查询历史
+     * @author Andy
+     * @date 14:42 2021/8/13
+     * @param ids:
+     * @return java.util.List<AlarmDetailsHistoryVo>
+     **/
     List<AlarmDetailsHistoryVo> selectHistoryByIds(@Param("ids") List<Integer> ids);
 
     /**
-    * 添加设备报警
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param alarmDetailsEntity:
-    * @return java.lang.Integer
-    **/
+     * 添加设备报警
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param alarmDetailsEntity:
+     * @return java.lang.Integer
+     **/
     Integer insert(AlarmDetailsEntity alarmDetailsEntity);
 
     /**
@@ -75,171 +75,171 @@ public interface AlarmDetailMapper {
     Integer batchInsert(@Param("alarmDetails") List<AlarmDetailsEntity> alarmDetails);
 
     /**
-    * 单条删除设备报警
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param id:
-    * @return java.lang.Integer
-    **/
+     * 单条删除设备报警
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param id:
+     * @return java.lang.Integer
+     **/
     Integer deleteById(Integer id);
 
     /**
-    * 设备报警
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param ids:
-    * @return java.lang.Integer
-    **/
+     * 设备报警
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param ids:
+     * @return java.lang.Integer
+     **/
     Integer batchDelete(@Param("ids") List<Integer> ids);
 
     /**
-    * 挂起、恢复设备报警
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param id:
-    * @param opState:
-    * @param dateUpdate:
-    * @param updateBy:
-    * @return java.lang.Integer
-    **/
+     * 挂起、恢复设备报警
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param id:
+     * @param opState:
+     * @param dateUpdate:
+     * @param updateBy:
+     * @return java.lang.Integer
+     **/
     Integer suspendedById(@Param("id") Integer id, @Param("opState") Integer opState, @Param("dateUpdate") Date dateUpdate, @Param("updateBy") String updateBy);
 
     /**
-    * 修改设备报警信息
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param alarmDetailsEntity:
-    * @return java.lang.Integer
-    **/
+     * 修改设备报警信息
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param alarmDetailsEntity:
+     * @return java.lang.Integer
+     **/
     Integer update(AlarmDetailsEntity alarmDetailsEntity);
 
     /**
-    * 查询设备报警信息
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 查询设备报警信息
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectList(@Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 分页查询
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsEntityVo>
-    **/
+     * 分页查询
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsEntityVo>
+     **/
     IPage<AlarmDetailsEntityVo> selectPage(@Param("page") IPage<AlarmDetailsDto> page, @Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
-    * 查询实时设备报警信息
-    * @author Andy
-    * @date 17:50 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsRealTimeVo>
-    **/
+     * 查询实时设备报警信息
+     * @author Andy
+     * @date 17:50 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsRealTimeVo>
+     **/
     List<AlarmDetailsRealTimeVo> selectRealTimeList(@Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 查询历史设备报警信息
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsHistoryVo>
-    **/
+     * 查询历史设备报警信息
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsHistoryVo>
+     **/
     List<AlarmDetailsHistoryVo> selectHistoryList(@Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
-    * 分页查询实时数据
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsRealTimeVo>
-    **/
+     * 分页查询实时数据
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsRealTimeVo>
+     **/
     IPage<AlarmDetailsRealTimeVo> selectRealTimePage(@Param("page") IPage<AlarmDetailsRealTimeDto> page, @Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
-    * 分页查询历史数据
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsHistoryVo>
-    **/
+     * 分页查询历史数据
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsHistoryVo>
+     **/
     IPage<AlarmDetailsHistoryVo> selectHistoryPage(@Param("page") IPage<AlarmDetailsHistoryDto> page, @Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
-    * 查询报警规则数据
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param deviceId:
-    * @param alarmType:
-    * @return java.util.List<DeviceCheckAlarmVo>
-    **/
+     * 查询报警规则数据
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param deviceId:
+     * @param alarmType:
+     * @return java.util.List<DeviceCheckAlarmVo>
+     **/
     List<DeviceCheckAlarmVo> selectDeviceForCheckAlarm(@Param("deviceId") Integer deviceId, @Param("alarmType") String alarmType);
 
     /**
-    * 查询设备报警信息
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param deviceId:
-    * @param alarmType:
-    * @param alarmSettingIds:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 查询设备报警信息
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param deviceId:
+     * @param alarmType:
+     * @param alarmSettingIds:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectStateAlarm(@Param("deviceId") Integer deviceId, @Param("alarmType") String alarmType, @Param("alarmSettingIds") List<Long> alarmSettingIds);
 
     /**
-    * udpateLastUpdateTime
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param deviceId:
-    * @param lastUpdateTime:
-    * @return java.lang.Integer
-    **/
+     * udpateLastUpdateTime
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param deviceId:
+     * @param lastUpdateTime:
+     * @return java.lang.Integer
+     **/
     Integer udpateLastUpdateTime(@Param("deviceId") Integer deviceId, @Param("lastUpdateTime") Date lastUpdateTime);
 
     /**
-    * getAlarmInfoForWorkOrderManage
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param :
-    * @return java.util.List<DeviceAlarmInfoForOrderVo>
-    **/
+     * getAlarmInfoForWorkOrderManage
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param :
+     * @return java.util.List<DeviceAlarmInfoForOrderVo>
+     **/
     List<DeviceAlarmInfoForOrderVo> getAlarmInfoForWorkOrderManage();
 
     /**
-    * updateAlarmSendMessageState
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param list:
-    * @return java.lang.Integer
-    **/
+     * updateAlarmSendMessageState
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param list:
+     * @return java.lang.Integer
+     **/
     Integer updateAlarmSendMessageState(List<DeviceAlarmInfoForOrderVo> list);
 
     /**
-    * selectBySceneId
-    * @author Andy
-    * @date 17:51 2021/8/17
-    * @param sceneId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * selectBySceneId
+     * @author Andy
+     * @date 17:51 2021/8/17
+     * @param sceneId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectBySceneId(@Param("sceneId") Integer sceneId);
 
     /**
-    * selectByDeviceAttributeId
-    * @author Andy
-    * @date 17:52 2021/8/17
-    * @param sceneId:
-    * @param deviceId:
-    * @param attributeId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * selectByDeviceAttributeId
+     * @author Andy
+     * @date 17:52 2021/8/17
+     * @param sceneId:
+     * @param deviceId:
+     * @param attributeId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectByDeviceAttributeId(@Param("sceneId") Long sceneId, @Param("deviceId") Integer deviceId, @Param("attributeId") Integer attributeId);
 }

+ 61 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmTypeDetailMapper.java

@@ -0,0 +1,61 @@
+package com.zcxk.water.core.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.water.api.dto.AlarmDetailsDto;
+import com.zcxk.water.api.dto.AlarmTypeDetailsDto;
+import com.zcxk.water.api.vo.AlarmTypeDetailsEntityVo;
+import com.zcxk.water.core.entity.AlarmDetailsEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @description
+ * @author  wangli
+ * @data 2020-11-17 14:40
+ */
+@Mapper
+public interface AlarmTypeDetailMapper {
+
+
+    /**
+    * 添加设备报警
+    * @author Andy
+    * @date 17:50 2021/8/17
+    * @param alarmDetailsEntity:
+    * @return java.lang.Integer
+    **/
+    Integer insert(AlarmDetailsEntity alarmDetailsEntity);
+
+    /**
+     * 批量插入设备报警信息
+     * @param alarmDetails
+     * @return
+     */
+    Integer batchInsert(@Param("alarmDetails") List<AlarmDetailsEntity> alarmDetails);
+
+    /**
+    * 分页查询
+    * @author Andy
+    * @date 15:40 2021/10/19
+    * @param page:
+    * @param alarmDetailsDto:
+    * @param condition:
+    * @return com.baomidou.mybatisplus.core.metadata.IPage<com.zcxk.water.api.vo.AlarmDetailsEntityVo>
+    **/
+    IPage<AlarmTypeDetailsEntityVo> selectPage(@Param("page") IPage<AlarmDetailsDto> page, @Param("alarmDetailsDto") AlarmTypeDetailsDto alarmDetailsDto, @Param("userCondition") UserCondition condition);
+
+
+    /**
+    * 更新状态
+    * @author Andy
+    * @date 18:17 2021/10/19
+    * @param deviceId:
+    * @param state:
+    * @return java.lang.Integer
+    **/
+    Integer updateStateByDeviceId(@Param("deviceId") Long deviceId, @Param("state") Integer state);
+
+}

+ 9 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/AlarmTypeMapper.java

@@ -44,6 +44,15 @@ public interface AlarmTypeMapper {
     **/
     AlarmType findById(@Param("id") Integer id);
 
+    /**
+    * 查找设备ID
+    * @author Andy
+    * @date 17:37 2021/10/19
+    * @param id:
+    * @return java.lang.Long
+    **/
+    Long findDeviceIdByIotAlarmId(Integer id);
+
     /**
     * 分页查询
     * @author Andy

+ 30 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/DeviceMapper.java

@@ -7,6 +7,7 @@ import com.zcxk.water.core.entity.DeviceEntity;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -126,4 +127,33 @@ public interface DeviceMapper {
     **/
     List<DeviceVo> selectListBySceneId(@Param("deviceDto") DeviceDto deviceDto);
 
+    /**
+    * 修改最后上报时间
+    * @author Andy
+    * @date 17:08 2021/10/19
+    * @param deviceId:
+    * @param lastUpdateTime:
+    * @return java.lang.Integer
+    **/
+    Integer updateLastTime(@Param("deviceId") Integer deviceId, @Param("lastUpdateTime") Date lastUpdateTime);
+
+    /**
+    * 修改设备状态
+    * @author Andy
+    * @date 17:55 2021/10/19
+    * @param deviceId:
+    * @param state:
+    * @return java.lang.Integer
+    **/
+    Integer updateStateByIotDeviceId(@Param("deviceId") Long deviceId, @Param("state") Integer state);
+
+    /**
+    * 根据物联网设备ID查找设备id
+    * @author Andy
+    * @date 18:06 2021/10/19
+    * @param iotDeviceId:
+    * @return java.lang.Long
+    **/
+    Long findDeviceIdByIotDeviceId(Long iotDeviceId);
+
 }

+ 10 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/dao/DeviceSceneMapper.java

@@ -1,6 +1,7 @@
 package com.zcxk.water.core.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zcxk.water.api.vo.DeviceSceneVo;
 import com.zcxk.water.api.vo.SceneIdVo;
 import com.zcxk.water.core.entity.DeviceSceneEntity;
 import org.apache.ibatis.annotations.Mapper;
@@ -46,4 +47,13 @@ public interface DeviceSceneMapper extends BaseMapper<DeviceSceneEntity> {
      **/
      SceneIdVo findSceneId(String firstSceneTypeName, String secondSceneTypeName, Long deviceId);
 
+     /**
+     * 查找该设备的场景:场景->父场景
+     * @author Andy
+     * @date 16:45 2021/10/19
+     * @param deviceId:
+     * @return java.util.List<com.zcxk.water.api.vo.DeviceSceneVo>
+     **/
+     List<DeviceSceneVo> findSceneByDeviceId(Long deviceId);
+
 }

+ 8 - 49
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/entity/AlarmDetailsEntity.java

@@ -22,70 +22,29 @@ public class AlarmDetailsEntity implements Serializable {
 
     @ApiModelProperty(value = "主键id")
     private Long id;
-    @ApiModelProperty(value = "租户标识")
-    private String tenantId;
 
-    @ApiModelProperty("一级场景信息")
-    private Integer parentSceneId;
+    @ApiModelProperty(value = "告警ID")
+    private Long alarmId;
 
-    @ApiModelProperty("一级场景名称")
-    private String parentSceneName;
+    @ApiModelProperty("场景ID: 父场景-子场景")
+    private String sceneId;
 
-    @ApiModelProperty("场景信息")
-    private Integer sceneId;
-
-    @ApiModelProperty("场景名称")
+    @ApiModelProperty("场景名称: 父场景-子场景")
     private String sceneName;
 
-    @ApiModelProperty(value = "设备信息")
-    private Integer deviceId;
-
-    @ApiModelProperty(value = "所属公司")
-    private Integer companyOrgId;
-
-    @ApiModelProperty(value = "所属部门")
-    private Integer deptOrgId;
-
-    @ApiModelProperty(value = "报警参数设置id")
-    private Integer alarmSettingId;
-
-
-    @ApiModelProperty(value = "报警类型")
-    private String alarmType;
-    @ApiModelProperty(value = "报警参数ID")
-    private Integer attributeId;
-    @ApiModelProperty(value = "当前数值")
-    private Double alarmValue;
-    @ApiModelProperty(value = "最小告警数值")
-    private Double minValue;
-    @ApiModelProperty(value = "最大告警数值")
-    private Double maxValue;
-    @ApiModelProperty(value = "报警详情")
-    private String alarmContent;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @ApiModelProperty(value = "报警开始时间",example = "2020-12-12 12:12:12")
     private Date alarmStartTime;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @ApiModelProperty(value = "报警结束时间",example = "2020-12-12 12:12:12")
     private Date alarmEndTime;
+
     @ApiModelProperty(value = "报警状态:1 实时报警 0 历史报警")
     private Integer state;
-    @ApiModelProperty(value = "处理状态:1 正常 0 挂起")
-    private Integer opState;
 
-    @ApiModelProperty(value = "备注")
-    private String remark;
-    @ApiModelProperty(value = "数据删除标识")
-    private Integer status;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @ApiModelProperty(value = "创建时间",example = "2020-12-12 12:12:12")
-    private Date dateCreate;
-    @ApiModelProperty(value = "创建人")
-    private String createBy;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
-    @ApiModelProperty(value = "更新时间",example = "2020-12-12 12:12:12")
-    private Date dateUpdate;
-    @ApiModelProperty(value = "更新人")
-    private String updateBy;
+    private Date createDate;
 
 }

+ 39 - 39
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmDetailMapper.xml

@@ -97,7 +97,7 @@
         from sms_alarm_details a
         <include refid="alarmDetailJoins"/>
         where a.`STATUS` = 1
-            and a.id=#{id}
+        and a.id=#{id}
     </select>
 
     <select id="selectRealTimeByIds" resultType="com.zcxk.water.api.vo.AlarmDetailsRealTimeVo">
@@ -107,9 +107,9 @@
         <include refid="alarmDetailJoins"/>
         where a.`STATUS` = 1
         and a.id in
-            <foreach collection="ids" item="item" open="(" close=")" separator=",">
-                #{item}
-            </foreach>
+        <foreach collection="ids" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
     </select>
 
     <select id="selectHistoryByIds" resultType="com.zcxk.water.api.vo.AlarmDetailsHistoryVo">
@@ -599,31 +599,31 @@
 
     <select id="selectDeviceForCheckAlarm" resultType="com.zcxk.water.api.vo.DeviceCheckAlarmVo">
         select
-            d.TENANT_ID as "tenantId"
-            ,d.id as "deviceId"
-            ,d.DEVICE_NAME as "deviceName"
-            ,d.COMPANY_ORG_ID as "companyOrgId"
-            ,d.DEPT_ORG_ID as "deptOrgId"
-            ,d.address as "address"
-            ,a.PARENT_SCENE_ID as "parentSceneId"
-            ,a.PARENT_SCENE_NAME as "parentSceneName"
-            ,a.SCENE_ID as "sceneId"
-            ,a.SCENE_NAME as "sceneName"
-
-            ,a.ALARM_TYPE as "alarmType"
-            ,a.ATTRIBUTE_ID as "attributeId"
-            ,d.LAST_UPDATE_TIME as "lastUpdateTime"
-            ,timestampdiff(MINUTE,ifnull(d.LAST_UPDATE_TIME,d.DATE_CREATE),now()) AS "duration"
-
-            ,a.ALARM_CONDITION as "alarmCondition"
-            ,a.ALARM_VALUE as "alarmValue"
-            ,a.id as "alarmSettingId"
-            ,a.START_TIME as "startTime"
-            ,a.END_TIME as "endTime"
+        d.TENANT_ID as "tenantId"
+        ,d.id as "deviceId"
+        ,d.DEVICE_NAME as "deviceName"
+        ,d.COMPANY_ORG_ID as "companyOrgId"
+        ,d.DEPT_ORG_ID as "deptOrgId"
+        ,d.address as "address"
+        ,a.PARENT_SCENE_ID as "parentSceneId"
+        ,a.PARENT_SCENE_NAME as "parentSceneName"
+        ,a.SCENE_ID as "sceneId"
+        ,a.SCENE_NAME as "sceneName"
+
+        ,a.ALARM_TYPE as "alarmType"
+        ,a.ATTRIBUTE_ID as "attributeId"
+        ,d.LAST_UPDATE_TIME as "lastUpdateTime"
+        ,timestampdiff(MINUTE,ifnull(d.LAST_UPDATE_TIME,d.DATE_CREATE),now()) AS "duration"
+
+        ,a.ALARM_CONDITION as "alarmCondition"
+        ,a.ALARM_VALUE as "alarmValue"
+        ,a.id as "alarmSettingId"
+        ,a.START_TIME as "startTime"
+        ,a.END_TIME as "endTime"
         <if test="deviceId != null">
             ,da.id as "attributeId"
             ,da.IDENTIFIER as "identifiter"
-		    ,da.`NAME` as "attributeName"
+            ,da.`NAME` as "attributeName"
             ,da.unit as "unit"
         </if>
         from sms_device d
@@ -640,19 +640,19 @@
 
     <select id="selectStateAlarm" resultType="com.zcxk.water.api.vo.AlarmDetailsEntityVo">
         select
-            id as "id"
-            ,PARENT_SCENE_ID as "parentSceneId"
-            ,PARENT_SCENE_NAME as "parentSceneName"
-            ,SCENE_ID as "sceneId"
-            ,SCENE_NAME as "sceneName"
-            ,DEVICE_ID as "deviceId"
-            ,ATTRIBUTE_ID as "attributeId"
-            ,ALARM_VALUE as "alarmValue"
-            ,ALARM_CONTENT as "alarmContent"
-            ,ALARM_START_TIME as "alarmStartTime"
-            ,max_value as "maxValue"
-            ,min_value as "minValue"
-            ,alarm_setting_id as "alarmSettingId"
+        id as "id"
+        ,PARENT_SCENE_ID as "parentSceneId"
+        ,PARENT_SCENE_NAME as "parentSceneName"
+        ,SCENE_ID as "sceneId"
+        ,SCENE_NAME as "sceneName"
+        ,DEVICE_ID as "deviceId"
+        ,ATTRIBUTE_ID as "attributeId"
+        ,ALARM_VALUE as "alarmValue"
+        ,ALARM_CONTENT as "alarmContent"
+        ,ALARM_START_TIME as "alarmStartTime"
+        ,max_value as "maxValue"
+        ,min_value as "minValue"
+        ,alarm_setting_id as "alarmSettingId"
         from sms_alarm_details
         where STATE = 1 and status = 1
         <if test="alarmType != null and alarmType != ''">

+ 85 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmTypeDetailMapper.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zcxk.water.core.dao.AlarmTypeDetailMapper">
+
+    <sql id="permissionCondition">
+        <if test="userCondition.tenantId != null">and sat.tenant_id = #{userCondition.tenantId}</if>
+        <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+            <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+                and ( sat.dept_org_id in
+                <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+                    #{item.orgId}
+                </foreach>
+                or
+                sat.company_org_id in
+                <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+                    #{item.orgId}
+                </foreach>
+                )
+            </if>
+            <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+                and sat.dept_org_id in
+                <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+                    #{item.orgId}
+                </foreach>
+            </if>
+            <if test="userCondition.permissionType == 1">
+                and sat.company_org_id in
+                <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+                    #{item.orgId}
+                </foreach>
+                and (sat.dept_org_id is null or sat.dept_org_id =0)
+            </if>
+        </if>
+    </sql>
+
+    <!-- 新增所有列 -->
+    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
+        INSERT INTO  sms_alarm_details (alarm_id, scene_id, scene_name, alarm_start_time, state, create_date)
+        VALUES ( #{alarmId} , #{sceneId} ,#{sceneName} ,#{alarmStartTime} ,#{state} , #{createDate} )
+    </insert>
+
+    <!-- 批量新增 -->
+    <insert id="batchInsert">
+        INSERT INTO  sms_alarm_details (  alarm_id, scene_id, scene_name, alarm_start_time, state, create_date)
+        values
+        <foreach collection="alarmDetails" item="item" index="index" separator=",">
+            VALUES ( #{item.alarmId} , #{item.sceneId} ,#{item.sceneName} ,#{item.alarmStartTime} ,#{item.state} , #{item.createDate} )
+        </foreach>
+    </insert>
+
+    <!-- 分页查询 -->
+    <select id="selectPage" resultType="com.zcxk.water.api.vo.AlarmTypeDetailsEntityVo">
+        select
+            sat.`name` as alarmName, sad.scene_name, sd.DEVICE_NAME as deviceName,
+            CONCAT(dt.MANUFACTURER_NAME,"/",dt.DEVICE_TYPE,"/",dt.DEVICE_MODE) as productName,sat.`desc`,sd.ADDRESS as address, sad.alarm_start_time
+        from sms_alarm_details  sad
+        INNER JOIN sms_alarm_type sat on sad.alarm_id = sat.id
+        INNER JOIN sms_device sd      on sd.id = sat.device_id
+        INNER JOIN sms_device_type dt on dt.id = sd.DEVICE_TYPE_ID
+        <where>
+            <if test="dto.alarmName != null and dto.alarmName!=''" >
+                and sat.`name` like concat('%', #{dto.alarmName}, '%')
+            </if>
+            <if test="dto.alarmCategory != null and dto.alarmCategory!=''" >
+                and sat.alarm_category like concat('%', #{dto.alarmCategory}, '%')
+            </if>
+            <if test="dto.startTime != null">
+                and sad.alarm_start_time >=#{dto.startTime}
+            </if>
+            <if test="dto.endTime != null">
+                and sad.alarm_end_time &lt;= #{dto.endTime}
+            </if>
+            <if test="dto.state != null">
+                and sad.state >=#{dto.state}
+            </if>
+            <include refid="permissionCondition"></include>
+            order by sad.create_date desc
+        </where>
+    </select>
+
+    <update id="updateStateByDeviceId">
+        update sms_alarm_details set state =#{state} where device_id = #{deviceId}
+    </update>
+
+</mapper>

+ 6 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/AlarmTypeMapper.xml

@@ -221,6 +221,12 @@
       where  id = #{id} and status = 1
     </select>
 
+  <select id="findDeviceIdByIotAlarmId" resultType="java.lang.Long">
+    select device_id  from sms_alarm_type where  iot_alarm_id = #{id} and status = 1
+  </select>
+
+
+
     <select id="getAlarmTypeList" resultType="com.zcxk.water.api.vo.AlarmTypeVo">
       select
       sat.id,

+ 13 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/DeviceMapper.xml

@@ -497,4 +497,17 @@
         </if>
 
     </select>
+
+    <update id="updateLastTime">
+        update sms_device set LAST_UPDATE_TIME =#{lastUpdateTime} where id=#{deviceId}
+    </update>
+
+    <update id="updateStateByIotDeviceId">
+        update sms_device set ENABLE_STATE =#{state} where IOT_DEVICE_ID=#{deviceId}
+    </update>
+
+    <update id="findDeviceIdByIotDeviceId">
+        select DEVICE_ID from sms_device where IOT_DEVICE_ID = #{deviceId}
+    </update>
+
 </mapper>

+ 12 - 0
zoniot-water/zoniot-water-core/src/main/java/com/zcxk/water/core/mapper/DeviceSceneMapper.xml

@@ -72,4 +72,16 @@
         and t2.DEVICE_ID = #{deviceId}
         order by t4.scene_name,t8.seq limit 1
     </select>
+
+    <select id="findSceneByDeviceId" resultType="com.zcxk.water.api.vo.DeviceSceneVo">
+        SELECT
+
+        sds.SCENE_ID, sds.PARENT_SCENE_ID, ss1.SCENE_NAME, ss2.SCENE_NAME as parent_scene_name from sms_device_scene sds
+
+        INNER JOIN sms_scene ss1 on ss1.id  = sds.SCENE_ID
+
+        INNER JOIN sms_scene ss2 on ss2.id  = sds.PARENT_SCENE_ID
+
+        where sds.DEVICE_ID  = #{deviceId}
+    </select>
 </mapper>

+ 1 - 1
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/config/ResourceServerConfig.java

@@ -19,7 +19,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .and()
                 .authorizeRequests()
                 .antMatchers("/swagger-ui.html","/webjars/**", "/webjars/**", "/swagger-resources/**",
-                       "/v2/**","/devicetype/**","/dispatch/plan/feign/**")
+                       "/v2/**","/devicetype/**","/dispatch/plan/feign/**", "/notify/**")
                 .permitAll() //配置不需要身份认证的请求路径
                 .anyRequest().authenticated() //其他所有访问路径都需要身份认证
                 .and()

+ 14 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/constants/Constants.java

@@ -0,0 +1,14 @@
+package com.zcxk.water.web.constants;
+
+/**
+ * @author Andy
+ * @date 2021-09-22 10:34
+ */
+public class Constants {
+
+    /**
+     * 小时
+     */
+    public static final  String HOUR = "%s:00:00";
+
+}

+ 18 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/constants/RedisConstants.java

@@ -0,0 +1,18 @@
+package com.zcxk.water.web.constants;
+
+/**
+ * @author Andy
+ * @date 2021-09-22 10:34
+ */
+public class RedisConstants {
+
+    /**
+     * 调度最后存放的数据
+     */
+    public static final String DISPATCH_PLAN_LAST_DATA = "dispatch:plan:last:%s";
+
+    /**
+     * 调度实时数据
+     */
+    public static final String DISPATCH_PLAN_DATA = "dispatch:plan:%s";
+}

+ 19 - 195
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/controller/AlarmDetailsController.java

@@ -1,39 +1,30 @@
 package com.zcxk.water.web.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zcxk.core.common.pojo.AjaxMessage;
+import com.zcxk.core.utils.export.EasyExcelUtil;
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
 import com.zcxk.water.api.dto.AlarmDetailsDto;
-import com.zcxk.water.api.dto.AlarmDetailsHistoryDto;
 import com.zcxk.water.api.dto.AlarmDetailsRealTimeDto;
+import com.zcxk.water.api.dto.AlarmTypeDetailsDto;
 import com.zcxk.water.api.dto.query.AlarmDetailsPageDto;
-import com.zcxk.water.api.vo.AlarmDetailsHistoryVo;
-import com.zcxk.water.api.vo.AlarmDetailsRealTimeVo;
-import com.zcxk.water.core.entity.AlarmDetailsEntity;
+import com.zcxk.water.core.entity.AlarmType;
 import com.zcxk.water.web.common.Pagination;
 import com.zcxk.water.web.service.AlarmDetailsService;
-import com.zcxk.water.web.service.impl.SceneService;
-import com.zcxk.core.common.pojo.AjaxMessage;
-import com.zcxk.core.mongo.utils.StringUtil;
-import com.zcxk.core.utils.ZoniotIntegerUtils;
-import com.zcxk.core.utils.export.EasyExcelUtil;
+import com.zcxk.water.web.service.AlarmTypeDetailsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 
 /**
  * @description
@@ -41,192 +32,25 @@ import java.util.List;
  * @data 2020-11-16 11:05
  */
 @RestController
-@RequestMapping("/AlarmDetails")
-@Api(tags = "警详情信息管理")
+@RequestMapping("/alarm/details")
+@Api(tags = "警详情信息管理")
 @Slf4j
 public class AlarmDetailsController {
 
     @Autowired
-    private AlarmDetailsService alarmDetailsService;
-
-    @Autowired
-    private SceneService sceneService;
-
-    @Value("${SMS.sys_excel_path}")
-    private String baseDir;
-
-    @RequestMapping(value="get" , method = RequestMethod.GET)
-    @ApiOperation(value = "查询单个报警详情信息")
-    public AjaxMessage get(@ApiParam(value = "报警详情信息id") @RequestParam Integer id){
-        return AjaxMessage.success(alarmDetailsService.selectById(id));
-    }
+    private AlarmTypeDetailsService alarmTypeDetailsService;
 
     @RequestMapping(value="selectPage" , method = RequestMethod.POST)
     @ApiOperation(value = "分页查询报警详情信息")
-    public AjaxMessage selectPage(@RequestBody @Valid AlarmDetailsPageDto dto){
-        AlarmDetailsDto alarmDetailsDto = coverAlarmDetailsDto(dto);
-        IPage iPage = getPage(dto.getPageNum(), dto.getPageSize(), false, "t.date_create");
-        if (ZoniotIntegerUtils.isNotEmpty(dto.getSceneId()) || StringUtil.isNotEmpty(dto.getSceneTypeName())) {
-            alarmDetailsDto.setSceneIds(sceneService.findByParentIdsSceneTypeName(dto.getSceneId().longValue(), dto.getSceneTypeName()));
-            if (!CollectionUtils.isEmpty(alarmDetailsDto.getSceneIds())){
-                return AjaxMessage.success(new Pagination<>(alarmDetailsService.selectPage(iPage, alarmDetailsDto)));
-            }
-        }
-        return AjaxMessage.success(new Pagination<>(iPage));
-    }
-
-    @RequestMapping(value="add" , method = RequestMethod.POST)
-    @ApiOperation(value = "新增报警详情信息")
-    public AjaxMessage<Integer> add(@ApiParam(value = "报警详情信息") @RequestBody AlarmDetailsEntity alarmDetailsEntity){
-        return AjaxMessage.success(alarmDetailsService.insert(alarmDetailsEntity));
-    }
-
-    @RequestMapping(value="edit" , method = RequestMethod.POST)
-    @ApiOperation(value = "修改报警详情信息")
-    public AjaxMessage<Integer> edit( @ApiParam(value = "报警详情信息") @RequestBody AlarmDetailsEntity alarmDetailsEntity){
-        return AjaxMessage.success(alarmDetailsService.update(alarmDetailsEntity));
-    }
-
-    @RequestMapping(value="delete" , method = RequestMethod.GET)
-    @ApiOperation(value = "单个删除报警详情信息")
-    public AjaxMessage<Integer> delete( @ApiParam(value = "报警详情信息id") @RequestParam Integer id){
-        return AjaxMessage.success(alarmDetailsService.deleteById(id));
-    }
-
-    @RequestMapping(value="suspendedById" , method = RequestMethod.POST)
-    @ApiOperation(value = "挂起报警信息")
-    public AjaxMessage<Integer> suspendedById( @ApiParam(value = "报警详情信息id") @RequestParam Integer id){
-        return AjaxMessage.success(alarmDetailsService.suspendedById(id,0));
+    public AjaxMessage selectPage(@RequestBody @Valid AlarmTypeDetailsDto dto){
+        IPage<AlarmDetailsDto> iPage = new Page<>(dto.getPageNum(), dto.getPageSize());
+        return AjaxMessage.success(new Pagination<>(alarmTypeDetailsService.selectPage(iPage, dto)));
     }
 
-    @RequestMapping(value="renewById" , method = RequestMethod.POST)
-    @ApiOperation(value = "恢复挂起报警信息")
-    public AjaxMessage<Integer> renewById( @ApiParam(value = "报警详情信息id") @RequestParam Integer id){
-        return AjaxMessage.success(alarmDetailsService.suspendedById(id,1));
-    }
-
-    @RequestMapping(value="selectHistoryPage" , method = RequestMethod.POST)
-    @ApiOperation(value = "分页查询报历史警详情信息")
-    public AjaxMessage selectHistoryPage(@RequestBody @Valid AlarmDetailsPageDto dto){
-        AlarmDetailsDto alarmDetailsDto = coverAlarmDetailsDto(dto);
-        IPage iPage = getPage(dto.getPageNum(), dto.getPageSize(), false, "a.ALARM_START_TIME");
-        if (ZoniotIntegerUtils.isNotEmpty(dto.getSceneId()) || StringUtil.isNotEmpty(dto.getSceneTypeName())) {
-            alarmDetailsDto.setSceneIds(sceneService.findByParentIdsSceneTypeName(dto.getSceneId().longValue(), dto.getSceneTypeName()));
-            if (CollectionUtils.isEmpty(alarmDetailsDto.getSceneIds())){
-                return AjaxMessage.success(new Pagination<>(iPage));
-            }
-        }
-        Pagination<AlarmDetailsHistoryVo> pages = new Pagination<>(alarmDetailsService.selectHistoryPage(iPage, alarmDetailsDto));
-        return AjaxMessage.success(pages);
-    }
-
-    @RequestMapping(value="exportHistory" , method = RequestMethod.GET)
-    @ApiOperation(value = "导出历史报警信息")
-    public void exportHistory(AlarmDetailsPageDto dto, HttpServletResponse response) throws Exception {
-        if (!CollectionUtils.isEmpty(dto.getIds())){
-            EasyExcelUtil.excelWrite(response, AlarmDetailsHistoryDto.class, "历史报警记录", alarmDetailsService.selectHistoryByIds(dto.getIds()));
-            return ;
-        }
-        AlarmDetailsDto alarmDetailsDto = coverAlarmDetailsDto(dto);
-        if (ZoniotIntegerUtils.isNotEmpty(dto.getSceneId()) || StringUtil.isNotEmpty(dto.getSceneTypeName())) {
-            alarmDetailsDto.setSceneIds(sceneService.findByParentIdsSceneTypeName(dto.getSceneId().longValue(), dto.getSceneTypeName()));
-            if (CollectionUtils.isEmpty(alarmDetailsDto.getSceneIds())){
-                EasyExcelUtil.excelWrite(response, AlarmDetailsHistoryDto.class, "历史报警记录", new ArrayList<>());
-                return ;
-            }
-        }
-        EasyExcelUtil.excelWrite(response, AlarmDetailsHistoryDto.class, "历史报警记录", alarmDetailsService.selectHistoryList(alarmDetailsDto));
-    }
-
-
-    @RequestMapping(value="selectRealTimePage" , method = RequestMethod.POST)
-    @ApiOperation(value = "分页查询实时报警详情信息")
-    public AjaxMessage selectRealTimePage(@RequestBody @Valid AlarmDetailsPageDto dto ){
-        AlarmDetailsDto alarmDetailsDto = coverAlarmDetailsDto(dto);
-        IPage iPage = getPage(dto.getPageNum(), dto.getPageSize(), false, "a.ALARM_START_TIME");
-        if (ZoniotIntegerUtils.isNotEmpty(dto.getSceneId()) ||StringUtil.isNotEmpty(dto.getSceneTypeName())) {
-            alarmDetailsDto.setSceneIds(sceneService.findByParentIdsSceneTypeName(dto.getSceneId().longValue(), dto.getSceneTypeName()));
-            if (alarmDetailsDto.getSceneIds() == null || alarmDetailsDto.getSceneIds().size() == 0 ){
-                return AjaxMessage.success(new Pagination<>(iPage));
-            }
-        }
-        Pagination<AlarmDetailsRealTimeVo> pages = new Pagination<>(alarmDetailsService.selectRealTimePage(iPage,alarmDetailsDto));
-        return AjaxMessage.success(pages);
-    }
-
-    @RequestMapping(value="exportRealTime" , method = RequestMethod.GET)
-    @ApiOperation(value = "导出实时报警信息")
+    @RequestMapping(value="export" , method = RequestMethod.GET)
+    @ApiOperation(value = "导出告警信息")
     public void exportRealTime(AlarmDetailsPageDto dto, HttpServletResponse response) throws Exception {
-        if (!CollectionUtils.isEmpty(dto.getIds())){
-            EasyExcelUtil.excelWrite(response, AlarmDetailsRealTimeDto.class, "实时报警记录", alarmDetailsService.selectRealTimeByIds(dto.getIds()));
-            return;
-        }
-        AlarmDetailsDto alarmDetailsDto = coverAlarmDetailsDto(dto);
-        if (ZoniotIntegerUtils.isNotEmpty(dto.getSceneId()) || StringUtil.isNotEmpty(dto.getSceneTypeName()))  {
-            List<Long> ids = sceneService.findByParentIdsSceneTypeName(dto.getSceneId().longValue(), dto.getSceneTypeName());
-            alarmDetailsDto.setSceneIds(ids);
-            if (CollectionUtils.isEmpty(ids)){
-                EasyExcelUtil.excelWrite(response, AlarmDetailsHistoryDto.class, "历史报警记录", new ArrayList<>());
-                return;
-            }
-        }
-        EasyExcelUtil.excelWrite(response, AlarmDetailsRealTimeDto.class, "实时报警记录", alarmDetailsService.selectRealTimeList(alarmDetailsDto));
-    }
-
-
-    @RequestMapping(value="batchDelete" , method = RequestMethod.POST)
-    @ApiOperation(value = "批量删除")
-    public AjaxMessage<Integer> batchDelete( @ApiParam(value = "报警信息ids") @RequestBody List<Integer> ids){
-        return AjaxMessage.success(alarmDetailsService.batchDelete(ids));
-    }
-
-    /**
-    * 转化数据
-    * @author Andy
-    * @date 16:01 2021/8/16
-    * @param dto:
-    * @return AlarmDetailsDto
-    **/
-    private AlarmDetailsDto coverAlarmDetailsDto(AlarmDetailsPageDto dto){
-        AlarmDetailsDto alarmDetailsDto = new AlarmDetailsDto();
-        alarmDetailsDto.setCondition(dto.getCondition());
-        alarmDetailsDto.setAlarmType(dto.getAlarmType());
-        alarmDetailsDto.setOpState(dto.getOpState());
-        alarmDetailsDto.setSceneTypeName(dto.getSceneTypeName());
-        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
-        try {
-            if(StringUtils.isNotBlank(dto.getStartTime())){
-                alarmDetailsDto.setStartTime(f.parse(dto.getStartTime()));
-            }
-            if(StringUtils.isNotBlank(dto.getEndTime())){
-                alarmDetailsDto.setEndTime(f.parse(dto.getEndTime()));
-            }
-        }catch (ParseException e){
-            alarmDetailsDto.setStartTime(new Date());
-            alarmDetailsDto.setEndTime(new Date());
-        }
-        return  alarmDetailsDto;
-    }
-
-    /**
-    * 获取分页
-    * @author Andy
-    * @date 16:01 2021/8/16
-    * @param pageNum:
-    * @param pageSize:
-    * @param asc:
-    * @param column:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage
-    **/
-    private IPage getPage(Integer pageNum, Integer pageSize, boolean asc, String column){
-        IPage iPage = new Page<>(pageNum, pageSize);
-        if (iPage.orders().size() == 0){
-            OrderItem orderItem = new OrderItem();
-            orderItem.setAsc(asc);
-            orderItem.setColumn(column);
-            iPage.orders().add(orderItem);
-        }
-        return iPage;
+        EasyExcelUtil.excelWrite(response, AlarmDetailsRealTimeDto.class, "实时报警记录", null);
     }
 
 }

+ 48 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/controller/NotifyController.java

@@ -0,0 +1,48 @@
+package com.zcxk.water.web.controller;
+
+import com.zcxk.core.common.pojo.AjaxMessage;
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
+import com.zcxk.water.api.dto.DeviceDataDto;
+import com.zcxk.water.web.service.AlarmDetailsService;
+import com.zcxk.water.web.service.NotifyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 通知处理
+ * @date 2021/10/19
+ **/
+@RestController
+@RequestMapping("/notify")
+@Api(tags = "通知")
+@Slf4j
+public class NotifyController {
+
+    @Autowired
+    private NotifyService notifyService;
+
+    @RequestMapping(value="alarm/add" , method = RequestMethod.POST)
+    @ApiOperation(value = "告警信息添加")
+    public AjaxMessage<Integer> alarmAdd(@ApiParam(value = "报警详情信息") @RequestBody AlarmDetailsAddDto dto){
+        return AjaxMessage.success(notifyService.insertAlarmInfo(dto));
+    }
+
+
+    @RequestMapping(value="device/data" , method = RequestMethod.POST)
+    @ApiOperation(value = "设备数据处理")
+    public AjaxMessage deviceData(@ApiParam(value = "设备数据处理") @RequestBody DeviceDataDto dto){
+        notifyService.receiveDeviceData(dto);
+        return AjaxMessage.success();
+    }
+
+
+}

+ 115 - 115
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmDetailsService.java

@@ -20,172 +20,172 @@ import java.util.List;
 public interface AlarmDetailsService {
 
     /**
-    * 查询单个设备
-    * @author Andy
-    * @date 17:52 2021/8/17
-    * @param id:
-    * @return AlarmDetailsEntityVo
-    **/
+     * 查询单个设备
+     * @author Andy
+     * @date 17:52 2021/8/17
+     * @param id:
+     * @return AlarmDetailsEntityVo
+     **/
     AlarmDetailsEntityVo selectById(Integer id);
 
     /**
-    * 查询单个设备
-    * @author Andy
-    * @date 17:52 2021/8/17
-    * @param sceneId:
-    * @param deviceId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 查询单个设备
+     * @author Andy
+     * @date 17:52 2021/8/17
+     * @param sceneId:
+     * @param deviceId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectByDeviceId(Long sceneId, Integer deviceId);
 
     /**
-    * 查询单个设备属性
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param sceneId:
-    * @param deviceId:
-    * @param attributeId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 查询单个设备属性
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param sceneId:
+     * @param deviceId:
+     * @param attributeId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectByDeviceAttributeId(Long sceneId, Integer deviceId, Integer attributeId);
 
     /**
-    * 按场景查询
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param sceneId:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 按场景查询
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param sceneId:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectBySceneId(Integer sceneId);
 
     /**
-    * 查询设备
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param ids:
-    * @return java.util.List<AlarmDetailsRealTimeVo>
-    **/
+     * 查询设备
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param ids:
+     * @return java.util.List<AlarmDetailsRealTimeVo>
+     **/
     List<AlarmDetailsRealTimeVo> selectRealTimeByIds(List<Integer> ids);
 
     /**
-    * selectHistoryByIds
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param ids:
-    * @return java.util.List<AlarmDetailsHistoryVo>
-    **/
+     * selectHistoryByIds
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param ids:
+     * @return java.util.List<AlarmDetailsHistoryVo>
+     **/
     List<AlarmDetailsHistoryVo> selectHistoryByIds(List<Integer> ids);
 
     /**
-    * 添加设备
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param alarmDetailsEntity:
-    * @return java.lang.Integer
-    **/
+     * 添加设备
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param alarmDetailsEntity:
+     * @return java.lang.Integer
+     **/
     Integer insert(AlarmDetailsEntity alarmDetailsEntity);
 
     /**
-    * 批量插入设备信息
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param alarmDetails:
-    * @return java.lang.Integer
-    **/
+     * 批量插入设备信息
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param alarmDetails:
+     * @return java.lang.Integer
+     **/
     Integer batchInsert(List<AlarmDetailsEntity> alarmDetails);
 
     /**
-    * 单条删除设备
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param id:
-    * @return java.lang.Integer
-    **/
+     * 单条删除设备
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param id:
+     * @return java.lang.Integer
+     **/
     Integer deleteById(Integer id);
 
     /**
-    * 批量删除
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param ids:
-    * @return java.lang.Integer
-    **/
+     * 批量删除
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param ids:
+     * @return java.lang.Integer
+     **/
     Integer batchDelete(List<Integer> ids);
 
     /**
-    * 挂起/恢复
-    * @author Andy
-    * @date 17:53 2021/8/17
-    * @param id:
-    * @param opState:
-    * @return java.lang.Integer
-    **/
+     * 挂起/恢复
+     * @author Andy
+     * @date 17:53 2021/8/17
+     * @param id:
+     * @param opState:
+     * @return java.lang.Integer
+     **/
     Integer suspendedById(Integer id, Integer opState);
 
     /**
-    * 修改设备信息
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param alarmDetailsEntity:
-    * @return java.lang.Integer
-    **/
+     * 修改设备信息
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param alarmDetailsEntity:
+     * @return java.lang.Integer
+     **/
     Integer update(AlarmDetailsEntity alarmDetailsEntity);
 
     /**
-    * 查询设备信息
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsEntityVo>
-    **/
+     * 查询设备信息
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsEntityVo>
+     **/
     List<AlarmDetailsEntityVo> selectList(AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 分页查询
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsEntityVo>
-    **/
+     * 分页查询
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsEntityVo>
+     **/
     IPage<AlarmDetailsEntityVo> selectPage(IPage<AlarmDetailsDto> page, AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 查询设备信息
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsHistoryVo>
-    **/
+     * 查询设备信息
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsHistoryVo>
+     **/
     List<AlarmDetailsHistoryVo> selectHistoryList(AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 查询设备信息
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param alarmDetailsDto:
-    * @return java.util.List<AlarmDetailsRealTimeVo>
-    **/
+     * 查询设备信息
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param alarmDetailsDto:
+     * @return java.util.List<AlarmDetailsRealTimeVo>
+     **/
     List<AlarmDetailsRealTimeVo> selectRealTimeList(AlarmDetailsDto alarmDetailsDto);
 
     /**
-    * 分页查询
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsRealTimeVo>
-    **/
+     * 分页查询
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsRealTimeVo>
+     **/
     IPage<AlarmDetailsRealTimeVo> selectRealTimePage(IPage<AlarmDetailsRealTimeDto> page, AlarmDetailsDto alarmDetailsDto);
 
 
     /**
-    * 分页查询
-    * @author Andy
-    * @date 17:54 2021/8/17
-    * @param page:
-    * @param alarmDetailsDto:
-    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsHistoryVo>
-    **/
+     * 分页查询
+     * @author Andy
+     * @date 17:54 2021/8/17
+     * @param page:
+     * @param alarmDetailsDto:
+     * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsHistoryVo>
+     **/
     IPage<AlarmDetailsHistoryVo> selectHistoryPage(IPage<AlarmDetailsHistoryDto> page, AlarmDetailsDto alarmDetailsDto);
 }

+ 58 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmTypeDetailsService.java

@@ -0,0 +1,58 @@
+package com.zcxk.water.web.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
+import com.zcxk.water.api.dto.AlarmDetailsDto;
+import com.zcxk.water.api.dto.AlarmTypeDetailsDto;
+import com.zcxk.water.api.vo.AlarmTypeDetailsEntityVo;
+
+import java.util.List;
+
+/**
+ * @description
+ * @author  wangli
+ * @data 2020-11-17 15:43
+ */
+public interface AlarmTypeDetailsService {
+
+
+    /**
+    * 添加告警
+    * @author Andy
+    * @date 17:53 2021/8/17
+    * @param dto:
+    * @return java.lang.Integer
+    **/
+    Integer insert(AlarmDetailsAddDto dto);
+
+    /**
+    * 批量添加
+    * @author Andy
+    * @date 15:53 2021/10/19
+    * @param dtos:
+    * @return java.lang.Integer
+    **/
+    Integer batchInsert(List<AlarmDetailsAddDto> dtos);
+
+
+    /**
+    * 分页查询
+    * @author Andy
+    * @date 17:54 2021/8/17
+    * @param page:
+    * @param alarmDetailsDto:
+    * @return com.baomidou.mybatisplus.core.metadata.IPage<AlarmDetailsEntityVo>
+    **/
+    IPage<AlarmTypeDetailsEntityVo> selectPage(IPage<AlarmDetailsDto> page, AlarmTypeDetailsDto alarmDetailsDto);
+
+    /**
+    * 修改报警状态
+    * @author Andy
+    * @date 18:02 2021/10/19
+    * @param deviceId:
+    * @param state:
+    * @return java.lang.Integer
+    **/
+    Integer updateStateByDeviceId(Long deviceId, Integer state);
+}

+ 9 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/AlarmTypeService.java

@@ -43,6 +43,15 @@ public interface AlarmTypeService {
     **/
     AlarmTypeVo findById(Integer id);
 
+    /**
+    * 通过物联网告警ID查找设备ID
+    * @author Andy
+    * @date 17:36 2021/10/19
+    * @param id:
+    * @return com.zcxk.water.api.vo.AlarmTypeVo
+    **/
+    Long findDeviceIdByIotAlarmId(Integer id);
+
     /**
     * 分页查询
     * @author Andy

+ 43 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/NotifyService.java

@@ -0,0 +1,43 @@
+package com.zcxk.water.web.service;
+
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
+import com.zcxk.water.api.dto.DeviceDataDto;
+import com.zcxk.water.api.dto.DeviceStateDto;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: TODO
+ * @date 2021/10/19
+ **/
+public interface NotifyService {
+
+    /**
+    * 添加告警信息
+    * @author Andy
+    * @date 17:17 2021/10/19
+    * @param dto:
+    * @return java.lang.Integer
+    **/
+    Integer insertAlarmInfo(AlarmDetailsAddDto dto);
+
+
+    /**
+    * 处理上报的设备数据
+    * @author Andy
+    * @date 17:40 2021/10/19
+    * @param deviceData:
+    * @return void
+    **/
+    void receiveDeviceData(DeviceDataDto deviceData);
+
+    /**
+    * 变更设备状态
+    * @author Andy
+    * @date 17:51 2021/10/19
+    * @param dto:
+    * @return void
+    **/
+    void updateDeviceSate(DeviceStateDto dto);
+
+}

+ 244 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/AlarmDataHandle.java

@@ -0,0 +1,244 @@
+/*
+package com.zcxk.water.web.service.handle;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zcxk.core.common.pojo.Message;
+import com.zcxk.core.common.util.BeanCopyUtils;
+import com.zcxk.core.utils.CalcUtil;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.water.api.dto.WorkOrderManageByAlarmDto;
+import com.zcxk.water.api.vo.AlarmDetailsEntityVo;
+import com.zcxk.water.api.vo.DeviceCheckAlarmVo;
+import com.zcxk.water.core.dao.AlarmDetailMapper;
+import com.zcxk.water.core.entity.AlarmDetailsEntity;
+import com.zcxk.water.core.entity.MonitorDataEntity;
+import com.zcxk.water.xxl.client.OperationManagerClient;
+import com.zcxk.water.xxl.client.UserCenterClient;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+*/
+/**
+ * @ClassName AlarmDataHandler
+ * @Description: 报警数据处理
+ * @Author lihui
+ * @Date 2021/4/8
+ * @Version V1.0
+ **//*
+
+@Component
+@Slf4j
+public class AlarmDataHandle {
+
+    @Resource(name = "messageRabbitTemplate")
+    private AmqpTemplate messageRabbitTemplate;
+
+    @Resource
+    private AlarmDetailMapper alarmDetailMapper;
+
+    @Resource
+    private OperationManagerClient operationManagerClient;
+
+    @Resource
+    private UserCenterClient userCenterClient;
+
+    @Value("${receive.exchange.name}")
+    private String receiveExchangeName;
+
+    @Value("${dispath.routing.key}")
+    private String dispathRoutingKey;
+
+    @Async
+    public void hanlder(MonitorDataEntity monitorDataEntity, JSONObject receiveData, Date receiveDateTime){
+        log.info("rabbitMq处理报警,code:{},上报时间:{}",monitorDataEntity.getDeviceCode(), receiveDateTime);
+        // 校验各参数异常情况
+        Double receivedValue            = null;
+        List<AlarmDetailsEntity> insert = null;
+        List<AlarmDetailsEntity> update = null;
+        // 获取需要验证的报警条件monitorDataEntity.getDeviceId()
+        List<DeviceCheckAlarmVo> deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(monitorDataEntity.getDeviceId(),"参数报警");
+        // 有设置报警参数
+        if (deviceCheckAlarmDtos.size() == 0 || StringUtils.isBlank(deviceCheckAlarmDtos.get(0).getIdentifiter())){
+            return;
+        }
+        insert = new ArrayList<>();
+        update = new ArrayList<>();
+        // 系统中已存在的报警信息
+        List<AlarmDetailsEntityVo> alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(deviceCheckAlarmDtos.get(0).getDeviceId(),"参数报警",null);
+        // 已存在的报警信息转为map方便匹配alarmSettingId
+        Map<Integer,AlarmDetailsEntityVo> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsEntityVo::getAlarmSettingId, a -> a,(k1, k2)->k1));
+        for (DeviceCheckAlarmVo deviceCheckAlarmDto : deviceCheckAlarmDtos){
+            // 获取参数接收值
+            receivedValue = receiveData.getDouble(deviceCheckAlarmDto.getIdentifiter());
+            if (!deviceCheckAlarmDto.checkdeviceAttributeAlarm(receivedValue)) {
+                continue;
+            }
+            // 如果设置了报警时间,需要检查当前系统时间是否在设置的时间范围内
+            if (!isInTime(deviceCheckAlarmDto.getStartTime(), deviceCheckAlarmDto.getEndTime(), new Date())){
+                continue;
+            }
+            // 判断报警是否已存在
+            if (alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())) {
+                AlarmDetailsEntityVo alarmDetailsDto = alarmDetailsDtoMap.get(deviceCheckAlarmDto.getAlarmSettingId());
+                alarmDetailsDto.setAlarmValue(receivedValue);
+                alarmDetailsDto.setMinValue(CalcUtil.compareBySign(alarmDetailsDto.getMinValue(),receivedValue, "<")?alarmDetailsDto.getMinValue():receivedValue);
+                alarmDetailsDto.setMaxValue(CalcUtil.compareBySign(alarmDetailsDto.getMaxValue(),receivedValue,">")?alarmDetailsDto.getMaxValue():receivedValue);
+                alarmDetailsDto.setDateUpdate(new Date());
+
+                AlarmDetailsEntity entity = new AlarmDetailsEntity();
+
+                BeanCopyUtils.copyProperties(alarmDetailsDto, entity, AlarmDetailsEntity.class);
+                alarmDetailMapper.update(entity);
+                update.add(entity);
+                // 已存在的修改后从集合移除
+                alarmDetailsDtoMap.remove(deviceCheckAlarmDto.getAlarmSettingId());
+            } else {
+                AlarmDetailsEntity alarmDetailsEntity = getAlarmDetailsEntity(deviceCheckAlarmDto, receivedValue, receiveDateTime);
+                sendMessage(deviceCheckAlarmDto);
+                insert.add(alarmDetailsEntity);
+            }
+        }
+        // 批量插入新增报警
+        if (insert.size() > 0) {
+            alarmDetailMapper.batchInsert(insert);
+        }
+        if (alarmDetailsDtoMap.values().size() == 0) {
+            return;
+        }
+        // 处理完成后,剩下的标记为历史数据
+        List<Long> deviceIds = new ArrayList<>();
+        deviceIds.add(monitorDataEntity.getDeviceId().longValue());
+        List<WorkOrderManageByAlarmDto> workOrders = operationManagerClient.findWorkOrderByDeviceIds(deviceIds);
+        if (CollectionUtils.isEmpty(workOrders)) {
+            return;
+        }
+        WorkOrderManageByAlarmDto orderManageByAlarmDto = workOrders.get(0);
+        String taskDesc = orderManageByAlarmDto.getTaskDesc();
+        // 标记为历史数据 并 修改工单描述
+        for (AlarmDetailsEntityVo alarmDetailsDto : alarmDetailsDtoMap.values()){
+            alarmDetailsDto.setState(0);
+            alarmDetailsDto.setAlarmEndTime(receiveDateTime);
+            alarmDetailsDto.setDateUpdate(new Date());
+
+            AlarmDetailsEntity entity = new AlarmDetailsEntity();
+            BeanCopyUtils.copyProperties(alarmDetailsDto, entity, AlarmDetailsEntityVo.class);
+            alarmDetailMapper.update(entity);
+            taskDesc = taskDesc.replace(";"+alarmDetailsDto.getAlarmContent(),"")
+                    .replace(alarmDetailsDto.getAlarmContent(),"");
+        }
+        orderManageByAlarmDto.setTaskDesc(taskDesc);
+        // 工单未派单且无报警信息,删除工单
+        if (orderManageByAlarmDto != null && isEmpty(orderManageByAlarmDto.getOrderStatus(), taskDesc)) {
+            operationManagerClient.batchDeleteByAlarms(new ArrayList<>(deviceIds));
+            return;
+        }
+        // 其他情况修改描述
+        operationManagerClient.updateByAlarms(workOrders);
+    }
+
+    private boolean isEmpty(Integer orderStatus, String taskDesc){
+        return (orderStatus == null || orderStatus == 0) && StringUtils.isBlank(taskDesc);
+    }
+
+
+    */
+/**
+    * @Author lihui
+    * @Description //TODO
+    * @Date 14:27 2021/4/16
+    * @Param [deviceCheckAlarmDto]
+    * @return boolean
+    **//*
+
+    private boolean isInTime(String startTime, String endTime, Date date){
+        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
+            return true;
+        }
+        return DateUtil.isInTime(startTime, endTime, date,"HH:mm:ss");
+    }
+
+    */
+/**
+     * @Author lihui
+     * @Description 设置报警信息
+     * @Date 17:29 2021/4/7
+     * @Param [deviceCheckAlarmDto, receivedValue, receiveDateTime]
+     * @return com.zcxk.entity.AlarmDetailsEntity
+     **//*
+
+    private AlarmDetailsEntity getAlarmDetailsEntity(DeviceCheckAlarmVo deviceCheckAlarmDto, Double receivedValue, Date receiveDateTime){
+        AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsEntity();
+        alarmDetailsEntity.setTenantId(deviceCheckAlarmDto.getTenantId());
+        alarmDetailsEntity.setParentSceneId(deviceCheckAlarmDto.getParentSceneId());
+        alarmDetailsEntity.setParentSceneName(deviceCheckAlarmDto.getParentSceneName());
+        alarmDetailsEntity.setSceneId(deviceCheckAlarmDto.getSceneId());
+        alarmDetailsEntity.setSceneName(deviceCheckAlarmDto.getSceneName());
+        alarmDetailsEntity.setDeviceId(deviceCheckAlarmDto.getDeviceId());
+        alarmDetailsEntity.setCompanyOrgId(deviceCheckAlarmDto.getCompanyOrgId());
+        alarmDetailsEntity.setDeptOrgId(deviceCheckAlarmDto.getDeptOrgId());
+        alarmDetailsEntity.setAlarmType(deviceCheckAlarmDto.getAlarmType());
+        alarmDetailsEntity.setAttributeId(deviceCheckAlarmDto.getAttributeId());
+        alarmDetailsEntity.setAlarmValue(receivedValue);
+        alarmDetailsEntity.setAlarmStartTime(receiveDateTime);
+        alarmDetailsEntity.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
+        alarmDetailsEntity.setAlarmSettingId(deviceCheckAlarmDto.getAlarmSettingId());
+        alarmDetailsEntity.setState(1);
+        alarmDetailsEntity.setOpState(1);
+        alarmDetailsEntity.setMinValue(receivedValue);
+        alarmDetailsEntity.setMaxValue(receivedValue);
+        alarmDetailsEntity.setStatus(1);
+        alarmDetailsEntity.setDateCreate(new Date());
+        alarmDetailsEntity.setDateUpdate(new Date());
+        alarmDetailsEntity.setCreateBy("system");
+        alarmDetailsEntity.setUpdateBy("system");
+        return alarmDetailsEntity;
+    }
+
+    private void sendMessage(DeviceCheckAlarmVo deviceCheckAlarmDto){
+        Message message = new Message();
+        message.setStatus(1);
+        message.setTenantId(deviceCheckAlarmDto.getTenantId());
+        message.setMessageId(UUID.randomUUID().toString());
+        JSONObject jsonContent = new JSONObject();
+        // ${场景名称}${设备名称}【${报警字段}】异常报警
+        jsonContent.put("场景名称",deviceCheckAlarmDto.getSceneName());
+        jsonContent.put("设备名称",deviceCheckAlarmDto.getDeviceName());
+        jsonContent.put("报警字段",deviceCheckAlarmDto.getAttributeName());
+        // 消息内容,如果需要动态使用,配合模板使用{key:value}
+        message.setMessageContent(jsonContent.toJSONString());
+        // 消息类型、模板id、渠道
+        message.setMessageType(1);
+        message.setMessageTemplateId(1);
+        message.setChannel(0);
+        Integer companyOrgId = deviceCheckAlarmDto.getCompanyOrgId();
+        Integer departmentOrgId = deviceCheckAlarmDto.getDeptOrgId();
+        try{
+            List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(deviceCheckAlarmDto.getTenantId(),companyOrgId,departmentOrgId);
+            if (taskUsers == null) {
+                return;
+            }
+            taskUsers.forEach(id -> {
+                message.setUserId(id);
+                this.send(message);
+            });
+        } catch (Exception e) {
+            log.error ("推送报警消息失败:{}",e);
+        }
+    }
+
+    private void send(Message message){
+        log.debug("消息发送 exchange={}  routingkey={} 用户id={}",receiveExchangeName,dispathRoutingKey,message.getUserId());
+        messageRabbitTemplate.convertAndSend(receiveExchangeName, dispathRoutingKey, JSONObject.toJSONString(message));
+    }
+
+}
+*/

+ 139 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/DispatchReportHandle.java

@@ -0,0 +1,139 @@
+package com.zcxk.water.web.service.handle;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zcxk.core.common.util.BeanCopyUtils;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.core.utils.encrypt.Md5;
+import com.zcxk.core.utils.util.RedisUtils;
+import com.zcxk.water.api.enums.ValueTypeEnum;
+import com.zcxk.water.api.feign.DispatchPlanClient;
+import com.zcxk.water.core.dao.DeviceParmMapper;
+import com.zcxk.water.core.dao.mongo.DispatchPlanDataDao;
+import com.zcxk.water.core.dao.mongo.DispatchPlanReportDao;
+import com.zcxk.water.core.entity.DeviceParmEntity;
+import com.zcxk.water.core.entity.MonitorDataEntity;
+import com.zcxk.water.core.entity.MonitorDataValueEntity;
+import com.zcxk.water.core.entity.mongo.DispatchPlanDataEntity;
+import com.zcxk.water.core.entity.mongo.DispatchPlanReportEntity;
+import com.zcxk.water.web.constants.Constants;
+import com.zcxk.water.web.constants.RedisConstants;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class DispatchReportHandle {
+
+    @Resource
+    private RedisUtils redisUtils;
+
+    @Resource
+    private DeviceParmMapper deviceParmMapper;
+
+    @Resource
+    private DispatchPlanDataDao dispatchPlanDataDao;
+
+    @Resource
+    private DispatchPlanReportDao dispatchPlanReportDao;
+
+    @Resource
+    private DispatchPlanClient dispatchPlanClient;
+
+    /**
+     * 2小时
+     */
+    private static final int HOURS_2 = 60 * 60 * 2;
+
+    /**
+     * 2天
+     */
+    private static final int DAYS_2  = 60 * 60 * 24 * 2;
+
+    @Async
+    public void handler(MonitorDataEntity monitorDataEntity, JSONObject receiveData, Date receiveDateTime) {
+        String tenantId  = monitorDataEntity.getTenantId();
+        List<String> paramTypeList = dispatchPlanClient.getWaterWorksParamType();
+        Map<String,String> titleMap = dispatchPlanClient.getWaterWorksTitle();
+        List<Integer> paramTypes   = paramTypeList.stream().map(Integer::parseInt).collect(Collectors.toList());
+        for (MonitorDataValueEntity valueEntity : monitorDataEntity.getDataValues()) {
+            if (!receiveData.containsKey(valueEntity.getIdentifier())){
+                continue;
+            }
+            // 获取该设备属性的参数类型
+            List<DeviceParmEntity> list = deviceParmMapper.selectByDeviceIdByAttributeIdByParamType(monitorDataEntity.getTenantId(), monitorDataEntity.getDeviceId(), valueEntity.getAttributeId(), paramTypes);
+            if (CollectionUtils.isEmpty(list)){
+                continue;
+            }
+            for (DeviceParmEntity deviceParmEntity : list) {
+                BigDecimal dataValue  = new BigDecimal(receiveData.getString(valueEntity.getIdentifier()));
+                DispatchPlanDataEntity dispatchPlanDataEntity = new DispatchPlanDataEntity();
+                dispatchPlanDataEntity.setTenantId(tenantId);
+                dispatchPlanDataEntity.setDeviceId(monitorDataEntity.getDeviceId());
+                dispatchPlanDataEntity.setDeviceName(monitorDataEntity.getDeviceName());
+                dispatchPlanDataEntity.setAttributeId(valueEntity.getAttributeId());
+                dispatchPlanDataEntity.setAttributeName(valueEntity.getAttributeName());
+                dispatchPlanDataEntity.setDeviceCode(monitorDataEntity.getDeviceCode());
+                dispatchPlanDataEntity.setDataValue(dataValue.toPlainString());
+                dispatchPlanDataEntity.setParamType(deviceParmEntity.getParmType());
+                dispatchPlanDataEntity.setMd5(getMd5(dispatchPlanDataEntity));
+                dispatchPlanDataEntity.setCreateTime(new Date());
+                dispatchPlanDataEntity.setTypeName(titleMap.get(deviceParmEntity.getParmType().toString()));
+                dispatchPlanDataEntity.setReportTime(receiveDateTime);
+                dispatchPlanDataEntity.setValueType(deviceParmEntity.getParmType() == 2 ? ValueTypeEnum.BOOLEAN.getCode() : ValueTypeEnum.NUMBER.getCode());
+                dispatchPlanDataDao.saveDispatchPlan(dispatchPlanDataEntity);
+                this.saveReport(dispatchPlanDataEntity);
+            }
+        }
+    }
+
+    private void saveReport(DispatchPlanDataEntity dispatchPlanDataEntity){
+        String md5Key       = String.format(RedisConstants.DISPATCH_PLAN_DATA, getMd5ByCurrentHour(dispatchPlanDataEntity));
+        String md5LastKey   = String.format(RedisConstants.DISPATCH_PLAN_LAST_DATA, getMd5(dispatchPlanDataEntity));
+        String value = redisUtils.get(md5Key);
+        // 存储该设备最后一次的数据
+        redisUtils.set(md5LastKey, dispatchPlanDataEntity.getDataValue());
+        redisUtils.setExpire(md5LastKey, DAYS_2);
+        if (StringUtils.isNotEmpty(value)) {
+            return;
+        }
+        // 存储该设备当前小时最早的数据
+        redisUtils.set(md5Key, dispatchPlanDataEntity.getDataValue());
+        redisUtils.setExpire(md5Key, HOURS_2 );
+        DispatchPlanReportEntity dispatchPlanReportEntity = new DispatchPlanReportEntity();
+        BeanCopyUtils.copyProperties(dispatchPlanDataEntity, dispatchPlanReportEntity, DispatchPlanReportEntity.class);
+        dispatchPlanReportEntity.setStatDay(DateUtil.getDate(new Date()));
+        dispatchPlanReportEntity.setStatHour(String.format(Constants.HOUR, DateUtil.getHour()));
+        dispatchPlanReportDao.saveReportEntity(dispatchPlanReportEntity);
+    }
+
+    protected String getMd5(DispatchPlanDataEntity entity){
+        StringBuilder builder = new StringBuilder();
+        builder.append(entity.getTenantId()).append(entity.getDeviceId()).append(entity.getDeviceCode())
+                .append(entity.getAttributeId()).append(entity.getParamType());
+        return Md5.hash(builder.toString());
+    }
+
+    protected String getMd5ByCurrentHour(DispatchPlanDataEntity entity){
+        StringBuilder builder = new StringBuilder();
+        builder.append(entity.getTenantId()).append(entity.getDeviceId()).append(entity.getDeviceCode())
+                .append(entity.getAttributeId()).append(entity.getParamType()).append(DateUtil.getHour());
+        return Md5.hash(builder.toString());
+    }
+
+}

+ 192 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/ReceiveDeviceDataService.java

@@ -0,0 +1,192 @@
+package com.zcxk.water.web.service.handle;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zcxk.core.utils.ByteArrayUtils;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.core.utils.util.RedisUtils;
+import com.zcxk.water.core.dao.DeviceMapper;
+import com.zcxk.water.core.dao.MonitorDataMapper;
+import com.zcxk.water.core.entity.MonitorDataEntity;
+import com.zcxk.water.core.entity.MonitorDataValueEntity;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * @ClassName ReceiveClearData
+ * @Description: 监听rabbitmq队列消息,获取设备报警信息 (优化版)
+ * @Author lihui
+ * @Date 2021/4/7
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class ReceiveDeviceDataService {
+
+    /**
+     * 时间
+     */
+    private static final String EVENT_TIME_KEY = "eventTime";
+
+    /**
+     * 数据
+     */
+    private static final String UNIT_IDENTIFIER_KEY = "unitIdentifier";
+
+    /**
+     * parsedData
+     */
+    private static final String PARSED_DATA_KEY = "parsedData";
+
+    /*@Autowired
+    private AlarmDataHandle alarmDataHandler;*/
+
+    @Autowired
+    private ReportWaterPumpStateHandle reportWaterPumpStateHandler;
+
+    @Resource
+    private DispatchReportHandle dispatchReportHandler;
+
+    @Resource
+    private MongoTemplate mongoTemplate;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Resource
+    private MonitorDataMapper monitorDataMapper;
+
+    @Resource
+    private RedisUtils redisUtils;
+
+    public MonitorDataEntity getDeviceMonitorInfoByDeviceCode(String deviceCode){
+        // 先取缓存里的数据
+        byte[] bytes = redisUtils.get(("sms_water_"+deviceCode).getBytes());
+        if(bytes != null && bytes.length>0){
+            return (MonitorDataEntity)ByteArrayUtils.bytesToObject(bytes).get();
+        }
+        return monitorDataMapper.getDeviceMonitorInfoByDeviceCode(deviceCode);
+    }
+
+    public MonitorDataEntity save(MonitorDataEntity monitorDataEntity) {
+        // 缓存数据
+        redisUtils.setExpire(("sms_water_"+monitorDataEntity.getDeviceCode()).getBytes(), ByteArrayUtils.objectToBytes(monitorDataEntity).get());
+        // 把没有数据的属性去掉再保存
+        monitorDataEntity.setDataValues(monitorDataEntity.getDataValues().stream().filter(m -> m.getDataValue()!=null).collect(Collectors.toList()));
+
+        return mongoTemplate.save(monitorDataEntity);
+    }
+
+    /***
+    * manufacturer 厂家,mode型号,设备编号unitIdentifier,type设备类型
+    * @author Andy
+    * @date 17:26 2021/10/19
+    * @param jsonObject:
+    * @return void
+    **/
+    public void receivedDataHandle(JSONObject jsonObject){
+        String eventTime      = jsonObject.getString("eventTime");
+        String deviceCode     = jsonObject.getString("deviceNo");
+        Date receiveDateTime  = parseDate(eventTime);
+        log.info("rabbitMq接收消息处理,code:{},上报时间:{}", deviceCode, eventTime);
+        if (!checkParameter(jsonObject, deviceCode, receiveDateTime)){
+            return;
+        }
+        // 查询不到设备或者设备属性为空
+        MonitorDataEntity monitorDataEntity = getDeviceMonitorInfoByDeviceCode(deviceCode);
+        if (monitorDataEntity == null || CollectionUtils.isEmpty(monitorDataEntity.getDataValues())){
+            log.error("rabbitMq接收消息处理,code:{},查询不到设备或者设备属性为空,退出",deviceCode);
+            return;
+        }
+        JSONObject receiveData  = JSONObject.parseObject(jsonObject.getString("decodeData"));
+        List<MonitorDataValueEntity> monitorDataValueEntities = monitorDataEntity.getDataValues();
+        Integer number = 0;
+        for (MonitorDataValueEntity monitorDataValueEntity : monitorDataValueEntities) {
+            BigDecimal bigDecimal = null;
+            try {
+                Double doubleValue = receiveData.getDouble(monitorDataValueEntity.getIdentifier());
+                if (doubleValue == null) {
+                    continue;
+                }
+                bigDecimal = new BigDecimal(doubleValue);
+            } catch (Exception e) {
+                log.error("double 转换 error ->", e);
+                continue;
+            }
+            // 整数超过10位直接变更为0
+            if (String.valueOf(bigDecimal.intValue()).length() > 10 ){
+                monitorDataValueEntity.setDataValue(0.0);
+            } else {
+                // 小数保留5位
+                Double dataValue = bigDecimal.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue();
+                monitorDataValueEntity.setDataValue(dataValue);
+            }
+            number++;
+        }
+        // 没有匹配到属性,视为垃圾数据忽略
+        if (number == 0) {
+            log.error("rabbitMq接收消息处理,code:{},上报时间:{},没有匹配到属性,视为垃圾数据忽略,退出",deviceCode, eventTime);
+            return;
+        }
+        // 保存到缓存和mongodb数据库
+        saveToCacheAndMongodb(monitorDataEntity, receiveDateTime);
+        // 修改设备上报时间
+        deviceMapper.updateLastTime(monitorDataEntity.getDeviceId(),receiveDateTime);
+        // 调度预案处理
+        dispatchReportHandler.handler(monitorDataEntity, receiveData, receiveDateTime);
+        // 水泵运行状态报表业务处理
+        reportWaterPumpStateHandler.handler(monitorDataEntity, receiveData, receiveDateTime);
+        // 异步处理报警信息
+        //alarmDataHandler.hanlder(monitorDataEntity, receiveData, receiveDateTime);
+    }
+
+
+    private Date parseDate(String eventTime){
+        return StringUtils.isEmpty(eventTime) ? null : DateUtil.parseDate(eventTime, "yyyy-MM-dd HH:mm:ss");
+    }
+
+
+    /***
+     * 对象有时间、有设备编码、有数据则解析,任何一个位空直接退出
+     * @author lihui
+     * @date 10:53 2021/5/28
+     * @param jsonObject :
+     * @param deviceCode :
+     * @return boolean
+     **/
+    private boolean checkParameter(JSONObject jsonObject, String deviceCode, Date receiveDateTime){
+        if (!jsonObject.containsKey(EVENT_TIME_KEY) || !jsonObject.containsKey(UNIT_IDENTIFIER_KEY) ||
+                !jsonObject.containsKey(PARSED_DATA_KEY)) {
+            log.error("rabbitMq接收消息处理,code:{},上报时间:{},退出",deviceCode);
+            return false;
+        }
+        if (receiveDateTime == null) {
+            log.error("rabbitMq接收消息处理,code:{},报警信息查询时间转换错误,退出", deviceCode);
+            return false;
+        }
+        return true;
+    }
+
+    private void saveToCacheAndMongodb(MonitorDataEntity monitorDataEntity, Date receiveDateTime){
+        monitorDataEntity.setCollectDate(receiveDateTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(receiveDateTime);
+        monitorDataEntity.setYear(cal.get(Calendar.YEAR));
+        monitorDataEntity.setMonth(cal.get(Calendar.MONTH)+1);
+        monitorDataEntity.setDay(cal.get(Calendar.DAY_OF_MONTH));
+        monitorDataEntity.setHour(cal.get(Calendar.HOUR_OF_DAY));
+        save(monitorDataEntity);
+    }
+
+}

+ 216 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/handle/ReportWaterPumpStateHandle.java

@@ -0,0 +1,216 @@
+package com.zcxk.water.web.service.handle;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.zcxk.core.utils.DateUtil;
+import com.zcxk.water.api.dto.watepump.ReprotWaterPumpQueryDto;
+import com.zcxk.water.core.dao.DeviceAttributeSpecsMapper;
+import com.zcxk.water.core.dao.ReportWaterPumpStateMapper;
+import com.zcxk.water.core.entity.DeviceAttributeSpecsEntity;
+import com.zcxk.water.core.entity.MonitorDataEntity;
+import com.zcxk.water.core.entity.MonitorDataValueEntity;
+import com.zcxk.water.core.entity.ReportWaterPumpStateEntity;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName ReportWaterPumpStateHandler
+ * @Description: 水泵运行状态报表业务处理
+ *               清洗数据上报,条件:属性参数类型为水泵状态(2)
+ *               清洗规则:以分钟为单位计算水泵是否运行,如水泵从00:23:22开始运行, 到01:32:22是停止,
+ *                       则认为00:23-01:32分为水泵运行状态;
+ *               如果数据存在跨天,需要重新新增一条新的数据
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class ReportWaterPumpStateHandle {
+
+    private static String IP;
+
+    @Resource
+    private ReportWaterPumpStateMapper reportWaterPumpStateMapper;
+
+    @Resource
+    private DeviceAttributeSpecsMapper deviceAttributeSpecsMapper;
+
+    @Async
+    public void handler(MonitorDataEntity monitorDataEntity, JSONObject receiveData, Date receiveDateTime){
+
+        log.info("【rabbitMq处理报警水泵运行状态报表:{}】开始处理", monitorDataEntity.getDeviceCode());
+        // 0 运行, 1停止
+        int state = 0;
+        // 执行批量插入操作
+        DeviceAttributeSpecsEntity entity = new DeviceAttributeSpecsEntity();
+        List<ReportWaterPumpStateEntity> insertList = new ArrayList<>();
+        ReprotWaterPumpQueryDto queryDto = getReprotWaterPumpQueryDto(monitorDataEntity);
+        // 转换常量,保证获取是同一个对象
+        // 避免同一时间内同一个code上报多条数据,保证数据更新和插入一致性
+        // TODO 需要采用分布式锁解决,避免部署多台服务器
+        synchronized (monitorDataEntity.getDeviceCode().intern()) {
+            for (MonitorDataValueEntity valueEntity : monitorDataEntity.getDataValues()) {
+                if (!receiveData.containsKey(valueEntity.getIdentifier())){
+                    continue;
+                }
+                entity.setAttributeId(valueEntity.getAttributeId());
+                // 查找属性ID是否有设置运行、停止状态
+                List<DeviceAttributeSpecsEntity> list = deviceAttributeSpecsMapper.findList(entity);
+                if (CollectionUtil.isEmpty(list)) {
+                    continue;
+                }
+                List<String> listSate = toList(list);
+                if (CollectionUtil.isEmpty(listSate)) {
+                    continue;
+                }
+                BigDecimal stateValue  = new BigDecimal(receiveData.getDouble(valueEntity.getIdentifier()));
+                state = listSate.contains(stateValue.toString()) ? 0 : 1;
+                queryDto.setAttributeId(valueEntity.getAttributeId());
+                addOrUpdate(queryDto.getMd5Query(), monitorDataEntity, valueEntity, insertList, state, receiveDateTime);
+            }
+            // 最后一次全部插入
+            if (insertList.size() > 0 ){
+                reportWaterPumpStateMapper.batchInsertReportWaterPumpState(insertList);
+            }
+        }
+        log.info("【rabbitMq处理报警水泵运行状态报表:{}】结束处理,新增:{}", monitorDataEntity.getDeviceCode(),insertList.size());
+    }
+
+    private List<String> toList(List<DeviceAttributeSpecsEntity> list){
+         List<String> result = new ArrayList<>();
+         for (DeviceAttributeSpecsEntity deviceAttributeSpecsEntity: list) {
+            if (deviceAttributeSpecsEntity.getSpecsName() != null &&
+                    deviceAttributeSpecsEntity.getSpecsName().indexOf("运行") != -1) {
+                result.add(deviceAttributeSpecsEntity.getSpecsValue());
+            }
+         }
+         return result;
+    }
+
+    /**
+    * @Author lihui
+    * @Description 如果查询到数据,根据返回的state来判断数据
+     * 如果返回的state和上报的state同一个状态,说明该状态一直在持续,我们不需要做任何的操作
+     * 如果返回的state和上报的state不是同一个状态,说明state已经改变,我们需要更新上一次state所持续的最后时间,并新增一条目前的state的开始时间
+     * 公式:同一id-> 00:23-00:28  运行时间
+     *           -> 00:28-00:30  停止时间
+     *           -> 00:30-null   运行时间
+    * @Date 14:08 2021/4/21
+    * @Param [md5Query :查询条件, monitorDataEntity, valueEntity, insertList :需要插入的数据集合, stateValue:泵站状态,receiveDateTime:上报数据的时间]
+    * @return
+    **/
+    private void addOrUpdate(String md5Query , MonitorDataEntity monitorDataEntity,
+                                  MonitorDataValueEntity valueEntity ,List<ReportWaterPumpStateEntity> insertList,
+                                  int stateValue, Date receiveDateTime){
+        ReportWaterPumpStateEntity stateEntity = reportWaterPumpStateMapper.findReportWaterPumpState(md5Query);
+        if (stateEntity == null) {
+            insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, receiveDateTime, null, stateValue));
+            return;
+        }
+        int stateEntityValue =  stateEntity.getState().intValue();
+        Date beginTime = stateEntity.getStateBeginTime();
+        Date endTime    = null;
+        // 计算出时间差 等于0表示同一天的数据,大于0表示跨天
+        int day  = timeDifference(stateEntity.getStateBeginTime(), receiveDateTime);
+        boolean theSameSate = stateEntityValue == stateValue;
+        /**
+         * 跨天需要新增数据
+         * 跨天数据计算规则:
+         * 1.开始时间取最后一条的起始时间,循环一次加一天
+         * 2.如果不是最后一天,末尾时间就取(上面1.的)起始时间追加23:59:59分,
+         *   如果是最后一天的数据,需要判断当前状态和最新状态是否一直,如果不一致需要添加2条数据
+         */
+        if (day != 0) {
+            reportWaterPumpStateMapper.updateReportWaterPumpState(stateEntity.getId(), parseDate(stateEntity.getStateBeginTime(), "23:59:59"), new Date());
+            for (int i = 1; i <= day; i++) {
+                beginTime = parseDate(DateUtil.addDayOfDate(beginTime, 1), "00:00:00");
+                endTime   = parseDate(beginTime, "23:59:59");
+                // 先增加不是最后一天的数据
+                if (i != day ) {
+                    insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, beginTime, endTime, stateEntityValue));
+                    continue;
+                }
+                // 最后一天的数据,需要到当前状态和最新状态是否一直,如果不一致需要添加2条数据
+                if (theSameSate) {
+                    insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, beginTime, null, stateEntityValue));
+                    continue;
+                }
+                insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, beginTime, receiveDateTime, stateEntityValue));
+                insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, receiveDateTime, null, stateValue));
+            }
+            return;
+        }
+        // 同一个状态的数据
+        if (theSameSate) {
+            return;
+        }
+        reportWaterPumpStateMapper.updateReportWaterPumpState(stateEntity.getId(), receiveDateTime, new Date());
+        insertList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, receiveDateTime, null, stateValue));
+    }
+
+
+
+    private ReprotWaterPumpQueryDto getReprotWaterPumpQueryDto(MonitorDataEntity monitorDataEntity){
+        ReprotWaterPumpQueryDto queryDto = new ReprotWaterPumpQueryDto();
+        queryDto.setYear(monitorDataEntity.getYear());
+        queryDto.setMonth(monitorDataEntity.getMonth());
+        queryDto.setDay(monitorDataEntity.getDay());
+        queryDto.setTenantId(monitorDataEntity.getTenantId());
+        queryDto.setDeviceId(monitorDataEntity.getDeviceId());
+        queryDto.setDeviceCode(monitorDataEntity.getDeviceCode());
+        return queryDto;
+    }
+
+    private ReportWaterPumpStateEntity getReportWaterPumpStateEntity(MonitorDataEntity monitorDataEntity, MonitorDataValueEntity monitorDataValueEntity,
+                                                                     Date receiveDateTime, Date endTime, Integer state){
+        Date nowTime = new Date();
+        ReportWaterPumpStateEntity entity = new ReportWaterPumpStateEntity();
+        entity.setState(state);
+        entity.setTenantId(monitorDataEntity.getTenantId());
+        entity.setDeviceId(monitorDataEntity.getDeviceId());
+        entity.setDeviceCode(monitorDataEntity.getDeviceCode());
+        entity.setDeviceName(monitorDataEntity.getDeviceName());
+        entity.setYear(monitorDataEntity.getYear());
+        entity.setMonth(monitorDataEntity.getMonth());
+        entity.setDay(monitorDataEntity.getDay());
+        entity.setAttributeId(monitorDataValueEntity.getAttributeId());
+        entity.setAttributeName(monitorDataValueEntity.getAttributeName());
+        entity.setStateBeginTime(receiveDateTime);
+        entity.setStateEndTime(endTime);
+        entity.setDateCreate(nowTime);
+        entity.setDateUpdate(nowTime);
+        entity.setMd5Query(entity.getMd5());
+        entity.setIp(getIp());
+        return entity;
+    }
+
+    private int timeDifference(Date beginTime, Date endTime){
+        return Integer.parseInt(DateUtil.formatDate(endTime, "yyyyMMdd")) - Integer.parseInt(DateUtil.formatDate(beginTime, "yyyyMMdd"));
+    }
+
+    private Date parseDate(Date date, String appendTo){
+        return DateUtil.parseDate(DateUtil.formatDate(date, "yyyy-MM-dd") + " " + appendTo,
+                "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public String getIp(){
+        try {
+            if (IP == null) {
+                IP =  InetAddress.getLocalHost().getHostAddress();
+            }
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        return IP;
+    }
+}

+ 126 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/AlarmTypeDetailsServiceImpl.java

@@ -0,0 +1,126 @@
+package com.zcxk.water.web.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zcxk.core.common.util.BeanCopyUtils;
+import com.zcxk.core.oauth2.util.UserUtil;
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
+import com.zcxk.water.api.dto.AlarmDetailsDto;
+import com.zcxk.water.api.dto.AlarmTypeDetailsDto;
+import com.zcxk.water.api.enums.AlarmStateEnum;
+import com.zcxk.water.api.vo.AlarmTypeDetailsEntityVo;
+import com.zcxk.water.api.vo.DeviceSceneVo;
+import com.zcxk.water.core.dao.AlarmTypeDetailMapper;
+import com.zcxk.water.core.dao.DeviceSceneMapper;
+import com.zcxk.water.core.entity.AlarmDetailsEntity;
+import com.zcxk.water.web.service.AlarmTypeDetailsService;
+import com.zcxk.water.web.service.AlarmTypeService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description
+ * @author Andy
+ * @data 2021-10-19 15:48
+ */
+@Service
+@Log4j2
+public class AlarmTypeDetailsServiceImpl implements AlarmTypeDetailsService {
+
+    @Resource
+    private AlarmTypeDetailMapper alarmTypeDetailMapper;
+
+    @Resource
+    private AlarmTypeService alarmTypeService;
+
+    @Resource
+    private DeviceSceneMapper deviceSceneMapper;
+
+    @Override
+    public Integer insert(AlarmDetailsAddDto dto) {
+        List<AlarmDetailsEntity> entities = this.convert(dto);
+        if (entities == null) {
+            return 0;
+        }
+        return alarmTypeDetailMapper.batchInsert(entities);
+    }
+
+    @Override
+    public Integer batchInsert(List<AlarmDetailsAddDto> alarmDetails) {
+        List<AlarmDetailsEntity> entities = this.convert(alarmDetails);
+        if (entities == null) {
+            return 0;
+        }
+        return alarmTypeDetailMapper.batchInsert(entities);
+    }
+
+    @Override
+    public IPage<AlarmTypeDetailsEntityVo> selectPage(IPage<AlarmDetailsDto> page, AlarmTypeDetailsDto alarmDetailsDto) {
+        return alarmTypeDetailMapper.selectPage(page, alarmDetailsDto, UserUtil.getCurrentUser().getUserCondition());
+    }
+
+    @Override
+    public Integer updateStateByDeviceId(Long deviceId, Integer state) {
+        return alarmTypeDetailMapper.updateStateByDeviceId(deviceId, state);
+    }
+
+
+    /**
+    * 转换实体
+    * @author Andy
+    * @date 16:56 2021/10/19
+    * @param dto:
+    * @return java.util.List<com.zcxk.water.core.entity.AlarmDetailsEntity>
+    **/
+    private List<AlarmDetailsEntity> convert(List<AlarmDetailsAddDto> dto){
+        if (CollectionUtils.isEmpty(dto)){
+            return null;
+        }
+        List<AlarmDetailsEntity> list = new ArrayList<>();
+        for (AlarmDetailsAddDto alarmDetailsAddDto : dto) {
+            List<AlarmDetailsEntity> entities = convert(alarmDetailsAddDto);
+            if (entities != null) {
+                list.addAll(convert(alarmDetailsAddDto));
+            }
+        }
+        return list;
+    }
+
+
+    /**
+    * 通过设备ID查找该设备有多少个场景,需要给每个场景添加一条数据
+    * @author Andy
+    * @date 16:56 2021/10/19
+    * @param dto:
+    * @return java.util.List<com.zcxk.water.core.entity.AlarmDetailsEntity>
+    **/
+    private List<AlarmDetailsEntity> convert(AlarmDetailsAddDto dto){
+        List<AlarmDetailsEntity> result;
+        Long deviceId = alarmTypeService.findDeviceIdByIotAlarmId(dto.getAlarmId());
+        if (deviceId == null || deviceId == 0) {
+            return null;
+        }
+        result = new ArrayList<>();
+        List<DeviceSceneVo> sceneVos = deviceSceneMapper.findSceneByDeviceId(deviceId);
+        for (DeviceSceneVo sceneVo : sceneVos) {
+            AlarmDetailsEntity alarmDetailsEntity = BeanCopyUtils.copy(dto, AlarmDetailsEntity.class);
+            alarmDetailsEntity.setCreateDate(new Date());
+            alarmDetailsEntity.setState(AlarmStateEnum.REALTIME_ALARM.getCode());
+            if (sceneVo.getSceneId().equals(sceneVo.getParentSceneId())){
+                alarmDetailsEntity.setSceneId(sceneVo.getSceneId().toString());
+                alarmDetailsEntity.setSceneName(sceneVo.getSceneName());
+            } else {
+                alarmDetailsEntity.setSceneId(sceneVo.getParentSceneId() + "-" + sceneVo.getSceneId());
+                alarmDetailsEntity.setSceneName(sceneVo.getParentSceneName() +"-" + sceneVo.getSceneName());
+            }
+            result.add(alarmDetailsEntity);
+        }
+        return result;
+    }
+
+}

+ 5 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/AlarmTypeServiceImpl.java

@@ -74,6 +74,11 @@ public class AlarmTypeServiceImpl implements AlarmTypeService {
         return vo;
     }
 
+    @Override
+    public Long findDeviceIdByIotAlarmId(Integer id) {
+        return alarmTypeMapper.findDeviceIdByIotAlarmId(id);
+    }
+
     @Override
     public IPage<AlarmTypeVo> getAlarmTypePage(AlarmTypePageDto dto) {
         IPage<DeviceDto> iPage = new Page<>(dto.getPageNum(), dto.getPageSize());

+ 2 - 2
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/DeviceServiceImpl.java

@@ -164,11 +164,11 @@ public class DeviceServiceImpl implements DeviceService {
         deviceDto.setTenantId(loginUser.getTenantId());
         deviceDto.setProgramItems(loginUser.getProgramItemList());
         deviceDto.setUserType(loginUser.getType());
-        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        // 1是公司,2是公司及以下,3部门,4部门及以下,5自定义
         deviceDto.setPermissonType(loginUser.getPermissonType());
         List<DeviceVo> deviceVoList = deviceMapper.selectList(deviceDto);
         Map<Long, DeviceVo> map = new HashMap<>();
-        //数据清洗
+        // 数据清洗
         if (deviceDto.getSceneId() != null) {
             for (DeviceVo item : deviceVoList) {
                 if (!map.containsKey(item.getId())) {

+ 63 - 0
zoniot-water/zoniot-water-web/src/main/java/com/zcxk/water/web/service/impl/NotifyServiceImpl.java

@@ -0,0 +1,63 @@
+package com.zcxk.water.web.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zcxk.water.api.dto.AlarmDetailsAddDto;
+import com.zcxk.water.api.dto.DeviceDataDto;
+import com.zcxk.water.api.dto.DeviceStateDto;
+import com.zcxk.water.api.enums.AlarmStateEnum;
+import com.zcxk.water.api.enums.DeviceStatusEnum;
+import com.zcxk.water.core.dao.DeviceMapper;
+import com.zcxk.water.core.entity.AlarmType;
+import com.zcxk.water.web.service.AlarmDetailsService;
+import com.zcxk.water.web.service.AlarmTypeDetailsService;
+import com.zcxk.water.web.service.NotifyService;
+import com.zcxk.water.web.service.handle.ReceiveDeviceDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 通知业务处理
+ * @date 2021/10/19
+ **/
+@Service
+@Slf4j
+public class NotifyServiceImpl implements NotifyService {
+
+    @Autowired
+    private AlarmTypeDetailsService alarmTypeDetailsService;
+
+    @Autowired
+    private ReceiveDeviceDataService receiveDeviceDataService;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+
+    @Override
+    public Integer insertAlarmInfo(AlarmDetailsAddDto dto) {
+        return alarmTypeDetailsService.insert(dto);
+    }
+
+    @Override
+    public void receiveDeviceData(DeviceDataDto deviceData) {
+        receiveDeviceDataService.receivedDataHandle(JSONObject.parseObject(JSON.toJSONString(deviceData)));
+    }
+
+    @Override
+    public void updateDeviceSate(DeviceStateDto dto) {
+        // 修改设备状态
+        deviceMapper.updateStateByIotDeviceId(dto.getDeviceId(), dto.getState());
+        Long deviceId = deviceMapper.findDeviceIdByIotDeviceId(dto.getDeviceId());
+        // 如果正常就要变更报警为正常
+        if (!DeviceStatusEnum.offline(dto.getState())) {
+            alarmTypeDetailsService.updateStateByDeviceId(deviceId, AlarmStateEnum.HISTORY_ALARM.getCode());
+        }
+    }
+
+}

+ 3 - 32
zoniot-water/zoniot-water-xxl-client/src/main/java/com/zcxk/water/xxl/mq/ReceiveClearData.java

@@ -2,6 +2,7 @@ package com.zcxk.water.xxl.mq;
 
 import com.alibaba.fastjson.JSONObject;
 import com.zcxk.water.core.dao.AlarmDetailMapper;
+import com.zcxk.water.core.dao.DeviceMapper;
 import com.zcxk.water.core.dao.MonitorDataMapper;
 import com.zcxk.water.core.entity.MonitorDataEntity;
 import com.zcxk.water.core.entity.MonitorDataValueEntity;
@@ -67,10 +68,7 @@ public class ReceiveClearData {
     private MongoTemplate mongoTemplate;
 
     @Resource
-    private AlarmDetailMapper alarmDetailMapper;
-
-    @Value("${receiveData.spring.rabbitmq.listener.queue}")
-    private String rabbitmqQueue;
+    private DeviceMapper deviceMapper;
 
     @Resource
     private MonitorDataMapper monitorDataMapper;
@@ -78,9 +76,6 @@ public class ReceiveClearData {
     @Resource
     private RedisUtils redisUtils;
 
-    private static final String ORIGINAL_DATA_STRING = "originalData";
-
-
     public MonitorDataEntity getDeviceMonitorInfoByDeviceCode(String deviceCode){
         // 先取缓存里的数据
         byte[] bytes = redisUtils.get(("sms_water_"+deviceCode).getBytes());
@@ -99,29 +94,6 @@ public class ReceiveClearData {
         return mongoTemplate.save(monitorDataEntity);
     }
 
-    /**
-     * 先注入,然后再通过SPEL取值
-     * @return
-     */
-    @Bean
-    public String rabbitmqQueue(){
-        return rabbitmqQueue;
-    }
-
-    @RabbitHandler
-    @RabbitListener(queues = "#{rabbitmqQueue}", containerFactory = "receiveDataContainerFactory")
-    public void received(byte[] receivedData) {
-        try {
-            log.debug("rabbitMq接收消息:"+new String(receivedData));
-            receivedDataHandle(receivedData);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error(ExceptionUtils.getStackTrace(e));
-            // 发送异常时消息返回队列
-//            receiveDataRabbitTemplate.convertAndSend(rabbitmqQueue, receivedData);
-        }
-    }
-
     /***
      * 		manufacturer 厂家,mode型号,设备编号unitIdentifier,type设备类型
      *
@@ -178,7 +150,7 @@ public class ReceiveClearData {
         // 保存到缓存和mongodb数据库
         saveToCacheAndMongodb(monitorDataEntity, receiveDateTime);
         // 修改设备上报时间
-        alarmDetailMapper.udpateLastUpdateTime(monitorDataEntity.getDeviceId(),receiveDateTime);
+        deviceMapper.updateLastTime(monitorDataEntity.getDeviceId(),receiveDateTime);
         // 调度预案处理
         dispatchReportHandler.handler(monitorDataEntity, receiveData, receiveDateTime);
         // 水泵运行状态报表业务处理
@@ -214,7 +186,6 @@ public class ReceiveClearData {
         return true;
     }
 
-
     private void saveToCacheAndMongodb(MonitorDataEntity monitorDataEntity, Date receiveDateTime){
         monitorDataEntity.setCollectDate(receiveDateTime);
         Calendar cal = Calendar.getInstance();