diff --git a/pom.xml b/pom.xml
index b2acdb4de..7aabad563 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
3.50.0
2.2.7
4.3.1
- 1.6.0
+ 1.7.0
1.4.8
0.2.0
1.18.38
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 5dd2e00fe..1b52fab96 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -27,8 +27,6 @@ snail-job:
port: 2${server.port}
# 客户端ip指定
host:
- # RPC类型: netty, grpc
- rpc-type: grpc
--- # 数据源配置
spring:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 435a9e856..d77ddf57c 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -30,8 +30,6 @@ snail-job:
port: 2${server.port}
# 客户端ip指定
host:
- # RPC类型: netty, grpc
- rpc-type: grpc
--- # 数据源配置
spring:
diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
index 62b4846ab..1e386db00 100644
--- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
+++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-dev.yml
@@ -34,8 +34,6 @@ snail-job:
summary-day: 7
# 配置负载均衡周期时间
load-balance-cycle-time: 10
- # 通知类型默认使用grpc(netty 已经下线)
- rpc-type: grpc
# 重试任务拉取的并行度
retry-max-pull-parallel: 2
diff --git a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
index 62b4846ab..1e386db00 100644
--- a/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
+++ b/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
@@ -34,8 +34,6 @@ snail-job:
summary-day: 7
# 配置负载均衡周期时间
load-balance-cycle-time: 10
- # 通知类型默认使用grpc(netty 已经下线)
- rpc-type: grpc
# 重试任务拉取的并行度
retry-max-pull-parallel: 2
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java
index b8ad8cc39..d5c3ea734 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java
@@ -4,8 +4,8 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.springframework.stereotype.Component;
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java
index bff15f97e..47d730584 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SummaryBillTask.java
@@ -3,8 +3,8 @@ package org.dromara.job.snailjob;
import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.springframework.stereotype.Component;
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java
index e5339f5b4..aa3d99e4c 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java
@@ -2,9 +2,9 @@ package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.springframework.stereotype.Component;
/**
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java
index d77e72e6c..9cb830936 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestBroadcastJob.java
@@ -3,8 +3,8 @@ package org.dromara.job.snailjob;
import cn.hutool.core.util.RandomUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java
index 6f7c21fb6..93da0a903 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestClassJobExecutor.java
@@ -2,7 +2,7 @@ package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.job.core.executor.AbstractJobExecutor;
-import com.aizuda.snailjob.client.model.ExecuteResult;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.springframework.stereotype.Component;
/**
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java
index 6589ed1c5..f58d7724a 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapJobAnnotation.java
@@ -6,8 +6,8 @@ import com.aizuda.snailjob.client.job.core.MapHandler;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.annotation.MapExecutor;
import com.aizuda.snailjob.client.job.core.dto.MapArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.springframework.stereotype.Component;
import java.util.List;
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java
index 4ae2fa80a..f926016f9 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestMapReduceAnnotation1.java
@@ -8,8 +8,8 @@ import com.aizuda.snailjob.client.job.core.annotation.MapExecutor;
import com.aizuda.snailjob.client.job.core.annotation.ReduceExecutor;
import com.aizuda.snailjob.client.job.core.dto.MapArgs;
import com.aizuda.snailjob.client.job.core.dto.ReduceArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.springframework.stereotype.Component;
import java.util.List;
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java
index 11a69733e..060fcd4d6 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestStaticShardingJob.java
@@ -3,8 +3,8 @@ package org.dromara.job.snailjob;
import cn.hutool.core.convert.Convert;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.springframework.stereotype.Component;
/**
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java
index d8caf1af0..e19a48ea9 100644
--- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java
+++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/WechatBillTask.java
@@ -4,8 +4,8 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
-import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.aizuda.snailjob.model.dto.ExecuteResult;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.job.entity.BillDto;
import org.springframework.stereotype.Component;
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java
new file mode 100644
index 000000000..e72474699
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/warm/flow/ui/service/WarmFlowService.java
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2024-2025, Warm-Flow (290631660@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dromara.warm.flow.ui.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.warm.flow.core.FlowEngine;
+import org.dromara.warm.flow.core.config.WarmFlow;
+import org.dromara.warm.flow.core.dto.*;
+import org.dromara.warm.flow.core.entity.Form;
+import org.dromara.warm.flow.core.entity.Instance;
+import org.dromara.warm.flow.core.enums.FormCustomEnum;
+import org.dromara.warm.flow.core.enums.ModeEnum;
+import org.dromara.warm.flow.core.exception.FlowException;
+import org.dromara.warm.flow.core.invoker.FrameInvoker;
+import org.dromara.warm.flow.core.utils.ExceptionUtil;
+import org.dromara.warm.flow.core.utils.StreamUtils;
+import org.dromara.warm.flow.core.utils.StringUtils;
+import org.dromara.warm.flow.ui.dto.HandlerFeedBackDto;
+import org.dromara.warm.flow.ui.dto.HandlerQuery;
+import org.dromara.warm.flow.ui.utils.TreeUtil;
+import org.dromara.warm.flow.ui.vo.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 设计器Controller 可选择是否放行,放行可与业务系统共享权限,主要是用来访问业务系统数据
+ *
+ * @author warm
+ */
+@Slf4j
+public class WarmFlowService {
+
+ /**
+ * 返回流程定义的配置
+ * @return ApiResult
+ */
+ public static ApiResult config() {
+ WarmFlowVo warmFlowVo = new WarmFlowVo();
+ WarmFlow warmFlow = FlowEngine.getFlowConfig();
+ // 获取tokenName
+ String tokenName = warmFlow.getTokenName();
+ if (StringUtils.isEmpty(tokenName)) {
+ return ApiResult.fail("未配置tokenName");
+ }
+ String[] tokenNames = tokenName.split(",");
+ List tokenNameList = Arrays.stream(tokenNames).filter(StringUtils::isNotEmpty)
+ .map(String::trim).collect(Collectors.toList());
+ warmFlowVo.setTokenNameList(tokenNameList);
+
+ return ApiResult.ok(warmFlowVo);
+ }
+
+ /**
+ * 保存流程json字符串
+ *
+ * @param defJson 流程数据集合
+ * @return ApiResult
+ * @throws Exception 异常
+ * @author xiarg
+ * @since 2024/10/29 16:31
+ */
+ public static ApiResult saveJson(DefJson defJson) throws Exception {
+ FlowEngine.defService().saveDef(defJson);
+ return ApiResult.ok();
+ }
+
+ /**
+ * 获取流程定义数据(包含节点和跳转)
+ *
+ * @param id 流程定义id
+ * @return ApiResult
+ * @author xiarg
+ * @since 2024/10/29 16:31
+ */
+ public static ApiResult queryDef(Long id) {
+ try {
+ DefJson defJson;
+ if (id == null) {
+ defJson = new DefJson()
+ .setModelValue(ModeEnum.CLASSICS.name())
+ .setFormCustom(FormCustomEnum.N.name());
+ } else {
+ defJson = FlowEngine.defService().queryDesign(id);
+ }
+ CategoryService categoryService = FrameInvoker.getBean(CategoryService.class);
+ if (categoryService != null) {
+ List treeList = categoryService.queryCategory();
+ defJson.setCategoryList(TreeUtil.buildTree(treeList));
+ }
+ return ApiResult.ok(defJson);
+ } catch (Exception e) {
+ log.error("获取流程json字符串", e);
+ throw new FlowException(ExceptionUtil.handleMsg("获取流程json字符串失败", e));
+ }
+ }
+
+ /**
+ * 获取流程图
+ *
+ * @param id 流程实例id
+ * @return ApiResult
+ */
+ public static ApiResult queryFlowChart(Long id) {
+ try {
+ Instance instance = FlowEngine.insService().getById(id);
+ String defJsonStr = instance.getDefJson();
+ DefJson defJson = FlowEngine.jsonConvert.strToBean(defJsonStr, DefJson.class);
+ if (StringUtils.isEmpty(defJson.getModelValue())) {
+ defJson.setModelValue(ModeEnum.CLASSICS.name());
+ }
+ defJson.setInstance(instance);
+
+ // 获取流程图三原色
+ defJson.setChartStatusColor(FlowEngine.chartService().getChartRgb());
+ // 是否显示流程图顶部文字
+ defJson.setTopTextShow(FlowEngine.getFlowConfig().isTopTextShow());
+ // 需要业务系统实现该接口
+ ChartExtService chartExtService = FrameInvoker.getBean(ChartExtService.class);
+ if (chartExtService != null) {
+ chartExtService.initPromptContent(defJson);
+ chartExtService.execute(defJson);
+ }
+
+ return ApiResult.ok(defJson);
+ } catch (Exception e) {
+ log.error("获取流程图", e);
+ throw new FlowException(ExceptionUtil.handleMsg("获取流程图失败", e));
+ }
+ }
+
+ /**
+ * 办理人权限设置列表tabs页签
+ * @return List
+ */
+ public static ApiResult> handlerType() {
+ try {
+ // 需要业务系统实现该接口
+ HandlerSelectService handlerSelectService = FrameInvoker.getBean(HandlerSelectService.class);
+ if (handlerSelectService == null) {
+ return ApiResult.ok(Collections.emptyList());
+ }
+ List handlerType = handlerSelectService.getHandlerType();
+ return ApiResult.ok(handlerType);
+ } catch (Exception e) {
+ log.error("办理人权限设置列表tabs页签异常", e);
+ throw new FlowException(ExceptionUtil.handleMsg("办理人权限设置列表tabs页签失败", e));
+ }
+ }
+
+ /**
+ * 办理人权限设置列表结果
+ * @return HandlerSelectVo
+ */
+ public static ApiResult handlerResult(HandlerQuery query) {
+ try {
+ // 需要业务系统实现该接口
+ HandlerSelectService handlerSelectService = FrameInvoker.getBean(HandlerSelectService.class);
+ if (handlerSelectService == null) {
+ return ApiResult.ok(new HandlerSelectVo());
+ }
+ HandlerSelectVo handlerSelectVo = handlerSelectService.getHandlerSelect(query);
+ return ApiResult.ok(handlerSelectVo);
+ } catch (Exception e) {
+ log.error("办理人权限设置列表结果异常", e);
+ throw new FlowException(ExceptionUtil.handleMsg("办理人权限设置列表结果失败", e));
+ }
+ }
+
+ /**
+ * 办理人权限名称回显
+ * @return HandlerSelectVo
+ */
+ public static ApiResult> handlerFeedback(HandlerFeedBackDto handlerFeedBackDto) {
+ try {
+ // 需要业务系统实现该接口
+ HandlerSelectService handlerSelectService = FrameInvoker.getBean(HandlerSelectService.class);
+ if (handlerSelectService == null) {
+ List handlerFeedBackVos = StreamUtils.toList(handlerFeedBackDto.getStorageIds(),
+ storageId -> new HandlerFeedBackVo(storageId, null));
+ return ApiResult.ok(handlerFeedBackVos);
+ }
+ List handlerFeedBackVos = handlerSelectService.handlerFeedback(handlerFeedBackDto.getStorageIds());
+ return ApiResult.ok(handlerFeedBackVos);
+ } catch (Exception e) {
+ log.error("办理人权限名称回显", e);
+ throw new FlowException(ExceptionUtil.handleMsg("办理人权限名称回显", e));
+ }
+ }
+
+ /**
+ * 办理人选择项
+ * @return List
+ */
+ public static ApiResult> handlerDict() {
+ try {
+ // 需要业务系统实现该接口
+ HandlerDictService handlerDictService = FrameInvoker.getBean(HandlerDictService.class);
+ if (handlerDictService == null) {
+ List dictList = new ArrayList<>();
+ Dict dict = new Dict();
+ dict.setLabel("默认表达式");
+ dict.setValue("${handler}");
+ Dict dict1 = new Dict();
+ dict1.setLabel("spel表达式");
+ dict1.setValue("#{@user.evalVar(#handler)}");
+ Dict dict2 = new Dict();
+ dict2.setLabel("其他");
+ dict2.setValue("");
+ dictList.add(dict);
+ dictList.add(dict1);
+ dictList.add(dict2);
+
+ return ApiResult.ok(dictList);
+ }
+ return ApiResult.ok(handlerDictService.getHandlerDict());
+ } catch (Exception e) {
+ log.error("办理人权限设置列表结果异常", e);
+ throw new FlowException(ExceptionUtil.handleMsg("办理人权限设置列表结果失败", e));
+ }
+ }
+
+ /**
+ * 已发布表单列表 该接口不需要业务系统实现
+ */
+ public static ApiResult> publishedForm() {
+ try {
+ return ApiResult.ok(FlowEngine.formService().list(FlowEngine.newForm().setIsPublish(1)));
+ } catch (Exception e) {
+ log.error("已发布表单列表异常", e);
+ throw new FlowException(ExceptionUtil.handleMsg("已发布表单列表异常", e));
+ }
+ }
+
+ /**
+ * 读取表单内容
+ * @param id
+ * @return
+ */
+ public static ApiResult getFormContent(Long id) {
+ try {return ApiResult.ok(FlowEngine.formService().getById(id).getFormContent());
+ } catch (Exception e) {
+ log.error("获取表单内容字符串", e);
+ throw new FlowException(ExceptionUtil.handleMsg("获取表单内容字符串失败", e));
+ }
+ }
+
+ /**
+ * 保存表单内容,该接口不需要系统实现
+ * @param flowDto
+ * @return
+ */
+ public static ApiResult saveFormContent(FlowDto flowDto) {
+ FlowEngine.formService().saveContent(flowDto.getId(), flowDto.getFormContent());
+ return ApiResult.ok();
+ }
+
+
+ /**
+ * 根据任务id获取待办任务表单及数据
+ *
+ * @param taskId 当前任务id
+ * @return {@link ApiResult}
+ * @author liangli
+ * @date 2024/8/21 17:08
+ **/
+ public static ApiResult load(Long taskId) {
+ FlowParams flowParams = FlowParams.build();
+
+ return ApiResult.ok(FlowEngine.taskService().load(taskId, flowParams));
+ }
+
+ /**
+ * 根据任务id获取已办任务表单及数据
+ *
+ * @param hisTaskId
+ * @return
+ */
+ public static ApiResult hisLoad(Long hisTaskId) {
+ FlowParams flowParams = FlowParams.build();
+
+ return ApiResult.ok(FlowEngine.taskService().hisLoad(hisTaskId, flowParams));
+ }
+
+ /**
+ * 通用表单流程审批接口
+ *
+ * @param formData
+ * @param taskId
+ * @param skipType
+ * @param message
+ * @param nodeCode
+ * @return
+ */
+ public static ApiResult handle(Map formData, Long taskId, String skipType
+ , String message, String nodeCode) {
+ FlowParams flowParams = FlowParams.build()
+ .skipType(skipType)
+ .nodeCode(nodeCode)
+ .message(message);
+
+ flowParams.formData(formData);
+
+ return ApiResult.ok(FlowEngine.taskService().skip(taskId, flowParams));
+ }
+
+ /**
+ * 获取节点扩展属性
+ * @return List
+ */
+ public static ApiResult> nodeExt() {
+ try {
+ // 需要业务系统实现该接口
+ NodeExtService nodeExtService = FrameInvoker.getBean(NodeExtService.class);
+ if (nodeExtService == null) {
+ return ApiResult.ok(Collections.emptyList());
+ }
+ List nodeExts = nodeExtService.getNodeExt();
+ return ApiResult.ok(nodeExts);
+ } catch (Exception e) {
+ log.error("获取节点扩展属性", e);
+ throw new FlowException(ExceptionUtil.handleMsg("获取节点扩展属性失败", e));
+ }
+ }
+
+}