Selaa lähdekoodia

报警主机子系统及防区基础信息

xujie 1 vuosi sitten
vanhempi
commit
009027c86f
24 muutettua tiedostoa jossa 596 lisäystä ja 27 poistoa
  1. 20 0
      project_data/sql/0.1.1/soc/soc.sql
  2. 4 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAlarmDefenceArea.java
  3. 4 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAlarmSubsystem.java
  4. 2 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/mapper/IotAlarmDefenceAreaMapper.java
  5. 3 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/mapper/IotAlarmSubsystemMapper.java
  6. 4 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/IotAlarmDefenceAreaService.java
  7. 4 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/IotAlarmSubsystemService.java
  8. 29 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/impl/IotAlarmDefenceAreaServiceImpl.java
  9. 31 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/impl/IotAlarmSubSystemServiceImpl.java
  10. 2 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/iot/service/IIotDeviceInfoService.java
  11. 21 10
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/iot/service/impl/IotDeviceInfoServiceImpl.java
  12. 8 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/constant/WebSocketConstants.java
  13. 30 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/DeviceBaseInfo.java
  14. 24 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmHostBaseInfo.java
  15. 31 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmInputInfo.java
  16. 27 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmOutputInfo.java
  17. 37 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/CommunicationParameter.java
  18. 23 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/SubSystemInfo.java
  19. 35 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/enums/DeviceCacheEnum.java
  20. 1 1
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/enums/ProductEnums.java
  21. 4 0
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/service/WebsocketService.java
  22. 222 15
      soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/service/impl/WebsocketServiceImpl.java
  23. 15 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAlarmDefenceAreaMapper.xml
  24. 15 0
      soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAlarmSubsystemMapper.xml

+ 20 - 0
project_data/sql/0.1.1/soc/soc.sql

@@ -79,6 +79,26 @@ BEGIN
         add iot_token varchar(50) null comment 'iot服务唯一编码 token' after state;
     END IF;
 
+    -- 子系统表添加iot_token字段
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'iot_alarm_subsystem'
+                    AND column_name = 'iot_token') THEN
+    alter table iot_alarm_subsystem
+        add iot_token varchar(50) null comment 'iot服务唯一编码 token' after update_by;
+    END IF;
+
+    -- 防区表添加iot_token字段
+    IF NOT EXISTS(SELECT *
+                  FROM information_schema.columns
+                  WHERE table_schema = DATABASE()
+                    AND table_name = 'iot_alarm_defence_area'
+                    AND column_name = 'iot_token') THEN
+    alter table iot_alarm_defence_area
+        add iot_token varchar(50) null comment 'iot服务唯一编码 token' after update_by;
+    END IF;
+
 
 
 

+ 4 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAlarmDefenceArea.java

@@ -105,5 +105,9 @@ public class IotAlarmDefenceArea implements Serializable {
     @TableField("update_by")
     private String updateBy;
 
+    @ApiModelProperty(value = "iot服务唯一编码")
+    @TableField("iot_token")
+    private String iotToken;
+
 
 }

+ 4 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/iot/domain/IotAlarmSubsystem.java

@@ -113,5 +113,9 @@ public class IotAlarmSubsystem implements Serializable {
     @ApiModelProperty(value = "是否关联登记簿",notes = "0否1是")
     private Integer inBook;
 
+    @ApiModelProperty(value = "iot服务唯一编码")
+    @TableField("iot_token")
+    private String iotToken;
+
 
 }

+ 2 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/mapper/IotAlarmDefenceAreaMapper.java

@@ -3,6 +3,7 @@ package com.xunmei.mediator.api.protection.mapper;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xunmei.common.core.domain.iot.domain.IotAlarmDefenceArea;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -14,5 +15,6 @@ import com.xunmei.common.core.domain.iot.domain.IotAlarmDefenceArea;
  */
 @InterceptorIgnore(blockAttack = "true")
 public interface IotAlarmDefenceAreaMapper extends BaseMapper<IotAlarmDefenceArea> {
+    IotAlarmDefenceArea getBySubSystemCodeAndDeviceName(@Param("token") String iotToken,@Param("deviceName") String deviceName,@Param("subSystemId") String subSystemId,@Param("inputIndex") Integer inputIndex);
 
 }

+ 3 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/mapper/IotAlarmSubsystemMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xunmei.common.core.domain.iot.domain.IotAlarmSubsystem;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -20,4 +21,6 @@ public interface IotAlarmSubsystemMapper extends BaseMapper<IotAlarmSubsystem> {
 
     void updateAllDelete();
 
+    IotAlarmSubsystem getByDeviceNameAndSubSystemId(@Param("token") String token,@Param("deviceName") String deviceName,@Param("code") String code);
+
 }

+ 4 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/IotAlarmDefenceAreaService.java

