流程脚本介绍

流程配置中很多地方都使用了 Groovy 脚本来实现代码逻辑扩展,如:

  • 任务前后置脚本 :用于在任务创建、完成时,调用一段配置的 java 代码逻辑
  • 流程节点表单初始化脚本 :用于节点表单的初始化赋值
  • 自由跳转规则的条件配置 :用于决策是否跳转至配置的指定节点
  • 分支、条件同步 的条件配置 :用于决策分支流向
    等等…

流程配置中凡是使用到 Groovy 脚本的配置项、插件 均可以参考该文档。

如何编写 Groovy 脚本

Groovy 语法 参考: https://www.w3cschool.cn/groovy/

1、直接写 groovy 脚本的形式

在较少逻辑判断的场景时推荐使用这种形式 。比如:分支条件判断 demo.age > 10

2、扩展 IScript 实现类,添加业务逻辑脚本

实现了IScript 接口的实现类会自动注入到 Groovy 引擎中,您可以扩展 业务专用的 IScript 实现类。
这样就可以在 Groovy 脚本中通过 beanID 的形式调用,如:
sysScript.getNextSerialNo('流水号别名')
xxScript.initData(xxxBusData)

目前系统有以下脚本实现类

  • sysScript :获取流水号、当前用户、等,可以扩展一些系统公用的常用脚本
  • bpmScriptUtil : 流程相关的脚本
  • busDataScript:业务对象相关的脚本
  • orgScript :组织相关的脚本

我们推荐不同业务独立添加专用的常用脚本如 :

//XX业务脚本实现类
@Repository
public class MyTestScript implements IScript {

public void test(IBusinessData data) {
data.put("name", "张三");
data.put("name", "李四");
}
}

//Groovy 脚本中以 myTestScript.test(Demo) 的形式调用。 ( Demo 为业务对象的 key)

扩展 IScript 的形式可以借助 IDE 减少代码中语法错误,还可以沉淀常用的业务逻辑,方便复用,有利于统一管理、代码评审!

流程脚本变量介绍

在指定 流程脚本的时候,会将流程实例生命周期中可用变量注入到 Groovy 引擎的“临时变量”中,您可以非常安全的在脚本中使用到这些变量

流程变量

流程定义的变量,流程变量在 Groovy 脚本中均可以被使用(使用前需要确认是否对该流程变量赋过值)

业务对象

业务对象即 IBusinessData 存储了流程的业务数据(URL 表单不支持)。

一个流程实例支持配置多个业务对象,业务对象的 key 为变量名,BussinessData 为值,在 Groovy 脚本中可以用它来获取业务数据。

如表单前置脚本中 对业务对象 主表字段赋值:

Demo.put('zd2','')

流程插件中可以使用的变量

流程插件中会使用 BpmExecutionPluginSession 作为 Groovy运行参数,详情参考 插件变量
适用在 前后置脚本插件、自由跳转插件、节点消息插件、人员脚本插件等…

  • submitActionDesc: 流程提交的动作名字(eg:点击同意按钮,则为“同意”)
  • submitActionName: 流程提交的动作 key (eg: 点击同意按钮,则为“agree”)
  • submitOpinion: 任务提交意见
  • bpmInstance: 流程实例 IBpmInstance
  • isTask: 是否为任务(实例类型的插件,在任务事件执行的时候、可以通过此变量判断)
  • bpmTask: 流程任务 IBpmTask
  • variableScope: Activiti 流程变量操作类 VariableScope,可以使用它操作原声 Activiti 流程变量 如:
Map<String, Object> getVariables();
Object getVariable(String variableName);
Set<String> getVariableNames();
void setVariable(String variableName, Object value);
void removeVariable(String variableName);
boolean hasVariable(String variableName);

场景与案例

  • 某节点,领导点击同意,更新业务对象某业务字段

可以在流程节点表单初始化 插件中 配置 节点的保存后脚本

if("agree" == actionCmd.getActionName()) {
SchoolStudent.put('type','审批通过')
}else{
SchoolStudent.put('type','审批不通过')
}

当然您也可以在“任务后置脚本插件” 中自行调用业务方法去更新数据库的值,或者扩展一些对应的业务逻辑

更多案例您可以再楼底评论,我们遇到特殊需求会进行补充

常用脚本

在系统管理-开发辅助-常用脚本中,可以维护常用的、通用的 Groovy 脚本,具体可以查看常用脚本API