STATUS_DESC_MAP = Arrays.stream(values())
- .collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc));
- /**
- * 状态
- */
- private final String status;
- /**
- * 状态描述。
- */
- private final String desc;
-
- /**
- * 根据状态编码获取任务业务状态描述。
- *
- * @param status 状态
- * @return 状态描述
- */
- public static String findByStatus(String status) {
- // 从缓存中直接获取描述
- return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY);
- }
-
- /**
- * 判断状态是否为通过或退回
- *
- * @param status 状态值
- * @return true 表示是通过或退回状态
- */
- public static boolean isPassOrBack(String status) {
- return PASS.getStatus().equals(status) || BACK.getStatus().equals(status);
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java
new file mode 100644
index 000000000..de3dc4cbd
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java
@@ -0,0 +1,32 @@
+package org.dromara.workflow.demo;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.warm.flow.core.service.task.ServiceTaskContext;
+import org.dromara.warm.flow.core.service.task.ServiceTaskHandler;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+/**
+ * 服务任务示例:class 模式
+ *
+ * 节点配置 {@code node_config.serviceTask} 里写 {@code {"type":"class","handler":"本类全名"}},
+ * 引擎先按全名从容器取 Bean,取不到才反射新建实例,所以注册成 Bean 后可以注入其它服务。
+ *
+ * @author may
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component
+public class DemoClassServiceTask implements ServiceTaskHandler {
+
+ @Override
+ public void execute(ServiceTaskContext context) {
+ log.info("服务任务[class 模式]开始执行: instanceId={}, nodeCode={}, nodeName={}",
+ context.getInstance().getId(), context.getNode().getNodeCode(), context.getNode().getNodeName());
+ context.setVariable("classTaskNode", context.getNode().getNodeCode());
+ context.setVariable("classTaskResult", "class模式已执行");
+ log.info("服务任务[class 模式]执行完成: instanceId={}, nodeCode={}",
+ context.getInstance().getId(), context.getNode().getNodeCode());
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java
new file mode 100644
index 000000000..7b5b5d071
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java
@@ -0,0 +1,38 @@
+package org.dromara.workflow.demo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.warm.flow.core.service.task.ServiceTaskContext;
+import org.dromara.warm.flow.core.service.task.ServiceTaskHandler;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+/**
+ * 服务任务示例:delegateExpression 模式
+ *
+ * 节点配置写 {@code {"type":"delegateExpression","expression":"#{@demoDelegateServiceTask}"}},
+ * 引擎按 SpEL 从容器取出本 Bean 后调用 {@code execute}。Bean 名即表达式里的名字,改名会打断已发布的定义。
+ *
+ * @author may
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component("demoDelegateServiceTask")
+@RequiredArgsConstructor
+public class DemoDelegateServiceTask implements ServiceTaskHandler {
+
+ private final DemoOrderService demoOrderService;
+
+ @Override
+ public void execute(ServiceTaskContext context) {
+ log.info("服务任务[delegateExpression 模式]开始执行: instanceId={}, nodeCode={}",
+ context.getInstance().getId(), context.getNode().getNodeCode());
+ String orderNo = demoOrderService.createOrder(context);
+ context.setVariable("delegateTaskOrderNo", orderNo);
+ context.setVariable("delegateTaskResult", StringUtils.format("delegateExpression模式已执行, 单号={}", orderNo));
+ log.info("服务任务[delegateExpression 模式]执行完成: instanceId={}, orderNo={}",
+ context.getInstance().getId(), orderNo);
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java
new file mode 100644
index 000000000..1e9a9898b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java
@@ -0,0 +1,60 @@
+package org.dromara.workflow.demo;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.warm.flow.core.service.task.ServiceTaskContext;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * 服务任务示例:expression 模式的被调用方
+ *
+ * 节点配置写 {@code {"type":"expression","expression":"#{@demoOrderService.createOrder(#execution)}",
+ * "resultVariable":"orderNo"}},{@code #execution} 就是引擎传入的 {@link ServiceTaskContext},
+ * 返回值按 {@code resultVariable} 写回流程变量。
+ *
+ * @author may
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component("demoOrderService")
+public class DemoOrderService {
+
+ /**
+ * 示例单号序列,仅用于演示“服务任务产出变量供后续网关判断”,非业务落库。
+ */
+ private final AtomicLong sequence = new AtomicLong(1000L);
+
+ /**
+ * 生成示例业务单号。
+ *
+ * @param context 服务任务上下文
+ * @return 示例单号
+ */
+ public String createOrder(ServiceTaskContext context) {
+ log.info("服务任务[expression 模式]开始执行: instanceId={}, nodeCode={}",
+ context.getInstance().getId(), context.getNode().getNodeCode());
+ context.setVariable("expressionTaskNode", context.getNode().getNodeCode());
+ context.setVariable("expressionTaskResult", "expression模式已执行");
+ String orderNo = "SO" + sequence.incrementAndGet();
+ log.info("服务任务[expression 模式]执行完成: instanceId={}, nodeCode={}, orderNo={}",
+ context.getInstance().getId(), context.getNode().getNodeCode(), orderNo);
+ return orderNo;
+ }
+
+ /**
+ * 按入参变量算请假天数,产出变量供后面的网关条件(如 {@code gt@@day|3})判断。
+ *
+ * @param context 服务任务上下文
+ * @return 天数
+ */
+ public Integer evalDay(ServiceTaskContext context) {
+ Object inputDay = context.getVariable("inputDay");
+ int day = inputDay == null ? 5 : Integer.parseInt(String.valueOf(inputDay));
+ log.info("服务任务[expression 模式]计算天数: instanceId={}, nodeCode={}, inputDay={}, day={}",
+ context.getInstance().getId(), context.getNode().getNodeCode(), inputDay, day);
+ return day;
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java
new file mode 100644
index 000000000..90d96372d
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java
@@ -0,0 +1,96 @@
+package org.dromara.workflow.demo;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.entity.Instance;
+import org.dromara.warm.flow.core.entity.Task;
+import org.dromara.warm.flow.core.spi.Listener;
+import org.dromara.warm.flow.core.spi.ListenerVariable;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * 付款失败善后监听器(示例)
+ *
+ * 挂在「财务执行付款」节点的 create 监听上:付款金额超过限额就调 {@code TaskService#throwError}
+ * 抛出 {@code PAY_FAILED},由流程定义上的错误边界捕获并走善后分支。金额先取本次办理变量,
+ * 取不到再回落实例变量,因为监听器可能在变量合并前触发。
+ *
+ * 节点监听器配置里写的是本类全名,改包名或类名要同步改已发布的流程定义。
+ *
+ * @author may
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component
+public class DemoPayFailListener implements Listener {
+
+ /**
+ * 付款金额变量名。
+ */
+ public static final String VAR_PAY_AMOUNT = "payAmount";
+
+ /**
+ * 免审限额,超过即视为付款失败需善后。
+ */
+ public static final BigDecimal PAY_AMOUNT_LIMIT = new BigDecimal("1000");
+
+ /**
+ * 错误码,需与流程定义上错误边界的错误码一致。
+ */
+ public static final String ERROR_CODE_PAY_FAILED = "PAY_FAILED";
+
+ @Override
+ public void notify(ListenerVariable listenerVariable) {
+ Task task = listenerVariable == null ? null : listenerVariable.getTask();
+ if (task == null || task.getId() == null) {
+ return;
+ }
+ BigDecimal amount = readPayAmount(listenerVariable);
+ if (amount == null || amount.compareTo(PAY_AMOUNT_LIMIT) <= 0) {
+ return;
+ }
+ log.info("付款金额 {} 超过限额 {},抛出 {} 转入错误边界: instanceId={}, taskId={}",
+ amount, PAY_AMOUNT_LIMIT, ERROR_CODE_PAY_FAILED, task.getInstanceId(), task.getId());
+ FlowEngine.taskService().throwError(task.getId(), ERROR_CODE_PAY_FAILED,
+ "付款金额 " + amount.toPlainString() + " 超过限额 " + PAY_AMOUNT_LIMIT.toPlainString() + ",转入善后处理");
+ }
+
+ /**
+ * 先取本次办理的变量,取不到再回落实例变量。
+ *
+ * @param listenerVariable 监听器变量
+ * @return 付款金额,未配置时返回 {@code null}
+ */
+ private BigDecimal readPayAmount(ListenerVariable listenerVariable) {
+ BigDecimal amount = parseAmount(listenerVariable.getVariable());
+ if (amount != null) {
+ return amount;
+ }
+ Instance instance = listenerVariable.getInstance();
+ return parseAmount(instance == null ? null : instance.getVariableMap());
+ }
+
+ /**
+ * 从变量集合里解析金额,非法值按未配置处理。
+ *
+ * @param variable 变量集合
+ * @return 付款金额,解析失败返回 {@code null}
+ */
+ private BigDecimal parseAmount(Map variable) {
+ if (variable == null || variable.get(VAR_PAY_AMOUNT) == null) {
+ return null;
+ }
+ String value = String.valueOf(variable.get(VAR_PAY_AMOUNT));
+ if (!StringUtils.isNumeric(value)) {
+ log.warn("流程变量 {} 不是数字,跳过付款校验: {}", VAR_PAY_AMOUNT, value);
+ return null;
+ }
+ return new BigDecimal(value);
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
index 741e9edd5..5d8d4458c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java
@@ -30,9 +30,5 @@ public class CompleteTaskContext {
*/
private Instance instance;
- /**
- * 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。
- */
- private Boolean autoPass;
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java
index 1733a701c..aa79f6a8d 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java
@@ -64,12 +64,12 @@ public class FlowHisTaskVo implements Serializable {
private Long taskId;
/**
- * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)
+ * 协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签)
*/
- private Integer cooperateType;
+ private String cooperateType;
/**
- * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)
+ * 协作方式展示名,由 cooperateType 翻译而来
*/
private String cooperateTypeName;
@@ -246,7 +246,7 @@ public class FlowHisTaskVo implements Serializable {
/**
* 设置协作方式,并通过协作方式获取名称
*/
- public void setCooperateType(Integer cooperateType) {
+ public void setCooperateType(String cooperateType) {
this.cooperateType = cooperateType;
this.cooperateTypeName = CooperateType.getValueByKey(cooperateType);
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java
index 5fb3380b4..55edd844e 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java
@@ -6,7 +6,6 @@ import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
-import java.util.Set;
/**
* Node 扩展属性解析结果 VO
@@ -28,13 +27,6 @@ public class NodeExtVo implements Serializable {
*/
private List buttonPermissions;
- /**
- * 抄送对象 ID 集合
- *
- * 根据扩展属性中 CopySettingEnum 类型的数据生成,存储需要抄送的对象 ID
- */
- private Set copySettings;
-
/**
* 自定义参数 Map
*
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
index b66c25279..7d7a5e08c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java
@@ -73,4 +73,9 @@ public class TestLeaveVo implements Serializable {
@ExcelProperty(value = "状态")
private String status;
+ /**
+ * 流程定义编码(已有流程实例时回显,供修改后重新提交沿用)
+ */
+ private String flowCode;
+
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java
new file mode 100644
index 000000000..ba9c154ba
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java
@@ -0,0 +1,33 @@
+package org.dromara.workflow.handler;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.warm.flow.core.service.event.EventMessage;
+import org.dromara.warm.flow.core.service.event.EventPublisher;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.springframework.stereotype.Component;
+
+/**
+ * 流程消息事件的宿主发布器
+ *
+ * 引擎在 {@code MESSAGE_THROW} / {@code MESSAGE_END} 时经 {@code FlowEngine.eventPublisher()}
+ * (即容器里唯一的 {@link EventPublisher} Bean)把消息交出来。没有这个 Bean 时引擎只会告警并跳过,
+ * 消息事件看起来“配了但没生效”。
+ *
+ * 当前实现只落日志,够演示与排查用;接真实中间件时在这里改成发 MQ / 调用外部接口,
+ * 注意本方法与流程状态更新在同一事务边界内,需要可靠投递请自行引入 Outbox。
+ *
+ * @author may
+ */
+@ConditionalOnEnable
+@Slf4j
+@Component
+public class WorkflowEventPublisher implements EventPublisher {
+
+ @Override
+ public void publish(EventMessage message) {
+ log.info("收到流程消息事件: eventName={}, eventType={}, definitionId={}, instanceId={}, nodeCode={}, payload={}",
+ message.getEventName(), message.getEventType(), message.getDefinitionId(), message.getInstanceId(),
+ message.getNodeCode(), message.getPayload());
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
index 30e3df6cc..f5e41e44a 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java
@@ -8,7 +8,7 @@ import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.domain.UserDTO;
-import org.dromara.warm.flow.core.handler.PermissionHandler;
+import org.dromara.warm.flow.core.spi.PermissionHandler;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.springframework.stereotype.Component;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
index a4422990e..d002be438 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java
@@ -1,7 +1,6 @@
package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -9,19 +8,17 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.SpringUtils;
-import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
-import org.dromara.system.api.UserService;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.workflow.context.WorkflowContext;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
-import org.dromara.warm.flow.core.listener.GlobalListener;
-import org.dromara.warm.flow.core.listener.ListenerVariable;
+import org.dromara.warm.flow.core.enums.TaskStatus;
+import org.dromara.warm.flow.core.spi.GlobalListener;
+import org.dromara.warm.flow.core.spi.ListenerVariable;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.FlowCopyBo;
import org.dromara.workflow.domain.vo.NodeExtVo;
import org.dromara.workflow.event.WorkflowCopyEvent;
@@ -37,7 +34,6 @@ import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
/**
* 工作流全局监听器,处理任务流转中的扩展变量、消息和事件发布。
@@ -55,7 +51,6 @@ public class WorkflowGlobalListener implements GlobalListener {
private final FlowProcessEventHandler flowProcessEventHandler;
private final IFlwCommonService flwCommonService;
private final IFlwNodeExtService nodeExtService;
- private final UserService userService;
/**
* 任务创建回调,当前预留扩展。
@@ -81,20 +76,6 @@ public class WorkflowGlobalListener implements GlobalListener {
variable = new HashMap<>();
}
NodeExtVo nodeExt = nodeExtService.parseNodeExt(ext, variable);
- Set copyList = nodeExt.getCopySettings();
- if (CollUtil.isNotEmpty(copyList)) {
- List userIds = StreamUtils.toList(copyList, Convert::toLong);
- Map nickNameMap = userService.selectUserNicksByIds(userIds);
- List list = StreamUtils.toList(copyList, x -> {
- FlowCopyBo bo = new FlowCopyBo();
- Long id = Convert.toLong(x);
- bo.setUserId(id);
- bo.setNickName(nickNameMap.getOrDefault(id, StringUtils.EMPTY));
- return bo;
- });
- // 节点配置仅作为默认值,保留本次办理显式提交的抄送人或空名单。
- variable.putIfAbsent(FlowConstant.FLOW_COPY_LIST, list);
- }
if (CollUtil.isNotEmpty(nodeExt.getVariables())) {
variable.putAll(nodeExt.getVariables());
}
@@ -120,9 +101,9 @@ public class WorkflowGlobalListener implements GlobalListener {
String nodeCode = flowTask.getNodeCode();
// 处理办理或退回时指定办理人的情况
- if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) {
+ if (TaskStatus.PASS.getKey().equals(taskStatus)) {
processTaskPermission(variable, flowTask, taskStatus);
- } else if (TaskStatusEnum.BACK.getStatus().equals(taskStatus)) {
+ } else if (TaskStatus.BACK.getKey().equals(taskStatus)) {
processTaskPermission(variable, flowTask, taskStatus);
}
@@ -163,7 +144,7 @@ public class WorkflowGlobalListener implements GlobalListener {
List userIdList = StringUtils.str2List(userIds, StringUtils.SEPARATOR, true, true);
if (CollUtil.isNotEmpty(userIdList)) {
flowTask.setPermissionList(userIdList);
- if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) {
+ if (TaskStatus.PASS.getKey().equals(taskStatus)) {
// 办理指定人变量只消费一次;驳回指定人变量需要保留给后续重复驳回。
variable.remove(nodeKey);
FlowEngine.insService().removeVariables(flowTask.getInstanceId(), nodeKey);
@@ -228,7 +209,7 @@ public class WorkflowGlobalListener implements GlobalListener {
return;
}
// 只有办理或者退回的时候才执行消息通知和抄送
- if (!TaskStatusEnum.isPassOrBack(workflowContext.getTaskStatus())) {
+ if (!isPassOrBack(workflowContext.getTaskStatus())) {
return;
}
if (ObjectUtil.isNull(variable)) {
@@ -267,7 +248,7 @@ public class WorkflowGlobalListener implements GlobalListener {
* @return 是否发送待办消息
*/
private boolean shouldSendTaskMessage(WorkflowContext workflowContext, Definition definition, List nextTasks) {
- if (workflowContext == null || !TaskStatusEnum.BACK.getStatus().equals(workflowContext.getTaskStatus())) {
+ if (workflowContext == null || !TaskStatus.BACK.getKey().equals(workflowContext.getTaskStatus())) {
return true;
}
if (CollUtil.isEmpty(nextTasks) || nextTasks.size() != 1) {
@@ -302,6 +283,16 @@ public class WorkflowGlobalListener implements GlobalListener {
SpringUtils.context().publishEvent(new WorkflowResultMessageEvent(definition.getFlowName(), status, instance.getCreateBy(), messageType));
}
+ /**
+ * 任务收口是否为「通过」或「退回」,只有这两种结果才触发消息通知与抄送。
+ *
+ * @param taskStatus 任务状态编码
+ * @return 是否为通过或退回
+ */
+ private boolean isPassOrBack(String taskStatus) {
+ return TaskStatus.PASS.getKey().equals(taskStatus) || TaskStatus.BACK.getKey().equals(taskStatus);
+ }
+
/**
* 根据流程实例确定最终状态
*
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java
deleted file mode 100644
index 7768e3677..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.dromara.workflow.liteflow.complete;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
-import com.yomahub.liteflow.annotation.LiteflowComponent;
-import com.yomahub.liteflow.core.NodeComponent;
-import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.utils.StreamUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.query.QueryBuilder;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.warm.flow.core.FlowEngine;
-import org.dromara.warm.flow.core.workflow.command.CompleteCommand;
-import org.dromara.warm.flow.core.workflow.context.OperatorContext;
-import org.dromara.warm.flow.core.entity.User;
-import org.dromara.warm.flow.orm.entity.FlowTask;
-import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
-import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
-import org.dromara.workflow.domain.context.CompleteTaskContext;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import static org.dromara.workflow.common.constant.FlowConstant.*;
-
-/**
- * 执行当前处理人的后续自动审批。
- *
- * 仅当流程实例开启自动审批时生效,用于连续跳过同一登录人负责的后续待办任务。
- *
- * @author may
- */
-@ConditionalOnEnable
-@RequiredArgsConstructor
-@LiteflowComponent("completeAutoPass")
-public class CompleteAutoPassComponent extends NodeComponent {
-
- private final FlowTaskMapper flowTaskMapper;
-
- @Override
- public void process() {
- CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
- FlowTask flowTask = context.getFlowTask();
- autoPass(flowTask.getId(), flowTask.getInstanceId());
- }
-
- /**
- * 递归跳过当前处理人的后续任务。
- *
- * @param taskId 本轮已处理任务 id,用于避免重复跳过同一任务
- * @param instanceId 流程实例 id
- */
- private void autoPass(Long taskId, Long instanceId) {
- List flowTaskList = selectByInstId(instanceId);
- if (CollUtil.isEmpty(flowTaskList)) {
- return;
- }
- List userList = FlowEngine.userService()
- .getByAssociateds(StreamUtils.toList(flowTaskList, FlowTask::getId));
- if (CollUtil.isEmpty(userList)) {
- return;
- }
- for (FlowTask task : flowTaskList) {
- if (task.getId().equals(taskId)) {
- continue;
- }
- // 自动审批只处理当前登录人仍是办理人的后续任务,避免替其他候选人或并行分支误审批。
- List users = StreamUtils.filter(userList,
- e -> ObjectUtil.equals(task.getId(), e.getAssociated()) && ObjectUtil.equal(e.getProcessedBy(), LoginHelper.getUserIdStr()));
- if (CollUtil.isEmpty(users)) {
- continue;
- }
- // 自动审批不继承人工办理时的抄送和消息通知,避免重复发送业务消息。
- CompleteCommand command = new CompleteCommand();
- command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
- command.setTaskId(task.getId());
- command.setMessage("流程引擎自动审批!");
- command.setVariables(Map.of(SUBMIT, false, FLOW_COPY_LIST, Collections.emptyList(), MESSAGE_NOTICE, StringUtils.EMPTY));
- command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
- FlowEngine.workflow().complete(command);
- // 跳过后可能生成新的后续任务,继续扫描直到当前登录人不再有可自动办理任务。
- autoPass(task.getId(), instanceId);
- }
- }
-
- private List selectByInstId(Long instanceId) {
- return flowTaskMapper.selectList(QueryBuilder.lambda(FlowTask.class)
- .eq(FlowTask::getInstanceId, instanceId)
- .build());
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
index 2ecc09b12..84e535880 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java
@@ -4,12 +4,11 @@ import cn.hutool.core.convert.Convert;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.core.workflow.command.CompleteCommand;
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.CompleteTaskBo;
import org.dromara.workflow.domain.context.CompleteTaskContext;
@@ -40,9 +39,9 @@ public class CompleteExecuteComponent extends NodeComponent {
command.setVariables(variables);
command.setMessage(completeTaskBo.getMessage());
command.setExt(completeTaskBo.getFileId());
- command.setFlowStatus(BusinessStatusEnum.WAITING.getStatus());
- command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
- context.setAutoPass(Convert.toBool(context.getInstance().getVariableMap().getOrDefault(AUTO_PASS, false)));
+ // 全局监听器用 context.taskStatus 判断「通过/退回」,才决定要不要抄送与发通知;
+ // 引擎不会把解析后的状态回填进调用上下文,办理路径不显式声明 PASS 就会静默跳过抄送。
+ command.setTaskStatus(TaskStatus.PASS.getKey());
FlowEngine.workflow().complete(command);
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java
deleted file mode 100644
index d74646c7d..000000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.dromara.workflow.liteflow.complete;
-
-import com.yomahub.liteflow.annotation.LiteflowComponent;
-import com.yomahub.liteflow.core.NodeBooleanComponent;
-import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.domain.context.CompleteTaskContext;
-
-/**
- * 判断办理任务后是否进入自动审批分支。
- *
- * @author may
- */
-@ConditionalOnEnable
-@LiteflowComponent("completeNeedAutoPass")
-public class CompleteNeedAutoPassComponent extends NodeBooleanComponent {
-
- @Override
- public boolean processBoolean() {
- CompleteTaskContext context = getContextBean(CompleteTaskContext.class);
- return Boolean.TRUE.equals(context.getAutoPass());
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java
index ad3bb56e2..54d7a5edb 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java
@@ -9,11 +9,11 @@ import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.core.entity.Instance;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.CompleteTaskBo;
import org.dromara.workflow.domain.context.CompleteTaskContext;
@@ -86,12 +86,12 @@ public class CompletePrepareComponent extends NodeComponent {
hashSet.addAll(popUserIds);
hashSet.addAll(variableUserIds);
// Warm-Flow 会按“状态:变量名”读取办理人,正向和退回都写入同一批候选人。
- map.put(TaskStatusEnum.PASS.getStatus() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
- map.put(TaskStatusEnum.BACK.getStatus() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
+ map.put(TaskStatus.PASS.getKey() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
+ map.put(TaskStatus.BACK.getKey() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet));
}
} else {
- map.put(TaskStatusEnum.PASS.getStatus() + StringUtils.COLON + entry.getKey(), entry.getValue());
- map.put(TaskStatusEnum.BACK.getStatus() + StringUtils.COLON + entry.getKey(), entry.getValue());
+ map.put(TaskStatus.PASS.getKey() + StringUtils.COLON + entry.getKey(), entry.getValue());
+ map.put(TaskStatus.BACK.getKey() + StringUtils.COLON + entry.getKey(), entry.getValue());
}
}
return map;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java
index 8e27a47e1..00ec10228 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java
@@ -7,13 +7,13 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.context.InstanceDeleteContext;
import java.util.List;
@@ -56,23 +56,27 @@ public class InstanceDeleteExecuteComponent extends NodeComponent {
/**
* 删除流程实例产生的抄送人员关联。
*
+ * 抄送人挂在抄送历史主键上(与引擎 {@code CopyAdvancer} 一致),不是待办主键。
+ * 只有本组件的历史分支需要显式清理——非历史分支走 {@code insService.remove},
+ * 引擎级联里已按历史主键清过一遍。
+ *
* @param instanceIds 流程实例 ID 集合
*/
private void deleteCopyUsers(List instanceIds) {
List copyTasks = flowHisTaskMapper.selectList(QueryBuilder.lambda(FlowHisTask.class)
.in(FlowHisTask::getInstanceId, instanceIds)
- .eq(FlowHisTask::getFlowStatus, TaskStatusEnum.COPY.getStatus())
+ .eq(FlowHisTask::getFlowStatus, TaskStatus.COPY.getKey())
.build());
if (CollUtil.isEmpty(copyTasks)) {
return;
}
- List copyTaskIds = copyTasks.stream()
- .map(FlowHisTask::getTaskId)
+ List copyHisIds = copyTasks.stream()
+ .map(FlowHisTask::getId)
.filter(Objects::nonNull)
.distinct()
.toList();
- if (CollUtil.isNotEmpty(copyTaskIds)) {
- FlowEngine.userService().deleteByTaskIds(copyTaskIds);
+ if (CollUtil.isNotEmpty(copyHisIds)) {
+ FlowEngine.userService().deleteByTaskIds(copyHisIds);
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
index 7ec6d6f57..a2ace850c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java
@@ -10,7 +10,6 @@ import org.dromara.warm.flow.core.workflow.command.RemoveSignerCommand;
import org.dromara.warm.flow.core.workflow.command.TransferCommand;
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.context.TaskOperationContext;
/**
@@ -37,7 +36,6 @@ public class TaskOpExecuteComponent extends NodeComponent {
command.setTaskId(taskId);
command.setTargetHandler(context.getTaskOperationBo().getUserId());
command.setMessage(message);
- command.setTaskStatus(TaskStatusEnum.DEPUTE.getStatus());
result = FlowEngine.workflow().delegate(command).isSuccess();
}
case TRANSFER_TASK -> {
@@ -46,7 +44,6 @@ public class TaskOpExecuteComponent extends NodeComponent {
command.setTaskId(taskId);
command.setTargetHandler(context.getTaskOperationBo().getUserId());
command.setMessage(message);
- command.setTaskStatus(TaskStatusEnum.TRANSFER.getStatus());
result = FlowEngine.workflow().transfer(command).isSuccess();
}
case ADD_SIGNATURE -> {
@@ -55,7 +52,6 @@ public class TaskOpExecuteComponent extends NodeComponent {
command.setTaskId(taskId);
command.setTargetHandlers(context.getTaskOperationBo().getUserIds());
command.setMessage(message);
- command.setTaskStatus(TaskStatusEnum.SIGN.getStatus());
result = FlowEngine.workflow().addSigner(command).isSuccess();
}
case REDUCTION_SIGNATURE -> {
@@ -64,7 +60,6 @@ public class TaskOpExecuteComponent extends NodeComponent {
command.setTaskId(taskId);
command.setTargetHandlers(context.getTaskOperationBo().getUserIds());
command.setMessage(message);
- command.setTaskStatus(TaskStatusEnum.SIGN_OFF.getStatus());
result = FlowEngine.workflow().removeSigner(command).isSuccess();
}
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
index 7adb8de0f..f96273630 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java
@@ -9,6 +9,7 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.core.workflow.command.StartCommand;
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
@@ -16,7 +17,6 @@ import org.dromara.warm.flow.core.workflow.result.WorkflowResult;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.api.domain.StartProcessReturnDTO;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.context.StartProcessContext;
import org.dromara.workflow.mapper.FlwInstanceBizExtMapper;
@@ -45,7 +45,7 @@ public class StartExecuteComponent extends NodeComponent {
command.setOperator(new OperatorContext(context.getStartProcessBo().getHandler()));
command.setVariables(context.getVariables());
command.setFlowStatus(BusinessStatusEnum.DRAFT.getStatus());
- command.setTaskStatus(TaskStatusEnum.PASS.getStatus());
+ command.setTaskStatus(TaskStatus.PASS.getKey());
WorkflowResult result = FlowEngine.workflow().start(command);
Instance instance = FlowEngine.insService().getById(result.getInstanceId());
context.setInstance(instance);
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java
index fc3cfa753..da642e965 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java
@@ -1,12 +1,10 @@
package org.dromara.workflow.liteflow.start;
import cn.hutool.core.convert.Convert;
-import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import org.dromara.common.core.exception.ServiceException;
-import org.dromara.common.json.utils.JsonUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.workflow.common.ConditionalOnEnable;
@@ -36,9 +34,6 @@ public class StartPrepareInstanceComponent extends NodeComponent {
context.setDefinition(definition);
Map variables = context.getVariables();
- Dict dict = JsonUtils.parseMap(definition.getExt());
- boolean autoPass = !ObjectUtil.isNull(dict) && dict.getBool(AUTO_PASS);
- variables.put(AUTO_PASS, autoPass);
variables.put(BUSINESS_CODE, generateBusinessCode(context.getBizExt()));
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java
index 5cc2e8c9d..8b9329a6b 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java
@@ -5,10 +5,10 @@ import com.github.yulichang.base.MPJBaseMapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.warm.flow.core.enums.NodeType;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.orm.entity.FlowDefinition;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowInstance;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.bo.FlowTaskBo;
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
@@ -51,7 +51,7 @@ public interface FlwHisTaskMapper extends BaseMapperPlus, MPJ
.select("d", FlowDefinition::getFlowName, FlowDefinition::getFlowCode, FlowDefinition::getCategory,
FlowDefinition::getVersion)
.select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::getBusinessTitle)
- .leftJoin(FlowHisTask.class, "b", FlowHisTask::getTaskId, FlowUser::getAssociated)
+ .leftJoin(FlowHisTask.class, "b", FlowHisTask::getId, FlowUser::getAssociated)
.leftJoin(FlowInstance.class, "c", FlowInstance::getId, FlowHisTask::getInstanceId)
.leftJoin(FlowDefinition.class, "d", FlowDefinition::getId, FlowInstance::getDefinitionId)
.leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId)
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
index 22e2578af..3a7a681e1 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
@@ -20,6 +20,7 @@ import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder;
import org.dromara.common.mybatis.core.query.QueryBuilder;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.enums.TaskStatus;
import org.dromara.warm.flow.core.workflow.command.RevokeCommand;
import org.dromara.warm.flow.core.workflow.command.TerminateCommand;
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
@@ -39,7 +40,6 @@ import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
import org.dromara.workflow.common.ConditionalOnEnable;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.bo.FlowCancelBo;
import org.dromara.workflow.domain.bo.FlowInstanceBo;
@@ -275,7 +275,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
command.getOperator().setIgnore(true);
command.setInstanceId(instance.getId());
command.setMessage(bo.message());
- command.setFlowStatus(BusinessStatusEnum.CANCEL.getStatus());
command.setTaskStatus(BusinessStatusEnum.CANCEL.getStatus());
FlowEngine.workflow().revoke(command);
return true;
@@ -321,7 +320,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
for (FlowHisTaskVo vo : runningTaskVos) {
- vo.setFlowStatus(TaskStatusEnum.WAITING.getStatus());
+ // 状态列保留待办任务自身的 flow_status(pending 待审批 / back 退回),
+ // 不要覆盖成实例维度编码:审批记录用任务字典渲染这一列。
vo.setUpdateTime(null);
vo.setRunDuration(null);
@@ -462,7 +462,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
command.setInstanceId(bo.id());
command.setMessage(bo.comment());
command.setFlowStatus(BusinessStatusEnum.INVALID.getStatus());
- command.setTaskStatus(TaskStatusEnum.INVALID.getStatus());
+ command.setTaskStatus(TaskStatus.INVALID.getKey());
FlowEngine.workflow().terminate(command);
return true;
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
index 6a3b312bf..a1455faf6 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
@@ -11,12 +11,10 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.utils.CollUtil;
-import org.dromara.warm.flow.core.utils.ExpressionUtil;
import org.dromara.warm.flow.ui.service.NodeExtService;
import org.dromara.warm.flow.ui.vo.NodeExt;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.ButtonPermissionEnum;
-import org.dromara.workflow.common.enums.CopySettingEnum;
import org.dromara.workflow.common.enums.NodeExtEnum;
import org.dromara.workflow.common.enums.VariablesEnum;
import org.dromara.workflow.domain.vo.ButtonPermissionVo;
@@ -45,14 +43,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
static {
CHILD_NODE_MAP = Map.of(
- CopySettingEnum.class.getSimpleName(),
- Map.of(
- "label", "抄送对象",
- "type", 5,
- "must", false,
- "multiple", false,
- "desc", "设置该节点的抄送办理人"
- ),
VariablesEnum.class.getSimpleName(),
Map.of(
"label", "自定义参数",
@@ -84,7 +74,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
List nodeExtList = new ArrayList<>();
// 构建基础设置页面
nodeExtList.add(buildNodeExt("wf_basic_tab", "基础设置", 1,
- List.of(CopySettingEnum.class, VariablesEnum.class)));
+ List.of(VariablesEnum.class)));
// 构建按钮权限页面
nodeExtList.add(buildNodeExt("wf_button_tab", "权限", 2,
List.of(ButtonPermissionEnum.class)));
@@ -192,21 +182,19 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
/**
* 解析扩展属性 JSON 并构建 Node 扩展属性对象
*
- * 根据传入的 JSON 字符串,将扩展属性分为三类:
+ * 根据传入的 JSON 字符串,将扩展属性分为两类:
* 1. ButtonPermissionEnum:解析为按钮权限列表,标记每个按钮是否勾选
- * 2. CopySettingEnum:解析为抄送对象 ID 集合
- * 3. VariablesEnum:解析为自定义参数 Map
+ * 2. VariablesEnum:解析为自定义参数 Map
*
*
示例 JSON:
* [
* {"code": "ButtonPermissionEnum", "value": "back,termination"},
- * {"code": "CopySettingEnum", "value": "1,3,4,#{@spelRuleComponent.selectDeptLeaderById(#deptId", "#roleId)}"},
* {"code": "VariablesEnum", "value": "key1=value1,key2=value2"}
* ]
*
* @param ext 扩展属性 JSON 字符串
* @param variable 流程变量
- * @return NodeExtVo 对象,封装按钮权限列表、抄送对象集合和自定义参数 Map
+ * @return NodeExtVo 对象,封装按钮权限列表和自定义参数 Map
*/
@Override
public NodeExtVo parseNodeExt(String ext, Map variable) {
@@ -240,22 +228,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
nodeExtVo.setButtonPermissions(buttonList);
- } else if (CopySettingEnum.class.getSimpleName().equals(code)) {
- List permissions = spelSmartSplit(value).stream()
- .map(s -> {
- List result = ExpressionUtil.evalVariable(s, variable);
- if (CollUtil.isNotEmpty(result)) {
- return result;
- }
- return Collections.singletonList(s);
- }).filter(Objects::nonNull)
- .flatMap(List::stream)
- .distinct()
- .collect(Collectors.toList());
- List copySettings = FlowEngine.permissionHandler().convertPermissions(permissions);
- // 解析抄送对象 ID 集合
- nodeExtVo.setCopySettings(new HashSet<>(copySettings));
-
} else if (VariablesEnum.class.getSimpleName().equals(code)) {
// 解析自定义参数
// 将 key=value 字符串拆分为 Map
@@ -272,93 +244,4 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
return nodeExtVo;
}
- /**
- * 按逗号分割字符串,但保留 #{...} 表达式和字符串常量中的逗号
- *
- * @param str 原始配置字符串
- * @return 智能分割后的片段列表
- */
- private static List spelSmartSplit(String str) {
- List result = new ArrayList<>();
- if (str == null || str.trim().isEmpty()) {
- return result;
- }
-
- StringBuilder token = new StringBuilder();
- // #{...} 的嵌套深度
- int depth = 0;
- // 是否在字符串常量中(" 或 ')
- boolean inString = false;
- // 当前字符串引号类型
- char stringQuote = 0;
-
- for (int i = 0; i < str.length(); i++) {
- char c = str.charAt(i);
-
- // 检测进入 SpEL 表达式 #{...}
- if (!inString && c == '#' && depth == 0 && checkNext(str, i, '{')) {
- depth++;
- token.append("#{");
- // 跳过 {
- i++;
- continue;
- }
-
- // 在表达式中遇到 { 或 } 改变嵌套深度
- if (!inString && depth > 0) {
- if (c == '{') {
- depth++;
- } else if (c == '}') {
- depth--;
- }
- token.append(c);
- continue;
- }
-
- // 检测字符串开始/结束
- if (depth > 0 && (c == '"' || c == '\'')) {
- if (!inString) {
- inString = true;
- stringQuote = c;
- } else if (stringQuote == c) {
- inString = false;
- }
- token.append(c);
- continue;
- }
-
- // 外层逗号才分割
- if (c == ',' && depth == 0 && !inString) {
- String part = token.toString().trim();
- if (!part.isEmpty()) {
- result.add(part);
- }
- token.setLength(0);
- continue;
- }
-
- token.append(c);
- }
-
- // 添加最后一个
- String part = token.toString().trim();
- if (!part.isEmpty()) {
- result.add(part);
- }
-
- return result;
- }
-
- /**
- * 判断指定位置的下一个字符是否匹配预期字符。
- *
- * @param str 原始字符串
- * @param index 当前索引
- * @param expected 期望匹配的字符
- * @return 匹配成功返回 {@code true}
- */
- private static boolean checkNext(String str, int index, char expected) {
- return index + 1 < str.length() && str.charAt(index + 1) == expected;
- }
-
}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
index 0854a07c6..bbda90ed6 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
@@ -18,11 +18,13 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.liteflow.utils.LiteFlowUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.query.QueryBuilder;
-import org.dromara.common.mybatis.utils.IdGeneratorUtil;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.api.UserService;
import org.dromara.system.api.domain.UserDTO;
import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.enums.FlowStatus;
+import org.dromara.warm.flow.core.enums.TaskStatus;
+import org.dromara.warm.flow.core.service.copy.CopyConfig;
import org.dromara.warm.flow.core.workflow.command.RejectCommand;
import org.dromara.warm.flow.core.workflow.command.TerminateCommand;
import org.dromara.warm.flow.core.workflow.context.OperatorContext;
@@ -35,6 +37,7 @@ import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.enums.UserType;
import org.dromara.warm.flow.core.exception.FlowException;
import org.dromara.warm.flow.core.service.*;
+import org.dromara.warm.flow.core.spi.PermissionHandler;
import org.dromara.warm.flow.core.utils.ExpressionUtil;
import org.dromara.warm.flow.core.utils.MapUtil;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
@@ -47,7 +50,6 @@ import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
import org.dromara.workflow.api.domain.StartProcessReturnDTO;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.enums.TaskAssigneeType;
-import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.context.CompleteTaskContext;
import org.dromara.workflow.domain.context.StartProcessContext;
@@ -148,44 +150,22 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (CollUtil.isEmpty(flowCopyList)) {
return;
}
- // 添加抄送人记录
- List flowHisTasks = flowHisTaskMapper.selectList(
- QueryBuilder.lambda(FlowHisTask.class)
- .eq(FlowHisTask::getTaskId, task.getId())
- .build());
- if (CollUtil.isEmpty(flowHisTasks)) {
- throw new ServiceException("流程历史任务不存在,无法添加抄送记录");
+ WorkflowContext context = new WorkflowContext();
+ context.setHandler(LoginHelper.getUserIdStr());
+ context.setMessage("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
+ // 抄送留痕交给引擎:按「同一待办 + 同一人」幂等,抄送人挂在抄送历史主键上,办结后仍可补抄送。
+ HisTask copyHis = taskService.copy(task.getId()
+ , StreamUtils.toList(flowCopyList, x -> Convert.toStr(x.getUserId())), context);
+ if (ObjectUtil.isNull(copyHis)) {
+ return;
}
- FlowHisTask flowHisTask = flowHisTasks.getFirst();
- FlowNode flowNode = new FlowNode();
- flowNode.setNodeCode(flowHisTask.getTargetNodeCode());
- flowNode.setNodeName(flowHisTask.getTargetNodeName());
- //生成新的任务id
- long taskId = IdGeneratorUtil.nextLongId();
- task.setId(taskId);
- task.setNodeName("【抄送】" + task.getNodeName());
- // 抄送记录展示在触发抄送的办理记录之前,历史列表按更新时间倒序排列。
- Date updateTime = new Date(flowHisTask.getUpdateTime().getTime() + 1000);
- WorkflowContext workflowContext = new WorkflowContext();
- workflowContext.setTaskStatus(TaskStatusEnum.COPY.getStatus());
- workflowContext.setMessage("【抄送给】" + StreamUtils.join(flowCopyList, FlowCopyBo::getNickName));
- HisTask hisTask = hisTaskService.setSkipHisTask(task, flowNode, workflowContext, SkipType.NONE.getKey());
- hisTask.setCreateTime(updateTime);
- hisTask.setUpdateTime(updateTime);
- hisTaskService.save(hisTask);
- List userList = StreamUtils.toList(flowCopyList, x ->
- new FlowUser()
- .setType(TaskAssigneeType.COPY.getCode())
- .setProcessedBy(Convert.toStr(x.getUserId()))
- .setAssociated(taskId));
- // 批量保存抄送人员
- FlowEngine.userService().saveBatch(userList);
- // 抄送消息进入“我的抄送”,不和待办列表混用。
+ // 抄送消息进入“我的抄送”,不和待办列表混用;只提醒本次真正新增的人。
flwCommonService.sendMessage(
List.of(org.dromara.workflow.common.enums.MessageTypeEnum.SYSTEM_MESSAGE.getCode()),
"您收到一条新的流程抄送,请及时查看。",
"单据抄送提醒",
- userService.selectListByIds(StreamUtils.toList(flowCopyList, FlowCopyBo::getUserId)),
+ userService.selectListByIds(StreamUtils.toList(
+ StringUtils.str2List(copyHis.getCollaborator(), StringUtils.SEPARATOR, true, true), Convert::toLong)),
PATH_TASK_COPY
);
}
@@ -325,8 +305,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
command.setVariables(variable);
command.setMessage(message);
command.setExt(bo.getFileId());
- command.setFlowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus());
- command.setTaskStatus(TaskStatusEnum.BACK.getStatus());
+ command.setFlowStatus(applyNodeCode.equals(bo.getNodeCode()) ? FlowStatus.BACK.getKey() : FlowStatus.WAITING.getKey());
+ command.setTaskStatus(TaskStatus.BACK.getKey());
FlowEngine.workflow().reject(command);
return true;
}
@@ -487,8 +467,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
command.setOperator(new OperatorContext(LoginHelper.getUserIdStr()));
command.setTaskId(taskId);
command.setMessage(bo.comment());
- command.setFlowStatus(BusinessStatusEnum.TERMINATION.getStatus());
- command.setTaskStatus(TaskStatusEnum.TERMINATION.getStatus());
FlowEngine.workflow().terminate(command);
return true;
}
@@ -544,12 +522,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
} else {
flowTaskVo.setButtonList(new ArrayList<>());
}
- if (CollUtil.isNotEmpty(nodeExtVo.getCopySettings())) {
- List list = StreamUtils.toList(nodeExtVo.getCopySettings(), x -> new FlowCopyVo(Convert.toLong(x)));
- flowTaskVo.setCopyList(list);
- } else {
- flowTaskVo.setCopyList(new ArrayList<>());
+ // 抄送人读引擎节点配置 node_config.copy,展开规则与流转时一致(resolveCopyHandlers)。
+ List copyHandlers = CopyConfig.parse(flowNode.getNodeConfig()).getHandlers();
+ PermissionHandler permissionHandler = FlowEngine.permissionHandler();
+ if (CollUtil.isNotEmpty(copyHandlers) && ObjectUtil.isNotNull(permissionHandler)) {
+ copyHandlers = permissionHandler.resolveCopyHandlers(copyHandlers);
}
+ flowTaskVo.setCopyList(StreamUtils.toList(copyHandlers, x -> new FlowCopyVo(Convert.toLong(x))));
if (CollUtil.isNotEmpty(nodeExtVo.getVariables())) {
flowTaskVo.setVarList(nodeExtVo.getVariables());
} else {
@@ -763,6 +742,19 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
if (taskAssignee) {
return;
}
+ // 抄送人挂在抄送历史主键上(引擎 CopyAdvancer),不挂在待办 id 下,
+ // 所以要先按待办找到抄送历史,再按历史主键查抄送接收人。
+ List copyHisList = FlowEngine.hisTaskService()
+ .list(FlowEngine.newHisTask().setTaskId(task.getId()).setFlowStatus(TaskStatus.COPY.getKey()));
+ List copyHisIds = StreamUtils.toList(copyHisList, HisTask::getId);
+ if (CollUtil.isNotEmpty(copyHisIds)) {
+ boolean copyReceiver = FlowEngine.userService().getByAssociateds(copyHisIds).stream()
+ .anyMatch(user -> Objects.equals(userId, user.getProcessedBy())
+ && UserType.COPY.getKey().equals(Convert.toStr(user.getType())));
+ if (copyReceiver) {
+ return;
+ }
+ }
Instance instance = insService.getById(task.getInstanceId());
if (ObjectUtil.isNotNull(instance) && Objects.equals(instance.getCreateBy(), userId)) {
return;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
index add317aaa..2db6ef395 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
@@ -17,6 +17,9 @@ import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.entity.Definition;
+import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.workflow.api.WorkflowService;
import org.dromara.workflow.api.domain.StartProcessDTO;
import org.dromara.workflow.api.event.ProcessDeleteEvent;
@@ -28,6 +31,7 @@ import org.dromara.workflow.domain.TestLeave;
import org.dromara.workflow.domain.bo.TestLeaveBo;
import org.dromara.workflow.domain.vo.TestLeaveVo;
import org.dromara.workflow.mapper.TestLeaveMapper;
+import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.ITestLeaveService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@@ -52,6 +56,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
private final TestLeaveMapper leaveMapper;
private final WorkflowService workflowService;
+ private final IFlwInstanceService flwInstanceService;
/**
* spel条件表达:判断小于2
@@ -71,7 +76,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
*/
@Override
public TestLeaveVo queryById(Long id) {
- return leaveMapper.selectVoById(id);
+ TestLeaveVo vo = leaveMapper.selectVoById(id);
+ if (ObjectUtil.isNull(vo)) {
+ return null;
+ }
+ // 撤回 / 退回后修改再提交走的是已有实例的续提交,前端需要拿到原流程编码
+ Instance instance = flwInstanceService.selectInstByBusinessId(Convert.toStr(id));
+ if (ObjectUtil.isNotNull(instance)) {
+ Definition definition = FlowEngine.defService().getById(instance.getDefinitionId());
+ if (ObjectUtil.isNotNull(definition)) {
+ vo.setFlowCode(definition.getFlowCode());
+ }
+ }
+ return vo;
}
/**
@@ -205,14 +222,19 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等)
* 正常使用只需#processEvent.flowCode=='leave1'
- * 示例为了方便则使用startsWith匹配了全部示例key
+ * 示例流程编码已切换为引擎自带的 demo_ 前缀,故这里按 demo 匹配
*
* @param processEvent 参数
*/
- @EventListener(condition = "#processEvent.flowCode.startsWith('leave')")
+ @EventListener(condition = "#processEvent.flowCode.startsWith('demo')")
public void processHandler(ProcessEvent processEvent) {
log.info("当前任务执行了{}", processEvent.toString());
TestLeave testLeave = leaveMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
+ if (ObjectUtil.isNull(testLeave)) {
+ // 定时启动 / 消息启动的流程带的是引擎自造 businessId(如 T2112..._1760...),
+ // 不是请假表主键,回写无从谈起;这里直接跳过,避免示例监听被无关流程的事件打爆。
+ return;
+ }
testLeave.setStatus(processEvent.getStatus());
// 用于例如审批附件 审批意见等 存储到业务表内 自行根据业务实现存储流程
Map params = processEvent.getParams();
@@ -247,7 +269,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
*
* @param processTaskEvent 参数
*/
- @EventListener(condition = "#processTaskEvent.flowCode.startsWith('leave')")
+ @EventListener(condition = "#processTaskEvent.flowCode.startsWith('demo')")
public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
log.info("当前任务创建了{}", processTaskEvent.toString());
}
@@ -255,11 +277,11 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
/**
* 监听删除流程事件
* 正常使用只需#processDeleteEvent.flowCode=='leave1'
- * 示例为了方便则使用startsWith匹配了全部示例key
+ * 示例流程编码已切换为引擎自带的 demo_ 前缀,故这里按 demo 匹配
*
* @param processDeleteEvent 参数
*/
- @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('leave')")
+ @EventListener(condition = "#processDeleteEvent.flowCode.startsWith('demo')")
public void processDeleteHandler(ProcessDeleteEvent processDeleteEvent) {
log.info("监听删除流程事件,当前任务执行了{}", processDeleteEvent.toString());
TestLeave testLeave = leaveMapper.selectById(Convert.toLong(processDeleteEvent.getBusinessId()));
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/liteflow/task-chain.el.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/liteflow/task-chain.el.xml
index 772243388..77d82afd5 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/resources/liteflow/task-chain.el.xml
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/liteflow/task-chain.el.xml
@@ -25,17 +25,12 @@
办理任务链路:
1. 加载任务实例、补齐变量并解析办理人
2. 构建参数并执行当前任务跳转
- 3. 开启自动审批时继续办理当前处理人的后续任务
+ 自动审批由引擎按流程定义配置 def_config.autoPass 在办理链内完成,宿主不再单独编排。
-->
THEN(
completePrepare,
- completeExecute,
- IF(
- completeNeedAutoPass,
- completeAutoPass,
- noop
- )
+ completeExecute
);
diff --git a/script/demo/demo_event_cooldown.json b/script/demo/demo_event_cooldown.json
new file mode 100644
index 000000000..e65fa9034
--- /dev/null
+++ b/script/demo/demo_event_cooldown.json
@@ -0,0 +1,111 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_cooldown",
+ "flowName": "账号注销-冷静期示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "85,200;160,200",
+ "nowNodeCode": "start",
+ "nextNodeCode": "apply"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,200|60,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "apply",
+ "nodeName": "提交注销申请",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "260,200;310,200",
+ "nowNodeCode": "apply",
+ "nextNodeCode": "cooldown"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "210,200|210,200",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "confirm",
+ "nodeName": "注销终审确认",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "560,200;610,200",
+ "nowNodeCode": "confirm",
+ "nextNodeCode": "msgThrow"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "510,200|510,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "cooldown",
+ "nodeName": "冷静期 2 分钟",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,200;460,200",
+ "nowNodeCode": "cooldown",
+ "nextNodeCode": "confirm"
+ }
+ ],
+ "eventType": "TIMER_CATCH",
+ "nodeRatio": "0",
+ "coordinate": "360,200|360,200",
+ "formCustom": "N",
+ "nodeConfig": "{\"event\":{\"timerType\":\"AFTER\",\"timerValue\":\"PT2M\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "msgThrow",
+ "nodeName": "注销结果推送",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "710,200;755,200",
+ "nowNodeCode": "msgThrow",
+ "nextNodeCode": "end"
+ }
+ ],
+ "eventName": "membership.cancelled",
+ "eventType": "MESSAGE_THROW",
+ "nodeRatio": "0",
+ "coordinate": "660,200|660,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "780,200|780,200",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_event_daily_check.json b/script/demo/demo_event_daily_check.json
new file mode 100644
index 000000000..75c24f50f
--- /dev/null
+++ b/script/demo/demo_event_daily_check.json
@@ -0,0 +1,194 @@
+{
+ "version": "2",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_daily_check",
+ "flowName": "每日自动巡检-终止结束示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "88,260;190,260",
+ "nowNodeCode": "start",
+ "nextNodeCode": "timerStart"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,260|60,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "inspect",
+ "nodeName": "执行数据巡检",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "470,260;555,260",
+ "nowNodeCode": "inspect",
+ "nextNodeCode": "gw1"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "420,260|420,260",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "qa",
+ "nodeName": "质检复核",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "830,120;1020,120;1020,235",
+ "nowNodeCode": "qa",
+ "nextNodeCode": "gw2"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "780,120|780,120",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "risk",
+ "nodeName": "风控否决判定",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "830,400;870,400",
+ "nowNodeCode": "risk",
+ "nextNodeCode": "gwRisk"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "780,400|780,400",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "terminate",
+ "nodeName": "严重异常终止",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1070,400;1220,400;1220,288",
+ "nowNodeCode": "terminate",
+ "nextNodeCode": "end"
+ }
+ ],
+ "eventType": "TERMINATE_END",
+ "nodeRatio": "0",
+ "coordinate": "1020,400|1020,400",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "timerStart",
+ "nodeName": "每天 09:00 自动发起",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "290,260;370,260",
+ "nowNodeCode": "timerStart",
+ "nextNodeCode": "inspect"
+ }
+ ],
+ "eventType": "TIMER_START",
+ "nodeRatio": "0",
+ "coordinate": "240,260|240,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"event\": {\"timerType\": \"POINT_IN_TIME\", \"timerValue\": \"[\\\"09:00\\\"]\", \"timezone\": \"Asia/Shanghai\", \"variables\": {\"veto\": 0, \"channel\": \"daily\"}}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "1220,260|1220,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gwRisk",
+ "nodeName": "是否严重异常",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipName": "严重异常",
+ "skipType": "PASS",
+ "coordinate": "925,400;970,400",
+ "nowNodeCode": "gwRisk",
+ "nextNodeCode": "terminate",
+ "skipCondition": "eq@@veto|1"
+ },
+ {
+ "skipName": "无异常",
+ "skipType": "PASS",
+ "coordinate": "900,378;900,260;995,260",
+ "nowNodeCode": "gwRisk",
+ "nextNodeCode": "gw2"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "900,400",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gw1",
+ "nodeName": "并行分支",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "605,260;700,260;700,120;730,120",
+ "nowNodeCode": "gw1",
+ "nextNodeCode": "qa"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "605,260;700,260;700,400;730,400",
+ "nowNodeCode": "gw1",
+ "nextNodeCode": "risk"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "580,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gw2",
+ "nodeName": "汇聚",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1045,260;1192,260",
+ "nowNodeCode": "gw2",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1020,260",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_event_notify.json b/script/demo/demo_event_notify.json
new file mode 100644
index 000000000..846ce9261
--- /dev/null
+++ b/script/demo/demo_event_notify.json
@@ -0,0 +1,74 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_notify",
+ "flowName": "注销结果通知-消息启动示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "85,200;160,200",
+ "nowNodeCode": "start",
+ "nextNodeCode": "msgStart"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,200|60,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "msgStart",
+ "nodeName": "账号已注销",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "260,200;310,200",
+ "nowNodeCode": "msgStart",
+ "nextNodeCode": "notify"
+ }
+ ],
+ "eventName": "membership.cancelled",
+ "eventType": "MESSAGE_START",
+ "nodeRatio": "0",
+ "coordinate": "210,200|210,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "notify",
+ "nodeName": "发送注销通知",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,200;455,200",
+ "nowNodeCode": "notify",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "360,200|360,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "480,200|480,200",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_event_pay_fail.json b/script/demo/demo_event_pay_fail.json
new file mode 100644
index 000000000..b900a5dad
--- /dev/null
+++ b/script/demo/demo_event_pay_fail.json
@@ -0,0 +1,120 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_pay_fail",
+ "flowName": "付款失败善后示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "85,200;160,200",
+ "nowNodeCode": "start",
+ "nextNodeCode": "apply"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,200|60,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "apply",
+ "nodeName": "发起付款申请",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "260,200;310,200",
+ "nowNodeCode": "apply",
+ "nextNodeCode": "pay"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "210,200|210,200",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "pay",
+ "nodeName": "财务执行付款",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,200;755,200",
+ "nowNodeCode": "pay",
+ "nextNodeCode": "end"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "360,240;360,360",
+ "nowNodeCode": "pay",
+ "nextNodeCode": "payBoundary"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "360,200|360,200",
+ "formCustom": "N",
+ "listenerPath": "org.dromara.workflow.demo.DemoPayFailListener",
+ "listenerType": "create",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "payBoundary",
+ "nodeName": "付款失败善后",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,400;460,400",
+ "nowNodeCode": "payBoundary",
+ "nextNodeCode": "rescue"
+ }
+ ],
+ "eventName": "PAY_FAILED",
+ "eventType": "ERROR_BOUNDARY",
+ "nodeRatio": "0",
+ "coordinate": "360,400|360,400",
+ "formCustom": "N",
+ "interrupting": 1,
+ "attachedToNodeCode": "pay"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "rescue",
+ "nodeName": "失败善后处理",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "560,400;780,400;780,225",
+ "nowNodeCode": "rescue",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "510,400|510,400",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "780,200|780,200",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_event_refund.json b/script/demo/demo_event_refund.json
new file mode 100644
index 000000000..ad52b9b3e
--- /dev/null
+++ b/script/demo/demo_event_refund.json
@@ -0,0 +1,149 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_refund",
+ "flowName": "退款审批-超时升级示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "85,200;160,200",
+ "nowNodeCode": "start",
+ "nextNodeCode": "apply"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,200|60,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "apply",
+ "nodeName": "提交退款申请",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "260,200;310,200",
+ "nowNodeCode": "apply",
+ "nextNodeCode": "review"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "210,200|210,200",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "finance",
+ "nodeName": "财务退款",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "710,200;760,200",
+ "nowNodeCode": "finance",
+ "nextNodeCode": "msgEnd"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "660,200|660,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "msgEnd",
+ "nodeName": "退款结果通知",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "860,200;905,200",
+ "nowNodeCode": "msgEnd",
+ "nextNodeCode": "end"
+ }
+ ],
+ "eventName": "refund.finish",
+ "eventType": "MESSAGE_END",
+ "nodeRatio": "0",
+ "coordinate": "810,200|810,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "review",
+ "nodeName": "客服初审",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "360,240;360,400;460,400",
+ "nowNodeCode": "review",
+ "nextNodeCode": "supervisor"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "360,200|360,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "reviewBoundary",
+ "nodeName": "初审超时升级",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,400;460,400",
+ "nowNodeCode": "reviewBoundary",
+ "nextNodeCode": "supervisor"
+ }
+ ],
+ "eventType": "TIMER_BOUNDARY",
+ "nodeRatio": "0",
+ "coordinate": "360,400|360,400",
+ "formCustom": "N",
+ "nodeConfig": "{\"event\":{\"timerType\":\"AFTER\",\"timerValue\":\"PT2M\"}}",
+ "interrupting": 1,
+ "attachedToNodeCode": "review"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "supervisor",
+ "nodeName": "客服主管复核",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "560,400;660,400;660,240",
+ "nowNodeCode": "supervisor",
+ "nextNodeCode": "finance"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "510,400|510,400",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "930,200|930,200",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_event_risk_wait.json b/script/demo/demo_event_risk_wait.json
new file mode 100644
index 000000000..450085c3e
--- /dev/null
+++ b/script/demo/demo_event_risk_wait.json
@@ -0,0 +1,93 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_event_risk_wait",
+ "flowName": "支付对账-等待外部回调示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "85,200;160,200",
+ "nowNodeCode": "start",
+ "nextNodeCode": "msgStart"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,200|60,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "msgStart",
+ "nodeName": "订单已支付",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "260,200;310,200",
+ "nowNodeCode": "msgStart",
+ "nextNodeCode": "riskCatch"
+ }
+ ],
+ "eventName": "order.paid",
+ "eventType": "MESSAGE_START",
+ "nodeRatio": "0",
+ "coordinate": "210,200|210,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "riskCatch",
+ "nodeName": "等待风控审核结果",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "410,200;460,200",
+ "nowNodeCode": "riskCatch",
+ "nextNodeCode": "settle"
+ }
+ ],
+ "eventName": "risk.result",
+ "eventType": "MESSAGE_CATCH",
+ "nodeRatio": "0",
+ "coordinate": "360,200|360,200",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "settle",
+ "nodeName": "对账确认",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "560,200;605,200",
+ "nowNodeCode": "settle",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "510,200|510,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "630,200|630,200",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_gateway_classic.json b/script/demo/demo_gateway_classic.json
new file mode 100644
index 000000000..4ceb28388
--- /dev/null
+++ b/script/demo/demo_gateway_classic.json
@@ -0,0 +1,385 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_gateway_classic",
+ "flowName": "网关综合-经典模式示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "88,260;180,260",
+ "nowNodeCode": "start",
+ "nextNodeCode": "submit"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,260|60,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,addSign,transfer,trust\"}]",
+ "nodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc",
+ "nodeName": "第四个",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "860,140;935,140;935,260;975,260",
+ "nowNodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc",
+ "nextNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858"
+ }
+ ],
+ "nodeRatio": "100",
+ "coordinate": "810,140|810,140",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001@@1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "nodeName": "包容小于三",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2180,200;2280,200;2280,260;2305,260",
+ "nowNodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2130,200|2130,200",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65",
+ "nodeName": "包容4",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2180,500;2280,500;2280,260;2305,260",
+ "nowNodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2130,500|2130,500",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf",
+ "nodeName": "并行一",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1420,140;1530,140",
+ "nowNodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf",
+ "nextNodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1370,140|1370,140",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda",
+ "nodeName": "最后一个",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2560,260;2652,260",
+ "nowNodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda",
+ "nextNodeCode": "19c75cd4-36c3-48f7-96ad-9205f9337a2f"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2510,260|2510,260",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,addSign\"}]",
+ "nodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4",
+ "nodeName": "并行二",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1630,140;1700,140;1700,260;1735,260",
+ "nowNodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4",
+ "nextNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5"
+ }
+ ],
+ "nodeRatio": "60",
+ "coordinate": "1580,140|1580,140",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001@@1761100000000000003@@1761100000000000004"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,transfer,trust,addSign,subSign\"}]",
+ "nodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "nodeName": "大于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "640,140;760,140",
+ "nowNodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "nextNodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "590,140|590,140",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672",
+ "nodeName": "包容3",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2180,350;2255,350;2255,260;2305,260",
+ "nowNodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2130,350|2130,350",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,transfer,addSign,trust\"}]",
+ "nodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462",
+ "nodeName": "小于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "640,380;935,380;935,260;975,260",
+ "nowNodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462",
+ "nextNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "590,380|590,380",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "nodeName": "包容day大于三",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2180,50;2255,50;2255,260;2305,260",
+ "nowNodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2130,50|2130,50",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc",
+ "nodeName": "并行一同级",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1420,400;1700,400;1700,260;1735,260",
+ "nowNodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc",
+ "nextNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1370,400|1370,400",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "submit",
+ "nodeName": "申请人",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "280,260;365,260",
+ "nowNodeCode": "submit",
+ "nextNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "230,260|230,260",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "19c75cd4-36c3-48f7-96ad-9205f9337a2f",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "2680,260|2680,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1025,260;1145,260",
+ "nowNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858",
+ "nextNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1000,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipName": "day>3",
+ "skipType": "PASS",
+ "coordinate": "415,260;480,260;480,140;540,140",
+ "nowNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nextNodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "skipCondition": "gt@@day|3"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "415,260;480,260;480,380;540,380",
+ "nowNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nextNodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "390,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1785,260;1905,260",
+ "nowNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5",
+ "nextNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1760,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1195,260;1265,260;1265,140;1320,140",
+ "nowNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nextNodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "1195,260;1265,260;1265,400;1320,400",
+ "nowNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nextNodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1170,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nodeType": 5,
+ "skipList": [
+ {
+ "skipName": "day>3",
+ "skipType": "PASS",
+ "coordinate": "1955,260;2020,260;2020,50;2080,50",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "skipCondition": "gt@@day|3"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "1955,260;2020,260;2020,350;2080,350",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "1955,260;2045,260;2045,500;2080,500",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65"
+ },
+ {
+ "skipName": "day<3",
+ "skipType": "PASS",
+ "coordinate": "1955,260;2045,260;2045,200;2080,200",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "skipCondition": "lt@@day|3"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1930,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4",
+ "nodeType": 5,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "2355,260;2460,260",
+ "nowNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4",
+ "nextNodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "2330,260",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/demo/demo_gateway_mimic.json b/script/demo/demo_gateway_mimic.json
new file mode 100644
index 000000000..8dd82b727
--- /dev/null
+++ b/script/demo/demo_gateway_mimic.json
@@ -0,0 +1,385 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_gateway_mimic",
+ "flowName": "网关综合-仿钉钉模式示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,120;700,202",
+ "nowNodeCode": "start",
+ "nextNodeCode": "submit"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,100|700,100",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,addSign,transfer,trust\"}]",
+ "nodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc",
+ "nodeName": "第四个",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "550,698;550,782;682,800",
+ "nowNodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc",
+ "nextNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858"
+ }
+ ],
+ "nodeRatio": "100",
+ "coordinate": "550,660|550,660",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001@@1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "nodeName": "包容小于三",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1150,1648;1150,1740;718,1740",
+ "nowNodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1150,1610|1150,1610",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65",
+ "nodeName": "包容4",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "850,1648;850,1740;718,1740",
+ "nowNodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "850,1610|850,1610",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf",
+ "nodeName": "并行一",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "550,1108;550,1172",
+ "nowNodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf",
+ "nextNodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "550,1070|550,1070",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda",
+ "nodeName": "最后一个",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,1908;700,1990",
+ "nowNodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda",
+ "nextNodeCode": "19c75cd4-36c3-48f7-96ad-9205f9337a2f"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,1870|700,1870",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,addSign\"}]",
+ "nodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4",
+ "nodeName": "并行二",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "550,1248;550,1340;682,1340",
+ "nowNodeCode": "8d4baa8d-b2ca-4de0-96df-33e46aa12bb4",
+ "nextNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5"
+ }
+ ],
+ "nodeRatio": "60",
+ "coordinate": "550,1210|550,1210",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001@@1761100000000000003@@1761100000000000004"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,transfer,trust,addSign,subSign\"}]",
+ "nodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "nodeName": "大于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "550,558;550,622",
+ "nowNodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "nextNodeCode": "51ca4cb3-684b-4c3d-b474-9ec3363440bc"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "550,520|550,520",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672",
+ "nodeName": "包容3",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "550,1648;550,1740;682,1740",
+ "nowNodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "550,1610|550,1610",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file,subSign,transfer,addSign,trust\"}]",
+ "nodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462",
+ "nodeName": "小于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "850,558;850,800;718,800",
+ "nowNodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462",
+ "nextNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "850,520|850,520",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "nodeName": "包容day大于三",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "250,1648;250,1740;682,1740",
+ "nowNodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "nextNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "250,1610|250,1610",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc",
+ "nodeName": "并行一同级",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "850,1108;850,1340;718,1340",
+ "nowNodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc",
+ "nextNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "850,1070|850,1070",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "submit",
+ "nodeName": "申请人",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,278;700,362",
+ "nowNodeCode": "submit",
+ "nextNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,240|700,240",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "19c75cd4-36c3-48f7-96ad-9205f9337a2f",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "700,2010|700,2010",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,818;700,912",
+ "nowNodeCode": "17000bff-87ab-4b6d-babc-0f3c51b48858",
+ "nextNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,800|700,800",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipName": "day>3",
+ "skipType": "PASS",
+ "coordinate": "682,380;550,380;550,482|550,410",
+ "nowNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nextNodeCode": "974a0d43-53a1-4384-8ee1-2f9665d5aa2d",
+ "skipCondition": "gt@@day|3"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "718,380;850,380;850,482",
+ "nowNodeCode": "e9b6ac64-5deb-4af9-81f2-4b750b8b890a",
+ "nextNodeCode": "dc06e24f-b67c-4268-b2d7-dea1941ef462"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,380|700,380",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,1358;700,1452",
+ "nowNodeCode": "ca78e892-b181-4d2e-afbe-21e0d1936fe5",
+ "nextNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,1340|700,1340",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "682,930;550,930;550,1032",
+ "nowNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nextNodeCode": "86d7c888-0428-4c0f-b462-6e4563c21daf"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "718,930;850,930;850,1032",
+ "nowNodeCode": "ffa7942a-e0b4-42c8-9aa6-83ebb6208547",
+ "nextNodeCode": "f6fc6c06-4d64-4ee6-8f6a-4c5212d01ccc"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,930|700,930",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nodeType": 5,
+ "skipList": [
+ {
+ "skipName": "day>3",
+ "skipType": "PASS",
+ "coordinate": "682,1470;250,1470;250,1572|250,1500",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "f3482139-ab8e-4f18-940a-d3298346caff",
+ "skipCondition": "gt@@day|3"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "682,1470;550,1470;550,1572",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "b057d0fb-068d-47db-ae9e-8f4356600672"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "718,1470;850,1470;850,1572",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "79a20053-b41e-4f16-987d-5ac6e2a37a65"
+ },
+ {
+ "skipName": "day<3",
+ "skipType": "PASS",
+ "coordinate": "718,1470;1150,1470;1150,1572|1150,1500",
+ "nowNodeCode": "761c8e6e-169d-48f7-be85-1b3f1c3c1646",
+ "nextNodeCode": "54e21807-9501-4e49-90b9-1104f359709e",
+ "skipCondition": "lt@@day|3"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,1470|700,1470",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4",
+ "nodeType": 5,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "700,1758;700,1832",
+ "nowNodeCode": "ed4a73f7-5197-4362-a4c7-e6295ad211c4",
+ "nextNodeCode": "8b46aefa-c496-48c4-ae2c-381035f69dda"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "700,1740|700,1740",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "MIMIC"
+}
diff --git a/script/demo/demo_service_task.json b/script/demo/demo_service_task.json
new file mode 100644
index 000000000..6e281e6ea
--- /dev/null
+++ b/script/demo/demo_service_task.json
@@ -0,0 +1,281 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_service_task",
+ "flowName": "服务任务示例",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "80,260;190,260",
+ "nowNodeCode": "start",
+ "nextNodeCode": "submit"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,260|60,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "approve",
+ "nodeName": "汇聚后审批",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1730,260;1840,260",
+ "nowNodeCode": "approve",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1710,260|1710,260",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "bigDay",
+ "nodeName": "大于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1130,100;1240,260",
+ "nowNodeCode": "bigDay",
+ "nextNodeCode": "forkP"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1110,100|1110,100",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "humanBranch",
+ "nodeName": "并行分支人工",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1430,420;1540,260",
+ "nowNodeCode": "humanBranch",
+ "nextNodeCode": "joinP"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1410,420|1410,420",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "smallDay",
+ "nodeName": "小于等于三天",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1130,420;1240,260",
+ "nowNodeCode": "smallDay",
+ "nextNodeCode": "forkP"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1110,420|1110,420",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "1860,260|1860,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gwDay",
+ "nodeName": "天数分支",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "980,260;1090,100",
+ "nowNodeCode": "gwDay",
+ "nextNodeCode": "bigDay",
+ "skipCondition": "gt@@day|3"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "980,260;1090,420",
+ "nowNodeCode": "gwDay",
+ "nextNodeCode": "smallDay"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "960,260|960,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "forkP",
+ "nodeName": "并行网关",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1280,260;1390,100",
+ "nowNodeCode": "forkP",
+ "nextNodeCode": "svcBranch"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "1280,260;1390,420",
+ "nowNodeCode": "forkP",
+ "nextNodeCode": "humanBranch"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1260,260|1260,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "joinP",
+ "nodeName": "汇聚网关",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1580,260;1690,260",
+ "nowNodeCode": "joinP",
+ "nextNodeCode": "approve"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1560,260|1560,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "svcBranch",
+ "nodeName": "并行分支服务任务",
+ "nodeType": 6,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1430,100;1540,260",
+ "nowNodeCode": "svcBranch",
+ "nextNodeCode": "joinP"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1410,100|1410,100",
+ "formCustom": "N",
+ "nodeConfig": "{\"serviceTask\":{\"type\":\"class\",\"handler\":\"org.dromara.workflow.demo.DemoClassServiceTask\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "svcCalc",
+ "nodeName": "计算天数服务任务",
+ "nodeType": 6,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "830,260;940,260",
+ "nowNodeCode": "svcCalc",
+ "nextNodeCode": "gwDay"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "810,260|810,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"serviceTask\":{\"type\":\"expression\",\"expression\":\"#{@demoOrderService.evalDay(#execution)}\",\"resultVariable\":\"day\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "svcClass",
+ "nodeName": "Java 类服务任务",
+ "nodeType": 6,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "380,260;490,260",
+ "nowNodeCode": "svcClass",
+ "nextNodeCode": "svcDelegate"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "360,260|360,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"serviceTask\":{\"type\":\"class\",\"handler\":\"org.dromara.workflow.demo.DemoClassServiceTask\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "svcDelegate",
+ "nodeName": "Bean 委托表达式服务任务",
+ "nodeType": 6,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "530,260;640,260",
+ "nowNodeCode": "svcDelegate",
+ "nextNodeCode": "svcExpression"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "510,260|510,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"serviceTask\":{\"type\":\"delegateExpression\",\"expression\":\"#{@demoDelegateServiceTask}\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "svcExpression",
+ "nodeName": "方法表达式服务任务",
+ "nodeType": 6,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "680,260;790,260",
+ "nowNodeCode": "svcExpression",
+ "nextNodeCode": "svcCalc"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "660,260|660,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"serviceTask\":{\"type\":\"expression\",\"expression\":\"#{@demoOrderService.createOrder(#execution)}\",\"resultVariable\":\"orderNo\"}}"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "submit",
+ "nodeName": "申请人",
+ "nodeType": 1,
+ "nodeRatio": "0",
+ "coordinate": "210,260|210,260",
+ "formCustom": "N",
+ "permissionFlag": "warmFlowInitiator",
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "230,260;340,260",
+ "nowNodeCode": "submit",
+ "nextNodeCode": "svcClass"
+ }
+ ]
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
\ No newline at end of file
diff --git a/script/demo/demo_timer_start.json b/script/demo/demo_timer_start.json
new file mode 100644
index 000000000..0d2a9f692
--- /dev/null
+++ b/script/demo/demo_timer_start.json
@@ -0,0 +1,194 @@
+{
+ "version": "1",
+ "category": "1762300000000000100",
+ "flowCode": "demo_timer_start",
+ "flowName": "定时启动示例(发布 30 秒后自动发起·带默认变量)",
+ "formPath": "/workflow/leaveEdit/index",
+ "nodeList": [
+ {
+ "ext": "[]",
+ "nodeCode": "start",
+ "nodeName": "开始",
+ "nodeType": 0,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "88,260;190,260",
+ "nowNodeCode": "start",
+ "nextNodeCode": "timerStart"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "60,260|60,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "inspect",
+ "nodeName": "执行数据巡检",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "470,260;555,260",
+ "nowNodeCode": "inspect",
+ "nextNodeCode": "gw1"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "420,260|420,260",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000001"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "qa",
+ "nodeName": "质检复核",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "830,120;1020,120;1020,235",
+ "nowNodeCode": "qa",
+ "nextNodeCode": "gw2"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "780,120|780,120",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000003"
+ },
+ {
+ "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"copy,back,termination,file\"}]",
+ "nodeCode": "risk",
+ "nodeName": "风控否决判定",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "830,400;870,400",
+ "nowNodeCode": "risk",
+ "nextNodeCode": "gwRisk"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "780,400|780,400",
+ "formCustom": "N",
+ "permissionFlag": "1761100000000000004"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "terminate",
+ "nodeName": "严重异常终止",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1070,400;1220,400;1220,288",
+ "nowNodeCode": "terminate",
+ "nextNodeCode": "end"
+ }
+ ],
+ "eventType": "TERMINATE_END",
+ "nodeRatio": "0",
+ "coordinate": "1020,400|1020,400",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "timerStart",
+ "nodeName": "发布 30 秒后自动发起",
+ "nodeType": 1,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "290,260;370,260",
+ "nowNodeCode": "timerStart",
+ "nextNodeCode": "inspect"
+ }
+ ],
+ "eventType": "TIMER_START",
+ "nodeRatio": "0",
+ "coordinate": "240,260|240,260",
+ "formCustom": "N",
+ "nodeConfig": "{\"variables\": {\"veto\": 0, \"channel\": \"daily\"}, \"event\": {\"timerType\": \"AFTER\", \"timerValue\": \"PT30S\", \"timezone\": \"Asia/Shanghai\"}}"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "end",
+ "nodeName": "结束",
+ "nodeType": 2,
+ "nodeRatio": "0",
+ "coordinate": "1220,260|1220,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gwRisk",
+ "nodeName": "是否严重异常",
+ "nodeType": 3,
+ "skipList": [
+ {
+ "skipName": "严重异常",
+ "skipType": "PASS",
+ "coordinate": "925,400;970,400",
+ "nowNodeCode": "gwRisk",
+ "nextNodeCode": "terminate",
+ "skipCondition": "eq@@veto|1"
+ },
+ {
+ "skipName": "无异常",
+ "skipType": "PASS",
+ "coordinate": "900,378;900,260;995,260",
+ "nowNodeCode": "gwRisk",
+ "nextNodeCode": "gw2"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "900,400",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gw1",
+ "nodeName": "并行分支",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "605,260;700,260;700,120;730,120",
+ "nowNodeCode": "gw1",
+ "nextNodeCode": "qa"
+ },
+ {
+ "skipType": "PASS",
+ "coordinate": "605,260;700,260;700,400;730,400",
+ "nowNodeCode": "gw1",
+ "nextNodeCode": "risk"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "580,260",
+ "formCustom": "N"
+ },
+ {
+ "ext": "[]",
+ "nodeCode": "gw2",
+ "nodeName": "汇聚",
+ "nodeType": 4,
+ "skipList": [
+ {
+ "skipType": "PASS",
+ "coordinate": "1045,260;1192,260",
+ "nowNodeCode": "gw2",
+ "nextNodeCode": "end"
+ }
+ ],
+ "nodeRatio": "0",
+ "coordinate": "1020,260",
+ "formCustom": "N"
+ }
+ ],
+ "formCustom": "N",
+ "modelValue": "CLASSICS"
+}
diff --git a/script/leave/leave1.json b/script/leave/leave1.json
deleted file mode 100644
index 9abf1c7d7..000000000
--- a/script/leave/leave1.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "200,200|200,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
- "nextNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
- "coordinate": "220,200;310,200"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,copy\"}]",
- "coordinate": "360,200|360,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
- "nextNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
- "coordinate": "410,200;490,200"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
- "nodeName": "组长",
- "permissionFlag": "role:1761300000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,copy,transfer,trust,file\"}]",
- "coordinate": "540,200|540,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
- "nextNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
- "coordinate": "590,200;670,200"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
- "nodeName": "部门主管",
- "permissionFlag": "role:1761300000000000003@@role:1761300000000000004",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,copy,transfer,trust,file\"}]",
- "coordinate": "720,200|720,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
- "nextNodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
- "coordinate": "770,200;880,200"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "900,200|900,200",
- "version": "1",
- "skipList": []
- }
- ],
- "flowCode": "leave1",
- "flowName": "请假申请-普通",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/leave/leave2.json b/script/leave/leave2.json
deleted file mode 100644
index 262697cb8..000000000
--- a/script/leave/leave2.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "300,240|300,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
- "nextNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
- "coordinate": "320,240;390,240"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
- "coordinate": "440,240|440,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
- "nextNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
- "coordinate": "490,240;535,240"
- }
- ]
- },
- {
- "nodeType": "3",
- "nodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "560,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": "le@@leaveDays|2",
- "skipName": null,
- "nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
- "nextNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
- "coordinate": "560,265;560,320;670,320"
- },
- {
- "skipType": "PASS",
- "skipCondition": "gt@@leaveDays|2",
- "skipName": "大于两天",
- "nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
- "nextNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
- "coordinate": "560,215;560,160;670,160|560,187"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
- "nodeName": "组长",
- "permissionFlag": "1761100000000000003@@1761100000000000004",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "720,320|720,320",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
- "nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
- "coordinate": "770,320;860,320;860,280"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
- "nodeName": "总经理",
- "permissionFlag": "role:1761300000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "860,240|860,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
- "nextNodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
- "coordinate": "910,240;980,240"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1000,240|1000,240",
- "version": "1",
- "skipList": []
- },
- {
- "nodeType": "1",
- "nodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
- "nodeName": "部门领导",
- "permissionFlag": "role:1761300000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "720,160|720,160",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
- "nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
- "nextNodeType": "1",
- "coordinate": "770,160;860,160;860,200"
- }
- ]
- }
- ],
- "flowCode": "leave2",
- "flowName": "请假申请-排他网关",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/leave/leave3.json b/script/leave/leave3.json
deleted file mode 100644
index 1ac01e2bb..000000000
--- a/script/leave/leave3.json
+++ /dev/null
@@ -1,211 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "380,220|380,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
- "nextNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
- "coordinate": "400,220;470,220"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
- "coordinate": "520,220|520,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
- "nextNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
- "coordinate": "570,220;655,220"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "680,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
- "nextNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
- "coordinate": "680,195;680,140;750,140"
- },
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
- "nextNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
- "coordinate": "680,245;680,300;750,300"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
- "nodeName": "市场部",
- "permissionFlag": "role:1761300000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "800,140|800,140",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
- "nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
- "coordinate": "850,140;920,140;920,195"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "920,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
- "nextNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
- "coordinate": "945,220;975,220;975,220;960,220;960,220;990,220"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
- "nodeName": "CEO",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "1040,220|1040,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
- "nextNodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
- "coordinate": "1090,220;1140,220"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1160,220|1160,220",
- "version": "1",
- "skipList": []
- },
- {
- "nodeType": "1",
- "nodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
- "nodeName": "综合部",
- "permissionFlag": "role:1761300000000000003@@role:1761300000000000004",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "800,300|800,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
- "nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
- "nextNodeType": "4",
- "coordinate": "850,300;920,300;920,245"
- }
- ]
- }
- ],
- "flowCode": "leave3",
- "flowName": "请假申请-并行网关",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/leave/leave4.json b/script/leave/leave4.json
deleted file mode 100644
index 7e2f57820..000000000
--- a/script/leave/leave4.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "320,240|320,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
- "nextNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
- "coordinate": "340,240;410,240"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
- "coordinate": "460,240|460,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
- "nextNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
- "coordinate": "510,240;590,240"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
- "nodeName": "百分之60通过",
- "permissionFlag": "${userList}",
- "nodeRatio": "60.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
- "coordinate": "640,240|640,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
- "nextNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
- "coordinate": "690,240;770,240"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
- "nodeName": "全部审批通过",
- "permissionFlag": "role:1761300000000000001@@role:1761300000000000003",
- "nodeRatio": "100.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
- "coordinate": "820,240|820,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
- "nextNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
- "coordinate": "870,240;950,240"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
- "nodeName": "CEO",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "1000,240|1000,240",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
- "nextNodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
- "coordinate": "1050,240;1080,240;1080,240;1070,240;1070,240;1100,240"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1120,240|1120,240",
- "version": "1",
- "skipList": []
- }
- ],
- "flowCode": "leave4",
- "flowName": "请假申请-会签",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/leave/leave5.json b/script/leave/leave5.json
deleted file mode 100644
index 2cd24a00d..000000000
--- a/script/leave/leave5.json
+++ /dev/null
@@ -1,211 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "300,220|300,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
- "nextNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
- "coordinate": "320,220;350,220;350,220;340,220;340,220;370,220"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
- "coordinate": "420,220|420,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
- "nextNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
- "coordinate": "470,220;535,220"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "560,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
- "nextNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
- "coordinate": "560,245;560,320;650,320"
- },
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
- "nextNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
- "coordinate": "560,195;560,120;650,120"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
- "nodeName": "会签",
- "permissionFlag": "role:1761300000000000001@@role:1761300000000000003",
- "nodeRatio": "100.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
- "coordinate": "700,320|700,320",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
- "nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
- "coordinate": "750,320;860,320;860,245"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "860,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
- "nextNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
- "coordinate": "885,220;950,220"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
- "nodeName": "CEO",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
- "coordinate": "1000,220|1000,220",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
- "nextNodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
- "coordinate": "1050,220;1120,220"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1140,220|1140,220",
- "version": "1",
- "skipList": []
- },
- {
- "nodeType": "1",
- "nodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
- "nodeName": "百分之60票签",
- "permissionFlag": "${userList}",
- "nodeRatio": "60.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
- "coordinate": "700,120|700,120",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
- "nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
- "nextNodeType": "4",
- "coordinate": "750,120;860,120;860,195"
- }
- ]
- }
- ],
- "flowCode": "leave5",
- "flowName": "请假申请-并行会签网关",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/leave/leave6.json b/script/leave/leave6.json
deleted file mode 100644
index 348eb5c54..000000000
--- a/script/leave/leave6.json
+++ /dev/null
@@ -1,368 +0,0 @@
-{
- "nodeList": [
- {
- "nodeType": "0",
- "nodeCode": "122b89a5-7c6f-40a3-aa09-7a263f902054",
- "nodeName": "开始",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "240,300|240,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "122b89a5-7c6f-40a3-aa09-7a263f902054",
- "nextNodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
- "coordinate": "260,300;350,300"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
- "nodeName": "申请人",
- "permissionFlag": "${initiator}",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
- "coordinate": "400,300|400,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
- "nextNodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
- "coordinate": "450,300;510,300"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
- "nodeName": "副经理",
- "permissionFlag": "role:1761300000000000001@@role:1761300000000000003@@role:1761300000000000004",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
- "coordinate": "860,200|860,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
- "nextNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
- "coordinate": "910,200;1000,200;1000,275"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
- "nodeName": "组长",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
- "coordinate": "860,400|860,400",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
- "nextNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
- "coordinate": "910,400;1000,400;1000,325"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
- "nodeName": "副组长",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,transfer,copy,pop\"}]",
- "coordinate": "560,300|560,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
- "nextNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
- "coordinate": "610,300;675,300"
- }
- ]
- },
- {
- "nodeType": "3",
- "nodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "700,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": "default@@${leaveDays > 2}",
- "skipName": "大于两天",
- "nowNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
- "nextNodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
- "nextNodeType": "1",
- "coordinate": "700,275;700,200;810,200|700,237"
- },
- {
- "skipType": "PASS",
- "skipCondition": "spel@@#{@testLeaveServiceImpl.eval(#leaveDays)}",
- "skipName": null,
- "nowNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
- "nextNodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
- "nextNodeType": "1",
- "coordinate": "700,325;700,400;810,400"
- }
- ]
- },
- {
- "nodeType": "3",
- "nodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1000,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
- "nextNodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
- "coordinate": "1025,300;1130,300"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
- "nodeName": "经理会签",
- "permissionFlag": "1761100000000000001@@1761100000000000003",
- "nodeRatio": "100.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,pop,addSign,subSign\"}]",
- "coordinate": "1180,300|1180,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
- "nextNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
- "coordinate": "1230,300;1315,300"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1340,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
- "nextNodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
- "coordinate": "1340,325;1340,400;1430,400"
- },
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
- "nextNodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
- "coordinate": "1340,275;1340,200;1430,200"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
- "nodeName": "总经理",
- "permissionFlag": "1761100000000000001@@1761100000000000003",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
- "coordinate": "1480,200|1480,200",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
- "nextNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
- "coordinate": "1530,200;1640,200;1640,275"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
- "nodeName": "副总经理",
- "permissionFlag": "1761100000000000001@@1761100000000000003",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
- "coordinate": "1480,400|1480,400",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
- "nextNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
- "coordinate": "1530,400;1640,400;1640,325"
- }
- ]
- },
- {
- "nodeType": "4",
- "nodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1640,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
- "nextNodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
- "coordinate": "1665,300;1770,300"
- }
- ]
- },
- {
- "nodeType": "1",
- "nodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
- "nodeName": "董事",
- "permissionFlag": "1761100000000000001",
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": "",
- "listenerPath": "",
- "formCustom": "N",
- "formPath": null,
- "ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
- "coordinate": "1820,300|1820,300",
- "version": "1",
- "skipList": [
- {
- "skipType": "PASS",
- "skipCondition": null,
- "skipName": null,
- "nowNodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
- "nextNodeCode": "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
- "coordinate": "1870,300;1960,300"
- }
- ]
- },
- {
- "nodeType": "2",
- "nodeCode": "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
- "nodeName": "结束",
- "permissionFlag": null,
- "nodeRatio": "0.000",
- "anyNodeSkip": null,
- "listenerType": null,
- "listenerPath": null,
- "formCustom": "N",
- "formPath": null,
- "ext": "[]",
- "coordinate": "1980,300|1980,300",
- "version": "1",
- "skipList": []
- }
- ],
- "flowCode": "leave6",
- "flowName": "请假申请-排他并行会签",
- "modelValue": "CLASSICS",
- "category": "1762300000000000103",
- "version": "1",
- "formCustom": "N",
- "formPath": "/workflow/leaveEdit/index",
- "listenerType": null,
- "listenerPath": null
-}
diff --git a/script/sql/oracle/oracle_ry_workflow.sql b/script/sql/oracle/oracle_ry_workflow.sql
index 11df353c2..bf953712e 100644
--- a/script/sql/oracle/oracle_ry_workflow.sql
+++ b/script/sql/oracle/oracle_ry_workflow.sql
@@ -12,10 +12,11 @@ create table FLOW_DEFINITION
IS_PUBLISH NUMBER(1) default 0 not null,
FORM_CUSTOM VARCHAR2(1) default 'N',
FORM_PATH VARCHAR2(100),
- ACTIVITY_STATUS NUMBER(1) default 1,
+ ACTIVITY_STATUS NUMBER(1) default 1 not null,
LISTENER_TYPE VARCHAR2(100),
- LISTENER_PATH VARCHAR2(500),
+ LISTENER_PATH VARCHAR2(400),
EXT VARCHAR2(500),
+ DEF_CONFIG CLOB,
CREATE_TIME DATE,
CREATE_BY VARCHAR2(64) default '',
UPDATE_TIME DATE,
@@ -41,6 +42,7 @@ comment on column FLOW_DEFINITION.ACTIVITY_STATUS is '流程激活状态(0挂
comment on column FLOW_DEFINITION.LISTENER_TYPE is '监听器类型';
comment on column FLOW_DEFINITION.LISTENER_PATH is '监听器路径';
comment on column FLOW_DEFINITION.EXT is '扩展字段,预留给业务系统使用';
+comment on column FLOW_DEFINITION.DEF_CONFIG is '流程定义配置(自动审批等引擎配置与自定义扩展属性json)';
comment on column FLOW_DEFINITION.CREATE_TIME is '创建时间';
comment on column FLOW_DEFINITION.CREATE_BY is '创建人';
comment on column FLOW_DEFINITION.UPDATE_TIME is '更新时间';
@@ -60,15 +62,19 @@ create table FLOW_NODE
COORDINATE VARCHAR2(100),
ANY_NODE_SKIP VARCHAR2(100),
LISTENER_TYPE VARCHAR2(100),
- LISTENER_PATH VARCHAR2(500),
+ LISTENER_PATH VARCHAR2(400),
FORM_CUSTOM VARCHAR2(1) default 'N',
FORM_PATH VARCHAR2(100),
- VERSION VARCHAR2(20),
CREATE_TIME DATE,
CREATE_BY VARCHAR2(64) default '',
UPDATE_TIME DATE,
UPDATE_BY VARCHAR2(64) default '',
EXT CLOB,
+ NODE_CONFIG CLOB,
+ EVENT_TYPE VARCHAR2(40),
+ EVENT_NAME VARCHAR2(100),
+ ATTACHED_TO_NODE_CODE VARCHAR2(100),
+ INTERRUPTING NUMBER(1),
DEL_FLAG VARCHAR2(1) default '0',
TENANT_ID VARCHAR2(40)
);
@@ -89,12 +95,16 @@ comment on column FLOW_NODE.LISTENER_TYPE is '监听器类型';
comment on column FLOW_NODE.LISTENER_PATH is '监听器路径';
comment on column FLOW_NODE.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)';
comment on column FLOW_NODE.FORM_PATH is '审批表单路径';
-comment on column FLOW_NODE.VERSION is '版本';
comment on column FLOW_NODE.CREATE_TIME is '创建时间';
comment on column FLOW_NODE.CREATE_BY is '创建人';
comment on column FLOW_NODE.UPDATE_TIME is '更新时间';
comment on column FLOW_NODE.UPDATE_BY is '更新人';
comment on column FLOW_NODE.EXT is '节点扩展属性';
+comment on column FLOW_NODE.NODE_CONFIG is '节点配置(服务任务、事件等引擎节点配置json)';
+comment on column FLOW_NODE.EVENT_TYPE is '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)';
+comment on column FLOW_NODE.EVENT_NAME is '事件名称(消息事件使用)';
+comment on column FLOW_NODE.ATTACHED_TO_NODE_CODE is '边界事件附着的任务节点编码';
+comment on column FLOW_NODE.INTERRUPTING is '边界事件是否中断型';
comment on column FLOW_NODE.DEL_FLAG is '删除标志';
comment on column FLOW_NODE.TENANT_ID is '租户id';
comment on column FLOW_NODE.PERMISSION_FLAG is '权限标识(权限类型:权限标识,可以多个,用@@隔开)';
@@ -145,12 +155,12 @@ create table FLOW_INSTANCE
ID NUMBER not null,
DEFINITION_ID NUMBER not null,
BUSINESS_ID VARCHAR2(40) not null,
- NODE_TYPE NUMBER(1),
- NODE_CODE VARCHAR2(100),
+ NODE_TYPE NUMBER(1) not null,
+ NODE_CODE VARCHAR2(100) not null,
NODE_NAME VARCHAR2(100),
VARIABLE CLOB,
- FLOW_STATUS VARCHAR2(20),
- ACTIVITY_STATUS NUMBER(1) default 1,
+ FLOW_STATUS VARCHAR2(20) not null,
+ ACTIVITY_STATUS NUMBER(1) default 1 not null,
DEF_JSON CLOB,
CREATE_TIME DATE,
CREATE_BY VARCHAR2(64) default '',
@@ -172,7 +182,7 @@ comment on column FLOW_INSTANCE.NODE_TYPE is '开始节点类型 (0开始节点
comment on column FLOW_INSTANCE.NODE_CODE is '开始节点编码';
comment on column FLOW_INSTANCE.NODE_NAME is '开始节点名称';
comment on column FLOW_INSTANCE.VARIABLE is '任务变量';
-comment on column FLOW_INSTANCE.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+comment on column FLOW_INSTANCE.FLOW_STATUS is '实例状态(draft待提交 waiting审批中 termination终止 invalid作废 cancel撤销 finish已完成 back已退回 restart重启)';
comment on column FLOW_INSTANCE.ACTIVITY_STATUS is '流程激活状态(0挂起 1激活)';
comment on column FLOW_INSTANCE.DEF_JSON is '流程定义json';
comment on column FLOW_INSTANCE.CREATE_TIME is '创建时间';
@@ -188,10 +198,10 @@ create table FLOW_TASK
ID NUMBER(20) not null,
DEFINITION_ID NUMBER(20) not null,
INSTANCE_ID NUMBER(20) not null,
- NODE_CODE VARCHAR2(100),
+ NODE_CODE VARCHAR2(100) not null,
NODE_NAME VARCHAR2(100),
- NODE_TYPE NUMBER(1),
- FLOW_STATUS VARCHAR2(20),
+ NODE_TYPE NUMBER(1) not null,
+ FLOW_STATUS VARCHAR2(20) not null,
FORM_CUSTOM VARCHAR2(1) default 'N',
FORM_PATH VARCHAR2(100),
CREATE_TIME DATE,
@@ -212,7 +222,7 @@ comment on column FLOW_TASK.INSTANCE_ID is '对应flow_instance表的id';
comment on column FLOW_TASK.NODE_CODE is '节点编码';
comment on column FLOW_TASK.NODE_NAME is '节点名称';
comment on column FLOW_TASK.NODE_TYPE is '节点类型 (0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)';
-comment on column FLOW_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+comment on column FLOW_TASK.FLOW_STATUS is '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码)';
comment on column FLOW_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)';
comment on column FLOW_TASK.FORM_PATH is '审批表单路径';
comment on column FLOW_TASK.CREATE_TIME is '创建时间';
@@ -234,15 +244,16 @@ create table FLOW_HIS_TASK
TARGET_NODE_CODE VARCHAR2(200),
TARGET_NODE_NAME VARCHAR2(200),
APPROVER VARCHAR2(40),
- COOPERATE_TYPE NUMBER(1) default 0,
+ COOPERATE_TYPE VARCHAR2(20) default 'none' not null,
COLLABORATOR VARCHAR2(500),
- SKIP_TYPE VARCHAR2(10),
- FLOW_STATUS VARCHAR2(20),
+ SKIP_TYPE VARCHAR2(10) not null,
+ FLOW_STATUS VARCHAR2(20) not null,
FORM_CUSTOM VARCHAR2(1) default 'N',
FORM_PATH VARCHAR2(100),
MESSAGE VARCHAR2(500),
VARIABLE CLOB,
EXT CLOB,
+ NODE_CONFIG CLOB,
CREATE_TIME DATE,
UPDATE_TIME DATE,
DEL_FLAG VARCHAR2(1) default '0',
@@ -264,18 +275,19 @@ comment on column FLOW_HIS_TASK.NODE_TYPE is '开始节点类型 (0开始节点
comment on column FLOW_HIS_TASK.TARGET_NODE_CODE is '目标节点编码';
comment on column FLOW_HIS_TASK.TARGET_NODE_NAME is '目标节点名称';
comment on column FLOW_HIS_TASK.SKIP_TYPE is '流转类型(PASS通过 REJECT退回 NONE无动作)';
-comment on column FLOW_HIS_TASK.FLOW_STATUS is '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+comment on column FLOW_HIS_TASK.FLOW_STATUS is '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码,唯一例外是撤回归档写 cancel)';
comment on column FLOW_HIS_TASK.FORM_CUSTOM is '审批表单是否自定义 (Y是 N否)';
comment on column FLOW_HIS_TASK.FORM_PATH is '审批表单路径';
comment on column FLOW_HIS_TASK.MESSAGE is '审批意见';
comment on column FLOW_HIS_TASK.VARIABLE is '任务变量';
comment on column FLOW_HIS_TASK.EXT is '扩展字段,预留给业务系统使用';
+comment on column FLOW_HIS_TASK.NODE_CONFIG is '节点配置(服务任务等引擎配置与自定义扩展属性json)';
comment on column FLOW_HIS_TASK.CREATE_TIME is '任务开始时间';
comment on column FLOW_HIS_TASK.UPDATE_TIME is '审批完成时间';
comment on column FLOW_HIS_TASK.DEL_FLAG is '删除标志';
comment on column FLOW_HIS_TASK.TENANT_ID is '租户id';
comment on column FLOW_HIS_TASK.APPROVER is '审批者';
-comment on column FLOW_HIS_TASK.COOPERATE_TYPE is '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)';
+comment on column FLOW_HIS_TASK.COOPERATE_TYPE is '协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签;行为维度,抄送/会签/票签不落此列,结果见 flow_status)';
comment on column FLOW_HIS_TASK.COLLABORATOR is '协作人';
create table FLOW_USER
@@ -285,7 +297,7 @@ create table FLOW_USER
PROCESSED_BY VARCHAR2(80),
ASSOCIATED NUMBER(20) not null,
CREATE_TIME DATE,
- CREATE_BY VARCHAR2(64) default '',
+ CREATE_BY VARCHAR2(80),
UPDATE_TIME DATE,
UPDATE_BY VARCHAR2(64) default '',
DEL_FLAG VARCHAR2(1) default '0',
@@ -297,9 +309,9 @@ alter table FLOW_USER
comment on table FLOW_USER is '待办任务表';
comment on column FLOW_USER.ID is '主键id';
-comment on column FLOW_USER.TYPE is '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)';
+comment on column FLOW_USER.TYPE is '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限 4待办任务的抄送人)';
comment on column FLOW_USER.PROCESSED_BY is '权限人)';
-comment on column FLOW_USER.ASSOCIATED is '任务表id';
+comment on column FLOW_USER.ASSOCIATED is '关联id(待办任务id;抄送人记录为 flow_his_task.id)';
comment on column FLOW_USER.CREATE_TIME is '创建时间';
comment on column FLOW_USER.CREATE_BY is '创建人';
comment on column FLOW_USER.UPDATE_TIME is '更新时间';
@@ -310,6 +322,79 @@ comment on column FLOW_USER.TENANT_ID is '租户id';
create index USER_PROCESSED_TYPE on FLOW_USER (PROCESSED_BY, TYPE);
create index USER_ASSOCIATED_IDX on FLOW_USER (ASSOCIATED);
+-- ----------------------------
+-- 事件等待表
+-- ----------------------------
+-- 定时 / 消息等需要“等待”的事件统一落在此表,状态独立于流程状态。
+create table FLOW_EVENT_WAIT
+(
+ ID NUMBER(20) not null,
+ TENANT_ID VARCHAR2(40),
+ DEL_FLAG VARCHAR2(1) default '0',
+ DEFINITION_ID NUMBER(20),
+ INSTANCE_ID NUMBER(20),
+ NODE_CODE VARCHAR2(100),
+ EVENT_TYPE VARCHAR2(40) not null,
+ EVENT_NAME VARCHAR2(100),
+ ATTACHED_TASK_ID NUMBER(20),
+ TRIGGER_TYPE VARCHAR2(40),
+ TRIGGER_INTERVAL VARCHAR2(100),
+ NEXT_TRIGGER_AT DATE,
+ TIMEZONE VARCHAR2(40),
+ REPEAT_COUNT NUMBER(10),
+ MAX_REPEAT_COUNT NUMBER(10),
+ STATUS VARCHAR2(20) not null,
+ RETRY_COUNT NUMBER(10),
+ MAX_RETRY_COUNT NUMBER(10),
+ RETRY_AT DATE,
+ LOCK_OWNER VARCHAR2(64),
+ LOCK_UNTIL DATE,
+ VERSION NUMBER(10),
+ PAYLOAD CLOB,
+ LAST_ERROR VARCHAR2(500),
+ CREATE_TIME DATE,
+ UPDATE_TIME DATE
+);
+
+alter table FLOW_EVENT_WAIT
+ add constraint PK_FLOW_EVENT_WAIT primary key (ID);
+
+comment on table FLOW_EVENT_WAIT is '事件等待表';
+comment on column FLOW_EVENT_WAIT.ID is '主键id';
+comment on column FLOW_EVENT_WAIT.TENANT_ID is '租户id';
+comment on column FLOW_EVENT_WAIT.DEL_FLAG is '删除标志';
+comment on column FLOW_EVENT_WAIT.DEFINITION_ID is '流程定义id(定时启动事件必须有)';
+comment on column FLOW_EVENT_WAIT.INSTANCE_ID is '流程实例id(实例等待事件必须有)';
+comment on column FLOW_EVENT_WAIT.NODE_CODE is '事件节点编码(定位沿用 definition_id + node_code)';
+comment on column FLOW_EVENT_WAIT.EVENT_TYPE is '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)';
+comment on column FLOW_EVENT_WAIT.EVENT_NAME is '事件名称(消息事件使用)';
+comment on column FLOW_EVENT_WAIT.ATTACHED_TASK_ID is '边界事件关联的待办任务id';
+comment on column FLOW_EVENT_WAIT.TRIGGER_TYPE is '触发策略类型(AFTER FIXED POINT_IN_TIME)';
+comment on column FLOW_EVENT_WAIT.TRIGGER_INTERVAL is '触发策略原始配置';
+comment on column FLOW_EVENT_WAIT.NEXT_TRIGGER_AT is '下次触发时间';
+comment on column FLOW_EVENT_WAIT.TIMEZONE is '定时触发使用的时区';
+comment on column FLOW_EVENT_WAIT.REPEAT_COUNT is '已触发次数';
+comment on column FLOW_EVENT_WAIT.MAX_REPEAT_COUNT is '最大触发次数';
+comment on column FLOW_EVENT_WAIT.STATUS is '等待状态(WAITING RUNNING CANCELLED RETRY DEAD)';
+comment on column FLOW_EVENT_WAIT.RETRY_COUNT is '已重试次数';
+comment on column FLOW_EVENT_WAIT.MAX_RETRY_COUNT is '最大重试次数';
+comment on column FLOW_EVENT_WAIT.RETRY_AT is '下次重试时间';
+comment on column FLOW_EVENT_WAIT.LOCK_OWNER is '抢占持有者标识';
+comment on column FLOW_EVENT_WAIT.LOCK_UNTIL is '抢占租约到期时间';
+comment on column FLOW_EVENT_WAIT.VERSION is '乐观锁版本号';
+comment on column FLOW_EVENT_WAIT.PAYLOAD is '消息事件接收的业务载荷';
+comment on column FLOW_EVENT_WAIT.LAST_ERROR is '最近一次失败原因摘要';
+comment on column FLOW_EVENT_WAIT.CREATE_TIME is '创建时间';
+comment on column FLOW_EVENT_WAIT.UPDATE_TIME is '更新时间';
+
+create index EVENT_WAIT_STATUS_NEXT on FLOW_EVENT_WAIT (STATUS, NEXT_TRIGGER_AT, ID);
+create index EVENT_WAIT_STATUS_RETRY on FLOW_EVENT_WAIT (STATUS, RETRY_AT, ID);
+create index EVENT_WAIT_TENANT_NEXT on FLOW_EVENT_WAIT (TENANT_ID, STATUS, NEXT_TRIGGER_AT, ID);
+create index EVENT_WAIT_TENANT_RETRY on FLOW_EVENT_WAIT (TENANT_ID, STATUS, RETRY_AT, ID);
+create index EVENT_WAIT_INSTANCE_TASK on FLOW_EVENT_WAIT (INSTANCE_ID, ATTACHED_TASK_ID);
+create index EVENT_WAIT_NAME_INST_STATUS on FLOW_EVENT_WAIT (EVENT_NAME, INSTANCE_ID, STATUS);
+create index EVENT_WAIT_DEF_NODE_STATUS on FLOW_EVENT_WAIT (DEFINITION_ID, NODE_CODE, STATUS);
+
-- ----------------------------
-- 流程分类表
-- ----------------------------
@@ -533,17 +618,18 @@ INSERT INTO sys_dict_data VALUES (1761600000000000042, 4, '已完成', 'finish',
INSERT INTO sys_dict_data VALUES (1761600000000000043, 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '已作废');
INSERT INTO sys_dict_data VALUES (1761600000000000044, 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '已退回');
INSERT INTO sys_dict_data VALUES (1761600000000000045, 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '已终止');
+INSERT INTO sys_dict_data VALUES (1761600000000000063, 8, '重启', 'restart', 'wf_business_status', '', 'info', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '重启');
INSERT INTO sys_dict_data VALUES (1761600000000000046, 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '自定义表单');
INSERT INTO sys_dict_data VALUES (1761600000000000047, 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '动态表单');
-INSERT INTO sys_dict_data VALUES (1761600000000000048, 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000060, 1, '待审批', 'pending', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '待审批');
INSERT INTO sys_dict_data VALUES (1761600000000000049, 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '通过');
-INSERT INTO sys_dict_data VALUES (1761600000000000050, 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '待审核');
-INSERT INTO sys_dict_data VALUES (1761600000000000051, 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '作废');
+INSERT INTO sys_dict_data VALUES (1761600000000000061, 3, '自动审批', 'auto_pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '自动审批');
+INSERT INTO sys_dict_data VALUES (1761600000000000056, 4, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '抄送');
INSERT INTO sys_dict_data VALUES (1761600000000000052, 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '退回');
-INSERT INTO sys_dict_data VALUES (1761600000000000053, 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '终止');
-INSERT INTO sys_dict_data VALUES (1761600000000000054, 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '转办');
-INSERT INTO sys_dict_data VALUES (1761600000000000055, 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '委托');
-INSERT INTO sys_dict_data VALUES (1761600000000000056, 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '抄送');
-INSERT INTO sys_dict_data VALUES (1761600000000000057, 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '加签');
-INSERT INTO sys_dict_data VALUES (1761600000000000058, 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '减签');
-INSERT INTO sys_dict_data VALUES (1761600000000000059, 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '超时');
+INSERT INTO sys_dict_data VALUES (1761600000000000062, 6, '拿回', 'take_back', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '拿回');
+INSERT INTO sys_dict_data VALUES (1761600000000000051, 7, '失效', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '失效');
+INSERT INTO sys_dict_data VALUES (1761600000000000048, 8, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000064, 9, '转办', 'transfer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '转办');
+INSERT INTO sys_dict_data VALUES (1761600000000000065, 10, '委派', 'delegate', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '委派');
+INSERT INTO sys_dict_data VALUES (1761600000000000066, 11, '加签', 'add_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '加签');
+INSERT INTO sys_dict_data VALUES (1761600000000000067, 12, '减签', 'remove_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, SYSDATE, NULL, NULL, '减签');
diff --git a/script/sql/postgres/postgres_ry_workflow.sql b/script/sql/postgres/postgres_ry_workflow.sql
index 70f2f1a3f..45bc55832 100644
--- a/script/sql/postgres/postgres_ry_workflow.sql
+++ b/script/sql/postgres/postgres_ry_workflow.sql
@@ -13,6 +13,7 @@ CREATE TABLE flow_definition
listener_type varchar(100) NULL,
listener_path varchar(400) NULL,
ext varchar(500) NULL,
+ def_config text NULL,
create_time timestamp NULL,
create_by varchar(64) NULL DEFAULT '':: character varying,
update_time timestamp NULL,
@@ -36,6 +37,7 @@ COMMENT ON COLUMN flow_definition.activity_status IS '流程激活状态(0挂
COMMENT ON COLUMN flow_definition.listener_type IS '监听器类型';
COMMENT ON COLUMN flow_definition.listener_path IS '监听器路径';
COMMENT ON COLUMN flow_definition.ext IS '扩展字段,预留给业务系统使用';
+COMMENT ON COLUMN flow_definition.def_config IS '流程定义配置(自动审批等引擎配置与自定义扩展属性json)';
COMMENT ON COLUMN flow_definition.create_time IS '创建时间';
COMMENT ON COLUMN flow_definition.create_by IS '创建人';
COMMENT ON COLUMN flow_definition.update_time IS '更新时间';
@@ -58,12 +60,16 @@ CREATE TABLE flow_node
listener_path varchar(400) NULL,
form_custom bpchar(1) NULL DEFAULT 'N':: character varying,
form_path varchar(100) NULL,
- "version" varchar(20) NOT NULL,
create_time timestamp NULL,
create_by varchar(64) NULL DEFAULT '':: character varying,
update_time timestamp NULL,
update_by varchar(64) NULL DEFAULT '':: character varying,
ext text NULL,
+ node_config text NULL,
+ event_type varchar(40) NULL,
+ event_name varchar(100) NULL,
+ attached_to_node_code varchar(100) NULL,
+ interrupting int2 NULL,
del_flag bpchar(1) NULL DEFAULT '0':: character varying,
tenant_id varchar(40) NULL,
CONSTRAINT flow_node_pkey PRIMARY KEY (id)
@@ -83,12 +89,16 @@ COMMENT ON COLUMN flow_node.listener_type IS '监听器类型';
COMMENT ON COLUMN flow_node.listener_path IS '监听器路径';
COMMENT ON COLUMN flow_node.form_custom IS '审批表单是否自定义(Y是 N否)';
COMMENT ON COLUMN flow_node.form_path IS '审批表单路径';
-COMMENT ON COLUMN flow_node."version" IS '版本';
COMMENT ON COLUMN flow_node.create_time IS '创建时间';
COMMENT ON COLUMN flow_node.create_by IS '创建人';
COMMENT ON COLUMN flow_node.update_time IS '更新时间';
COMMENT ON COLUMN flow_node.update_by IS '更新人';
COMMENT ON COLUMN flow_node.ext IS '节点扩展属性';
+COMMENT ON COLUMN flow_node.node_config IS '节点配置(服务任务、事件等引擎节点配置json)';
+COMMENT ON COLUMN flow_node.event_type IS '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)';
+COMMENT ON COLUMN flow_node.event_name IS '事件名称(消息事件使用)';
+COMMENT ON COLUMN flow_node.attached_to_node_code IS '边界事件附着的任务节点编码';
+COMMENT ON COLUMN flow_node.interrupting IS '边界事件是否中断型';
COMMENT ON COLUMN flow_node.del_flag IS '删除标志';
COMMENT ON COLUMN flow_node.tenant_id IS '租户id';
@@ -162,7 +172,7 @@ COMMENT ON COLUMN flow_instance.node_type IS '节点类型(0开始节点 1中
COMMENT ON COLUMN flow_instance.node_code IS '流程节点编码';
COMMENT ON COLUMN flow_instance.node_name IS '流程节点名称';
COMMENT ON COLUMN flow_instance.variable IS '任务变量';
-COMMENT ON COLUMN flow_instance.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+COMMENT ON COLUMN flow_instance.flow_status IS '实例状态(draft待提交 waiting审批中 termination终止 invalid作废 cancel撤销 finish已完成 back已退回 restart重启)';
COMMENT ON COLUMN flow_instance.activity_status IS '流程激活状态(0挂起 1激活)';
COMMENT ON COLUMN flow_instance.def_json IS '流程定义json';
COMMENT ON COLUMN flow_instance.create_time IS '创建时间';
@@ -200,7 +210,7 @@ COMMENT ON COLUMN flow_task.instance_id IS '对应flow_instance表的id';
COMMENT ON COLUMN flow_task.node_code IS '节点编码';
COMMENT ON COLUMN flow_task.node_name IS '节点名称';
COMMENT ON COLUMN flow_task.node_type IS '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)';
-COMMENT ON COLUMN flow_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+COMMENT ON COLUMN flow_task.flow_status IS '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码)';
COMMENT ON COLUMN flow_task.form_custom IS '审批表单是否自定义(Y是 N否)';
COMMENT ON COLUMN flow_task.form_path IS '审批表单路径';
COMMENT ON COLUMN flow_task.create_time IS '创建时间';
@@ -222,15 +232,16 @@ CREATE TABLE flow_his_task
target_node_code varchar(200) NULL,
target_node_name varchar(200) NULL,
approver varchar(40) NULL,
- cooperate_type int2 NOT NULL DEFAULT 0,
+ cooperate_type varchar(20) NOT NULL DEFAULT 'none',
collaborator varchar(500) NULL,
- skip_type varchar(10) NULL,
+ skip_type varchar(10) NOT NULL,
flow_status varchar(20) NOT NULL,
form_custom bpchar(1) NULL DEFAULT 'N':: character varying,
form_path varchar(100) NULL,
- ext text NULL,
message varchar(500) NULL,
variable text NULL,
+ ext text NULL,
+ node_config text NULL,
create_time timestamp NULL,
update_time timestamp NULL,
del_flag bpchar(1) NULL DEFAULT '0':: character varying,
@@ -249,15 +260,16 @@ COMMENT ON COLUMN flow_his_task.node_type IS '开始节点类型(0开始节点
COMMENT ON COLUMN flow_his_task.target_node_code IS '目标节点编码';
COMMENT ON COLUMN flow_his_task.target_node_name IS '结束节点名称';
COMMENT ON COLUMN flow_his_task.approver IS '审批者';
-COMMENT ON COLUMN flow_his_task.cooperate_type IS '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)';
+COMMENT ON COLUMN flow_his_task.cooperate_type IS '协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签;行为维度,抄送/会签/票签不落此列,结果见 flow_status)';
COMMENT ON COLUMN flow_his_task.collaborator IS '协作人';
COMMENT ON COLUMN flow_his_task.skip_type IS '流转类型(PASS通过 REJECT退回 NONE无动作)';
-COMMENT ON COLUMN flow_his_task.flow_status IS '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)';
+COMMENT ON COLUMN flow_his_task.flow_status IS '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码,唯一例外是撤回归档写 cancel)';
COMMENT ON COLUMN flow_his_task.form_custom IS '审批表单是否自定义(Y是 N否)';
COMMENT ON COLUMN flow_his_task.form_path IS '审批表单路径';
COMMENT ON COLUMN flow_his_task.message IS '审批意见';
COMMENT ON COLUMN flow_his_task.variable IS '任务变量';
COMMENT ON COLUMN flow_his_task.ext IS '扩展字段,预留给业务系统使用';
+COMMENT ON COLUMN flow_his_task.node_config IS '节点配置(服务任务等引擎配置与自定义扩展属性json)';
COMMENT ON COLUMN flow_his_task.create_time IS '任务开始时间';
COMMENT ON COLUMN flow_his_task.update_time IS '审批完成时间';
COMMENT ON COLUMN flow_his_task.del_flag IS '删除标志';
@@ -270,7 +282,7 @@ CREATE TABLE flow_user
processed_by varchar(80) NULL,
associated int8 NOT NULL,
create_time timestamp NULL,
- create_by varchar(64) NULL DEFAULT '':: character varying,
+ create_by varchar(80) NULL:: character varying,
update_time timestamp NULL,
update_by varchar(64) NULL DEFAULT '':: character varying,
del_flag bpchar(1) NULL DEFAULT '0':: character varying,
@@ -282,9 +294,9 @@ CREATE INDEX user_associated_idx ON FLOW_USER USING btree (associated);
COMMENT ON TABLE flow_user IS '流程用户表';
COMMENT ON COLUMN flow_user.id IS '主键id';
-COMMENT ON COLUMN flow_user."type" IS '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)';
+COMMENT ON COLUMN flow_user."type" IS '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限 4待办任务的抄送人)';
COMMENT ON COLUMN flow_user.processed_by IS '权限人';
-COMMENT ON COLUMN flow_user.associated IS '任务表id';
+COMMENT ON COLUMN flow_user.associated IS '关联id(待办任务id;抄送人记录为 flow_his_task.id)';
COMMENT ON COLUMN flow_user.create_time IS '创建时间';
COMMENT ON COLUMN flow_user.create_by IS '创建人';
COMMENT ON COLUMN flow_user.update_time IS '更新时间';
@@ -292,6 +304,75 @@ COMMENT ON COLUMN flow_user.update_by IS '更新人';
COMMENT ON COLUMN flow_user.del_flag IS '删除标志';
COMMENT ON COLUMN flow_user.tenant_id IS '租户id';
+-- ----------------------------
+-- 事件等待表
+-- ----------------------------
+CREATE TABLE flow_event_wait
+(
+ id int8 NOT NULL,
+ tenant_id varchar(40) NULL,
+ del_flag bpchar(1) NULL DEFAULT '0':: character varying,
+ definition_id int8 NULL,
+ instance_id int8 NULL,
+ node_code varchar(100) NULL,
+ event_type varchar(40) NOT NULL,
+ event_name varchar(100) NULL,
+ attached_task_id int8 NULL,
+ trigger_type varchar(40) NULL,
+ trigger_interval varchar(100) NULL,
+ next_trigger_at timestamp NULL,
+ timezone varchar(40) NULL,
+ repeat_count int4 NULL,
+ max_repeat_count int4 NULL,
+ status varchar(20) NOT NULL,
+ retry_count int4 NULL,
+ max_retry_count int4 NULL,
+ retry_at timestamp NULL,
+ lock_owner varchar(64) NULL,
+ lock_until timestamp NULL,
+ version int4 NULL,
+ payload text NULL,
+ last_error varchar(500) NULL,
+ create_time timestamp NULL,
+ update_time timestamp NULL,
+ CONSTRAINT flow_event_wait_pkey PRIMARY KEY (id)
+);
+CREATE INDEX event_wait_status_next ON flow_event_wait USING btree (status, next_trigger_at, id);
+CREATE INDEX event_wait_status_retry ON flow_event_wait USING btree (status, retry_at, id);
+CREATE INDEX event_wait_tenant_status_next ON flow_event_wait USING btree (tenant_id, status, next_trigger_at, id);
+CREATE INDEX event_wait_tenant_status_retry ON flow_event_wait USING btree (tenant_id, status, retry_at, id);
+CREATE INDEX event_wait_instance_task ON flow_event_wait USING btree (instance_id, attached_task_id);
+CREATE INDEX event_wait_name_instance_status ON flow_event_wait USING btree (event_name, instance_id, status);
+CREATE INDEX event_wait_def_node_status ON flow_event_wait USING btree (definition_id, node_code, status);
+COMMENT ON TABLE flow_event_wait IS '事件等待表';
+
+COMMENT ON COLUMN flow_event_wait.id IS '主键id';
+COMMENT ON COLUMN flow_event_wait.tenant_id IS '租户id';
+COMMENT ON COLUMN flow_event_wait.del_flag IS '删除标志';
+COMMENT ON COLUMN flow_event_wait.definition_id IS '流程定义id(定时启动事件必须有)';
+COMMENT ON COLUMN flow_event_wait.instance_id IS '流程实例id(实例等待事件必须有)';
+COMMENT ON COLUMN flow_event_wait.node_code IS '事件节点编码(定位沿用 definition_id + node_code)';
+COMMENT ON COLUMN flow_event_wait.event_type IS '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)';
+COMMENT ON COLUMN flow_event_wait.event_name IS '事件名称(消息事件使用)';
+COMMENT ON COLUMN flow_event_wait.attached_task_id IS '边界事件关联的待办任务id';
+COMMENT ON COLUMN flow_event_wait.trigger_type IS '触发策略类型(AFTER FIXED POINT_IN_TIME)';
+COMMENT ON COLUMN flow_event_wait.trigger_interval IS '触发策略原始配置';
+COMMENT ON COLUMN flow_event_wait.next_trigger_at IS '下次触发时间';
+COMMENT ON COLUMN flow_event_wait.timezone IS '定时触发使用的时区';
+COMMENT ON COLUMN flow_event_wait.repeat_count IS '已触发次数';
+COMMENT ON COLUMN flow_event_wait.max_repeat_count IS '最大触发次数';
+COMMENT ON COLUMN flow_event_wait.status IS '等待状态(WAITING RUNNING CANCELLED RETRY DEAD)';
+COMMENT ON COLUMN flow_event_wait.retry_count IS '已重试次数';
+COMMENT ON COLUMN flow_event_wait.max_retry_count IS '最大重试次数';
+COMMENT ON COLUMN flow_event_wait.retry_at IS '下次重试时间';
+COMMENT ON COLUMN flow_event_wait.lock_owner IS '抢占持有者标识';
+COMMENT ON COLUMN flow_event_wait.lock_until IS '抢占租约到期时间';
+COMMENT ON COLUMN flow_event_wait.version IS '乐观锁版本号';
+COMMENT ON COLUMN flow_event_wait.payload IS '消息事件接收的业务载荷';
+COMMENT ON COLUMN flow_event_wait.last_error IS '最近一次失败原因摘要';
+COMMENT ON COLUMN flow_event_wait.create_time IS '创建时间';
+COMMENT ON COLUMN flow_event_wait.update_time IS '更新时间';
+
-- ----------------------------
-- 流程分类表
-- ----------------------------
@@ -505,18 +586,19 @@ INSERT INTO sys_dict_data VALUES (1761600000000000042, 4, '已完成', 'finish',
INSERT INTO sys_dict_data VALUES (1761600000000000043, 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '已作废');
INSERT INTO sys_dict_data VALUES (1761600000000000044, 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '已退回');
INSERT INTO sys_dict_data VALUES (1761600000000000045, 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '已终止');
+INSERT INTO sys_dict_data VALUES (1761600000000000063, 8, '重启', 'restart', 'wf_business_status', '', 'info', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '重启');
INSERT INTO sys_dict_data VALUES (1761600000000000046, 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '自定义表单');
INSERT INTO sys_dict_data VALUES (1761600000000000047, 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '动态表单');
-INSERT INTO sys_dict_data VALUES (1761600000000000048, 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000060, 1, '待审批', 'pending', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '待审批');
INSERT INTO sys_dict_data VALUES (1761600000000000049, 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '通过');
-INSERT INTO sys_dict_data VALUES (1761600000000000050, 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '待审核');
-INSERT INTO sys_dict_data VALUES (1761600000000000051, 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '作废');
+INSERT INTO sys_dict_data VALUES (1761600000000000061, 3, '自动审批', 'auto_pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '自动审批');
+INSERT INTO sys_dict_data VALUES (1761600000000000056, 4, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '抄送');
INSERT INTO sys_dict_data VALUES (1761600000000000052, 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '退回');
-INSERT INTO sys_dict_data VALUES (1761600000000000053, 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '终止');
-INSERT INTO sys_dict_data VALUES (1761600000000000054, 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '转办');
-INSERT INTO sys_dict_data VALUES (1761600000000000055, 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '委托');
-INSERT INTO sys_dict_data VALUES (1761600000000000056, 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '抄送');
-INSERT INTO sys_dict_data VALUES (1761600000000000057, 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '加签');
-INSERT INTO sys_dict_data VALUES (1761600000000000058, 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '减签');
-INSERT INTO sys_dict_data VALUES (1761600000000000059, 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '超时');
+INSERT INTO sys_dict_data VALUES (1761600000000000062, 6, '拿回', 'take_back', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '拿回');
+INSERT INTO sys_dict_data VALUES (1761600000000000051, 7, '失效', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '失效');
+INSERT INTO sys_dict_data VALUES (1761600000000000048, 8, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000064, 9, '转办', 'transfer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '转办');
+INSERT INTO sys_dict_data VALUES (1761600000000000065, 10, '委派', 'delegate', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '委派');
+INSERT INTO sys_dict_data VALUES (1761600000000000066, 11, '加签', 'add_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '加签');
+INSERT INTO sys_dict_data VALUES (1761600000000000067, 12, '减签', 'remove_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, now(), NULL, NULL, '减签');
diff --git a/script/sql/ry_workflow.sql b/script/sql/ry_workflow.sql
index e6e210632..b12244bb8 100644
--- a/script/sql/ry_workflow.sql
+++ b/script/sql/ry_workflow.sql
@@ -16,6 +16,7 @@ CREATE TABLE `flow_definition`
`listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型',
`listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径',
`ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
+ `def_config` text COMMENT '流程定义配置(自动审批等引擎配置与自定义扩展属性json)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(64) DEFAULT '' COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -40,12 +41,16 @@ CREATE TABLE `flow_node`
`listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径',
`form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
`form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径',
- `version` varchar(20) NOT NULL COMMENT '版本',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(64) DEFAULT '' COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_by` varchar(64) DEFAULT '' COMMENT '更新人',
`ext` text COMMENT '节点扩展属性',
+ `node_config` text COMMENT '节点配置(服务任务、事件等引擎节点配置json)',
+ `event_type` varchar(40) DEFAULT NULL COMMENT '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)',
+ `event_name` varchar(100) DEFAULT NULL COMMENT '事件名称(消息事件使用)',
+ `attached_to_node_code` varchar(100) DEFAULT NULL COMMENT '边界事件附着的任务节点编码',
+ `interrupting` tinyint(1) DEFAULT NULL COMMENT '边界事件是否中断型',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
`tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id',
PRIMARY KEY (`id`) USING BTREE
@@ -81,7 +86,7 @@ CREATE TABLE `flow_instance`
`node_code` varchar(100) NOT NULL COMMENT '流程节点编码',
`node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称',
`variable` text COMMENT '任务变量',
- `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+ `flow_status` varchar(20) NOT NULL COMMENT '实例状态(draft待提交 waiting审批中 termination终止 invalid作废 cancel撤销 finish已完成 back已退回 restart重启)',
`activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)',
`def_json` text COMMENT '流程定义json',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -102,7 +107,7 @@ CREATE TABLE `flow_task`
`node_code` varchar(100) NOT NULL COMMENT '节点编码',
`node_name` varchar(100) DEFAULT NULL COMMENT '节点名称',
`node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)',
- `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+ `flow_status` varchar(20) NOT NULL COMMENT '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码)',
`form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
`form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
@@ -126,15 +131,16 @@ CREATE TABLE `flow_his_task`
`target_node_code` varchar(200) DEFAULT NULL COMMENT '目标节点编码',
`target_node_name` varchar(200) DEFAULT NULL COMMENT '结束节点名称',
`approver` varchar(40) DEFAULT NULL COMMENT '审批人',
- `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)',
+ `cooperate_type` varchar(20) NOT NULL DEFAULT 'none' COMMENT '协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签;行为维度,抄送/会签/票签不落此列,结果见 flow_status)',
`collaborator` varchar(500) DEFAULT NULL COMMENT '协作人',
`skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)',
- `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+ `flow_status` varchar(20) NOT NULL COMMENT '任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码,唯一例外是撤回归档写 cancel)',
`form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)',
`form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径',
`message` varchar(500) DEFAULT NULL COMMENT '审批意见',
`variable` TEXT DEFAULT NULL COMMENT '任务变量',
`ext` TEXT DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串',
+ `node_config` TEXT DEFAULT NULL COMMENT '节点配置(服务任务等引擎配置与自定义扩展属性json)',
`create_time` datetime DEFAULT NULL COMMENT '任务开始时间',
`update_time` datetime DEFAULT NULL COMMENT '审批完成时间',
`del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
@@ -146,9 +152,9 @@ CREATE TABLE `flow_his_task`
CREATE TABLE `flow_user`
(
`id` bigint NOT NULL COMMENT '主键id',
- `type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)',
+ `type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限 4待办任务的抄送人)',
`processed_by` varchar(80) DEFAULT NULL COMMENT '权限人',
- `associated` bigint NOT NULL COMMENT '任务表id',
+ `associated` bigint NOT NULL COMMENT '关联id(待办任务id;抄送人记录为 flow_his_task.id)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` varchar(80) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
@@ -160,6 +166,46 @@ CREATE TABLE `flow_user`
KEY `user_associated` (`associated`) USING BTREE
) ENGINE = InnoDB COMMENT ='流程用户表';
+-- 事件等待表:定时 / 消息等需要“等待”的事件统一落在此表,状态独立于 flow_status。
+-- 事件能力默认关闭(warm-flow.timer-enabled=false),未开启时引擎不扫描本表。
+CREATE TABLE `flow_event_wait`
+(
+ `id` bigint NOT NULL COMMENT '主键id',
+ `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
+ `definition_id` bigint DEFAULT NULL COMMENT '流程定义id(定时启动事件必须有)',
+ `instance_id` bigint DEFAULT NULL COMMENT '流程实例id(实例等待事件必须有)',
+ `node_code` varchar(100) DEFAULT NULL COMMENT '事件节点编码(定位沿用 definition_id + node_code)',
+ `event_type` varchar(40) NOT NULL COMMENT '事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)',
+ `event_name` varchar(100) DEFAULT NULL COMMENT '事件名称(消息事件使用)',
+ `attached_task_id` bigint DEFAULT NULL COMMENT '边界事件关联的待办任务id',
+ `trigger_type` varchar(40) DEFAULT NULL COMMENT '触发策略类型(AFTER FIXED POINT_IN_TIME)',
+ `trigger_interval` varchar(100) DEFAULT NULL COMMENT '触发策略原始配置',
+ `next_trigger_at` datetime DEFAULT NULL COMMENT '下次触发时间',
+ `timezone` varchar(40) DEFAULT NULL COMMENT '定时触发使用的时区',
+ `repeat_count` int DEFAULT NULL COMMENT '已触发次数',
+ `max_repeat_count` int DEFAULT NULL COMMENT '最大触发次数',
+ `status` varchar(20) NOT NULL COMMENT '等待状态(WAITING RUNNING CANCELLED RETRY DEAD)',
+ `retry_count` int DEFAULT NULL COMMENT '已重试次数',
+ `max_retry_count` int DEFAULT NULL COMMENT '最大重试次数',
+ `retry_at` datetime DEFAULT NULL COMMENT '下次重试时间',
+ `lock_owner` varchar(64) DEFAULT NULL COMMENT '抢占持有者标识',
+ `lock_until` datetime DEFAULT NULL COMMENT '抢占租约到期时间',
+ `version` int DEFAULT NULL COMMENT '乐观锁版本号',
+ `payload` text COMMENT '消息事件接收的业务载荷',
+ `last_error` varchar(500) DEFAULT NULL COMMENT '最近一次失败原因摘要',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `event_wait_status_next` (`status`, `next_trigger_at`, `id`) USING BTREE,
+ KEY `event_wait_status_retry` (`status`, `retry_at`, `id`) USING BTREE,
+ KEY `event_wait_tenant_status_next` (`tenant_id`, `status`, `next_trigger_at`, `id`) USING BTREE,
+ KEY `event_wait_tenant_status_retry` (`tenant_id`, `status`, `retry_at`, `id`) USING BTREE,
+ KEY `event_wait_instance_task` (`instance_id`, `attached_task_id`) USING BTREE,
+ KEY `event_wait_name_instance_status` (`event_name`, `instance_id`, `status`) USING BTREE,
+ KEY `event_wait_def_node_status` (`definition_id`, `node_code`, `status`) USING BTREE
+) ENGINE = InnoDB COMMENT ='事件等待表';
+
-- ----------------------------
-- 流程分类表
-- ----------------------------
@@ -321,18 +367,19 @@ INSERT INTO sys_dict_data VALUES (1761600000000000042, 4, '已完成', 'finish',
INSERT INTO sys_dict_data VALUES (1761600000000000043, 5, '已作废', 'invalid', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '已作废');
INSERT INTO sys_dict_data VALUES (1761600000000000044, 6, '已退回', 'back', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '已退回');
INSERT INTO sys_dict_data VALUES (1761600000000000045, 7, '已终止', 'termination', 'wf_business_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '已终止');
+INSERT INTO sys_dict_data VALUES (1761600000000000063, 8, '重启', 'restart', 'wf_business_status', '', 'info', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '重启');
INSERT INTO sys_dict_data VALUES (1761600000000000046, 1, '自定义表单', 'static', 'wf_form_type', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '自定义表单');
INSERT INTO sys_dict_data VALUES (1761600000000000047, 2, '动态表单', 'dynamic', 'wf_form_type', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '动态表单');
-INSERT INTO sys_dict_data VALUES (1761600000000000048, 1, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000060, 1, '待审批', 'pending', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '待审批');
INSERT INTO sys_dict_data VALUES (1761600000000000049, 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '通过');
-INSERT INTO sys_dict_data VALUES (1761600000000000050, 3, '待审核', 'waiting', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '待审核');
-INSERT INTO sys_dict_data VALUES (1761600000000000051, 4, '作废', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '作废');
+INSERT INTO sys_dict_data VALUES (1761600000000000061, 3, '自动审批', 'auto_pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '自动审批');
+INSERT INTO sys_dict_data VALUES (1761600000000000056, 4, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '抄送');
INSERT INTO sys_dict_data VALUES (1761600000000000052, 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '退回');
-INSERT INTO sys_dict_data VALUES (1761600000000000053, 6, '终止', 'termination', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '终止');
-INSERT INTO sys_dict_data VALUES (1761600000000000054, 7, '转办', 'transfer', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '转办');
-INSERT INTO sys_dict_data VALUES (1761600000000000055, 8, '委托', 'depute', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '委托');
-INSERT INTO sys_dict_data VALUES (1761600000000000056, 9, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '抄送');
-INSERT INTO sys_dict_data VALUES (1761600000000000057, 10, '加签', 'sign', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '加签');
-INSERT INTO sys_dict_data VALUES (1761600000000000058, 11, '减签', 'sign_off', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '减签');
-INSERT INTO sys_dict_data VALUES (1761600000000000059, 11, '超时', 'timeout', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '超时');
+INSERT INTO sys_dict_data VALUES (1761600000000000062, 6, '拿回', 'take_back', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '拿回');
+INSERT INTO sys_dict_data VALUES (1761600000000000051, 7, '失效', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '失效');
+INSERT INTO sys_dict_data VALUES (1761600000000000048, 8, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000064, 9, '转办', 'transfer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '转办');
+INSERT INTO sys_dict_data VALUES (1761600000000000065, 10, '委派', 'delegate', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '委派');
+INSERT INTO sys_dict_data VALUES (1761600000000000066, 11, '加签', 'add_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '加签');
+INSERT INTO sys_dict_data VALUES (1761600000000000067, 12, '减签', 'remove_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '减签');
diff --git a/script/sql/sqlserver/sqlserver_ry_workflow.sql b/script/sql/sqlserver/sqlserver_ry_workflow.sql
index 8ebdd10a2..0370948c9 100644
--- a/script/sql/sqlserver/sqlserver_ry_workflow.sql
+++ b/script/sql/sqlserver/sqlserver_ry_workflow.sql
@@ -8,17 +8,18 @@ CREATE TABLE flow_definition (
model_value nvarchar(40) DEFAULT('CLASSICS') NOT NULL,
category nvarchar(100) NULL,
version nvarchar(20) NOT NULL,
- is_publish tinyint DEFAULT('0') NULL,
+ is_publish tinyint DEFAULT('0') NOT NULL,
form_custom nchar(1) DEFAULT('N') NULL,
form_path nvarchar(100) NULL,
- activity_status tinyint DEFAULT('1') NULL,
+ activity_status tinyint DEFAULT('1') NOT NULL,
listener_type nvarchar(100) NULL,
listener_path nvarchar(400) NULL,
ext nvarchar(500) NULL,
+ def_config nvarchar(max) NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(64) DEFAULT('') NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_def__3213E83FEE39AE33 PRIMARY KEY CLUSTERED (id)
@@ -119,6 +120,13 @@ EXEC sp_addextendedproperty
'COLUMN', N'ext'
GO
+EXEC sp_addextendedproperty
+'MS_Description', N'流程定义配置(自动审批等引擎配置与自定义扩展属性json)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_definition',
+'COLUMN', N'def_config'
+GO
+
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
@@ -181,12 +189,16 @@ CREATE TABLE flow_node (
listener_path nvarchar(400) NULL,
form_custom nchar(1) DEFAULT('N') NULL,
form_path nvarchar(100) NULL,
- version nvarchar(20) NOT NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(64) DEFAULT('') NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
ext nvarchar(max) NULL,
+ node_config nvarchar(max) NULL,
+ event_type nvarchar(40) NULL,
+ event_name nvarchar(100) NULL,
+ attached_to_node_code nvarchar(100) NULL,
+ interrupting tinyint NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_nod__3213E83F372470DE PRIMARY KEY CLUSTERED (id)
@@ -287,13 +299,6 @@ EXEC sp_addextendedproperty
'COLUMN', N'form_path'
GO
-EXEC sp_addextendedproperty
-'MS_Description', N'版本',
-'SCHEMA', N'dbo',
-'TABLE', N'flow_node',
-'COLUMN', N'version'
-GO
-
EXEC sp_addextendedproperty
'MS_Description', N'创建时间',
'SCHEMA', N'dbo',
@@ -329,6 +334,41 @@ EXEC sp_addextendedproperty
'COLUMN', N'ext'
GO
+EXEC sp_addextendedproperty
+'MS_Description', N'节点配置(服务任务、事件等引擎节点配置json)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_node',
+'COLUMN', N'node_config'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_node',
+'COLUMN', N'event_type'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件名称(消息事件使用)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_node',
+'COLUMN', N'event_name'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'边界事件附着的任务节点编码',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_node',
+'COLUMN', N'attached_to_node_code'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'边界事件是否中断型',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_node',
+'COLUMN', N'interrupting'
+GO
+
EXEC sp_addextendedproperty
'MS_Description', N'删除标志',
@@ -362,9 +402,9 @@ CREATE TABLE flow_skip (
skip_condition nvarchar(200) NULL,
coordinate nvarchar(100) NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(64) DEFAULT('') NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_ski__3213E83F073FEE6E PRIMARY KEY CLUSTERED (id)
@@ -501,12 +541,12 @@ CREATE TABLE flow_instance (
node_name nvarchar(100) NULL,
variable nvarchar(max) NULL,
flow_status nvarchar(20) NOT NULL,
- activity_status tinyint DEFAULT('1') NULL,
+ activity_status tinyint DEFAULT('1') NOT NULL,
def_json nvarchar(max) NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(64) DEFAULT('') NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
ext nvarchar(500) NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
@@ -568,7 +608,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+'MS_Description', N'实例状态(draft待提交 waiting审批中 termination终止 invalid作废 cancel撤销 finish已完成 back已退回 restart重启)',
'SCHEMA', N'dbo',
'TABLE', N'flow_instance',
'COLUMN', N'flow_status'
@@ -654,9 +694,9 @@ CREATE TABLE flow_task (
form_custom nchar(1) DEFAULT('N') NULL,
form_path nvarchar(100) NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(64) DEFAULT('') NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_tas__3213E83F5AE1F1BA PRIMARY KEY CLUSTERED (id)
@@ -709,7 +749,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+'MS_Description', N'任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码)',
'SCHEMA', N'dbo',
'TABLE', N'flow_task',
'COLUMN', N'flow_status'
@@ -782,13 +822,13 @@ CREATE TABLE flow_his_task (
definition_id bigint NOT NULL,
instance_id bigint NOT NULL,
task_id bigint NOT NULL,
- node_code nvarchar(200) NULL,
- node_name nvarchar(200) NULL,
+ node_code nvarchar(100) NULL,
+ node_name nvarchar(100) NULL,
node_type tinyint NULL,
- target_node_code nvarchar(100) NULL,
- target_node_name nvarchar(100) NULL,
+ target_node_code nvarchar(200) NULL,
+ target_node_name nvarchar(200) NULL,
approver nvarchar(40) NULL,
- cooperate_type tinyint DEFAULT('0') NULL,
+ cooperate_type varchar(20) DEFAULT('none') NOT NULL,
collaborator nvarchar(500) NULL,
skip_type nvarchar(10) NOT NULL,
flow_status nvarchar(20) NOT NULL,
@@ -797,6 +837,7 @@ CREATE TABLE flow_his_task (
message nvarchar(500) NULL,
variable nvarchar(max) NULL,
ext nvarchar(max) NULL,
+ node_config nvarchar(max) NULL,
create_time datetime2(7) NULL,
update_time datetime2(7) NULL,
del_flag nchar(1) DEFAULT('0') NULL,
@@ -879,7 +920,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)',
+'MS_Description', N'协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签;行为维度,抄送/会签/票签不落此列,结果见 flow_status)',
'SCHEMA', N'dbo',
'TABLE', N'flow_his_task',
'COLUMN', N'cooperate_type'
@@ -900,7 +941,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)',
+'MS_Description', N'任务状态(pending待审批 pass通过 auto_pass自动审批 back退回 invalid失效 take_back拿回 copy抄送;任务结果,勿套用实例状态编码,唯一例外是撤回归档写 cancel)',
'SCHEMA', N'dbo',
'TABLE', N'flow_his_task',
'COLUMN', N'flow_status'
@@ -941,6 +982,13 @@ EXEC sp_addextendedproperty
'COLUMN', N'ext'
GO
+EXEC sp_addextendedproperty
+'MS_Description', N'节点配置(服务任务等引擎配置与自定义扩展属性json)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_his_task',
+'COLUMN', N'node_config'
+GO
+
EXEC sp_addextendedproperty
'MS_Description', N'任务开始时间',
'SCHEMA', N'dbo',
@@ -981,9 +1029,9 @@ CREATE TABLE flow_user (
processed_by nvarchar(80) NULL,
associated bigint NOT NULL,
create_time datetime2(7) NULL,
- create_by nvarchar(64) NULL,
+ create_by nvarchar(80) NULL,
update_time datetime2(7) NULL,
- update_by nvarchar(64) NULL,
+ update_by nvarchar(64) DEFAULT('') NULL,
del_flag nchar(1) DEFAULT('0') NULL,
tenant_id nvarchar(40) NULL,
CONSTRAINT PK__flow_use__3213E83FFA38CA8B PRIMARY KEY CLUSTERED (id)
@@ -1006,7 +1054,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)',
+'MS_Description', N'人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限 4待办任务的抄送人)',
'SCHEMA', N'dbo',
'TABLE', N'flow_user',
'COLUMN', N'type'
@@ -1020,7 +1068,7 @@ EXEC sp_addextendedproperty
GO
EXEC sp_addextendedproperty
-'MS_Description', N'任务表id',
+'MS_Description', N'关联id(待办任务id;抄送人记录为 flow_his_task.id)',
'SCHEMA', N'dbo',
'TABLE', N'flow_user',
'COLUMN', N'associated'
@@ -1074,6 +1122,244 @@ EXEC sp_addextendedproperty
'TABLE', N'flow_user'
GO
+-- 事件等待表:定时 / 消息等需要“等待”的事件统一落在此表,状态独立于流程状态。
+CREATE TABLE flow_event_wait (
+ id bigint NOT NULL,
+ tenant_id nvarchar(40) NULL,
+ del_flag nchar(1) DEFAULT('0') NULL,
+ definition_id bigint NULL,
+ instance_id bigint NULL,
+ node_code nvarchar(100) NULL,
+ event_type nvarchar(40) NOT NULL,
+ event_name nvarchar(100) NULL,
+ attached_task_id bigint NULL,
+ trigger_type nvarchar(40) NULL,
+ trigger_interval nvarchar(100) NULL,
+ next_trigger_at datetime2(7) NULL,
+ timezone nvarchar(40) NULL,
+ repeat_count int NULL,
+ max_repeat_count int NULL,
+ status nvarchar(20) NOT NULL,
+ retry_count int NULL,
+ max_retry_count int NULL,
+ retry_at datetime2(7) NULL,
+ lock_owner nvarchar(64) NULL,
+ lock_until datetime2(7) NULL,
+ version int NULL,
+ payload nvarchar(max) NULL,
+ last_error nvarchar(500) NULL,
+ create_time datetime2(7) NULL,
+ update_time datetime2(7) NULL,
+ CONSTRAINT PK_flow_event_wait PRIMARY KEY CLUSTERED (id)
+ WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
+ ON [PRIMARY]
+)
+ON [PRIMARY]
+GO
+
+CREATE NONCLUSTERED INDEX event_wait_status_next ON flow_event_wait (status ASC, next_trigger_at ASC, id ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_status_retry ON flow_event_wait (status ASC, retry_at ASC, id ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_tenant_status_next ON flow_event_wait (tenant_id ASC, status ASC, next_trigger_at ASC, id ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_tenant_status_retry ON flow_event_wait (tenant_id ASC, status ASC, retry_at ASC, id ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_instance_task ON flow_event_wait (instance_id ASC, attached_task_id ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_name_instance_status ON flow_event_wait (event_name ASC, instance_id ASC, status ASC)
+GO
+CREATE NONCLUSTERED INDEX event_wait_def_node_status ON flow_event_wait (definition_id ASC, node_code ASC, status ASC)
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件等待表',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'主键id',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'id'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'租户id',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'tenant_id'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'删除标志',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'del_flag'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'流程定义id(定时启动事件必须有)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'definition_id'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'流程实例id(实例等待事件必须有)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'instance_id'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件节点编码(定位沿用 definition_id + node_code)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'node_code'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件类型(MESSAGE_START TIMER_START TIMER_CATCH MESSAGE_CATCH MESSAGE_THROW TIMER_BOUNDARY MESSAGE_BOUNDARY ERROR_CATCH ERROR_BOUNDARY TERMINATE_END MESSAGE_END)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'event_type'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'事件名称(消息事件使用)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'event_name'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'边界事件关联的待办任务id',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'attached_task_id'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'触发策略类型(AFTER FIXED POINT_IN_TIME)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'trigger_type'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'触发策略原始配置',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'trigger_interval'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'下次触发时间',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'next_trigger_at'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'定时触发使用的时区',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'timezone'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'已触发次数',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'repeat_count'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'最大触发次数',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'max_repeat_count'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'等待状态(WAITING RUNNING CANCELLED RETRY DEAD)',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'status'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'已重试次数',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'retry_count'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'最大重试次数',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'max_retry_count'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'下次重试时间',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'retry_at'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'抢占持有者标识',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'lock_owner'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'抢占租约到期时间',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'lock_until'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'乐观锁版本号',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'version'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'消息事件接收的业务载荷',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'payload'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'最近一次失败原因摘要',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'last_error'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'创建时间',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'create_time'
+GO
+
+EXEC sp_addextendedproperty
+'MS_Description', N'更新时间',
+'SCHEMA', N'dbo',
+'TABLE', N'flow_event_wait',
+'COLUMN', N'update_time'
+GO
+
CREATE TABLE flow_category (
category_id bigint NOT NULL,
parent_id bigint DEFAULT(0) NULL,
@@ -1661,31 +1947,29 @@ INSERT sys_dict_data VALUES (1761600000000000044, 6, N'已退回', N'back', N'wf
GO
INSERT sys_dict_data VALUES (1761600000000000045, 7, N'已终止', N'termination', N'wf_business_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'已终止');
GO
+INSERT sys_dict_data VALUES (1761600000000000063, 8, N'重启', N'restart', N'wf_business_status', N'', N'info', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'重启');
+GO
INSERT sys_dict_data VALUES (1761600000000000046, 1, N'自定义表单', N'static', N'wf_form_type', N'', N'success', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'自定义表单');
GO
INSERT sys_dict_data VALUES (1761600000000000047, 2, N'动态表单', N'dynamic', N'wf_form_type', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'动态表单');
GO
-INSERT sys_dict_data VALUES (1761600000000000048, 1, N'撤销', N'cancel', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'撤销');
+INSERT sys_dict_data VALUES (1761600000000000060, 1, N'待审批', N'pending', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'待审批');
GO
INSERT sys_dict_data VALUES (1761600000000000049, 2, N'通过', N'pass', N'wf_task_status', N'', N'success', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'通过');
GO
-INSERT sys_dict_data VALUES (1761600000000000050, 3, N'待审核', N'waiting', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'待审核');
+INSERT sys_dict_data VALUES (1761600000000000061, 3, N'自动审批', N'auto_pass', N'wf_task_status', N'', N'success', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'自动审批');
GO
-INSERT sys_dict_data VALUES (1761600000000000051, 4, N'作废', N'invalid', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'作废');
+INSERT sys_dict_data VALUES (1761600000000000056, 4, N'抄送', N'copy', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'抄送');
GO
INSERT sys_dict_data VALUES (1761600000000000052, 5, N'退回', N'back', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'退回');
GO
-INSERT sys_dict_data VALUES (1761600000000000053, 6, N'终止', N'termination', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'终止');
+INSERT sys_dict_data VALUES (1761600000000000062, 6, N'拿回', N'take_back', N'wf_task_status', N'', N'warning', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'拿回');
GO
-INSERT sys_dict_data VALUES (1761600000000000054, 7, N'转办', N'transfer', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'转办');
+INSERT sys_dict_data VALUES (1761600000000000051, 7, N'失效', N'invalid', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'失效');
GO
-INSERT sys_dict_data VALUES (1761600000000000055, 8, N'委托', N'depute', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'委托');
-GO
-INSERT sys_dict_data VALUES (1761600000000000056, 9, N'抄送', N'copy', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'抄送');
-GO
-INSERT sys_dict_data VALUES (1761600000000000057, 10, N'加签', N'sign', N'wf_task_status', N'', N'primary', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'加签');
-GO
-INSERT sys_dict_data VALUES (1761600000000000058, 11, N'减签', N'sign_off', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'减签');
-GO
-INSERT sys_dict_data VALUES (1761600000000000059, 11, N'超时', N'timeout', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'超时');
+INSERT sys_dict_data VALUES (1761600000000000048, 8, N'撤销', N'cancel', N'wf_task_status', N'', N'danger', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'撤销');
+INSERT sys_dict_data VALUES (1761600000000000064, 9, N'转办', N'transfer', N'wf_task_status', N'', N'warning', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'转办');
+INSERT sys_dict_data VALUES (1761600000000000065, 10, N'委派', N'delegate', N'wf_task_status', N'', N'warning', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'委派');
+INSERT sys_dict_data VALUES (1761600000000000066, 11, N'加签', N'add_signer', N'wf_task_status', N'', N'warning', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'加签');
+INSERT sys_dict_data VALUES (1761600000000000067, 12, N'减签', N'remove_signer', N'wf_task_status', N'', N'warning', N'N', 1761000000000000103, 1761100000000000001, GETDATE(), NULL, NULL, N'减签');
GO
diff --git a/script/sql/update/update_6.0.0-6.1.0.sql b/script/sql/update/update_6.0.0-6.1.0.sql
new file mode 100644
index 000000000..dd4c87a41
--- /dev/null
+++ b/script/sql/update/update_6.0.0-6.1.0.sql
@@ -0,0 +1,33 @@
+-- ============================================================
+-- RuoYi-Vue-Plus 6.0.0 → 6.1.0 工作流升级脚本(MySQL)
+-- 对齐 warm-flow 2.1.0:删除废弃的节点版本列、状态字典改为小写英文编码
+-- 只给存量库执行;全新建库直接用 script/sql/ry_workflow.sql,无需本脚本
+-- 执行完到「系统管理 → 缓存管理 → 刷新缓存」刷一次字典缓存,否则前端仍显示旧文案
+-- ============================================================
+
+-- 1. 节点版本已统一由流程定义管理,flow_node.version 在引擎 1.8.9 起就不存在了
+-- 旧全量脚本里该列是 NOT NULL 且无默认值,引擎写节点会报「doesn't have a default value」
+ALTER TABLE `flow_node` DROP COLUMN `version`;
+
+-- 2. 任务状态字典改为引擎 TaskStatus 的 7 个码,外加撤回归档留痕的 cancel
+DELETE FROM sys_dict_data WHERE dict_type = 'wf_task_status';
+INSERT INTO sys_dict_data VALUES (1761600000000000060, 1, '待审批', 'pending', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '待审批');
+INSERT INTO sys_dict_data VALUES (1761600000000000049, 2, '通过', 'pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '通过');
+INSERT INTO sys_dict_data VALUES (1761600000000000061, 3, '自动审批', 'auto_pass', 'wf_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '自动审批');
+INSERT INTO sys_dict_data VALUES (1761600000000000056, 4, '抄送', 'copy', 'wf_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '抄送');
+INSERT INTO sys_dict_data VALUES (1761600000000000052, 5, '退回', 'back', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '退回');
+INSERT INTO sys_dict_data VALUES (1761600000000000062, 6, '拿回', 'take_back', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '拿回');
+INSERT INTO sys_dict_data VALUES (1761600000000000051, 7, '失效', 'invalid', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '失效');
+INSERT INTO sys_dict_data VALUES (1761600000000000048, 8, '撤销', 'cancel', 'wf_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '撤销');
+INSERT INTO sys_dict_data VALUES (1761600000000000064, 9, '转办', 'transfer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '转办');
+INSERT INTO sys_dict_data VALUES (1761600000000000065, 10, '委派', 'delegate', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '委派');
+INSERT INTO sys_dict_data VALUES (1761600000000000066, 11, '加签', 'add_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '加签');
+INSERT INTO sys_dict_data VALUES (1761600000000000067, 12, '减签', 'remove_signer', 'wf_task_status', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '减签');
+
+-- 原来的 waiting / termination / transfer / depute / sign / sign_off / timeout 已随上面整组删除:
+-- 前两个属实例维度(wf_business_status 有),其余属协作维度 cooperate_type(transfer / delegate /
+-- add_signer / remove_signer),timeout 是 flow_event_wait 的状态,都不是任务状态。
+-- take_back 目前没有写入方,是留给「拿回」功能的占位,别当冗余删掉。
+
+-- 3. 实例状态字典补 restart(引擎 FlowStatus 有,字典缺)
+INSERT INTO sys_dict_data VALUES (1761600000000000063, 8, '重启', 'restart', 'wf_business_status', '', 'info', 'N', 1761000000000000103, 1761100000000000001, sysdate(), NULL, NULL, '重启');