跳转至

获取当前流程节点ID及名称

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a4j5qtfe65

脚本说明

该脚本用于获取当前流程节点的ID和名称。在流程审批过程中,经常需要获取当前所在节点的信息,用于业务逻辑判断或信息展示。

常见实现方式

方式1:通过文档状态标签获取

(function(){
    var doc = getCurrentDocument();
    var stateLabel = doc.getStateLabel();  // 节点名称
    var state = doc.getState();  // 节点状态

    // 通过状态标签查询节点ID
    var sql = "select domainid,id,node_name ";
    sql += "from t_flow_node ";
    sql += "where node_name = '"+stateLabel+"' ";
    sql += "and flow_id = (select flow_id from t_flowstatert where docid = '"+doc.getId()+"')";

    var node = findBySQL(sql);

    if(node != null){
        return {
            nodeId: node.getId(),
            nodeName: node.getItemValueAsString("node_name")
        };
    }

    return {
        nodeId: "",
        nodeName: stateLabel
    };
})();

方式2:通过流程状态表获取

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();

    // 查询当前流程状态
    var sql = "select domainid,fs.id,fs.current_node_id,fs.current_node_name ";
    sql += "from t_flowstatert fs ";
    sql += "where fs.docid = '"+docId+"'";

    var flowState = findBySQL(sql);

    if(flowState != null){
        return {
            nodeId: flowState.getItemValueAsString("current_node_id"),
            nodeName: flowState.getItemValueAsString("current_node_name")
        };
    }

    return null;
})();

方式3:通过流程对象获取

(function(){
    var doc = getCurrentDocument();
    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

    if(flow != null){
        var currentNode = flow.getCurrentNode();

        if(currentNode != null){
            return {
                nodeId: currentNode.getId(),
                nodeName: currentNode.getName()
            };
        }
    }

    return null;
})();

方式4:通过文档状态获取

(function(){
    var doc = getCurrentDocument();
    var stateLabel = doc.getStateLabel();
    var state = doc.getState();

    // 通过状态查询节点
    var sql = "select domainid,n.id,n.node_name ";
    sql += "from t_flow_node n ";
    sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
    sql += "where fs.docid = '"+doc.getId()+"' ";
    sql += "and n.node_name = '"+stateLabel+"'";

    var node = findBySQL(sql);

    if(node != null){
        return {
            nodeId: node.getId(),
            nodeName: node.getItemValueAsString("node_name"),
            state: state,
            stateLabel: stateLabel
        };
    }

    return {
        nodeId: "",
        nodeName: stateLabel,
        state: state,
        stateLabel: stateLabel
    };
})();

扩展示例

示例1:获取节点信息并设置到字段

(function(){
    var doc = getCurrentDocument();
    var stateLabel = doc.getStateLabel();

    var sql = "select domainid,n.id,n.node_name ";
    sql += "from t_flow_node n ";
    sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
    sql += "where fs.docid = '"+doc.getId()+"' ";
    sql += "and n.node_name = '"+stateLabel+"'";

    var node = findBySQL(sql);

    if(node != null){
        var nodeId = node.getId();
        var nodeName = node.getItemValueAsString("node_name");

        // 设置到字段
        doc.findItem("当前节点ID").setValue(nodeId);
        doc.findItem("当前节点名称").setValue(nodeName);

        return nodeName;
    }else{
        // 如果没有找到节点,使用状态标签
        doc.findItem("当前节点名称").setValue(stateLabel);
        return stateLabel;
    }
})();

示例2:获取节点信息及流程信息

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();

    var sql = "select domainid,fs.id,fs.flow_id,fs.current_node_id,fs.current_node_name, ";
    sql += "f.flow_name ";
    sql += "from t_flowstatert fs ";
    sql += "inner join t_flow f on fs.flow_id = f.id ";
    sql += "where fs.docid = '"+docId+"'";

    var flowState = findBySQL(sql);

    if(flowState != null){
        return {
            nodeId: flowState.getItemValueAsString("current_node_id"),
            nodeName: flowState.getItemValueAsString("current_node_name"),
            flowId: flowState.getItemValueAsString("flow_id"),
            flowName: flowState.getItemValueAsString("flow_name")
        };
    }

    return null;
})();

示例3:根据节点名称执行不同逻辑

