Browse Source

数据报警需求

lihui007 4 năm trước cách đây
mục cha
commit
1e4c50983b
42 tập tin đã thay đổi với 1418 bổ sung182 xóa
  1. 44 4
      sms_water/src/main/java/com/huaxu/common/CalcUtil.java
  2. 34 12
      sms_water/src/main/java/com/huaxu/controller/DataAlarmController.java
  3. 44 0
      sms_water/src/main/java/com/huaxu/controller/MathematicalSymbolController.java
  4. 1 0
      sms_water/src/main/java/com/huaxu/dao/DayReportMapper.java
  5. 2 1
      sms_water/src/main/java/com/huaxu/dao/MonthReportMapper.java
  6. 2 1
      sms_water/src/main/java/com/huaxu/dao/YearReportMapper.java
  7. 11 1
      sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmAnalysisMapper.java
  8. 44 2
      sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmDetailMapper.java
  9. 14 4
      sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmManageMapper.java
  10. 1 2
      sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmDto.java
  11. 32 0
      sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmExportDto.java
  12. 1 2
      sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmManageDto.java
  13. 4 0
      sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmQueryDto.java
  14. 3 9
      sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmSettingDto.java
  15. 6 3
      sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmAnalysisEntity.java
  16. 18 3
      sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmDetailEntity.java
  17. 8 2
      sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmManageEntity.java
  18. 4 4
      sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmSetting.java
  19. 13 0
      sms_water/src/main/java/com/huaxu/enums/MathematicalSymbolEnum.java
  20. 268 0
      sms_water/src/main/java/com/huaxu/quartz/service/AbstractDataAlarmJobService.java
  21. 80 0
      sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmDayJobService.java
  22. 77 0
      sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmHourJobService.java
  23. 74 0
      sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmMonthJobService.java
  24. 7 1
      sms_water/src/main/java/com/huaxu/quartz/service/MonitorReportJobService.java
  25. 37 0
      sms_water/src/main/java/com/huaxu/rabbitmq/DataAlarmHandler.java
  26. 3 2
      sms_water/src/main/java/com/huaxu/service/DataAlarmAnalysisService.java
  27. 2 1
      sms_water/src/main/java/com/huaxu/service/DataAlarmDetailService.java
  28. 1 1
      sms_water/src/main/java/com/huaxu/service/DataAlarmManageService.java
  29. 12 5
      sms_water/src/main/java/com/huaxu/service/impl/MonitorDataServiceImpl.java
  30. 13 1
      sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmAnalysisServiceImpl.java
  31. 15 3
      sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmDetailServiceImpl.java
  32. 16 5
      sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmManageServiceImpl.java
  33. 114 5
      sms_water/src/main/java/com/huaxu/vo/DataAlarmAnalysisVo.java
  34. 120 4
      sms_water/src/main/java/com/huaxu/vo/DataAlarmDetailsVo.java
  35. 46 0
      sms_water/src/main/java/com/huaxu/vo/DataAlarmManageVo.java
  36. 2 2
      sms_water/src/main/java/com/huaxu/vo/DataAlarmSettingVo.java
  37. 60 24
      sms_water/src/main/resources/mapper/DataAlarmAnalysisMapper.xml
  38. 102 34
      sms_water/src/main/resources/mapper/DataAlarmDetailMapper.xml
  39. 46 44
      sms_water/src/main/resources/mapper/DataAlarmManageMapper.xml
  40. 12 0
      sms_water/src/main/resources/mapper/DayReportMapper.xml
  41. 13 0
      sms_water/src/main/resources/mapper/MonthReportMapper.xml
  42. 12 0
      sms_water/src/main/resources/mapper/YearReportMapper.xml

+ 44 - 4
sms_water/src/main/java/com/huaxu/common/CalcUtil.java

@@ -1,11 +1,13 @@
 package com.huaxu.common;
 
 import cn.hutool.crypto.asymmetric.Sign;
+import com.huaxu.exception.ServiceException;
 
 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 
 /**
  * @description
@@ -15,16 +17,14 @@ import java.math.BigDecimal;
 public class CalcUtil {
 
     private static ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
+
     private static ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");
-//        String expression = "10 * 2 + 6 / (3 - 1)";
-//        String expression = "1>2";
 
     /**
      * 调用js方法执行表达式
      * @param expression
      */
     public static String executeExpression(String expression) throws ScriptException {
-
         return String.valueOf(scriptEngine.eval(expression));
     }
 
@@ -49,8 +49,48 @@ public class CalcUtil {
         return false;
     }
 
+    public static Boolean compareBySign(BigDecimal param1 , BigDecimal param2 , String sign){
+        int result = param1.compareTo(param2);
+        switch (sign){
+            case ">": return result == 1;
+            case "≥": return result != -1;
+            case "<": return result == -1;
+            case "≤": return result != 1;
+            case "=": return result == 0;
+            case "≠": return result != 0;
+        }
+        return false;
+    }
+
+    public static Boolean compareBySign(BigDecimal param1 ,String operation, BigDecimal param2 , String sign, BigDecimal param3) {
+        BigDecimal operationResult = operation(param1, operation, param2);
+        int result = operationResult.compareTo(param3);
+        switch (sign){
+            case ">": return result == 1;
+            case "≥": return result != -1;
+            case "<": return result == -1;
+            case "≤": return result != 1;
+            case "=": return result == 0;
+            case "≠": return result != 0;
+            default: return false;
+        }
+    }
+
+
+    public static BigDecimal operation(BigDecimal param1, String operation, BigDecimal param2){
+        switch (operation) {
+            case "+": return param1.add(param2);
+            case "-": return param1.subtract(param2);
+            case "*": return param1.multiply(param2);
+            case "/": return param1.divide(param2, 2, RoundingMode.HALF_UP);
+            default :
+                throw new ServiceException(500, "运算错误,没找到相关运算符号+、-、*、/");
+        }
+    }
+
+
     public static void main(String[] args) throws ScriptException{
-       System.out.println( CalcUtil.compareBySign(null ,2.0,">"));
+       System.out.println( CalcUtil.operation(new BigDecimal("17339.98") ,"+", new BigDecimal("17389.73")));
     }
 
 

+ 34 - 12
sms_water/src/main/java/com/huaxu/controller/DataAlarmController.java

@@ -1,7 +1,11 @@
 package com.huaxu.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.common.EasyExcelUtil;
 import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmExportDto;
 import com.huaxu.dto.alarm.DataAlarmManageDto;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
 import com.huaxu.model.AjaxMessage;
 import com.huaxu.model.Pagination;
 import com.huaxu.model.ResultStatus;
