jiawuxian 1 жил өмнө
parent
commit
8c9c0c7751
18 өөрчлөгдсөн 678 нэмэгдсэн , 1 устгасан
  1. 4 1
      project_data/sql/0.1.1/soc/soc.sql
  2. 70 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotWebStatisticController.java
  3. 10 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/webStatisticBoard/BoardAlarmTrendDto.java
  4. 10 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/webStatisticBoard/BoardDeviceCountByTypeDto.java
  5. 8 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/BoardPeriodEnum.java
  6. 29 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotWebStatisticBoardMapper.java
  7. 25 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IIotWebStatisticBoardService.java
  8. 220 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotWebStatisticBoardServiceImpl.java
  9. 24 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmInfoVo.java
  10. 13 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmRateVo.java
  11. 29 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmTrendVo.java
  12. 18 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardDeviceCountVo.java
  13. 17 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardDeviceHealthVo.java
  14. 18 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardHealthRankingVo.java
  15. 19 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardHealthSummaryVo.java
  16. 28 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardOnlineByTypeVo.java
  17. 16 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardProtectionVo.java
  18. 120 0
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotWebStatisticBoardMapper.xml

+ 4 - 1
project_data/sql/0.1.1/soc/soc.sql

@@ -1042,4 +1042,7 @@ BEGIN
 	end if;
 END ??
 DELIMITER ;
-CALL schema_change();
+CALL schema_change();
+
+DELETE FROM `sys_menu` WHERE `id`=1839945558511747073;
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01839945558511747073, '物联看板', 1747911340288892930, 20, '/iot/board', 'iot/board/index', NULL, 1, 0, 'C', '0', '0', 'iot:board', '1', 'monitor', NULL, '超级管理员', '2024-09-28 16:33:14', '超级管理员', '2024-09-28 16:33:55', '');

+ 70 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotWebStatisticController.java

@@ -0,0 +1,70 @@
+package com.xunmei.iot.controller;
+
+import cn.hutool.core.util.EnumUtil;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.iot.enums.BoardPeriodEnum;
+import com.xunmei.iot.service.IIotWebStatisticBoardService;
+import com.xunmei.iot.vo.webStatisticBoard.BoardDeviceCountVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+
+@Slf4j
+@Api(description = "物联监测看板", tags = {"物联监测看板"})
+@RestController
+@RequestMapping({"/web/board/statistic"})
+public class IotWebStatisticController {
+    @Autowired
+    IIotWebStatisticBoardService iotWebStatisticBoardService;
+
+    @ApiOperation("设备数量")
+    @GetMapping("/deviceCount/{orgId}")
+    public AjaxResult deviceCount(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.deviceCount(orgId));
+    }
+
+    @ApiOperation("防区情况")
+    @GetMapping("/protection/{orgId}")
+    public AjaxResult protection(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.protection(orgId));
+    }
+
+    @ApiOperation("主机设备在线情况")
+    @GetMapping("/deviceOnline/{orgId}")
+    public AjaxResult deviceOnline(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.deviceOnline(orgId));
+    }
+
+    @ApiOperation("主机健康情况")
+    @GetMapping("/deviceHealth/{orgId}")
+    public AjaxResult deviceHealth(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.deviceHealth(orgId));
+    }
+
+    @ApiOperation("报警趋势")
+    @GetMapping("/alarmTrend/{orgId}/{period}")
+    public AjaxResult alarmTrend(@PathVariable Long orgId, @PathVariable Integer period) throws ParseException {
+        BoardPeriodEnum p = EnumUtil.getEnumAt(BoardPeriodEnum.class, period);
+        return AjaxResult.success(iotWebStatisticBoardService.alarmTrend(orgId, p));
+    }
+
+    @ApiOperation("实时报警率")
+    @GetMapping("/alarmRate/{orgId}")
+    public AjaxResult alarmRate(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.alarmRate(orgId));
+    }
+
+    @ApiOperation("实时报警列表")
+    @GetMapping("/alarmList/{orgId}")
+    public AjaxResult alarmList(@PathVariable Long orgId) {
+        return AjaxResult.success(iotWebStatisticBoardService.alarmList(orgId));
+    }
+}

