From db58a91252651d95d23ade334eb01a8764a0a4ff Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Wed, 6 Aug 2025 09:14:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(sis):=20-=20=E6=96=B0=E5=A2=9E=20RocketMQ?= =?UTF-8?q?=20=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=92=8C=E7=9B=B8=E5=85=B3=E6=9C=8D=E5=8A=A1=20-=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E8=BF=9C=E7=A8=8B=E5=BC=80=E9=97=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E6=9C=8D=E5=8A=A1=E6=96=B9=E6=B3=95=20-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=A2=AF=E6=8E=A7=E4=B8=8B=E5=8F=91=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/Sis/pom.xml | 5 ++ .../consumer/CleanLiftAuthRocketConsumer.java | 64 +++++++++++++++++++ .../SisAccessControlController.java | 13 ++++ .../sis/domain/bo/SisDeviceBindRefBo.java | 5 +- .../sis/domain/vo/SisDeviceBindRefVo.java | 5 +- .../sis/domain/vo/SisElevatorFloorRefVo.java | 9 +++ .../producer/CleanLiftAuthRocketProducer.java | 39 +++++++++++ .../accessControl/req/RemoteOpenDoorReq.java | 6 ++ .../sis/service/ISisAccessControlService.java | 10 ++- .../impl/SisAccessControlServiceImpl.java | 24 ++++++- .../Sis/src/main/resources/application.yml | 7 +- 11 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/consumer/CleanLiftAuthRocketConsumer.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/producer/CleanLiftAuthRocketProducer.java 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