# 节点配置

节点配置主要以下几点:

催办配置 服务任务配置: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节点进行跳转规则配置:

填写规则名和跳转的节点,设置跳转条件

效果图: