Kaynağa Gözat

Merge remote-tracking branch 'origin/V0.0.6-iot' into V0.0.6-iot

jingyuanchao 1 yıl önce
ebeveyn
işleme
d70df9c17d
33 değiştirilmiş dosya ile 1082 ekleme ve 193 silme
  1. 8 0
      project_data/sql/0.0.6-iot/soc/soc.sql
  2. 16 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/DeviceSourceEnum.java
  3. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/mapper/ProtectionMapper.java
  4. 21 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ProtectionServiceImpl.java
  5. 11 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/vo/protection/SubSystemAppDetailVo.java
  6. 117 112
      soc-modules/soc-modules-core/src/main/resources/mapper/device/ProtectionMapper.xml
  7. 1 2
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/DvrDiskController.java
  8. 63 2
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotAlarmRuleSourceController.java
  9. 25 12
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/VideoDiagnosisController.java
  10. 22 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceBatchJoin.java
  11. 32 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceDto.java
  12. 21 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceRuleDto.java
  13. 25 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/videoDiagnosis/VideoDiagnosisAppPageDto.java
  14. 63 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/AlarmRuleExpressOperateEnum.java
  15. 53 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ProductTypeEnum.java
  16. 47 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ValueTypeEnum.java
  17. 19 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotAlarmRuleSourceMapper.java
  18. 8 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotCommonSensorMapper.java
  19. 11 5
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotDvrChannelMapper.java
  20. 37 1
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotAlarmRuleSourceService.java
  21. 6 6
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/VideoDiagnosisService.java
  22. 171 13
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotAlarmRuleSourceServiceImpl.java
  23. 47 3
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/VideoDiagnosisServiceImpl.java
  24. 17 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceRuleVo.java
  25. 27 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceVo.java
  26. 1 1
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/dvrDisk/DvrDiskPageVo.java
  27. 10 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisAppPageChannelVo.java
  28. 19 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisAppPageVo.java
  29. 2 0
      soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisStorageVo.java
  30. 5 4
      soc-modules/soc-modules-iot/src/main/resources/mapper/DvrDiskMapper.xml
  31. 44 0
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmRuleSourceMapper.xml
  32. 114 30
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotDvrChannelMapper.xml
  33. 16 0
      soc-modules/soc-modules-iot/src/main/resources/mapper/IotSensorMapper.xml

+ 8 - 0
project_data/sql/0.0.6-iot/soc/soc.sql

@@ -796,5 +796,13 @@ INSERT INTO `sys_dict_data` ( `dict_sort`, `dict_label`, `dict_value`, `dict_typ
 INSERT INTO `sys_dict_data` (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 0, '正常', '0', 'video_diagnosis_state', NULL, 'default', 'N', '0', '超级管理员', '2024-02-22 18:04:49', '', NULL, NULL);
 INSERT INTO `sys_dict_data` (`dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 1, '异常', '1', 'video_diagnosis_state', NULL, 'default', 'N', '0', '超级管理员', '2024-02-22 18:04:57', '', NULL, NULL);
 
+DELETE from `sys_menu` where id in (01747911340288892930,01762681378201595906,01762681622628855809,01762681985838804994);
+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 (01747911340288892930, '物联感知', 0, 27, 'iot', NULL, NULL, 1, 0, 'M', '0', '0', '', '1', 'job', NULL, '超级管理员', '2024-01-18 17:18:32', '超级管理员', '2024-02-01 09:34:05', '');
+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 (01762681378201595906, '录像诊断', 1726900357129232386, 13, '/iot/videoDiagnosis', NULL, NULL, 1, 0, 'C', '0', '0', 'appiot:videoDiagnosis', '0', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABBCAYAAACO98lFAAAACXBIWXMAAAsSAAALEgHS3X78AAACD0lEQVR4nO2by1HDMBCGfxjuoQMyowKgA+CqU0pIB8lBd8JdM4QKCB3gi87pgFCAZkIHUEEYZWXGhDxkm8Gxd79b/FDkL7urSBqfrFYrcOeUuwCIBIK9BIgEgr0EiASCvQSIBIK9BIgEgr0EiASCvYTAWfGDcqYPoN9cd0qz8Np+1G3keyqtnJkCGP33U/wBj17bcZ1m1unQYgGBkXJmUqeBvCa0VUBO/UjoAL2yjxDqn3Jmjs3CyAHlzHmMnLv8cVlJUM4MAYT6cVE8fgwSMgDTPefDLzerEvI5ypmr+B3X2843LSHz2g4OXaScuQHwWrbxGPqTQ4W/6cK4SLnIa5t0XRHlTMj7ZcrI17SEcQzVvShnZqkNhqhRzgRpD6kp1HQ6hE7OY6d3EUL6MqWxWPieynbiGApjb1fBqkCleQ/7WSREAsFeAkQCwV4CRALBXgJEAsFeAkQCwV4CRALBXgI6KCGsHr+XvalTEry2QUJYpLkH8Jl6X+fSIexNem0nUUaWck9na4LXdhkXcW8PpUjnC2NIEa9tf1+KsBkdYooEGc+b51gNkbFeDGOKvOXH2e1FojCKxNXpzkRC8nBYxGu73s/I0+FXnrSM5M2ZbeQSxsUcaRlZ3G+szI/Xf5Qzg/gnoy28VNmn3IT9O1CQWSTBXgJEAsFeAkQCwV4CRALBXgJEAsFeAkQCwV4CAHwBGKFz+db+wtQAAAAASUVORK5CYII=', NULL, '超级管理员', '2024-02-28 11:30:41', '超级管理员', '2024-02-28 11:38:43', '');
+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 (01762681622628855809, '硬盘诊断', 1726900357129232386, 14, '/iot/dvrDisk', NULL, NULL, 1, 0, 'C', '0', '0', 'appiot:dvrDisk', '0', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABBCAYAAACO98lFAAAACXBIWXMAAAsSAAALEgHS3X78AAACmElEQVR4nO2ZMXLbMBBFfzzp5YqtfQM5N1BOYKVg75ZVnBNER3DHVj2b3CDJCaIj2C0bKydQBlyAYSRQHiwWznh2f49v6nkB7F+8OxwO0K4L7QBgEEjqIcAgkNRDgEEgqYcAg0BSDwEGgaQeAgwC6f1r/JGqa+8APABYJCz7DWDT181DwU8bVDxFVl27AvA9w+JLaRCvsR3u//P6F1W0EqquvQTwLGD1oa+bnYBPVKUrYS3kcyfkE9VbgSDlE1Wx7SC4FYKKbYmSlXAj7LcS9htVEsIjgCchr58AtkJeJ1I/bYa1zST1EGAQSOohICdF+j7AdXKXiUu3fd08nvFdMa7DvffdJ64bxL4dqq51jcuStRj42NfNj4inS4ufmZ4uel9zQLC2Q9W16wwAiGUBX1lcAPCzClbG4J4Jub382v9oSU+8NQiLiIdEW7ysuvY6dVEyhKprbxLHZHM6HpZIJcVkmJxKkMr2Sw803AgSYMGByYEgme2Dl+TQ5DZ1AQdCal9wTuGaFJ0TRA7ds+I0SyuhatiFXsFNk6uudfd78qE245vUK6iP0rDsQFIPAQaB9M/B6DPBlvFmeN/XzewMMOMt8iVfTuA68R0PRt9u7jKaluhI3DdEv5ieTp/6uvkW8d0A+CrhO90Om8yuba7hyX1L3JT2nULIDTBzvUNuT3ESivy2zW2zl6GpGiD4kr3KNL3yHzdKMGyVSJyjb6iEUg+nUpng+EeLvnFKQ7g9Kl2p/9gYioSqNmj4vgv/0TmjsmOt8fe2EfOdbDXJFLtwvq4SJELLVCG8SPuGZCj90Et9gh9qSGg/7RVK+PoTXQrE4Ks+RcKyA0k9BBgEknoIMAgk9RBgEEjqIcAgkNRDgEEgqYcAgwAAwB8jC71/k/cB6QAAAABJRU5ErkJggg==', NULL, '超级管理员', '2024-02-28 11:31:39', '超级管理员', '2024-02-28 11:41:48', '');
+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 (01762681985838804994, '动环诊断', 1726900357129232386, 15, '/iot/donghuang', NULL, NULL, 1, 0, 'C', '0', '0', 'appiot:donghuang', '0', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAMKADAAQAAAABAAAAMAAAAAD4/042AAADa0lEQVRoBe1Z3Z3SQBCfCbxLB2IHWIFYgViBXAVyDchKA8dVQK4Czwo8KzitAOwA3yXjf5KsrHu7ScA7CP7ggd2dne+vTTZM5U/MuJ8JTbEcEXHPwts1yhr63CZMH9mkK9WN9e+XGY9ZeKHzU/kJy0XXpCmXnr9vr9djLpU1IvGym2VsEIeWpkxMeYVzL8vIJMTypgqt1XvQPTlk6ojQZ81dEvr5OI7hHgw43K+TyEQLL0mkr8Y8huTDGSCybX0mXXdni1HC8hrR+PEvhuxmAJRQofDe152EImWShOY+DXr5HaIxIPD195queTO9kEbIuRLSh1A9TAjtd4gOlqKDPa+jtz27Cg/8BpuM58z0qgrP32tsQEyJ/BAsWnHYEKHvndli4AuOrTdmPKGC37MYjgtvlkJQQovPJbRzhUPBPtrxZai7IEUmFrfJ2DHpXNOqaZE3MqCJEqXgfp7Ptk0K3Wie+4rr6e/D3DVoVmWRv60r8loD1BMhJVyBdg68dWeWGhgMQ+gGo7F77rgRWmym46XWkQv35+B3q9GAU679PbuurQF0nRfqEUugIwT3MAyaGubS5jkufGVhQnLXYbrwZdh9O0LmKBP+ZNd2rI4ALA8xxjPIBMy+wItXpTGWX+UIXI3M1EVi4iF4Let4oeONXDo7jxtQ9G5jEe2YK8FcKsEwhO4BG9r9qlFTJ/7okvNabj6M3/s8wH+Adv3Oh+s6bgDyF95f+0SFEi6U8SJUHw0oMVJvu5QP53iRYp779QGZf1LOpwnXAI73vDV62OppVdYDO0tZ4Rld8/nOAeY1g0gt4953sbdzrQ8STnG4pVvo37NwBFgeFIuSQQmkQNUvHI3q1Inz04hVKa+U4QjkPOUbvHlpvYncNAjvNC7O3ymiAWgPUQs6xKfYZ11hQMGubHPXhff3ednXF/F96JqZ061DK9ocDevw4vtPp7zKDNdAXJvW7ZwNOHZITj4Cx3bgWf7Je6D2IGu7hSdfxGcDjp1i5wgcOwLRp9H84vUJtYu92cXkxvCjBtgXmaeyAXeyQdYxuTH8cw0E3XhA4DkCB3R2UNR/8Cxkr8KD9rUcqNefUPG25WpWqYfrd73DP8Uo5JfPYhIcHCvZ8TNQlUsOsgflVWfVPW+j+p1LP2ToV5VWR0MzpfjyM7Df7H4D/jCNsP/6NKgAAAAASUVORK5CYII=', NULL, '超级管理员', '2024-02-28 11:33:06', '超级管理员', '2024-02-28 11:40:18', '');
+
+
 
 update sys_menu set component ='iot/subSystem/index',parent_id=1747911340288892930 WHERE menu_name='布撤防情况跟踪' and platform_type=1;
+UPDATE sys_menu set path='/iot/subsystem' WHERE path='/protection' and platform_type=0;

+ 16 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/iot/DeviceSourceEnum.java

@@ -0,0 +1,16 @@
+package com.xunmei.common.core.enums.iot;
+
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+/**
+ * 设备来源
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+public enum DeviceSourceEnum {
+    ManualRegister("设备登记"),
+    IOT("人工");
+
+    private String text;
+}

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/mapper/ProtectionMapper.java

@@ -19,6 +19,9 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface ProtectionMapper extends BaseMapper<IotAlarmSubsystem> {
     Page<ProtectionPageVo> pageList(@Param("page") Page<ProtectionPageVo> page, @Param("request") ProtectionPageDto request);
+
+
+    String getHostName(String hostCode);
 //    MePage<pageSensorVo> pageSensorList(@Param("mePage") MePage<pageSensorVo> mePage, @Param("request") pageSensorDto request);
 //
 //    MePage<ProtectionPageVo4Mybatis> pageByMybatis(@Param("request") ProtectionPageDto4Mybatis request, MePage<ProtectionPageVo4Mybatis> mePage);

+ 21 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ProtectionServiceImpl.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.panel.dto.PanelListDto;
 import com.xunmei.common.core.domain.panel.vo.PanelListVo;
+import com.xunmei.common.core.enums.iot.DeviceSourceEnum;
 import com.xunmei.common.core.utils.bean.BeanUtils;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.security.utils.SecurityUtils;
@@ -28,7 +29,10 @@ import com.xunmei.core.resumption.mapper.ProtectionMapper;
 import com.xunmei.core.resumption.service.IProtectionService;
 import com.xunmei.core.resumption.vo.protection.ProtectionLogPageVo;
 import com.xunmei.core.resumption.vo.protection.ProtectionPageVo;
+import com.xunmei.core.resumption.vo.protection.SubSystemAppDetailVo;
+import com.xunmei.system.api.RemoteDeviceService;
 import com.xunmei.system.api.RemoteDictDataService;
+import com.xunmei.system.api.domain.SysDevice;
 import com.xunmei.system.api.domain.SysDictData;
 import com.xunmei.system.api.enums.ProtectionStatus;
 import com.xunmei.system.api.vo.ProtectionVO;
@@ -60,6 +64,10 @@ public class ProtectionServiceImpl extends ServiceImpl<ProtectionMapper, IotAlar
     @Resource
     private RemoteDictDataService remoteDictDataService;
 
+    @Resource
+    RemoteDeviceService remoteDeviceService;
+
+
     @Override
     public TableDataInfo pageList(ProtectionPageDto request) {
         if (ObjectUtil.isNull(request.getOrgId())) {
@@ -93,7 +101,18 @@ public class ProtectionServiceImpl extends ServiceImpl<ProtectionMapper, IotAlar
 
     @Override
     public IotAlarmSubsystem get(Long id) {
-        return this.getById(id);
+        IotAlarmSubsystem e = this.getById(id);
+        SubSystemAppDetailVo vo = new SubSystemAppDetailVo();
+        BeanUtils.copyProperties(e, vo);
+        if (ObjectUtil.equal(e.getSource(), DeviceSourceEnum.IOT.ordinal())) {
+            vo.setHostName(baseMapper.getHostName(e.getAlarmHostCode()));
+        } else {
+            SysDevice host = remoteDeviceService.getInfoById(e.getDeviceId(), SecurityConstants.INNER);
+            if (ObjectUtil.isNotNull(host)) {
+                vo.setHostName(host.getDeviceName());
+            }
+        }
+        return vo;
     }
 
     @Override
@@ -177,7 +196,7 @@ public class ProtectionServiceImpl extends ServiceImpl<ProtectionMapper, IotAlar
         int count = baseMapper.update(null, new LambdaUpdateWrapper<IotAlarmSubsystem>()
                 .eq(IotAlarmSubsystem::getId, updateDto.getId())
                 .set(IotAlarmSubsystem::getStatus, updateDto.getState())
-                        .set(IotAlarmSubsystem::getStatusChangeTime,updateDto.getChangeTime())
+                .set(IotAlarmSubsystem::getStatusChangeTime, updateDto.getChangeTime())
                 .set(IotAlarmSubsystem::getStatusUpdateTime, now)
                 .set(IotAlarmSubsystem::getStatusUpdatorId, SecurityUtils.getUserId())
                 .set(IotAlarmSubsystem::getStatusUpdatorName, SecurityUtils.getLoginUser().getName()));

+ 11 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/vo/protection/SubSystemAppDetailVo.java

@@ -0,0 +1,11 @@
+package com.xunmei.core.resumption.vo.protection;
+
+import com.xunmei.common.core.domain.iot.domain.IotAlarmSubsystem;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SubSystemAppDetailVo extends IotAlarmSubsystem {
+    @ApiModelProperty("报警主机名称")
+    private String hostName;
+}

+ 117 - 112
soc-modules/soc-modules-core/src/main/resources/mapper/device/ProtectionMapper.xml

@@ -1,17 +1,16 @@
 <?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.core.resumption.mapper.ProtectionMapper">
+    <!--    <select id="deviceList" resultType="com.isp.inspection.vo.SearchDeviceListVo">-->
 
-<!--    <select id="deviceList" resultType="com.isp.inspection.vo.SearchDeviceListVo">-->
-
-<!--        select id as deviceId,name as deviceName from t_device where deleted =0 and category_id=3713671920926720-->
-<!--        <if test="request.orgId!=null and request.orgId!=''">-->
-<!--            and org_id = #{request.orgId}-->
-<!--        </if>-->
-<!--        <if test="request.orgPath!=null and request.orgPath!=''">-->
-<!--            and org_path like concat(#{request.orgPath},'%')-->
-<!--        </if>-->
-<!--    </select>-->
+    <!--        select id as deviceId,name as deviceName from t_device where deleted =0 and category_id=3713671920926720-->
+    <!--        <if test="request.orgId!=null and request.orgId!=''">-->
+    <!--            and org_id = #{request.orgId}-->
+    <!--        </if>-->
+    <!--        <if test="request.orgPath!=null and request.orgPath!=''">-->
+    <!--            and org_path like concat(#{request.orgPath},'%')-->
+    <!--        </if>-->
+    <!--    </select>-->
 
     <select id="pageList" resultType="com.xunmei.core.resumption.vo.protection.ProtectionPageVo">
         select a.id,
@@ -28,7 +27,7 @@
         from iot_alarm_subsystem a
         inner join sys_org c on a.org_id = c.id and c.deleted=0
         <if test="request.checkSub==true">
-             and c.path like concat((select path from sys_org where id=#{request.orgId}),  '%')
+            and c.path like concat((select path from sys_org where id=#{request.orgId}), '%')
         </if>
         where a.deleted=0
         <if test="request.checkSub==false">
@@ -41,114 +40,120 @@
             and a.name like concat('%',#{request.key},'%')
         </if>
         <if test="request.startTime!=null and request.endTime!=null">
-            and a.status_update_time >= #{request.startTime} and  a.status_update_time&lt;=#{request.endTime}
+            and a.status_update_time >= #{request.startTime} and a.status_update_time&lt;=#{request.endTime}
         </if>
         order by a.org_Id asc,a.name,a.id desc
     </select>
-<!--    <select id="pageLog" resultType="com.xunmei.core.resumption.vo.protection.ProtectionLogPageVo">-->
-<!--        select a.id, a.name as name,a.status as status,a.status_update_time,a.status_updator_name-->
-<!--        from iot_alarm_subsystem_log a-->
-<!--        where a.deleted=0 and a.protection_id=#{request.protectionId}-->
-<!--        <if test="request.startTime!=null and request.endTime!=null">-->
-<!--            and a.status_update_time >= #{request.startTime} and  a.status_update_time&lt;=#{request.endTime}-->
-<!--        </if>-->
-<!--    </select>-->
 
-<!--    <select id="pageSensorList" resultType="com.isp.inspection.vo.pageSensorVo">-->
-<!--        select input_name as inputName,input_index as inputIndex,sensor_type_name as sensorTypeName,-->
-<!--        status_text as statusText,status_value as statusValue-->
-<!--        from t_sensor where defencearea_code =#{request.defenceareaCode}-->
-<!--        <if test="request.sensorName!=null and request.sensorName!=''">-->
-<!--            and input_name like concat('%',#{request.sensorName},'%')-->
-<!--        </if>-->
-<!--        <if test="request.status!=null and request.status!=''">-->
-<!--            and status_value =#{request.status}-->
-<!--        </if>-->
-<!--    </select>-->
+    <select id="getHostName" resultType="String">
+        select equipment_name
+        from iot_device
+        where equipment_code = #{hostCode}
+    </select>
+    <!--    <select id="pageLog" resultType="com.xunmei.core.resumption.vo.protection.ProtectionLogPageVo">-->
+    <!--        select a.id, a.name as name,a.status as status,a.status_update_time,a.status_updator_name-->
+    <!--        from iot_alarm_subsystem_log a-->
+    <!--        where a.deleted=0 and a.protection_id=#{request.protectionId}-->
+    <!--        <if test="request.startTime!=null and request.endTime!=null">-->
+    <!--            and a.status_update_time >= #{request.startTime} and  a.status_update_time&lt;=#{request.endTime}-->
+    <!--        </if>-->
+    <!--    </select>-->
+
+    <!--    <select id="pageSensorList" resultType="com.isp.inspection.vo.pageSensorVo">-->
+    <!--        select input_name as inputName,input_index as inputIndex,sensor_type_name as sensorTypeName,-->
+    <!--        status_text as statusText,status_value as statusValue-->
+    <!--        from t_sensor where defencearea_code =#{request.defenceareaCode}-->
+    <!--        <if test="request.sensorName!=null and request.sensorName!=''">-->
+    <!--            and input_name like concat('%',#{request.sensorName},'%')-->
+    <!--        </if>-->
+    <!--        <if test="request.status!=null and request.status!=''">-->
+    <!--            and status_value =#{request.status}-->
+    <!--        </if>-->
+    <!--    </select>-->
 
-<!--    <select id="pageByMybatis" resultType="com.isp.device.vo.protection.ProtectionPageVo4Mybatis">-->
-<!--        select p.id as id,-->
-<!--        p.name as name,-->
-<!--        p.code as code,-->
-<!--        p.org_id orgId,-->
-<!--        ifnull(p.update_time,p.create_time) as updateTime,-->
-<!--        p.status as `status`,-->
-<!--        p.org_name as orgName,-->
-<!--        d.name as alarmHostName-->
-<!--        from t_protection p left join t_device d on p.device_id = d.id-->
-<!--        <if test="request.code != null and request.code != ''">-->
-<!--            inner join t_category c on p.code = c.name = #{request.code,jdbcType=VARCHAR}-->
-<!--        </if>-->
-<!--        where p.deleted = 0-->
-<!--        <if test="request.name != null and request.name != ''">-->
-<!--            and p.name like concat('%',#{request.name},'%')-->
-<!--        </if>-->
-<!--        <if test="request.orgId != null">-->
-<!--            and p.org_path like concat((select path from t_org where id = #{request.orgId}),'%')-->
-<!--        </if>-->
-<!--        <if test="request.status != null">-->
-<!--            and p.status = #{request.status}-->
-<!--        </if>-->
-<!--        <if test="request.id != null and request.id != ''">-->
-<!--            and p.id = #{request.id}-->
-<!--        </if>-->
-<!--        <if test="request.path != null and request.path != ''">-->
-<!--            and p.org_path like concat(#{request.path},'%')-->
-<!--        </if>-->
+    <!--    <select id="pageByMybatis" resultType="com.isp.device.vo.protection.ProtectionPageVo4Mybatis">-->
+    <!--        select p.id as id,-->
+    <!--        p.name as name,-->
+    <!--        p.code as code,-->
+    <!--        p.org_id orgId,-->
+    <!--        ifnull(p.update_time,p.create_time) as updateTime,-->
+    <!--        p.status as `status`,-->
+    <!--        p.org_name as orgName,-->
+    <!--        d.name as alarmHostName-->
+    <!--        from t_protection p left join t_device d on p.device_id = d.id-->
+    <!--        <if test="request.code != null and request.code != ''">-->
+    <!--            inner join t_category c on p.code = c.name = #{request.code,jdbcType=VARCHAR}-->
+    <!--        </if>-->
+    <!--        where p.deleted = 0-->
+    <!--        <if test="request.name != null and request.name != ''">-->
+    <!--            and p.name like concat('%',#{request.name},'%')-->
+    <!--        </if>-->
+    <!--        <if test="request.orgId != null">-->
+    <!--            and p.org_path like concat((select path from t_org where id = #{request.orgId}),'%')-->
+    <!--        </if>-->
+    <!--        <if test="request.status != null">-->
+    <!--            and p.status = #{request.status}-->
+    <!--        </if>-->
+    <!--        <if test="request.id != null and request.id != ''">-->
+    <!--            and p.id = #{request.id}-->
+    <!--        </if>-->
+    <!--        <if test="request.path != null and request.path != ''">-->
+    <!--            and p.org_path like concat(#{request.path},'%')-->
+    <!--        </if>-->
 
-<!--        <choose>-->
-<!--            <when test="request.onlinType!=null and request.onlinType==1">-->
-<!--                <if test="request.time!=null">-->
-<!--                    and p.update_time >=#{request.time}-->
-<!--                </if>-->
-<!--                <if test="request.time==null">-->
-<!--                    and p.update_time is not null-->
-<!--                </if>-->
+    <!--        <choose>-->
+    <!--            <when test="request.onlinType!=null and request.onlinType==1">-->
+    <!--                <if test="request.time!=null">-->
+    <!--                    and p.update_time >=#{request.time}-->
+    <!--                </if>-->
+    <!--                <if test="request.time==null">-->
+    <!--                    and p.update_time is not null-->
+    <!--                </if>-->
 
-<!--            </when>-->
-<!--            <when test="request.onlinType!=null and request.onlinType==0">-->
-<!--                <if test="request.time!=null">-->
-<!--                    and #{request.time}>p.update_time-->
-<!--                </if>-->
-<!--                <if test="request.time==null">-->
-<!--                    and p.update_time is null-->
-<!--                </if>-->
-<!--            </when>-->
-<!--        </choose>-->
+    <!--            </when>-->
+    <!--            <when test="request.onlinType!=null and request.onlinType==0">-->
+    <!--                <if test="request.time!=null">-->
+    <!--                    and #{request.time}>p.update_time-->
+    <!--                </if>-->
+    <!--                <if test="request.time==null">-->
+    <!--                    and p.update_time is null-->
+    <!--                </if>-->
+    <!--            </when>-->
+    <!--        </choose>-->
 
 
-<!--        <if test="request.sortColumn == 'orgId'">-->
-<!--            order by p.org_id asc-->
-<!--        </if>-->
-<!--        <if test="request.sortColumn == 'updateTime'">-->
-<!--            order by ifnull(p.update_time,p.create_time) desc-->
-<!--        </if>-->
-<!--    </select>-->
-<!--    <select id="selectProtectSensorData" resultType="com.isp.board.vo.ProtectSensorList">-->
-<!--        SELECT p.`name`      AS protectionName,-->
-<!--               input_name    AS sensorName,-->
-<!--               d.update_time AS alarmTime,-->
-<!--               input_name   AS alarmType,-->
-<!--               isdo          as isDeal-->
-<!--        FROM t_protection p-->
-<!--                 INNER JOIN t_sensor_alarm_data d ON p.`code` = d.defencearea_code-->
-<!--        WHERE p.deleted = 0-->
-<!--          and p.org_id = #{orgId}-->
-<!--          and d.update_time &gt;= #{startTime}-->
-<!--          and d.update_time &lt;= #{endTime}-->
-<!--        ORDER BY d.update_time DESC-->
-<!--    </select>-->
-<!--    <select id="selectIds" resultType="Long">-->
-<!--        select  id from t_protection where  org_id=#{orgId} and deleted=0;-->
-<!--    </select>-->
-<!--    <select id="productDeviceAlarmData" resultType="com.isp.board.vo.ProductDeviceAlarmList">-->
-<!--        select p.id, p.device_name as productDeviceName,d.`update_time` as alarmTime,d.isdo as isDeal,c.name as alarmType from t_product_device p inner join t_sensor_alarm_data d on p.str_device_id = d.str_device_id-->
-<!--        left join t_category c on p.product_type = c.id    where p.org_id = #{orgId} and d.update_time &gt;= #{startTime} and d.update_time &lt;= #{endTime} and p.source =#{sorce}-->
-<!--        <if test="typeList.size>0">-->
-<!--            and p.product_type in-->
-<!--            <foreach collection="typeList" item="item" index="index" open="(" close=")" separator=",">-->
-<!--                #{item}-->
-<!--            </foreach>-->
-<!--        </if>-->
-<!--    </select>-->
+    <!--        <if test="request.sortColumn == 'orgId'">-->
+    <!--            order by p.org_id asc-->
+    <!--        </if>-->
+    <!--        <if test="request.sortColumn == 'updateTime'">-->
+    <!--            order by ifnull(p.update_time,p.create_time) desc-->
+    <!--        </if>-->
+    <!--    </select>-->
+    <!--    <select id="selectProtectSensorData" resultType="com.isp.board.vo.ProtectSensorList">-->
+    <!--        SELECT p.`name`      AS protectionName,-->
+    <!--               input_name    AS sensorName,-->
+    <!--               d.update_time AS alarmTime,-->
+    <!--               input_name   AS alarmType,-->
+    <!--               isdo          as isDeal-->
+    <!--        FROM t_protection p-->
+    <!--                 INNER JOIN t_sensor_alarm_data d ON p.`code` = d.defencearea_code-->
+    <!--        WHERE p.deleted = 0-->
+    <!--          and p.org_id = #{orgId}-->
+    <!--          and d.update_time &gt;= #{startTime}-->
+    <!--          and d.update_time &lt;= #{endTime}-->
+    <!--        ORDER BY d.update_time DESC-->
+    <!--    </select>-->
+    <!--    <select id="selectIds" resultType="Long">-->
+    <!--        select  id from t_protection where  org_id=#{orgId} and deleted=0;-->
+    <!--    </select>-->
+    <!--    <select id="productDeviceAlarmData" resultType="com.isp.board.vo.ProductDeviceAlarmList">-->
+    <!--        select p.id, p.device_name as productDeviceName,d.`update_time` as alarmTime,d.isdo as isDeal,c.name as alarmType from t_product_device p inner join t_sensor_alarm_data d on p.str_device_id = d.str_device_id-->
+    <!--        left join t_category c on p.product_type = c.id    where p.org_id = #{orgId} and d.update_time &gt;= #{startTime} and d.update_time &lt;= #{endTime} and p.source =#{sorce}-->
+    <!--        <if test="typeList.size>0">-->
+    <!--            and p.product_type in-->
+    <!--            <foreach collection="typeList" item="item" index="index" open="(" close=")" separator=",">-->
+    <!--                #{item}-->
+    <!--            </foreach>-->
+    <!--        </if>-->
+    <!--    </select>-->
 </mapper>

+ 1 - 2
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/DvrDiskController.java

@@ -58,9 +58,8 @@ class DvrDiskController {
         TableDataInfo<DvrDiskAlarmHistoryPageVo> page = dvrDiskService.getRecordAlarmHistoryList(request);
         return page;
     }
-
     @ApiOperation("分页")
-    @PostMapping({"/find"})
+    @PostMapping({"/app/find"})
     TableDataInfo<DvrDiskDetectionPageVo> page(@RequestBody final DvrDiskAppPageDto request) {
         TableDataInfo<DvrDiskDetectionPageVo> page = this.videoRecorderHardDiskDetectionService.page(request);
         return page;

+ 63 - 2
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/IotAlarmRuleSourceController.java

@@ -1,14 +1,25 @@
 package com.xunmei.iot.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
+import com.xunmei.iot.service.IotAlarmRuleSourceService;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceRuleVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
 import io.swagger.annotations.ApiOperation;
+import org.aspectj.weaver.loadtime.Aj;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * @author 高雄
@@ -18,10 +29,60 @@ import javax.validation.Valid;
 @RequestMapping("/iot_alarm_device")
 public class IotAlarmRuleSourceController {
 
+    @Autowired
+    private IotAlarmRuleSourceService iotAlarmRuleSourceService;
+
     @ApiOperation(value = "查看动环告警规则详情")
     @PostMapping(value = "detail")
-    public AjaxResult detail(@RequestBody @Valid IotAlarmRuleSourceDetailDto detailDto){
-        return null;
+    public AjaxResult detail(@RequestBody @Valid IotAlarmRuleSourceDetailDto detailDto) {
+        try {
+            IotAlarmRuleSourceDetailVo detail = iotAlarmRuleSourceService.detail(detailDto);
+            return AjaxResult.success(detail);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "添加设备查询接口", notes = "设备列表接口")
+    @PostMapping(value = "device")
+    public AjaxResult deviceList(@RequestBody @Valid IotAlarmRuleSourceDeviceDto detailDto) {
+
+        try {
+            Page<IotAlarmRuleSourceDeviceVo> page = iotAlarmRuleSourceService.selectDeviceList(detailDto);
+            return AjaxResult.success(page);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "更新规则详情", notes = "更新规则详情接口")
+    @PostMapping(value = "update")
+    public AjaxResult updateList(@RequestBody @Valid IotAlarmRuleSourceDetailVo detailDto){
+
+        try {
+            iotAlarmRuleSourceService.updateRuleAndProductDevice(detailDto);
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+
+    @ApiOperation(value = "设备批量关联规则", notes = "单设备关联规则也走这个接口")
+    @PostMapping(value = "batchJoin")
+    public AjaxResult batchJoin(@RequestBody @Valid IotAlarmRuleSourceDeviceBatchJoin batchJoinDto) {
+        try {
+            iotAlarmRuleSourceService.batchJoin(batchJoinDto);
+            return AjaxResult.success();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error();
+        }
     }
 
+
+
 }

+ 25 - 12
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/controller/VideoDiagnosisController.java

@@ -3,14 +3,20 @@ package com.xunmei.iot.controller;
 
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisAppPageDto;
 import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisWebPageDto;
 import com.xunmei.iot.service.VideoDiagnosisService;
 import com.xunmei.iot.vo.videoDays.VideoDayCheckWebDetailVo;
+import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisAppPageVo;
+import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisIntegrityVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 /**
  * 录像诊断
  *
@@ -24,18 +30,6 @@ public class VideoDiagnosisController {
     @Autowired
     private VideoDiagnosisService videoDiagnosisService;
 
-//    @PostMapping("/page")
-//    public TableDataInfo<VideoDaysCheckPageVo> page(@RequestBody VideoDayCheckPageDto request) throws Exception {
-//        TableDataInfo<VideoDaysCheckPageVo> pageData = this.videoDaysCheckService.getPageData(request);
-//        return pageData;
-//    }
-//
-//    @GetMapping("/channelDetail/{id}")
-//    public AjaxResult info(@PathVariable("id") String id) {
-//        VideoDaysCheckChannelDetailVo data = this.videoDaysCheckService.getChannelDetailData(id);
-//        return AjaxResult.success(data);
-//    }
-
     @PostMapping("/web/page")
     public TableDataInfo<VideoDiagnosisWebPageVo> webPage(@RequestBody VideoDiagnosisWebPageDto pageDto) {
         TableDataInfo<VideoDiagnosisWebPageVo> page = this.videoDiagnosisService.getPageData(pageDto);
@@ -47,4 +41,23 @@ public class VideoDiagnosisController {
         VideoDiagnosisWebVo detailVo = this.videoDiagnosisService.getDetail(hostCode, channelCode);
         return AjaxResult.success(detailVo);
     }
+
+    @GetMapping("/web/integrity/{hostCode}/{channelCode}/{recordDate}")
+    public AjaxResult getIntegrity(@PathVariable("hostCode") String hostCode, @PathVariable("channelCode") String channelCode, @PathVariable("recordDate") String date) throws Exception {
+
+        VideoDiagnosisIntegrityVo vo = this.videoDiagnosisService.getIntegrity(hostCode, channelCode, new SimpleDateFormat("yyyy-MM-dd").parse(date));
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/app/page")
+    public TableDataInfo<VideoDiagnosisAppPageVo> appPage(@RequestBody VideoDiagnosisAppPageDto pageDto) {
+        TableDataInfo<VideoDiagnosisAppPageVo> page = this.videoDiagnosisService.getAppPageData(pageDto);
+        return page;
+    }
+
+//    @PostMapping("/app/detail/{hostCode}/{channelCode}")
+//    public TableDataInfo<VideoDiagnosisAppPageVo> appInfo(@PathVariable("hostCode") String hostCode, @PathVariable("channelCode") String channelCode) {
+//        TableDataInfo<VideoDiagnosisAppPageVo> page = this.videoDiagnosisService.getAppPageData(pageDto);
+//        return page;
+//    }
 }

+ 22 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceBatchJoin.java

@@ -0,0 +1,22 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Size;
+import java.util.List;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 15:08
+ */
+@Data
+public class IotAlarmRuleSourceDeviceBatchJoin {
+
+    @Size(min = 1,message = "请至少选择一台设备")
+    @ApiModelProperty(value = "设备id数组")
+    private List<String> deviceIdList;
+
+    @ApiModelProperty(value = "规则id数组")
+    private List<Long> ruleIdList;
+}

+ 32 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceDto.java

@@ -0,0 +1,32 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 10:51
+ */
+@Data
+public class IotAlarmRuleSourceDeviceDto {
+
+    @ApiModelProperty(value = "机构id")
+    @NotNull(message = "请至少选择一个机构进行查询")
+    private Long orgId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    /**
+     * @see ProductTypeEnum
+     */
+    @ApiModelProperty(value = "产品类型")
+    @NotNull(message = "请选择产品类型进行添加设备!")
+    private Integer type;
+
+    private int page;
+
+    private int size;
+}

+ 21 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/alarm/IotAlarmRuleSourceDeviceRuleDto.java

@@ -0,0 +1,21 @@
+package com.xunmei.iot.dto.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 15:08
+ */
+@Data
+public class IotAlarmRuleSourceDeviceRuleDto {
+
+    @NotNull(message = "请选择一台设备查看")
+    @ApiModelProperty(value = "设备id")
+    private String deviceId;
+
+    private Long orgId;
+
+}

+ 25 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/dto/videoDiagnosis/VideoDiagnosisAppPageDto.java

@@ -0,0 +1,25 @@
+package com.xunmei.iot.dto.videoDiagnosis;
+
+import com.xunmei.common.core.web.domain.PageDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class VideoDiagnosisAppPageDto extends PageDto {
+    //    @ApiModelProperty(value = "监控主机")
+//    private String hostName;
+//
+//    @ApiModelProperty(value = "通道")
+//    private String channelName;
+//
+//    @ApiModelProperty(value = "录像完整性状态")
+//    private Integer integrityState;
+//
+//    @ApiModelProperty(value = "录像存储天数状态")
+//    private Integer daysState;
+//
+//    @ApiModelProperty(value = "视频诊断状态")
+//    private Integer diagnosisState;
+    @ApiModelProperty(value = "0:正常,1:异常,2:未知")
+    private Integer state;
+}

+ 63 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/AlarmRuleExpressOperateEnum.java

@@ -0,0 +1,63 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/8/1 12:52
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum AlarmRuleExpressOperateEnum {
+
+    /**
+     * 操作符,GT(大于)、GTE(大于等于)、LT(小于)、LTE(小于等
+     * 于)、EQUALS(等于)、STARTS_WITH(以什么开始)、
+     * ENDS_WITH(以什么结束)、CONTAIN(包含)
+     */
+    GT("GT"),
+    GTE("GTE"),
+    LT("LT"),
+    LTE("LTE"),
+    EQUALS("EQUALS"),
+    STARTS_WITH("STARTS_WITH"),
+    ENDS_WITH("ENDS_WITH"),
+    CONTAIN("CONTAIN");
+
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(String code) {
+        AlarmRuleExpressOperateEnum e = enumMap.get(code);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 根据code获取枚举对象
+     */
+    public static AlarmRuleExpressOperateEnum getOperateEnum(String code) {
+        return enumMap.get(code);
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<String, AlarmRuleExpressOperateEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (AlarmRuleExpressOperateEnum typeEnum : AlarmRuleExpressOperateEnum.values()) {
+            enumMap.put(typeEnum.text, typeEnum);
+        }
+    }
+
+
+}

+ 53 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ProductTypeEnum.java

@@ -0,0 +1,53 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 0:41
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum ProductTypeEnum {
+    SMOKE_SENSOR(4,"烟雾传感器"),
+    TEMPERATURE_HUMIDITY(5,"温湿度采集器"),
+    FLOODING(6,"水浸传感器"),
+    DOOR_SENSOR(7,"门磁、窗磁传感器(Lora无线)"),
+    SHUTTER_DOORS(8,"卷帘门门磁"),
+    GEOMAGNETIC(9,"地磁传感器"),
+    GAS_ALARM(10,"燃气报警器"),
+    ALARM_ZONE(50,"报警防区"),
+    UPS(51,"UPS"),
+    ALARM_LOOP(52,"回路"),
+    ZNDB(53,"智能电表");
+    ;
+
+    private int num;
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer num) {
+        ProductTypeEnum e = enumMap.get(num);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, ProductTypeEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (ProductTypeEnum typeEnum : ProductTypeEnum.values()) {
+            enumMap.put(typeEnum.num, typeEnum);
+        }
+    }
+}

+ 47 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/enums/ValueTypeEnum.java

@@ -0,0 +1,47 @@
+package com.xunmei.iot.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/8/1 10:26
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum ValueTypeEnum {
+
+    Device(0,"Device"),
+
+    AllDevice(1,"AllDevice");
+
+
+    private int code;
+
+    private String text;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer num) {
+        ValueTypeEnum e = enumMap.get(num);
+        return e != null ? e.getText() : "";
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, ValueTypeEnum> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (ValueTypeEnum typeEnum : ValueTypeEnum.values()) {
+            enumMap.put(typeEnum.code, typeEnum);
+        }
+    }
+
+}

+ 19 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotAlarmRuleSourceMapper.java

@@ -1,8 +1,12 @@
 package com.xunmei.iot.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
 import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
+import com.xunmei.iot.vo.alarm.ProductTypeDataVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -16,4 +20,19 @@ public interface IotAlarmRuleSourceMapper extends BaseMapper<IotAlarmRuleSource>
      * @return
      */
     List<IotAlarmRuleSourceDetailVo> selectDetailData(@Param("ruleId") Long ruleId);
+
+    /**
+     * 获取规则下设备绑定数据
+     * @param ruleId
+     * @return
+     */
+    List<ProductTypeDataVo> selectRuleDevice(@Param("ruleId") Long ruleId);
+
+    /**
+     * 获取要添加的设备列表
+     * @param page
+     * @param param
+     * @return
+     */
+    Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(Page<IotAlarmRuleSourceDeviceVo> page, @Param("param")IotAlarmRuleSourceDeviceDto param);
 }

+ 8 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotCommonSensorMapper.java

@@ -7,6 +7,9 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.iot.dto.sensor.SensorPageDto;
 import com.xunmei.iot.vo.sensor.SensorPageVo;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * <p>
@@ -16,10 +19,15 @@ import org.apache.ibatis.annotations.Param;
  * @author test
  * @since 2024-02-20
  */
+@Mapper
 public interface IotCommonSensorMapper extends BaseMapper<IotSensor> {
 
     Page<SensorPageVo> selectPageData(Page<SensorPageVo> pageRequest, @Param("request") SensorPageDto request);
 
     Page<SensorPageVo> selectSensorLogDataPage(Page<SensorPageVo> pageRequest, @Param("request") SensorPageDto request);
 
+
+    List<IotSensor> selectByIds(@Param("deviceIds") List<String> deviceIds);
+
+
 }

+ 11 - 5
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotDvrChannelMapper.java

@@ -7,26 +7,32 @@ 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.VideoDiagnosisAppPageDto;
 import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisWebPageDto;
 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.VideoDiagnosisAppPageVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
 import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
- *  Mapper 接口
+ * Mapper 接口
  * </p>
  *
  * @author test
  * @since 2024-02-20
  */
 public interface IotDvrChannelMapper extends BaseMapper<IotDvrChannel> {
-    Page<VideoDiagnosisWebPageVo>  selectPage(@Param("page") Page<VideoDiagnosisWebPageVo> page,
-                                                  @Param("pageDto") VideoDiagnosisWebPageDto pageDto,
-                                                  @Param("orgPath") String orgPath);
+    Page<VideoDiagnosisWebPageVo> selectPage(@Param("page") Page<VideoDiagnosisWebPageVo> page,
+                                             @Param("pageDto") VideoDiagnosisWebPageDto pageDto,
+                                             @Param("orgPath") String orgPath);
 
-    VideoDiagnosisWebVo diagnosisDetail(@Param("hostCode") String hostCode,@Param("channelCode") String channelCode);
+    VideoDiagnosisWebVo diagnosisDetail(@Param("hostCode") String hostCode, @Param("channelCode") String channelCode);
+
+    Page<VideoDiagnosisAppPageVo> selectAppPage(@Param("page") Page<VideoDiagnosisAppPageVo> page,
+                                                @Param("pageDto") VideoDiagnosisAppPageDto pageDto,
+                                                @Param("orgPath") String orgPath);
 }

+ 37 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IotAlarmRuleSourceService.java

@@ -1,8 +1,18 @@
 package com.xunmei.iot.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
 import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceRuleVo;
+import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author 高雄
@@ -15,5 +25,31 @@ public interface IotAlarmRuleSourceService  extends IService<IotAlarmRuleSource>
      * @return
      * @throws Exception
      */
-    IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailVo detailVo)throws Exception;
+    IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailDto detailVo)throws Exception;
+
+
+    /**
+     * 获取列表分页数据
+     * @param param
+     * @return
+     */
+    Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(IotAlarmRuleSourceDeviceDto param)throws Exception;
+
+
+    /**
+     * 更新数据
+     * @param detailDto
+     * @throws Exception
+     */
+    void updateRuleAndProductDevice(IotAlarmRuleSourceDetailVo detailDto)throws Exception;
+
+
+    /**
+     * 批量更新数据
+     * @param batchJoinDto
+     * @throws Exception
+     */
+    void batchJoin(IotAlarmRuleSourceDeviceBatchJoin batchJoinDto)throws Exception;
+
+
 }

