Kaynağa Gözat

实现录像诊断页面

jiawuxian 1 yıl önce
ebeveyn
işleme
ce50c01f8d

+ 3 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/video/MediatorVideoDiagnosisRecord.java

@@ -114,5 +114,7 @@ public class MediatorVideoDiagnosisRecord extends BaseEntity implements Serializ
     @TableField("detail_info")
     private String detailInfo;
 
-
+    @ApiModelProperty(value = "诊断图片")
+    @TableField("img_url")
+    private String imgUrl;
 }

+ 94 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/video/MediatorVideoIntegrityCheckNewest.java

@@ -0,0 +1,94 @@
+package com.xunmei.common.core.domain.video;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 录像机完整性检查表
+ * </p>
+ *
+ * @author oygj
+ * @since 2024-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("mediator_video_integrity_check_newest")
+@ApiModel(value = "VideoIntegrityCheck对象", description = "录像机完整性最后一次检查表")
+public class MediatorVideoIntegrityCheckNewest extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "机构")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构")
+    @TableField("org_path")
+    private String orgPath;
+
+    @ApiModelProperty(value = "通道序号")
+    @TableField("channel_code")
+    private String channelCode;
+
+    @ApiModelProperty(value = "通道的名称")
+    @TableField("channel_name")
+    private String channelName;
+
+    @ApiModelProperty(value = "检查日期录像计划规则集合")
+    @TableField("check_span")
+    private String checkSpan;
+
+    @ApiModelProperty(value = "录像机唯一标识")
+    @TableField("equipment_code")
+    private String equipmentCode;
+
+    @ApiModelProperty(value = "检查日期录像丢失情况集合")
+    @TableField("lose_span")
+    private String loseSpan;
+
+    @ApiModelProperty(value = "丢失时长,分钟")
+    @TableField("lose_duration")
+    private Integer loseDuration;
+
+    @ApiModelProperty(value = "录像情况检查日期")
+    @TableField("record_date")
+    private LocalDate recordDate;
+
+    @ApiModelProperty(value = "设备名称")
+    @TableField("device_name")
+    private String deviceName;
+
+    @ApiModelProperty(value = "0:正常 1:部分丢失 2:全部丢失")
+    @TableField("status")
+    private Integer status;
+
+    @TableField("equipment_name")
+    private String equipmentName;
+
+    @ApiModelProperty(value = "录像计划存储多少天")
+    @TableField("plan_days")
+    private Integer planDays;
+
+    @ApiModelProperty(value = "录像机唯一标识")
+    @TableField("lose_span_old")
+    private String loseSpanOld;
+
+
+}

+ 15 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/VideoIntegrityStatus.java

@@ -0,0 +1,15 @@
+package com.xunmei.common.core.enums.iot;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum VideoIntegrityStatus {
+    Full(0, "正常"),
+    PartialLoss(1, "部分丢失"),
+    AllLoss(2, "全部丢失");
+
+    private final Integer id;
+    private final String name;
+}

+ 8 - 2
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/videoDiagnosis/VideoDiagnosisWebPageDto.java

@@ -12,6 +12,12 @@ public class VideoDiagnosisWebPageDto extends PageDto {
     @ApiModelProperty(value = "通道")
     private String channelName;
 
-    @ApiModelProperty(value = "状态")
-    private Integer state;
+    @ApiModelProperty(value = "录像完整性状态")
+    private Integer integrityState;
+
+    @ApiModelProperty(value = "录像存储天数状态")
+    private Integer daysState;
+
+    @ApiModelProperty(value = "视频诊断状态")
+    private Integer diagnosisState;
 }

+ 4 - 3
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotDvrChannelMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.domain.iot.domain.IotDvrChannel;
 import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
+import com.xunmei.common.core.domain.video.MediatorVideoIntegrityCheck;
 import com.xunmei.iot.dto.dvrDisk.DvrDiskAlarmHistoryPageDto;
 import com.xunmei.iot.dto.dvrDisk.DvrDiskPageDto;
 import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisWebPageDto;
@@ -11,6 +12,7 @@ import com.xunmei.iot.vo.dvrDisk.DvrDiskAlarmHistoryPageVo;
 import com.xunmei.iot.vo.dvrDisk.DvrDiskPageVo;
 import com.xunmei.iot.vo.dvrDisk.DvrDiskStatisticVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
