From 8e5c3c9c9e63e0d5f85d1e4b01c8104312dd8bd2 Mon Sep 17 00:00:00 2001 From: may <1742057357@qq.com> Date: Tue, 20 Oct 2026 15:47:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7warm-flow=E5=88=B02.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application.yml | 5 +- .../org/dromara/workflow/common/.DS_Store | Bin 0 -> 8196 bytes .../common/constant/FlowConstant.java | 5 - .../common/enums/CopySettingEnum.java | 32 -- .../workflow/common/enums/TaskStatusEnum.java | 115 ------ .../workflow/demo/DemoClassServiceTask.java | 32 ++ .../demo/DemoDelegateServiceTask.java | 38 ++ .../workflow/demo/DemoOrderService.java | 60 +++ .../workflow/demo/DemoPayFailListener.java | 96 +++++ .../domain/context/CompleteTaskContext.java | 4 - .../workflow/domain/vo/FlowHisTaskVo.java | 8 +- .../dromara/workflow/domain/vo/NodeExtVo.java | 8 - .../workflow/domain/vo/TestLeaveVo.java | 5 + .../handler/WorkflowEventPublisher.java | 33 ++ .../handler/WorkflowPermissionHandler.java | 2 +- .../listener/WorkflowGlobalListener.java | 45 +- .../complete/CompleteAutoPassComponent.java | 94 ----- .../complete/CompleteExecuteComponent.java | 9 +- .../CompleteNeedAutoPassComponent.java | 23 -- .../complete/CompletePrepareComponent.java | 10 +- .../InstanceDeleteExecuteComponent.java | 16 +- .../operation/TaskOpExecuteComponent.java | 5 - .../liteflow/start/StartExecuteComponent.java | 4 +- .../start/StartPrepareInstanceComponent.java | 5 - .../workflow/mapper/FlwHisTaskMapper.java | 4 +- .../workflow/mapper/FlwTaskMapper.java | 2 +- .../service/impl/FlwInstanceServiceImpl.java | 8 +- .../service/impl/FlwNodeExtServiceImpl.java | 125 +----- .../service/impl/FlwTaskServiceImpl.java | 80 ++-- .../service/impl/TestLeaveServiceImpl.java | 34 +- .../main/resources/liteflow/task-chain.el.xml | 9 +- script/demo/demo_event_cooldown.json | 111 +++++ script/demo/demo_event_daily_check.json | 194 +++++++++ script/demo/demo_event_notify.json | 74 ++++ script/demo/demo_event_pay_fail.json | 120 ++++++ script/demo/demo_event_refund.json | 149 +++++++ script/demo/demo_event_risk_wait.json | 93 +++++ script/demo/demo_gateway_classic.json | 385 ++++++++++++++++++ script/demo/demo_gateway_mimic.json | 385 ++++++++++++++++++ script/demo/demo_service_task.json | 281 +++++++++++++ script/demo/demo_timer_start.json | 194 +++++++++ script/leave/leave1.json | 129 ------ script/leave/leave2.json | 187 --------- script/leave/leave3.json | 211 ---------- script/leave/leave4.json | 154 ------- script/leave/leave5.json | 211 ---------- script/leave/leave6.json | 368 ----------------- script/sql/oracle/oracle_ry_workflow.sql | 150 +++++-- script/sql/postgres/postgres_ry_workflow.sql | 126 +++++- script/sql/ry_workflow.sql | 81 +++- .../sql/sqlserver/sqlserver_ry_workflow.sql | 380 ++++++++++++++--- script/sql/update/update_6.0.0-6.1.0.sql | 33 ++ 54 files changed, 3028 insertions(+), 1908 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/.DS_Store delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/CopySettingEnum.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java create mode 100644 script/demo/demo_event_cooldown.json create mode 100644 script/demo/demo_event_daily_check.json create mode 100644 script/demo/demo_event_notify.json create mode 100644 script/demo/demo_event_pay_fail.json create mode 100644 script/demo/demo_event_refund.json create mode 100644 script/demo/demo_event_risk_wait.json create mode 100644 script/demo/demo_gateway_classic.json create mode 100644 script/demo/demo_gateway_mimic.json create mode 100644 script/demo/demo_service_task.json create mode 100644 script/demo/demo_timer_start.json delete mode 100644 script/leave/leave1.json delete mode 100644 script/leave/leave2.json delete mode 100644 script/leave/leave3.json delete mode 100644 script/leave/leave4.json delete mode 100644 script/leave/leave5.json delete mode 100644 script/leave/leave6.json create mode 100644 script/sql/update/update_6.0.0-6.1.0.sql diff --git a/pom.xml b/pom.xml index 547b1fa5f..86b08ff2f 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 3.3.5 - 2.0.1 + 2.1.0 2.16.2.1 2.6.12 diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index ae9b6ff9e..c8ef6a259 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -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 # # 从库数据源 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 78efbb4f6..8199b7e6a 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -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: diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/.DS_Store b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8eca5527dac6169a0eb694d5cb3ecf43e63602bb GIT binary patch literal 8196 zcmeHMU2GIp6u#%S&>1_*l(tY{)()%?DMi*&Oe+DFw*0nG?6!3KL(A;WP{z*A)ScPg z0yZ{2pn~zqMEreGqcKLK2K7M`5dR(xX-EhUM2Rsbnwa>YyrAdKoh7um51MF1=O*`_ zd+)ht?wr%_yLZo&5CUyE{a!-q2q6MiCgnan;C~qbc0Qx5EK5u?Sg;-HpaUgNn zDI`42%eie@c8HC79mh%)`&w$hX%t4~ns&$bG}AV+zJaM5xMaBBv~{P@=HzVM^=%Ve zA&P=HD%Tx5*3{C{sIG5{O*N{=TAN~xYIAGT)RZXHM%QiZ86CGWwsV3z0l`5)ZlB}S z$=M!RZoZv=ktjtd4BJB|pDU6GqMZ;+HeOG_D+tc%>N^?pg|&vS3(&R}wLt)wK=P9}q{xWQao zyP}M+ZM!tr>z*)de5Eggy?3B)&^@eWjqU;>FqrMcS^w{e^UP?QZh8(=`q5aSJRk@I z?15W#-Oy*Mmo8h9=w%kNY3EHuJjR~`Up_AgLNwmMffp^}FM7sN{k|XLXgtOhHAQ_O z*-ckZnn(xfA_vJhnIgx@De^LTlbj`=kaOfbxkRpz@5#^P8u<+kz!3*#ryacbo+wcy&3-7^4 z@ELp#U%*#z8NP;Z;0pWzzre3>l~P(mYw03dPgS~{uA$9z2i-+?(@xq&`{)QAqZZ9^ zA83(#BeQ*@$8mhaX@cAfz6R2dOK>l;bJxz@on3ow1@2v3z}Qw(yJ&IU@>OeM8(KHF zT}LH{aS^#U^1&y;Eb90q@If*Mzzm5>LMmGE**}Q4soD?vx~%AW!{Q z>WFL?kX`cM2>T1HVV6f}4c#vubX z0{;jcg@<7Z9)ZUZ_$T2>cnY3@Q}8T253j(h2>#dM4TSz_cppB1GjJBp!KVQUE+PfK zgP-QWdhZ-qGq~RX>wF?>TaG=3vqd7zHn>GbW&AzsSpL7Q^!NW;#GCLn!w7^C_$v{B z@{UAD8(Nk+%~-CjVm*kJ6}E1gOWy<=KOINur{gHE|HBabDlTO<@jy; STATUS_DESC_MAP = Arrays.stream(values()) - .collect(Collectors.toConcurrentMap(TaskStatusEnum::getStatus, TaskStatusEnum::getDesc)); - /** - * 状态 - */ - private final String status; - /** - * 状态描述。 - */ - private final String desc; - - /** - * 根据状态编码获取任务业务状态描述。 - * - * @param status 状态 - * @return 状态描述 - */ - public static String findByStatus(String status) { - // 从缓存中直接获取描述 - return STATUS_DESC_MAP.getOrDefault(status, StrUtil.EMPTY); - } - - /** - * 判断状态是否为通过或退回 - * - * @param status 状态值 - * @return true 表示是通过或退回状态 - */ - public static boolean isPassOrBack(String status) { - return PASS.getStatus().equals(status) || BACK.getStatus().equals(status); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java new file mode 100644 index 000000000..de3dc4cbd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoClassServiceTask.java @@ -0,0 +1,32 @@ +package org.dromara.workflow.demo; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.core.service.task.ServiceTaskContext; +import org.dromara.warm.flow.core.service.task.ServiceTaskHandler; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +/** + * 服务任务示例:class 模式 + *

