如何在工作流插件中获取当前节点后续的节点信息原创
金蝶云社区-JeremyG
JeremyG
12人赞赏了该文章 3265次浏览 未经作者许可,禁止转载编辑于2022年07月04日 17:48:38

关键字:工作流、后续节点信息


一、需求背景:

苍穹的工作流使用的时候,在流程到达某个审批节点的时候,想要获取该节点后续的节点信息。比如根据后续节点信息来发消息或者查看后续还有几级节点等。那么如何来获取当前节点的后续节点信息呢?

image.png


二、思路与方案:

  1. 在工作流插件的notify方法中完成该逻辑。

  2. 调试入参AgentExecution,发现没有获取剩余节点信息的方法,退而求其次,获取所有节点信息,然后自行判断


三、实现过程

实现代码:

import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
import kd.bos.workflow.api.AgentExecution;
import kd.bos.workflow.api.WorkflowElement;
import kd.bos.workflow.engine.dynprocess.freeflow.WFFlowElement;
import kd.bos.workflow.engine.dynprocess.freeflow.WFFlowNode;
import kd.bos.workflow.engine.extitf.IWorkflowPlugin;

import java.util.List;

public class GetWFInfoDemo implements IWorkflowPlugin {

    /**
     * 获取所有工作流节点信息
     * 节点信息的对象是 WFFlowElement
     *
     * @param e
     */
    @Override
    public void notify(AgentExecution e) {
        //获取当前审批的单据标识
        String entityNumber = e.getEntityNumber();
        Long processDefinitionId = e.getProcessDefinitionId();

        QFilter qFilter = new QFilter("entrabillid.number", "=", entityNumber);
        qFilter.and("enable", "=", "enable");

        //根据单据标识和已启用两个条件,查询wf_processdefinition(流程管理)实体,获取流程的标识和版本
        //这里要注意,根据实际情况可能还要加条件来定位具体的流程管理实体,因为一个单据可能对应多个已启用的流程管理实例,所以返回值可能不止一个
        DynamicObject wfProcessdefinition =
                BusinessDataServiceHelper.loadSingle("wf_processdefinition", "key,version", new QFilter[]{qFilter});
        String wfNumber = wfProcessdefinition.getString("key");
        String version = wfProcessdefinition.getString("version");

        //根据流程标识和版本获取流程所有的节点信息
        List<WFFlowElement> processElements = WorkflowServiceHelper.getProcessElements(wfNumber, version);
        //遍历所有节点和当前节点比较,如果是当前节点,则获取后续的节点数据
        WorkflowElement currentFlowElement = e.getCurrentFlowElement();
        String curEleId = currentFlowElement.getId();
        boolean flag = false;
        for (WFFlowElement processElement : processElements) {
            String processElementId = processElement.getId();
            if (!curEleId.equals(processElementId) && !flag) {
                continue;
            }
            flag = true;
            // 第一次进入的是当前节点,这里改成true,那么后续节点也会进来
            // 后续节点包括各类型的节点和线条,根据type区分
            String type = processElement.getType();
            // 获取后续节点执行逻辑。。。。
            // 如果只需要节点信息,可直接获取后续node节点信息,都封装在nextNodes中。如果要判断线条信息,可以遍历获取下个processElement对象
            List<WFFlowNode> nextNodes = processElement.getNextNodes();
            String number = processElement.getNumber();
            System.out.println("----------");

        }
    }
}

并在对应的工作流节点注册插件

image.png


四、实现效果

我们看到代码中已经获取到当前节点信息及后续节点信息,可以执行剩下的逻辑

image.png

五、开发环境版本

不限


六、注意事项

该代码只完成了获取后续节点的部分,剩余的业务逻辑可自行根据实际情况完成。


七、参考资料:

【开发平台】指导手册
学习成长中心

金蝶云苍穹流程服务API手册

金蝶云苍穹工作流插件开发指南




如果发现文章有什么问题欢迎大家指出,我将积极验证修改。如果有帮到你,还请来一波三连:关注,点赞,收藏。觉得有用也可以分享到公司云之家群,惠及其他同事,感谢您的耐心观看~~~


赞 12