feat(sis):

- 新增 RocketMQ 消息队列配置和相关服务
- 实现远程开门接口和服务方法
- 更新梯控下发逻辑
This commit is contained in:
zcxlsm 2025-08-06 09:14:07 +08:00
parent f619c65261
commit db58a91252
11 changed files with 182 additions and 5 deletions

View File

@ -118,6 +118,11 @@
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.hik</groupId>
<artifactId>examples</artifactId>

View File

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

View File

@ -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<Boolean> remoteOpenDoor(@RequestBody RemoteOpenDoorReq req) {
return R.ok(sisAccessControlService.remoteOpenDoor(req));
}
}

View File

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

View File

@ -53,6 +53,9 @@ public class SisDeviceBindRefVo implements Serializable {
@ExcelProperty(value = "控制类型(1:门禁2电梯呼梯3:电梯梯控")
private Integer controlType;
/**
* 楼层id
*/
private Long deviceFloorId;
}

View File

@ -50,5 +50,14 @@ public class SisElevatorFloorRefVo implements Serializable {
@ExcelProperty(value = "授权组id")
private Long authGroupId;
/**
* 内部通道号
*/
private Long inChannel;
/**
* 外部通道号
*/
private Long outChannel;
}

View File

@ -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分别对应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

@ -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<Long> acIds;
/**
* 门操作数据
*/

View File

@ -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<TreeNode<Long>> queryAcTree();
@ -89,4 +90,11 @@ public interface ISisAccessControlService {
*/
Boolean syncE8();
/**
* 远程开门
*
* @param req 远程开门参数
*/
Boolean remoteOpenDoor(RemoteOpenDoorReq req);
}

View File

@ -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;
@ -238,4 +240,24 @@ public class SisAccessControlServiceImpl implements ISisAccessControlService {
}
return baseMapper.insertBatch(sisACBos);
}
/**
* 远程开门
*
* @param req 远程开门参数
*/
@Override
public Boolean remoteOpenDoor(RemoteOpenDoorReq req) {
List<SisAccessControlVo> vo = baseMapper.selectVoByIds(req.getAcIds());
List<RemoteOpenDoorReq.ControlData> 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);
}
}

View File

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