|
|
@@ -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>()
|
|
|
+ }
|
|
|
}
|