@@ -15,6 +19,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
@@ -61,7 +66,7 @@ public class DataAlarmController {
 
     @RequestMapping(value="find/manage" , method = RequestMethod.POST)
     @ApiOperation(value = "查询报警管理")
-    public AjaxMessage<DataAlarmManageVo> findManage(@ApiParam(value = "报警设置ID", required = true) @RequestParam("alarmId") Long alarmId) {
+    public AjaxMessage<DataAlarmManageEntity> findManage(@ApiParam(value = "报警设置ID", required = true) @RequestParam("alarmId") Long alarmId) {
         return new AjaxMessage<>(ResultStatus.OK, dataAlarmManageService.findAlarmManage(alarmId));
     }
 
@@ -85,10 +90,11 @@ public class DataAlarmController {
         return new AjaxMessage<>(ResultStatus.OK, new Pagination<>(dataAlarmDetailService.findPage(dataAlarmDto, 0)));
     }
 
-    @RequestMapping(value="del/realtime" , method = RequestMethod.POST)
-    @ApiOperation(value = "删除实时报警数据")
-    public AjaxMessage<String> delRealTime(@ApiParam(value = "报警设置ID", required = true) @RequestParam("alarmId") Long alarmId) {
-        dataAlarmDetailService.deldelAlarmDetails(alarmId);
+    @RequestMapping(value="update/realtime/status" , method = RequestMethod.GET)
+    @ApiOperation(value = "挂起/恢复实时报警数据")
+    public AjaxMessage<String> updateRealTimeStatus(@ApiParam(value = "报警设置ID", required = true) @RequestParam("alarmId") Long alarmId,
+                                              @ApiParam(value = "挂起状态:0恢复,1挂起", required = true) @RequestParam("status") int status) {
+        dataAlarmDetailService.hangUpAlarmDetails(alarmId, status);
         return new AjaxMessage<>(ResultStatus.OK);
     }
 
@@ -98,17 +104,33 @@ public class DataAlarmController {
         return new AjaxMessage<>(ResultStatus.OK, new Pagination<>(dataAlarmDetailService.findPage(dataAlarmDto, 1)));
     }
 
-    @RequestMapping(value="del/history" , method = RequestMethod.POST)
-    @ApiOperation(value = "删除历史报警数据")
-    public AjaxMessage<String> delHistory(@ApiParam(value = "报警设置ID", required = true) @RequestParam("alarmId") Long alarmId) {
-        dataAlarmDetailService.deldelAlarmDetails(alarmId);
-        return new AjaxMessage<>(ResultStatus.OK);
-    }
-
     @RequestMapping(value="list/analysis" , method = RequestMethod.POST)
     @ApiOperation(value = "查询数据分析")
     public AjaxMessage<Pagination<DataAlarmAnalysisVo>> listAnalysis(@RequestBody @Valid DataAlarmDto dataAlarmDto) {
         return new AjaxMessage<>(ResultStatus.OK, new Pagination<>(dataAlarmAnalysisService.findPage(dataAlarmDto)));
     }
 
+    @RequestMapping(value="export/excel" , method = RequestMethod.POST)
+    @ApiOperation(value = "excel导出")
+    public AjaxMessage<String> exportExcel(@RequestBody @Valid DataAlarmExportDto exportDto) {
+        DataAlarmDto alarmDto = new DataAlarmDto();
+        BeanUtils.copyProperties(exportDto, alarmDto);
+        alarmDto.setPageNum(1);
+        alarmDto.setPageSize(100000);
+        String filePath = null;
+        if (exportDto.getExportType() == 0 || exportDto.getExportType() == 1) {
+            String title = exportDto.getExportType() == 0 ? "实时数据" :"历史数据";
+            Page<DataAlarmDetailsVo> page =  dataAlarmDetailService.findPage(alarmDto, exportDto.getExportType());
+            filePath = EasyExcelUtil.excelWrite(baseDir, DataAlarmDetailsVo.class, "数据报警" + title, page.getRecords());
+            return new AjaxMessage<>(ResultStatus.OK, filePath);
+        }
+        if (exportDto.getExportType() == 2) {
+            Page<DataAlarmAnalysisVo> page = dataAlarmAnalysisService.findPage(alarmDto);
+            filePath = EasyExcelUtil.excelWrite(baseDir, DataAlarmAnalysisVo.class, "数据报警分析", page.getRecords());
+            return new AjaxMessage<>(ResultStatus.OK, filePath);
+        }
+        return new AjaxMessage<>(ResultStatus.OK);
+    }
+
+
 }

+ 44 - 0
sms_water/src/main/java/com/huaxu/controller/MathematicalSymbolController.java

@@ -0,0 +1,44 @@
+package com.huaxu.controller;
+
+import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmManageDto;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.enums.MathematicalSymbolEnum;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.DataAlarmAnalysisService;
+import com.huaxu.service.DataAlarmDetailService;
+import com.huaxu.service.DataAlarmManageService;
+import com.huaxu.vo.DataAlarmAnalysisVo;
+import com.huaxu.vo.DataAlarmDetailsVo;
+import com.huaxu.vo.DataAlarmManageVo;
+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.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+
+/***
+ * 数学符号
+ * @author lihui
+ * @date 14:17 2021/6/2
+ **/
+@RestController
+@RequestMapping("/mathematical/symbol")
+@Api(tags = "数学符号")
+@Slf4j
+public class MathematicalSymbolController {
+
+    @RequestMapping(value="list" , method = RequestMethod.GET)
+    @ApiOperation(value = "查询符号")
+    public AjaxMessage<List> list(@ApiParam(value = "类型", required = true) @RequestParam("type") int type) {
+        return new AjaxMessage<>(ResultStatus.OK, MathematicalSymbolEnum.getMathematicalSymbolByType(type));
+    }
+}

+ 1 - 0
sms_water/src/main/java/com/huaxu/dao/DayReportMapper.java

@@ -57,4 +57,5 @@ public interface DayReportMapper extends BaseMapper<DayReportEntity> {
 
     List<DayReportEntity> findDeviceLastDayValue(@Param("dayReport") DayReportEntity dayReportEntity);
 
+    DayReportEntity findLastDayValue(@Param("dayReport") DayReportEntity dayReportEntity);
 }

+ 2 - 1
sms_water/src/main/java/com/huaxu/dao/MonthReportMapper.java

@@ -50,5 +50,6 @@ public interface MonthReportMapper extends BaseMapper<MonthReportEntity> {
     List<MonthReportEntity> findAmountTotalBySceneIds(@Param("monthReport")  MonthReportEntity monthReportEntity);
 
     List<ReportAttributeDto> findAttributeListForMonth(@Param("report") ReportDto reportDto);
-    /**删除相关方法  使用mybatis-plus集成的 **/
+
+    ReportAttributeDto findSumValue(@Param("report") MonthReportEntity reportDto);
 }

+ 2 - 1
sms_water/src/main/java/com/huaxu/dao/YearReportMapper.java

@@ -46,5 +46,6 @@ public interface YearReportMapper extends BaseMapper<YearReportEntity> {
     Page<DeviceWaterReportAttributeDto> findDeviceWaterPage(IPage<DeviceWaterReportAttributeDto> page, @Param("yearReport") YearReportEntity yearReportEntity);
 
     List<YearReportEntity> findAmountTotalBySceneIds(@Param("yearReport") YearReportEntity yearReportEntity);
-    /**删除相关方法  使用mybatis-plus集成的 **/
+
+    YearReportEntity findSumValue(@Param("report") YearReportEntity yearReportEntity);
 }

+ 11 - 1
sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmAnalysisMapper.java

@@ -3,6 +3,8 @@ package com.huaxu.dao.alarm;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmQueryDto;
+import com.huaxu.entity.alarm.DataAlarmAnalysisEntity;
 import com.huaxu.vo.DataAlarmAnalysisVo;
 import com.huaxu.vo.DataAlarmDetailsVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -18,6 +20,14 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface DataAlarmAnalysisMapper {
 
+    /***
+     * 保存数据
+     * @author lihui
+     * @date 14:21 2021/6/1
+     * @param entity :
+     * @return void
+     **/
+    void saveDataAlarmAnalysis(DataAlarmAnalysisEntity entity);
 
     /***
      * 分页查询
@@ -27,5 +37,5 @@ public interface DataAlarmAnalysisMapper {
      * @param dto :  参数
      * @return com.baomidou.mybatisplus.core.metadata.IPage<com.huaxu.vo.DataAlarmDetailsVo>
      **/
-    Page<DataAlarmAnalysisVo> findPage(@Param("page") IPage<DataAlarmDto> page, DataAlarmDto dto);
+    Page<DataAlarmAnalysisVo> findPage(@Param("page") IPage<DataAlarmDto> page, DataAlarmQueryDto dto);
 }

+ 44 - 2
sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmDetailMapper.java

@@ -3,11 +3,15 @@ package com.huaxu.dao.alarm;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmQueryDto;
+import com.huaxu.entity.alarm.DataAlarmDetailEntity;
 import com.huaxu.vo.DataAlarmDetailsVo;
 import com.huaxu.vo.DataAlarmManageVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 数据报警详情mapper
  *
@@ -19,6 +23,16 @@ import org.apache.ibatis.annotations.Param;
 public interface DataAlarmDetailMapper {
 
 
+    /***
+     * 保存数据
+     * @author lihui
+     * @date 14:13 2021/6/1
+     * @param entity :
+     * @return void
+     **/
+    void saveDataAlarmDetail(DataAlarmDetailEntity entity);
+
+
     /***
      * 分页查询
      * @author lihui
@@ -27,14 +41,42 @@ public interface DataAlarmDetailMapper {
      * @param dto :  参数
      * @return com.baomidou.mybatisplus.core.metadata.IPage<com.huaxu.vo.DataAlarmDetailsVo>
      **/
-    Page<DataAlarmDetailsVo> findPage(@Param("page") IPage<DataAlarmDto> page, DataAlarmDto dto, int isHistory);
+    Page<DataAlarmDetailsVo> findPage(@Param("page") IPage<DataAlarmDto> page, DataAlarmQueryDto dto, @Param("history") int history);
 
     /***
      * 删除
      * @author lihui
      * @date 15:50 2021/5/31
      * @param alarmId :
+     * @param  status: 是否被挂起:0不是,1是
+     * @return void
+     **/
+    void hangUpAlarmDetails(@Param("alarmId") Long alarmId,@Param("status") int status);
+
+    /***
+     * 更新为历史数据
+     * @author lihui
+     * @date 14:20 2021/6/1
+     * @param alarmId :
+     * @return void
+     **/
+    void updateHistoryData(Long alarmId);
+
+    /***
+     * md5查询
+     * @author lihui
+     * @date 17:22 2021/6/1
+     * @param manageIds :
+     * @return java.util.List<com.huaxu.vo.DataAlarmDetailsVo>
+     **/
+    List<DataAlarmDetailEntity> listByManageId(@Param("manageIds") List<Long> manageIds);
+
+    /***
+     * 更新报警数据
+     * @author lihui
+     * @date 17:37 2021/6/1
+     * @param entity :
      * @return void
      **/
-    void deldelAlarmDetails(Long alarmId);
+    void updateAlrarmData(DataAlarmDetailEntity entity);
 }

+ 14 - 4
sms_water/src/main/java/com/huaxu/dao/alarm/DataAlarmManageMapper.java

@@ -36,9 +36,9 @@ public interface DataAlarmManageMapper {
      * @author lihui
      * @date 15:11 2021/5/31
      * @param aramId :
-     * @return com.huaxu.vo.DataAlarmManageVo
+     * @return com.huaxu.E.DataAlarmManageEntity
      **/
-    DataAlarmManageVo findAlarmManage(Long aramId);
+    DataAlarmManageEntity findAlarmManage(Long aramId);
 
     /***
      * 分页查询
@@ -57,7 +57,7 @@ public interface DataAlarmManageMapper {
      * @param dto : 数据
      * @return void
      **/
-    void updateDataAlarmManage(DataAlarmManageDto dto);
+    void updateDataAlarmManage(DataAlarmManageEntity dto);
 
     /***
      * 删除数据
@@ -66,5 +66,15 @@ public interface DataAlarmManageMapper {
      * @param alarmIds :
      * @return void
      **/
-    void delDataAlarmManage(List<Long> alarmIds);
+    void delDataAlarmManage(@Param("alarmIds") List<Long> alarmIds);
+
+    /***
+     * 查询设置的数据报警
+     * @author lihui
+     * @date 11:36 2021/6/3
+     * @param type :
+     * @return java.util.List<com.huaxu.vo.DataAlarmManageVo>
+     **/
+    List<DataAlarmManageVo> listByType(int type);
+
 }

+ 1 - 2
sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmDto.java

@@ -18,8 +18,7 @@ import java.io.Serializable;
 public class DataAlarmDto implements Serializable {
 
     @ApiModelProperty(value = "名称")
-    @NotNull
-    private String alarName;
+    private String alarmName;
 
     @ApiModelProperty(value = "开始时间")
     private String beginTime;

+ 32 - 0
sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmExportDto.java

@@ -0,0 +1,32 @@
+package com.huaxu.dto.alarm;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 数据报警导出查询字段
+ * @author lihui
+ * @version V1.0
+ * @date 2021/6/3
+ **/
+@Data
+@Api("数据报警导出查询字段")
+public class DataAlarmExportDto implements Serializable {
+
+    @ApiModelProperty(value = "名称")
+    private String alarmName;
+
+    @ApiModelProperty(value = "开始时间")
+    private String beginTime;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "0:实时数据,1:历史数据,2:数据分析")
+    @NotNull
+    private Integer exportType;
+}

+ 1 - 2
sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmManageDto.java

@@ -1,6 +1,5 @@
 package com.huaxu.dto.alarm;
 
-import com.huaxu.entity.alarm.DataAlarmSetting;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -19,7 +18,7 @@ import java.io.Serializable;
 public class DataAlarmManageDto extends DataAlarmSettingDto implements Serializable {
 
     @ApiModelProperty(value = "报警ID")
-    private Long alarId;
+    private Long alarmId;
 
     @ApiModelProperty(value = "名称")
     @NotNull

+ 4 - 0
sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmQueryDto.java

@@ -30,4 +30,8 @@ public class DataAlarmQueryDto extends DataAlarmDto implements Serializable {
     @ApiModelProperty(value = "用户类型(-9999 超管 -999普通用户 2普通用户)",hidden = true)
     @JsonIgnore
     private String userType;
+
+    @ApiModelProperty(value="用户权限类型",hidden = true)
+    @JsonIgnore
+    private Integer permissonType;
 }

+ 3 - 9
sms_water/src/main/java/com/huaxu/dto/alarm/DataAlarmSettingDto.java

@@ -23,9 +23,6 @@ public class DataAlarmSettingDto {
     @ApiModelProperty(value = "参数ID")
     private Long beAttributeId;
 
-    @ApiModelProperty(value = "地址")
-    private String beAddress;
-
     @ApiModelProperty(value = "类型")
     private int beType;
 
@@ -41,15 +38,12 @@ public class DataAlarmSettingDto {
     @ApiModelProperty(value = "对比参数ID")
     private Long toAttributeId;
 
-    @ApiModelProperty(value = "地址")
-    private String toAddress;
-
     @ApiModelProperty(value = "对比类型")
     private int toType;
 
-    @ApiModelProperty(value = "对比报警规则")
-    private String alarRules;
+    @ApiModelProperty(value = "报警规则")
+    private String alarmRules;
 
     @ApiModelProperty(value = "报警值")
-    private BigDecimal alarValue;
+    private BigDecimal alarmValue;
 }

+ 6 - 3
sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmAnalysisEntity.java

@@ -16,16 +16,19 @@ import java.math.BigDecimal;
 @TableName("sms_data_alarm_analysis")
 public class DataAlarmAnalysisEntity extends DataAlarmSetting {
 
+    @ApiModelProperty(value = "报警管理ID")
+    private Long manageId;
+
     @ApiModelProperty(value = "名称")
     private String alarmName;
 
     @ApiModelProperty(value = "报警值")
-    private BigDecimal beAlarValue;
+    private BigDecimal beAlarmValue;
 
     @ApiModelProperty(value = "报警对比值")
-    private BigDecimal toAlarValue;
+    private BigDecimal toAlarmValue;
 
     @ApiModelProperty(value = "报警结果值")
-    private BigDecimal resultAlarValue;
+    private BigDecimal resultAlarmValue;
 
 }

+ 18 - 3
sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmDetailEntity.java

@@ -1,6 +1,7 @@
 package com.huaxu.entity.alarm;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.huaxu.common.Md5Util;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -17,6 +18,9 @@ import java.util.Date;
 @TableName("sms_data_alarm_detail")
 public class DataAlarmDetailEntity extends DataAlarmSetting {
 
+    @ApiModelProperty(value = "报警管理ID")
+    private Long manageId;
+
     @ApiModelProperty(value = "名称")
     private String alarmName;
 
@@ -27,14 +31,25 @@ public class DataAlarmDetailEntity extends DataAlarmSetting {
     private Date alarmEndTime;
 
     @ApiModelProperty(value = "报警值")
-    private BigDecimal beAlarValue;
+    private BigDecimal beAlarmValue;
 
     @ApiModelProperty(value = "对比报警值")
-    private BigDecimal toAlarValue;
+    private BigDecimal toAlarmValue;
 
     @ApiModelProperty(value = "报警结果值")
-    private BigDecimal resultAlarValue;
+    private BigDecimal resultAlarmValue;
 
     @ApiModelProperty(value = "历史数据:0不是,1是")
     private int isHistory;
+
+    @ApiModelProperty(value = "是否被挂起:0不是,1是")
+    private int isHangup;
+
+    public String getMd5Query(){
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(super.getBeSceneId()).append(super.getBeDeviceId()).append(super.getBeAttributeId())
+                .append(super.getBeType()).append(super.getComputeRules()).append(super.getToSceneId()).append(super.getToDeviceId())
+                .append(super.getToAttributeId()).append(super.getToType()).append(super.getAlarmRules()).append(super.getAlarmValue());
+        return Md5Util.hash(buffer.toString());
+    }
 }

+ 8 - 2
sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmManageEntity.java

@@ -1,6 +1,7 @@
 package com.huaxu.entity.alarm;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.huaxu.common.Md5Util;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -17,6 +18,11 @@ public class DataAlarmManageEntity extends DataAlarmSetting {
     @ApiModelProperty(value = "名称")
     private String alarmName;
 
-    @ApiModelProperty(value = "报警规则详情")
-    private String alarmContent;
+    public String getMd5Query(){
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(super.getBeSceneId()).append(super.getBeDeviceId()).append(super.getBeAttributeId())
+                .append(super.getBeType()).append(super.getComputeRules()).append(super.getToSceneId()).append(super.getToDeviceId())
+                .append(super.getToAttributeId()).append(super.getToType()).append(super.getAlarmRules()).append(super.getAlarmValue());
+        return Md5Util.hash(buffer.toString());
+    }
 }

+ 4 - 4
sms_water/src/main/java/com/huaxu/entity/alarm/DataAlarmSetting.java

@@ -25,7 +25,7 @@ public class DataAlarmSetting extends BaseEntity {
     @ApiModelProperty(value = "参数ID")
     private Long beAttributeId;
 
-    @ApiModelProperty(value = "类型")
+    @ApiModelProperty(value = "类型 :-> DataAlarmTypeEnum")
     private int beType;
 
     @ApiModelProperty(value = "计算规则")
@@ -40,12 +40,12 @@ public class DataAlarmSetting extends BaseEntity {
     @ApiModelProperty(value = "对比参数ID")
     private Long toAttributeId;
 
-    @ApiModelProperty(value = "对比类型")
+    @ApiModelProperty(value = "对比类型 :-> DataAlarmTypeEnum")
     private int toType;
 
     @ApiModelProperty(value = "对比报警规则")
-    private String alarRules;
+    private String alarmRules;
 
     @ApiModelProperty(value = "报警值")
-    private BigDecimal alarValue;
+    private BigDecimal alarmValue;
 }

+ 13 - 0
sms_water/src/main/java/com/huaxu/enums/MathematicalSymbolEnum.java

@@ -2,6 +2,9 @@ package com.huaxu.enums;
 
 import lombok.Getter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 数据运算符号
  * @author lihui
@@ -79,4 +82,14 @@ public enum MathematicalSymbolEnum {
         this.type = type;
         this.symbol = symbol;
     }
+
+    public static List<String> getMathematicalSymbolByType(int type){
+        List<String> result = new ArrayList<>();
+        for (MathematicalSymbolEnum symbolEnum : MathematicalSymbolEnum.values()) {
+             if (symbolEnum.getType() == type) {
+                 result.add(symbolEnum.getSymbol());
+             }
+        }
+        return result;
+    }
 }

+ 268 - 0
sms_water/src/main/java/com/huaxu/quartz/service/AbstractDataAlarmJobService.java

@@ -0,0 +1,268 @@
+package com.huaxu.quartz.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.client.UserCenterClient;
+import com.huaxu.common.CalcUtil;
+import com.huaxu.dao.alarm.DataAlarmAnalysisMapper;
+import com.huaxu.dao.alarm.DataAlarmDetailMapper;
+import com.huaxu.dao.alarm.DataAlarmManageMapper;
+import com.huaxu.dto.DeviceCheckAlarmDto;
+import com.huaxu.entity.Message;
+import com.huaxu.entity.alarm.DataAlarmAnalysisEntity;
+import com.huaxu.entity.alarm.DataAlarmDetailEntity;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.vo.DataAlarmManageVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 数据报警处理
+ * @author lihui
+ * @date 2020-3-26
+ */
+@Slf4j
+public abstract class AbstractDataAlarmJobService {
+
+    @Resource
+    protected DataAlarmDetailMapper dataAlarmDetailMapper;
+
+    @Resource
+    protected DataAlarmAnalysisMapper dataAlarmAnalysisMapper;
+
+    @Resource
+    protected DataAlarmManageMapper dataAlarmManageMapper;
+
+    @Autowired
+    protected UserCenterClient userCenterClient;
+
+    @Resource(name = "messageRabbitTemplate")
+    private AmqpTemplate messageRabbitTemplate;
+
+    @Value("${receive.exchange.name}")
+    private String receiveExchangeName;
+
+    @Value("${dispath.routing.key}")
+    private String dispathRoutingKey;
+
+    /**
+     * 挂起
+     */
+    protected static final int HANG_UP = 1;
+
+    /***
+     * 执行入口
+     * @author lihui
+     * @date 18:48 2021/6/1
+     * @return void
+     **/
+    public void execute(){
+        List<DataAlarmManageVo> manageVoList = this.listDataAlarmManage();
+        if (CollectionUtils.isEmpty(manageVoList)) {
+            log.info("获取数据报警管理参数数据为空");
+            return;
+        }
+        Map<Long, DataAlarmDetailEntity> alarmDetailsDtoMap = getMapDataAlarmDetail(manageVoList);
+        for (DataAlarmManageVo manageVo : manageVoList) {
+            DataAlarmManageEntity manageEntity = new DataAlarmManageEntity();
+            BeanUtils.copyProperties(manageVo, manageEntity);
+            DataAlarmDetailEntity nowDetailEntity = this.getAlarmValue(manageEntity);
+            if (nowDetailEntity == null) {
+                continue;
+            }
+            nowDetailEntity.setManageId(manageEntity.getId());
+            boolean isAlarm = isAlarm(nowDetailEntity, manageEntity);
+            // 必须先计算报警数据,才能执行保存数据报警分析操作,不然会丢失数据
+            this.saveDataAlarmAnalysis(nowDetailEntity);
+            // 计算出来属于报警,处理报警数据
+            if (isAlarm) {
+                handAlarm(alarmDetailsDtoMap, manageVo, nowDetailEntity);
+                continue;
+            }
+            // 存在报警信息,但已不报警,则更新为历史数据
+            if (alarmDetailsDtoMap.containsKey(manageEntity.getId())){
+                dataAlarmDetailMapper.updateHistoryData(alarmDetailsDtoMap.get(manageEntity.getId()).getId());
+            }
+        }
+    }
+
+    /***
+     *  double转换BigDecimal
+     * @author lihui
+     * @date 11:48 2021/6/2
+     * @param receivedValue :
+     * @return java.math.BigDecimal
+     **/
+    protected BigDecimal toBigDecimal(Double receivedValue){
+        return receivedValue == null ? null : new BigDecimal(receivedValue.toString());
+    }
+
+    /***
+     * 保存报警数据
+     * @author lihui
+     * @date 11:09 2021/6/2
+     * @param detailEntity :
+     * @return void
+     **/
+    protected void saveDataAlarmDetail(DataAlarmDetailEntity detailEntity){
+        detailEntity.setAlarmStartTime(new Date());
+        detailEntity.setDateCreate(new Date());
+        detailEntity.setStatus(1);
+        dataAlarmDetailMapper.saveDataAlarmDetail(detailEntity);
+    }
+
+
+    /***
+     * 保存分析数据详情
+     * @author lihui
+     * @date 9:43 2021/6/2
+     * @param detailEntity :
+     * @return void
+     **/
+    protected void saveDataAlarmAnalysis(DataAlarmDetailEntity detailEntity){
+        DataAlarmAnalysisEntity analysisEntity = new DataAlarmAnalysisEntity();
+        BeanUtils.copyProperties(detailEntity, analysisEntity);
+        analysisEntity.setDateCreate(new Date());
+        analysisEntity.setStatus(1);
+        dataAlarmAnalysisMapper.saveDataAlarmAnalysis(analysisEntity);
+    }
+
+   /***
+    * 数据存在,需要根据当前设置的计算规则和正在报警的计算规则是否一样
+    * 一样:更新数据
+    * 不一样:更新该条正在报警的数据为历史数据,并新增一条新计算规则的报警数据
+    *  this.sendMessage(manageEntity);
+    * @author lihui
+    * @date 11:06 2021/6/2
+    * @param alarmDetailsDtoMap : 现有报警数据
+    * @param manageVo :      报警设置数据
+    * @param nowDetailEntity :  当前报警数据
+    * @return void
+    **/
+    private void handAlarm(Map<Long, DataAlarmDetailEntity> alarmDetailsDtoMap, DataAlarmManageVo manageVo, DataAlarmDetailEntity nowDetailEntity){
+        if (!alarmDetailsDtoMap.containsKey(manageVo.getId())){
+            this.saveDataAlarmDetail(nowDetailEntity);
+            this.sendMessage(manageVo);
+            return;
+        }
+        DataAlarmDetailEntity dataAlarmDetailEntity =  alarmDetailsDtoMap.get(manageVo.getId());
+        // 如果没有被挂起,就要发送消息提示
+        if (dataAlarmDetailEntity.getIsHangup() != HANG_UP){
+            this.sendMessage(manageVo);
+        }
+        // 检查计算规则是否有变更
+        if (manageVo.getMd5Query().equals(dataAlarmDetailEntity.getMd5Query())) {
+            dataAlarmDetailMapper.updateAlrarmData(dataAlarmDetailEntity);
+            return;
+        }
+        // 规则有变革,数据更新为历史数据,再添加一条新的历史报警记录
+        dataAlarmDetailMapper.updateHistoryData(dataAlarmDetailEntity.getId());
+        this.saveDataAlarmDetail(nowDetailEntity);
+    }
+
+
+    /***
+     * 获取报警数据
+     * @author lihui
+     * @date 10:58 2021/6/2
+     * @param manageVoList :
+     * @return java.util.Map<java.lang.Long,com.huaxu.entity.alarm.DataAlarmDetailEntity>
+     **/
+    private Map<Long, DataAlarmDetailEntity> getMapDataAlarmDetail(List<DataAlarmManageVo> manageVoList){
+        List<Long> manageIds = manageVoList.stream().map(DataAlarmManageVo::getId).collect(Collectors.toList());
+        List<DataAlarmDetailEntity> list = dataAlarmDetailMapper.listByManageId(manageIds);
+        if (CollectionUtils.isEmpty(list)){
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(DataAlarmDetailEntity::getManageId, a -> a,(k1, k2)->k1));
+    }
+
+    /***
+     * 判断是否触发报警
+     * @author lihui
+     * @date 18:22 2021/6/1
+     * @param dataAlarmDetailEntity :
+     * @param dataAlarmManageEntity :
+     * @return boolean
+     **/
+    private boolean isAlarm(DataAlarmDetailEntity dataAlarmDetailEntity, DataAlarmManageEntity dataAlarmManageEntity){
+        BigDecimal resultValue = CalcUtil.operation(dataAlarmDetailEntity.getBeAlarmValue(), dataAlarmManageEntity.getComputeRules(),
+                dataAlarmDetailEntity.getToAlarmValue());
+        dataAlarmDetailEntity.setResultAlarmValue(resultValue);
+        return CalcUtil.compareBySign(resultValue, dataAlarmManageEntity.getAlarmValue(), dataAlarmManageEntity.getAlarmRules());
+    }
+
+    /***
+     * 消息发送
+     * @author lihui
+     * @date 18:46 2021/6/1
+     * @param dataAlarmManageEntity :
+     * @return void
+     **/
+    private void sendMessage(DataAlarmManageVo dataAlarmManageEntity){
+        Message message = new Message();
+        message.setStatus(1);
+        message.setTenantId(dataAlarmManageEntity.getTenantId());
+        message.setMessageId(UUID.randomUUID().toString());
+        JSONObject jsonContent = new JSONObject();
+        // ${场景名称}${设备名称}【${报警字段}】异常报警
+        jsonContent.put("场景名称",dataAlarmManageEntity.getAlarmSettingRules());
+        jsonContent.put("设备名称","");
+        jsonContent.put("报警字段","");
+        // 消息内容,如果需要动态使用,配合模板使用{key:value}
+        message.setMessageContent(jsonContent.toJSONString());
+        // 消息类型、模板id、渠道
+        message.setMessageType(1);
+        message.setMessageTemplateId(1);
+        message.setChannel(0);
+        Integer companyOrgId    = dataAlarmManageEntity.getCompanyOrgId();
+        Integer departmentOrgId = dataAlarmManageEntity.getDeptOrgId();
+        try{
+            List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(dataAlarmManageEntity.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));
+    }
+
+
+
+    /***
+     * 获取设置的报警参数
+     * @author lihui
+     * @date 18:15 2021/6/1
+     * @return java.util.List<com.huaxu.entity.alarm.DataAlarmManageEntity>
+     **/
+    protected abstract List<DataAlarmManageVo> listDataAlarmManage();
+
+    /***
+     * 获取报警值
+     * @author lihui
+     * @date 11:47 2021/6/2
+     * @param dataAlarmManageEntity : 报警设置参数
+     * @return com.huaxu.entity.alarm.DataAlarmDetailEntity
+     **/
+    protected abstract DataAlarmDetailEntity getAlarmValue(DataAlarmManageEntity dataAlarmManageEntity);
+
+}

+ 80 - 0
sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmDayJobService.java

@@ -0,0 +1,80 @@
+package com.huaxu.quartz.service;
+
+import com.huaxu.dao.DayReportMapper;
+import com.huaxu.dao.MonthReportMapper;
+import com.huaxu.dto.ReportAttributeDto;
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.entity.MonthReportEntity;
+import com.huaxu.entity.alarm.DataAlarmDetailEntity;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.enums.DataAlarmTypeEnum;
+import com.huaxu.quartz.service.AbstractDataAlarmJobService;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.vo.DataAlarmManageVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 数据报警,最新值处理
+ *
+ * @author lihui
+ * @version V1.0
+ * @date 2021/6/1
+ **/
+@Service
+public class DataAlarmDayJobService extends AbstractDataAlarmJobService {
+
+    @Autowired
+    private MonthReportMapper monthReportMapper;
+
+    @Override
+    public void execute() {
+        super.execute();
+    }
+
+    @Override
+    protected List<DataAlarmManageVo> listDataAlarmManage() {
+        return dataAlarmManageMapper.listByType(DataAlarmTypeEnum.DAY_SUM_VALUE.getType());
+    }
+
+    @Override
+    protected DataAlarmDetailEntity getAlarmValue(DataAlarmManageEntity dataAlarmManageEntity) {
+        // 获取当前时间
+        LocalDate nowDate = DatesUtil.parseLocalDate(new Date());
+        nowDate = nowDate.withMonth(4);
+        nowDate = nowDate.withDayOfMonth(1);
+        MonthReportEntity monthReportEntity = new MonthReportEntity();
+        monthReportEntity.setYear(nowDate.getYear());
+        monthReportEntity.setMonth(nowDate.getMonthValue());
+        monthReportEntity.setDay(nowDate.getDayOfMonth());
+        monthReportEntity.setTenantId(dataAlarmManageEntity.getTenantId());
+        monthReportEntity.setDeviceId(dataAlarmManageEntity.getBeDeviceId());
+        monthReportEntity.setAttributeId(dataAlarmManageEntity.getBeAttributeId());
+        ReportAttributeDto report = monthReportMapper.findSumValue(monthReportEntity);
+        if (sumIsNull(report)) {
+            return null;
+        }
+        DataAlarmDetailEntity dataAlarmDetailEntity = new DataAlarmDetailEntity();
+        BeanUtils.copyProperties(dataAlarmManageEntity, dataAlarmDetailEntity);
+        dataAlarmDetailEntity.setBeAlarmValue(super.toBigDecimal(report.getSumValue()));
+        // 设置查询条件
+        monthReportEntity.setDeviceId(dataAlarmManageEntity.getToDeviceId());
+        monthReportEntity.setAttributeId(dataAlarmManageEntity.getToAttributeId());
+        report = monthReportMapper.findSumValue(monthReportEntity);
+        if (sumIsNull(report)) {
+            return null;
+        }
+        dataAlarmDetailEntity.setToAlarmValue(super.toBigDecimal(report.getSumValue()));
+        return dataAlarmDetailEntity;
+    }
+
+
+    private boolean sumIsNull(ReportAttributeDto report){
+        return  report == null || report.getSumValue() == null;
+    }
+}

+ 77 - 0
sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmHourJobService.java

@@ -0,0 +1,77 @@
+package com.huaxu.quartz.service;
+
+import com.huaxu.dao.DayReportMapper;
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.entity.YearReportEntity;
+import com.huaxu.entity.alarm.DataAlarmDetailEntity;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.enums.DataAlarmTypeEnum;
+import com.huaxu.quartz.service.AbstractDataAlarmJobService;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.vo.DataAlarmManageVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 数据报警,最新值处理
+ *
+ * @author lihui
+ * @version V1.0
+ * @date 2021/6/1
+ **/
+@Service
+public class DataAlarmHourJobService extends AbstractDataAlarmJobService {
+
+    @Autowired
+    private DayReportMapper dayReportMapper;
+
+    @Override
+    public void execute() {
+        super.execute();
+    }
+
+    @Override
+    protected List<DataAlarmManageVo> listDataAlarmManage() {
+        return dataAlarmManageMapper.listByType(DataAlarmTypeEnum.LATEST_VALUE.getType());
+    }
+
+    @Override
+    protected DataAlarmDetailEntity getAlarmValue(DataAlarmManageEntity dataAlarmManageEntity) {
+        // 获取当前时间
+        LocalDate nowDate = DatesUtil.parseLocalDate(new Date());
+        nowDate = nowDate.withMonth(4);
+        nowDate = nowDate.withDayOfMonth(1);
+        DayReportEntity dayReportEntity = new DayReportEntity();
+        dayReportEntity.setYear(nowDate.getYear());
+        dayReportEntity.setMonth(nowDate.getMonthValue());
+        dayReportEntity.setDay(nowDate.getDayOfMonth());
+        dayReportEntity.setTenantId(dataAlarmManageEntity.getTenantId());
+        dayReportEntity.setDeviceId(dataAlarmManageEntity.getBeDeviceId());
+        dayReportEntity.setAttributeId(dataAlarmManageEntity.getBeAttributeId());
+        DayReportEntity dataReport = dayReportMapper.findLastDayValue(dayReportEntity);
+        if (latestValueIsNull(dataReport)) {
+            return null;
+        }
+        DataAlarmDetailEntity dataAlarmDetailEntity = new DataAlarmDetailEntity();
+        BeanUtils.copyProperties(dataAlarmManageEntity, dataAlarmDetailEntity);
+        dataAlarmDetailEntity.setBeAlarmValue(super.toBigDecimal(dataReport.getLatestValue()));
+        // 设置查询条件
+        dayReportEntity.setDeviceId(dataAlarmManageEntity.getToDeviceId());
+        dayReportEntity.setAttributeId(dataAlarmManageEntity.getToAttributeId());
+        dataReport = dayReportMapper.findLastDayValue(dayReportEntity);
+        if (latestValueIsNull(dataReport)) {
+            return null;
+        }
+        dataAlarmDetailEntity.setToAlarmValue(super.toBigDecimal(dataReport.getLatestValue()));
+        return dataAlarmDetailEntity;
+    }
+
+    private boolean latestValueIsNull(DayReportEntity report){
+        return  report == null || report.getLatestValue() == null;
+    }
+}

+ 74 - 0
sms_water/src/main/java/com/huaxu/quartz/service/DataAlarmMonthJobService.java

@@ -0,0 +1,74 @@
+package com.huaxu.quartz.service;
+
+import com.huaxu.dao.YearReportMapper;
+import com.huaxu.entity.YearReportEntity;
+import com.huaxu.entity.alarm.DataAlarmDetailEntity;
+import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.enums.DataAlarmTypeEnum;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.vo.DataAlarmManageVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 数据报警,最新值处理
+ *
+ * @author lihui
+ * @version V1.0
+ * @date 2021/6/1
+ **/
+@Service
+public class DataAlarmMonthJobService extends AbstractDataAlarmJobService {
+
+    @Autowired
+    private YearReportMapper yearReportMapper;
+
+    @Override
+    public void execute() {
+        super.execute();
+    }
+
+    @Override
+    protected List<DataAlarmManageVo> listDataAlarmManage() {
+        return dataAlarmManageMapper.listByType(DataAlarmTypeEnum.MONTH_SUM_VALUE.getType());
+    }
+
+    @Override
+    protected DataAlarmDetailEntity getAlarmValue(DataAlarmManageEntity dataAlarmManageEntity) {
+        // 获取当前时间
+        LocalDate nowDate = DatesUtil.parseLocalDate(new Date());
+        nowDate = nowDate.withMonth(4);
+        nowDate = nowDate.withDayOfMonth(1);
+        YearReportEntity yearReportEntity = new YearReportEntity();
+        yearReportEntity.setYear(nowDate.getYear());
+        yearReportEntity.setMonth(nowDate.getMonthValue());
+        yearReportEntity.setTenantId(dataAlarmManageEntity.getTenantId());
+        yearReportEntity.setDeviceId(dataAlarmManageEntity.getBeDeviceId());
+        yearReportEntity.setAttributeId(dataAlarmManageEntity.getBeAttributeId());
+        YearReportEntity dataReport = yearReportMapper.findSumValue(yearReportEntity);
+        if (yearSumIsNull(dataReport)) {
+            return null;
+        }
+        DataAlarmDetailEntity dataAlarmDetailEntity = new DataAlarmDetailEntity();
+        BeanUtils.copyProperties(dataAlarmManageEntity, dataAlarmDetailEntity);
+        dataAlarmDetailEntity.setBeAlarmValue(super.toBigDecimal(dataReport.getSumValue()));
+        // 设置查询条件
+        yearReportEntity.setDeviceId(dataAlarmManageEntity.getToDeviceId());
+        yearReportEntity.setAttributeId(dataAlarmManageEntity.getToAttributeId());
+        dataReport = yearReportMapper.findSumValue(yearReportEntity);
+        if (yearSumIsNull(dataReport)) {
+            return null;
+        }
+        dataAlarmDetailEntity.setToAlarmValue(super.toBigDecimal(dataReport.getSumValue()));
+        return dataAlarmDetailEntity;
+    }
+
+    private boolean yearSumIsNull(YearReportEntity report){
+        return  report == null || report.getSumValue() == null;
+    }
+}

+ 7 - 1
sms_water/src/main/java/com/huaxu/quartz/service/MonitorReportJobService.java

@@ -87,11 +87,17 @@ public class MonitorReportJobService {
         if (hourData.size() == 0) {
             return;
         }
+        DayReportEntity lastDayReportEntity = null;
         // 计算累计值
         for (DayReportEntity dayReportEntity : hourData) {
             if (dayReportEntity.getLatestValue() != null && lastHourDataMap.containsKey(dayReportEntity.getMapkey())) {
+                lastDayReportEntity = lastHourDataMap.get(dayReportEntity.getMapkey());
+                /*// 如果当前最新值小于上一个小时的值,则设置为当前的最大值
+                if (dayReportEntity.getLatestValue() < lastDayReportEntity.getLatestValue()) {
+                    dayReportEntity.setLatestValue(dayReportEntity.getMaxValue());
+                }*/
                 // 上一个小时有值
-                if (lastHourDataMap.get(dayReportEntity.getMapkey()).getLatestValue() != null) {
+                if (lastDayReportEntity.getLatestValue() != null) {
                     dayReportEntity.setSumValue(new BigDecimal(dayReportEntity.getLatestValue().toString()).subtract(new BigDecimal(lastHourDataMap.get(dayReportEntity.getMapkey()).getLatestValue().toString())).doubleValue());
                 } else {
                     // 上一个小时没有值,取本小时的初始值

+ 37 - 0
sms_water/src/main/java/com/huaxu/rabbitmq/DataAlarmHandler.java

@@ -0,0 +1,37 @@
+package com.huaxu.rabbitmq;
+
+import com.huaxu.quartz.service.DataAlarmDayJobService;
+import com.huaxu.quartz.service.DataAlarmHourJobService;
+import com.huaxu.quartz.service.DataAlarmMonthJobService;
+import com.huaxu.service.MonitorDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @ClassName DataAlarmHandler
+ * @Description: 数据报警处理
+ * @Author lihui
+ * @Date 2021/6/1
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class DataAlarmHandler implements CommandLineRunner {
+
+    @Resource
+    private MonitorDataService monitorDataService;
+
+    @Resource
+    private DataAlarmDayJobService dataAlarmDayJobService;
+
+    @Resource
+    private DataAlarmMonthJobService dataAlarmMonthJobService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        monitorDataService.getMonitorDataReportByHour();
+    }
+}

+ 3 - 2
sms_water/src/main/java/com/huaxu/service/DataAlarmAnalysisService.java

@@ -1,10 +1,10 @@
 package com.huaxu.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dto.alarm.DataAlarmDto;
 import com.huaxu.vo.DataAlarmAnalysisVo;
-import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 数据报警数据分析
@@ -22,4 +22,5 @@ public interface DataAlarmAnalysisService {
      * @return com.baomidou.mybatisplus.core.metadata.IPage<com.huaxu.vo.DataAlarmDetailsVo>
      **/
     Page<DataAlarmAnalysisVo> findPage(DataAlarmDto dto);
+
 }

+ 2 - 1
sms_water/src/main/java/com/huaxu/service/DataAlarmDetailService.java

@@ -29,7 +29,8 @@ public interface DataAlarmDetailService {
      * @author lihui
      * @date 15:50 2021/5/31
      * @param alarmId :
+     * @param  status :挂起:0不是,1是
      * @return void
      **/
-    void deldelAlarmDetails(Long alarmId);
+    void hangUpAlarmDetails(Long alarmId,int status);
 }

+ 1 - 1
sms_water/src/main/java/com/huaxu/service/DataAlarmManageService.java

@@ -34,7 +34,7 @@ public interface DataAlarmManageService {
      * @param aramId :
      * @return com.huaxu.vo.DataAlarmManageVo
      **/
-    DataAlarmManageVo findAlarmManage(Long aramId);
+    DataAlarmManageEntity findAlarmManage(Long aramId);
 
     /***
      * 分页查询

+ 12 - 5
sms_water/src/main/java/com/huaxu/service/impl/MonitorDataServiceImpl.java

@@ -11,22 +11,23 @@ import com.huaxu.quartz.service.JobAndTriggerService;
 import com.huaxu.quartz.service.MonitorReportJobService;
 import com.huaxu.service.MonitorDataService;
 import com.huaxu.util.ByteArrayUtils;
+import com.huaxu.util.DatesUtil;
 import com.huaxu.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.aggregation.Aggregation;
-import org.springframework.data.mongodb.core.aggregation.AggregationOptions;
-import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.aggregation.*;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -134,9 +135,11 @@ public class MonitorDataServiceImpl implements MonitorDataService , Initializing
         criteria.and("month").is(dateTime.getMonthValue());
         criteria.and("day").is(dateTime.getDayOfMonth());
         criteria.and("hour").is(dateTime.getHour());
-        if(deviceIds!=null && deviceIds.size()>0){
+        if(deviceIds!=null && deviceIds.size() > 0){
             criteria.and("deviceId").in(deviceIds);
         }
+        Criteria criteria1 = new Criteria();
+        criteria1.and("dataValues.dataValue").gt(0);
         AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
         Aggregation agg = Aggregation.newAggregation(
                 // 查询条件
@@ -145,7 +148,8 @@ public class MonitorDataServiceImpl implements MonitorDataService , Initializing
                 Aggregation.unwind("dataValues"),
                 // 在聚合之前对数据进行排序
                 Aggregation.sort(Sort.Direction.ASC, "collectDate"),
-                Aggregation.group("year","month","day","hour","tenantId","deviceId","deviceName","deviceCode","dataValues.attributeId","dataValues.attributeName" )
+                Aggregation.group("year","month","day","hour","tenantId","deviceId","deviceName",
+                        "deviceCode","dataValues.attributeId","dataValues.attributeName" )
                         .min("$dataValues.dataValue").as("minValue")
                         .max("$dataValues.dataValue").as("maxValue")
                         .avg("$dataValues.dataValue").as("avgValue")
@@ -160,10 +164,13 @@ public class MonitorDataServiceImpl implements MonitorDataService , Initializing
         return durationData.getMappedResults();
     }
 
+
     @Override
     public void getMonitorDataReportByHour(){
         // 取前一个小时的时间
         LocalDateTime dateTime = LocalDateTime.now().plusHours(-1);
+        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        dateTime = LocalDateTime.parse("2021-05-29 11:00:00", fmt);
         // 取前一个小时的时间(取19点) sumValue  -> 1-10,2-20
         List<DayReportEntity> hourData     = getMonitorDataGroupByHour(dateTime,null);
         // 取前一个小时的时间(取18点)

+ 13 - 1
sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmAnalysisServiceImpl.java

@@ -3,9 +3,13 @@ package com.huaxu.service.impl.alarm;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dao.alarm.DataAlarmAnalysisMapper;
 import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmQueryDto;
+import com.huaxu.model.LoginUser;
 import com.huaxu.service.DataAlarmAnalysisService;
+import com.huaxu.util.UserUtil;
 import com.huaxu.vo.DataAlarmAnalysisVo;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -26,6 +30,14 @@ public class DataAlarmAnalysisServiceImpl implements DataAlarmAnalysisService {
 
     @Override
     public Page<DataAlarmAnalysisVo> findPage(DataAlarmDto dto) {
-        return dataAlarmAnalysisMapper.findPage(new Page<>(dto.getPageNum(), dto.getPageSize()), dto);
+        DataAlarmQueryDto queryDto = new DataAlarmQueryDto();
+        BeanUtils.copyProperties(dto, queryDto);
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        queryDto.setTenantId(loginUser.getTenantId());
+        queryDto.setProgramItems(loginUser.getProgramItemList());
+        queryDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        queryDto.setPermissonType(loginUser.getPermissonType());
+        return dataAlarmAnalysisMapper.findPage(new Page<>(dto.getPageNum(), dto.getPageSize()), queryDto);
     }
 }

+ 15 - 3
sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmDetailServiceImpl.java

@@ -4,9 +4,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dao.alarm.DataAlarmAnalysisMapper;
 import com.huaxu.dao.alarm.DataAlarmDetailMapper;
 import com.huaxu.dto.alarm.DataAlarmDto;
+import com.huaxu.dto.alarm.DataAlarmQueryDto;
+import com.huaxu.model.LoginUser;
 import com.huaxu.service.DataAlarmDetailService;
+import com.huaxu.util.UserUtil;
 import com.huaxu.vo.DataAlarmDetailsVo;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -27,11 +31,19 @@ public class DataAlarmDetailServiceImpl implements DataAlarmDetailService {
 
     @Override
     public Page<DataAlarmDetailsVo> findPage(DataAlarmDto dto, int isHistory) {
-        return dataAlarmDetailMapper.findPage(new Page<>(dto.getPageNum(), dto.getPageSize()), dto, isHistory);
+        DataAlarmQueryDto queryDto = new DataAlarmQueryDto();
+        BeanUtils.copyProperties(dto, queryDto);
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        queryDto.setTenantId(loginUser.getTenantId());
+        queryDto.setProgramItems(loginUser.getProgramItemList());
+        queryDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        queryDto.setPermissonType(loginUser.getPermissonType());
+        return dataAlarmDetailMapper.findPage(new Page<>(dto.getPageNum(), dto.getPageSize()), queryDto, isHistory);
     }
 
     @Override
-    public void deldelAlarmDetails(Long alarmId) {
-        dataAlarmDetailMapper.deldelAlarmDetails(alarmId);
+    public void hangUpAlarmDetails(Long alarmId,int status) {
+        dataAlarmDetailMapper.hangUpAlarmDetails(alarmId, status);
     }
 }

+ 16 - 5
sms_water/src/main/java/com/huaxu/service/impl/alarm/DataAlarmManageServiceImpl.java

@@ -9,6 +9,7 @@ import com.huaxu.dto.alarm.DataAlarmDto;
 import com.huaxu.dto.alarm.DataAlarmManageDto;
 import com.huaxu.dto.alarm.DataAlarmQueryDto;
 import com.huaxu.entity.alarm.DataAlarmManageEntity;
+import com.huaxu.exception.ServiceException;
 import com.huaxu.model.LoginUser;
 import com.huaxu.service.DataAlarmManageService;
 import com.huaxu.util.UserUtil;
@@ -40,8 +41,7 @@ public class DataAlarmManageServiceImpl implements DataAlarmManageService {
         BeanUtils.copyProperties(dto, entity);
         LoginUser currentUser = UserUtil.getCurrentUser();
         if (currentUser == null || StringUtils.isEmpty(currentUser.getTenantId())) {
-            log.error("保存数据报警设置失败,用户数据为空");
-            return;
+            throw new ServiceException(500,"保存数据报警设置失败,用户数据为空");
         }
         entity.setTenantId(currentUser.getTenantId());
         entity.setCompanyOrgId(currentUser.getCompanyId());
@@ -49,12 +49,12 @@ public class DataAlarmManageServiceImpl implements DataAlarmManageService {
         entity.setStatus(1);
         entity.setDateCreate(new Date());
         entity.setDateUpdate(new Date());
-        entity.setAlarmContent("");
+        entity.setCreateBy(currentUser.getUsername());
         dataAlarmManageMapper.saveDataAlarmManage(entity);
     }
 
     @Override
-    public DataAlarmManageVo findAlarmManage(Long alarmId) {
+    public DataAlarmManageEntity findAlarmManage(Long alarmId) {
         if (alarmId == null || alarmId == 0) {
             return null;
         }
@@ -69,12 +69,23 @@ public class DataAlarmManageServiceImpl implements DataAlarmManageService {
         queryDto.setTenantId(loginUser.getTenantId());
         queryDto.setProgramItems(loginUser.getProgramItemList());
         queryDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        queryDto.setPermissonType(loginUser.getPermissonType());
         return dataAlarmManageMapper.findPage(new Page<>(dto.getPageNum(), dto.getPageSize()), queryDto);
     }
 
     @Override
     public void updateDataAlarmManage(DataAlarmManageDto dto) {
-        dataAlarmManageMapper.updateDataAlarmManage(dto);
+        LoginUser currentUser = UserUtil.getCurrentUser();
+        if (currentUser == null || StringUtils.isEmpty(currentUser.getTenantId())) {
+            throw new ServiceException(500,"保存数据报警设置失败,用户数据为空");
+        }
+        DataAlarmManageEntity entity = new DataAlarmManageEntity();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setUpdateBy(currentUser.getUsername());
+        entity.setDateUpdate(new Date());
+        entity.setId(dto.getAlarmId());
+        dataAlarmManageMapper.updateDataAlarmManage(entity);
     }
 
     @Override

+ 114 - 5
sms_water/src/main/java/com/huaxu/vo/DataAlarmAnalysisVo.java

@@ -1,31 +1,140 @@
 package com.huaxu.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.huaxu.entity.alarm.DataAlarmSetting;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 数据报警分析
- *
  * @author lihui
  * @version V1.0
  * @date 2021/5/28
  **/
 @Data
-public class DataAlarmAnalysisVo extends DataAlarmSetting implements Serializable {
+public class DataAlarmAnalysisVo implements Serializable {
 
     @ApiModelProperty("报警设置ID")
+    @ExcelIgnore
     private Long id;
 
     @ApiModelProperty("报警名字")
+    @ExcelProperty(value = {"名称"},index = 0)
     private String alarmName;
 
-    @ApiModelProperty("报警设置详情")
-    private String alarmSettingDetail;
+    @ApiModelProperty("报警设置规则")
+    @ExcelProperty(value = {"数据分析条件"},index = 1)
+    private String alarmSettingRules;
 
     @ApiModelProperty("分析值")
-    private String resultAlarValue;
+    @ExcelProperty(value = {"分析值"},index = 2)
+    private BigDecimal resultAlarmValue;
+
+    @ApiModelProperty("创建时间")
+    @ExcelProperty(value = {"时间"},index = 3)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
+    private Date dateCreate;
+
+    @ApiModelProperty("场景名字")
+    @ExcelIgnore
+    private String beSceneName;
+
+    @ApiModelProperty("设备名字")
+    @ExcelIgnore
+    private String beDeviceName;
+
+    @ApiModelProperty("参数名字")
+    @ExcelIgnore
+    private String beAttributeName;
+
+    @ApiModelProperty("报警值")
+    @ExcelIgnore
+    private BigDecimal beAlarmValue;
+
+    @ApiModelProperty("单位")
+    @ExcelIgnore
+    private String beUnit;
+
+    @ApiModelProperty("经纬度X")
+    @ExcelIgnore
+    private BigDecimal bePointX;
+
+    @ApiModelProperty("经纬度Y")
+    @ExcelIgnore
+    private BigDecimal bePointY;
+
+    @ApiModelProperty("地址")
+    @ExcelIgnore
+    private String beAddress;
+
+    @ApiModelProperty("对比场景名字")
+    @ExcelIgnore
+    private String toSceneName;
+
+    @ApiModelProperty("对比设备名字")
+    @ExcelIgnore
+    private String toDeviceName;
+
+    @ApiModelProperty("对比参数名字")
+    @ExcelIgnore
+    private String toAttributeName;
+
+    @ApiModelProperty("对比单位")
+    @ExcelIgnore
+    private String toUnit;
+
+    @ApiModelProperty("对比报警值")
+    @ExcelIgnore
+    private BigDecimal toAlarmValue;
+
+    @ApiModelProperty("对比地址")
+    @ExcelIgnore
+    private String toAddress;
+
+    @ApiModelProperty("对比经纬度X")
+    @ExcelIgnore
+    private BigDecimal toPointX;
+
+    @ApiModelProperty("对比经纬度Y")
+    @ExcelIgnore
+    private BigDecimal toPointY;
+
+    @JsonIgnore
+    @ExcelIgnore
+    @ApiModelProperty("计算规则")
+    private String computeRules;
+
+    @JsonIgnore
+    @ExcelIgnore
+    @ApiModelProperty("报警规则")
+    private String alarmRules;
+
+    @JsonIgnore
+    @ExcelIgnore
+    @ApiModelProperty("设置的报警值")
+    private BigDecimal alarmValue;
+
+    /***
+     * 规则描述
+     * @author lihui
+     * @date 16:41 2021/6/3
+     * @return java.lang.String
+     **/
+    public String getAlarmSettingRules(){
+        StringBuffer buf = new StringBuffer();
+        buf.append(this.beSceneName).append(this.beDeviceName).append(this.beAttributeName)
+                .append("(").append(this.beAlarmValue).append(this.beUnit).append(")")
+                .append(this.computeRules).append(toSceneName).append(this.toDeviceName).append(this.toAttributeName)
+                .append("(").append(this.toAlarmValue).append(this.toUnit).append(")")
+                .append(this.alarmRules).append(this.alarmValue);
+        return buf.toString();
+    }
 
 }

+ 120 - 4
sms_water/src/main/java/com/huaxu/vo/DataAlarmDetailsVo.java

@@ -1,10 +1,16 @@
 package com.huaxu.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.huaxu.entity.alarm.DataAlarmSetting;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 报警设置管理Vo
@@ -14,15 +20,125 @@ import java.io.Serializable;
  * @date 2021/5/28
  **/
 @Data
-public class DataAlarmDetailsVo extends DataAlarmSetting implements Serializable {
+public class DataAlarmDetailsVo implements Serializable {
 
-    @ApiModelProperty("报警设置ID")
+    @ApiModelProperty("报警详情ID")
+    @ExcelIgnore
     private Long id;
 
+    @ApiModelProperty("报警设置ID")
+    @ExcelIgnore
+    private Long manageId;
+
     @ApiModelProperty("报警名字")
+    @ExcelProperty(value = {"名称"},index = 0)
     private String alarmName;
 
-    @ApiModelProperty("报警设置详情")
-    private String alarmSettingDetail;
+    @ApiModelProperty("报警设置规则")
+    @ExcelProperty(value = {"报警详情"},index = 1)
+    private String alarmSettingRules;
+
+    @ApiModelProperty("报警开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
+    @ExcelProperty(value = {"开始时间"},index = 2)
+    private Date alarmStartTime;
+
+    @ApiModelProperty("报警结束时间")
+    @ExcelProperty(value = {"结束时间"},index = 3)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
+    private Date alarmEndTime;
+
+    @ApiModelProperty("场景名字")
+    @ExcelIgnore
+    private String beSceneName;
+
+    @ApiModelProperty("设备名字")
+    @ExcelIgnore
+    private String beDeviceName;
+
+    @ApiModelProperty("参数名字")
+    @ExcelIgnore
+    private String beAttributeName;
+
+    @ApiModelProperty("单位")
+    @ExcelIgnore
+    private String beUnit;
+
+    @ApiModelProperty("经纬度X")
+    @ExcelIgnore
+    private BigDecimal bePointX;
+
+    @ApiModelProperty("经纬度Y")
+    @ExcelIgnore
+    private BigDecimal bePointY;
+
+    @ApiModelProperty("报警值")
+    @ExcelIgnore
+    private BigDecimal beAlarmValue;
+
+    @ApiModelProperty("地址")
+    @ExcelIgnore
+    private String beAddress;
+
+    @ApiModelProperty("对比场景名字")
+    @ExcelIgnore
+    private String toSceneName;
+
+    @ApiModelProperty("对比设备名字")
+    @ExcelIgnore
+    private String toDeviceName;
+
+    @ApiModelProperty("对比参数名字")
+    @ExcelIgnore
+    private String toAttributeName;
+
+    @ApiModelProperty("对比报警值")
+    @ExcelIgnore
+    private BigDecimal toAlarmValue;
+
+    @ApiModelProperty("对比单位")
+    @ExcelIgnore
+    private String toUnit;
+
+    @ApiModelProperty("对比地址")
+    @ExcelIgnore
+    private String toAddress;
+
+    @ApiModelProperty("对比经纬度X")
+    @ExcelIgnore
+    private BigDecimal toPointX;
+
+    @ApiModelProperty("对比经纬度Y")
+    @ExcelIgnore
+    private BigDecimal toPointY;
+
+    @ApiModelProperty
+    @JsonIgnore
+    @ExcelIgnore
+    private String computeRules;
+
+    @ApiModelProperty
+    @JsonIgnore
+    @ExcelIgnore
+    private String alarmRules;
+
+    @ApiModelProperty
+    @JsonIgnore
+    @ExcelIgnore
+    private BigDecimal alarmValue;
+
+    @ApiModelProperty(value = "是否被挂起:0正常,1挂起")
+    @ExcelIgnore
+    private int isHangup;
+
+    public String getAlarmSettingRules(){
+        StringBuffer buf = new StringBuffer();
+        buf.append(this.beSceneName).append(this.beDeviceName).append(this.beAttributeName)
+                .append("(").append(this.beAlarmValue).append(this.beUnit).append(")")
+                .append(this.computeRules).append(toSceneName).append(this.toDeviceName).append(this.toAttributeName)
+                .append("(").append(this.toAlarmValue).append(this.toUnit).append(")")
+                .append(this.alarmRules).append(this.alarmValue);
+        return buf.toString();
+    }
 
 }

+ 46 - 0
sms_water/src/main/java/com/huaxu/vo/DataAlarmManageVo.java

@@ -1,10 +1,13 @@
 package com.huaxu.vo;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.huaxu.common.Md5Util;
 import com.huaxu.entity.alarm.DataAlarmSetting;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * 报警设置管理Vo
@@ -25,4 +28,47 @@ public class DataAlarmManageVo extends DataAlarmSetting implements Serializable
     @ApiModelProperty("报警设置规则")
     private String alarmSettingRules;
 
+    @ApiModelProperty
+    @JsonIgnore
+    private String beAttributeName;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private String beSceneName;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private String computeRules;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private String alarmRules;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private BigDecimal alarmValue;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private String toAttributeName;
+
+    @ApiModelProperty
+    @JsonIgnore
+    private String toSceneName;
+
+    public String getAlarmSettingRules(){
+        StringBuffer buf = new StringBuffer();
+        buf.append(this.beSceneName).append(this.beAttributeName ).append(this.computeRules).append(toSceneName)
+                .append(this.toAttributeName).append(this.alarmRules).append(this.alarmValue);
+        return buf.toString();
+    }
+
+    public String getMd5Query(){
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(super.getBeSceneId()).append(super.getBeDeviceId()).append(super.getBeAttributeId())
+                .append(super.getBeType()).append(super.getComputeRules()).append(super.getToSceneId()).append(super.getToDeviceId())
+                .append(super.getToAttributeId()).append(super.getToType()).append(super.getAlarmRules()).append(super.getAlarmValue());
+        return Md5Util.hash(buffer.toString());
+    }
+
 }

+ 2 - 2
sms_water/src/main/java/com/huaxu/vo/DataAlarmSettingVo.java

@@ -49,8 +49,8 @@ public class DataAlarmSettingVo {
     private int toType;
 
     @ApiModelProperty(value = "对比报警规则")
-    private String alarRules;
+    private String alarmRules;
 
     @ApiModelProperty(value = "报警值")
-    private BigDecimal alarValue;
+    private BigDecimal alarmValue;
 }

+ 60 - 24
sms_water/src/main/resources/mapper/DataAlarmAnalysisMapper.xml

@@ -2,35 +2,71 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.huaxu.dao.alarm.DataAlarmAnalysisMapper">
 
-    <sql id="result_list" >
-            a.ID,
-            a.alarm_name,
-            a.be_scene_id,
-            a.be_device_id,
-            a.be_attribute_id,
-            a.be_address,
-            a.be_type,
-            a.compute_rules,
-            a.to_scene_id,
-            a.to_device_id,
-            a.to_attribute_id,
-            a.to_address,
-            a.to_type,
-            a.alar_rules,
-            a.alar_value,
-            a.date_create,
-            a.result_alar_value
-    </sql>
+    <insert id="saveDataAlarmAnalysis" useGeneratedKeys="true"  keyProperty="id" parameterType="com.huaxu.entity.alarm.DataAlarmAnalysisEntity">
+        insert sms_data_alarm_analysis (alarm_name,manage_id,company_org_id,dept_org_id,tenant_id,be_scene_id,be_device_id,be_attribute_id,be_alarm_value,
+               be_type,compute_rules,to_scene_id,to_device_id,to_attribute_id,to_alarm_value,to_type,alarm_rules,alarm_value
+               ,result_alarm_value,date_create,status)
+        values
+            (#{alarmName}, #{manageId},#{companyOrgId}, #{deptOrgId}, #{tenantId}, #{beSceneId},#{beDeviceId},
+        #{beAttributeId}, #{beAlarmValue},#{beType}, #{computeRules}, #{toSceneId},
+        #{toDeviceId}, #{toAttributeId},#{toAlarmValue}, #{toType}, #{alarmRules},
+        #{alarmValue},#{resultAlarmValue},#{dateCreate},#{status})
+    </insert>
 
     <select id="findPage" resultType="com.huaxu.vo.DataAlarmAnalysisVo">
         select
-        <include refid="result_list"></include>
-        from sms_data_alarm_analysis a
+            a.id,a.alarm_name,a.compute_rules,a.alarm_rules,a.date_create,
+            a.be_alarm_value,a.to_alarm_value,a.result_alarm_value,a.alarm_value,
+            s.SCENE_NAME as be_scene_name, t1.DEVICE_NAME as "be_device_name", t2.name as be_attribute_name,
+            s.ADDRESS as "beAddress",s.POINT_X as "bePointX",s.POINT_Y as "bePointY",t2.UNIT as beUnit,
+            mm.to_scene_name,mm.to_device_name,mm.to_attribute_name,mm.toAddress,mm.toPointX,mm.toPointY,mm.toUnit
+        from
+            sms_data_alarm_detail  a
+        INNER JOIN sms_scene s on s.id = a.be_scene_id and s.status = 1
+        INNER JOIN sms_device t1 on a.be_device_id = t1.id and t1.status = 1
+        INNER JOIN sms_device_attribute t2 on a.be_attribute_id = t2.id  and t2.status = 1
+        LEFT JOIN  (
+            select m.id, s.SCENE_NAME as to_scene_name, t1.DEVICE_NAME as to_device_name, t2.name as to_attribute_name,
+            s.ADDRESS as "toAddress",s.POINT_X as "toPointX",s.POINT_Y as "toPointY",t2.UNIT as toUnit
+            from
+            sms_data_alarm_detail  m
+            INNER JOIN sms_scene s on s.id = m.to_scene_id and s.status = 1
+            INNER JOIN sms_device t1 on m.to_device_id = t1.id and t1.status = 1
+            INNER JOIN sms_device_attribute t2 on m.to_attribute_id=t2.id  and t2.status =1
+        ) mm on mm.id = a.id
         <where>
-            <if test="alarmName != null and alarmName != ''">
-                and a.alarm_name like CONCAT('%',#{alarmName,jdbcType=VARCHAR},'%')
+            a.tenant_id = #{dto.tenantId}
+            <if test="dto.userType != null and dto.userType != -999 and dto.userType!=-9999 and  dto.programItems != null and dto.programItems.size() > 0">
+                <if test="dto.permissonType == 5 or dto.permissonType == 2">
+                    and ( a.DEPT_ORG_ID in
+                    <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                        #{item.orgId}
+                    </foreach>
+                    or
+                    a.COMPANY_ORG_ID in
+                    <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                        #{item.orgId}
+                    </foreach>
+                    )
+                </if>
+                <if test="dto.permissonType == 4 or dto.permissonType == 3">
+                    and a.DEPT_ORG_ID in
+                    <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                        #{item.orgId}
+                    </foreach>
+                </if>
+                <if test="dto.permissonType == 1">
+                    and a.COMPANY_ORG_ID in
+                    <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                        #{item.orgId}
+                    </foreach>
+                    and (a.DEPT_ORG_ID is null or a.DEPT_ORG_ID =0)
+                </if>
             </if>
-            a.status = 1
+            <if test="dto.alarmName != null and dto.alarmName != ''">
+                and a.alarm_name like CONCAT('%',#{dto.alarmName,jdbcType=VARCHAR},'%')
+            </if>
+            and a.status = 1
         </where>
         order by id desc
     </select>

+ 102 - 34
sms_water/src/main/resources/mapper/DataAlarmDetailMapper.xml

@@ -2,49 +2,117 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.huaxu.dao.alarm.DataAlarmDetailMapper">
 
-    <sql id="result_list" >
-        a.ID,
-            a.alarm_name,
-            a.be_scene_id,
-            a.be_device_id,
-            a.be_attribute_id,
-            a.be_address,
-            a.be_type,
-            a.compute_rules,
-            a.to_scene_id,
-            a.to_device_id,
-            a.to_attribute_id,
-            a.to_address,
-            a.to_type,
-            a.alar_rules,
-            a.alar_value,
-            a.alarm_start_time,
-            a.alarm_end_time
-    </sql>
+    <insert id="saveDataAlarmDetail" useGeneratedKeys="true"  keyProperty="id" parameterType="com.huaxu.entity.alarm.DataAlarmDetailEntity">
+        insert sms_data_alarm_detail (manage_id,alarm_name,company_org_id,dept_org_id,tenant_id,be_scene_id,be_device_id,be_attribute_id,be_alarm_value,
+               be_type,compute_rules,to_scene_id,to_device_id,to_attribute_id,to_alarm_value,to_type,alarm_rules,alarm_value,alarm_start_time
+               ,result_alarm_value,is_history,date_create,status)
+        values
+            (#{manageId},#{alarmName}, #{companyOrgId}, #{deptOrgId}, #{tenantId}, #{beSceneId},#{beDeviceId},
+            #{beAttributeId}, #{beAlarmValue},#{beType}, #{computeRules}, #{toSceneId},
+            #{toDeviceId}, #{toAttributeId},#{toAlarmValue}, #{toType}, #{alarmRules},
+            #{alarmValue},#{alarmStartTime},#{resultAlarmValue},#{isHistory},#{dateCreate},#{status})
+    </insert>
 
     <select id="findPage" resultType="com.huaxu.vo.DataAlarmDetailsVo">
-    select
-        <include refid="result_list"></include>
-    from sms_data_alarm_detail a
-    <where>
-        <if test="alarmName != null and alarmName != ''">
-            and a.alarm_name like CONCAT('%',#{alarmName,jdbcType=VARCHAR},'%')
+        select
+            a.id,a.alarm_name,a.manage_id,a.compute_rules,a.alarm_rules,a.alarm_value,a.is_hangup,
+            a.be_alarm_value,a.to_alarm_value,a.result_alarm_value,a.alarm_start_time,a.alarm_end_time,
+            s.SCENE_NAME as be_scene_name, t1.DEVICE_NAME as be_device_name, t2.name as be_attribute_name,
+            s.ADDRESS as "beAddress",s.POINT_X as "bePointX",s.POINT_Y as "bePointY",t2.UNIT as beUnit,
+            mm.to_scene_name,mm.to_device_name,mm.to_attribute_name,mm.toAddress,mm.toPointX,mm.toPointY,mm.toUnit
+        from
+            sms_data_alarm_detail  a
+        INNER JOIN sms_scene s on s.id = a.be_scene_id and s.status = 1
+        INNER JOIN sms_device t1 on a.be_device_id = t1.id and t1.status = 1
+        INNER JOIN sms_device_attribute t2 on a.be_attribute_id = t2.id  and t2.status = 1
+        LEFT JOIN  (
+            select m.id, s.SCENE_NAME as to_scene_name, t1.DEVICE_NAME as to_device_name, t2.name as to_attribute_name,
+            s.ADDRESS as "toAddress",s.POINT_X as "toPointX",s.POINT_Y as "toPointY",t2.UNIT as toUnit
+            from
+            sms_data_alarm_detail  m
+            INNER JOIN sms_scene s on s.id = m.to_scene_id and s.status = 1
+            INNER JOIN sms_device t1 on m.to_device_id = t1.id and t1.status = 1
+            INNER JOIN sms_device_attribute t2 on m.to_attribute_id=t2.id  and t2.status =1
+        ) mm on mm.id = a.id
+      <where>
+          a.tenant_id = #{dto.tenantId}
+          <if test="dto.userType != null and dto.userType != -999 and dto.userType!=-9999 and  dto.programItems != null and dto.programItems.size() > 0">
+              <if test="dto.permissonType == 5 or dto.permissonType == 2">
+                  and ( a.DEPT_ORG_ID in
+                  <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                      #{item.orgId}
+                  </foreach>
+                  or
+                  a.COMPANY_ORG_ID in
+                  <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                      #{item.orgId}
+                  </foreach>
+                  )
+              </if>
+              <if test="dto.permissonType == 4 or dto.permissonType == 3">
+                  and a.DEPT_ORG_ID in
+                  <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                      #{item.orgId}
+                  </foreach>
+              </if>
+              <if test="dto.permissonType == 1">
+                  and a.COMPANY_ORG_ID in
+                  <foreach collection="dto.programItems" item="item" open="(" close=")" separator=",">
+                      #{item.orgId}
+                  </foreach>
+                  and (a.DEPT_ORG_ID is null or a.DEPT_ORG_ID =0)
+              </if>
+          </if>
+        <if test="dto.alarmName != null and dto.alarmName != ''">
+            and a.alarm_name like CONCAT('%',#{dto.alarmName,jdbcType=VARCHAR},'%')
         </if>
-        <if test="isHistory = 0  and beginTime != null and endTime != null and beginTime != '' and endTime != ''">
-            and a.alarm_start_time  between #{beginTime} and #{endTime}
+        <if test="isHistory = 0  and dto.beginTime != null and dto.endTime != null and dto.beginTime != '' and dto.endTime != ''">
+            and a.alarm_start_time  between #{dto.beginTime} and #{dto.endTime}
         </if>
-        <if test="isHistory = 1  and beginTime != null and endTime != null and beginTime != '' and endTime != ''">
-            and a.alarm_start_time  >= #{beginTime} and  #{endTime} >= a.alarm_start_time
+        <if test="isHistory = 1  and dto.beginTime != null and dto.endTime != null and dto.beginTime != '' and dto.endTime != ''">
+            and a.alarm_start_time  >= #{dto.beginTime} and  #{dto.endTime} >= a.alarm_start_time
         </if>
-        a.is_history = #{isHistory} and a.status = 1
+        and a.is_history = #{history}
+        and a.status = 1
         order by id desc
     </where>
     </select>
 
-    <update id="deldelAlarmDetails">
-        update sms_data_alarm_detail
-        set status = 0
-        where id =#{alarmId}
+    <update id="hangUpAlarmDetails">
+        update sms_data_alarm_detail set is_hangup = #{status} where id =#{alarmId}
+    </update>
+
+    <update id="updateHistoryData">
+        update sms_data_alarm_detail set is_history = 1, alarm_end_time = now() where id =#{alarmId}
     </update>
 
+    <select id="listByManageId" resultType="com.huaxu.entity.alarm.DataAlarmDetailEntity">
+        select
+            a.id,a.manage_id,a.alarm_name,a.compute_rules,a.alarm_rules,a.alarm_value,
+            a.be_alarm_value,a.to_alarm_value,a.result_alarm_value,
+            a.alarm_start_time,a.alarm_end_time,a.be_scene_id,
+            a.be_device_id,a.be_attribute_id,a.is_hangup,
+            a.be_type,a.compute_rules,a.to_scene_id,a.to_device_id,a.to_attribute_id,a.to_type
+        from sms_data_alarm_detail a
+        where a.manage_id in
+        <foreach collection="manageIds" item="manageId" open="(" close=")" separator=",">
+            #{manageId}
+        </foreach>
+         and a.is_history = 0
+    </select>
+
+    <update id="updateAlrarmData">
+        update sms_data_alarm_detail
+        set
+            be_alarm_value= #{beAlarmValue},
+            to_alarm_value= #{toAlarmValue}
+            <if test="alarmEndTime != null">
+                ,alarm_end_time= #{alarmEndTime}
+            </if>
+            <if test="resultAlarmValue != null">
+                ,result_alarm_value= #{resultAlarmValue}
+            </if>
+        where
+            id =#{id}
+    </update>
 </mapper>

+ 46 - 44
sms_water/src/main/resources/mapper/DataAlarmManageMapper.xml

@@ -3,42 +3,43 @@
 <mapper namespace="com.huaxu.dao.alarm.DataAlarmManageMapper">
 
     <sql id="alarmManage_result_list" >
-            a.ID,
+            a.id,
             a.alarm_name,
             a.be_scene_id,
             a.be_device_id,
             a.be_attribute_id,
-            a.be_address,
             a.be_type,
             a.compute_rules,
             a.to_scene_id,
             a.to_device_id,
             a.to_attribute_id,
-            a.to_address,
             a.to_type,
-            a.alar_rules,
-            a.alar_value
+            a.alarm_rules,
+            a.alarm_value,
+            a.tenant_id,
+            a.company_org_id,
+            a.dept_org_id
     </sql>
 
     <insert id="saveDataAlarmManage" useGeneratedKeys="true"  keyProperty="id" parameterType="com.huaxu.entity.alarm.DataAlarmManageEntity">
         insert sms_data_alarm_manage (alarm_name,company_org_id,dept_org_id,tenant_id,be_scene_id,be_device_id,be_attribute_id,be_type,compute_rules,
-               to_scene_id,to_device_id,to_attribute_id,to_type,alar_rules,alar_value,date_create,status)
+               to_scene_id,to_device_id,to_attribute_id,to_type,alarm_rules,alarm_value,date_create,create_by,status)
         values
             (#{alarmName}, #{companyOrgId}, #{deptOrgId}, #{tenantId}, #{beSceneId},#{beDeviceId},
             #{beAttributeId}, #{beType}, #{computeRules}, #{toSceneId},
-            #{toDeviceId}, #{toAttributeId}, #{toType}, #{alarRules},
-            #{alarValue}, #{dateCreate},#{status})
+            #{toDeviceId}, #{toAttributeId}, #{toType}, #{alarmRules},
+            #{alarmValue}, #{dateCreate},#{createBy},#{status})
     </insert>
 
     <select id="findPage" resultType="com.huaxu.vo.DataAlarmManageVo">
         select
-               m.id,m.alarm_name, t2.name as be_attribute_name,s.SCENE_NAME as be_scene_name,
-               m.compute_rules,m.alar_rules,m.alar_value,mm.to_attribute_name,mm.to_scene_name
+            a.id,a.alarm_name, t2.name as be_attribute_name,s.SCENE_NAME as be_scene_name,
+            a.compute_rules,a.alarm_rules,a.alarm_value,mm.to_attribute_name,mm.to_scene_name
         from
-           sms_data_alarm_manage  m
-        INNER JOIN sms_scene s on s.id = m.be_scene_id and s.status = 1
-        INNER JOIN sms_device t1 on m.be_device_id = t1.id and t1.status = 1
-        INNER JOIN sms_device_attribute t2 on m.be_attribute_id=t2.id  and t2.status =1
+           sms_data_alarm_manage  a
+        INNER JOIN sms_scene s on s.id = a.be_scene_id and s.status = 1
+        INNER JOIN sms_device t1 on a.be_device_id = t1.id and t1.status = 1
+        INNER JOIN sms_device_attribute t2 on a.be_attribute_id=t2.id  and t2.status =1
         LEFT JOIN  (
             select m.id, t2.name as to_attribute_name,s.SCENE_NAME as to_scene_name
             from
@@ -46,8 +47,9 @@
             INNER JOIN sms_scene s on s.id = m.to_scene_id and s.status = 1
             INNER JOIN sms_device t1 on m.to_device_id = t1.id and t1.status = 1
             INNER JOIN sms_device_attribute t2 on m.to_attribute_id=t2.id  and t2.status =1
-        ) mm on mm.id = m.id
+        ) mm on mm.id = a.id
         <where>
+            a.tenant_id = #{dto.tenantId}
             <if test="dto.userType != null and dto.userType != -999 and dto.userType!=-9999 and  dto.programItems != null and dto.programItems.size() > 0">
                 <if test="dto.permissonType == 5 or dto.permissonType == 2">
                     and ( a.DEPT_ORG_ID in
@@ -78,12 +80,12 @@
             <if test="dto.alarmName != null and dto.alarmName != ''">
                 and a.alarm_name like CONCAT('%',#{dto.alarmName,jdbcType=VARCHAR},'%')
             </if>
-            a.status = 1
+            and a.status = 1
         </where>
         order by id desc
     </select>
 
-    <select id="findAlarmManage" resultType="com.huaxu.vo.DataAlarmManageVo">
+    <select id="findAlarmManage" resultType="com.huaxu.entity.alarm.DataAlarmManageEntity">
         select
         <include refid="alarmManage_result_list"></include>
         from sms_data_alarm_manage a
@@ -98,19 +100,18 @@
         be_scene_id =#{beSceneId},
         be_device_id = #{beDeviceId},
         be_attribute_id = #{beAttributeId},
-        be_address = #{beAddress},
         be_type = #{beType},
-        compute_rules = #{beAddress},
+        compute_rules = #{computeRules},
         to_scene_id = #{toSceneId},
         to_device_id= #{toDeviceId},
         to_attribute_id = #{toAttributeId},
-        to_address = #{toAddress},
         to_type = #{toType},
-        alar_rules = #{alarRules},
-        alar_value = #{alarValue},
-        date_update = #{dateUpdate}
+        alarm_rules = #{alarmRules},
+        alarm_value = #{alarmValue},
+        date_update = #{dateUpdate},
+        update_by = #{updateBy}
     where
-        id =#{alarmId}
+        id =#{id}
     </update>
 
     <update id="delDataAlarmManage">
@@ -124,27 +125,28 @@
         </foreach>
     </update>
 
-
-    <select id="selectDeviceAttributes">
-        select t2.id attribute_id,
-               t2.name attribute_name,
-               t1.ADDRESS,
-               t1.POINT_X,
-               t1.POINT_Y,
-               t1.DEVICE_NAME,
-               a.SCENE_NAME
-        from  sms_data_alarm_manage m
-              inner join sms_device t1
-              inner join sms_device_attribute t2 on t1.device_type_id = t2.device_type_id and t2.status = 1
-              inner join sms_device_parm t3 on t3.device_id = t1.id and t3.attribute_id=t2.id and t3.status=1
+    <select id="listByType" resultType="com.huaxu.vo.DataAlarmManageVo">
+        select
+            a.id,a.alarm_name,a.be_scene_id,a.be_device_id,
+            a.be_attribute_id,a.be_type,a.compute_rules,a.to_scene_id,a.to_device_id,a.to_attribute_id,a.to_type,
+            a.alarm_rules,a.alarm_value,a.tenant_id,a.company_org_id,a.dept_org_id,
+            t2.name as be_attribute_name,s.SCENE_NAME as be_scene_name,
+            a.compute_rules,a.alarm_rules,a.alarm_value,mm.to_attribute_name,mm.to_scene_name
+        from
+            sms_data_alarm_manage  a
+        INNER JOIN sms_scene s on s.id = a.be_scene_id and s.status = 1
+        INNER JOIN sms_device t1 on a.be_device_id = t1.id and t1.status = 1
+        INNER JOIN sms_device_attribute t2 on a.be_attribute_id=t2.id  and t2.status =1
+        LEFT JOIN  (
+            select m.id, t2.name as to_attribute_name,s.SCENE_NAME as to_scene_name
+            from
+            sms_data_alarm_manage  m
+            INNER JOIN sms_scene s on s.id = m.to_scene_id and s.status = 1
+            INNER JOIN sms_device t1 on m.to_device_id = t1.id and t1.status = 1
+            INNER JOIN sms_device_attribute t2 on m.to_attribute_id=t2.id  and t2.status =1
+        ) mm on mm.id = a.id
         where
-              t3.device_id=#{deviceId}
-          and t3.scene_id=#{sceneId}
-          and t3.scene_id=#{sceneId}
-          and t2.id = #{attrId}
-          and t1.status  = 1
-          and t3.is_alarm= 1
+        a.be_type = #{type} and a.to_type =#{type}
     </select>
 
-
 </mapper>

+ 12 - 0
sms_water/src/main/resources/mapper/DayReportMapper.xml

@@ -363,4 +363,16 @@
         order by a.COLLECT_DATE DESC
         limit 1
     </select>
+
+    <select id="findLastDayValue"  resultType="com.huaxu.entity.DayReportEntity">
+        select ROUND(a.LATEST_VALUE, 2) as latestValue from  sms_day_report a
+        <where>
+            a.DEVICE_ID = #{dayReport.deviceId} and  a.ATTRIBUTE_ID= #{dayReport.attributeId}
+            <if test="dayReport.tenantId != null ">and a.tenant_id = #{dayReport.tenantId}</if>
+            <if test="dayReport.year != null ">and a.year = #{dayReport.year}</if>
+            <if test="dayReport.month != null ">and a.month = #{dayReport.month}</if>
+            <if test="dayReport.day != null ">and a.day = #{dayReport.day}</if>
+            order by COLLECT_DATE DESC  limit 1
+        </where>
+    </select>
 </mapper>

+ 13 - 0
sms_water/src/main/resources/mapper/MonthReportMapper.xml

@@ -415,4 +415,17 @@
         ) as tab
         group by tab.attributeName,tab.ATTRIBUTE_TYPE
     </select>
+
+    <select id="findSumValue" resultType="com.huaxu.dto.ReportAttributeDto">
+        SELECT ROUND(a.SUM_VALUE, 2) as sumValue FROM sms_month_report a
+        <where>
+            <if test="report.tenantId != null  and report.tenantId != ''">and a.tenant_id = #{report.tenantId}</if>
+            <if test="report.year != null ">and a.year = #{report.year}</if>
+            <if test="report.month != null ">and a.month = #{report.month}</if>
+            <if test="report.day != null ">and a.day = #{report.day}</if>
+            <if test="report.deviceId != null ">and a.device_id = #{report.deviceId}</if>
+            <if test="report.attributeId != null ">and a.attribute_id = #{report.attributeId}</if>
+        </where>
+        limit 1;
+    </select>
 </mapper>

+ 12 - 0
sms_water/src/main/resources/mapper/YearReportMapper.xml

@@ -364,4 +364,16 @@
         </foreach>
         <if test="yearReport.year != null ">and a.year = #{yearReport.year}</if>
     </select>
+
+    <select id="findSumValue" resultType="com.huaxu.entity.YearReportEntity">
+        SELECT ROUND(a.SUM_VALUE, 2) as sumValue FROM sms_year_report a
+        <where>
+            <if test="report.tenantId != null  and report.tenantId != ''">and a.tenant_id = #{report.tenantId}</if>
+            <if test="report.year != null ">and a.year = #{report.year}</if>
+            <if test="report.month != null ">and a.month = #{report.month}</if>
+            <if test="report.deviceId != null ">and a.device_id = #{report.deviceId}</if>
+            <if test="report.attributeId != null ">and a.attribute_id = #{report.attributeId}</if>
+        </where>
+        limit 1;
+    </select>
 </mapper>