소스 검색

app面板数据总览

jingyuanchao 1 년 전
부모
커밋
8d538b58a6

+ 58 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/SensorType.java

@@ -0,0 +1,58 @@
+package com.xunmei.common.core.enums.iot;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum SensorType {
+
+
+    WATER_INTRUSION(4184, "水浸"),
+
+    SMOKE_SENSOR(4182, "烟感"),
+
+    HUMIDITY_TEMPERATURE_SENSOR(4183, "温湿度"),
+
+    GAS_SENSOR(41885, "燃气"),
+
+    DOOR_MAGNETIC_SENSOR(4188, "门磁"),
+
+    INFRARED_SENSOR(4181, "红外"),
+
+    ALARM_SENSOR(41881, "盗情");
+
+    private Integer code;
+
+    private String desc;
+
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, SensorType> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (SensorType enumNode : SensorType.values()) {
+            enumMap.put(enumNode.code, enumNode);
+        }
+    }
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer code) {
+        SensorType e = enumMap.get(code);
+        return e != null ? e.getDesc() : "";
+    }
+
+    /**
+     * 根据code获取name
+     */
+    public static SensorType getSensorTypeEnum(Integer code) {
+        return enumMap.get(code);
+    }
+}

+ 7 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotBoardController.java

@@ -35,10 +35,16 @@ class IotBoardController {
     }
 
 
-    @ApiOperation("分页")
+    @ApiOperation("挂墙终端总览数据")
     @PostMapping({"/iot/app"})
     AjaxResult iotOverview(@RequestBody final PageDto request)  throws ExecutionException, InterruptedException, TimeoutException {
         return AjaxResult.success(this.iotBoardService.iotOverview(request.getOrgId()));
     }
 
+    @ApiOperation("物联总览")
+    @PostMapping({"/overview"})
+    AjaxResult iotOverview() {
+        return AjaxResult.success(this.iotBoardService.totalData());
+    }
+
 }

+ 4 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotAlarmDataMapper.java