+ 6 - 6
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/VideoDiagnosisService.java

@@ -3,10 +3,9 @@ package com.xunmei.iot.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xunmei.common.core.domain.iot.domain.IotDvrChannel;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisAppPageDto;
 import com.xunmei.iot.dto.videoDiagnosis.VideoDiagnosisWebPageDto;
-import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisIntegrityVo;
-import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
-import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
+import com.xunmei.iot.vo.videoDiagnosis.*;
 import org.apache.http.annotation.Obsolete;
 import org.springframework.web.bind.annotation.PathVariable;
 
@@ -22,11 +21,12 @@ import java.util.Date;
  */
 @Obsolete
 public interface VideoDiagnosisService extends IService<IotDvrChannel> {
-
     TableDataInfo<VideoDiagnosisWebPageVo> getPageData(VideoDiagnosisWebPageDto request);
 
-    VideoDiagnosisWebVo getDetail(String equipmentCode,String channelCode);
+    VideoDiagnosisWebVo getDetail(String equipmentCode, String channelCode);
+
+    VideoDiagnosisIntegrityVo getIntegrity(String hostCode, String channelCode, Date date);
 
-  VideoDiagnosisIntegrityVo getIntegrity(String hostCode, String channelCode , Date date);
+    TableDataInfo<VideoDiagnosisAppPageVo> getAppPageData(VideoDiagnosisAppPageDto request);
 
 }