+ * 节点配置 {@code node_config.serviceTask} 里写 {@code {"type":"class","handler":"本类全名"}}, + * 引擎先按全名从容器取 Bean,取不到才反射新建实例,所以注册成 Bean 后可以注入其它服务。 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@Component +public class DemoClassServiceTask implements ServiceTaskHandler { + + @Override + public void execute(ServiceTaskContext context) { + log.info("服务任务[class 模式]开始执行: instanceId={}, nodeCode={}, nodeName={}", + context.getInstance().getId(), context.getNode().getNodeCode(), context.getNode().getNodeName()); + context.setVariable("classTaskNode", context.getNode().getNodeCode()); + context.setVariable("classTaskResult", "class模式已执行"); + log.info("服务任务[class 模式]执行完成: instanceId={}, nodeCode={}", + context.getInstance().getId(), context.getNode().getNodeCode()); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java new file mode 100644 index 000000000..7b5b5d071 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoDelegateServiceTask.java @@ -0,0 +1,38 @@ +package org.dromara.workflow.demo; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.core.service.task.ServiceTaskContext; +import org.dromara.warm.flow.core.service.task.ServiceTaskHandler; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +/** + * 服务任务示例:delegateExpression 模式 + *

+ * 节点配置写 {@code {"type":"delegateExpression","expression":"#{@demoDelegateServiceTask}"}}, + * 引擎按 SpEL 从容器取出本 Bean 后调用 {@code execute}。Bean 名即表达式里的名字,改名会打断已发布的定义。 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@Component("demoDelegateServiceTask") +@RequiredArgsConstructor +public class DemoDelegateServiceTask implements ServiceTaskHandler { + + private final DemoOrderService demoOrderService; + + @Override + public void execute(ServiceTaskContext context) { + log.info("服务任务[delegateExpression 模式]开始执行: instanceId={}, nodeCode={}", + context.getInstance().getId(), context.getNode().getNodeCode()); + String orderNo = demoOrderService.createOrder(context); + context.setVariable("delegateTaskOrderNo", orderNo); + context.setVariable("delegateTaskResult", StringUtils.format("delegateExpression模式已执行, 单号={}", orderNo)); + log.info("服务任务[delegateExpression 模式]执行完成: instanceId={}, orderNo={}", + context.getInstance().getId(), orderNo); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java new file mode 100644 index 000000000..1e9a9898b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoOrderService.java @@ -0,0 +1,60 @@ +package org.dromara.workflow.demo; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.core.service.task.ServiceTaskContext; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * 服务任务示例:expression 模式的被调用方 + *

+ * 节点配置写 {@code {"type":"expression","expression":"#{@demoOrderService.createOrder(#execution)}", + * "resultVariable":"orderNo"}},{@code #execution} 就是引擎传入的 {@link ServiceTaskContext}, + * 返回值按 {@code resultVariable} 写回流程变量。 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@Component("demoOrderService") +public class DemoOrderService { + + /** + * 示例单号序列,仅用于演示“服务任务产出变量供后续网关判断”,非业务落库。 + */ + private final AtomicLong sequence = new AtomicLong(1000L); + + /** + * 生成示例业务单号。 + * + * @param context 服务任务上下文 + * @return 示例单号 + */ + public String createOrder(ServiceTaskContext context) { + log.info("服务任务[expression 模式]开始执行: instanceId={}, nodeCode={}", + context.getInstance().getId(), context.getNode().getNodeCode()); + context.setVariable("expressionTaskNode", context.getNode().getNodeCode()); + context.setVariable("expressionTaskResult", "expression模式已执行"); + String orderNo = "SO" + sequence.incrementAndGet(); + log.info("服务任务[expression 模式]执行完成: instanceId={}, nodeCode={}, orderNo={}", + context.getInstance().getId(), context.getNode().getNodeCode(), orderNo); + return orderNo; + } + + /** + * 按入参变量算请假天数,产出变量供后面的网关条件(如 {@code gt@@day|3})判断。 + * + * @param context 服务任务上下文 + * @return 天数 + */ + public Integer evalDay(ServiceTaskContext context) { + Object inputDay = context.getVariable("inputDay"); + int day = inputDay == null ? 5 : Integer.parseInt(String.valueOf(inputDay)); + log.info("服务任务[expression 模式]计算天数: instanceId={}, nodeCode={}, inputDay={}, day={}", + context.getInstance().getId(), context.getNode().getNodeCode(), inputDay, day); + return day; + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java new file mode 100644 index 000000000..90d96372d --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/demo/DemoPayFailListener.java @@ -0,0 +1,96 @@ +package org.dromara.workflow.demo; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.warm.flow.core.FlowEngine; +import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.spi.Listener; +import org.dromara.warm.flow.core.spi.ListenerVariable; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Map; + +/** + * 付款失败善后监听器(示例) + *

+ * 挂在「财务执行付款」节点的 create 监听上:付款金额超过限额就调 {@code TaskService#throwError} + * 抛出 {@code PAY_FAILED},由流程定义上的错误边界捕获并走善后分支。金额先取本次办理变量, + * 取不到再回落实例变量,因为监听器可能在变量合并前触发。 + *

+ * 节点监听器配置里写的是本类全名,改包名或类名要同步改已发布的流程定义。 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@Component +public class DemoPayFailListener implements Listener { + + /** + * 付款金额变量名。 + */ + public static final String VAR_PAY_AMOUNT = "payAmount"; + + /** + * 免审限额,超过即视为付款失败需善后。 + */ + public static final BigDecimal PAY_AMOUNT_LIMIT = new BigDecimal("1000"); + + /** + * 错误码,需与流程定义上错误边界的错误码一致。 + */ + public static final String ERROR_CODE_PAY_FAILED = "PAY_FAILED"; + + @Override + public void notify(ListenerVariable listenerVariable) { + Task task = listenerVariable == null ? null : listenerVariable.getTask(); + if (task == null || task.getId() == null) { + return; + } + BigDecimal amount = readPayAmount(listenerVariable); + if (amount == null || amount.compareTo(PAY_AMOUNT_LIMIT) <= 0) { + return; + } + log.info("付款金额 {} 超过限额 {},抛出 {} 转入错误边界: instanceId={}, taskId={}", + amount, PAY_AMOUNT_LIMIT, ERROR_CODE_PAY_FAILED, task.getInstanceId(), task.getId()); + FlowEngine.taskService().throwError(task.getId(), ERROR_CODE_PAY_FAILED, + "付款金额 " + amount.toPlainString() + " 超过限额 " + PAY_AMOUNT_LIMIT.toPlainString() + ",转入善后处理"); + } + + /** + * 先取本次办理的变量,取不到再回落实例变量。 + * + * @param listenerVariable 监听器变量 + * @return 付款金额,未配置时返回 {@code null} + */ + private BigDecimal readPayAmount(ListenerVariable listenerVariable) { + BigDecimal amount = parseAmount(listenerVariable.getVariable()); + if (amount != null) { + return amount; + } + Instance instance = listenerVariable.getInstance(); + return parseAmount(instance == null ? null : instance.getVariableMap()); + } + + /** + * 从变量集合里解析金额,非法值按未配置处理。 + * + * @param variable 变量集合 + * @return 付款金额,解析失败返回 {@code null} + */ + private BigDecimal parseAmount(Map variable) { + if (variable == null || variable.get(VAR_PAY_AMOUNT) == null) { + return null; + } + String value = String.valueOf(variable.get(VAR_PAY_AMOUNT)); + if (!StringUtils.isNumeric(value)) { + log.warn("流程变量 {} 不是数字,跳过付款校验: {}", VAR_PAY_AMOUNT, value); + return null; + } + return new BigDecimal(value); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java index 741e9edd5..5d8d4458c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/context/CompleteTaskContext.java @@ -30,9 +30,5 @@ public class CompleteTaskContext { */ private Instance instance; - /** - * 流程实例是否开启自动审批,由参数构建节点从实例变量中解析。 - */ - private Boolean autoPass; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java index 1733a701c..aa79f6a8d 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowHisTaskVo.java @@ -64,12 +64,12 @@ public class FlowHisTaskVo implements Serializable { private Long taskId; /** - * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + * 协作方式(none无 transfer转办 delegate委派 add_signer加签 remove_signer减签) */ - private Integer cooperateType; + private String cooperateType; /** - * 协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签) + * 协作方式展示名,由 cooperateType 翻译而来 */ private String cooperateTypeName; @@ -246,7 +246,7 @@ public class FlowHisTaskVo implements Serializable { /** * 设置协作方式,并通过协作方式获取名称 */ - public void setCooperateType(Integer cooperateType) { + public void setCooperateType(String cooperateType) { this.cooperateType = cooperateType; this.cooperateTypeName = CooperateType.getValueByKey(cooperateType); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java index 5fb3380b4..55edd844e 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/NodeExtVo.java @@ -6,7 +6,6 @@ import java.io.Serial; import java.io.Serializable; import java.util.List; import java.util.Map; -import java.util.Set; /** * Node 扩展属性解析结果 VO @@ -28,13 +27,6 @@ public class NodeExtVo implements Serializable { */ private List buttonPermissions; - /** - * 抄送对象 ID 集合 - *

- * 根据扩展属性中 CopySettingEnum 类型的数据生成,存储需要抄送的对象 ID - */ - private Set copySettings; - /** * 自定义参数 Map *

diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java index b66c25279..7d7a5e08c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TestLeaveVo.java @@ -73,4 +73,9 @@ public class TestLeaveVo implements Serializable { @ExcelProperty(value = "状态") private String status; + /** + * 流程定义编码(已有流程实例时回显,供修改后重新提交沿用) + */ + private String flowCode; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java new file mode 100644 index 000000000..ba9c154ba --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowEventPublisher.java @@ -0,0 +1,33 @@ +package org.dromara.workflow.handler; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.warm.flow.core.service.event.EventMessage; +import org.dromara.warm.flow.core.service.event.EventPublisher; +import org.dromara.workflow.common.ConditionalOnEnable; +import org.springframework.stereotype.Component; + +/** + * 流程消息事件的宿主发布器 + *

+ * 引擎在 {@code MESSAGE_THROW} / {@code MESSAGE_END} 时经 {@code FlowEngine.eventPublisher()} + * (即容器里唯一的 {@link EventPublisher} Bean)把消息交出来。没有这个 Bean 时引擎只会告警并跳过, + * 消息事件看起来“配了但没生效”。 + *

+ * 当前实现只落日志,够演示与排查用;接真实中间件时在这里改成发 MQ / 调用外部接口, + * 注意本方法与流程状态更新在同一事务边界内,需要可靠投递请自行引入 Outbox。 + * + * @author may + */ +@ConditionalOnEnable +@Slf4j +@Component +public class WorkflowEventPublisher implements EventPublisher { + + @Override + public void publish(EventMessage message) { + log.info("收到流程消息事件: eventName={}, eventType={}, definitionId={}, instanceId={}, nodeCode={}, payload={}", + message.getEventName(), message.getEventType(), message.getDefinitionId(), message.getInstanceId(), + message.getNodeCode(), message.getPayload()); + } + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java index 30e3df6cc..f5e41e44a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/handler/WorkflowPermissionHandler.java @@ -8,7 +8,7 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.api.domain.UserDTO; -import org.dromara.warm.flow.core.handler.PermissionHandler; +import org.dromara.warm.flow.core.spi.PermissionHandler; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.springframework.stereotype.Component; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index a4422990e..d002be438 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -1,7 +1,6 @@ package org.dromara.workflow.listener; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; @@ -9,19 +8,17 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.system.api.UserService; import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.workflow.context.WorkflowContext; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; -import org.dromara.warm.flow.core.listener.GlobalListener; -import org.dromara.warm.flow.core.listener.ListenerVariable; +import org.dromara.warm.flow.core.enums.TaskStatus; +import org.dromara.warm.flow.core.spi.GlobalListener; +import org.dromara.warm.flow.core.spi.ListenerVariable; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.constant.FlowConstant; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.FlowCopyBo; import org.dromara.workflow.domain.vo.NodeExtVo; import org.dromara.workflow.event.WorkflowCopyEvent; @@ -37,7 +34,6 @@ import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; /** * 工作流全局监听器,处理任务流转中的扩展变量、消息和事件发布。 @@ -55,7 +51,6 @@ public class WorkflowGlobalListener implements GlobalListener { private final FlowProcessEventHandler flowProcessEventHandler; private final IFlwCommonService flwCommonService; private final IFlwNodeExtService nodeExtService; - private final UserService userService; /** * 任务创建回调,当前预留扩展。 @@ -81,20 +76,6 @@ public class WorkflowGlobalListener implements GlobalListener { variable = new HashMap<>(); } NodeExtVo nodeExt = nodeExtService.parseNodeExt(ext, variable); - Set copyList = nodeExt.getCopySettings(); - if (CollUtil.isNotEmpty(copyList)) { - List userIds = StreamUtils.toList(copyList, Convert::toLong); - Map nickNameMap = userService.selectUserNicksByIds(userIds); - List list = StreamUtils.toList(copyList, x -> { - FlowCopyBo bo = new FlowCopyBo(); - Long id = Convert.toLong(x); - bo.setUserId(id); - bo.setNickName(nickNameMap.getOrDefault(id, StringUtils.EMPTY)); - return bo; - }); - // 节点配置仅作为默认值,保留本次办理显式提交的抄送人或空名单。 - variable.putIfAbsent(FlowConstant.FLOW_COPY_LIST, list); - } if (CollUtil.isNotEmpty(nodeExt.getVariables())) { variable.putAll(nodeExt.getVariables()); } @@ -120,9 +101,9 @@ public class WorkflowGlobalListener implements GlobalListener { String nodeCode = flowTask.getNodeCode(); // 处理办理或退回时指定办理人的情况 - if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) { + if (TaskStatus.PASS.getKey().equals(taskStatus)) { processTaskPermission(variable, flowTask, taskStatus); - } else if (TaskStatusEnum.BACK.getStatus().equals(taskStatus)) { + } else if (TaskStatus.BACK.getKey().equals(taskStatus)) { processTaskPermission(variable, flowTask, taskStatus); } @@ -163,7 +144,7 @@ public class WorkflowGlobalListener implements GlobalListener { List userIdList = StringUtils.str2List(userIds, StringUtils.SEPARATOR, true, true); if (CollUtil.isNotEmpty(userIdList)) { flowTask.setPermissionList(userIdList); - if (TaskStatusEnum.PASS.getStatus().equals(taskStatus)) { + if (TaskStatus.PASS.getKey().equals(taskStatus)) { // 办理指定人变量只消费一次;驳回指定人变量需要保留给后续重复驳回。 variable.remove(nodeKey); FlowEngine.insService().removeVariables(flowTask.getInstanceId(), nodeKey); @@ -228,7 +209,7 @@ public class WorkflowGlobalListener implements GlobalListener { return; } // 只有办理或者退回的时候才执行消息通知和抄送 - if (!TaskStatusEnum.isPassOrBack(workflowContext.getTaskStatus())) { + if (!isPassOrBack(workflowContext.getTaskStatus())) { return; } if (ObjectUtil.isNull(variable)) { @@ -267,7 +248,7 @@ public class WorkflowGlobalListener implements GlobalListener { * @return 是否发送待办消息 */ private boolean shouldSendTaskMessage(WorkflowContext workflowContext, Definition definition, List nextTasks) { - if (workflowContext == null || !TaskStatusEnum.BACK.getStatus().equals(workflowContext.getTaskStatus())) { + if (workflowContext == null || !TaskStatus.BACK.getKey().equals(workflowContext.getTaskStatus())) { return true; } if (CollUtil.isEmpty(nextTasks) || nextTasks.size() != 1) { @@ -302,6 +283,16 @@ public class WorkflowGlobalListener implements GlobalListener { SpringUtils.context().publishEvent(new WorkflowResultMessageEvent(definition.getFlowName(), status, instance.getCreateBy(), messageType)); } + /** + * 任务收口是否为「通过」或「退回」,只有这两种结果才触发消息通知与抄送。 + * + * @param taskStatus 任务状态编码 + * @return 是否为通过或退回 + */ + private boolean isPassOrBack(String taskStatus) { + return TaskStatus.PASS.getKey().equals(taskStatus) || TaskStatus.BACK.getKey().equals(taskStatus); + } + /** * 根据流程实例确定最终状态 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java deleted file mode 100644 index 7768e3677..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteAutoPassComponent.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.dromara.workflow.liteflow.complete; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.query.QueryBuilder; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.warm.flow.core.FlowEngine; -import org.dromara.warm.flow.core.workflow.command.CompleteCommand; -import org.dromara.warm.flow.core.workflow.context.OperatorContext; -import org.dromara.warm.flow.core.entity.User; -import org.dromara.warm.flow.orm.entity.FlowTask; -import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; -import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; -import org.dromara.workflow.domain.context.CompleteTaskContext; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static org.dromara.workflow.common.constant.FlowConstant.*; - -/** - * 执行当前处理人的后续自动审批。 - *

- * 仅当流程实例开启自动审批时生效,用于连续跳过同一登录人负责的后续待办任务。 - * - * @author may - */ -@ConditionalOnEnable -@RequiredArgsConstructor -@LiteflowComponent("completeAutoPass") -public class CompleteAutoPassComponent extends NodeComponent { - - private final FlowTaskMapper flowTaskMapper; - - @Override - public void process() { - CompleteTaskContext context = getContextBean(CompleteTaskContext.class); - FlowTask flowTask = context.getFlowTask(); - autoPass(flowTask.getId(), flowTask.getInstanceId()); - } - - /** - * 递归跳过当前处理人的后续任务。 - * - * @param taskId 本轮已处理任务 id,用于避免重复跳过同一任务 - * @param instanceId 流程实例 id - */ - private void autoPass(Long taskId, Long instanceId) { - List flowTaskList = selectByInstId(instanceId); - if (CollUtil.isEmpty(flowTaskList)) { - return; - } - List userList = FlowEngine.userService() - .getByAssociateds(StreamUtils.toList(flowTaskList, FlowTask::getId)); - if (CollUtil.isEmpty(userList)) { - return; - } - for (FlowTask task : flowTaskList) { - if (task.getId().equals(taskId)) { - continue; - } - // 自动审批只处理当前登录人仍是办理人的后续任务,避免替其他候选人或并行分支误审批。 - List users = StreamUtils.filter(userList, - e -> ObjectUtil.equals(task.getId(), e.getAssociated()) && ObjectUtil.equal(e.getProcessedBy(), LoginHelper.getUserIdStr())); - if (CollUtil.isEmpty(users)) { - continue; - } - // 自动审批不继承人工办理时的抄送和消息通知,避免重复发送业务消息。 - CompleteCommand command = new CompleteCommand(); - command.setOperator(new OperatorContext(LoginHelper.getUserIdStr())); - command.setTaskId(task.getId()); - command.setMessage("流程引擎自动审批!"); - command.setVariables(Map.of(SUBMIT, false, FLOW_COPY_LIST, Collections.emptyList(), MESSAGE_NOTICE, StringUtils.EMPTY)); - command.setTaskStatus(TaskStatusEnum.PASS.getStatus()); - FlowEngine.workflow().complete(command); - // 跳过后可能生成新的后续任务,继续扫描直到当前登录人不再有可自动办理任务。 - autoPass(task.getId(), instanceId); - } - } - - private List selectByInstId(Long instanceId) { - return flowTaskMapper.selectList(QueryBuilder.lambda(FlowTask.class) - .eq(FlowTask::getInstanceId, instanceId) - .build()); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java index 2ecc09b12..84e535880 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteExecuteComponent.java @@ -4,12 +4,11 @@ import cn.hutool.core.convert.Convert; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.warm.flow.core.FlowEngine; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.core.workflow.command.CompleteCommand; import org.dromara.warm.flow.core.workflow.context.OperatorContext; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.CompleteTaskBo; import org.dromara.workflow.domain.context.CompleteTaskContext; @@ -40,9 +39,9 @@ public class CompleteExecuteComponent extends NodeComponent { command.setVariables(variables); command.setMessage(completeTaskBo.getMessage()); command.setExt(completeTaskBo.getFileId()); - command.setFlowStatus(BusinessStatusEnum.WAITING.getStatus()); - command.setTaskStatus(TaskStatusEnum.PASS.getStatus()); - context.setAutoPass(Convert.toBool(context.getInstance().getVariableMap().getOrDefault(AUTO_PASS, false))); + // 全局监听器用 context.taskStatus 判断「通过/退回」,才决定要不要抄送与发通知; + // 引擎不会把解析后的状态回填进调用上下文,办理路径不显式声明 PASS 就会静默跳过抄送。 + command.setTaskStatus(TaskStatus.PASS.getKey()); FlowEngine.workflow().complete(command); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java deleted file mode 100644 index d74646c7d..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompleteNeedAutoPassComponent.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.workflow.liteflow.complete; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBooleanComponent; -import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.domain.context.CompleteTaskContext; - -/** - * 判断办理任务后是否进入自动审批分支。 - * - * @author may - */ -@ConditionalOnEnable -@LiteflowComponent("completeNeedAutoPass") -public class CompleteNeedAutoPassComponent extends NodeBooleanComponent { - - @Override - public boolean processBoolean() { - CompleteTaskContext context = getContextBean(CompleteTaskContext.class); - return Boolean.TRUE.equals(context.getAutoPass()); - } - -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java index ad3bb56e2..54d7a5edb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/complete/CompletePrepareComponent.java @@ -9,11 +9,11 @@ import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.warm.flow.core.entity.Instance; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.CompleteTaskBo; import org.dromara.workflow.domain.context.CompleteTaskContext; @@ -86,12 +86,12 @@ public class CompletePrepareComponent extends NodeComponent { hashSet.addAll(popUserIds); hashSet.addAll(variableUserIds); // Warm-Flow 会按“状态:变量名”读取办理人,正向和退回都写入同一批候选人。 - map.put(TaskStatusEnum.PASS.getStatus() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet)); - map.put(TaskStatusEnum.BACK.getStatus() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet)); + map.put(TaskStatus.PASS.getKey() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet)); + map.put(TaskStatus.BACK.getKey() + StringUtils.COLON + entry.getKey(), StringUtils.joinComma(hashSet)); } } else { - map.put(TaskStatusEnum.PASS.getStatus() + StringUtils.COLON + entry.getKey(), entry.getValue()); - map.put(TaskStatusEnum.BACK.getStatus() + StringUtils.COLON + entry.getKey(), entry.getValue()); + map.put(TaskStatus.PASS.getKey() + StringUtils.COLON + entry.getKey(), entry.getValue()); + map.put(TaskStatus.BACK.getKey() + StringUtils.COLON + entry.getKey(), entry.getValue()); } } return map; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java index 8e27a47e1..00ec10228 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/instance/InstanceDeleteExecuteComponent.java @@ -7,13 +7,13 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.warm.flow.core.FlowEngine; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.context.InstanceDeleteContext; import java.util.List; @@ -56,23 +56,27 @@ public class InstanceDeleteExecuteComponent extends NodeComponent { /** * 删除流程实例产生的抄送人员关联。 * + *

抄送人挂在抄送历史主键上(与引擎 {@code CopyAdvancer} 一致),不是待办主键。 + * 只有本组件的历史分支需要显式清理——非历史分支走 {@code insService.remove}, + * 引擎级联里已按历史主键清过一遍。

+ * * @param instanceIds 流程实例 ID 集合 */ private void deleteCopyUsers(List instanceIds) { List copyTasks = flowHisTaskMapper.selectList(QueryBuilder.lambda(FlowHisTask.class) .in(FlowHisTask::getInstanceId, instanceIds) - .eq(FlowHisTask::getFlowStatus, TaskStatusEnum.COPY.getStatus()) + .eq(FlowHisTask::getFlowStatus, TaskStatus.COPY.getKey()) .build()); if (CollUtil.isEmpty(copyTasks)) { return; } - List copyTaskIds = copyTasks.stream() - .map(FlowHisTask::getTaskId) + List copyHisIds = copyTasks.stream() + .map(FlowHisTask::getId) .filter(Objects::nonNull) .distinct() .toList(); - if (CollUtil.isNotEmpty(copyTaskIds)) { - FlowEngine.userService().deleteByTaskIds(copyTaskIds); + if (CollUtil.isNotEmpty(copyHisIds)) { + FlowEngine.userService().deleteByTaskIds(copyHisIds); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java index 7ec6d6f57..a2ace850c 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/operation/TaskOpExecuteComponent.java @@ -10,7 +10,6 @@ import org.dromara.warm.flow.core.workflow.command.RemoveSignerCommand; import org.dromara.warm.flow.core.workflow.command.TransferCommand; import org.dromara.warm.flow.core.workflow.context.OperatorContext; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.context.TaskOperationContext; /** @@ -37,7 +36,6 @@ public class TaskOpExecuteComponent extends NodeComponent { command.setTaskId(taskId); command.setTargetHandler(context.getTaskOperationBo().getUserId()); command.setMessage(message); - command.setTaskStatus(TaskStatusEnum.DEPUTE.getStatus()); result = FlowEngine.workflow().delegate(command).isSuccess(); } case TRANSFER_TASK -> { @@ -46,7 +44,6 @@ public class TaskOpExecuteComponent extends NodeComponent { command.setTaskId(taskId); command.setTargetHandler(context.getTaskOperationBo().getUserId()); command.setMessage(message); - command.setTaskStatus(TaskStatusEnum.TRANSFER.getStatus()); result = FlowEngine.workflow().transfer(command).isSuccess(); } case ADD_SIGNATURE -> { @@ -55,7 +52,6 @@ public class TaskOpExecuteComponent extends NodeComponent { command.setTaskId(taskId); command.setTargetHandlers(context.getTaskOperationBo().getUserIds()); command.setMessage(message); - command.setTaskStatus(TaskStatusEnum.SIGN.getStatus()); result = FlowEngine.workflow().addSigner(command).isSuccess(); } case REDUCTION_SIGNATURE -> { @@ -64,7 +60,6 @@ public class TaskOpExecuteComponent extends NodeComponent { command.setTaskId(taskId); command.setTargetHandlers(context.getTaskOperationBo().getUserIds()); command.setMessage(message); - command.setTaskStatus(TaskStatusEnum.SIGN_OFF.getStatus()); result = FlowEngine.workflow().removeSigner(command).isSuccess(); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java index 7adb8de0f..f96273630 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartExecuteComponent.java @@ -9,6 +9,7 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Task; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.core.service.TaskService; import org.dromara.warm.flow.core.workflow.command.StartCommand; import org.dromara.warm.flow.core.workflow.context.OperatorContext; @@ -16,7 +17,6 @@ import org.dromara.warm.flow.core.workflow.result.WorkflowResult; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.workflow.api.domain.StartProcessReturnDTO; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.context.StartProcessContext; import org.dromara.workflow.mapper.FlwInstanceBizExtMapper; @@ -45,7 +45,7 @@ public class StartExecuteComponent extends NodeComponent { command.setOperator(new OperatorContext(context.getStartProcessBo().getHandler())); command.setVariables(context.getVariables()); command.setFlowStatus(BusinessStatusEnum.DRAFT.getStatus()); - command.setTaskStatus(TaskStatusEnum.PASS.getStatus()); + command.setTaskStatus(TaskStatus.PASS.getKey()); WorkflowResult result = FlowEngine.workflow().start(command); Instance instance = FlowEngine.insService().getById(result.getInstanceId()); context.setInstance(instance); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java index fc3cfa753..da642e965 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/liteflow/start/StartPrepareInstanceComponent.java @@ -1,12 +1,10 @@ package org.dromara.workflow.liteflow.start; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.json.utils.JsonUtils; import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.workflow.common.ConditionalOnEnable; @@ -36,9 +34,6 @@ public class StartPrepareInstanceComponent extends NodeComponent { context.setDefinition(definition); Map variables = context.getVariables(); - Dict dict = JsonUtils.parseMap(definition.getExt()); - boolean autoPass = !ObjectUtil.isNull(dict) && dict.getBool(AUTO_PASS); - variables.put(AUTO_PASS, autoPass); variables.put(BUSINESS_CODE, generateBusinessCode(context.getBizExt())); } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java index 5cc2e8c9d..8b9329a6b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwHisTaskMapper.java @@ -5,10 +5,10 @@ import com.github.yulichang.base.MPJBaseMapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.warm.flow.core.enums.NodeType; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.orm.entity.FlowDefinition; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowTaskBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; @@ -51,7 +51,7 @@ public interface FlwHisTaskMapper extends BaseMapperPlus, MPJ .select("d", FlowDefinition::getFlowName, FlowDefinition::getFlowCode, FlowDefinition::getCategory, FlowDefinition::getVersion) .select("biz", FlowInstanceBizExt::getBusinessCode, FlowInstanceBizExt::getBusinessTitle) - .leftJoin(FlowHisTask.class, "b", FlowHisTask::getTaskId, FlowUser::getAssociated) + .leftJoin(FlowHisTask.class, "b", FlowHisTask::getId, FlowUser::getAssociated) .leftJoin(FlowInstance.class, "c", FlowInstance::getId, FlowHisTask::getInstanceId) .leftJoin(FlowDefinition.class, "d", FlowDefinition::getId, FlowInstance::getDefinitionId) .leftJoin(FlowInstanceBizExt.class, "biz", FlowInstanceBizExt::getInstanceId, FlowInstance::getId) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index 22e2578af..3a7a681e1 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -20,6 +20,7 @@ import org.dromara.common.mybatis.core.query.LambdaJoinQueryBuilder; import org.dromara.common.mybatis.core.query.QueryBuilder; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.warm.flow.core.FlowEngine; +import org.dromara.warm.flow.core.enums.TaskStatus; import org.dromara.warm.flow.core.workflow.command.RevokeCommand; import org.dromara.warm.flow.core.workflow.command.TerminateCommand; import org.dromara.warm.flow.core.workflow.context.OperatorContext; @@ -39,7 +40,6 @@ import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; import org.dromara.workflow.common.ConditionalOnEnable; -import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.FlowInstanceBizExt; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; @@ -275,7 +275,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { command.getOperator().setIgnore(true); command.setInstanceId(instance.getId()); command.setMessage(bo.message()); - command.setFlowStatus(BusinessStatusEnum.CANCEL.getStatus()); command.setTaskStatus(BusinessStatusEnum.CANCEL.getStatus()); FlowEngine.workflow().revoke(command); return true; @@ -321,7 +320,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { Map> taskUserMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated); for (FlowHisTaskVo vo : runningTaskVos) { - vo.setFlowStatus(TaskStatusEnum.WAITING.getStatus()); + // 状态列保留待办任务自身的 flow_status(pending 待审批 / back 退回), + // 不要覆盖成实例维度编码:审批记录用任务字典渲染这一列。 vo.setUpdateTime(null); vo.setRunDuration(null); @@ -462,7 +462,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { command.setInstanceId(bo.id()); command.setMessage(bo.comment()); command.setFlowStatus(BusinessStatusEnum.INVALID.getStatus()); - command.setTaskStatus(TaskStatusEnum.INVALID.getStatus()); + command.setTaskStatus(TaskStatus.INVALID.getKey()); FlowEngine.workflow().terminate(command); return true; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java index 6a3b312bf..a1455faf6 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java @@ -11,12 +11,10 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.utils.CollUtil; -import org.dromara.warm.flow.core.utils.ExpressionUtil; import org.dromara.warm.flow.ui.service.NodeExtService; import org.dromara.warm.flow.ui.vo.NodeExt; import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.enums.ButtonPermissionEnum; -import org.dromara.workflow.common.enums.CopySettingEnum; import org.dromara.workflow.common.enums.NodeExtEnum; import org.dromara.workflow.common.enums.VariablesEnum; import org.dromara.workflow.domain.vo.ButtonPermissionVo; @@ -45,14 +43,6 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService static { CHILD_NODE_MAP = Map.of( - CopySettingEnum.class.getSimpleName(), - Map.of( - "label", "抄送对象", - "type", 5, - "must", false, - "multiple", false, - "desc", "设置该节点的抄送办理人" - ), VariablesEnum.class.getSimpleName(), Map.of( "label", "自定义参数", @@ -84,7 +74,7 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService List nodeExtList = new ArrayList<>(); // 构建基础设置页面 nodeExtList.add(buildNodeExt("wf_basic_tab", "基础设置", 1, - List.of(CopySettingEnum.class, VariablesEnum.class))); + List.of(VariablesEnum.class))); // 构建按钮权限页面 nodeExtList.add(buildNodeExt("wf_button_tab", "权限", 2, List.of(ButtonPermissionEnum.class))); @@ -192,21 +182,19 @@ public class FlwNodeExtServiceImpl implements NodeExtService, IFlwNodeExtService /** * 解析扩展属性 JSON 并构建 Node 扩展属性对象 *

- * 根据传入的 JSON 字符串,将扩展属性分为三类: + * 根据传入的 JSON 字符串,将扩展属性分为两类: * 1. ButtonPermissionEnum:解析为按钮权限列表,标记每个按钮是否勾选 - * 2. CopySettingEnum:解析为抄送对象 ID 集合 - * 3. VariablesEnum:解析为自定义参数 Map + * 2. VariablesEnum:解析为自定义参数 Map * *

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