@@ -24,4 +24,8 @@ public interface IotAlarmDefenceAreaService extends IService<IotAlarmDefenceArea
     ReceiveErrorDto saveData(String msgId, SensorDataDto request);
 
     ReceiveErrorDto sensorData(SensorDataDto sensorData, String msgId);
+
+    void deleteByIotToken(String token);
+
+    IotAlarmDefenceArea getBySubSystemCodeAndDeviceName(String iotToken,String deviceName,Integer subSystemId,Integer inputIndex);
 }

+ 4 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/IotAlarmSubsystemService.java

@@ -24,4 +24,8 @@ public interface IotAlarmSubsystemService extends IService<IotAlarmSubsystem> {
     IotAlarmSubsystem findByCodeAndOrgId(String defenceAreaCode, Long orgId);
 
     ReceiveErrorDto saveData(ProtectionEditDto protectionEditDto, String msgId);
+
+    void deleteByIotToken(String token);
+
+    IotAlarmSubsystem getByDeviceNameAndSubSystemId(String iotToken,String deviceName,Integer subSystemId);
 }

+ 29 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/impl/IotAlarmDefenceAreaServiceImpl.java

@@ -1,18 +1,21 @@
 package com.xunmei.mediator.api.protection.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.iot.domain.*;
 import com.xunmei.common.core.util.BeanHelper;
 import com.xunmei.common.core.utils.IDHelper;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.mediator.api.north.service.NorthErrorService;
 import com.xunmei.mediator.api.protection.mapper.IotAlarmDefenceAreaMapper;
 import com.xunmei.mediator.api.protection.service.IIotDefenceAreaAlarmDataService;
 import com.xunmei.mediator.api.protection.service.IIotDefenceAreaDataLogService;
 import com.xunmei.mediator.api.protection.service.IIotDefenceAreaDataService;
 import com.xunmei.mediator.api.protection.service.IotAlarmDefenceAreaService;
+import com.xunmei.mediator.websocket.enums.DeviceCacheEnum;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.north.NorthError;
@@ -26,6 +29,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -54,6 +58,9 @@ public class IotAlarmDefenceAreaServiceImpl extends ServiceImpl<IotAlarmDefenceA
     @Resource
     IIotDefenceAreaDataService defenceAreaDataService;
 
+    @Resource
+    IotAlarmDefenceAreaMapper iotAlarmDefenceAreaMapper;
+
     @Override
     public List<IotAlarmDefenceArea> findBySubSystemCode(String defenceAreaCode,Long orgId) {
         return lambdaQuery()
@@ -247,4 +254,26 @@ public class IotAlarmDefenceAreaServiceImpl extends ServiceImpl<IotAlarmDefenceA
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteByIotToken(String token) {
+        UpdateWrapper<IotAlarmDefenceArea> uw = new UpdateWrapper<>();
+        uw.lambda().eq(IotAlarmDefenceArea::getIotToken, token);
+        uw.lambda().set(IotAlarmDefenceArea::getDeleted, 1);
+        update(uw);
+    }
+
+    @Override
+    public IotAlarmDefenceArea getBySubSystemCodeAndDeviceName(String iotToken, String deviceName, Integer subSystemId, Integer inputIndex) {
+        String key = DeviceCacheEnum.IOT_DEFENCE_AREA.getCode() + iotToken + "_" + deviceName + "_" + subSystemId + "_" + inputIndex;
+        IotAlarmDefenceArea info = RedisUtils.getCacheObject(key);
+        if (info == null){
+            IotAlarmDefenceArea defenceArea = iotAlarmDefenceAreaMapper.getBySubSystemCodeAndDeviceName(iotToken, deviceName, String.valueOf(subSystemId),inputIndex);
+            if (defenceArea != null){
+                RedisUtils.setCacheObject(key, defenceArea, Duration.ofMillis(1000 * 60 * 60));
+                return defenceArea;
+            }
+        }
+        return info;
+    }
 }

+ 31 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/protection/service/impl/IotAlarmSubSystemServiceImpl.java

@@ -2,7 +2,9 @@ package com.xunmei.mediator.api.protection.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.Constants;
@@ -26,8 +28,11 @@ import com.xunmei.mediator.api.protection.service.IotAlarmSubsystemService;
 import com.xunmei.mediator.api.north.service.impl.NorthStatisticsSyncService;
 import com.xunmei.mediator.util.CheckDataUtil;
 import com.xunmei.mediator.util.RedisCheckRepeatDataUtil;
+import com.xunmei.mediator.websocket.enums.DeviceCacheEnum;
+import com.xunmei.mediator.websocket.enums.DeviceTypeEnum;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.domain.iot.IotDeviceInfo;
 import com.xunmei.system.api.domain.north.NorthError;
 import com.xunmei.system.api.dto.DataPageDto;
 import com.xunmei.system.api.dto.protection.DefenceAreaDto;
