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
All checks were successful
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Successful in 6m31s
This commit is contained in:
commit
0385bef3f4
@ -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;
|
||||
|
||||
}
|
@ -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("梯控清除权限完成");
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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";
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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) {
|
||||
|
@ -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())) {
|
||||
|
Loading…
Reference in New Issue
Block a user