ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessEvent.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package org.dromara.common.core.domain.event; import jakarta.servlet.http.HttpServletRequest; import lombok.Data; import java.io.Serial; import java.io.Serializable; /** * æ»ä½æµç¨çå¬ * * @author may */ @Data public class ProcessEvent implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * æµç¨å®ä¹key */ private String key; /** * ä¸å¡id */ private String businessKey; /** * ç¶æ */ private String status; /** * å½ä¸ºtrueæ¶ä¸ºç³è¯·äººèç¹åç */ private boolean submit; /** * 请æ±ä½ */ private HttpServletRequest request; } ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/event/ProcessTaskEvent.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package org.dromara.common.core.domain.event; import jakarta.servlet.http.HttpServletRequest; import lombok.Data; import java.io.Serial; import java.io.Serializable; /** * æµç¨åççå¬ * * @author may */ @Data public class ProcessTaskEvent implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * æµç¨å®ä¹key䏿µç¨èç¹æ è¯(æ¼æ¥æ¹å¼ï¼æµç¨å®ä¹key_æµç¨èç¹) */ private String keyNode; /** * ä»»å¡id */ private String taskId; /** * ä¸å¡id */ private String businessKey; /** * 请æ±ä½ */ private HttpServletRequest request; } ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/handler/FlowProcessEventHandler.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package org.dromara.workflow.flowable.handler; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.springframework.stereotype.Component; /** * æµç¨çå¬æå¡ * * @author may * @date 2024-06-02 */ @Component public class FlowProcessEventHandler { /** * @param key æµç¨key * @param businessKey ä¸å¡id * @param status ç¶æ * @param submit å½ä¸ºtrueæ¶ä¸ºç³è¯·äººèç¹åç */ public void processHandler(String key, String businessKey, String status, boolean submit) { ProcessEvent processEvent = new ProcessEvent(); processEvent.setKey(key); processEvent.setBusinessKey(businessKey); processEvent.setStatus(status); processEvent.setSubmit(submit); processEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(processEvent); } /** * æ§è¡åçä»»å¡çå¬ * * @param keyNode æµç¨å®ä¹key䏿µç¨èç¹æ è¯(æ¼æ¥æ¹å¼ï¼æµç¨å®ä¹key_æµç¨èç¹) * @param taskId ä»»å¡id * @param businessKey ä¸å¡id */ public void processTaskHandler(String keyNode, String taskId, String businessKey) { ProcessTaskEvent processTaskEvent = new ProcessTaskEvent(); processTaskEvent.setKeyNode(keyNode); processTaskEvent.setTaskId(taskId); processTaskEvent.setBusinessKey(businessKey); processTaskEvent.setRequest(ServletUtils.getRequest()); SpringUtils.context().publishEvent(processTaskEvent); } } ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowEventStrategy.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowProcessEventHandler.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/strategy/FlowTaskEventHandler.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomProcessHandler.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/TestCustomTaskHandler.java
ÎļþÒÑɾ³ý ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
@@ -26,8 +26,7 @@ import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.service.IWfNodeConfigService; @@ -75,9 +74,9 @@ private final TaskService taskService; private final IActHiProcinstService actHiProcinstService; private final ManagementService managementService; private final FlowEventStrategy flowEventStrategy; private final IWfTaskBackNodeService wfTaskBackNodeService; private final IWfNodeConfigService wfNodeConfigService; private final FlowProcessEventHandler flowProcessEventHandler; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -460,10 +459,9 @@ BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus()); runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus()); runtimeService.deleteProcessInstance(processInstanceId, deleteReason); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); if (processHandler != null) { processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); } //æµç¨ä½åºçå¬ flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); return true; } catch (Exception e) { e.printStackTrace(); @@ -570,10 +568,9 @@ managementService.executeCommand(deleteExecutionCmd); } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); if (processHandler != null) { processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); } //æµç¨ä½åºçå¬ flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); return true; } catch (Exception e) { e.printStackTrace(); ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -9,8 +9,10 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.UserService; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -25,9 +27,7 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.*; import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.flowable.strategy.FlowEventStrategy; import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; import org.dromara.workflow.mapper.ActHiTaskinstMapper; import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; @@ -75,13 +75,13 @@ private final HistoryService historyService; private final IdentityService identityService; private final ManagementService managementService; private final FlowEventStrategy flowEventStrategy; private final ActTaskMapper actTaskMapper; private final IWfTaskBackNodeService wfTaskBackNodeService; private final ActHiTaskinstMapper actHiTaskinstMapper; private final IWfNodeConfigService wfNodeConfigService; private final IWfDefinitionConfigService wfDefinitionConfigService; private final UserService userService; private final FlowProcessEventHandler flowProcessEventHandler; /** * å¯å¨ä»»å¡ @@ -179,19 +179,15 @@ //éä»¶ä¸ä¼ AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId()); managementService.executeCommand(attachmentCmd); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); //æµç¨æäº¤çå¬ if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { if (processHandler != null) { processHandler.handleProcess(processInstance.getBusinessKey(), businessStatus, true); } flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); } runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); if (taskHandler != null) { taskHandler.handleTask(task.getId(), processInstance.getBusinessKey()); } //åççå¬ String keyNode = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); flowProcessEventHandler.processTaskHandler(keyNode, task.getId(), processInstance.getBusinessKey()); //åçæè§ taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "åæ" : completeTaskBo.getMessage()); //åçä»»å¡ @@ -207,9 +203,8 @@ if (pi == null) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); if (processHandler != null) { processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); } flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); } else { List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); for (Task t : list) { @@ -520,10 +515,9 @@ runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); } FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); if (processHandler != null) { processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); } //æµç¨ç»æ¢çå¬ flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); return true; } catch (Exception e) { throw new ServiceException(e.getMessage()); @@ -721,10 +715,8 @@ WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); if (processHandler != null) { processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); } flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); } //å é¤é©³ååçæµç¨èç¹ wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.event.ProcessEvent; import org.dromara.common.core.domain.event.ProcessTaskEvent; import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; @@ -17,6 +20,7 @@ import org.dromara.workflow.domain.vo.TestLeaveVo; import org.dromara.workflow.mapper.TestLeaveMapper; import org.dromara.workflow.service.ITestLeaveService; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,6 +35,7 @@ */ @RequiredArgsConstructor @Service @Slf4j public class TestLeaveServiceImpl implements ITestLeaveService { private final TestLeaveMapper baseMapper; @@ -117,4 +122,26 @@ workflowService.deleteRunAndHisInstance(idList); return baseMapper.deleteBatchIds(ids) > 0; } /** * æ»ä½æµç¨çå¬(ä¾å¦: æäº¤ éå æ¤é ç»æ¢ ä½åºç) * * @param processEvent åæ° */ @EventListener(condition = "#processEvent.key=='leave1'") public void processHandler(ProcessEvent processEvent) { log.info("å½å任塿§è¡äº{}", processEvent.toString()); } /** * æ§è¡åçä»»å¡çå¬ * * @param processTaskEvent åæ° */ @EventListener(condition = "#processTaskEvent.keyNode=='leave1_Activity_14633hx'") public void processTaskHandler(ProcessTaskEvent processTaskEvent) { log.info("å½å任塿§è¡äº{}", processTaskEvent.toString()); } }