跳转至

获取上一个节点的状态标签

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

脚本说明

该脚本用于获取流程中上一个节点的状态标签。在流程审批过程中,有时需要获取前一个节点的状态信息,用于业务逻辑判断或信息展示。

常见实现方式

方式1:通过审批历史查询

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

    // 查询当前流程状态
    var currentFlowSql = "select domainid,id,state_label ";
    currentFlowSql += "from t_flowstatert ";
    currentFlowSql += "where docid = '"+docId+"'";
    var currentFlow = findBySQL(currentFlowSql);

    if(currentFlow != null){
        var currentStateLabel = currentFlow.getItemValueAsString("state_label");

        // 查询审批历史,按处理时间倒序
        var sql = "select domainid,state_label,processtime ";
        sql += "from t_actorhis ";
        sql += "where flowstatert_id = '"+currentFlow.getId()+"' ";
        sql += "and state_label != '"+currentStateLabel+"' ";
        sql += "order by processtime desc limit 1";

        var previousNode = findBySQL(sql);

        if(previousNode != null){
            return previousNode.getItemValueAsString("state_label");
        }
    }

    return null;
})();

方式2:通过流程节点顺序查询

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

    // 查询流程节点历史,按处理时间排序
    var sql = "select domainid,state_label,processtime ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc";

    var history = queryBySQL(sql);

    if(history != null && history.size() > 0){
        // 获取第一条记录(上一个节点)
        var previousNode = history.get(0);
        return previousNode.getItemValueAsString("state_label");
    }

    return null;
})();

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

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

    if(flow != null){
        var currentStateLabel = doc.getStateLabel();
        var nodes = flow.getNodes();

        if(nodes != null && nodes.size() > 0){
            var currentIndex = -1;

            // 找到当前节点的索引
            for(var i = 0; i < nodes.size(); i++){
                var node = nodes.get(i);
                if(node.getStateLabel() === currentStateLabel){
                    currentIndex = i;
                    break;
                }
            }

            // 获取上一个节点
            if(currentIndex > 0){
                var previousNode = nodes.get(currentIndex - 1);
                return previousNode.getStateLabel();
            }
        }
    }

    return null;
})();

方式4:获取上一个节点的完整信息

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

    // 查询审批历史
    var sql = "select domainid,actor_name,state_label,attitude,processtime ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc limit 1";

    var previousNode = findBySQL(sql);

    if(previousNode != null){
        return {
            stateLabel: previousNode.getItemValueAsString("state_label"),
            actor: previousNode.getItemValueAsString("actor_name"),
            attitude: previousNode.getItemValueAsString("attitude"),
            processTime: format(previousNode.getItemValueAsDate("processtime"), "yyyy-MM-dd HH:mm:ss")
        };
    }

    return null;
})();

扩展示例

示例1:获取上一个节点状态并设置到字段

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

    var sql = "select domainid,state_label ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc limit 1";

    var previousNode = findBySQL(sql);

    if(previousNode != null){
        var previousStateLabel = previousNode.getItemValueAsString("state_label");
        doc.findItem("上一个节点").setValue(previousStateLabel);
        return previousStateLabel;
    }

    return null;
})();

示例2:根据上一个节点状态执行不同逻辑

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

    var sql = "select domainid,state_label ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc limit 1";

    var previousNode = findBySQL(sql);

    if(previousNode != null){
        var previousStateLabel = previousNode.getItemValueAsString("state_label");

        // 根据上一个节点状态执行不同逻辑
        if(previousStateLabel.indexOf("部门") >= 0){
            doc.findItem("处理方式").setValue("部门审批后");
        }else if(previousStateLabel.indexOf("财务") >= 0){
            doc.findItem("处理方式").setValue("财务审批后");
        }else{
            doc.findItem("处理方式").setValue("其他审批后");
        }

        return previousStateLabel;
    }

    return null;
})();

示例3:获取所有历史节点状态

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

    var sql = "select domainid,state_label,processtime ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "order by processtime";

    var history = queryBySQL(sql);
    var stateLabels = [];

    if(history != null && history.size() > 0){
        for(var it = history.iterator(); it.hasNext(); ){
            var h = it.next();
            var stateLabel = h.getItemValueAsString("state_label");
            if(!stateLabels.contains(stateLabel)){
                stateLabels.push(stateLabel);
            }
        }
    }

    // 获取上一个节点(倒数第二个)
    if(stateLabels.length >= 2){
        return stateLabels[stateLabels.length - 2];
    }else if(stateLabels.length == 1){
        return stateLabels[0];
    }

    return null;
})();

示例4:获取上一个节点的审批人信息

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

    var sql = "select domainid,actor_name,state_label,attitude ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc limit 1";

    var previousNode = findBySQL(sql);

    if(previousNode != null){
        return {
            stateLabel: previousNode.getItemValueAsString("state_label"),
            actor: previousNode.getItemValueAsString("actor_name"),
            attitude: previousNode.getItemValueAsString("attitude")
        };
    }

    return null;
})();

示例5:判断是否为第一个节点

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

    // 查询是否有上一个节点
    var sql = "select domainid,state_label ";
    sql += "from t_actorhis ";
    sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
    sql += "and state_label != '"+currentStateLabel+"' ";
    sql += "order by processtime desc limit 1";

    var previousNode = findBySQL(sql);

    if(previousNode == null){
        // 没有上一个节点,说明是第一个节点
        return {
            isFirstNode: true,
            previousStateLabel: null,
            message: "这是第一个节点"
        };
    }else{
        return {
            isFirstNode: false,
            previousStateLabel: previousNode.getItemValueAsString("state_label"),
            message: "上一个节点:" + previousNode.getItemValueAsString("state_label")
        };
    }
})();

关键函数说明

  • getCurrentDocument(): 获取当前文档对象
  • doc.getStateLabel(): 获取当前节点的状态标签
  • doc.getId(): 获取文档ID
  • getFlowProcess(): 获取流程处理对象
  • flowProcess.doViewByDocument(doc): 根据文档获取流程对象
  • queryBySQL(sql): 执行SQL查询
  • findBySQL(sql): 执行SQL查询并返回第一条记录

系统表说明

  • t_flowstatert: 流程状态运行时表,存储流程的运行时状态
  • t_actorhis: 流程执行人历史表,存储审批历史记录,包含状态标签信息

状态标签说明

  • 状态标签: 流程节点的显示名称,用于标识流程当前所在的节点
  • 获取方式: 通过 doc.getStateLabel() 或从 t_actorhis 表的 state_label 字段获取
  • 节点顺序: 通过 processtime(处理时间)排序来确定节点顺序

注意事项

  • ⚠️ 当前节点判断: 需要排除当前节点的状态标签,避免获取到当前节点
  • ⚠️ 排序方式: 使用 processtime desc 按处理时间倒序,获取最新的上一个节点
  • ⚠️ 第一个节点: 如果是第一个节点,可能没有上一个节点,需要判断返回值
  • ⚠️ 状态标签匹配: 状态标签需要完全匹配,注意大小写和空格
  • 查询时注意字段名称的正确性
  • 如果流程有多个分支,可能需要根据流程路径判断上一个节点
  • 建议在需要获取上一个节点信息时使用,如条件判断、信息展示等

使用场景

  • 根据上一个节点状态执行业务逻辑
  • 显示上一个节点信息
  • 流程节点状态判断
  • 流程回退判断
  • 流程信息展示

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