更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
1、上一节说到RedisReceiver ,这里有调用了NbcioRedisListener自定义业务监听,如下:
- package com.ruoyi.common.redis.listener;
-
- import com.ruoyi.common.base.BaseMap;
-
-
- /**
- * 自定义消息监听
- * @author nbacheng
- * @date 2023-09-20
- */
-
- public interface NbcioRedisListener {
- void onMessage(BaseMap message);
- }
2、实现这个代码如下:
- package com.ruoyi.common.websocket;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
-
- import com.ruoyi.common.base.BaseMap;
- import com.ruoyi.common.constant.CommonSendStatus;
- import com.ruoyi.common.redis.listener.NbcioRedisListener;
-
- import cn.hutool.core.util.ObjectUtil;
- import lombok.extern.slf4j.Slf4j;
-
- /**
- * 监听消息(采用redis发布订阅方式发送消息)
- */
- @Slf4j
- @Component
- public class SocketHandler implements NbcioRedisListener {
-
- @Autowired
- private WebSocketServer webSocket;
-
- @Override
- public void onMessage(BaseMap map) {
- log.info("【SocketHandler消息】Redis Listerer:" + map.toString());
-
- String userId = map.get("userId");
- String message = map.get("message");
- if (ObjectUtil.isNotEmpty(userId)) {
- webSocket.pushMessage(userId, message);
- //app端消息推送
- webSocket.pushMessage(userId+CommonSendStatus.APP_SESSION_SUFFIX, message);
- } else {
- webSocket.pushMessage(message);
- }
-
- }
这里进行了websocket的服务器给用户推送,同时之前第一个节里公共类方法也同时往两个表增加数据,以便失败后后续可以进行发送,以确保能真正通知到用户。
3、接下来就是需要在用户提起流程发给审批人进行消息发送了
- package com.ruoyi.flowable.listener;
-
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
-
- import org.apache.commons.lang3.StringUtils;
- import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
- import org.flowable.common.engine.api.delegate.event.FlowableEvent;
- import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
- import org.flowable.common.engine.api.delegate.event.FlowableEventType;
- import org.flowable.engine.HistoryService;
- import org.flowable.engine.RepositoryService;
- import org.flowable.engine.TaskService;
- import org.flowable.engine.history.HistoricProcessInstance;
- import org.flowable.task.service.impl.persistence.entity.TaskEntity;
- import org.springframework.stereotype.Component;
-
- import com.ruoyi.common.core.service.CommonService;
- import com.ruoyi.common.constant.Constants;
- import com.ruoyi.common.core.domain.model.LoginUser;
-
- import javax.annotation.Resource;
-
- /**
- * 全局监听-工作流待办消息提醒
- *
- * @author nbacheng
- */
- @Slf4j
- @Component
- @RequiredArgsConstructor
- public class TaskCreateListener implements FlowableEventListener {
-
- private final TaskService taskService;
-
- @Resource
- private CommonService commonService;
-
- @Resource
- protected RepositoryService repositoryService;
-
- @Resource
- protected HistoryService historyService;
-
-
- @Override
- public void onEvent(FlowableEvent flowableEvent) {
- FlowableEventType type = flowableEvent.getType();
- if (type == FlowableEngineEventType.TASK_ASSIGNED) {
- if(flowableEvent instanceof org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl ) {
- TaskEntity taskEntity = (TaskEntity) ((org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) flowableEvent).getEntity();
- String taskId = taskEntity.getId();
- String procInsId = taskEntity.getProcessInstanceId();
- HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
- .processInstanceId(procInsId)
- .singleResult();
- String businessKey = historicProcessInstance.getBusinessKey();
- String deployId = historicProcessInstance.getDeploymentId();
- String startUserId = historicProcessInstance.getStartUserId();
- //获取任务接收人
- String receiver = taskEntity.getAssignee();
- if (StringUtils.isNotEmpty(receiver)) {
- //发送提醒消息
- String category = "";
- if(taskService.getVariables(taskId).get("category") != null) {
- category = taskService.getVariables(taskId).get("category").toString();
- }
-
- LoginUser loginUser = commonService.getLoginUser();
- String taskMessageUrl;
- if(StringUtils.isNotBlank(businessKey)) {
- taskMessageUrl = ""?procInsId=" + procInsId + "&deployId="
- + deployId + "&taskId=" + taskId + "&businessKey=" + businessKey + "&category=" + category
- + "&finished=true" + ">点击这个进行处理" ;
- }
- else {
- taskMessageUrl = ""?procInsId=" + procInsId + "&deployId="
- + deployId + "&taskId=" + taskId + "&businessKey" + "&category=" + category + "&finished=true" + ">点击这个进行处理" ;
- }
- String msgContent = "流程待办通知" + taskMessageUrl;
- if(!StringUtils.equals(startUserId, receiver) || !StringUtils.equals((loginUser.getUserId()).toString(),receiver)) {//发起人或登录人自己不发送
- log.info("流程待办通知给:" + receiver);
- commonService.sendSysNotice(loginUser.getUserId().toString(), receiver, "流程待办通知", msgContent, Constants.MSG_CATEGORY_3);//setMsgCategory=3是待办
- }
- }
- }
- }
- }
-
- @Override
- public boolean isFailOnException() {
- return false;
- }
-
- @Override
- public boolean isFireOnTransactionLifecycleEvent() {
- return false;
- }
-
- @Override
- public String getOnTransaction() {
- return null;
- }
- }