升级warm-flow到2.1.0

This commit is contained in:
may 2026-10-20 15:47:10 +08:00
parent 7734dd535c
commit 8e5c3c9c9e
54 changed files with 3028 additions and 1908 deletions

View File

@ -62,7 +62,7 @@
<!-- SMS 配置 -->
<sms4j.version>3.3.5</sms4j.version>
<!-- 工作流配置 -->
<warm-flow.version>2.0.1</warm-flow.version>
<warm-flow.version>2.1.0</warm-flow.version>
<liteflow.version>2.16.2.1</liteflow.version>
<!-- mqtt客户端 -->
<mica-mqtt.version>2.6.12</mica-mqtt.version>

View File

@ -100,7 +100,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
url: jdbc:mysql://localhost:3306/ry-vue1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: root
# # 从库数据源

View File

@ -1,7 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
port: 17083
servlet:
# 应用的访问路径
context-path: /
@ -243,6 +243,9 @@ warm-flow:
node-tooltip: true
# 默认Authorization,如果有多个token,用逗号分隔
token-name: ${sa-token.token-name},clientid
# 是否开启定时/事件引擎线程(默认false)。开启后常驻扫描线程池,
# 已发布的「定时启动」流程定义会按配置自动发起实例
timer-enabled: true
--- # LiteFlow 业务规则编排
liteflow:

View File

@ -83,11 +83,6 @@ public interface FlowConstant {
*/
String WF_TASK_STATUS = "wf_task_status";
/**
* 自动通过变量标识。
*/
String AUTO_PASS = "autoPass";
/**
* 业务编码流程变量名。
*/

View File

@ -1,32 +0,0 @@
package org.dromara.workflow.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 抄送设置枚举
*
* @author AprilWind
*/
@Getter
@AllArgsConstructor
public enum CopySettingEnum implements NodeExtEnum {
;
/**
* 展示名称。
*/
private final String label;
/**
* 配置值。
*/
private final String value;
/**
* 是否默认选中。
*/
private final boolean selected;
}

View File

@ -1,115 +0,0 @@
package org.dromara.workflow.common.enums;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 任务状态枚举
*
* @author may
*/
@Getter
@AllArgsConstructor
public enum TaskStatusEnum {
/**
* 撤销
*/
CANCEL("cancel", "撤销"),
/**
* 通过
*/
PASS("pass", "通过"),
/**
* 待审核
*/
WAITING("waiting", "待审核"),
/**
* 作废
*/
INVALID("invalid", "作废"),
/**
* 退回
*/
BACK("back", "退回"),
/**
* 终止
*/
TERMINATION("termination", "终止"),
/**
* 转办
*/
TRANSFER("transfer", "转办"),
/**
* 委托
*/
DEPUTE("depute", "委托"),
/**
* 抄送
*/
COPY("copy", "抄送"),
/**
* 加签
*/
SIGN("sign", "加签"),
/**
* 减签
*/
SIGN_OFF("sign_off", "减签"),
/**
* 超时
*/
TIMEOUT("timeout", "超时");
/**
* 状态编码与描述缓存。
*/
private static final Map<String, String> 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);
}
}

View File

@ -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 模式
* <p>
* 节点配置 {@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());
}
}

View File

@ -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 模式
* <p>
* 节点配置写 {@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);
}
}

View File

@ -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 模式的被调用方
* <p>
* 节点配置写 {@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;
}
}

View File

@ -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;
/**
* 付款失败善后监听器(示例)
* <p>
* 挂在「财务执行付款」节点的 create 监听上:付款金额超过限额就调 {@code TaskService#throwError}
* 抛出 {@code PAY_FAILED},由流程定义上的错误边界捕获并走善后分支。金额先取本次办理变量,
* 取不到再回落实例变量,因为监听器可能在变量合并前触发。
* <p>
* 节点监听器配置里写的是本类全名,改包名或类名要同步改已发布的流程定义。
*
* @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<String, Object> 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);
}
}

View File

@ -30,9 +30,5 @@ public class CompleteTaskContext {
*/
private Instance instance;
/**
* 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。
*/
private Boolean autoPass;
}

View File

@ -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);
}

View File

@ -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<ButtonPermissionVo> buttonPermissions;
/**
* 抄送对象 ID 集合
* <p>
* 根据扩展属性中 CopySettingEnum 类型的数据生成,存储需要抄送的对象 ID
*/
private Set<String> copySettings;
/**
* 自定义参数 Map
* <p>

View File

@ -73,4 +73,9 @@ public class TestLeaveVo implements Serializable {
@ExcelProperty(value = "状态")
private String status;
/**
* 流程定义编码(已有流程实例时回显,供修改后重新提交沿用)
*/
private String flowCode;
}

View File