+ 171 - 13
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotAlarmRuleSourceServiceImpl.java

@@ -1,19 +1,36 @@
 package com.xunmei.iot.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.iot.domain.IotSensor;
+import com.xunmei.common.core.domain.mediator.domain.IotAlarmRule;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
+import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.core.utils.StringUtils;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDetailDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceBatchJoin;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceDto;
+import com.xunmei.iot.dto.alarm.IotAlarmRuleSourceDeviceRuleDto;
+import com.xunmei.iot.enums.ProductTypeEnum;
+import com.xunmei.iot.enums.ValueTypeEnum;
+import com.xunmei.iot.mapper.IotAlarmRuleExpressMapper;
+import com.xunmei.iot.mapper.IotAlarmRuleMapper;
 import com.xunmei.iot.mapper.IotAlarmRuleSourceMapper;
+import com.xunmei.iot.mapper.IotCommonSensorMapper;
 import com.xunmei.iot.service.IotAlarmRuleSourceService;
-import com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDetailVo;
-import com.xunmei.iot.vo.alarm.ProductTypeDataVo;
+import com.xunmei.iot.vo.alarm.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
-import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -22,21 +39,162 @@ public class IotAlarmRuleSourceServiceImpl extends ServiceImpl<IotAlarmRuleSourc
     @Autowired
     private IotAlarmRuleSourceMapper iotAlarmRuleSourceMapper;
 