+ 10 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/webStatisticBoard/BoardAlarmTrendDto.java

@@ -0,0 +1,10 @@
+package com.xunmei.iot.dto.webStatisticBoard;
+
+import lombok.Data;
+
+@Data
+public class BoardAlarmTrendDto {
+    private String deviceType;
+    private String date;
+    private Integer count;
+}

+ 10 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/webStatisticBoard/BoardDeviceCountByTypeDto.java

@@ -0,0 +1,10 @@
+package com.xunmei.iot.dto.webStatisticBoard;
+
+import lombok.Data;
+
+@Data
+public class BoardDeviceCountByTypeDto {
+    private String deviceType;
+
+    private Integer count;
+}

+ 8 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/BoardPeriodEnum.java

@@ -0,0 +1,8 @@
+package com.xunmei.iot.enums;
+
+
+public enum BoardPeriodEnum {
+    NEAR_7_DAYS,
+    NEAR_7_WEEKS,
+    NEAR_6_MONTHS,
+}

+ 29 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotWebStatisticBoardMapper.java

@@ -0,0 +1,29 @@
+package com.xunmei.iot.mapper;
+
+import com.xunmei.iot.dto.webStatisticBoard.BoardAlarmTrendDto;
+import com.xunmei.iot.dto.webStatisticBoard.BoardDeviceCountByTypeDto;
+import com.xunmei.iot.vo.webStatisticBoard.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Date;
+
+@Mapper
+public interface IotWebStatisticBoardMapper {
+    List<BoardDeviceCountByTypeDto> deviceCount(Long orgId);
+
+    BoardProtectionVo protection(Long orgId);
+
+    List<BoardOnlineByTypeVo> deviceOnline(@Param("orgId") Long orgId, @Param("deviceTypes") List<String> deviceTypes);
+
+    BoardHealthSummaryVo healthSummary(@Param("orgId") Long orgId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    List<BoardHealthRankingVo> healthRanking(@Param("orgId") Long orgId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    List<BoardAlarmTrendDto> alarmTrend(@Param("orgId") Long orgId, @Param("startTime") Date startTime);
+
+    BoardAlarmRateVo alarmRate(Long orgId);
+
+    List<BoardAlarmInfoVo> alarmList(Long orgId);
+}

+ 25 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IIotWebStatisticBoardService.java

@@ -0,0 +1,25 @@
+package com.xunmei.iot.service;
+
+import com.xunmei.iot.enums.BoardPeriodEnum;
+import com.xunmei.iot.vo.webStatisticBoard.*;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.text.ParseException;
+import java.util.Collection;
+import java.util.List;
+
+public interface IIotWebStatisticBoardService {
+    BoardDeviceCountVo deviceCount(Long orgId);
+
+    BoardProtectionVo protection(Long orgId);
+
+    List<BoardOnlineByTypeVo> deviceOnline(Long orgId);
+
+    BoardDeviceHealthVo deviceHealth(Long orgId);
+
+    Collection<BoardAlarmTrendVo> alarmTrend(Long orgId, BoardPeriodEnum period) throws ParseException;
+
+    BoardAlarmRateVo alarmRate(Long orgId);
+
+    List<BoardAlarmInfoVo> alarmList(Long orgId);
+}

+ 220 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotWebStatisticBoardServiceImpl.java

@@ -0,0 +1,220 @@
+package com.xunmei.iot.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.xunmei.common.core.enums.iot.DeviceTypeEnum;
+import com.xunmei.common.core.utils.NumberUtils;
+import com.xunmei.iot.dto.webStatisticBoard.BoardAlarmTrendDto;
+import com.xunmei.iot.dto.webStatisticBoard.BoardDeviceCountByTypeDto;
+import com.xunmei.iot.enums.BoardPeriodEnum;
+import com.xunmei.iot.mapper.IotWebStatisticBoardMapper;
+import com.xunmei.iot.service.IIotWebStatisticBoardService;
+import com.xunmei.iot.vo.webStatisticBoard.*;
+import com.xunmei.system.api.RemoteOrgService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class IotWebStatisticBoardServiceImpl implements IIotWebStatisticBoardService {
+    @Autowired
+    RemoteOrgService orgService;
+
+    @Autowired
+    IotWebStatisticBoardMapper iotWebStatisticBoardMapper;
+
+    final List<String> monitorDeviceTypes = Arrays.asList(DeviceTypeEnum.DVS.getCode(), DeviceTypeEnum.MONITOR_CAMERA.getCode(), DeviceTypeEnum.NUMBER_CAMERA.getCode());
+    final List<String> fireDeviceTypes = Arrays.asList(DeviceTypeEnum.FSU_Smoke.getCode(), DeviceTypeEnum.FSU_Gas.getCode(), DeviceTypeEnum.FSU_TemperatureAndHumidity.getCode());
+    final List<String> environmentTypes = Arrays.asList(DeviceTypeEnum.FSU_Theft.getCode(), DeviceTypeEnum.FSU_Infrared.getCode(), DeviceTypeEnum.FSU_DoorMagnetic.getCode(),
+            DeviceTypeEnum.FSU_RollingShutterDoor.getCode(), DeviceTypeEnum.FSU_Water.getCode(), DeviceTypeEnum.FSU_Ups.getCode(), DeviceTypeEnum.FSU_AirConditioner.getCode());
+
+    final SimpleDateFormat dayFormat = new SimpleDateFormat("M月d");
+    final SimpleDateFormat monthFormat = new SimpleDateFormat("yy年M月");
+
+    @Override
+    public BoardDeviceCountVo deviceCount(Long orgId) {
+        List<BoardDeviceCountByTypeDto> list = iotWebStatisticBoardMapper.deviceCount(orgId);
+        Integer monitorCount = list.stream().filter(i -> monitorDeviceTypes.contains(i.getDeviceType())).mapToInt(i -> i.getCount()).sum();
+        Integer fireCount = list.stream().filter(i -> fireDeviceTypes.contains(i.getDeviceType())).mapToInt(i -> i.getCount()).sum();
+        Integer environmentCount = list.stream().filter(i -> environmentTypes.contains(i.getDeviceType())).mapToInt(i -> i.getCount()).sum();
+
+        BoardDeviceCountVo vo = BoardDeviceCountVo.builder()
+                .monitorCount(monitorCount)
+                .fireCount(fireCount)
+                .environmentCount(environmentCount)
+                .build();
+        return vo;
+    }
+
+    @Override
+    public BoardProtectionVo protection(Long orgId) {
+        return iotWebStatisticBoardMapper.protection(orgId);
+    }
+
+    @Override
+    public List<BoardOnlineByTypeVo> deviceOnline(Long orgId) {
+        List<BoardOnlineByTypeVo> list = iotWebStatisticBoardMapper.deviceOnline(orgId, Arrays.asList(DeviceTypeEnum.DVS.getCode(),
+                DeviceTypeEnum.ALARM_HOST.getCode(), DeviceTypeEnum.FSU_Gateway.getCode()));
+        Set<String> hasDataType = list.stream().map(BoardOnlineByTypeVo::getDeviceType).collect(Collectors.toSet());
+        list.addAll(initDeviceOnline().stream().filter(id -> !hasDataType.contains(id.getDeviceType())).collect(Collectors.toList()));
+
+        for (BoardOnlineByTypeVo vo : list) {
+            vo.setOnLineRate(NumberUtils.computeRate(vo.getDeviceCount(), vo.getOnLineCount()));
+            if (ObjectUtil.isNotEmpty(DeviceTypeEnum.getDescByCode(vo.getDeviceType()))) {
+                vo.setDeviceTypeName(DeviceTypeEnum.getDescByCode(vo.getDeviceType()));
+                if (ObjectUtil.equal(vo.getDeviceType(), DeviceTypeEnum.DVS.getCode())) {
+                    vo.setDeviceTypeName("监控主机");
+                }
+            }
+        }
+//        Collections.sort(list, Comparator.comparing(BoardOnlineByTypeVo::getOnLineRate));
+        list.sort(Comparator.comparing(BoardOnlineByTypeVo::getOnLineRate));
+        Collections.reverse(list);
+        list.add(BoardOnlineByTypeVo.builder().deviceTypeName("门禁主机").deviceCount(0).onLineCount(0).onLineRate(0f).build());
+        list.add(BoardOnlineByTypeVo.builder().deviceTypeName("对讲主机").deviceCount(0).onLineCount(0).onLineRate(0f).build());
+
+        return list;
+    }
+
+    private List<BoardOnlineByTypeVo> initDeviceOnline() {
+        List<BoardOnlineByTypeVo> list = new ArrayList<>();
+        list.add(BoardOnlineByTypeVo.builder().deviceType(DeviceTypeEnum.DVS.getCode()).deviceTypeName("监控主机").deviceCount(0).onLineCount(0).onLineRate(0f).build());
+        list.add(BoardOnlineByTypeVo.builder().deviceType(DeviceTypeEnum.ALARM_HOST.getCode()).deviceTypeName(DeviceTypeEnum.ALARM_HOST.getDesc()).deviceCount(0).onLineCount(0).onLineRate(0f).build());
+        list.add(BoardOnlineByTypeVo.builder().deviceType(DeviceTypeEnum.FSU_Gateway.getCode()).deviceTypeName(DeviceTypeEnum.FSU_Gateway.getDesc()).deviceCount(0).onLineCount(0).onLineRate(0f).build());
+
+
+        return list;
+    }
+
+    @Override
+    public BoardDeviceHealthVo deviceHealth(Long orgId) {
+        Date start = DateUtil.beginOfDay(new Date());
+        Date end = DateUtil.endOfDay(new Date());
+
+        BoardHealthSummaryVo summaryVo = iotWebStatisticBoardMapper.healthSummary(orgId, start, end);
+        List<BoardHealthRankingVo> rankingVos = iotWebStatisticBoardMapper.healthRanking(orgId, start, end);
+
+        BoardDeviceHealthVo vo = BoardDeviceHealthVo.builder()
+                .healthSummary(summaryVo)
+                .healthRanking(rankingVos)
+                .build();
+
+        return vo;
+    }
+
+    @Override
+    public Collection<BoardAlarmTrendVo> alarmTrend(Long orgId, BoardPeriodEnum period) throws ParseException {
+        Date earliestDate = getEarliestDate(period);
+        List<BoardAlarmTrendDto> list = iotWebStatisticBoardMapper.alarmTrend(orgId, earliestDate);
+        LinkedHashMap<String, BoardAlarmTrendVo> map = getAlarmTrendMap(period);
+
+        for (BoardAlarmTrendDto item : list) {
+            String xaxisDate = getOutputDateFormat(period, item.getDate());
+            BoardAlarmTrendVo vo = map.get(xaxisDate);
+            if (ObjectUtil.isNull(vo)) {
+                continue;
+            }
+
+            if (monitorDeviceTypes.contains(item.getDeviceType())) {
+                vo.setMonitorCount(vo.getMonitorCount() + item.getCount());
+            }
+            if (fireDeviceTypes.contains(item.getDeviceType())) {
+                vo.setFireCount(vo.getFireCount() + item.getCount());
+            }
+            if (environmentTypes.contains(item.getDeviceType())) {
+                vo.setEnvironmentCount(vo.getEnvironmentCount() + item.getCount());
+            }
+        }
+
+        List<BoardAlarmTrendVo> r = map.values().stream().collect(Collectors.toList());
+        for (BoardAlarmTrendVo vo : r) {
+            vo.setTotal(vo.getMonitorCount() + vo.getFireCount() + vo.getEnvironmentCount());
+        }
+        Collections.reverse(r);
+        return r;
+    }
+
+    private Date getEarliestDate(BoardPeriodEnum period) {
+        switch (period) {
+            case NEAR_7_DAYS:
+                return DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -6);
+            case NEAR_7_WEEKS:
+                return DateUtil.offsetWeek(DateUtil.beginOfWeek(new Date()), -6);
+            case NEAR_6_MONTHS:
+                return DateUtil.offsetMonth(DateUtil.beginOfMonth(new Date()), -5);
+            default:
+                throw new RuntimeException("无法识别的周期");
+        }
+    }
+
+    private String getOutputDateFormat(BoardPeriodEnum period, String date) throws ParseException {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date d = dateFormat.parse(date);
+        return getOutputDateFormat(period, d);
+    }
+
+    private String getOutputDateFormat(BoardPeriodEnum period, Date date) {
+        switch (period) {
+            case NEAR_7_DAYS:
+                return dayFormat.format(date);
+            case NEAR_7_WEEKS:
+                return dayFormat.format(DateUtil.beginOfWeek(date));
+            case NEAR_6_MONTHS:
+                return monthFormat.format(date);
+            default:
+                throw new RuntimeException("无法识别的周期");
+        }
+    }
+
+    private LinkedHashMap<String, BoardAlarmTrendVo> getAlarmTrendMap(BoardPeriodEnum period) {
+        LinkedHashMap<String, BoardAlarmTrendVo> map = new LinkedHashMap<>();
+        Date date = new Date();
+        int num = 7;
+        if (ObjectUtil.equal(period, BoardPeriodEnum.NEAR_6_MONTHS)) {
+            num = 6;
+        }
+        for (int i = 0; i < num; i++) {
+            String key = getOutputDateFormat(period, date);
+            map.put(key, BoardAlarmTrendVo.builder()
+                    .date(key)
+                    .total(0)
+                    .fireCount(0)
+                    .monitorCount(0)
+                    .environmentCount(0)
+                    .build());
+
+            switch (period) {
+                case NEAR_7_DAYS:
+                    date = DateUtil.offsetDay(date, -1);
+                    break;
+                case NEAR_7_WEEKS:
+                    date = DateUtil.offsetWeek(date, -1);
+                    break;
+                case NEAR_6_MONTHS:
+                    date = DateUtil.offsetMonth(date, -1);
+                    break;
+            }
+        }
+
+        return map;
+    }
+
+    @Override
+    public BoardAlarmRateVo alarmRate(Long orgId) {
+        BoardAlarmRateVo vo=iotWebStatisticBoardMapper.alarmRate(orgId);
+        if(vo==null){
+            return new BoardAlarmRateVo();
+        }
+
+        return vo;
+    }
+
+    @Override
+    public List<BoardAlarmInfoVo> alarmList(Long orgId) {
+        return iotWebStatisticBoardMapper.alarmList(orgId);
+    }
+}

+ 24 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmInfoVo.java

@@ -0,0 +1,24 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BoardAlarmInfoVo {
+    @ApiModelProperty("机构名称")
+    private String orgName;
+
+    @ApiModelProperty("设备名称")
+    private String deviceName;
+
+    @ApiModelProperty("报警开始时间")
+    private Date alarmStartTime;
+
+    @ApiModelProperty("报警结束时间")
+    private Date alarmEndTime;
+
+    @ApiModelProperty("报警信息")
+    private String alarmInfo;
+}

+ 13 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmRateVo.java

@@ -0,0 +1,13 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BoardAlarmRateVo {
+    @ApiModelProperty("正常设备数量")
+    private int normalCount;
+
+    @ApiModelProperty("异常设备数量")
+    private int alarmCount;
+}

+ 29 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardAlarmTrendVo.java

@@ -0,0 +1,29 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BoardAlarmTrendVo {
+    @ApiModelProperty("时间")
+    private String date;
+
+    @ApiModelProperty("总数")
+    private Integer total;
+
+    @ApiModelProperty("监控设备报警")
+    private Integer monitorCount;
+
+    @ApiModelProperty("消防设备报警")
+    private Integer fireCount;
+
+    @ApiModelProperty("环境设备报警")
+    private Integer environmentCount;
+}

+ 18 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardDeviceCountVo.java

@@ -0,0 +1,18 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class BoardDeviceCountVo {
+    @ApiModelProperty("监控设备数量")
+    private Integer monitorCount;
+
+    @ApiModelProperty("消防设备数量")
+    private Integer fireCount;
+
+    @ApiModelProperty("环境设备数量")
+    private Integer environmentCount;
+}

+ 17 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardDeviceHealthVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class BoardDeviceHealthVo {
+    @ApiModelProperty("健康汇总")
+    private BoardHealthSummaryVo healthSummary;
+
+    @ApiModelProperty("分数排名")
+    private List<BoardHealthRankingVo> healthRanking;
+}

+ 18 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardHealthRankingVo.java

@@ -0,0 +1,18 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+@ApiModel("机构分数排名")
+@Data
+public class BoardHealthRankingVo {
+//    private Integer order;
+
+    @ApiModelProperty("机构名称")
+    private String orgName;
+
+    @ApiModelProperty("分数")
+    private Float score;
+}

+ 19 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardHealthSummaryVo.java

@@ -0,0 +1,19 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BoardHealthSummaryVo {
+    @ApiModelProperty("有设备的机构数量")
+    private Integer total;
+
+    @ApiModelProperty("已执行检查的机构数量")
+    private Integer checkedCount;
+
+    @ApiModelProperty("分数超过90的机构数")
+    private Integer over90Count;
+
+    @ApiModelProperty("分数在90及以下的机构数")
+    private Integer notover90Count;
+}

+ 28 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardOnlineByTypeVo.java

@@ -0,0 +1,28 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BoardOnlineByTypeVo {
+    @ApiModelProperty("设备类型")
+    private String deviceType;
+
+    @ApiModelProperty("设备类型名称")
+    private String deviceTypeName;
+
+    @ApiModelProperty("设备数量")
+    private Integer deviceCount;
+
+    @ApiModelProperty("在线数量")
+    private Integer onLineCount;
+
+    @ApiModelProperty("在线率")
+    private Float onLineRate;
+}

+ 16 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/webStatisticBoard/BoardProtectionVo.java

@@ -0,0 +1,16 @@
+package com.xunmei.iot.vo.webStatisticBoard;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BoardProtectionVo {
+    @ApiModelProperty("总数")
+    private int total;
+
+    @ApiModelProperty("布防")
+    private int on;
+
+    @ApiModelProperty("撤防")
+    private int off;
+}

+ 120 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotWebStatisticBoardMapper.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.iot.mapper.IotWebStatisticBoardMapper">
+    <select id="deviceCount" resultType="com.xunmei.iot.dto.webStatisticBoard.BoardDeviceCountByTypeDto">
+        SELECT di.device_type, count(0) as count
+        FROM iot_device_info di
+                 INNER JOIN sys_org o on di.org_id = o.id and o.deleted = 0 and o.is_lock = 0
+        WHERE o.path like CONCAT((select path from sys_org where id = #{orgId}), '%')
+          and di.deleted = 0
+        GROUP BY di.device_type
+    </select>
+
+    <select id="protection" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardProtectionVo">
+        SELECT count(0)                            AS total,
+               sum(
+                       IF
+                           (s.`status` = 1, 1, 0)) AS `on`,
+               sum(
+                       IF
+                           (s.`status` = 0, 1, 0)) AS off
+        FROM iot_alarm_subsystem s
+                 INNER JOIN sys_org o ON s.org_id = o.id
+            AND o.deleted = 0
+            AND o.is_lock = 0
+        WHERE o.path LIKE CONCAT((select path from sys_org where id = #{orgId}), '%')
+          AND s.deleted = 0
+    </select>
+
+    <select id="deviceOnline" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardOnlineByTypeVo">
+        SELECT
+        di.device_type,
+        count( 0 ) AS deviceCount,
+        sum(
+        IF
+        ( di.net_status = 1, 1, 0 )) as onLineCount
+        FROM
+        iot_device_info di
+        INNER JOIN sys_org o ON di.org_id = o.id
+        AND o.deleted = 0
+        AND o.is_lock = 0
+        WHERE
+        o.path LIKE CONCAT(( SELECT path FROM sys_org WHERE id = #{orgId} ), '%' )
+        AND di.deleted = 0
+        AND di.device_type IN
+        <foreach collection="deviceTypes" item="t" separator="," open="(" close=")">
+            #{t}
+        </foreach>
+        GROUP BY
+        di.device_type
+    </select>
+    <select id="healthSummary" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardHealthSummaryVo">
+        SELECT count(0)                                  as total,
+               sum(score is not null)                    as checkedCount,
+               sum(score is not null and score > 90)     as over90Count,
+               sum(score is not null and score &lt;= 90) as notover90Count
+        FROM (SELECT o.id, max(dcd.score) as score
+              FROM sys_org o
+                       LEFT JOIN iot_daily_check_data dcd
+                                 on o.id = dcd.org_id and dcd.record_date BETWEEN #{startTime} AND #{endTime}
+              WHERE o.type = 4
+                and o.deleted = 0
+                and o.is_lock = 0
+                and o.path like concat((SELECT path from sys_org WHERE id = #{orgId}), '%')
+              GROUP BY o.id) a
+    </select>
+    <select id="healthRanking" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardHealthRankingVo">
+        SELECT org_name, score
+        FROM (SELECT o.id, o.short_name as org_name, max(dcd.score) as score
+              FROM sys_org o
+                       INNER JOIN iot_daily_check_data dcd
+                                  on o.id = dcd.org_id and dcd.record_date BETWEEN #{startTime} AND #{endTime}
+              WHERE o.type = 4
+                and o.deleted = 0
+                and o.is_lock = 0
+                and o.path like concat((SELECT path from sys_org WHERE id = #{orgId}), '%')
+              GROUP BY o.id) a
+        ORDER BY score desc
+        limit 3
+    </select>
+    <select id="alarmRate" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardAlarmRateVo">
+        SELECT sum(ds.state = 0) normalCount,
+               sum(ds.state = 1) alarmCount
+        FROM iot_device_info di
+                 INNER JOIN sys_org o ON di.org_id = o.id
+            AND o.deleted = 0
+            AND o.is_lock = 0
+            AND o.path LIKE concat((SELECT path FROM sys_org WHERE id = #{orgId}),
+             '%')
+                 INNER JOIN iot_device_status ds
+        ON di.id = ds.device_id
+    </select>
+
+    <select id="alarmList" resultType="com.xunmei.iot.vo.webStatisticBoard.BoardAlarmInfoVo">
+        SELECT o.short_name  AS org_name,
+               di.device_name,
+               ad.time       AS alarmStartTime,
+               ad.end_time   AS alarmEndTime,
+               ad.value_text AS alarmInfo
+        FROM iot_alarm_data ad
+                 INNER JOIN iot_device_info di ON ad.device_id = di.id AND di.deleted = 0
+                 INNER JOIN sys_org o ON ad.org_id = o.id AND o.deleted = 0 AND o.is_lock = 0 AND
+                                         o.path LIKE concat((SELECT path FROM sys_org WHERE id = #{orgId}), '%')
+        ORDER BY time DESC
+        LIMIT 50
+    </select>
+    <select id="alarmTrend" resultType="com.xunmei.iot.dto.webStatisticBoard.BoardAlarmTrendDto">
+        select device_type, date, count(0) as count
+        FROM (SELECT di.device_type,
+                     Date_FORMAT(ad.time, '%Y-%m-%d') as date
+              FROM iot_alarm_data ad
+                       INNER JOIN iot_device_info di ON ad.device_id = di.id
+                  AND di.deleted = 0
+                       INNER JOIN sys_org o ON ad.org_id = o.id
+                  AND o.deleted = 0
+                  AND o.is_lock = 0
+                  AND o.path LIKE concat((SELECT path FROM sys_org WHERE id = #{orgId}), '%')
+              WHERE ad.time > #{startTime}) a
+        GROUP BY device_type, date
+    </select>
+</mapper>