@@ -48,6 +53,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -82,6 +88,8 @@ public class IotAlarmSubSystemServiceImpl extends ServiceImpl<IotAlarmSubsystemM
     @Autowired
     @Qualifier(ThreadPoolConfig.MEDIATOR_EXECUTOR)
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private IotAlarmSubsystemMapper iotAlarmSubsystemMapper;
 
     @Override
     public IotAlarmSubsystem findByCodeAndOrgId(String defenceAreaCode, Long orgId) {
@@ -238,6 +246,29 @@ public class IotAlarmSubSystemServiceImpl extends ServiceImpl<IotAlarmSubsystemM
         return ReceiveErrorDto.success();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteByIotToken(String token) {
+        UpdateWrapper<IotAlarmSubsystem> uw = new UpdateWrapper<>();
+        uw.lambda().eq(IotAlarmSubsystem::getIotToken, token);
+        uw.lambda().set(IotAlarmSubsystem::getDeleted, 1);
+        update(uw);
+    }
+
+    @Override
+    public IotAlarmSubsystem getByDeviceNameAndSubSystemId(String iotToken, String deviceName, Integer subSystemId) {
+        String key = DeviceCacheEnum.IOT_SUB_SYSTEM.getCode() + iotToken + "_" + deviceName + "_" + subSystemId;
+        IotAlarmSubsystem info = RedisUtils.getCacheObject(key);
+        if (info == null){
+            IotAlarmSubsystem subsystem = iotAlarmSubsystemMapper.getByDeviceNameAndSubSystemId(iotToken, deviceName, String.valueOf(subSystemId));
+            if (subsystem != null){
+                RedisUtils.setCacheObject(key, subsystem, Duration.ofMillis(1000 * 60 * 60));
+                return subsystem;
+            }
+        }
+        return info;
+    }
+
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     public void saveAndUpdate(List<DefenceAreaDto> defenceareaList, String msgId) {
         //查询报警主机主机设备列表

+ 2 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/iot/service/IIotDeviceInfoService.java

@@ -69,4 +69,6 @@ public interface IIotDeviceInfoService extends IService<IotDeviceInfo> {
     void updateAlarmHostDevice(List<IotDeviceInfo> data);
 
     void deleteAlarmHostDeviceByToken(String token);
+
+    void deleteAlarmHostAndDvsByToken(String token);
 }

+ 21 - 10
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/iot/service/impl/IotDeviceInfoServiceImpl.java

@@ -9,6 +9,7 @@ import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.mediator.iot.mapper.IotDeviceInfoMapper;
 import com.xunmei.mediator.iot.service.IIotDeviceInfoService;
+import com.xunmei.mediator.websocket.enums.DeviceCacheEnum;
 import com.xunmei.mediator.websocket.enums.DeviceTypeEnum;
 import com.xunmei.system.api.domain.iot.IotDeviceInfo;
 
@@ -26,10 +27,6 @@ import org.springframework.transaction.annotation.Transactional;
 public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, IotDeviceInfo> implements IIotDeviceInfoService {
 
 
-    private static final String IOT_DVS_INFO = "device:iot_dvs_info_";
-    private static final String IOT_CHANNEL_INFO = "device:iot_channel_info_";
-    private static final String IOT_AlARM_HOST_INFO = "device:iot_alarm_host_info_";
-
     /**
      * 根据设备类型和设备编码,获取设备信息
      *
@@ -41,7 +38,12 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         /**
          * RedisUtils,加入缓存机制
          */
-        String key = IOT_DVS_INFO + token + "_" + deviceType + "_" + deviceCode;
+        String key;
+        if (ObjectUtil.equal(DeviceTypeEnum.ALARM_HOST.getCode(),deviceType)){
+            key = DeviceCacheEnum.IOT_AlARM_HOST_INFO.getCode() + token + "_" + deviceType + "_" + deviceCode;
+        }else {
+            key = DeviceCacheEnum.IOT_DVS_INFO.getCode() + token + "_" + deviceType + "_" + deviceCode;
+        }
         IotDeviceInfo info = RedisUtils.getCacheObject(key);
         if (info == null) {
             QueryWrapper<IotDeviceInfo> qw = new QueryWrapper();
@@ -67,7 +69,7 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
      */
     public IotDeviceInfo selectByTypeAndHostAndCode(String token, String hostCode, String deviceCode) {
 
-        String key = IOT_CHANNEL_INFO + token + "_" + hostCode + "_" + deviceCode;
+        String key = DeviceCacheEnum.IOT_CHANNEL_INFO.getCode() + token + "_" + hostCode + "_" + deviceCode;
         IotDeviceInfo info = RedisUtils.getCacheObject(key);
         if (info == null) {
             QueryWrapper<IotDeviceInfo> qw = new QueryWrapper();
@@ -136,13 +138,13 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     private void updateCache(IotDeviceInfo info, int type) {
         String key = "";
         if (type == 1) {
-            key = IOT_DVS_INFO + info.getIotToken() + "_" + info.getDeviceType() + "_" + info.getDeviceCode();
+            key = DeviceCacheEnum.IOT_DVS_INFO.getCode() + info.getIotToken() + "_" + info.getDeviceType() + "_" + info.getDeviceCode();
         }
         if (type == 2) {
-            key = IOT_CHANNEL_INFO + info.getIotToken() + "_" + info.getHostCode() + "_" + info.getDeviceCode();
+            key = DeviceCacheEnum.IOT_CHANNEL_INFO.getCode() + info.getIotToken() + "_" + info.getHostCode() + "_" + info.getDeviceCode();
         }
         if (type == 3) {
-            key = IOT_AlARM_HOST_INFO + info.getIotToken() + "_" + info.getHostCode() + "_" + info.getDeviceCode();
+            key = DeviceCacheEnum.IOT_AlARM_HOST_INFO.getCode() + info.getIotToken() + "_" + info.getDeviceType() + "_" + info.getDeviceCode();
         }
         RedisUtils.setCacheObject(key, info, Duration.ofMillis(1000 * 60 * 60));
     }
@@ -183,10 +185,19 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteAlarmHostDeviceByToken(String token) {
-        UpdateWrapper<IotDeviceInfo> uw = new UpdateWrapper();
+        UpdateWrapper<IotDeviceInfo> uw = new UpdateWrapper<>();
         uw.lambda().eq(IotDeviceInfo::getIotToken, token);
         uw.lambda().eq(IotDeviceInfo::getDeviceType, DeviceTypeEnum.ALARM_HOST);
         uw.lambda().set(IotDeviceInfo::getDeleted, 1);
         update(uw);
     }
+
+    @Override
+    public void deleteAlarmHostAndDvsByToken(String token) {
+        UpdateWrapper<IotDeviceInfo> uw = new UpdateWrapper<>();
+        uw.lambda().eq(IotDeviceInfo::getIotToken, token);
+        uw.lambda().in(IotDeviceInfo::getDeviceType, new Object[]{DeviceTypeEnum.DVS.getDesc(), DeviceTypeEnum.ALARM_HOST.getCode()});
+        uw.lambda().set(IotDeviceInfo::getDeleted, 1);
+        update(uw);
+    }
 }

+ 8 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/constant/WebSocketConstants.java

@@ -101,8 +101,15 @@ public interface WebSocketConstants {
      */
     String DISK_STATUS = "diskStatus";
 
+    /**
+     * 获取报警主机和DVS基础信息
+     */
+    String GET_DEVICE_BASE_INFOS = "getDeviceBaseInfos";
 
-
+    /**
+     * 获取报警主机子系统和防区
+     */
+    String GET_ALARM_HOST_DEVICE_INFOS = "getAlarmHostDeviceInfos";
 
     // ------------------ IOT提供的服务能力结束 ------------------
 

+ 30 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/DeviceBaseInfo.java

@@ -0,0 +1,30 @@
+package com.xunmei.mediator.websocket.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceBaseInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String[] categories;
+
+    private String productName;
+
+    private String deviceName;
+
+    private String displayName;
+
+    private String nodeType;
+
+    private boolean enabled;
+
+    private String sourceName;
+
+    private String description;
+}

+ 24 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmHostBaseInfo.java

@@ -0,0 +1,24 @@
+package com.xunmei.mediator.websocket.dto.alarmHost;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AlarmHostBaseInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private List<SubSystemInfo> subsystems;
+
+    private List<AlarmInputInfo> inputs;
+
+    private List<AlarmOutputInfo> outputs;
+
+    private List<CommunicationParameter> communicationParameters;
+
+}

+ 31 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmInputInfo.java

@@ -0,0 +1,31 @@
+package com.xunmei.mediator.websocket.dto.alarmHost;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AlarmInputInfo  implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String productName;
+
+    private String deviceName;
+
+    private String inputName;
+
+    private Integer inputIndex;
+
+    private Integer moduleAddress;
+
+    private Integer subsystemId;
+
+    private String moduleType;
+
+    private String sensorType;
+}

+ 27 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/AlarmOutputInfo.java

@@ -0,0 +1,27 @@
+package com.xunmei.mediator.websocket.dto.alarmHost;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AlarmOutputInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String productName;
+
+    private String deviceName;
+
+    private String outputName;
+
+    private Integer outputIndex;
+
+    private Integer moduleAddress;
+
+    private String moduleType;
+}

+ 37 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/CommunicationParameter.java

@@ -0,0 +1,37 @@
+package com.xunmei.mediator.websocket.dto.alarmHost;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CommunicationParameter implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String productName;
+
+    private String deviceName;
+
+    private String deviceAddress;
+
+    private Integer devicePort;
+
+    private String listenAddress;
+
+    private Integer listenPort;
+
+    private String deviceMacAddress;
+
+    private String deviceAccount;
+
+    private String devicePassword;
+
+    private String deviceType;
+
+    private String other;
+
+}

+ 23 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/dto/alarmHost/SubSystemInfo.java

@@ -0,0 +1,23 @@
+package com.xunmei.mediator.websocket.dto.alarmHost;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SubSystemInfo  implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String productName;
+
+    private String deviceName;
+
+    private String subsystemName;
+
+    private Integer subsystemId;
+}