+    @Autowired
+    private IotAlarmRuleMapper iotAlarmRuleMapper;
+
+    @Autowired
+    private IotAlarmRuleExpressMapper iotAlarmRuleExpressMapper;
+
+    @Autowired
+    private IotCommonSensorMapper iotCommonSensorMapper;
+
+    @Override
+    public IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailDto detailVo) throws Exception {
+        IotAlarmRuleSourceDetailVo iotAlarmRuleSourceDetailVo = new IotAlarmRuleSourceDetailVo();
+        //1.获取告警规则数据
+        IotAlarmRule iotAlarmRule = iotAlarmRuleMapper.selectById(detailVo.getRuleId());
+        iotAlarmRuleSourceDetailVo.setRuleId(iotAlarmRule.getId());
+        iotAlarmRuleSourceDetailVo.setRuleName(iotAlarmRule.getName());
+        iotAlarmRuleSourceDetailVo.setRuleType(iotAlarmRule.getType());
+        iotAlarmRuleSourceDetailVo.setEnable(iotAlarmRule.getEnabled());
+        //2.获取告警规则对应有哪些设备的告警属性规则。
+        List<ProductTypeDataVo> productTypeDataVos = iotAlarmRuleSourceMapper.selectRuleDevice(detailVo.getRuleId());
+        //3.处理其他sql获取不了的数据
+        for (ProductTypeDataVo pdv : productTypeDataVos) {
+            pdv.setTypeText(ProductTypeEnum.getName(pdv.getType()));
+            dealDevice(pdv);
+        }
+        iotAlarmRuleSourceDetailVo.setTypeDataList(productTypeDataVos);
+        return iotAlarmRuleSourceDetailVo;
+    }
+
+    @Override
+    public Page<IotAlarmRuleSourceDeviceVo> selectDeviceList(IotAlarmRuleSourceDeviceDto param)throws Exception {
+        Page<IotAlarmRuleSourceDeviceVo> page = new Page<>();
+        page.setSize(param.getSize());
+        page.setCurrent(param.getPage());
+        Page<IotAlarmRuleSourceDeviceVo> result = iotAlarmRuleSourceMapper.selectDeviceList(page, param);
+        return result;
+    }
+
     @Override
