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

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; import lombok.Data;
@Data import java.io.Serial;
public class RemoteSdkChannel { import java.io.Serializable;
@Data
public class RemoteSdkChannel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long deviceId; private Long deviceId;

View File

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

View File

@@ -42,7 +42,8 @@ public class RemoteDeviceServiceImpl implements RemoteDeviceService {
@Override @Override
public Boolean updateDeviceState(RemoteSisDeviceManage item) { public Boolean updateDeviceState(RemoteSisDeviceManage item) {
return deviceManageService.updateDeviceState(CommonBeanCovert.INSTANCE.Remote2Entity(item)); SisDeviceManage sisDeviceManage = CommonBeanCovert.INSTANCE.Remote2Entity(item);
return deviceManageService.updateDeviceState(sisDeviceManage);
} }
@Override @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.domain.covert.CommonBeanCovert;
import org.dromara.sis.sdk.hik.DeviceInfo; import org.dromara.sis.sdk.hik.DeviceInfo;
import org.dromara.sis.sdk.hik.HikApiService; import org.dromara.sis.sdk.hik.HikApiService;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
@@ -26,7 +25,7 @@ public class RemoteSdkServiceImpl implements RemoteHikSdkService {
if (item == null) { if (item == null) {
throw new RuntimeException("设备信息为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 @Override

View File

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