增加设备同步状态异步任务

This commit is contained in:
lxj
2025-09-09 05:03:28 +08:00
parent a29e680bce
commit 8a9d74bbd5
5 changed files with 37 additions and 17 deletions

View File

@@ -2,9 +2,13 @@ package org.dromara.sis.api.domain;
import lombok.Data;
@Data
public class RemoteSdkChannel {
import java.io.Serial;
import java.io.Serializable;
@Data
public class RemoteSdkChannel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long deviceId;

View File

@@ -2,9 +2,14 @@ package org.dromara.sis.api.domain;
import lombok.Data;
@Data
public class RemoteSisDeviceChannel {
import java.io.Serial;
import java.io.Serializable;
@Data
public class RemoteSisDeviceChannel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/

View File

@@ -42,7 +42,8 @@ public class RemoteDeviceServiceImpl implements RemoteDeviceService {
@Override
public Boolean updateDeviceState(RemoteSisDeviceManage item) {
return deviceManageService.updateDeviceState(CommonBeanCovert.INSTANCE.Remote2Entity(item));
SisDeviceManage sisDeviceManage = CommonBeanCovert.INSTANCE.Remote2Entity(item);
return deviceManageService.updateDeviceState(sisDeviceManage);
}
@Override

View File

@@ -10,7 +10,6 @@ import org.dromara.sis.api.domain.RemoteSisDeviceManage;
import org.dromara.sis.domain.covert.CommonBeanCovert;
import org.dromara.sis.sdk.hik.DeviceInfo;
import org.dromara.sis.sdk.hik.HikApiService;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -26,7 +25,7 @@ public class RemoteSdkServiceImpl implements RemoteHikSdkService {
if (item == null) {
throw new RuntimeException("设备信息为null");
}
return hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount(), item.getDeviceType());
return hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd(), item.getDeviceType());
}
@Override

View File

@@ -8,13 +8,16 @@ import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
import com.alibaba.fastjson2.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.sis.api.RemoteDeviceService;
import org.dromara.sis.api.RemoteHikSdkService;
import org.dromara.sis.api.domain.RemoteSdkChannel;
import org.dromara.sis.api.domain.RemoteSisDeviceChannel;
import org.dromara.sis.api.domain.RemoteSisDeviceManage;
import org.dromara.sis.api.enums.DeviceTypeEnum;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.*;
@@ -26,6 +29,7 @@ import java.util.stream.Collectors;
*
* @author lxj
*/
@Slf4j
@Component
@RequiredArgsConstructor
@JobExecutor(name = "hikDeviceCheckStateTask")
@@ -56,23 +60,32 @@ public class HikDeviceCheckStateTask {
return;
}
SnailJobLog.REMOTE.info("需要同步状态的设备数量", device.size());
device.forEach(item -> {
// 获取当前对象的代理对象
HikDeviceCheckStateTask aopProxy = SpringUtils.getAopProxy(this);
device.forEach(aopProxy::updateDeviceAndChannelStatus);
}
@Async
public void updateDeviceAndChannelStatus(RemoteSisDeviceManage sisDeviceManage) {
SaTokenContextMockUtil.setMockContext(() -> {
// 同步设备状态
updateDeviceStatus(item);
updateDeviceStatus(sisDeviceManage);
// 如果设备类型为nvr或者cvr/dvr 需要同步通道状态
if (DeviceTypeEnum.NVR.getType().equals(item.getDeviceType()) || DeviceTypeEnum.DVR.getType().equals(item.getDeviceType())) {
updateDeviceChannelStatus(item);
if (DeviceTypeEnum.NVR.getType().equals(sisDeviceManage.getDeviceType()) || DeviceTypeEnum.DVR.getType().equals(sisDeviceManage.getDeviceType())) {
updateDeviceChannelStatus(sisDeviceManage);
}
});
}
/**
* 更新nvr设备通道信息
*
* @param sisDeviceManage 设备信息
* @return
*/
private void updateDeviceChannelStatus(RemoteSisDeviceManage sisDeviceManage) {
public void updateDeviceChannelStatus(RemoteSisDeviceManage sisDeviceManage) {
// 查询设备通道信息
List<RemoteSisDeviceChannel> ls = remoteDeviceService.queryDeviceChannels(sisDeviceManage.getDeviceIp());
SnailJobLog.REMOTE.info("设备[{}]本地通道数量={}", sisDeviceManage.getDeviceIp(), ls.size());
@@ -145,7 +158,6 @@ public class HikDeviceCheckStateTask {
Integer i = remoteDeviceService.updateChannelInfo(updateData);
SnailJobLog.REMOTE.info("更新通道完成,通道数量={},完成数量={}", updateData.size(), i);
}
}
@@ -155,11 +167,12 @@ public class HikDeviceCheckStateTask {
* @param item 设备信息
* @return 返回设备是否在线
*/
private boolean updateDeviceStatus(RemoteSisDeviceManage item) {
public void updateDeviceStatus(RemoteSisDeviceManage item) {
log.info("开始同步设备状态,params={}", item);
// 调用设备登录验证次设备在线
Boolean isLogin = remoteHikSdkService.deviceLogin(item);
int onLineState = isLogin ? 1 : 0;
if (Objects.equals(item.getDeviceStatus(), onLineState)) {
if (!Objects.equals(item.getDeviceStatus(), onLineState)) {
SnailJobLog.REMOTE.info("设备[{}]在线状态变更,开始更新状态。 old={}new ={} ", item.getDeviceIp(), item.getDeviceStatus(), onLineState);
item.setDeviceStatus(onLineState);
Boolean result = remoteDeviceService.updateDeviceState(item);
@@ -172,7 +185,5 @@ public class HikDeviceCheckStateTask {
SnailJobLog.REMOTE.info("设备通道[{}]在线状态变更,状态更新完成。 result={} ", item.getDeviceIp(), r1);
}
}
return isLogin;
}
}