-    public IotAlarmRuleSourceDetailVo detail(IotAlarmRuleSourceDetailVo detailVo) throws Exception {
-        //根据规则id获取,规则数据
-        List<IotAlarmRuleSourceDetailVo> detailVoList = iotAlarmRuleSourceMapper.selectDetailData(detailVo.getRuleId());
-        if(ObjectUtil.isEmpty(detailVoList)){
-            return new IotAlarmRuleSourceDetailVo();
+    @Transactional(rollbackFor = Exception.class)
+    public void updateRuleAndProductDevice(IotAlarmRuleSourceDetailVo detailDto) throws Exception {
+        //删除设备绑定数据
+        LambdaQueryWrapper<IotAlarmRuleSource> qw = new LambdaQueryWrapper<IotAlarmRuleSource>();
+        qw.eq(IotAlarmRuleSource::getRuleId,detailDto.getRuleId());
+        iotAlarmRuleSourceMapper.delete(qw);
+
+        //重新绑定设置
+        List<ProductTypeDataVo> deviceData = detailDto.getTypeDataList();
+        if(ObjectUtil.isEmpty(deviceData)){
+            return;
         }
+        IotAlarmRuleSource ruleSource = null;
+        for (ProductTypeDataVo productType : deviceData) {
+            ruleSource = new IotAlarmRuleSource();
+            ruleSource.setRuleId(detailDto.getRuleId());
+            if (ValueTypeEnum.AllDevice.getText().equals(productType.getValueType()) && productType.getIsAllDeviceEnable()) {
+                ruleSource.setId(IDHelper.id());
+                ruleSource.setOrgId(null);
 
-        IotAlarmRuleSourceDetailVo iotAlarmRuleSourceDetailVo = detailVoList.get(0);
+                ruleSource.setSourceType(productType.getType());
+                ruleSource.setValue(null);
+                ruleSource.setValueType(ValueTypeEnum.AllDevice.getText());
+                iotAlarmRuleSourceMapper.insert(ruleSource);
+                continue;
+            }
+            if (productType.getDeviceTempList() != null) {
+                for (ProductDeviceTempVo deviceTempVo : productType.getDeviceTempList()) {
+                    ruleSource.setId(IDHelper.id());
+                    ruleSource.setOrgId(deviceTempVo.getOrgId());
+                    ruleSource.setSourceType(productType.getType());
+                    ruleSource.setValue(deviceTempVo.getDeviceId());
+                    ruleSource.setValueType(ValueTypeEnum.Device.getText());
+                    iotAlarmRuleSourceMapper.insert(ruleSource);
+                }
+            }
+        }
 
-        List<ProductTypeDataVo> list = new ArrayList<>();
-        Map<Integer, List<IotAlarmRuleSourceDetailVo>> listMap =
-                detailVoList.stream().sorted(Comparator.comparing(IotAlarmRuleSourceDetailVo::getSourceType)).collect(Collectors.groupingBy(IotAlarmRuleSourceDetailVo::getSourceType));
+    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchJoin(IotAlarmRuleSourceDeviceBatchJoin batchJoinDto) throws Exception {
+        final List<Long> ruleIdList = batchJoinDto.getRuleIdList();
+        final List<String> deviceIdList = batchJoinDto.getDeviceIdList();
+        Map<Object, Object> hashMap = new HashMap<>();
+        iotAlarmRuleSourceMapper.delete(new LambdaQueryWrapper<IotAlarmRuleSource>()
+                .in(IotAlarmRuleSource::getValue, deviceIdList));
+        for (Long ruleId : ruleIdList) {
+            for (String deviceId : deviceIdList) {
+                IotSensor productDevice = (IotSensor) hashMap.get(deviceId);
+                if (productDevice == null) {
+                    QueryWrapper<IotSensor> qw = new QueryWrapper<>();
+                    qw.lambda().eq(IotSensor::getDeviceCode,deviceId).eq(IotSensor::getDeleted,0);
+                    hashMap.put(deviceId, productDevice);
+                }
+                String code = productDevice.getDeviceType();
 
-        return null;
+                boolean isAllDevice = false;
+                final List<IotAlarmRuleSource> ruleSourceList = iotAlarmRuleSourceMapper.selectList(new LambdaQueryWrapper<IotAlarmRuleSource>()
+                        .eq(IotAlarmRuleSource::getRuleId, ruleId)
+                        .eq(IotAlarmRuleSource::getSourceType, Integer.parseInt(code)));
+                isAllDevice = ruleSourceList.stream().map(IotAlarmRuleSource::getValueType).anyMatch(ValueTypeEnum.AllDevice.getText()::equals);
+                if (isAllDevice) {
+                    //如果此前已经设置了 产品类型=AllDevice的  本次就无需再添加
+                    continue;
+                }
+                //isAllDevice = false 说明当前规则与当前的产品类型没有设置需要报警的设备信息,或者说是仅指定了具体的设备需要报警
+                //如果是仅指定了具体的设备需要报警,本次重新设置 需要覆盖之前的数据
+                IotAlarmRuleSource source = new IotAlarmRuleSource();
+                source.setId(IDHelper.id());
+                source.setOrgId(productDevice.getOrgId());
+                source.setRuleId(ruleId);
+                source.setSourceType(Integer.parseInt(code));
+                source.setValue(deviceId);
+                source.setValueType(ValueTypeEnum.Device.getText());
+                iotAlarmRuleSourceMapper.insert(source);
+
+            }
+        }
+    }
+
+    /**
+     * 处理每种类型的数据
+     * @param pdv
+     * @return
+     */
+    private void dealDevice(ProductTypeDataVo pdv){
+        String valueType = pdv.getValueType();
+
+        if(StringUtils.isEmpty(valueType)){
+            //未配置设备关联时
+            pdv.setIsAllDeviceEnable(false);
+            pdv.setValueType(ValueTypeEnum.AllDevice.getText());
+        }else{
+            if(ValueTypeEnum.AllDevice.getText().equals(valueType)){
+                //配置按设备类型关联时
+                pdv.setIsAllDeviceEnable(true);
+            }
+
+            if(ValueTypeEnum.Device.getText().equals(valueType)){
+                //配置具体设备关联时
+                List<ProductDeviceTempVo> deviceTempList = pdv.getDeviceTempList();
+                //获取对应的设备id
+                List<String> deviceIds = deviceTempList.stream().map(ProductDeviceTempVo::getDeviceId).collect(Collectors.toList());
+
+                List<IotSensor> iotSensors = iotCommonSensorMapper.selectByIds(deviceIds);
+                Map<String, IotSensor> deviceIdAndName = iotSensors.stream().collect(Collectors.toMap(IotSensor::getDeviceCode, Function.identity()));
+                for (ProductDeviceTempVo ptv : deviceTempList) {
+                    IotSensor iotSensor = deviceIdAndName.get(ptv.getDeviceId());
+                    if( iotSensor!= null){
+                        ptv.setDeviceName(iotSensor.getDeviceName());
+                        ptv.setOrgName(iotSensor.getOrgName());
+                    }
+
+                }
+            }
+        }
     }
 }

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

@@ -1,5 +1,7 @@
 package com.xunmei.iot.service.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,19 +11,19 @@ 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.VideoDiagnosisAppPageDto;
 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.VideoDiagnosisIntegrityVo;
-import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo;
-import com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebVo;
+import com.xunmei.iot.vo.videoDiagnosis.*;
 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.text.SimpleDateFormat;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
@@ -51,6 +53,31 @@ public class VideoDiagnosisServiceImpl extends ServiceImpl<IotDvrChannelMapper,
     }
 
     @Override
+    public TableDataInfo<VideoDiagnosisAppPageVo> getAppPageData(VideoDiagnosisAppPageDto request) {
+        String orgPath = "";
+        if (request.getCheckSub()) {
+            SysOrg org = orgService.selectOrgById(request.getOrgId(), SecurityConstants.INNER);
+            orgPath = org.getPath();
+        }
+
+        Page<VideoDiagnosisAppPageVo> page = request.toPage();
+
+        page = baseMapper.selectAppPage(page, request, orgPath);
+        page.getRecords().forEach(r -> {
+            if (ObjectUtil.isEmpty(r.getChannels())) {
+                r.setState(null);
+            } else if (r.getChannels().stream().filter(c -> ObjectUtil.equal(c.getState(), 1)).findAny().isPresent()) {
+                r.setState(1);
+            } else if (r.getChannels().stream().filter(c -> ObjectUtil.equal(c.getState(), 2)).findAny().isPresent()) {
+                r.setState(2);
+            } else {
+                r.setState(0);
+            }
+        });
+        return TableDataInfo.success(page);
+    }
+
+    @Override
     public VideoDiagnosisWebVo getDetail(String hostCode, String channelCode) {
         VideoDiagnosisWebVo vo = baseMapper.diagnosisDetail(hostCode, channelCode);
         if (ObjectUtil.isNull(vo)) {
@@ -94,11 +121,28 @@ public class VideoDiagnosisServiceImpl extends ServiceImpl<IotDvrChannelMapper,
             } else {
                 vo.getStorage().setAllLostDates(new ArrayList<>());
             }
+
+            setUnknownDate(vo.getStorage(), vo.getStorage().getEarliestTime());
         }
 
         return vo;
     }
 
