From d2799a280c4b8a7a60f33b9c8e777dd1e97a3dc0 Mon Sep 17 00:00:00 2001 From: 15683799673 Date: Sat, 13 Sep 2025 09:01:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8A=A5=E8=AD=A6=E6=95=B0?= =?UTF-8?q?=E6=8D=AEwebsocket=20=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/RemoteWebSocketMessageService.java | 41 ++++++++++++ .../resource/api/domain/WebSocketMsgType.java | 26 ++++++++ .../handler/PlusWebSocketHandler.java | 2 +- .../impl/EventAlarmReportServiceImpl.java | 2 +- .../impl/SisAlarmEventsServiceImpl.java | 26 ++++++-- .../RemoteWebSocketMessageServiceImpl.java | 63 +++++++++++++++++++ 6 files changed, 153 insertions(+), 7 deletions(-) create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWebSocketMessageService.java create mode 100644 ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/WebSocketMsgType.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWebSocketMessageServiceImpl.java diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWebSocketMessageService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWebSocketMessageService.java new file mode 100644 index 00000000..4df31a99 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteWebSocketMessageService.java @@ -0,0 +1,41 @@ +package org.dromara.resource.api; + +import org.dromara.resource.api.domain.WebSocketMsgType; + +import java.util.List; + + +/** + * websocket 消息推送 + * + * @author lxj + */ +public interface RemoteWebSocketMessageService { + + /** + * 发送消息 + * + * @param sessionKey session主键 一般为用户id + * @param webSocketMsgType webSocket消息类型 + * @param data 消息数据 + */ + void publishMessage(List sessionKey, WebSocketMsgType webSocketMsgType, Object data); + + /** + * 发布订阅的消息(群发) + * + * @param webSocketMsgType webSocket消息类型 + * @param data 消息数据 + */ + void publishAll(WebSocketMsgType webSocketMsgType, Object data); + + /** + * 向指定的用户的指定会话发送消息 + * + * @param userId 要发送消息的用户id + * @param webSocketMsgType webSocket消息类型 + * @param data 消息数据 + */ + void sendMessage(Long userId, WebSocketMsgType webSocketMsgType, Object data); + +} diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/WebSocketMsgType.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/WebSocketMsgType.java new file mode 100644 index 00000000..daf0d888 --- /dev/null +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/WebSocketMsgType.java @@ -0,0 +1,26 @@ +package org.dromara.resource.api.domain; + +/** + * websocket 消息推送类型枚举 + * + * @author lxj + */ +public enum WebSocketMsgType { + + ALARM_MSG(100); + + /** + * 消息类型编码 + * 大类型 - 100,200,300,400 累加100 + * 小类型 - 101, 102, 103 累加1 + */ + private final Integer code; + + WebSocketMsgType(Integer code) { + this.code = code; + } + + public Integer getCode() { + return code; + } +} diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index abb35061..023d28f6 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -35,7 +35,7 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler { } WebSocketSessionHolder.addSession(loginUser.getUserId(), session); log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); - System.out.println(WebSocketSessionHolder.getSessions(loginUser.getUserId())); + log.info("WebSocketSession={}", WebSocketSessionHolder.getSessions(loginUser.getUserId())); } /** diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/EventAlarmReportServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/EventAlarmReportServiceImpl.java index 7d678cf7..2cddde63 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/EventAlarmReportServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/EventAlarmReportServiceImpl.java @@ -13,8 +13,8 @@ import org.dromara.property.api.RemoteAttendanceService; import org.dromara.property.api.RemoteFloorService; import org.dromara.property.api.domain.vo.RemoteAttendanceUserGroupVo; import org.dromara.property.api.domain.vo.RemoteFloorVo; -import org.dromara.sis.domain.entity.SisAlarmEvents; import org.dromara.sis.domain.bo.alarm.AlarmAssignmentBo; +import org.dromara.sis.domain.entity.SisAlarmEvents; import org.dromara.sis.domain.enums.ControlTypeEnum; import org.dromara.sis.domain.enums.EventSmallTypeEnum; import org.dromara.sis.domain.enums.RosterTypeEnum; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java index 211cc790..48c766b3 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java @@ -23,14 +23,16 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.property.api.RemoteAttendanceService; import org.dromara.property.api.domain.vo.RemoteAttendanceUserGroupVo; import org.dromara.resource.api.RemoteFileService; +import org.dromara.resource.api.RemoteWebSocketMessageService; import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.resource.api.domain.WebSocketMsgType; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.sis.domain.bo.alarm.AlarmAssignmentBo; +import org.dromara.sis.domain.bo.alarm.AlarmCompleteBo; import org.dromara.sis.domain.entity.SisAlarmEventAttachments; import org.dromara.sis.domain.entity.SisAlarmEventProcess; import org.dromara.sis.domain.entity.SisAlarmEvents; import org.dromara.sis.domain.entity.SisDeviceManage; -import org.dromara.sis.domain.bo.SisAlarmEventsBo; -import org.dromara.sis.domain.bo.alarm.AlarmAssignmentBo; -import org.dromara.sis.domain.bo.alarm.AlarmCompleteBo; import org.dromara.sis.domain.enums.AlarmStatus; import org.dromara.sis.domain.enums.EventBigTypeEnum; import org.dromara.sis.domain.enums.EventSmallTypeEnum; @@ -44,6 +46,9 @@ import org.dromara.sis.service.ISisDeviceManageService; import org.dromara.system.api.RemoteDictService; import org.dromara.system.api.domain.vo.RemoteDictDataVo; import org.dromara.system.api.model.LoginUser; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,7 +63,7 @@ import java.util.*; @Slf4j @RequiredArgsConstructor @Service -public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { +public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService, ApplicationContextAware { private final SisAlarmEventsMapper baseMapper; private final ISisDeviceManageService deviceManageService; @@ -71,6 +76,9 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { private RemoteAttendanceService remoteAttendanceService; @DubboReference private RemoteDictService remoteDictService; + @DubboReference + private RemoteWebSocketMessageService webSocketMessageService; + /** * 查询告警 @@ -303,8 +311,16 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { process.setTenantId(sisAlarmEvents.getTenantId()); Boolean insert = alarmEventProcessService.insert(process); log.info("事件处理信息写入完成,result= {}", insert); - //TODO 推送到执行客户端 + // 进行消息推送 + webSocketMessageService.publishMessage(List.of(bo.getSolveId()), WebSocketMsgType.ALARM_MSG, sisAlarmEvents); return true; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + + + } @Override diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWebSocketMessageServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWebSocketMessageServiceImpl.java new file mode 100644 index 00000000..e6b4f9ed --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteWebSocketMessageServiceImpl.java @@ -0,0 +1,63 @@ +package org.dromara.resource.dubbo; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; +import org.dromara.resource.api.RemoteWebSocketMessageService; +import org.dromara.resource.api.domain.WebSocketMsgType; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * websocket 消息推送实现类 + * + * @author lxj + */ +@Slf4j +@Service +@DubboService +public class RemoteWebSocketMessageServiceImpl implements RemoteWebSocketMessageService { + + @Override + public void publishMessage(List sessionKey, WebSocketMsgType webSocketMsgType, Object data) { + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(sessionKey); + dto.setMessage(createMsg(webSocketMsgType, data)); + try { + WebSocketUtils.publishMessage(dto); + } catch (Exception e) { + log.error("发送分布式消息失败,error:{}", e.getMessage()); + } + } + + @Override + public void publishAll(WebSocketMsgType webSocketMsgType, Object data) { + try { + WebSocketUtils.publishAll(createMsg(webSocketMsgType, data)); + } catch (Exception e) { + log.error("群发消息失败,error:{}", e.getMessage()); + } + + } + + @Override + public void sendMessage(Long userId, WebSocketMsgType webSocketMsgType, Object data) { + try { + WebSocketUtils.sendMessage(userId, createMsg(webSocketMsgType, data)); + } catch (Exception e) { + log.error("发送指定消息失败,error:{}", e.getMessage()); + } + + } + + private String createMsg(WebSocketMsgType webSocketMsgType, Object data) { + JSONObject msg = new JSONObject(); + msg.put("code", webSocketMsgType.getCode()); + msg.put("data", data); + return msg.toJSONString(); + } + +}