Skip to content

节点事件

概述

节点事件是在流程节点执行过程中触发的钩子函数,允许您在特定时机插入自定义业务逻辑,实现与业务系统的深度集成。

事件类型

序号事件类型触发时机常用场景
1打开节点时执行节点被打开时获取或初始化数据
2进入节点执行节点开始执行前数据校验、前置条件检查、发送通知
3离开节点执行节点执行完成后记录执行日志、更新业务状态、触发后续业务操作
4操作完成前执行操作执行前操作前数据验证、权限校验
5操作完成后执行操作执行完成后记录执行日志、更新业务状态、触发后续业务操作

实现方式

产品提供两种实现方案:

方案说明适用场景
Java 实现在工作流内直接新建实现类,可获取全量流程信息需要深度定制开发,获取完整流程上下文
REST 实现通过接口调用第三方服务与外部业务系统集成,松耦合场景

实现方式选择

Java 方式配置说明

实现步骤

  1. src 下新建 Java 类,继承 BaseRuleImpl 并实现 IBaseRule 接口
  2. executeRule 方法中编写自定义业务逻辑
  3. 将类路径(如 com.horizon.example.NodeEvent)配置到节点事件中

实现类示例

java
package com.horizon.example;

import com.horizon.common.collect.Lists;
import com.horizon.db.Access;
import com.horizon.wf.bean.WorkParaBean;
import com.horizon.wf.core.rule.BaseRuleImpl;
import com.horizon.wf.core.rule.IBaseRule;
import com.horizon.wf.core.runtime.RunningData;
import com.horizon.wf.definition.pub.IFlowNode;
import com.horizon.wf.definition.xml.IXmlNode;
import com.horizon.wf.entity.db.DBTrack;
import com.horizon.wf.entity.db.DBWork;
import com.horizon.wf.entity.run.RunUser;
import com.horizon.wf.entity.user.IRunUser;
import com.horizon.wf.global.StaticVarExtend;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 打开节点、进入节点、离开节点、操作完成前、操作完成后事件自定义
 * com.horizon.example.NodeEvent
 */
public class NodeEvent extends BaseRuleImpl implements IBaseRule {

    public boolean executeRule() {
        // 从引擎获取核心数据对象
        RunningData runningdata = getRunningdata();

        // 事件处理类额外传入参数
        IFlowNode eventNode = (IFlowNode) getParameter(StaticVarExtend.Parameter_IFlowNode);
        IFlowNode curNode = (IFlowNode) getParameter(StaticVarExtend.Parameter_Current_IFlowNode);
        WorkParaBean paraBean = (WorkParaBean) getParameter(StaticVarExtend.Parameter_WorkParaBean);
        DBWork work = (DBWork) getParameter(StaticVarExtend.Parameter_DBWork);
        IRunUser user = (IRunUser) getParameter(StaticVarExtend.Parameter_RunUser);
        DBTrack track = (DBTrack) getParameter(StaticVarExtend.Parameter_DBTrack);
        Map<String, List<Object>> dataMap = (Map<String, List<Object>>) getParameter(StaticVarExtend.Parameter_SaveMap);
        String eventType = (String) getParameter("eventType");

        // 获取流程审批页内的信息
        LinkedHashMap otherMap = (LinkedHashMap) paraBean.getOtherPara();
        String pageID = otherMap.get("FORMID") == null ? "" : otherMap.get("FORMID").toString();
        String formID = otherMap.get(pageID + "_FORMID") != null ? otherMap.get(pageID + "_FORMID").toString() : "";
        String dataId = otherMap.get(formID + "_ID") != null ? otherMap.get(formID + "_ID").toString() : "";

        // 执行 SQL(推荐使用 dataMap 方式与流程事务同步)
        String updateSql = "update T_ZHUBIAO set a6=123,a5=222 where id = ?";
        List<Object> para = Lists.newArrayList(dataId);
        dataMap.put(updateSql, para);

        return true;
    }
}

可用参数说明

参数类型说明
Parameter_IFlowNodeIFlowNode执行事件的节点对象
Parameter_Current_IFlowNodeIFlowNode当前节点对象
Parameter_WorkParaBeanWorkParaBean引擎调用时传入的参数对象
Parameter_DBWorkDBWork当前实例对象
Parameter_RunUserIRunUser当前执行人对象
Parameter_DBTrackDBTrack当前路径对象
Parameter_SaveMapMap需要保存的 SQL 数据

事件配置步骤

  1. 进入流程设计器,找到需要配置事件的节点

  2. 打开节点属性,切换到「事件」配置页面

    节点事件配置图

  3. 首次添加事件:点击「新增」按钮添加配置

    新增事件配置

  4. 填写事件信息:添加事件说明和实现类路径

    填写事件信息

  5. 配置事件类型:选择具体的事件触发时机

    结束节点事件配置

Java 方式扩展说明

获取流程发起人信息

java
String creator = getRunningdata().getWork().getCreator();
Organization organization = ThirdAdapterFactory.instanse(HorizonCore.TENANT_CODE.value()).getOrganizationInstance();
Map<String, String> user = organization.getUserById(creator, HorizonCore.TENANT_IDENTIFIER.value());
String deptName = organization.getNameByIds(user.get("dept_id"), HorizonCore.TENANT_IDENTIFIER.value());

获取流程变量值

java
runningdata.getFlowVar().getAllFlowVarMap()

修改流程变量值

java
getRunningdata().putValueToFlowVar("a", "2");

获取节点参数

java
// 获取当前节点参数
IFlowNode curNode = (IFlowNode) getParameter(StaticVarExtend.Parameter_Current_IFlowNode);
if (null != curNode) {
    for (INodePara iNodePara : curNode.getAllNodePara()) {
        System.out.println("节点参数:" + iNodePara.getParaId());
    }
}

// 获取执行事件的节点参数(进入事件常用)
IFlowNode eventNode = (IFlowNode) getParameter(StaticVarExtend.Parameter_IFlowNode);
if (null != eventNode) {
    for (INodePara iNodePara : eventNode.getAllNodePara()) {
        System.out.println("事件节点参数:" + iNodePara.getParaId());
    }
}

事件下拉框存储位置

事件下拉框存储在库表 TW_HZ_CUSTOMCLS 中,可通过 SQL 查询和插入方式同步到其他环境,执行后立即生效。

REST 方式配置说明

在 8.2.3 版本中,节点事件、自动节点以及办理人设置-自定义功能均新增了 REST 方式支持。需要业务系统新增 POST 接口,流程参数通过请求体传递。

配置步骤

  1. 选择实现方式:在事件配置页面选择「REST」方式

    REST方式配置

  2. 填写接口信息:输入接口地址和请求体

    请求体配置

  3. 保存配置:点击右上角「应用」按钮保存

接口回调说明

如需回调处理,可在工作流中新增实现类,并在接口回调位置配置类路径,例如:com.horizon.demo.event.EventDemo

参考资料

  • 主题:REST 方式示例说明(含流程节点事件/办理人设置-自定义/自动节点)
  • 链接点击访问

注意事项

  • 返回值return true 表示执行成功;return false 表示执行失败
  • 数据保存:使用 dataMap 存放 SQL 可与流程一起事务性提交