From 95dfc5ef9b44973cd90220f2ef07b01340710ef7 Mon Sep 17 00:00:00 2001 From: lxj <15683799673@163.com> Date: Wed, 30 Jul 2025 18:41:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E6=9B=B4=E6=96=B0=E7=8A=B6=E6=80=81=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sis/api/RemoteHikDeviceService.java | 38 ++++++ .../dromara/sis/api/RemoteHikSdkService.java | 23 ++++ .../sis/api/domain/RemoteSdkChannel.java | 43 +++++++ .../api/domain/RemoteSisDeviceChannel.java | 95 ++++++++++++++ .../sis/api/domain/RemoteSisDeviceManage.java | 65 ++++++++++ .../sis/api}/enums/DeviceTypeEnum.java | 2 +- .../dromara/sis/api}/enums/FactoryNoEnum.java | 2 +- .../zkmedia/ZKLmediaController.java | 7 +- .../dromara/sis/domain/SisDeviceChannel.java | 10 +- .../dromara/sis/domain/SisDeviceManage.java | 2 +- .../sis/domain/covert/CommonBeanCovert.java | 27 ++++ .../sis/dubbo/RemoteHikDeviceServiceImpl.java | 51 ++++++++ .../sis/dubbo/RemoteSdkServiceImpl.java | 41 ++++++ .../dromara/sis/sdk/hik/HikApiService.java | 28 +---- .../dromara/sis/sdk/hik/model/DeviceInfo.java | 4 +- .../sis/sdk/hik/service/CamearService.java | 6 +- .../sis/service/ISisDeviceChannelService.java | 15 ++- .../sis/service/ISisDeviceManageService.java | 13 ++ .../impl/SisDeviceChannelServiceImpl.java | 22 +++- .../impl/SisDeviceManageServiceImpl.java | 20 ++- .../org/dromara/sis/task/DataSyncTask.java | 2 +- ruoyi-modules/ruoyi-job/pom.xml | 6 + .../dromara/job/snailjob/SummaryBillTask.java | 1 + .../snailjob/sis/HikDeviceCheckStateTask.java | 119 ++++++++++++++++++ 24 files changed, 601 insertions(+), 41 deletions(-) create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikDeviceService.java create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikSdkService.java create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSdkChannel.java create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceChannel.java create mode 100644 ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceManage.java rename {ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain => ruoyi-api/sis-api/src/main/java/org/dromara/sis/api}/enums/DeviceTypeEnum.java (86%) rename {ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain => ruoyi-api/sis-api/src/main/java/org/dromara/sis/api}/enums/FactoryNoEnum.java (86%) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/covert/CommonBeanCovert.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteHikDeviceServiceImpl.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSdkServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/HikDeviceCheckStateTask.java diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikDeviceService.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikDeviceService.java new file mode 100644 index 00000000..0baa5659 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikDeviceService.java @@ -0,0 +1,38 @@ +package org.dromara.sis.api; + +import org.dromara.sis.api.domain.RemoteSisDeviceChannel; +import org.dromara.sis.api.domain.RemoteSisDeviceManage; + +import java.util.List; + +public interface RemoteHikDeviceService { + + + /** + * 查询所有的海康设备信息 + * @return 返回海康设备列表 + */ + List queryHikDevices(); + + + /** + * 更新设备在线状态 + * @param item 设备信息 + * @return 返回是否操作成功 + */ + Boolean updateDeviceState(RemoteSisDeviceManage item); + + /** + * 查询设备通道信息 + * @param deviceIp 设备ip + * @return 返回通道列表 + */ + List queryDeviceChannels(String deviceIp); + + /** + * 更新设备通道在线状态 + * @param deviceIp 设备ip + * @return 返回是否成功 + */ + Boolean updateDeviceChannelState(String deviceIp, Integer onLineState); +} diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikSdkService.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikSdkService.java new file mode 100644 index 00000000..4fa84005 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/RemoteHikSdkService.java @@ -0,0 +1,23 @@ +package org.dromara.sis.api; + +import org.dromara.sis.api.domain.RemoteSdkChannel; +import org.dromara.sis.api.domain.RemoteSisDeviceManage; + +import java.util.List; + +public interface RemoteHikSdkService { + + /** + * 海康sdk 登录操作 + * @param item 登录参数 + * @return 是否登录成功 + */ + Boolean deviceLogin(RemoteSisDeviceManage item); + + /** + * 获取nvr设备通道信息 + * @param deviceIp 设备ip + * @return 返回通道信息 + */ + List getDeviceChannel(String deviceIp); +} diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSdkChannel.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSdkChannel.java new file mode 100644 index 00000000..a2ab7a48 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSdkChannel.java @@ -0,0 +1,43 @@ +package org.dromara.sis.api.domain; + +import lombok.Data; + +@Data +public class RemoteSdkChannel { + + /** + * 通道id + */ + private Integer channelId; + + /** + * 通道名称 + */ + private String channelName; + + /** + * 通道设备ip + */ + private String channelIp; + + /** + * 通道设备端口 + */ + private Short channelPort; + + /** + * 通道账号 + */ + private String channelAccount; + + /** + * 通道密码 + */ + private String channelPwd; + + /** + * 通过状态 1: 在线,2:离线 + */ + private Integer channelStatus; + +} diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceChannel.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceChannel.java new file mode 100644 index 00000000..29bcb9d8 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceChannel.java @@ -0,0 +1,95 @@ +package org.dromara.sis.api.domain; + +import lombok.Data; + +@Data +public class RemoteSisDeviceChannel { + + /** + * 主键id + */ + private Long id; + + /** + * 设备id + */ + private Long deviceId; + + /** + * 设备名称 + */ + private String channelName; + + /** + * 通道分组组id + */ + private Long groupId; + + /** + * 设备ip + */ + private String deviceIp; + + /** + * 设备端口 + */ + private Integer devicePort; + + private String factoryNo; + + /** + * 设备账号 + */ + private String deviceAccount; + + /** + * 设备密码 + */ + private String devicePwd; + + /** + * 设备 + */ + private String deviceMac; + + /** + * 设备通道编号 + */ + private String channelNo; + + /** + * 通道状态.0-离线;1-在线 + */ + private Integer channelState; + + /** + * nvr 设备厂商编号 + */ + private String nvrFactoryNo; + + /** + * nvr设备ip + */ + private String nvrIp; + + /** + * nvr 端口 + */ + private Integer nvrPort; + + /** + * nvr 账号 + */ + private String nvrAccount; + + /** + * nvr 密码 + */ + private String nvrPwd; + + /** + * nvr 通道编号 + */ + private String nvrChannelNo; + +} diff --git a/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceManage.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceManage.java new file mode 100644 index 00000000..02253ef8 --- /dev/null +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/domain/RemoteSisDeviceManage.java @@ -0,0 +1,65 @@ +package org.dromara.sis.api.domain; + +import lombok.Data; + +/** + * 设备远程调用对象 + */ +@Data +public class RemoteSisDeviceManage { + + /** + * 主键id + */ + private Long id; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 设备ip + */ + private String deviceIp; + + /** + * 设备端口 + */ + private Integer devicePort; + + /** + * 设备 + */ + private String deviceMac; + + /** + * 设备在线状态 0:离线 1:在线 2:未知 + */ + private Integer deviceStatus; + + /** + * 设备账号 + */ + private String deviceAccount; + + /** + * 设备密码 + */ + private String devicePwd; + + /** + * 设备类型 + */ + private Integer deviceType; + + /** + * 设备厂商编号 + */ + private String factoryNo; + + /** + * 设备组id + */ + private Long groupId; +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/DeviceTypeEnum.java similarity index 86% rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java rename to ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/DeviceTypeEnum.java index 16984778..1292d036 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/DeviceTypeEnum.java +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/DeviceTypeEnum.java @@ -1,4 +1,4 @@ -package org.dromara.sis.domain.enums; +package org.dromara.sis.api.enums; import lombok.Getter; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/FactoryNoEnum.java similarity index 86% rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java rename to ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/FactoryNoEnum.java index a27ba12a..5322b357 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/enums/FactoryNoEnum.java +++ b/ruoyi-api/sis-api/src/main/java/org/dromara/sis/api/enums/FactoryNoEnum.java @@ -1,4 +1,4 @@ -package org.dromara.sis.domain.enums; +package org.dromara.sis.api.enums; import lombok.Getter; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java index 2760b025..db73d170 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZKLmediaController.java @@ -1,11 +1,9 @@ package org.dromara.sis.controller.zkmedia; import cn.hutool.core.util.IdUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.digest.MD5; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; -import org.dromara.sis.domain.enums.FactoryNoEnum; +import org.dromara.sis.api.enums.FactoryNoEnum; import org.dromara.sis.sdk.zkmedia.MediaServerUtils; import org.dromara.sis.sdk.zkmedia.ZLMediaKitService; import org.dromara.sis.sdk.zkmedia.model.AddStreamProxy; @@ -52,7 +50,8 @@ public class ZKLmediaController { proxy.setApp("realtime"); // 实时流不用每次都去拉流,流不存在的情况下在拉取 String streanStr = data.getVideoIp() + "_" + data.getChannelId(); - proxy.setStream(SecureUtil.md5(streanStr)); +// proxy.setStream(SecureUtil.md5(streanStr)); + proxy.setStream(IdUtil.fastSimpleUUID()); if (FactoryNoEnum.HIK.getCode().equals(data.getFactoryNo())) { proxy.setUrl(String.format(HIK_REALTIME_RTSP_TEMPLATE, data.getAccount(), data.getPwd(), data.getVideoIp(), data.getVideoPort(), data.getChannelId())); } else if (FactoryNoEnum.DAHUA.getCode().equals(data.getFactoryNo())) { diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java index 183bb89e..2b125e7a 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceChannel.java @@ -1,9 +1,10 @@ package org.dromara.sis.domain; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; @@ -74,6 +75,11 @@ public class SisDeviceChannel extends TenantEntity { */ private String channelNo; + /** + * 通道状态.0-离线;1-在线 + */ + private Integer channelState; + /** * nvr 设备厂商编号 */ diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java index 658b358d..10ef03ea 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java @@ -41,7 +41,7 @@ public class SisDeviceManage extends BaseEntity { /** * 设备端口 */ - private Long devicePort; + private Integer devicePort; /** * 设备 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/covert/CommonBeanCovert.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/covert/CommonBeanCovert.java new file mode 100644 index 00000000..cabe53bf --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/covert/CommonBeanCovert.java @@ -0,0 +1,27 @@ +package org.dromara.sis.domain.covert; + +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.domain.SisDeviceChannel; +import org.dromara.sis.domain.SisDeviceManage; +import org.dromara.sis.sdk.hik.model.DeviceInfo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface CommonBeanCovert { + + CommonBeanCovert INSTANCE = Mappers.getMapper(CommonBeanCovert.class); + + List entity2Remote(List sisDeviceManage); + + SisDeviceManage Remote2Entity(RemoteSisDeviceManage remoteSisDeviceManage); + + List channelEntity2Remote(List channels); + + List sdkChannelEntity2Remote(List sdkChannels); + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteHikDeviceServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteHikDeviceServiceImpl.java new file mode 100644 index 00000000..a5944f8e --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteHikDeviceServiceImpl.java @@ -0,0 +1,51 @@ +package org.dromara.sis.dubbo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.api.RemoteHikDeviceService; +import org.dromara.sis.api.domain.RemoteSisDeviceChannel; +import org.dromara.sis.api.domain.RemoteSisDeviceManage; +import org.dromara.sis.domain.SisDeviceChannel; +import org.dromara.sis.domain.SisDeviceManage; +import org.dromara.sis.domain.covert.CommonBeanCovert; +import org.dromara.sis.service.ISisDeviceChannelService; +import org.dromara.sis.service.ISisDeviceManageService; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 海康设备远程服务调用 + * + * @author lxj + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RemoteHikDeviceServiceImpl implements RemoteHikDeviceService { + + private final ISisDeviceManageService deviceManageService; + private final ISisDeviceChannelService deviceChannelService; + + @Override + public List queryHikDevices() { + List sisDeviceManages = deviceManageService.queryHikDevices(); + return CommonBeanCovert.INSTANCE.entity2Remote(sisDeviceManages); + } + + @Override + public Boolean updateDeviceState(RemoteSisDeviceManage item) { + return deviceManageService.updateDeviceState(CommonBeanCovert.INSTANCE.Remote2Entity(item)); + } + + @Override + public List queryDeviceChannels(String deviceIp) { + List channels = deviceChannelService.queryByDeviceIp(deviceIp); + return CommonBeanCovert.INSTANCE.channelEntity2Remote(channels); + } + + @Override + public Boolean updateDeviceChannelState(String deviceIp, Integer onLineState) { + return deviceChannelService.updateDeviceChannelState(deviceIp, onLineState); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSdkServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSdkServiceImpl.java new file mode 100644 index 00000000..88a8c533 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteSdkServiceImpl.java @@ -0,0 +1,41 @@ +package org.dromara.sis.dubbo; + +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.api.RemoteHikSdkService; +import org.dromara.sis.api.domain.RemoteSdkChannel; +import org.dromara.sis.api.domain.RemoteSisDeviceManage; +import org.dromara.sis.domain.covert.CommonBeanCovert; +import org.dromara.sis.sdk.hik.HikApiService; +import org.dromara.sis.sdk.hik.model.DeviceInfo; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +@Component +public class RemoteSdkServiceImpl implements RemoteHikSdkService { + + @Override + public Boolean deviceLogin(RemoteSisDeviceManage item) { + if (item == null) { + throw new RuntimeException("设备信息为null"); + } + return HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount()); + } + + @Override + public List getDeviceChannel(String deviceIp) { + DeviceInfo channelInfo = HikApiService.getInstance().getChannelInfo(deviceIp); + if (channelInfo == null) { + return List.of(); + } + + if (CollUtil.isEmpty(channelInfo.getChannelInfo())) { + return List.of(); + } + return CommonBeanCovert.INSTANCE.sdkChannelEntity2Remote(channelInfo.getChannelInfo()); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java index 29db7901..1e33a7eb 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java @@ -1,6 +1,5 @@ package org.dromara.sis.sdk.hik; -import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dromara.sis.sdk.hik.model.DeviceInfo; import org.dromara.sis.sdk.hik.service.CamearService; @@ -58,7 +57,13 @@ public class HikApiService { int i = LoginService.loginDevice(ip, port, user, psw); boolean result = (i != SdkBaseServer.LOGIN_FAIL_CODE); if (result) { + // 上次登录信息依然存在 + if (CACHE.get(ip) != null && CACHE.get(ip) != i) { + loginOut(ip); + } CACHE.put(ip, i); + } else { + CACHE.remove(ip); } return result; } @@ -146,25 +151,4 @@ public class HikApiService { Integer lHandel = CACHE.get(deviceIp); return CamearService.getDeviceChannelInfo(lHandel); } - - - public static void main(String[] args) { -// String ip ="192.168.10.253"; -// short port = 8000; -// String user = "admin"; -// String wd ="ncqzfdl123"; - - String ip = "192.168.24.251"; - short port = 8000; - String user = "admin"; - String wd = "hik12345+"; - - SdkBaseServer.initSdk(); - getInstance().login(ip, port, user, wd); - Integer lHandel = CACHE.get(ip); - DeviceInfo deviceChannelInfo = CamearService.getDeviceChannelInfo(lHandel); - System.out.println(JSONObject.toJSONString(deviceChannelInfo)); - } - - } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/DeviceInfo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/DeviceInfo.java index 2341826e..2e89de38 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/DeviceInfo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/DeviceInfo.java @@ -1,7 +1,7 @@ package org.dromara.sis.sdk.hik.model; import lombok.Data; -import org.dromara.sis.domain.enums.FactoryNoEnum; +import org.dromara.sis.api.enums.FactoryNoEnum; import java.util.List; @@ -65,7 +65,7 @@ public class DeviceInfo { private String channelPwd; /** - * 通过状态 + * 通过状态 1: 在线,2:离线 */ private Integer channelStatus; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java index c31d4fdd..2f66f9fc 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java @@ -40,6 +40,7 @@ public class CamearService extends SdkBaseServer { deviceInfo.setChannelInfo(channelInfo); int num = 0; for (int i = 0; i < lpOutBuffer.dwDChanNum; i++) { + HCNetSDK.NET_DVR_PICCFG_V30 dvrPiccfgV30 = new HCNetSDK.NET_DVR_PICCFG_V30(); dvrPiccfgV30.dwSize = dvrPiccfgV30.size(); IntByReference lpBytesReturned = new IntByReference(0); @@ -59,13 +60,16 @@ public class CamearService extends SdkBaseServer { short wDVRPort = netDvrIpdevinfoV31.wDVRPort; DeviceInfo.DeviceChannelInfo deviceChannelInfo = new DeviceInfo.DeviceChannelInfo(); - deviceChannelInfo.setChannelId( channelNum); + deviceChannelInfo.setChannelId(channelNum); deviceChannelInfo.setChannelName(channelName); deviceChannelInfo.setChannelIp(ip); deviceChannelInfo.setChannelPort(wDVRPort); deviceChannelInfo.setChannelAccount(sUserName); deviceChannelInfo.setChannelPwd(sPassword); deviceChannelInfo.setChannelStatus(0); + // 通道是否在线 + byte byEnable = lpOutBuffer.struStreamMode[i].uGetStream.struChanInfo.byEnable; + deviceChannelInfo.setChannelStatus((int) byEnable); channelInfo.add(deviceChannelInfo); num++; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java index c1869135..5bb6b362 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceChannelService.java @@ -7,7 +7,6 @@ import org.dromara.sis.domain.SisDeviceChannel; import org.dromara.sis.domain.bo.SisDeviceChannelBo; import org.dromara.sis.domain.bo.SisDeviceManageBo; import org.dromara.sis.domain.vo.SisDeviceChannelVo; -import org.springframework.web.context.request.RequestAttributes; import java.util.Collection; import java.util.List; @@ -98,4 +97,18 @@ public interface ISisDeviceChannelService { SisDeviceChannel queryByChannelIp(String channelIp); + /** + * 通过设备ip查询设备通道信息 + * + * @param deviceIp 设备ip + * @return 返回通道列表 + */ + List queryByDeviceIp(String deviceIp); + + /** + * 更新设备状态 + * @param deviceIp 设备ip + * @return 返回是否操作成功 + */ + Boolean updateDeviceChannelState(String deviceIp, Integer onLineState); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java index 218b1b03..0525b342 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceManageService.java @@ -90,4 +90,17 @@ public interface ISisDeviceManageService { * @return 返回设备报表 */ List queryByIds(List deviceIds); + + /** + * 查询所有的海康设备 + * @return 返回海康设备列表 + */ + List queryHikDevices(); + + /** + * 更新设备状态信息 + * @param sisDeviceManage 设备信息 + * @return 是否操作成功 + */ + Boolean updateDeviceState(SisDeviceManage sisDeviceManage); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java index 3c5e2de5..f09bfe08 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceChannelServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.sis.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -13,10 +14,10 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.TreeUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.api.enums.DeviceTypeEnum; import org.dromara.sis.domain.SisDeviceChannel; import org.dromara.sis.domain.bo.SisDeviceChannelBo; import org.dromara.sis.domain.bo.SisDeviceManageBo; -import org.dromara.sis.domain.enums.DeviceTypeEnum; import org.dromara.sis.domain.vo.SisDeviceChannelVo; import org.dromara.sis.domain.vo.SisDeviceGroupVo; import org.dromara.sis.mapper.SisDeviceChannelMapper; @@ -221,6 +222,8 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService { channel.setDeviceMac(bo.getDeviceMac()); channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL); channel.setTenantId(bo.getTenantId()); + // 默认设备在线 + channel.setChannelState(1); Boolean insert = this.insert(channel); log.info("设备[{}]通道添加完成,result={}", bo.getDeviceIp(), insert); } else { @@ -244,11 +247,12 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService { channel.setDevicePort(Integer.valueOf(item.getChannelPort())); channel.setDeviceAccount(item.getChannelAccount()); channel.setFactoryNo(channelInfo.getFactoryNo()); + channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL); + channel.setChannelState(item.getChannelStatus()); if (StrUtil.isNotEmpty(item.getChannelPwd())) { channel.setDevicePwd(item.getChannelPwd()); } // nvr 设备信息 - channel.setNvrId(bo.getId()); channel.setNvrIp(bo.getDeviceIp()); channel.setNvrPort(HikSdkConstans.DEFAULT_RTSP_PORT); channel.setNvrAccount(bo.getDeviceAccount()); @@ -298,4 +302,18 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService { return baseMapper.delete(lqw); } + @Override + public List queryByDeviceIp(String deviceIp) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SisDeviceChannel::getDeviceIp, deviceIp); + return baseMapper.selectList(lqw); + } + + @Override + public Boolean updateDeviceChannelState(String deviceIp, Integer onLineState) { + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.set(SisDeviceChannel::getChannelState, onLineState); + lqw.eq(SisDeviceChannel::getDeviceIp, deviceIp); + return baseMapper.update(lqw) > 0; + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java index 5b93e493..7ac272b4 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java @@ -2,6 +2,7 @@ package org.dromara.sis.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; @@ -12,9 +13,9 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.sis.api.enums.FactoryNoEnum; import org.dromara.sis.domain.SisDeviceManage; import org.dromara.sis.domain.bo.SisDeviceManageBo; -import org.dromara.sis.domain.enums.FactoryNoEnum; import org.dromara.sis.domain.vo.SisDeviceManageVo; import org.dromara.sis.mapper.SisDeviceManageMapper; import org.dromara.sis.sdk.hik.HikApiService; @@ -23,8 +24,6 @@ import org.dromara.sis.service.ISisDeviceManageService; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; import java.util.*; @@ -207,4 +206,19 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService { public List queryByIds(List deviceIds) { return baseMapper.selectByIds(deviceIds); } + + @Override + public List queryHikDevices() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SisDeviceManage::getFactoryNo, FactoryNoEnum.HIK.getCode()); + return baseMapper.selectList(lqw); + } + + @Override + public Boolean updateDeviceState(SisDeviceManage sisDeviceManage) { + LambdaUpdateWrapper lqw = Wrappers.lambdaUpdate(); + lqw.set(SisDeviceManage::getDeviceStatus, sisDeviceManage.getDeviceStatus()) + .eq(SisDeviceManage::getId, sisDeviceManage.getId()); + return baseMapper.update(lqw) > 0; + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java index 438e9c12..1aef66ad 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java @@ -36,7 +36,7 @@ public class DataSyncTask { /** * 定时同步报警记录数据 */ - @Scheduled(fixedRate = 60 * 1000) // 每分钟执行一次 +// @Scheduled(fixedRate = 60 * 1000) // 每分钟执行一次 public void syncAlarmRecords() { log.info("开始同步报警记录数据..."); diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml index ab2e869e..a630212a 100644 --- a/ruoyi-modules/ruoyi-job/pom.xml +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -69,6 +69,12 @@ org.dromara ruoyi-api-system + + org.dromara + sis-api + 2.4.0 + compile + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java index bff15f97..313e76cd 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java @@ -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; diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/HikDeviceCheckStateTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/HikDeviceCheckStateTask.java new file mode 100644 index 00000000..4c0ba39e --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/HikDeviceCheckStateTask.java @@ -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 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 ls = remoteHikDeviceService.queryDeviceChannels(sisDeviceManage.getDeviceIp()); + SnailJobLog.REMOTE.info("设备[{}]本地通道数量={}", sisDeviceManage.getDeviceIp(), ls.size()); + List sdkChannels = remoteHikSdkService.getDeviceChannel(sisDeviceManage.getDeviceIp()); + SnailJobLog.REMOTE.info("设备[{}]sdk通道数量={}", sisDeviceManage.getDeviceIp(), sdkChannels.size()); + + Map data1 = ls.stream().collect(Collectors.toMap(RemoteSisDeviceChannel::getDeviceIp, item -> item)); + Map 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 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; + } +}