Merge branch 'master' of http://47.109.37.87:3000/by2025/SmartParks
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m31s

This commit is contained in:
dy 2025-08-21 11:30:49 +08:00
commit 0385bef3f4
10 changed files with 166 additions and 120 deletions

View File

@ -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;
}

View File

@ -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<MessageExt> {
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<SisElevatorFloorRefVo> groupRef = sisElevatorFloorRefService.queryByAuthGroupId(groupId);
//
// // 取出当前电梯的楼层授权信息
// List<SisElevatorFloorRefVo> 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("梯控清除权限完成");
}
}

View File

@ -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分别对应1s5s10s30s1m2m3m4m5m6m7m8m9m10m20m30m1h2h的延迟时间
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);
}
}
}

View File

@ -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";
}

View File

@ -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<MessageExt> {
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);
}
}
}

View File

@ -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<MessageExt> {
@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);
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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> T request(String uri, String params, Class<T> cls) {
String url = URL_PREFIX + uri;
String url = hikEqpConfig.getHost() + uri;
log.info("url: {},params: {}", url, params);
String post = HttpUtil.post(url, params);
R<T> result = JSONObject.parseObject(post, new TypeReference<R<T>>(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) {

View File

@ -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<RemoteFloorVo> floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId()));
List<RemoteFloorVo> floorList = SaTokenContextMockUtil.setMockContext(() -> remoteFloorService.queryByBuildingId(ele.getBuildingId()));
if (CollUtil.isEmpty(floorList)) return;
if (Objects.equals(controlType, ControlTypeEnum.ELEVATOR_IN_CONTROL.getCode())) {