# 节点配置
节点配置主要以下几点:
催办配置 服务任务配置:1. WEB请求配置 ,2.脚本节点配置 全局节点配置:1.全局按钮配置 , 2. 全局事件与接口 ,3.在流程任务创建时将当前节点信息更新到业务表 任务节点配置:1.抄送配置 ,2. 高级配置 , 3 .事件与接口 ,4. 跳转规则 网关节点配置:1.并行网关配置 ,2.分支网关配置 , 3.条件网关配置
# 全局节点配置
全局节点配置主要以下几点:
1.全局按钮配置 2.全局事件与接口 3.在流程任务创建时,将当前节点信息更新到业务表
# 全局节点配置概述
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
在流程提交和审批的时候,可以设定一些参数,满足一些特定的流程需求。
# 全局按钮配置
# 功能说明
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
在流程启动页面,可以配置自定按钮,如果不配置的话,那么就可以使用默认的按钮配置。
点击【添加】全部
在默认情况下,我们预先定义了四个按钮,这四个功能是固定的。用户可以修改按钮的字眼。另外允许用户自己添加按钮。
自定义按钮的方法
点击添加
在表单编写JS方法
效果
# 全局事件与接口
# 概述
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
系统在流程启动,流程完成,全局启动事件,结束事件,手工终止流程时执行事件配置,可以实现流程一些特定业务增强。
# 详细说明:
流程启动时 事件配置:这个指的是在流程启动时间点执行的动作,可以执行脚本等。这个是在调用流程引擎内部的接口调用的因此可以获取execution对象。 流程完成时 事件配置:在流程结束时可以做的事件配置,这个也是在调用流程引擎内部接口触发的事件。 全局启动/完成事件配置:这个说的是在流程任务创建事件中执行,这个其实和任务创建事件是一致的,这个配置可以选择执行节点,在审批过程中会在在配置的节点执行这些事件操作。 全局结束 执行脚本:这个脚本是在流程终止的时候执行的脚本,比如用户在终止流程时,需要做一些处理,那么这个时候可以在这里编写脚本。
这个是在流程实例管理页面。
点击【结束实例】按钮,那么他就会执行我们配置的脚本。
# 业务场景
我们在数据数据查询列表时,客户希望在列表上显示当前节点信息,或者插入当前任务ID,这样就可以实现在列表中进行审批。
# 实现方法
实现思路是:
创建表单时,创建 节点ID,节点名称,流程任务ID等信息 在任务创建的时机执行sql语句更新执行更新业务表,把当前的任务节点,任务名称,任务ID更新到业务表。
可以在全局节点,配置SQL 来更新关联的数据。
在全局事件中配置需要执行的SQL。
update w_sellorder set F_NID='${variables.activityId}',F_NNAME='${variables.nodeName}',F_TASKID='${variables.taskId}' where ID_=${variables.busKey}
在这里SQL 是支持 Freemark语法,也支持各种常量。
配置sql后,我们可以看看实现的效果。
任务ID 放到业务表中了,我们可以列用这个实现列表的任务发起和审批过程。
# 任务节点配置
任务节点配置主要以下几点:
1.抄送配置 2.高级配置 3.事件与接口 4.跳转规则:4.4.1 根据审批意见进行跳转案例
# 任务节点配置概述
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
系统对ACTIVITI进行了产品化,方便用户进行配置使用。
# 自定义审批按钮
勾选自定义审批按钮后。
用户可以选择在任务审批栏需要的按钮。
这个按钮会根据当前任务的类型进行显示,比如沟通任务,会显示回复沟通按钮。
会签任务,如果有加签权限,并且指定了会签按钮,那么会显示加签按钮。
除了系统默认的按钮,用户也可以添加自定义的按钮。
点击添加:
我们可以在表单上添加一个脚本方法。
点击测试按钮,弹出警告信息框。
# 可选择执行路径
当一个任务节点后,有多个后续节点时,如果勾选这个选项,用户可以选中一个后续节点。
流程设计如下:
在节点配置,勾选可选择执行路径。 启动流程——进行审批
# 可选择执行人
勾选后允许用户手工选择下一步审批人。
# 允许更改路径
勾选后选择跳转路径。
审批时,这里允许选择下一步执行路径,这里允许流程自由跳转。
# 运行执行人为空
当流程审批过程中,可能根据配置没有找到执行人,这个时候如果允许执行人为空,那么可以往下审批,否则会抛出错误,告诉审批人,流程下一节点没有找到审批人,不能审批。
# 表间公式
在流程审批的过程中,有时需要将数据进行流转,比如 当订单状态改为完成时,需要自动产生一个新的合同,那么可使用表间公式来生成一个合同。
平台的做法是:
先根据业务模型定义好表间公式,在配置到流程节点。 在流程流转时,读取节点配置的表间公式进行执行。
# 通知配置
通知指的是在任务审批时,会产生下一个环节的审批任务,这个任务会有审批人,那么系统需要发送通知审批人完成审批。
我们可以在节点上配置通知方式,也可以在整个流程实例上配置通知方式。如果节点上有配置通知方式,那么流程会使用节点的通知方式通知审批人,否则使用全局的配置通知审批人。
通知方式用户可以根据自己的系统自定义开发。 扩展流程通知消息
# 驳回配置
驳回指的是,流程在审批过程中,审批的数据有问题,或者其他的原因需要打回 让人重新填写数据或意见等。
平台支持三种驳回方式:
1.驳回到发起人 2.驳回到指定节点 3.驳回到上一步审批人
在审批过程中,有时需要在某个节点上配置一种或多种驳回方式,比如有些情况下,需要直接驳回到发起人。
勾选驳回到发起人
在流程驳回的时候
只显示驳回到发起人。
# 外部表单URL
这种情况一般是这样的,在待办任务列表中,当用户点击任务进行审批时,他会跳转到我们制定的URL上进行审批。
平台提供上面的数据 :任务ID,实例ID,流程实例ID,节点ID,流程方案ID,业务主键几个数据,用户负责自己展示数据,并写代码调用平台提供的接口进行审批。
# 子表权限
流程在审批过程中,比如有这样的场景,比如一个会签节点,每个人都提交自己的子表数据,他们的数据互相隔离,那么可以通过配置子表权限实现这样的功能。
在这里我们可以看到,这个流程需要配置表单,并且这个表单是有主子表的情况。
我们在设计表单时,默认会添加 CREATE_BY_ 创建人字段,GROUP_ID_ 创建人用户组的字段。
选项说明:
1.当前用户:指的是 子表数据查询除了根据主键过滤外还通过当前人 根据CREATE_BY_字段进行过滤,
2.当前用户组:指的时 子表数据查询是处理根据主键过滤外 还通过当前人的用户组进行过滤,当前人的用户组指的是当前人的主组织ID。
3.SQL:这里就只是返回一个实际的查询子表的SQL语句,通过这个语句进行查询,这个SQL语句可以配置根据其他的字段进行查询。 4.全部:这个就只是根据主键进行过滤。
SQL:
# 抄送配置
# 业务场景
在审批时,比如到某个节点,需要把流程信息,审批过程,表单数据 知会某些领导,但是领导不需要审批。那么可以通过抄送来实现。
# 操作步骤
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
抄送配置。
点击添加按钮
这里可以选择通知方式,如果勾选,那么他会使用配置的通知方式通知抄送人员。
下面的规则 和流程配置是一致的。
# 功能说明
高级配置一般是需要有开发能力的人员进行配置。
前置处理器: 在调用流程引擎审批任务之前执行。 具体参考《流程处理器脚本开发》
后置处理器: 在调用流程引擎审批任务之后执行,具体参考《流程处理器脚本开发》
允许审批判断脚本: 业务场景,比如有些情况下,审批任务时需要满足某些条件才能审批,比如表单的某个状态为完成,才可以审批,如果状态为为完成,那么会在审批表单显示下面都提示信息,并且审批按钮不可用。
在系统中,允许审批条件如果返回true,那么可以审批,否则不可以审批。
具体参考《允许审批判断脚本》
# 事件与接口
# 功能说明
平台使用的是ACTIVITI作为流程引擎,在任务审批时会触发一些事件,比如我们审批任务时,会触发这个任务的完成事件,以及下一个节点的任务创建事件,或者在会签任务完成后执行。
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
在平台中配置界面如下:
任务创建:指的是任务在创建的时候,可以执行的事件 任务完成:这个指的是任务在完成时,可以执行的事件 会签完成:这个只有在会签节点才可以配置,它是在会签任务完成的时候执行的。
事件配置
异步调用 异步调用指的是将调用封装成 消息,发送到队列,通过队列监听器处理这些消息。不勾选则为同步调用,意思是执行相关动作和审批动作一起完成。
接口类型:
# Groovy 脚本:允许执行java脚本
这个可以在相关事件中使用java代码扩展一些特定的功能。
点击配置:
在这里可以编写java 脚本。
java 脚本编写可以参考 《任务创建(完成)事件脚本编写》
# http 请求服务调用
这个可以在相关事件中调用 http请求执行,比如回调子系统的restful 接口,并且可以在调用完成之后,获取返回执行相对应的脚本。
具体的业务场景,比如文章在发布之前需要审批,审批完成之后,修改文章状态为发布,那么这个时候可以配置 HTTP请求,这个请求负责更新文章状态。
# 执行SQL
在相关事件中触发 设定的SQL执行。
这个sql支持使用freemaker 代码,并且支持常量替换。
上下文可以使用的变量如下:
cmd:cmd 对象 processInstanceId:流程实例ID(流程引擎) executionId:流程运行ID,关联 ACT_RU_EXECUTION 主键 processDefinitionId:流程定义ID activityId:节点ID 流程变量:可以通过ACT_RU_VARIABLE查询得到 表单数据:页面提交的表单数据
可以使用指定的数据源执行sql 语句。
# ProcessCall调用接口
在相关事件中,执行一般情况这个用于实现一些比较复杂都业务功能,通过代码来编写。
系统提供了一个接口
com.redxun.bpm.activiti.listener.call.ProcessCall
接口方法如下:
boolean process(BpmEventCallMessage eventCallMessage);
用户需要实现该接口,并且把这个类配置到spring容器中,在下图填入 beanId。
# 发送到队列
使用的业务场景,子系统通过接口发起流程,发起时指定来自的系统,这个来自系统放到流程变量中,在流程执行到某个步骤后,可以执行发送到调用消息到发起时指定的队列中。
子系统通过读取消息,进行相应的操作。
这个相对于http请求来说,更稳定,如果子系统宕机的情况,那么http调用会失败,如果是通过队列,子系统主动读取就稳定的多了。
在流程启动时指定消息队列:
调用发送消息队列代码:
BpmEventCallHandlerJms.java
@Override
public void handle(BpmEventCallMessage callMessage) {
Map<String, Object> map=callMessage.getVars();
if(!map.containsKey("fromSys")){
logger.debug("没有配置源系统!");
return;
}
String fromSys=(String) map.get("fromSys");
if(StringUtil.isEmpty(fromSys)) return ;
//task,execution 对象不能序列化
map.remove("task");
map.remove("execution");
IExecutionCmd cmd= callMessage.getExecutionCmd();
cmd.cleanTasks();
cmd.clearTransientVars();
cmd.getBoDataMaps().clear();
String json=JSONObject.toJSONString(callMessage);
logger.debug("发送消息队列到:" + fromSys);
logger.debug(json);
//发送到队列。
MessageUtil.getProducer().send(fromSys, json);
}
子系统接收代码如下:
springboot 实现:
@Component
public class BpmReceiver {
@Resource
JdbcTemplate jdbcTemplate;
@JmsListener(destination = "oa")
public void receivedMessage(String message) throws InterruptedException{
JSONObject json=JSONObject.parseObject(message);
String actInstId=json.getString("actInstId");
JSONObject vars=json.getJSONObject("vars");
String nodeId=json.getString("nodeId");
String nodeName=json.getString("nodeName");
String busKey= vars.getString("busKey");
String tableName= vars.getString("tableName");
String type=json.getString("type");
if("TASK_CREATED".equals(type)){
Thread.sleep(1000);
String sql="update " + tableName + " set NODE_NAME_=? and INST_STATUS_='RUNNING' where ID_=?";
jdbcTemplate.update(sql, nodeName,busKey);
}
else if ("PROCESS_COMPLETED".equals(type)){
String sql="update " + tableName + " set INST_STATUS_='COMPLETED',NODE_NAME_='' where ID_=?";
jdbcTemplate.update(sql, busKey);
}
}
}
接收代码监听指定的队列。对消息进行消费。
# 满足的审批动作
业务场景:在流程审批时,如果希望在用户选择同意的情况下执行指定的脚本,那么就需要选择动作为同意。
如果不填写,就不就忽略这个审批动作配置。
# 业务场景
在流程审批过程中,有些情况会根据表单或者流程变量,确定下一步的跳转,这个和分支网关有些类似。
例如:比如在报销时,如果当前人的角色是老板,那么他可以直接跳转到财务,而不需要层层审批。
但是与分支网关不同的是,跳转规则在流程图上不可见,可以根据业务需求任意跳转,好处是不用画太多的流程跳转线条。
# 操作步骤
入口:开发配置——流程管理——流程方案 点击【方案配置】
点击【节点配置】
跳转规则
点击【添加】按钮
规则名称:任意 目标节点:是需要跳转到的节点 规则脚本:这个脚本返回 true 或 false,当返回为 true时,在这个节点审批时流程将跳转到目标节点。
规则脚本写法参考:《流程跳转规则开发》
# 根据审批意见进行跳转案例
# 应用场景
根据审批意见来决定跳转到哪个节点
# 例子
到N2节点进行跳转规则配置:
填写规则名和跳转的节点,设置跳转条件
效果图: