流程脚本介绍

流程配置中很多地方都使用了 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 :组织相关的脚本

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

流程脚本变量介绍

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

流程变量

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

业务对象

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

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

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

Demo.put('zd2','')

推荐以 Iscript 实现类的形式来添加业务脚本,如 :

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

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

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

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

流程插件中会使用 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