Bläddra i källkod

server info 代码提交

jingyuanchao 1 år sedan
förälder
incheckning
ca33722843

+ 7 - 3
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteMediatorService.java

@@ -5,9 +5,7 @@ import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.system.api.Eto.SubSystemControlEto;
 import com.xunmei.system.api.factory.RemoteMediatorFallbackFactory;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * 字典服务
@@ -19,6 +17,7 @@ public interface RemoteMediatorService {
 
     /**
      * 处理缓存中的通道数据
+     *
      * @return
      */
     @GetMapping("/mediator/channelCacheDeal")
@@ -26,6 +25,7 @@ public interface RemoteMediatorService {
 
     /**
      * 主动获取录像完整性数据
+     *
      * @return
      */
     @GetMapping("/mediator/videoIntegrityCheck")
@@ -42,4 +42,8 @@ public interface RemoteMediatorService {
 
     @PostMapping("/mediator/subSystemControl")
     AjaxResult subSystemControl(@RequestBody SubSystemControlEto eto);
+
+
+    @GetMapping("/mediator/closeSession")
+    AjaxResult closeSession(@RequestParam(value = "iotCode") String iotCode);
 }

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteMediatorFallbackFactory.java

@@ -51,6 +51,11 @@ public class RemoteMediatorFallbackFactory implements FallbackFactory<RemoteMedi
             public AjaxResult subSystemControl(SubSystemControlEto eto) {
                 return null;
             }
+
+            @Override
+            public AjaxResult closeSession(String iotCode) {
+                return null;
+            }
         };
     }
 }

+ 20 - 1
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotServerInfoServiceImpl.java

@@ -11,6 +11,7 @@ import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.iot.domain.IotServerInfo;
 import com.xunmei.common.core.enums.iot.IotServerConnectStatus;
 import com.xunmei.common.core.exception.SystemException;
+import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.iot.dto.serverInfo.IotServerInfoEditDto;
@@ -18,6 +19,7 @@ import com.xunmei.iot.dto.serverInfo.IotServerInfoPageDto;
 import com.xunmei.iot.mapper.IotServerInfoMapper;
 import com.xunmei.iot.service.IotServerInfoService;
 import com.xunmei.iot.vo.serverInfo.IotServerInfoPageVo;
+import com.xunmei.system.api.RemoteMediatorService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +31,7 @@ import java.net.URLEncoder;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -44,6 +47,8 @@ public class IotServerInfoServiceImpl extends ServiceImpl<IotServerInfoMapper, I
 
     @Autowired
     RemoteOrgService orgService;
+    @Autowired
+    RemoteMediatorService mediatorService;
 
     @Override
     public TableDataInfo<IotServerInfoPageVo> serverPage(IotServerInfoPageDto request) {
@@ -81,7 +86,7 @@ public class IotServerInfoServiceImpl extends ServiceImpl<IotServerInfoMapper, I
         return baseMapper.insert(serverInfo);
     }
 