+ 35 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/enums/DeviceCacheEnum.java

@@ -0,0 +1,35 @@
+package com.xunmei.mediator.websocket.enums;
+
+public enum DeviceCacheEnum {
+    IOT_DVS_INFO("device:iot_dvs_info_","dvs"),
+    IOT_CHANNEL_INFO("device:iot_channel_info_","通道"),
+    IOT_AlARM_HOST_INFO("device:iot_alarm_host_info_","报警主机"),
+    IOT_SUB_SYSTEM("device:iot_sub_system_info_","报警主机子系统"),
+    IOT_DEFENCE_AREA("device:iot_defence_area_info_","报警主机防区(传感器)"),
+    ;
+
+    private String code;
+
+    private String desc;
+
+    DeviceCacheEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

+ 1 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/enums/ProductEnums.java

@@ -14,7 +14,7 @@ public enum ProductEnums {
     DVS(new String[]{"VGSII_Hik","VGSII_DaHua"}),
     ALARM_HOST(new String[]{"InAnter_BM1600NTSmall", "Hik_DS19A", "HikModule", "FengYe_H402", "HengTong_CKWU01C", "MtaOCX", "CrossProcessDemo", "HoneywellOCX_IPM", "DaHuaAlarmHost", "BOSCH_CMS"}),
 
-
+    IOT_SERVER(new String[]{"IoTServer"}),
     ;
 
     private String[] productName;

+ 4 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/service/WebsocketService.java

@@ -1,6 +1,8 @@
 package com.xunmei.mediator.websocket.service;
 
 
+import com.xunmei.mediator.websocket.dto.DeviceBaseInfo;
+import com.xunmei.mediator.websocket.dto.alarmHost.AlarmHostBaseInfo;
 import com.xunmei.mediator.websocket.dto.alarmHost.AlarmHostInfo;
 import com.xunmei.mediator.websocket.dto.dvs.DvsBaseInfo;
 
@@ -15,4 +17,6 @@ public interface WebsocketService {
     void dealDvsBaseInfo(DvsBaseInfo info, String token) throws Exception;
 
     void dealAlarmHostInfo(List<AlarmHostInfo> info, String token) throws Exception;
+
+    void dealSubSystemAndInput(AlarmHostBaseInfo alarmHostBaseInfo, String token) throws Exception;
 }

+ 222 - 15
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/service/impl/WebsocketServiceImpl.java

@@ -1,37 +1,42 @@
 package com.xunmei.mediator.websocket.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.xunmei.common.core.domain.iot.domain.IotAlarmDefenceArea;
+import com.xunmei.common.core.domain.iot.domain.IotAlarmSubsystem;
 import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
 import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.mediator.api.protection.service.IotAlarmDefenceAreaService;
+import com.xunmei.mediator.api.protection.service.IotAlarmSubsystemService;
 import com.xunmei.mediator.api.server.service.IotServerInfoService;
 import com.xunmei.mediator.api.video.service.IotDvrDiskService;
 import com.xunmei.mediator.iot.service.IIotDeviceInfoExtendService;
 import com.xunmei.mediator.iot.service.IIotDeviceInfoService;
+import com.xunmei.mediator.websocket.constant.WebSocketConstants;
+import com.xunmei.mediator.websocket.dto.DeviceBaseInfo;
+import com.xunmei.mediator.websocket.dto.WebsocketExecuteReq;
+import com.xunmei.mediator.websocket.dto.alarmHost.AlarmHostBaseInfo;
 import com.xunmei.mediator.websocket.dto.alarmHost.AlarmHostInfo;
+import com.xunmei.mediator.websocket.dto.alarmHost.AlarmInputInfo;
+import com.xunmei.mediator.websocket.dto.alarmHost.SubSystemInfo;
 import com.xunmei.mediator.websocket.dto.dvs.ChannelInfo;
 import com.xunmei.mediator.websocket.dto.dvs.DiskInfo;
 import com.xunmei.mediator.websocket.dto.dvs.DvsBaseInfo;
 import com.xunmei.mediator.websocket.dto.dvs.DvsInfo;
 import com.xunmei.mediator.websocket.enums.DeviceTypeEnum;
+import com.xunmei.mediator.websocket.enums.ProductEnums;
 import com.xunmei.mediator.websocket.redis.WebsocketPublisher;
+import com.xunmei.mediator.websocket.service.RouterService;
 import com.xunmei.mediator.websocket.service.WebsocketService;
 import com.xunmei.system.api.domain.iot.IotDeviceInfo;
 import com.xunmei.system.api.domain.iot.IotDeviceInfoExtend;
 import com.xunmei.system.api.domain.websocket.RedisWebsocketMsg;
-
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.redisson.api.RKeys;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -43,7 +48,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
-public class WebsocketServiceImpl implements WebsocketService {
+public class WebsocketServiceImpl implements WebsocketService, RouterService {
     private static final Logger log = LoggerFactory.getLogger(WebsocketServiceImpl.class);
     @Autowired
     private WebsocketPublisher websocketPublisher;
@@ -56,11 +61,19 @@ public class WebsocketServiceImpl implements WebsocketService {
     @Autowired
     private IotDvrDiskService iIotDvrDiskService;
 
+    @Autowired
+    private IotAlarmDefenceAreaService iotAlarmDefenceAreaService;
+    @Autowired
+    private IotAlarmSubsystemService iotAlarmSubsystemService;
+
+
 
     private static final String LOCK_DVS_ACCPET_KEY_PREFIX = "websocket:lock:base_info_dvs_";
 
     private static final String LOCK_ALARM_HOST_ACCPET_KEY_PREFIX = "websocket:lock:base_info_alarm_host_";
 
+    private static final String LOCK_SUBSYSTEM_INPUT_ACCPET_KEY_PREFIX = "websocket:lock:base_info_subSystem_input_";
+
     /**
      * 给指定iot服务发送消息
      *
@@ -183,6 +196,7 @@ public class WebsocketServiceImpl implements WebsocketService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void dealAlarmHostInfo(List<AlarmHostInfo> alarmHostInfos, String token) throws Exception {
         //添加分布式锁
         String lockKey = LOCK_ALARM_HOST_ACCPET_KEY_PREFIX + token;
@@ -222,6 +236,52 @@ public class WebsocketServiceImpl implements WebsocketService {
         });
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void dealSubSystemAndInput(AlarmHostBaseInfo alarmHostBaseInfo, String token) throws Exception {
+        //添加分布式锁
+        String lockKey = LOCK_SUBSYSTEM_INPUT_ACCPET_KEY_PREFIX + token;
+        lockAndExecute(lockKey, () -> {
+            if (StringUtils.isEmpty(token) || alarmHostBaseInfo == null) {
+                log.error("同步报警主机子系统和防区信息失败。原因:token或alarmHostBaseInfo为空");
+                return;
+            }
+            try {
+                if (StringUtils.isEmpty(token)) {
+                    log.error("同步报警主机子系统和防区信息失败,token为null,同步数据失败!");
+                    return;
+                }
+
+                IotServerInfo serverInfo = iotServerInfoService.selectByToken(token);
+                if (ObjectUtil.isEmpty(serverInfo)) {
+                    log.error("同步报警主机子系统和防区信息失败,token:{},获取机构信息未空,结束同步!", token);
+                    return;
+                }
+
+                //逻辑删除子系统和防区
+                iotAlarmSubsystemService.deleteByIotToken(token);
+                iotAlarmDefenceAreaService.deleteByIotToken(token);
+
+                //添加子系统集合
+                List<IotAlarmSubsystem> addSubSystemList = new ArrayList();
+                //更新子系统集合
+                List<IotAlarmSubsystem> updateSubSystemList = new ArrayList();
+
+                //添加子系统集合
+                List<IotAlarmDefenceArea> addDefenceAreaList = new ArrayList();
+                //更新子系统集合
+                List<IotAlarmDefenceArea> updateDefenceAreaList = new ArrayList();
+
+                processSubSystem(alarmHostBaseInfo.getSubsystems(),serverInfo,token,addSubSystemList,updateSubSystemList);
+                processDefenceArea(alarmHostBaseInfo.getInputs(),serverInfo,token,addDefenceAreaList,updateDefenceAreaList);
+
+
+            } catch (Exception var8) {
+                log.error("同步报警主机基础信息过程中出现异常", var8);
+            }
+        });
+    }
+
     /**
      * 批量保存和更新设备信息
      * @param addList
@@ -496,7 +556,7 @@ public class WebsocketServiceImpl implements WebsocketService {
 
 
     /**
-     * 处理dvs数据
+     * 处理报警主机数据
      *
      * @param alarmHostInfos
      * @param serverInfo
@@ -515,13 +575,9 @@ public class WebsocketServiceImpl implements WebsocketService {
                 if (info == null) {
                     info = createAlarmHostInfo(alarmHostInfo, serverInfo);
                     addList.add(info);
-                    //addListExtend.add(createIotDeviceInfoExtend(dvsInfo, info.getId(),token));
                 } else {
                     dealAlarmHostInfo(alarmHostInfo, info,serverInfo);
                     updateList.add(info);
-                    //IotDeviceInfoExtend extend = iIotDeviceInfoExtendService.selectByDeviceId(info.getId());
-                    //dealDvsExtend(dvsInfo, extend);
-                    //updateListExtend.add(extend);
                 }
             }
         }
@@ -577,4 +633,155 @@ public class WebsocketServiceImpl implements WebsocketService {
         }
     }
 
+    /**
+     * 处理报警主机子系统数据
+     * @param subSystemInfos
+     * @param serverInfo
+     * @param token
+     * @param addList
+     * @param updateList
+     */
+    private void processSubSystem(List<SubSystemInfo> subSystemInfos, IotServerInfo serverInfo , String token , List<IotAlarmSubsystem> addList , List<IotAlarmSubsystem> updateList){
+        if (ObjectUtil.isEmpty(subSystemInfos)) {
+            log.error("同步报警主机子系统信息,获取报警主机子系统信息为空");
+        } else {
+            for (SubSystemInfo subSystemInfo : subSystemInfos) {
+                IotAlarmSubsystem info = iotAlarmSubsystemService.getByDeviceNameAndSubSystemId(token, subSystemInfo.getDeviceName(), subSystemInfo.getSubsystemId());
+                if (info == null) {
+                    info = createAlarmSubSystem(subSystemInfo, serverInfo);
+                    addList.add(info);
+                } else {
+                    dealAlarmSubSystem(subSystemInfo, info,serverInfo);
+                    updateList.add(info);
+                }
+            }
+        }
+    }
+
+    private IotAlarmSubsystem createAlarmSubSystem(SubSystemInfo subSystemInfo, IotServerInfo serverInfo){
+        IotAlarmSubsystem info = new IotAlarmSubsystem();
+        long id = IdWorker.getId(info);
+        info.setDeleted(0);
+        info.setCode(String.valueOf(subSystemInfo.getSubsystemId()));
+        info.setName(subSystemInfo.getSubsystemName());
+        //布防状态,0:撤防,1:布防,2:未知(未登记过或离线)
+        info.setStatus(2);
+        info.setOrgId(serverInfo.getOrgId());
+        info.setOrgName(serverInfo.getOrgName());
+        info.setOrgPath(serverInfo.getOrgPath());
+        info.setAlarmHostCode(subSystemInfo.getDeviceName());
+        //是否关联登记簿,0否1是
+        info.setInBook(0);
+        info.setIotToken(serverInfo.getIotCode());
+        info.setUpdateTime(LocalDateTime.now());
+        info.setCreateTime(LocalDateTime.now());
+        //设备来源:0:设备登记;1:iot推送
+        info.setSource(1);
+        info.setId(id);
+        return info;
+    }
+
+    private void dealAlarmSubSystem(SubSystemInfo subSystemInfo, IotAlarmSubsystem info, IotServerInfo serverInfo) {
+        info.setDeleted(0);
+        info.setName(subSystemInfo.getSubsystemName());
+        info.setOrgId(serverInfo.getOrgId());
+        info.setOrgName(serverInfo.getOrgName());
+        info.setOrgPath(serverInfo.getOrgPath());
+        info.setUpdateBy("system");
+        info.setUpdateTime(LocalDateTime.now());
+    }
+
+    /**
+     * 处理报警主机防区数据
+     * @param alarmInputInfos
+     * @param serverInfo
+     * @param token
+     * @param addList
+     * @param updateList
+     */
+    private void processDefenceArea(List<AlarmInputInfo> alarmInputInfos, IotServerInfo serverInfo , String token , List<IotAlarmDefenceArea> addList, List<IotAlarmDefenceArea> updateList){
+        if (ObjectUtil.isEmpty(alarmInputInfos)) {
+            log.error("同步报警主机防区信息,获取报警主机防区信息为空");
+        } else {
+            for (AlarmInputInfo alarmInputInfo : alarmInputInfos) {
+                IotAlarmDefenceArea info = iotAlarmDefenceAreaService.getBySubSystemCodeAndDeviceName(token,alarmInputInfo.getDeviceName(),alarmInputInfo.getSubsystemId(),alarmInputInfo.getInputIndex());
+                if (info == null) {
+                    info = createDefenceArea(alarmInputInfo, serverInfo);
+                    addList.add(info);
+                } else {
+                    dealDefenceArea(alarmInputInfo, info,serverInfo);
+                    updateList.add(info);
+                }
+            }
+        }
+    }
+
+    private IotAlarmDefenceArea createDefenceArea(AlarmInputInfo alarmInputInfo, IotServerInfo serverInfo){
+        IotAlarmDefenceArea info = new IotAlarmDefenceArea();
+        long id = IdWorker.getId(info);
+        info.setDeleted(0);
+        info.setAlarmHostCode(alarmInputInfo.getDeviceName());
+        info.setSubSystemCode(String.valueOf(alarmInputInfo.getSubsystemId()));
+        info.setDefenceAreaName(alarmInputInfo.getInputName());
+        info.setDefenceAreaIndex(alarmInputInfo.getInputIndex());
+        info.setSensorType(alarmInputInfo.getSensorType());
+        //info.setSensorTypeName();
+        //alarm:报警,bypass:旁路,normal:正常,activity:活动,unKnown:未知
+        info.setState("unKnown");
+        info.setIotToken(serverInfo.getIotCode());
+        info.setOrgId(serverInfo.getOrgId());
+        info.setOrgName(serverInfo.getOrgName());
+        info.setOrgPath(serverInfo.getOrgPath());
+        info.setUpdateTime(LocalDateTime.now());
+        info.setCreateTime(LocalDateTime.now());
+        info.setId(id);
+        return info;
+    }
+
+    private void dealDefenceArea(AlarmInputInfo alarmInputInfo, IotAlarmDefenceArea info, IotServerInfo serverInfo) {
+        info.setDeleted(0);
+        info.setDefenceAreaName(alarmInputInfo.getInputName());
+        info.setOrgId(serverInfo.getOrgId());
+        info.setOrgName(serverInfo.getOrgName());
+        info.setOrgPath(serverInfo.getOrgPath());
+        info.setSensorType(alarmInputInfo.getSensorType());
+        info.setUpdateBy("system");
+        info.setUpdateTime(LocalDateTime.now());
+    }
+
+
+    @Override
+    public ProductEnums product() {
+        return ProductEnums.IOT_SERVER;
+    }
+
+    @Override
+    public String routerKey() {
+        StringJoiner result = new StringJoiner(",");
+        result.add(WebSocketConstants.GET_DEVICE_BASE_INFOS);
+        result.add(WebSocketConstants.GET_ALARM_HOST_DEVICE_INFOS);
+        return result.toString();
+    }
+
+    @Override
+    public Object execute(WebsocketExecuteReq req) {
+        try {
+            if (WebSocketConstants.GET_DEVICE_BASE_INFOS.equals(req.getEvent())){
+                JSONObject object = (JSONObject) req.getData();
+                if (object != null){
+                    List<DeviceBaseInfo> deviceBaseInfos = (List<DeviceBaseInfo>) object.get("deviceBaseInfos");
+                    chooseMethod(deviceBaseInfos);
+                }
+            }else if(WebSocketConstants.GET_ALARM_HOST_DEVICE_INFOS.equals(req.getEvent())){
+                dealSubSystemAndInput((AlarmHostBaseInfo) req.getData(),req.getToken());
+            }
+        }catch (Exception e){
+
+        }
+        return null;
+    }
+
+    private void chooseMethod(List<DeviceBaseInfo> deviceBaseInfos){
+        //new HashMap<String,List>()
+    }
 }

+ 15 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAlarmDefenceAreaMapper.xml

@@ -2,4 +2,19 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xunmei.mediator.api.protection.mapper.IotAlarmDefenceAreaMapper">
 
+    <select id="getBySubSystemCodeAndDeviceName"
+            resultType="com.xunmei.common.core.domain.iot.domain.IotAlarmDefenceArea">
+        SELECT
+            *
+        FROM
+            iot_alarm_defence_area a
+                LEFT JOIN iot_device_info d ON a.alarm_host_code = d.device_code
+                AND d.device_type = '4'
+        WHERE
+            d.device_code = #{deviceName}
+          AND d.iot_token = #{token}
+          AND a.defence_area_index = #{inputIndex}
+          AND a.sub_system_code = #{subSystemId}
+
+    </select>
 </mapper>

+ 15 - 0
soc-modules/soc-modules-mediator/src/main/resources/mapper/IotAlarmSubsystemMapper.xml

@@ -5,4 +5,19 @@
     <update id="updateAllDelete">
         update iot_alarm_subsystem set deleted=1;
     </update>
+
+    <select id="getByDeviceNameAndSubSystemId"
+            resultType="com.xunmei.common.core.domain.iot.domain.IotAlarmSubsystem">
+        SELECT
+            *
+        FROM
+            iot_alarm_subsystem s
+                LEFT JOIN iot_device_info d ON s.alarm_host_code = d.device_code
+                AND d.device_type = '4'
+        WHERE
+            d.iot_token = #{token}
+          AND d.device_code = #{deviceName}
+          AND s.`code` = #{code}
+
+    </select>
 </mapper>