From be3992c1dce0a763ac2a2b5b0e25897f0a0f6b0c Mon Sep 17 00:00:00 2001 From: 15683799673 Date: Thu, 21 Aug 2025 02:53:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=BA=E8=84=B8=E6=8A=93?= =?UTF-8?q?=E6=8B=8D=EF=BC=8C=E4=BA=BA=E8=84=B8=E4=B8=8A=E6=8A=A5=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/sis/config/HikEqpConfig.java | 19 +++++ .../consumer/CleanLiftAuthRocketConsumer.java | 69 ------------------- .../producer/CleanLiftAuthRocketProducer.java | 39 ----------- .../sis/rocketmq/RocketMqConstants.java | 22 ++++++ .../consumer/FaceCaptureConsumer.java | 43 ++++++++++++ .../consumer/FaceCompareConsumer.java | 40 +++++++++++ .../sis/rocketmq/domain/FaceCapture.java | 13 ++++ .../sis/rocketmq/domain/FaceCompare.java | 17 +++++ .../dromara/sis/sdk/hik/HikApiService.java | 18 +++-- .../impl/ZeroSensationPassageServiceImpl.java | 6 +- 10 files changed, 166 insertions(+), 120 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/config/HikEqpConfig.java delete mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java delete mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/RocketMqConstants.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCaptureConsumer.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCompareConsumer.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCapture.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCompare.java diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/config/HikEqpConfig.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/config/HikEqpConfig.java new file mode 100644 index 00000000..f1dc9bb8 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/config/HikEqpConfig.java @@ -0,0 +1,19 @@ +package org.dromara.sis.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 海康对接模块配置信息 + * + * @author lxj + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "eqp.config.hik") +public class HikEqpConfig { + + private String host; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java deleted file mode 100644 index eb85a91f..00000000 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.dromara.sis.consumer; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.common.message.MessageExt; -import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -import org.apache.rocketmq.spring.core.RocketMQListener; -import org.dromara.sis.domain.vo.SisElevatorFloorRefVo; -import org.dromara.sis.domain.vo.SisElevatorInfoVo; -import org.dromara.sis.sdk.hik.HikApiService; -import org.dromara.sis.service.ISisElevatorFloorRefService; -import org.dromara.sis.service.ISisElevatorInfoService; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Objects; - -/** - * @author lsm - * @apiNote CleanLiftAuthRocketConsumer - * @since 2025/8/5 - */ -@Slf4j -@Component -@RequiredArgsConstructor -@RocketMQMessageListener(topic = "lift-topic", consumerGroup = "lift-consumer-group") -public class CleanLiftAuthRocketConsumer implements RocketMQListener { - - private final ISisElevatorInfoService sisElevatorInfoService; - private final ISisElevatorFloorRefService sisElevatorFloorRefService; - private final HikApiService hikApiService; - - @Override - public void onMessage(MessageExt ext) { - log.info("【消费者】接收消息:消息体 => {}", new String(ext.getBody())); - -// Long deviceId = Long.parseLong(ext.getUserProperty("deviceId")); -// Long groupId = Long.parseLong(ext.getUserProperty("groupId")); -// Long deviceFloorId = Long.parseLong(ext.getUserProperty("deviceFloorId")); -// -// // 获取当前电梯信息 -// SisElevatorInfoVo ele = sisElevatorInfoService.queryById(deviceId); -// -// // 获取权限组下电梯⇄楼层关联信息 -// List groupRef = sisElevatorFloorRefService.queryByAuthGroupId(groupId); -// -// // 取出当前电梯的楼层授权信息 -// List eleRef = groupRef.stream().filter(o -> Objects.equals(o.getElevatorId(), deviceId)).toList(); -// -// for (SisElevatorFloorRefVo ref : eleRef){ -// if (ref.getUpChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){ -// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 3); -// } -// -// if (ref.getDownChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){ -// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 3); -// } -// -// if (ref.getInChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){ -// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getInChannel().intValue(), 3); -// } -// } - // todo 暂时应急处理,后续调整业务逻辑 - for (int i = 1; i < 5; i++) { - hikApiService.controlGateway("192.168.24.150", i, 3); - } - log.info("梯控清除权限完成"); - } -} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java deleted file mode 100644 index aafcf234..00000000 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.dromara.sis.producer; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.common.message.Message; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - * @author lsm - * @apiNote CleanLiftAuthRocketProducer - * @since 2025/8/5 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class CleanLiftAuthRocketProducer { - - @Resource - private RocketMQTemplate rocketMQTemplate; - - public void sendMessage(Long deviceId, Long groupId, Long deviceFloorId, String info, Integer lay) { - // 发送延迟消息 - // RocketMQ预定义了一些延迟等级,每个等级对应不同的延迟时间范围。这些等级从1到18,分别对应1s、5s、10s、30s、1m、2m、3m、4m、5m、6m、7m、8m、9m、10m、20m、30m、1h、2h的延迟时间。 - org.apache.rocketmq.common.message.Message msg = new Message("lift-topic", "lift-tag", info.getBytes()); - msg.putUserProperty("deviceId", deviceId.toString()); - msg.putUserProperty("groupId", groupId.toString()); - msg.putUserProperty("deviceFloorId", deviceFloorId.toString()); - msg.setDelayTimeLevel(lay); - try { - rocketMQTemplate.getProducer().send(msg); - log.info("发送RocketMQ消息成功"); - } catch (Exception e) { - log.error("发送RocketMQ消息失败", e); - } - } -} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/RocketMqConstants.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/RocketMqConstants.java new file mode 100644 index 00000000..d40423a5 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/RocketMqConstants.java @@ -0,0 +1,22 @@ +package org.dromara.sis.rocketmq; + +/** + * rocketmq 常量类 + * + * @author lxj + */ +public interface RocketMqConstants { + // mq topic + String TOPIC = "SmartParks"; + + // mq GROUP + String GROUP = "SmartParksEqp"; + + /*-----------------------------------消息tag------------------------------------*/ + String HIKADD = "ADD_HIK_DEVICE_TAG"; + // 人脸抓拍上报 + String FACECAPTURE = "FACE_CAPTURE_REPORT"; + // 人脸比对 + String FACECOMPARE = "FACE_COMPARE_REPORT"; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCaptureConsumer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCaptureConsumer.java new file mode 100644 index 00000000..13f68f6c --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCaptureConsumer.java @@ -0,0 +1,43 @@ +package org.dromara.sis.rocketmq.consumer; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.dromara.sis.rocketmq.RocketMqConstants; +import org.dromara.sis.rocketmq.domain.FaceCapture; +import org.dromara.sis.service.IZeroSensationPassageService; +import org.springframework.stereotype.Component; + +/** + * 人脸抓拍消费者 + * + * @author lxj + */ + +@Slf4j +@Component +@RequiredArgsConstructor +@RocketMQMessageListener( + topic = RocketMqConstants.TOPIC, + consumerGroup = RocketMqConstants.GROUP, + selectorExpression = RocketMqConstants.FACECAPTURE +) +public class FaceCaptureConsumer implements RocketMQListener { + + private final IZeroSensationPassageService zeroSensationPassageService; + + @Override + public void onMessage(MessageExt ext) { + log.info("消费人脸抓拍数据,数据长度={}", ext.getBody().length); + try { + FaceCapture capture = JSONObject.parseObject(ext.getBody(), FaceCapture.class); + zeroSensationPassageService.pass(capture.getDeviceIp(), capture.getSmallImg(), capture.getBigImg()); + } catch (Exception e) { + log.error("消费人脸抓拍数据处理失败,", e); + } + + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCompareConsumer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCompareConsumer.java new file mode 100644 index 00000000..c67ce6ac --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/consumer/FaceCompareConsumer.java @@ -0,0 +1,40 @@ +package org.dromara.sis.rocketmq.consumer; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.dromara.sis.rocketmq.RocketMqConstants; +import org.dromara.sis.rocketmq.domain.FaceCompare; +import org.springframework.stereotype.Component; + +/** + * 人脸比对消费者 + * + * @author lxj + */ + +@Slf4j +@Component +@RequiredArgsConstructor +@RocketMQMessageListener( + topic = RocketMqConstants.TOPIC, + consumerGroup = RocketMqConstants.GROUP, + selectorExpression = RocketMqConstants.FACECOMPARE +) +public class FaceCompareConsumer implements RocketMQListener { + + + @Override + public void onMessage(MessageExt ext) { + log.info("消费人脸比对数据,数据长度={}", ext.getBody().length); + try { + FaceCompare compare = JSONObject.parseObject(ext.getBody(), FaceCompare.class); + + } catch (Exception e) { + log.error("消费比对抓拍数据处理失败,", e); + } + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCapture.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCapture.java new file mode 100644 index 00000000..a3c66378 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCapture.java @@ -0,0 +1,13 @@ +package org.dromara.sis.rocketmq.domain; + +import lombok.Data; + +@Data +public class FaceCapture { + + private String deviceIp; + + private byte [] smallImg; + + private byte [] bigImg; +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCompare.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCompare.java new file mode 100644 index 00000000..62377ec6 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/rocketmq/domain/FaceCompare.java @@ -0,0 +1,17 @@ +package org.dromara.sis.rocketmq.domain; + +import lombok.Data; + +@Data +public class FaceCompare { + + private String deviceId; + + private float similarity; + + private String name; + + private Integer pid; + + private byte[] face; +} 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 49b2be69..14464e52 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 @@ -3,7 +3,9 @@ package org.dromara.sis.sdk.hik; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.config.HikEqpConfig; import org.dromara.sis.sdk.zkmedia.model.R; import org.springframework.stereotype.Component; @@ -17,13 +19,15 @@ import org.springframework.stereotype.Component; @Component public class HikApiService { + @Resource + private HikEqpConfig hikEqpConfig; + private static final String URL_PREFIX = "http://127.0.0.1/eqp/hik/"; private static final String LOGIN_URI = "login"; private static final String LOGOUT_URI = "logout"; private static final String CHANNEL_LIST = "channel/list"; private static final String FACE_UPLOAD = "flib/add"; - /** * 发起海康设备对接模块请求 * @@ -33,7 +37,7 @@ public class HikApiService { * @return 返回请求数据 */ public T request(String uri, String params, Class cls) { - String url = URL_PREFIX + uri; + String url = hikEqpConfig.getHost() + uri; log.info("url: {},params: {}", url, params); String post = HttpUtil.post(url, params); R result = JSONObject.parseObject(post, new TypeReference>(cls) { @@ -48,11 +52,11 @@ public class HikApiService { /** * 执行hiksdk登录 * - * @param ip 设备ip - * @param port 设备端口 - * @param user 设备账号 - * @param psw 设备密码 - * @param deviceType 1 摄像机,2: nvr, 3:cvr,4: 梯控 + * @param ip 设备ip + * @param port 设备端口 + * @param user 设备账号 + * @param psw 设备密码 + * @param deviceType 1 摄像机,2: nvr, 3:cvr,4: 梯控 * @return 返回会否登录成功 */ public boolean login(String ip, short port, String user, String psw, Integer deviceType) { diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java index 4773d800..22281ef9 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java @@ -14,7 +14,6 @@ import org.dromara.property.api.domain.vo.RemoteFloorVo; import org.dromara.sis.domain.enums.ControlTypeEnum; import org.dromara.sis.domain.enums.RosterTypeEnum; import org.dromara.sis.domain.vo.*; -import org.dromara.sis.producer.CleanLiftAuthRocketProducer; import org.dromara.sis.sdk.e8.E8PlatformApi; import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq; import org.dromara.sis.sdk.hik.HikApiService; @@ -51,7 +50,6 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer private final E8PlatformApi e8PlatformApi; private final ISisAlarmEventsService alarmEventsService; private final HikApiService hikApiService; - private final CleanLiftAuthRocketProducer cleanLiftAuthRocketProducer; @DubboReference private RemoteFloorService remoteFloorService; @@ -157,7 +155,6 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2); } } - cleanLiftAuthRocketProducer.sendMessage(item.getBindId(), 0L, item.getDeviceFloorId(), "清除电梯" + item.getBindId() + "梯控权限", 3); }); log.info("处理电梯外部按键完成,耗时:{}ms", interval.intervalMs()); } @@ -217,11 +214,10 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer hikApiService.controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2); } } - cleanLiftAuthRocketProducer.sendMessage(deviceId, groupId, deviceFloorId, "清除电梯" + deviceId + "梯控权限", 3); } // 模拟上下文 - List floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId())); + List floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId())); if (CollUtil.isEmpty(floorList)) return; if (Objects.equals(controlType, ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode())) {