基于jeecgboot的flowable流程支持服务任务的功能

简介: 基于jeecgboot的flowable流程支持服务任务的功能

1、描述

Java服务任务用于调用外部Java类。

2、图形表示法

服务任务可视化为圆角矩形,左上角有一个小齿轮图标,如下图:

 

3、XML表示

有三种方法声明如何调用Java逻辑,下面分别介绍:

  • 调用固定的类

使用flowable:class属性提供全限定类名(fully qualified classname),指定流程执行时调用的类,该类必须实现JavaDelegate或ActivityBehavior接口。

<serviceTask id="javaService" flowable:class="com.nbcio.modules.flowable.service.MyJavaDelegate" />
  • 调用动态类

使用flowable:delegateExpression属性提供委托代理对象(delegation object)的表达式。该功能和flowable:class类似,同样需要实现JavaDelegate或ActivityBehavior接口,只不过这里不是指定一个具体的实现类,而是查询指定名称的Bean对象。

<serviceTask id="javaService" flowable:delegateExpression="${myDelegateExpressionBean}" />

myDelegateExpressionBean是一个实现了JavaDelegate接口的bean,定义在Spring容器中。

  • 调用类的指定方法或属性值

使用flowable:expression属性指定类的方法或属性值。同样的,该类需要实现JavaDelegate或ActivityBehavior接口。

<serviceTask id="javaService" flowable:expression="${test.printMessage()}" />

将在名为test的对象上调用printMessage方法(不带参数)。当然也可以为表达式中使用的方法传递变量。

属性值示例:

<serviceTask id="javaService" flowable:expression="${test.ready}" />

会调用名为test的bean的ready参数的getter方法,getReady(不带参数)。该值会被解析为执行的流程变量。

4、 vue前端实现

ServiceTask.vue代码如下:

<template>
  <div class="panel-tab__content">
    <el-form size="mini" label-width="90px" @submit.native.prevent>
      <el-form-item label="服务类型">
        <el-select v-model="serviceType">
          <el-option v-for="i in Object.keys(typeObject)" :key="i" :label="typeObject[i]" :value="i" />
        </el-select>
      </el-form-item>
      <el-form-item v-if="serviceType === 'class'" label="Java类">
        <el-input v-model="serviceValue" clearable @change="updateInfo('class')" />
      </el-form-item>
      <el-form-item v-if="serviceType === 'expression'" label="表达式">
        <el-input v-model="serviceValue" clearable @change="updateInfo('expression')" />
      </el-form-item>
      <el-form-item v-if="serviceType === 'delegateExpression'" label="代理表达式">
        <el-input v-model="serviceValue" clearable @change="updateInfo('delegateExpression')" />
      </el-form-item>
      <el-form-item v-if="serviceType === 'expression'" label="结果变量">
        <el-input v-model="resultVariable" clearable @change="updateInfo('resultVariable')" />
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
export default {
  name: "ServiceTask",
  props: {
    id: String,
    type: String
  },
  inject: {
    prefix: "prefix",
    width: "width"
  },
  data() {
    return {
      typeObject: {
        class: "Java 类",
        expression: "表达式",
        delegateExpression: "代理表达式"
      },
      serviceType: "",
      serviceValue: "",
      resultVariable: ""
    };
  },
  watch: {
    id: {
      immediate: true,
      handler(val) {
        this.$nextTick(() => this.resetBaseInfo());
      }
    }
  },
  methods: {
    resetBaseInfo() {
      this.bpmnElement = window?.bpmnInstances?.bpmnElement;
      var val = "";
      if ((val = this.bpmnElement.businessObject.class)) {
        this.serviceType = "class";
      } else if ((val = this.bpmnElement.businessObject.expression)) {
        this.serviceType = "expression";
        if(this.bpmnElement.businessObject.hasOwnProperty('resultVariable')) {
          this.resultVariable = this.bpmnElement.businessObject.resultVariable;
        }
      } else if ((val = this.bpmnElement.businessObject.delegateExpression)) {
        this.serviceType = "delegateExpression";
      }
      this.serviceValue = val;
      
    },
    updateInfo(key) {
      const attrObj = Object.create(null);
      attrObj.class = undefined;
      attrObj.expression = undefined;
      attrObj.delegateExpression = undefined;
      attrObj.resultVariable = undefined;
      if (key === "class") {
        attrObj.class = this.serviceValue;
      } else if (key === "expression") {
        attrObj.expression = this.serviceValue;
        if(this.resultVariable != "") {
          attrObj.resultVariable =  this.resultVariable;
        }
      } else if (key === "delegateExpression"){
        attrObj.delegateExpression = this.serviceValue;
      }
      window.bpmnInstances.modeling.updateProperties(this.bpmnElement, attrObj);
    }
  },
  beforeDestroy() {
    this.bpmnElement = null;
  }
};
</script>