+    private void setUnknownDate(VideoDiagnosisStorageVo storage, Date earliest) {
+        storage.setUnknownDates(new ArrayList<>());
+        Date start = DateUtil.beginOfDay(earliest);
+        Date end=DateUtil.offset(new Date(),DateField.DAY_OF_YEAR,-1);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        for (; !start.after(end); ) {
+            String str = format.format(start);
+            if (!storage.getFullDates().contains(str) && !storage.getPartialLossDates().contains(str) && !storage.getAllLostDates().contains(str)) {
+                storage.getUnknownDates().add(str);
+            }
+
+            start=DateUtil.offset(start, DateField.DAY_OF_YEAR,1);
+        }
+    }
+
     @Override
     public VideoDiagnosisIntegrityVo getIntegrity(String hostCode, String channelCode, Date date) {
         LambdaQueryWrapper<MediatorVideoIntegrityCheck> wrapper = new LambdaQueryWrapper<>();

+ 17 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceRuleVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.iot.vo.alarm;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/28 17:23
+ */
+@Data
+public class IotAlarmRuleSourceDeviceRuleVo {
+
+    @ApiModelProperty(value = "规则id")
+    private Long ruleId;
+    @ApiModelProperty(value = "是否可以取消绑定该规则",notes = "true:可以,false:不可以")
+    private Boolean flag;
+}

+ 27 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/alarm/IotAlarmRuleSourceDeviceVo.java

@@ -0,0 +1,27 @@
+package com.xunmei.iot.vo.alarm;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author jingyuanchao
+ * @date 2022/7/27 10:51
+ */
+@Data
+public class IotAlarmRuleSourceDeviceVo {
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "机构名称")
+    private String orgName;
+    private String orgPath;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+}

+ 1 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/dvrDisk/DvrDiskPageVo.java