@@ -10,7 +10,9 @@ import com.xunmei.iot.vo.alarmData.AppAlarmDataPageVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface IotAlarmDataMapper extends BaseMapper<IotAlarmData> {
@@ -27,4 +29,6 @@ public interface IotAlarmDataMapper extends BaseMapper<IotAlarmData> {
     List<DeviceTypeCountVo> selectDeviceTypeCount(@Param("query")AppAlarmPageDto requestDto);
 
     Page<IotAlarmDataVo> selectSensorAlarmPageList(@Param("page") Page<IotAlarmDataVo> page, @Param("param")AppAlarmPageDto requestDto);
+
+    List<Map<String,String>> selectAlarmCount(@Param("orgPath") String orgPath, @Param("beginTime") Date beginTime);
 }

+ 15 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotBoardMapper.java

@@ -3,6 +3,11 @@ package com.xunmei.iot.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xunmei.iot.vo.board.IotBoardOverviewItemVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface IotBoardMapper extends BaseMapper {
@@ -19,4 +24,14 @@ public interface IotBoardMapper extends BaseMapper {
     IotBoardOverviewItemVo videoQuality(String orgPath);
 
     IotBoardOverviewItemVo dvrDisk(String orgPath);
+
+    List<Map<String,Long>> countDeviceNums(String orgPath);
+
+    List<Map<String, String>> countDeviceNums2(String orgPath);
+
+    List<Map<String, String>> countSensorNums(String orgPath);
+
+    List<Map<String, String>> selectVideoCheckSelf(@Param("orgPath") String orgPath, @Param("date") Date date);
+
+    List<Map<String, String>> selectVideoDaysStorage(String orgPath, Date date);
 }

+ 3 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotAlarmDataService.java

@@ -10,6 +10,7 @@ import com.xunmei.iot.vo.alarmData.AppAlarmDataPageVo;
 import com.xunmei.iot.vo.alarmData.SensorAlarmCountVo;
 
 import java.util.List;
+import java.util.Map;
 
 public interface IotAlarmDataService extends IService<IotAlarmData> {
 
@@ -37,4 +38,6 @@ public interface IotAlarmDataService extends IService<IotAlarmData> {
     Integer getEnvMonitorBadge(Long orgId);
 
     TableDataInfo<IotAlarmDataVo> selectSensorAlarmPageList(AppAlarmPageDto requestDto);
+
+    List<Map<String,String>> selectAlarmCount(String orgPath);
 }

+ 4 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotBoardService.java

@@ -1,6 +1,7 @@
 package com.xunmei.iot.service;
 
 import com.xunmei.iot.vo.board.IotBoardOverviewVo;
+import com.xunmei.iot.vo.board.IotBoardTotalData;
 
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
@@ -10,4 +11,7 @@ public interface IotBoardService {
     IotBoardOverviewVo overview(Long orgId)  throws ExecutionException, InterruptedException, TimeoutException;
 
     Map<String, Object> iotOverview(Long orgId);
+
+    IotBoardTotalData totalData();
+
 }

+ 11 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotAlarmDataServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xunmei.iot.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -22,7 +23,9 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, IotAlarmData> implements IotAlarmDataService {
@@ -222,4 +225,12 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
         page = baseMapper.selectSensorAlarmPageList(page, requestDto);
         return TableDataInfo.build(page);
     }
+
+    @Override
+    public List<Map<String,String>> selectAlarmCount(String orgPath) {
+        Date date = new Date();
+        Date beginTime = DateUtil.offsetDay(DateUtil.beginOfDay(date), -90);
+        return baseMapper.selectAlarmCount(orgPath,beginTime);
+    }
+
 }

+ 107 - 4
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotBoardServiceImpl.java

@@ -7,18 +7,24 @@ import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.iot.domain.IotSensor;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmData;
+import com.xunmei.common.core.enums.CategoryDataEnum;
+import com.xunmei.common.core.enums.iot.SensorType;
 import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.thread.ThreadPoolConfig;
 import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.iot.mapper.IotBoardMapper;
+import com.xunmei.iot.mapper.VideoIntegrityCheckMapper;
 import com.xunmei.iot.service.IIotCommonSensorService;
 import com.xunmei.iot.service.IotAlarmDataService;
 import com.xunmei.iot.service.IotBoardService;
 import com.xunmei.iot.vo.alarmData.AppAlarmDataPageVo;
 import com.xunmei.iot.vo.board.IotBoardOverviewItemVo;
 import com.xunmei.iot.vo.board.IotBoardOverviewVo;
+import com.xunmei.iot.vo.board.IotBoardTotalData;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.vo.SysOrgVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -47,6 +53,14 @@ public class IotBoardServiceImpl implements IotBoardService {
     @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
+    @Resource
+    IIotCommonSensorService sensorService;
+    @Resource
+    IotAlarmDataService alarmDataService;
+
+    @Resource
+    VideoIntegrityCheckMapper videoIntegrityCheckMapper;
+
     private final Long TIMEOUT = 3L;
 
     @Override
@@ -140,10 +154,6 @@ public class IotBoardServiceImpl implements IotBoardService {
         return vo;
     }
 
-    @Resource
-    IIotCommonSensorService sensorService;
-    @Resource
-    IotAlarmDataService alarmDataService;
 
     @Override
     public Map<String, Object> iotOverview(Long orgId) {
@@ -264,4 +274,97 @@ public class IotBoardServiceImpl implements IotBoardService {
         }
 
     }
+
+    @Override
+    public IotBoardTotalData totalData() {
+
+        final String MAP_VALUE = "nums";
+        final String DEVICE_TYPE = "deviceType";
+        final String CATEGORY_ID = "categoryId";
+        SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
+
+        List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+
+        Optional<SysOrgVO> first = cacheList.stream().filter(r -> ObjectUtil.equal(sysUser.getOrgId(), r.getId())).findFirst();
+        if (!first.isPresent()) {
+            throw new ServiceException("当前登陆用户机构信息异常!");
+        }
+
+        SysOrgVO orgVO = first.get();
+        String orgPath = orgVO.getPath();
+
+        IotBoardTotalData totalData = new IotBoardTotalData();
+        //构建设备一览表数据
+        IotBoardTotalData.DeviceOverview deviceOverview = new IotBoardTotalData.DeviceOverview();
+        List<Map<String, Long>> deviceNums = iotBoardMapper.countDeviceNums(orgPath);
+        List<Map<String, String>> deviceNums2 = iotBoardMapper.countDeviceNums2(orgPath);
+        for (Map<String, Long> map : deviceNums) {
+            if (CategoryDataEnum.IOT_DETECTION_DEVICE.getId().equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setEdgeComputingHosts(map.get(MAP_VALUE).intValue());
+            }
+            if (CategoryDataEnum.ALARM_HOST_DEVICE.getId().equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setAlarmControllers(map.get(MAP_VALUE).intValue());
+            }
+            if (CategoryDataEnum.MONITOR_HOST_DEVICE.getId().equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setHardDiskRecorders(map.get(MAP_VALUE).intValue());
+            }
+        }
+        for (Map<String, String> map : deviceNums2) {
+            if ("sensor".equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setIotDevices(Integer.parseInt(map.get(MAP_VALUE)));
+            }
+            if ("channel".equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setCameras(Integer.parseInt(map.get(MAP_VALUE)));
+            }
+            if ("disk".equals(map.get(CATEGORY_ID))) {
+                deviceOverview.setHardDisks(Integer.parseInt(map.get(MAP_VALUE)));
+            }
+        }
+        totalData.setDeviceOverview(deviceOverview);
+        //物联设备最近90天的告警数据
+        List<Map<String, String>> alarmCountMap = alarmDataService.selectAlarmCount(orgPath);
+        //计算alarmCountMap 所有nums的总和
+        int nums = alarmCountMap.stream().mapToInt(m -> Integer.parseInt(m.get(MAP_VALUE))).sum();
+        totalData.setTotalAlerts(nums);
+
+        //传感器数据
+        List<Map<String, String>> mapList = iotBoardMapper.countSensorNums(orgPath);
+        List<IotBoardTotalData.SensorData> sensorDataList = new ArrayList<>();
+        for (SensorType sensorType : SensorType.values()) {
+            Optional<Map<String, String>> mapOptional = mapList.stream().filter(m -> ObjectUtil.equal(sensorType.getCode().toString(), m.get(DEVICE_TYPE))).findAny();
+            int sensorNum = 0;
+            if (mapOptional.isPresent()) {
+                sensorNum = Integer.parseInt(mapOptional.get().get(MAP_VALUE));
+            }
+            Optional<Map<String, String>> alarmNumoptional = alarmCountMap.stream().filter(m -> ObjectUtil.equal(sensorType.getCode().toString(), m.get(DEVICE_TYPE))).findAny();
+            int alarmNum = 0;
+            if (alarmNumoptional.isPresent()) {
+                alarmNum = Integer.parseInt(alarmNumoptional.get().get(MAP_VALUE));
+            }
+            IotBoardTotalData.SensorData sensorData = IotBoardTotalData.SensorData
+                    .builder()
+                    .type(sensorType.getCode())
+                    .deviceCount(sensorNum)
+                    .historicalAlarmTotal(alarmNum).build();
+            sensorDataList.add(sensorData);
+        }
+        totalData.setSensorDetails(sensorDataList);
+        //录像文件自检
+        List<Map<String, String>> videoCheckSelfMap = iotBoardMapper.selectVideoCheckSelf(orgPath, new Date());
+        IotBoardTotalData.VideoInspection videoInspection = new IotBoardTotalData.VideoInspection();
+        videoCheckSelfMap.stream().filter(m -> ObjectUtil.equal("video", m.get(DEVICE_TYPE))).findAny().ifPresent(m -> videoInspection.setLostRate(m.get(MAP_VALUE) + "%"));
+        videoCheckSelfMap.stream().filter(m -> ObjectUtil.equal("disk", m.get(DEVICE_TYPE))).findAny().ifPresent(m -> videoInspection.setHardDiskExceptionRate(m.get(MAP_VALUE) + "%"));
+
+        //录像天数存储
+        List<Map<String, String>> videoCheckMap = iotBoardMapper.selectVideoDaysStorage(orgPath, new Date());
+        HashMap<Integer, Integer> hashMap = new HashMap<>();
+        for (Map<String, String> map : videoCheckMap) {
+            hashMap.put(Integer.parseInt(map.get("planDays")), Integer.parseInt(map.get(MAP_VALUE)));
+        }
+        IotBoardTotalData.RecordingStorage storage = new IotBoardTotalData.RecordingStorage();
+        storage.setHashmap(hashMap);
+        return totalData;
+    }
+
+
 }

+ 135 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/board/IotBoardTotalData.java

@@ -0,0 +1,135 @@
+package com.xunmei.iot.vo.board;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@SuperBuilder
+public class IotBoardTotalData {
+
+
+    @ApiModelProperty(value = "总告警数量")
+    private int totalAlerts;
+
+    @ApiModelProperty(value = "设备概览信息")
+    private DeviceOverview deviceOverview;
+
+    @ApiModelProperty(value = "录像文件自检信息")
+    private VideoInspection videoInspection;
+
+    @ApiModelProperty(value = "录像存储天数统计")
+    private RecordingStorage recordingStorage;
+
+    @ApiModelProperty(value = "视频画面诊断信息")
+    private VideoDiagnostic videoDiagnostic;
+
+    @ApiModelProperty(value = "空调设备信息")
+    private AirConditionerInfo airConditionerInfo;
+
+    @ApiModelProperty(value = "UPS设备信息")
+    private UpsInfo upsInfo;
+
+    @ApiModelProperty(value = "传感器详细信息列表")
+    private List<SensorData> sensorDetails;
+
+    @ApiModelProperty(value = "数据统计时间戳")
+    private Date dataTimestamp;
+
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class DeviceOverview {
+        @ApiModelProperty(value = "边缘计算主机数量")
+        private int edgeComputingHosts;
+        @ApiModelProperty(value = "物联网设备总数")
+        private int IotDevices;
+        @ApiModelProperty(value = "报警控制器数量")
+        private int alarmControllers;
+        @ApiModelProperty(value = "硬盘录像机数量")
+        private int hardDiskRecorders;
+        @ApiModelProperty(value = "摄像头数量")
+        private int cameras;
+        @ApiModelProperty(value = "硬盘数量")
+        private int hardDisks;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class VideoInspection {
+        @ApiModelProperty(value = "录像丢失率")
+        private String lostRate;
+        @ApiModelProperty(value = "硬盘异常率")
+        private String hardDiskExceptionRate;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordingStorage {
+        @ApiModelProperty(value = "录像存储x天以上占比",notes = "key:计划存储天数,value:存在丢失数量")
+       private Map<Integer,Integer> hashmap;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class VideoDiagnostic {
+        @ApiModelProperty(value = "单路录像丢失报警数量")
+        private int singleLostAlarmNums;
+        @ApiModelProperty(value = "遮挡报警数量")
+        private int occludeAlarmNums;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class AirConditionerInfo {
+        @ApiModelProperty(value = "空调设备总数")
+        private int totalDevices;
+        @ApiModelProperty(value = "链接异常设备数")
+        private int linkExceptions;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class UpsInfo {
+        @ApiModelProperty(value = "UPS设备总数")
+        private int totalDevices;
+        @ApiModelProperty(value = "通讯中断设备数")
+        private int communicationInterrupts;
+        @ApiModelProperty(value = "关机设备数")
+        private int shutdownDevices;
+        @ApiModelProperty(value = "历史告警总数")
+        private int historicalAlarmCounts;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @SuperBuilder
+    public static class SensorData {
+        @ApiModelProperty(value = "传感器类型")
+        private Integer type;
+        @ApiModelProperty(value = "设备数量")
+        private int deviceCount;
+        @ApiModelProperty(value = "历史告警总量")
+        private int historicalAlarmTotal;
+    }
+}

+ 24 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmDataMapper.xml

@@ -177,4 +177,28 @@
             a.`time` DESC,
             a.end_time DESC
     </select>
+
+    <select id="selectAlarmCount" resultType="java.util.Map">
+        select d.field_code as deviceType, count(1) as nums
+        from iot_alarm_data d
+                 inner join sys_org o on o.id = d.org_id
+        where o.deleted = 0
+          and (
+            (
+                #{beginTime}   <![CDATA[<=]]> d.time
+                    and now()       <![CDATA[>=]]> d.time
+                )
+                or
+            (
+                #{beginTime}   <![CDATA[<=]]> d.end_time
+                    and now()       <![CDATA[>=]]> d.end_time
+                )
+                or (
+                #{beginTime}   <![CDATA[>=]]> d.time
+                    and now()     <![CDATA[<=]]> d.end_time
+                )
+            )
+          and o.path like concat(#{orgPath}, '%')
+        group by d.field_code
+    </select>
 </mapper>

+ 100 - 38
soc-modules/soc-modules-iot/src/main/resources/mapper/IotBoardMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xunmei.iot.mapper.IotBoardMapper">
     <select id="device" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '主机设备'                AS `name`,
+        SELECT '主机设备'            AS `name`,
                count(0)              AS count,
                sum(dd.state IS NULL) AS unknown,
                sum(dd.state = 0)     AS normal,
@@ -11,30 +11,30 @@
         FROM iot_device d
                  LEFT JOIN iot_device_detection dd ON d.equipment_code = dd.equipment_code
         WHERE deleted = 0
-          and d.org_path like concat(#{orgPath}, "%")
+          and d.org_path like concat(#{orgPath}, '%')
     </select>
     <select id="subsystem" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '报警控制器'         AS `name`,
+        SELECT '报警控制器'    AS `name`,
                count(0)        AS count,
                sum(status = 0) AS exception,
                sum(status = 1) AS normal,
                sum(status = 2) AS unknown
         FROM iot_alarm_subsystem
         WHERE deleted = 0
-          and org_path like concat(#{orgPath}, "%")
+          and org_path like concat(#{orgPath}, '%')
     </select>
     <select id="sensor" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '传感器设备'             AS `name`,
+        SELECT '传感器设备'       AS `name`,
                count(0)           AS count,
                sum(state = 0)     AS normal,
                sum(state = 1)     AS exception,
                sum(state is null) AS unknown
         FROM iot_sensor
         WHERE deleted = 0
-          and org_path like concat(#{orgPath}, "%")
+          and org_path like concat(#{orgPath}, '%')
     </select>
     <select id="videoInterity" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '(昨日)录像完整性'                 AS `name`,
+        SELECT '(昨日)录像完整性'      AS `name`,
                count(0)                AS count,
                sum(vic.status = 0)     AS normal,
                sum(vic.status = 1)     AS other1,
@@ -44,10 +44,10 @@
                  LEFT JOIN mediator_video_integrity_check vic
                            on dc.host_code = vic.equipment_code and dc.channel_code = vic.channel_code
         WHERE dc.deleted = 0
-          and dc.org_path like concat(#{orgPath}, "%")
+          and dc.org_path like concat(#{orgPath}, '%')
     </select>
     <select id="videoDays" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '录像存储天数'                  AS `name`,
+        SELECT '录像存储天数'          AS `name`,
                count(0)                AS count,
                sum(vdc.status = 0)     AS normal,
                sum(vdc.status = 1)     AS exception,
@@ -56,10 +56,10 @@
                  LEFT JOIN mediator_video_days_check vdc
                            on dc.host_code = vdc.equipment_code and dc.channel_code = vdc.channel_code
         WHERE dc.deleted = 0
-          and dc.org_path like concat(#{orgPath}, "%")
+          and dc.org_path like concat(#{orgPath}, '%')
     </select>
     <select id="videoQuality" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT '(当前)录像质量'                    AS `name`,
+        SELECT '(当前)录像质量'          AS `name`,
                count(0)                  AS count,
                sum(vdr.is_alarm = 0)     AS normal,
                sum(vdr.is_alarm = 1)     AS exception,
@@ -68,35 +68,97 @@
                  LEFT JOIN mediator_video_diagnosis_record vdr
                            on dc.host_code = vdr.equipment_code and dc.channel_code = vdr.channel_code
         WHERE dc.deleted = 0
-          and dc.org_path like concat(#{orgPath}, "%")
+          and dc.org_path like concat(#{orgPath}, '%')
     </select>
     <select id="dvrDisk" resultType="com.xunmei.iot.vo.board.IotBoardOverviewItemVo">
-        SELECT
-            '录像机硬盘' AS `name`,
-            count( 0 ) AS count,
-            sum( dd.other1 ) AS other1,
-            sum( dd.normal ) AS normal,
-            sum( dd.exception ) AS exception,
-            sum( dd.unknown ) AS unknown
-        FROM
-            iot_device d
-                LEFT JOIN (
-                SELECT
-                    count( 0 ) AS other1,
-                    sum( state = 0 ) AS normal,
-                    sum( state = 1 ) AS exception,
-                    sum( state IS NULL ) AS unknown,
-                    host_code
-                FROM
-                    iot_dvr_disk
-                WHERE
-                    deleted = 0 and org_path like concat(#{orgPath}, "%")
-                GROUP BY
-                    host_code
-            ) dd ON d.equipment_code = dd.host_code
-        WHERE
-            d.category_id = 1
+        SELECT '录像机硬盘'      AS `name`,
+               count(0)          AS count,
+               sum(dd.other1)    AS other1,
+               sum(dd.normal)    AS normal,
+               sum(dd.exception) AS exception,
+               sum(dd.unknown)   AS unknown
+        FROM iot_device d
+                 LEFT JOIN (SELECT count(0)           AS other1,
+                                   sum(state = 0)     AS normal,
+                                   sum(state = 1)     AS exception,
+                                   sum(state IS NULL) AS unknown,
+                                   host_code
+                            FROM iot_dvr_disk
+                            WHERE deleted = 0
+                              and org_path like concat(#{orgPath}, '%')
+                            GROUP BY host_code) dd ON d.equipment_code = dd.host_code
+        WHERE d.category_id = 1
           AND d.deleted = 0
-          and d.org_path like concat(#{orgPath}, "%")
+          and d.org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="countDeviceNums" resultType="java.util.Map">
+        select category_id as categoryId, count(1) as nums
+        from iot_device d
+                 inner join sys_org o on o.id = d.org_id
+        where d.deleted = 0
+          and o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        group by category_id
+    </select>
+
+    <select id="countDeviceNums2" resultType="java.util.Map">
+        select 'sensor' as categoryId, count(1) as nums
+        from iot_sensor s
+                 inner join sys_org o on o.id = s.org_id
+        where s.deleted = 0
+          and o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        union all
+        select 'channel' as categoryId, count(1) as nums
+        from iot_dvr_channel c
+                 inner join sys_org o on o.id = c.org_id
+        where c.deleted = 0
+          and o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        union all
+        select 'disk' as categoryId, count(1) as nums
+        from iot_dvr_disk d
+                 inner join sys_org o on o.id = d.org_id
+        where d.deleted = 0
+          and o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="countSensorNums" resultType="java.util.Map">
+        select s.device_type as deviceType, count(1) as nums
+        from iot_sensor s
+                 inner join sys_org o on o.id = s.org_id
+        where o.deleted = 0
+          and s.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        group by s.device_type
+    </select>
+
+    <select id="selectVideoCheckSelf" resultType="java.util.Map">
+        select 'video' as deviceType,
+               ROUND(CAST(SUM(IF(c.lose_span LIKE '%et%', 1, 0)) AS FLOAT) / COUNT(1), 2) *
+               100     as nums
+        from mediator_video_integrity_check c
+                 inner join sys_org o on o.id = c.org_id
+        where o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        union all
+        select 'disk'                                                               as deviceType,
+               ROUND(CAST(SUM(IF(d.state = 1, 1, 0)) AS FLOAT) / COUNT(1), 2) * 100 as nums
+        from iot_dvr_disk d
+                 inner join sys_org o on o.id = d.org_id
+        where o.deleted = 0
+          and d.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="selectVideoDaysStorage" resultType="java.util.Map">
+        select c.plan_days as planDays, sum(c.plan_days != c.real_days) as nums
+        from mediator_video_days_check c
+                 inner join sys_org o on o.id = c.org_id
+        where o.deleted = 0
+          and org_path like concat(#{orgPath}, '%')
+        group by c.plan_days
     </select>
 </mapper>