-    private String getVerificationCode(List<String> usedCodeList){
+    private String getVerificationCode(List<String> usedCodeList) {
         while (true) {
             String numericCode = numericCode();
             if (!usedCodeList.contains(numericCode)) {
@@ -114,6 +119,20 @@ public class IotServerInfoServiceImpl extends ServiceImpl<IotServerInfoMapper, I
         info.setIotName(req.getIotName());
         info.setEnable(req.getEnable());
         updateById(info);
+        if (1 == req.getEnable()) {
+            CompletableFuture.runAsync(() -> {
+                try {
+                    final AjaxResult result = mediatorService.closeSession(info.getIotCode());
+                    if (result.isSuccess()) {
+                        info.setIotStatus(IotServerConnectStatus.OFFLINE.getIdx());
+                        updateById(info);
+                    }
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
     }
 
     @Override

+ 12 - 3
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/north/controller/MediatorController.java

@@ -5,6 +5,7 @@ import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.mediator.api.host.service.IIotDvrChannelService;
 import com.xunmei.mediator.api.protection.service.IIotAlarmHostService;
 import com.xunmei.mediator.api.video.service.IVideoIntegrityCheckService;
+import com.xunmei.mediator.websocket.holder.WebSocketSessionHolder;
 import com.xunmei.mediator.websocket.service.WebsocketService;
 import com.xunmei.system.api.Eto.SubSystemControlEto;
 import io.swagger.annotations.ApiOperation;
@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 
 
 /**
@@ -56,7 +58,7 @@ public class MediatorController {
     @ApiOperation("定时任务获取所有的录像完整性数据")
     @GetMapping({"/mediator/videoDiagnosis"})
     public AjaxResult videoDiagnosis() {
-      //  this.videoDiagnosisRecordService.invokeVideoDiagnosisForSchedule();
+        //  this.videoDiagnosisRecordService.invokeVideoDiagnosisForSchedule();
         return AjaxResult.success();
     }
 
@@ -86,10 +88,17 @@ public class MediatorController {
     @PostMapping({"/mediator/subSystemControl"})
     public AjaxResult subSystemControl(@RequestBody SubSystemControlEto eto) {
         try {
-            alarmHostService.subSystemControl(eto.getId(),eto.getIsAlarm());
+            alarmHostService.subSystemControl(eto.getId(), eto.getIsAlarm());
             return AjaxResult.success();
-        }catch (Exception r){
+        } catch (Exception r) {
             return AjaxResult.error("布撤防控制指令下发失败!");
         }
     }
+
+    @ApiOperation("定时任务获取所有的dvs下通道和硬盘信息")
+    @GetMapping({"/mediator/closeSession"})
+    public AjaxResult closeSession(String iotCode) throws IOException {
+        WebSocketSessionHolder.closeServe(iotCode);
+        return AjaxResult.success();
+    }
 }

+ 1 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/handler/SocWebSocketHandler.java

@@ -232,7 +232,7 @@ public class SocWebSocketHandler extends AbstractWebSocketHandler {
      * @param status  关闭状态信息
      */
     @Override
-    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws IOException {
         String token = WebSocketSessionHolder.getSessionKey(session);
         WebSocketSessionHolder.removeSession(token);
         if (StringUtils.isNotEmpty(token)) {

+ 35 - 5
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/websocket/holder/WebSocketSessionHolder.java

@@ -1,21 +1,24 @@
 package com.xunmei.mediator.websocket.holder;
 
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.date.DateUtil;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.utils.JacksonUtils;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.mediator.websocket.dto.WebsocketResult;
-import com.xunmei.system.api.util.LogUtils;
+import com.xunmei.mediator.websocket.enums.WebsocketStatus;
+import com.xunmei.mediator.websocket.utils.WebSocketUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
-import org.springframework.web.socket.TextMessage;
 import org.springframework.web.socket.WebSocketSession;
 
 import java.io.IOException;
 import java.time.Duration;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -79,6 +82,33 @@ public class WebSocketSessionHolder {
         }
     }
 
+    public static void closeServe(String sessionKey) throws IOException {
+        if (StringUtils.isNotEmpty(sessionKey) && USER_SESSION_MAP.containsKey(sessionKey)) {
+            final WebSocketSession webSocketSession = USER_SESSION_MAP.get(sessionKey);
+            if (webSocketSession != null && webSocketSession.isOpen()) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("statusDescription", "链接服务已被中心平台编辑为停用!");
+                map.put("statusCode", WebsocketStatus.CLOSED.getStatusCode());
+                WebsocketResult result = createWebsocketResult(null, "login", map);
+                WebSocketUtils.sendMessage(webSocketSession, JacksonUtils.toJSONString(result));
+                webSocketSession.close();
+            }
+            USER_SESSION_MAP.remove(sessionKey);
+            RedisUtils.deleteObject(REDIS_TOPIC_WEBSOCKET_TOKEN + sessionKey);
+
+        }
+    }
+
+    private static WebsocketResult createWebsocketResult(String id, String topic, Object object) {
+        WebsocketResult result = new WebsocketResult();
+        result.setId(id);
+        result.setTopic(topic);
+        //当前时间转换为 格式:2024-07-02T14:17:32
+        result.setTimestamp(DateUtil.format(new Date(), Constants.UTC_FORMAT));
+        result.setPayload(object);
+        return result;
+    }
+
     /**
      * 根据会话键从用户会话Map中获取WebSocket会话
      *
@@ -121,7 +151,7 @@ public class WebSocketSessionHolder {
     }
 
 
-   public static Map<String,WebSocketSession> map(){
+    public static Map<String, WebSocketSession> map() {
         return USER_SESSION_MAP;
-   }
+    }
 }

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

@@ -182,7 +182,6 @@ public class WebsocketServiceImpl implements WebsocketService, RouterService {
      * @throws Exception
      */
     @Async
-    @Transactional(rollbackFor = Exception.class)
     public void dealDvsBaseInfo(DvsBaseInfo dvsBaseInfo, String token) throws Exception {
         //添加分布式锁
         String lockKey = LOCK_DVS_BASE_INFO + token;
@@ -249,7 +248,6 @@ public class WebsocketServiceImpl implements WebsocketService, RouterService {
      */
     @Async
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public void dealBaseDeviceInfo(List<DeviceBaseInfo> deviceBaseInfos, String token) throws Exception {
         //添加分布式锁
         String lockKey = LOCK_DEVICE_BASE_INFO + token;
@@ -297,7 +295,6 @@ public class WebsocketServiceImpl implements WebsocketService, RouterService {
      */
     @Async
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public void dealAlarmHostBaseInfo(AlarmHostBaseInfo alarmHostBaseInfo, String token) throws Exception {
         //添加分布式锁
         String lockKey = LOCK_ALARM_HOST_BASE_INFO + token;
@@ -956,7 +953,6 @@ public class WebsocketServiceImpl implements WebsocketService, RouterService {
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public Object execute(WebsocketExecuteReq req) {
         try {
             if (WebSocketConstants.GET_DEVICE_BASE_INFOS.equals(req.getEvent())) {