5、后端java实现

5.1 具体实现实例

下面是一个Java类的示例,用于将流程变量String改为大写。这个类通过实现org.flowable.engine.delegate.JavaDelegate接口,可以在流程执行中被调用。

同时,需要重写execute(DelegateExecution)方法实现业务逻辑。这个方法就是引擎将调用的方法。另外,通过该方法中的DelegateExecution参数可以访问流程实例的各种信息。

public class ToUppercase implements JavaDelegate {
      public void execute(DelegateExecution execution) {
        String var = (String) execution.getVariable("input");
        var = var.toUpperCase();
        execution.setVariable("input", var);
      }
    }

如果实现org.flowable.engine.impl.delegate.ActivityBehavior接口,可以访问更强大的引擎功能,例如,可以影响流程的控制流程。但注意这并不是好的实践,需要避免这么使用。

5.2 任务的返回值

服务执行的返回值(仅对使用表达式的服务任务),可以通过为服务任务定义的'flowable:resultVariable'属性设置为流程变量。可以是已经存在的,或者新的流程变量。 如果指定为已存在的流程变量,则流程变量的值会被服务执行的返回值覆盖。 如果不指定结果变量名,则服务任务的返回值将被忽略。

<serviceTask id="ExpressionServiceTask"
        flowable:expression="${myService.doing()}"
        flowable:resultVariable="myVariable" />

在上例中,服务执行的结果(调用'doing()'方法的返回值),在服务执行完成后,会设置为名为'myVariable'的流程变量。

6、效果图


相关文章
|
存储 XML Java
Flowable工作流-高级篇
Flowable工作流-高级篇
9275 1
|
数据可视化 前端开发 Java
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)(一)
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)
5701 0
|
存储 Java 数据安全/隐私保护
SpringBoot整合Flowable【03】- 通过Flowable-UI体验一个简单流程
本文介绍了如何使用Flowable 7.0以下版本的flowable-ui进行流程建模、发布和执行。首先,通过解压并启动flowable-ui war包,访问http://localhost:8080/flowable-ui/idm/#/login登录系统。接着,创建并绘制一个简单的绩效流程模型,包含开始节点、任务节点(自评、上级评、隔级评)和结束节点,并为各节点分配处理人。然后,创建应用并发布绩效流程。最后,通过创建a、b、c三个用户分别完成各节点任务,演示了整个流程的执行过程。本文旨在帮助读者理解Flowable的基本操作和流程元素,后续将介绍通过Java代码控制流程的方法。
3792 1
SpringBoot整合Flowable【03】- 通过Flowable-UI体验一个简单流程
|
前端开发
基于jeecgboot的flowable流程支持退回到发起人节点表单修改功能
基于jeecgboot的flowable流程支持退回到发起人节点表单修改功能
1417 0
|
存储 Java API
SpringBoot整合Flowable【02】- 整合初体验
本文介绍了如何基于Flowable 6.8.1版本搭建工作流项目。首先,根据JDK和Spring Boot版本选择合适的Flowable版本(7.0以下)。接着,通过创建Spring Boot项目并配置依赖,包括Flowable核心依赖、数据库连接等。然后,建立数据库并配置数据源,确保Flowable能自动生成所需的表结构。最后,启动项目测试,确认Flowable成功创建了79张表。文中还简要介绍了这些表的分类和常用表的作用,帮助初学者理解Flowable的工作原理。
3365 0
SpringBoot整合Flowable【02】- 整合初体验
基于jeecgboot的flowable流程增加节点表单的支持(一)
基于jeecgboot的flowable流程增加节点表单的支持(一)
431 0
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
4662 0
|
前端开发 数据库 JavaScript
基于Flowable的流程挂接自定义业务表单的设计与实践
文章讨论了如何在Flowable流程引擎中挂接自定义业务表单,以及相关设计和实践的步骤。文章中包含了一些前后端代码示例,如Vue组件的模板和脚本部分,这些代码用于实现与Flowable流程引擎交互的界面。例如,有一个按钮组件用于提交申请,点击后会触发applySubmit方法,该方法会与后端API进行交互,处理流程启动、查询关联流程等逻辑。
54458 11
|
前端开发
基于jeecgboot的flowable流程增加节点自动跳过功能
基于jeecgboot的flowable流程增加节点自动跳过功能
1270 2
|
移动开发 前端开发
基于jeecg-boot的flowable流程加签功能实现
基于jeecg-boot的flowable流程加签功能实现
1348 0

热门文章

最新文章