(function(){
    var doc = getCurrentDocument();
    var stateLabel = doc.getStateLabel();

    var sql = "select domainid,n.id,n.node_name,n.node_type ";
    sql += "from t_flow_node n ";
    sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
    sql += "where fs.docid = '"+doc.getId()+"' ";
    sql += "and n.node_name = '"+stateLabel+"'";

    var node = findBySQL(sql);

    if(node != null){
        var nodeName = node.getItemValueAsString("node_name");
        var nodeType = node.getItemValueAsString("node_type");

        // 根据节点名称执行不同逻辑
        if(nodeName.indexOf("部门") >= 0){
            doc.findItem("处理方式").setValue("部门审批");
        }else if(nodeName.indexOf("财务") >= 0){
            doc.findItem("处理方式").setValue("财务审批");
        }else if(nodeName.indexOf("总经理") >= 0){
            doc.findItem("处理方式").setValue("总经理审批");
        }

        return {
            nodeId: node.getId(),
            nodeName: nodeName,
            nodeType: nodeType
        };
    }

    return null;
})();

示例4:获取节点信息及审批人信息

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();

    // 获取节点信息
    var sql = "select domainid,fs.id,fs.current_node_id,fs.current_node_name ";
    sql += "from t_flowstatert fs ";
    sql += "where fs.docid = '"+docId+"'";

    var flowState = findBySQL(sql);

    if(flowState != null){
        var nodeId = flowState.getItemValueAsString("current_node_id");
        var nodeName = flowState.getItemValueAsString("current_node_name");
        var flowStateId = flowState.getId();

        // 获取当前节点审批人
        var actorSql = "select domainid,actor_name ";
        actorSql += "from t_actor ";
        actorSql += "where flowstatert_id = '"+flowStateId+"' ";
        actorSql += "and state = 0";

        var actors = queryBySQL(actorSql);
        var actorList = [];

        if(actors != null && actors.size() > 0){
            for(var it = actors.iterator(); it.hasNext(); ){
                var actor = it.next();
                actorList.push(actor.getItemValueAsString("actor_name"));
            }
        }

        return {
            nodeId: nodeId,
            nodeName: nodeName,
            actors: actorList
        };
    }

    return null;
})();

示例5:格式化显示节点信息

(function(){
    var doc = getCurrentDocument();
    var stateLabel = doc.getStateLabel();

    var sql = "select domainid,n.id,n.node_name ";
    sql += "from t_flow_node n ";
    sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
    sql += "where fs.docid = '"+doc.getId()+"' ";
    sql += "and n.node_name = '"+stateLabel+"'";

    var node = findBySQL(sql);

    if(node != null){
        var nodeId = node.getId();
        var nodeName = node.getItemValueAsString("node_name");
        return "当前节点:" + nodeName + "(ID:" + nodeId + ")";
    }else{
        return "当前节点:" + stateLabel;
    }
})();

关键函数说明

  • getCurrentDocument(): 获取当前文档对象
  • doc.getStateLabel(): 获取当前节点的状态标签(节点名称)
  • doc.getState(): 获取当前节点的状态
  • doc.getId(): 获取文档ID
  • getFlowProcess(): 获取流程处理对象
  • flowProcess.doViewByDocument(doc): 根据文档获取流程对象
  • flow.getCurrentNode(): 获取当前节点对象
  • node.getId(): 获取节点ID
  • node.getName(): 获取节点名称

系统表说明

  • t_flowstatert: 流程状态运行时表,存储流程的运行时状态
  • current_node_id: 当前节点ID
  • current_node_name: 当前节点名称
  • t_flow_node: 流程节点表,存储流程节点信息
  • id: 节点ID
  • node_name: 节点名称
  • node_type: 节点类型
  • t_flow: 流程表,存储流程基本信息

节点信息说明

  • 节点ID: 流程节点的唯一标识
  • 节点名称: 流程节点的显示名称(状态标签)
  • 节点状态: 节点的状态值
  • 状态标签: 通过 doc.getStateLabel() 获取,通常是节点名称

注意事项

  • ⚠️ 状态标签: doc.getStateLabel() 返回的是节点名称,可以直接使用
  • ⚠️ 节点ID查询: 需要通过节点名称查询节点ID,注意节点名称的匹配
  • ⚠️ 流程关联: 查询节点时需要关联流程ID,确保查询到正确的节点
  • ⚠️ 空值判断: 节点可能不存在,需要判断返回值
  • 不同版本的API可能有所不同
  • 查询时注意字段名称的正确性
  • 节点名称可能包含特殊字符,需要注意SQL转义

使用场景

  • 显示当前节点信息
  • 根据节点执行业务逻辑
  • 节点权限判断
  • 节点信息记录
  • 流程信息展示

如需查看完整脚本代码,请访问源文档链接。