@ -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;
/**
* 流程消息事件的宿主发布器
* <p>
* 引擎在 {@code MESSAGE_THROW} / {@code MESSAGE_END} 时经 {@code FlowEngine.eventPublisher()}
* (即容器里唯一的 {@link EventPublisher} Bean)把消息交出来。没有这个 Bean 时引擎只会告警并跳过,
* 消息事件看起来“配了但没生效”。
* <p>
* 当前实现只落日志,够演示与排查用;接真实中间件时在这里改成发 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());
}
}

View File

@ -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;

View File

@ -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<String> copyList = nodeExt.getCopySettings();
if (CollUtil.isNotEmpty(copyList)) {
List<Long> userIds = StreamUtils.toList(copyList, Convert::toLong);
Map<Long, String> nickNameMap = userService.selectUserNicksByIds(userIds);
List<FlowCopyBo> 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<String> 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<Task> 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);
}
/**
* 根据流程实例确定最终状态
*

View File

@ -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.*;
/**
* 执行当前处理人的后续自动审批。
* <p>
* 仅当流程实例开启自动审批时生效,用于连续跳过同一登录人负责的后续待办任务。
*
* @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<FlowTask> flowTaskList = selectByInstId(instanceId);
if (CollUtil.isEmpty(flowTaskList)) {
return;
}
List<User> 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<User> 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<FlowTask> selectByInstId(Long instanceId) {
return flowTaskMapper.selectList(QueryBuilder.lambda(FlowTask.class)
.eq(FlowTask::getInstanceId, instanceId)
.build());
}
}

View File

@ -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);
}

View File

@ -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());
}
}

View File

@ -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;

View File

@ -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 {
/**
* 删除流程实例产生的抄送人员关联。
*
* <p>抄送人挂在<b>抄送历史主键</b>上(与引擎 {@code CopyAdvancer} 一致),不是待办主键。
* 只有本组件的历史分支需要显式清理——非历史分支走 {@code insService.remove},
* 引擎级联里已按历史主键清过一遍。</p>
*
* @param instanceIds 流程实例 ID 集合
*/
private void deleteCopyUsers(List<Long> instanceIds) {
List<FlowHisTask> 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<Long> copyTaskIds = copyTasks.stream()
.map(FlowHisTask::getTaskId)
List<Long> 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);
}
}

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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<String, Object> 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()));
}

View File

@ -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<FlowHisTask, FlowHisTas
.leftJoin(FlowDefinition.class, "c", FlowDefinition::getId, FlowHisTask::getDefinitionId)
.leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId)
.in("a", FlowHisTask::getNodeType, List.of(1, 3, 4))
.ne("a", FlowHisTask::getFlowStatus, TaskStatusEnum.COPY.getStatus())
.ne("a", FlowHisTask::getFlowStatus, TaskStatus.COPY.getKey())
.likeIfText("a", FlowHisTask::getNodeName, bo.getNodeName())
.likeIfText("c", FlowDefinition::getFlowName, bo.getFlowName())
.likeIfText("c", FlowDefinition::getFlowCode, bo.getFlowCode())

View File

@ -82,7 +82,7 @@ public interface FlwTaskMapper extends BaseMapperPlus<FlowTask, FlowTaskVo>, 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)

View File

@ -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<Long, List<User>> 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;
}

View File

@ -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<NodeExt> 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 扩展属性对象
* <p>
* 根据传入的 JSON 字符串,将扩展属性分为三类:
* 根据传入的 JSON 字符串,将扩展属性分为两类:
* 1. ButtonPermissionEnum:解析为按钮权限列表,标记每个按钮是否勾选
* 2. CopySettingEnum:解析为抄送对象 ID 集合
* 3. VariablesEnum:解析为自定义参数 Map
* 2. VariablesEnum:解析为自定义参数 Map
*
* <p>示例 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<String, Object> variable) {
@ -240,22 +228,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService
nodeExtVo.setButtonPermissions(buttonList);
} else if (CopySettingEnum.class.getSimpleName().equals(code)) {
List<String> permissions = spelSmartSplit(value).stream()
.map(s -> {
List<String> 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<String> 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<String> spelSmartSplit(String str) {
List<String> 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;
}
}

View File

@ -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<FlowHisTask> 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<User> 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<FlowCopyVo> list = StreamUtils.toList(nodeExtVo.getCopySettings(), x -> new FlowCopyVo(Convert.toLong(x)));
flowTaskVo.setCopyList(list);
} else {
flowTaskVo.setCopyList(new ArrayList<>());
// 抄送人读引擎节点配置 node_config.copy,展开规则与流转时一致(resolveCopyHandlers)。
List<String> 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<HisTask> copyHisList = FlowEngine.hisTaskService()
.list(FlowEngine.newHisTask().setTaskId(task.getId()).setFlowStatus(TaskStatus.COPY.getKey()));
List<Long> 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;

View File

@ -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<String, Object> 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()));

View File

@ -25,17 +25,12 @@
办理任务链路:
1. 加载任务实例、补齐变量并解析办理人
2. 构建参数并执行当前任务跳转
3. 开启自动审批时继续办理当前处理人的后续任务
自动审批由引擎按流程定义配置 def_config.autoPass 在办理链内完成,宿主不再单独编排。
-->
<chain name="completeTaskChain">
THEN(
completePrepare,
completeExecute,
IF(
completeNeedAutoPass,
completeAutoPass,
noop
)
completeExecute
);
</chain>

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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, '减签');

View File

@ -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, '减签');

View File

@ -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, '减签');

View File

@ -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

View File

@ -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, '重启');