+import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -22,10 +24,9 @@ import org.apache.ibatis.annotations.Param;
  * @since 2024-02-20
  */
 public interface IotDvrChannelMapper extends BaseMapper<IotDvrChannel> {
-
-    Page<VideoDiagnosisWebPageVo>  selectPage(@Param("page") Page<DvrDiskPageVo> page,
+    Page<VideoDiagnosisWebPageVo>  selectPage(@Param("page") Page<VideoDiagnosisWebPageVo> page,
                                                   @Param("pageDto") VideoDiagnosisWebPageDto pageDto,
                                                   @Param("orgPath") String orgPath);
 
-    DvrDiskStatisticVo diskStatistic(@Param("pageDto") DvrDiskPageDto request,@Param("orgPath") String orgPath);
+    VideoDiagnosisWebVo diagnosisDetail(@Param("hostCode") String hostCode,@Param("channelCode") String channelCode);
 }

+ 70 - 3
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/VideoDiagnosisServiceImpl.java

@@ -1,24 +1,91 @@
 package com.xunmei.iot.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.iot.domain.IotDvrChannel;
+import com.xunmei.common.core.domain.video.MediatorVideoIntegrityCheck;
+import com.xunmei.common.core.enums.iot.VideoIntegrityStatus;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisWebPageDto;
 import com.xunmei.iot.mapper.IotDvrChannelMapper;
+import com.xunmei.iot.mapper.VideoIntegrityCheckMapper;
 import com.xunmei.iot.service.VideoDiagnosisService;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
+import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysOrg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.validation.constraints.AssertFalse;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 @Service
 public class VideoDiagnosisServiceImpl extends ServiceImpl<IotDvrChannelMapper, IotDvrChannel> implements VideoDiagnosisService {
+    @Autowired
+    private RemoteOrgService orgService;
+
+    @Autowired
+    VideoIntegrityCheckMapper videoIntegrityCheckMapper;
+
     @Override
     public TableDataInfo<VideoDiagnosisWebPageVo> getPageData(VideoDiagnosisWebPageDto request) {
-        return null;
+        String orgPath = "";
+        if (request.getCheckSub()) {
+            SysOrg org = orgService.selectOrgById(request.getOrgId(), SecurityConstants.INNER);
+            orgPath = org.getPath();
+        }
+        Page<VideoDiagnosisWebPageVo> page = request.toPage();
+        page = baseMapper.selectPage(page, request, orgPath);
+
+        return TableDataInfo.success(page);
     }
 
     @Override
-    public VideoDiagnosisWebVo getDetail(String equipmentCode, String channelCode) {
-        return null;
+    public VideoDiagnosisWebVo getDetail(String hostCode, String channelCode) {
+        VideoDiagnosisWebVo vo = baseMapper.diagnosisDetail(hostCode, channelCode);
+        if (ObjectUtil.isNotNull(vo) && ObjectUtil.isNotNull(vo.getStorage()) && ObjectUtil.isNotNull(vo.getStorage().getEarliestTime())) {
+            LambdaQueryWrapper<MediatorVideoIntegrityCheck> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(MediatorVideoIntegrityCheck::getEquipmentCode, hostCode)
+                    .eq(MediatorVideoIntegrityCheck::getChannelCode, channelCode)
+                    .le(MediatorVideoIntegrityCheck::getRecordDate, vo.getStorage().getEarliestTime())
+                    .select(MediatorVideoIntegrityCheck::getRecordDate, MediatorVideoIntegrityCheck::getStatus);
+            Map<Integer, List<MediatorVideoIntegrityCheck>> days = videoIntegrityCheckMapper.selectList(wrapper)
+                    .stream().collect(Collectors.groupingBy(d -> d.getStatus()));
+
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            if (days.containsKey(VideoIntegrityStatus.Full.getId())) {
+                vo.getStorage().setFullDates(days.get(VideoIntegrityStatus.Full.getId())
+                        .stream().map(d -> d.getRecordDate().format(dtf))
+                        .collect(Collectors.toList()));
+            } else {
+                vo.getStorage().setFullDates(new ArrayList<>());
+            }
+
+            if (days.containsKey(VideoIntegrityStatus.PartialLoss.getId())) {
+                vo.getStorage().setPartialLossDates(days.get(VideoIntegrityStatus.PartialLoss.getId())
+                        .stream().map(d -> d.getRecordDate().format(dtf))
+                        .collect(Collectors.toList()));
+            } else {
+                vo.getStorage().setPartialLossDates(new ArrayList<>());
+            }
+
+            if (days.containsKey(VideoIntegrityStatus.AllLoss.getId())) {
+                vo.getStorage().setAllLostDates(days.get(VideoIntegrityStatus.AllLoss.getId())
+                        .stream().map(d -> d.getRecordDate().format(dtf))
+                        .collect(Collectors.toList()));
+            } else {
+                vo.getStorage().setAllLostDates(new ArrayList<>());
+            }
+        }
+
+        return vo;
     }
 }

+ 4 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisIntegrityVo.java

@@ -4,6 +4,7 @@ import java.util.Date;
 import java.util.List;
 
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 
 /**
@@ -21,6 +22,9 @@ public class VideoDiagnosisIntegrityVo {
 
     private Date updateTime;
 
+    @JsonIgnore
+    private String lostSpan;
+
     private List<TimeRange> losts;
 
     public void setLosts(String info) {

+ 1 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisQualityVo.java

@@ -29,7 +29,7 @@ public class VideoDiagnosisQualityVo {
     @ApiModelProperty("偏色")
     private int colorCast;
 
-    @ApiModelProperty("老奸巨猾")
+    @ApiModelProperty("雪花")
     private int snowflake;
 
     @ApiModelProperty("条纹")

+ 12 - 5
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisStorageVo.java

@@ -3,6 +3,8 @@ package com.xunmei.iot.vo.videoDiagnosis;
 import java.util.Date;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -10,11 +12,16 @@ import lombok.Data;
  */
 @Data
 public class VideoDiagnosisStorageVo {
+    @ApiModelProperty("计划天数")
     private Integer planDays;
-
+    @ApiModelProperty("实际天数")
     private  Integer realDays;
-
-    private Date earliestDate;
-
-    private List<String> lostDate;
+    @ApiModelProperty("最早录像时间")
+    private Date earliestTime;
+    @ApiModelProperty("录像完整日期")
+    private List<String> fullDates;
+    @ApiModelProperty("部分丢失日期")
+    private List<String> partialLossDates;
+    @ApiModelProperty("全部丢失")
+    private List<String> allLostDates;
 }

+ 73 - 94
soc-modules/soc-modules-iot/src/main/resources/mapper/IotDvrChannelMapper.xml

@@ -1,29 +1,38 @@
 <?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.IotDvrChannelMapper">
-    <resultMap id="alarmHostStatusMap" type="com.xunmei.iot.vo.dvrDisk.DvrDiskPageVo">
-        <result column="id" property="id"/>
-        <result column="equipmentCode" property="equipmentCode"/>
-        <result column="equipmentName" property="equipmentName"/>
-        <result column="ip" property="ip"/>
-        <result column="orgId" property="orgId"/>
-        <result column="orgName" property="orgName"/>
-        <result column="status" property="status"/>
-        <result column="alarmTime" property="alarmTime"/>
-        <result column="detailInfo" property="detailInfo"
-                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
-        <collection property="diskInfos" column="equipmentCode=equipmentCode"
-                    select="selectDiskInfo">
-            <result column="id" property="id"/>
-            <result column="available" property="available"/>
-            <result column="diskSerialNum" property="diskSerialNum"/>
-            <result column="total" property="total"/>
-            <result column="hostCode" property="hostCode"/>
-            <result column="orgId" property="orgId"/>
-        </collection>
+    <resultMap id="diagnosisDetailMap" type="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo">
+        <result column="hostName" property="hostName"></result>
+        <result column="channelName" property="channelName"></result>
+        <result column="channelIp" property="channelIp"></result>
+        <association property="quality" javaType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisQualityVo">
+            <result column="quality_update_time" property="updateTime"></result>
+            <result column="quality_signal_lost" property="signalLost"></result>
+            <result column="quality_occlude" property="occlude"></result>
+            <result column="quality_brightness" property="brightness"></result>
+            <result column="quality_colorCast" property="colorCast"></result>
+            <result column="quality_snowflake" property="snowflake"></result>
+            <result column="quality_stripe" property="stripe"></result>
+            <result column="quality_contrast" property="contrast"></result>
+            <result column="quality_blurry" property="blurry"></result>
+            <result column="quality_image" property="image"></result>
+        </association>
+        <association property="integrity" javaType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisIntegrityVo">
+            <result column="integrity_record_date" property="recordDate"></result>
+            <result column="integrity_lost_duration" property="lostDuration"></result>
+            <result column="integrity_lost_span" property="lostSpan"></result>
+            <result column="integrity_update_time" property="updateTime"></result>
+        </association>
+        <association property="storage" javaType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisStorageVo">
+            <result column="storage_plan_days" property="planDays"></result>
+            <result column="storage_real_days" property="realDays"></result>
+            <result column="storage_earliest_video_time" property="earliestTime"></result>
+            <result column="storage_lose_date_str" property="lostDateStr"></result>
+        </association>
     </resultMap>
-    <select id="selectPage" resultType="alarmHostStatusMap">
+    <select id="selectPage" resultType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo">
         SELECT
+        c.id,
         c.host_code,
         c.channel_code,
         c.org_name,
@@ -35,11 +44,14 @@
         vdr.signal_lost,
         vdr.occlude,
         if(vdr.brightness+vdr.color_cast+vdr.snowflake+vdr.stripe+vdr.contrast+vdr.blurry>1,1,0) as quality
-        from  iot_dvr_channel c
+        from iot_dvr_channel c
         INNER JOIN iot_device d on c.host_code=d.equipment_code
         left JOIN mediator_video_days_check vdc on c.host_code=vdc.equipment_code and c.channel_code=vdc.channel_code
-        left JOIN mediator_video_integrity_check vic on c.host_code=vic.equipment_code and c.channel_code=vic.channel_code
-        left JOIN mediator_video_diagnosis_record vdr on c.host_code=vdr.equipment_code and c.channel_code=vdr.channel_code
+        left JOIN mediator_video_integrity_check_newest vic on c.host_code=vic.equipment_code and
+        c.channel_code=vic.channel_code
+        left JOIN mediator_video_diagnosis_record vdr on c.host_code=vdr.equipment_code and
+        c.channel_code=vdr.channel_code
+        where c.deleted=0 and d.deleted=0
         <if test="pageDto.checkSub==true">
             and c.org_path like concat(#{orgPath},"%")
         </if>
@@ -52,81 +64,48 @@
         <if test="pageDto.channelName!=null and pageDto.channelName!=''">
             and d.channel_name like concat('%', #{pageDto.channelName},'%')
         </if>
-        <if test="pageDto.status !=null">
-            and dhd.`status` = #{pageDto.status}
+        <if test="pageDto.integrityState!=null">
+            and vic.status=#{pageDto.integrityState}
         </if>
-        <if test="pageDto.alarmStartTime !=null">
-            and dhd.alarm_time >= #{pageDto.alarmStartTime}
+        <if test="pageDto.daysState!=null">
+            and vdc.status=#{pageDto.daysState}
         </if>
-        <if test="pageDto.alarmEndTime !=null">
-            and #{pageDto.alarmEndTime}>= dhd.`alarm_time`
+        <if test="pageDto.diagnosisState!=null">
+            and vdr.is_alarm=#{pageDto.diagnosisState}
         </if>
-        and d.deleted=0
+<!--        <if test="pageDto.status !=null">-->
+<!--            and dhd.`status` = #{pageDto.status}-->
+<!--        </if>-->
     </select>
 
-    <select id="selectDiskInfo" resultType="com.xunmei.common.core.domain.iot.domain.IotDvrDisk">
-        select id,
-               available,
-               `disk_serial_num` as diskSerialNum,
-               `str_name`        as `strName`,
-               `total`,
-               `host_code`       as `hostCode`,
-               `org_id`          as `orgId`
-        from iot_dvr_disk
-        where host_code = #{equipmentCode}
-    </select>
-    <select id="getRecordAlarmHistoryList"
-            resultType="com.xunmei.iot.vo.dvrDisk.DvrDiskAlarmHistoryPageVo">
+    <select id="diagnosisDetail" resultMap="diagnosisDetailMap">
         SELECT
-        r.id,
-        r.org_id AS orgId,
-        r.org_name AS orgName,
-        r.device_name AS deviceName,
-        r.alarm_status as status,
-        r.alarm_type AS alarmType,
-        r.alarm_start_time AS alarmStartTime,
-        r.alarm_end_time AS alarmEndTime,
-        r.alarm_detail as alarmDetail
-        FROM
-        t_host_alarm_record r
-        where r.device_type=3713671510851584 AND r.assets_type=3713670431768576
-
-        <if test="pageDto.deviceId != null">
-            and r.device_id = #{pageDto.deviceId}
-        </if>
-        <if test="pageDto.status != null">
-            and r.alarm_status = #{pageDto.status}
-        </if>
-        <if test="pageDto.diskName != null">
-            and r.alarm_detail like concat('%"',#{pageDto.diskName},'"%')
-        </if>
-        <if test="pageDto.alarmCode != null">
-            and r.alarm_code= #{pageDto.alarmCode}
-        </if>
-
-        <if test="pageDto.alarmStartTime != null and pageDto.alarmEndTime != null">
-            and ((r.alarm_start_time is not null and r.alarm_end_time is not null and
-            r.alarm_end_time>=#{pageDto.alarmStartTime} and #{pageDto.alarmEndTime}>=r.alarm_start_time)
-            or (r.alarm_end_time is null and r.alarm_start_time>= #{pageDto.alarmStartTime} and #{pageDto.alarmEndTime}>=r.alarm_start_time )
-            or (r.alarm_start_time is null and r.alarm_end_time>= #{pageDto.alarmStartTime} and #{pageDto.alarmEndTime}>=r.alarm_end_time)
-            )
-        </if>
-        order by r.alarm_start_time desc
+            d.equipment_name as hostName,
+            c.channel_name as channelName,
+            c.channel_addr as channelIp,
+            vdr.update_time as quality_update_time,
+            vdr.signal_lost as quality_signal_lost,
+            vdr.occlude as quality_occlude,
+            vdr.brightness as quality_brightness,
+            vdr.color_cast as quality_colorCast,
+            vdr.snowflake as quality_snowflake,
+            vdr.stripe as quality_stripe,
+            vdr.contrast as quality_contrast,
+            vdr.blurry as quality_blurry,
+            vdr.img_url as quality_image,
+            vic.record_date as integrity_record_date,
+            vic.lose_duration as integrity_lost_duration,
+            vic.lose_span as integrity_lost_span,
+            vic.update_time as integrity_update_time,
+            vdc.plan_days as storage_plan_days,
+            vdc.real_days as storage_real_days,
+            vdc.earliest_video_time as storage_earliest_video_time,
+            vdc.lose_date as storage_lose_date_str
+        FROM iot_dvr_channel c
+                 INNER JOIN iot_device d ON c.host_code = d.equipment_code
+                 LEFT JOIN mediator_video_days_check vdc ON c.host_code = vdc.equipment_code	AND c.channel_code = vdc.channel_code
+                 LEFT JOIN mediator_video_integrity_check_newest vic ON c.host_code = vic.equipment_code	AND c.channel_code = vic.channel_code
+                 LEFT JOIN mediator_video_diagnosis_record vdr ON c.host_code = vdr.equipment_code AND c.channel_code = vdr.channel_code
+     	WHERE c.host_code=#{hostCode} and c.channel_code=#{channelCode}
     </select>
-
-    <select id="diskStatistic" resultType="com.xunmei.iot.vo.dvrDisk.DvrDiskStatisticVo">
-        SELECT count(0) AS dvrTotal,
-               SUM(DD.count) AS diskTotal,
-               SUM(dd.exceptionCount) as diskExceptionCount
-        FROM iot_device d
-        LEFT JOIN (SELECT equipment_code,count(0) as count,SUM(if(state=1,1,0)) as exceptionCount from iot_dvr_disk WHERE deleted=0 )  dd on d.equipment_code =dd.equipment_code
-        where  d.deleted=0 and d.category_id=#{pageDto.categoryId}
-        <if test="pageDto.checkSub==true">
-            and d.org_path like concat(#{orgPath},"%")
-        </if>
-        <if test="pageDto.checkSub==false">
-            and d.org_id = #{request.orgId}
-        </if>
-    </select>
-
 </mapper>