@@ -49,7 +49,7 @@ public class DvrDiskPageVo {
    private String ip;
 
    @ApiModelProperty("网络状态")
-   private NetStatus netState;
+   private Integer netState;
 
 //   @ApiModelProperty("报警状态")
 //   private AlarmStatus status;

+ 10 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisAppPageChannelVo.java

@@ -0,0 +1,10 @@
+package com.xunmei.iot.vo.videoDiagnosis;
+
+import lombok.Data;
+
+@Data
+public class VideoDiagnosisAppPageChannelVo {
+    private String channelCode;
+
+    private Integer state;
+}

+ 19 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisAppPageVo.java

@@ -0,0 +1,19 @@
+package com.xunmei.iot.vo.videoDiagnosis;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VideoDiagnosisAppPageVo {
+    private String hostCode;
+
+    private String hostName;
+
+    private String orgName;
+
+    private  Integer state;
+
+    private List<VideoDiagnosisAppPageChannelVo> channels;
+}

+ 2 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/vo/videoDiagnosis/VideoDiagnosisStorageVo.java

@@ -24,4 +24,6 @@ public class VideoDiagnosisStorageVo {
     private List<String> partialLossDates;
     @ApiModelProperty("全部丢失")
     private List<String> allLostDates;
+    @ApiModelProperty("未上报的日期")
+    private List<String> unknownDates;
 }

+ 5 - 4
soc-modules/soc-modules-iot/src/main/resources/mapper/DvrDiskMapper.xml

@@ -8,8 +8,9 @@
         <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="netState" property="netState"/>
+<!--        <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"
@@ -32,8 +33,8 @@
         d.org_name AS orgName,
         d.producer as brand,
         dd.state as netState,
-        dhd.state AS `status`,
-        dhd.alarm_time AS alarmTime,
+<!--        dhd.check_status AS `status`,-->
+<!--        dhd.check_time AS alarmTime,-->
         dhd.detail_info as detailInfo
         FROM
         iot_device d

+ 44 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotAlarmRuleSourceMapper.xml

@@ -13,4 +13,48 @@
                  inner join t_app_alarm_rule_express e on r.id = e.rule_id
         where r.id = #{ruleId}
     </select>
+
+    <resultMap id="product_type_data" type="com.xunmei.iot.vo.alarm.ProductTypeDataVo">
+        <result property="type" column="type"/>
+        <result property="valueType" column="value_type"/>
+        <result property="valueType" column="value_type"/>
+        <collection property="deviceTempList" ofType="com.xunmei.iot.vo.alarm.ProductDeviceTempVo">
+            <result property="deviceId" column="device_id"/>
+            <result property="orgId" column="org_id"/>
+            <result property="orgName" column="org_name"/>
+        </collection>
+    </resultMap>
+
+
+    <select id="selectRuleDevice" resultMap="product_type_data">
+        SELECT
+            a.source_type AS type,
+            b.value_type,
+            b.`value` AS device_id,
+            b.org_id,
+            c.`name` AS org_name
+        FROM
+            (	select rule_id,source_type from iot_alarm_rule_express  GROUP BY source_type,rule_id) a
+                LEFT JOIN iot_alarm_rule_source b ON a.rule_id = b.rule_id and a.source_type=b.source_type
+                LEFT JOIN sys_org c ON b.org_id = c.id
+        where a.rule_id = #{ruleId}
+    </select>
+    <select id="selectDeviceList" resultType="com.xunmei.iot.vo.alarm.IotAlarmRuleSourceDeviceVo">
+        SELECT DISTINCT
+        d.device_code AS deviceId,
+        d.device_name AS deviceName,
+        d.org_id AS orgId,
+        d.org_path AS orgPath,
+        CONCAT(b.affiliated_area,'-',b.affiliated_bank,'-',b.short_name) as org_name
+        FROM
+        iot_sensor d
+        LEFT JOIN mediator_category c ON c.id = d.category_id
+        LEFT JOIN sys_org b ON d.org_id = b.id
+        where d.org_id = #{param.orgId}
+        and c.code = #{param.type}
+        <if test="param.deviceName != null and param.deviceName != ''">
+            and d.device_name like concat('%',#{param.deviceName},'%')
+        </if>
+
+    </select>
 </mapper>

+ 114 - 30
soc-modules/soc-modules-iot/src/main/resources/mapper/IotDvrChannelMapper.xml

@@ -30,6 +30,19 @@
             <result column="storage_earliest_video_time" property="earliestTime"></result>
         </association>
     </resultMap>
+
+    <resultMap id="appPageMap" type="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisAppPageVo">
+        <result column="equipment_code" property="hostCode"></result>
+        <result column="equipment_name" property="hostName"></result>
+        <result column="org_name" property="orgName"></result>
+        <result column="state" property="state"></result>
+        <collection property="channels" ofType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisAppPageChannelVo"
+                    column="equipmentCode=equipment_code,state=state"
+                    select="selectAppChannels">
+            <result column="channel_code" property="channelCode"></result>
+            <result column="state" property="state"></result>
+        </collection>
+    </resultMap>
     <select id="selectPage" resultType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisWebPageVo">
         SELECT
         c.id,
@@ -43,7 +56,8 @@
         vdc.real_days,
         vdr.signal_lost,
         vdr.occlude,
-        if(vdr.id is null,null,if(vdr.brightness+vdr.color_cast+vdr.snowflake+vdr.stripe+vdr.contrast+vdr.blurry>1,1,0)) as quality
+        if(vdr.id is null,null,if(vdr.brightness+vdr.color_cast+vdr.snowflake+vdr.stripe+vdr.contrast+vdr.blurry>1,1,0))
+        as quality
         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
@@ -73,39 +87,109 @@
         <if test="pageDto.diagnosisState!=null">
             and vdr.is_alarm=#{pageDto.diagnosisState}
         </if>
-<!--        <if test="pageDto.status !=null">-->
-<!--            and dhd.`status` = #{pageDto.status}-->
-<!--        </if>-->
+        <!--        <if test="pageDto.status !=null">-->
+        <!--            and dhd.`status` = #{pageDto.status}-->
+        <!--        </if>-->
     </select>
 
     <select id="diagnosisDetail" resultMap="diagnosisDetailMap">
-        SELECT
-            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_lose_duration,
-            vic.lose_span as integrity_lose_span,
-            vic.check_span as integrity_check_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
+        SELECT 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_lose_duration,
+               vic.lose_span           as integrity_lose_span,
+               vic.check_span          as integrity_check_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
         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_log 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}
+                 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
+        WHERE c.host_code = #{hostCode}
+          and c.channel_code = #{channelCode}
+    </select>
+
+    <select id="selectAppChannels" resultType="com.xunmei.iot.vo.videoDiagnosis.VideoDiagnosisAppPageChannelVo">
+        select dc.channel_code,
+        if(vdc.status is null and vic.status is null and vdr.is_alarm is null,2,if(vdc.status=0 and vic.status=0 and vdr.is_alarm=0,0,1)) as state
+        FROM iot_dvr_channel dc
+        LEFT JOIN mediator_video_days_check vdc on dc.host_code=vdc.equipment_code and dc.channel_code
+        =vdc.channel_code
+        LEFT JOIN mediator_video_integrity_check vic on dc.host_code=vic.equipment_code and dc.channel_code
+        =vic.channel_code
+        LEFT JOIN mediator_video_diagnosis_record vdr on dc.host_code=vdr.equipment_code and dc.channel_code
+        =vdr.channel_code
+        where dc.host_code=#{equipmentCode} and dc.deleted=0
+        <if test="state==0">
+            and (vdc.`status`=0 or vic.`status`=0 or vdr.is_alarm=0)
+        </if>
+        <if test="state==1">
+            and (vdc.`status`=1 or vic.`status`>0 or vdr.is_alarm=1)
+        </if>
+        <if test="state==2">
+            and (vdc.`status` is null or vic.`status` is null or vdr.is_alarm is null)
+        </if>
+        order by  dc.channel_code asc
+    </select>
+    <select id="selectAppPage" resultMap="appPageMap">
+        SELECT equipment_code,
+        equipment_name,
+        org_name,
+        #{pageDto.state} as state
+        from iot_device
+        WHERE category_id = 1
+        <if test="pageDto.checkSub==true">
+            and org_path like concat(#{orgPath}, '%')
+        </if>
+        <if test="pageDto.checkSub==false">
+            and org_id=#{pageDto.orgId}
+        </if>
+        and deleted=0
+        <if test="pageDto.state!=null">
+            and equipment_code in (
+            SELECT dc.host_code
+            FROM iot_dvr_channel dc
+            LEFT JOIN mediator_video_days_check vdc on dc.host_code=vdc.equipment_code and dc.channel_code
+            =vdc.channel_code
+            LEFT JOIN mediator_video_integrity_check vic on dc.host_code=vic.equipment_code and dc.channel_code
+            =vic.channel_code
+            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
+            <if test="pageDto.state==0">
+                and (vdc.`status`=0 or vic.`status`=0 or vdr.is_alarm=0)
+            </if>
+            <if test="pageDto.state==1">
+                and (vdc.`status`=1 or vic.`status`>0 or vdr.is_alarm=1)
+            </if>
+            <if test="pageDto.state==2">
+                and (vdc.`status` is null or vic.`status` is null or vdr.is_alarm is null)
+            </if>
+            <if test="pageDto.checkSub==true">
+                and dc.org_path like concat(#{orgPath}, '%')
+            </if>
+            <if test="pageDto.checkSub==false">
+                and dc.org_id=#{pageDto.orgId}
+            </if>
+            GROUP BY dc.host_code
+            )
+        </if>
     </select>
 </mapper>

+ 16 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotSensorMapper.xml

@@ -47,4 +47,20 @@
         </where>
         order by s.state_update_time desc
     </select>
+    <select id="selectByIds"  resultType="com.xunmei.common.core.domain.iot.domain.IotSensor">
+        SELECT
+            org_id,
+            CONCAT(b.affiliated_area,'-',b.affiliated_bank,'-',b.short_name) as org_name,
+            device_name,
+            category_id,
+            infos AS info,
+            device_code
+        FROM
+            iot_sensor a
+        LEFT JOIN sys_org b ON a.org_id = b.id
+        where device_code in
+        <foreach collection="deviceIds" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>