| package com.ruoyi.device.hiksdk.sdk; | 
|   | 
| import com.ruoyi.alarm.global.domain.GuidePriorityQueue; | 
| import com.ruoyi.alarm.global.domain.GuideTask; | 
| import com.ruoyi.common.utils.spring.SpringUtils; | 
| import com.ruoyi.common.utils.uuid.IdUtils; | 
| import com.ruoyi.device.camera.domain.ArdCameras; | 
| import com.ruoyi.device.camera.service.IArdCamerasService; | 
| import com.ruoyi.device.channel.domain.ArdChannel; | 
| import com.ruoyi.device.channel.service.IArdChannelService; | 
| import com.ruoyi.device.hiksdk.common.GlobalVariable; | 
| import com.ruoyi.device.hiksdk.service.IHikClientService; | 
| import com.sun.jna.Pointer; | 
| import lombok.extern.slf4j.Slf4j; | 
|   | 
| import java.util.Comparator; | 
| import java.util.List; | 
| import java.util.concurrent.PriorityBlockingQueue; | 
|   | 
| /** | 
|  * @Description: 异步登录回调 | 
|  * @ClassName: FLoginResultCallBack | 
|  * @Author: 刘苏义 | 
|  * @Date: 2023年06月12日13:34 | 
|  * @Version: 1.0 | 
|  **/ | 
| @Slf4j(topic = "hikSdk") | 
| public class LoginResultCallBack implements HCNetSDK.FLoginResultCallBack { | 
|   | 
|     private ArdCameras camera; | 
|   | 
|     public LoginResultCallBack(ArdCameras camera) { | 
|         this.camera = camera; | 
|     } | 
|   | 
|     @Override | 
|     public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) { | 
|         IArdChannelService ardChannelService = SpringUtils.getBean(IArdChannelService.class); | 
|         IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class); | 
|         IArdCamerasService ardCamerasService = SpringUtils.getBean(IArdCamerasService.class); | 
|         if (GlobalVariable.loginMap.containsKey(camera.getId())) { | 
|             GlobalVariable.loginMap.remove(camera.getId()); | 
|         } | 
|         if (dwResult == 1) { | 
|             GlobalVariable.loginMap.put(camera.getId(), lUserID); | 
|             log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功"); | 
|             camera.setLoginId(lUserID); | 
|             camera.setChanNum((int) lpDeviceinfo.byChanNum); | 
|             camera.setStartDChan((int)lpDeviceinfo.byStartDChan); | 
|   | 
|             //获取最新通道 | 
|             List<ArdChannel> cameraChannelList = hikClientService.getCameraChannelList(camera); | 
|             if(cameraChannelList.size()>0) { | 
|                 //删除管理通道 | 
|                 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); | 
|                 for (ArdChannel channel : cameraChannelList) { | 
|                     channel.setId(IdUtils.simpleUUID()); | 
|                     ardChannelService.insertArdChannel(channel); | 
|                 } | 
|             } | 
|             //创建引导队列 | 
|             if(!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) | 
|             { | 
|                 Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); | 
|                 PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); | 
|                 GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); | 
|             } | 
|   | 
|         } else { | 
|             log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败"); | 
|             camera.setChanNum(0); | 
|             camera.setLoginId(-1); | 
|         } | 
|         ardCamerasService.updateArdCameras(camera); | 
|         return 1; | 
|     } | 
| } |