From e1a9fe0e44fbe6e97796621266e83111bd5c3721 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Wed, 13 Nov 2024 15:27:27 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/WorkflowStatus.java | 131 ++++++++++++++++++ .../listener/WorkflowFinishListener.java | 65 +++++++++ 2 files changed, 196 insertions(+) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java new file mode 100644 index 000000000..9552e9ba8 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/WorkflowStatus.java @@ -0,0 +1,131 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.warm.flow.core.utils.ObjectUtil; + +/** + * 工作流状态 + * + * @author AprilWind + */ +@Getter +@AllArgsConstructor +public enum WorkflowStatus { + + /** + * 待提交状态 + * 流程还未提交,处于待提交状态 + */ + TOBESUBMIT("0", "待提交", "submitted"), + + /** + * 审批中状态 + * 流程正在审批过程中,处于审批中状态 + */ + APPROVAL("1", "审批中", "approving"), + + /** + * 审批通过状态 + * 流程已通过审批,处于审批通过状态 + */ + PASS("2", "审批通过", "passed"), + + /** + * 自动完成状态 + * 流程已自动完成,通常不需要人工干预 + */ + AUTO_PASS("3", "自动完成", "auto"), + + /** + * 终止状态 + * 流程已终止,不能继续执行 + */ + TERMINATE("4", "终止", "terminated"), + + /** + * 作废状态 + * 流程被作废,已不再有效 + */ + NULLIFY("5", "作废", "nullified"), + + /** + * 撤销状态 + * 流程已被撤销,撤销后流程无法继续 + */ + CANCEL("6", "撤销", "cancelled"), + + /** + * 取回状态 + * 流程被取回,通常是审批被暂停,重新操作后可继续 + */ + RETRIEVE("7", "取回", "retrieved"), + + /** + * 已完成状态 + * 流程已全部完成,且所有操作已结束 + */ + FINISHED("8", "已完成", "done"), + + /** + * 已退回状态 + * 流程被退回,通常是审批不通过或者需要重新处理 + */ + REJECT("9", "已退回", "rejected"), + + /** + * 失效状态 + * 流程已失效,不再有效,不能继续执行 + */ + INVALID("10", "失效", "invalid"); + + /** + * 唯一标识符 + */ + private final String key; + + /** + * 中文描述 + */ + private final String value; + + /** + * 状态 + */ + private final String status; + + public static WorkflowStatus getByKey(String key) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getKey().equals(key)) { + return workflowStatus; + } + } + return null; + } + + public static WorkflowStatus getByValue(String value) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getValue().equals(value)) { + return workflowStatus; + } + } + return null; + } + + public static WorkflowStatus getByStatus(String status) { + for (WorkflowStatus workflowStatus : WorkflowStatus.values()) { + if (workflowStatus.getStatus().equals(status)) { + return workflowStatus; + } + } + return null; + } + + public static Boolean isFinished(String key) { + return ObjectUtil.isNotNull(key) && (WorkflowStatus.FINISHED.getKey().equals(key)); + } + + public static Boolean isFinished(WorkflowStatus workflowStatus) { + return ObjectUtil.isNotNull(workflowStatus) && (WorkflowStatus.FINISHED == workflowStatus); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java new file mode 100644 index 000000000..6a13c1cd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowFinishListener.java @@ -0,0 +1,65 @@ +package org.dromara.workflow.listener; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.event.ProcessEvent; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.warm.flow.core.entity.Definition; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.listener.Listener; +import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.workflow.common.enums.WorkflowStatus; +import org.dromara.workflow.service.IFlwInstanceService; +import org.springframework.stereotype.Component; + +/** + * 流程完成监听器,用于处理流程结束时的业务逻辑 + *

+ * 该监听器通常用于处理流程完成后的相关操作,如更新业务表、记录日志、通知等 + * 可以将业务逻辑放在此监听器中,也可以在业务代码中处理,或者使用局部监听器进行监听 + *

+ *

+ * 例如,当一个流程结束时,可能需要根据流程的状态更新业务表,执行后续的处理操作 + * 或者发送通知等。此监听器可以提供统一的处理入口 + *

+ * + * @author AprilWind + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class WorkflowFinishListener implements Listener { + + private final IFlwInstanceService iFlwInstanceService; + + /** + * 流程结束监听器,用于在流程结束后执行相关的业务逻辑 + *

+ * 该方法会在流程完成后被触发,通常用于执行业务表的新增或更新操作 + * 或者其他与业务相关的操作(如通知发送、记录日志等) + *

+ * + * @param listenerVariable 监听器变量,包含与当前流程相关的信息 + */ + @Override + public void notify(ListenerVariable listenerVariable) { + log.info("流程结束监听器"); + Instance instance = listenerVariable.getInstance(); + WorkflowStatus status = WorkflowStatus.getByKey(instance.getFlowStatus()); + Definition definition = listenerVariable.getDefinition(); + ProcessEvent processEvent = new ProcessEvent(); + //检查流程是否已结束 + if (WorkflowStatus.isFinished(status)) { + // 若流程已结束,更新状态为已完成 + iFlwInstanceService.updateStatus(instance.getId(), status.getStatus()); + // 流程结束监听,处理结束后的业务逻辑 + processEvent.setStatus(status.getStatus()); + processEvent.setSubmit(false); + processEvent.setFlowCode(definition.getFlowCode()); + processEvent.setBusinessKey(instance.getBusinessId()); + SpringUtils.context().publishEvent(processEvent); + } + log.info("流程结束监听器结束;{}", "流程完成处理"); + } + +}