增加设备定时更新状态任务

This commit is contained in:
lxj
2025-07-30 18:41:31 +08:00
parent 7ef6d2ab47
commit 95dfc5ef9b
24 changed files with 601 additions and 41 deletions

View File

@@ -69,6 +69,12 @@
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-system</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>sis-api</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@@ -5,6 +5,7 @@ import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.springframework.stereotype.Component;

View File

@@ -0,0 +1,119 @@
package org.dromara.job.snailjob.sis;
import cn.hutool.core.collection.CollUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.sis.api.RemoteHikDeviceService;
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.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 海康设备定时监测状态任务
* 执行时间为每5分钟执行一次
*
* @author lxj
*/
@Component
@RequiredArgsConstructor
@JobExecutor(name = "hikDeviceCheckStateTask")
public class HikDeviceCheckStateTask {
@DubboReference
private RemoteHikDeviceService remoteHikDeviceService;
@DubboReference
private RemoteHikSdkService remoteHikSdkService;
/**
* 海康设备定时监测状态任务
*
* @param jobArgs 任务执行参数
* @return 返回是否执行成功
* @throws InterruptedException
*/
public ExecuteResult jobExecute(JobArgs jobArgs) throws InterruptedException {
List<RemoteSisDeviceManage> device = remoteHikDeviceService.queryHikDevices();
if (CollUtil.isEmpty(device)) {
SnailJobLog.REMOTE.info("需要同步的hik设备数量为0任务执行结束");
return ExecuteResult.success();
}
SnailJobLog.REMOTE.info("需要同步状态的设备数量", device.size());
device.forEach(item -> {
// ipc
if (DeviceTypeEnum.IPC.getType().equals(item.getDeviceType())) {
updateDeviceStatus(item);
}
if (DeviceTypeEnum.NVR.getType().equals(item.getDeviceType())) {
// 设备状态更新完成
boolean b = updateDeviceStatus(item);
if (b) {
updateDeviceChannelStatus(item);
}
}
});
return ExecuteResult.success();
}
/**
* 更新nvr设备通道信息
*
* @param sisDeviceManage 设备信息
* @return
*/
private void updateDeviceChannelStatus(RemoteSisDeviceManage sisDeviceManage) {
// 查询设备通道信息
List<RemoteSisDeviceChannel> ls = remoteHikDeviceService.queryDeviceChannels(sisDeviceManage.getDeviceIp());
SnailJobLog.REMOTE.info("设备[{}]本地通道数量={}", sisDeviceManage.getDeviceIp(), ls.size());
List<RemoteSdkChannel> sdkChannels = remoteHikSdkService.getDeviceChannel(sisDeviceManage.getDeviceIp());
SnailJobLog.REMOTE.info("设备[{}]sdk通道数量={}", sisDeviceManage.getDeviceIp(), sdkChannels.size());
Map<String, RemoteSisDeviceChannel> data1 = ls.stream().collect(Collectors.toMap(RemoteSisDeviceChannel::getDeviceIp, item -> item));
Map<String, RemoteSdkChannel> data2 = sdkChannels.stream().collect(Collectors.toMap(RemoteSdkChannel::getChannelIp, item -> item));
}
/**
* 更新设备状态
*
* @param item 设备信息
* @return 返回设备是否在线
*/
private boolean updateDeviceStatus(RemoteSisDeviceManage item) {
// 调用设备登录验证次设备在线
Boolean isLogin = remoteHikSdkService.deviceLogin(item);
int onLineState = isLogin ? 1 : 0;
if (item.getDeviceStatus() != onLineState) {
SnailJobLog.REMOTE.info("设备[{}]在线状态变更,开始更新状态。 old={}new ={} ", item.getDeviceIp(), item.getDeviceStatus(), onLineState);
item.setDeviceStatus(onLineState);
Boolean result = remoteHikDeviceService.updateDeviceState(item);
SnailJobLog.REMOTE.info("设备[{}]在线状态变更,状态更新完成。 result={} ", item.getDeviceIp(), result);
// 监测当前设备是否存在通道,如果有则跟新通道信息
List<RemoteSisDeviceChannel> ls = remoteHikDeviceService.queryDeviceChannels(item.getDeviceIp());
if (CollUtil.isNotEmpty(ls)) {
Boolean r1 = remoteHikDeviceService.updateDeviceChannelState(item.getDeviceIp(), onLineState);
SnailJobLog.REMOTE.info("设备通道[{}]在线状态变更,状态更新完成。 result={} ", item.getDeviceIp(), r1);
}
}
return isLogin;
}
}