diff --git a/ruoyi-modules/Sis/pom.xml b/ruoyi-modules/Sis/pom.xml
index 0152e6d0..5985c62c 100644
--- a/ruoyi-modules/Sis/pom.xml
+++ b/ruoyi-modules/Sis/pom.xml
@@ -118,6 +118,11 @@
2.4.0
+
+ org.apache.rocketmq
+ rocketmq-spring-boot-starter
+
+
com.hik
examples
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
new file mode 100644
index 00000000..dca65425
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java
@@ -0,0 +1,64 @@
+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;
+
+ @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.getOutChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){
+// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getOutChannel().intValue(), 3);
+// }
+//
+// if (ref.getInChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)){
+// HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getInChannel().intValue(), 3);
+// }
+// }
+
+ HikApiService.getInstance().controlGateway("192.168.24.188", 1, 3);
+ HikApiService.getInstance().controlGateway("192.168.24.188", 2, 3);
+
+ log.info("梯控清除权限完成");
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
index c0c34452..54c80725 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
@@ -18,6 +18,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.sis.domain.bo.SisAccessControlBo;
import org.dromara.sis.domain.vo.SisAccessControlVo;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
import org.dromara.sis.service.ISisAccessControlService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -126,4 +127,16 @@ public class SisAccessControlController extends BaseController {
return R.ok(sisAccessControlService.syncE8());
}
+
+ /**
+ * 远程开门
+ *
+ * @param req 远程开门参数
+ */
+ @PostMapping("/e8/remoteOpenDoor")
+ public R remoteOpenDoor(@RequestBody RemoteOpenDoorReq req) {
+ return R.ok(sisAccessControlService.remoteOpenDoor(req));
+ }
+
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceBindRefBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceBindRefBo.java
index 8bb20811..ea6fb647 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceBindRefBo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceBindRefBo.java
@@ -46,5 +46,8 @@ public class SisDeviceBindRefBo extends BaseEntity {
@NotNull(message = "控制类型(1:门禁,2:电梯呼梯,3:电梯梯控不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer controlType;
-
+ /**
+ * 楼层id
+ */
+ private Long deviceFloorId;
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java
index 02a76655..9c5a13e6 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceBindRefVo.java
@@ -53,6 +53,9 @@ public class SisDeviceBindRefVo implements Serializable {
@ExcelProperty(value = "控制类型(1:门禁,2:电梯呼梯,3:电梯梯控")
private Integer controlType;
-
+ /**
+ * 楼层id
+ */
+ private Long deviceFloorId;
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java
index 0ebdd583..6ba04fae 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java
@@ -50,5 +50,14 @@ public class SisElevatorFloorRefVo implements Serializable {
@ExcelProperty(value = "授权组id")
private Long authGroupId;
+ /**
+ * 内部通道号
+ */
+ private Long inChannel;
+
+ /**
+ * 外部通道号
+ */
+ private Long outChannel;
}
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
new file mode 100644
index 00000000..aafcf234
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java
@@ -0,0 +1,39 @@
+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/sdk/e8/domain/accessControl/req/RemoteOpenDoorReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accessControl/req/RemoteOpenDoorReq.java
index c4b98512..8262a131 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accessControl/req/RemoteOpenDoorReq.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accessControl/req/RemoteOpenDoorReq.java
@@ -2,6 +2,7 @@ package org.dromara.sis.sdk.e8.domain.accessControl.req;
import lombok.Data;
+import java.util.Collection;
import java.util.List;
/**
@@ -27,6 +28,11 @@ public class RemoteOpenDoorReq {
*/
private Long operatorId;
+ /**
+ * 门禁IDs
+ */
+ private Collection acIds;
+
/**
* 门操作数据
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
index d9bdb48b..acc08a0d 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
@@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.sis.domain.bo.SisAccessControlBo;
import org.dromara.sis.domain.vo.SisAccessControlVo;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
import java.util.Collection;
import java.util.List;
@@ -78,7 +79,7 @@ public interface ISisAccessControlService {
/**
* 查询门禁树
*
- * @return
+ * @return 树
*/
List> queryAcTree();
@@ -89,4 +90,11 @@ public interface ISisAccessControlService {
*/
Boolean syncE8();
+ /**
+ * 远程开门
+ *
+ * @param req 远程开门参数
+ */
+ Boolean remoteOpenDoor(RemoteOpenDoorReq req);
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAccessControlServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAccessControlServiceImpl.java
index 6bf1601c..07a780c1 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAccessControlServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAccessControlServiceImpl.java
@@ -23,6 +23,7 @@ import org.dromara.sis.domain.vo.SisAccessControlVo;
import org.dromara.sis.domain.vo.SisDeviceManageVo;
import org.dromara.sis.mapper.SisAccessControlMapper;
import org.dromara.sis.sdk.e8.E8PlatformApi;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
import org.dromara.sis.sdk.e8.domain.door.res.AuthDoorDeviceFindRes;
import org.dromara.sis.service.ISisAccessControlService;
import org.dromara.sis.service.ISisDeviceBindRefService;
@@ -50,6 +51,7 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
private final E8PlatformApi e8PlatformApi;
private final ISisDeviceManageService sisDeviceManageService;
private final ISisDeviceBindRefService sisDeviceBindRefService;
+
@DubboReference
private RemoteFloorService remoteFloorService;
@@ -221,7 +223,7 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
.toList();
Collection sisACBos = new ArrayList<>();
- for (AuthDoorDeviceFindRes res : filter){
+ for (AuthDoorDeviceFindRes res : filter) {
SisAccessControl ac = new SisAccessControl();
ac.setFactoryCode(res.getDeviceNo());
ac.setAccessCode(res.getDeviceId().toString());
@@ -238,4 +240,24 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
}
return baseMapper.insertBatch(sisACBos);
}
+
+ /**
+ * 远程开门
+ *
+ * @param req 远程开门参数
+ */
+ @Override
+ public Boolean remoteOpenDoor(RemoteOpenDoorReq req) {
+ List vo = baseMapper.selectVoByIds(req.getAcIds());
+
+ List list = new ArrayList<>();
+ for (SisAccessControlVo item : vo) {
+ RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData();
+ data.setDoorId(Long.parseLong(item.getOutDoorCode()));
+ data.setDeviceId(Long.parseLong(item.getOutCode()));
+ list.add(data);
+ }
+ req.setControlList(list);
+ return e8PlatformApi.remoteOpenDoor(req);
+ }
}
diff --git a/ruoyi-modules/Sis/src/main/resources/application.yml b/ruoyi-modules/Sis/src/main/resources/application.yml
index 0715e047..33447213 100644
--- a/ruoyi-modules/Sis/src/main/resources/application.yml
+++ b/ruoyi-modules/Sis/src/main/resources/application.yml
@@ -43,4 +43,9 @@ spring:
- optional:nacos:datasource.yml
- optional:nacos:${spring.application.name}.yml
-
+--- # rocketmq 配置
+rocketmq:
+ name-server: 192.168.24.101:9876
+ producer:
+ # 生产者组
+ group: dist-test