跳转至

更新流程审批人

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

脚本说明

该脚本用于更新流程中的审批人。在流程运行过程中,有时需要动态更新当前节点的审批人,比如审批人变更、审批人调整等场景。

常见实现方式

方式1:更新当前节点的审批人

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var newApproverIds = "新审批人ID1;新审批人ID2";

    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            // 更新审批人
            currentNode.setActors(newApproverIds);

            // 更新流程状态
            var dName = sys_function.DATASOURCENAME;
            var flowStateSql = "select domainid,id ";
            flowStateSql += "from t_flowstatert ";
            flowStateSql += "where docid = '"+docId+"'";
            var flowState = findBySQL(flowStateSql);

            if(flowState != null){
                var flowStateId = flowState.getId();
                var nodeId = currentNode.getId();

                // 删除旧的审批人
                var deleteSql = " DELETE FROM T_ACTOR ";
                deleteSql += " WHERE FLOWSTATERT_ID = '"+flowStateId+"' ";
                deleteSql += " AND NODE_ID = '"+nodeId+"' ";
                deleteSql += " AND STATE = 0";
                updateByDSName(dName, deleteSql);

                // 添加新的审批人
                var ids = newApproverIds.split(";");
                for(var i = 0; i < ids.length; i++){
                    if(ids[i] != null && ids[i].trim().length > 0){
                        var user = getUserById(ids[i]);
                        if(user != null){
                            var insertSql = " INSERT INTO T_ACTOR (domainid,flowstatert_id,node_id,actor_id,actor_name,state) ";
                            insertSql += " VALUES ('"+getWebUser().getDomainid()+"', '"+flowStateId+"', '"+nodeId+"', '"+ids[i]+"', '"+user.getName()+"', 0)";
                            updateByDSName(dName, insertSql);
                        }
                    }
                }
            }

            return "审批人更新成功";
        }
    }

    return "审批人更新失败";
})();

方式2:通过SQL直接更新审批人

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var newApproverIds = "新审批人ID1;新审批人ID2";

    var dName = sys_function.DATASOURCENAME;
    var flowStateSql = "select domainid,id ";
    flowStateSql += "from t_flowstatert ";
    flowStateSql += "where docid = '"+docId+"'";
    var flowState = findBySQL(flowStateSql);

    if(flowState != null){
        var flowStateId = flowState.getId();

        // 获取当前节点ID
        var currentNodeSql = "select domainid,current_node_id ";
        currentNodeSql += "from t_flowstatert ";
        currentNodeSql += "where id = '"+flowStateId+"'";
        var currentFlow = findBySQL(currentNodeSql);

        if(currentFlow != null){
            var nodeId = currentFlow.getItemValueAsString("current_node_id");

            // 删除旧的审批人
            var deleteSql = " DELETE FROM T_ACTOR ";
            deleteSql += " WHERE FLOWSTATERT_ID = '"+flowStateId+"' ";
            deleteSql += " AND NODE_ID = '"+nodeId+"' ";
            deleteSql += " AND STATE = 0";
            updateByDSName(dName, deleteSql);

            // 添加新的审批人
            var ids = newApproverIds.split(";");
            for(var i = 0; i < ids.length; i++){
                if(ids[i] != null && ids[i].trim().length > 0){
                    var user = getUserById(ids[i]);
                    if(user != null){
                        var insertSql = " INSERT INTO T_ACTOR (domainid,flowstatert_id,node_id,actor_id,actor_name,state) ";
                        insertSql += " VALUES ('"+getWebUser().getDomainid()+"', '"+flowStateId+"', '"+nodeId+"', '"+ids[i]+"', '"+user.getName()+"', 0)";
                        updateByDSName(dName, insertSql);
                    }
                }
            }

            return "审批人更新成功";
        }
    }

    return "审批人更新失败";
})();

方式3:根据条件更新审批人

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var condition = doc.getItemValueAsString("条件字段");

    var newApproverIds = "";

    // 根据条件选择不同的审批人
    if(condition != null && condition === "类型1"){
        newApproverIds = "审批人ID1;审批人ID2";
    }else if(condition != null && condition === "类型2"){
        newApproverIds = "审批人ID3;审批人ID4";
    }else{
        return "条件不符合,无法更新审批人";
    }

    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            currentNode.setActors(newApproverIds);

            // 更新数据库中的审批人...
            return "审批人更新成功";
        }
    }

    return "审批人更新失败";
})();

方式4:追加审批人(不删除原有)

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var additionalApproverIds = "追加审批人ID1;追加审批人ID2";

    var dName = sys_function.DATASOURCENAME;
    var flowStateSql = "select domainid,id ";
    flowStateSql += "from t_flowstatert ";
    flowStateSql += "where docid = '"+docId+"'";
    var flowState = findBySQL(flowStateSql);

    if(flowState != null){
        var flowStateId = flowState.getId();

        var currentNodeSql = "select domainid,current_node_id ";
        currentNodeSql += "from t_flowstatert ";
        currentNodeSql += "where id = '"+flowStateId+"'";
        var currentFlow = findBySQL(currentNodeSql);

        if(currentFlow != null){
            var nodeId = currentFlow.getItemValueAsString("current_node_id");

            // 只添加新的审批人,不删除原有的
            var ids = additionalApproverIds.split(";");
            for(var i = 0; i < ids.length; i++){
                if(ids[i] != null && ids[i].trim().length > 0){
                    // 检查是否已存在
                    var checkSql = "select domainid ";
                    checkSql += "from t_actor ";
                    checkSql += "where flowstatert_id = '"+flowStateId+"' ";
                    checkSql += "and node_id = '"+nodeId+"' ";
                    checkSql += "and actor_id = '"+ids[i]+"'";

                    var exists = countBySQL(checkSql);

                    if(exists == 0){
                        var user = getUserById(ids[i]);
                        if(user != null){
                            var insertSql = " INSERT INTO T_ACTOR (domainid,flowstatert_id,node_id,actor_id,actor_name,state) ";
                            insertSql += " VALUES ('"+getWebUser().getDomainid()+"', '"+flowStateId+"', '"+nodeId+"', '"+ids[i]+"', '"+user.getName()+"', 0)";
                            updateByDSName(dName, insertSql);
                        }
                    }
                }
            }

            return "审批人追加成功";
        }
    }

    return "审批人追加失败";
})();

扩展示例

示例1:更新审批人并记录日志

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var newApproverIds = "新审批人ID1;新审批人ID2";
    var oldApproverIds = "";

    // 获取旧的审批人
    var flowStateSql = "select domainid,id ";
    flowStateSql += "from t_flowstatert ";
    flowStateSql += "where docid = '"+docId+"'";
    var flowState = findBySQL(flowStateSql);

    if(flowState != null){
        var flowStateId = flowState.getId();

        var oldSql = "select domainid,actor_id ";
        oldSql += "from t_actor ";
        oldSql += "where flowstatert_id = '"+flowStateId+"' ";
        oldSql += "and state = 0";

        var oldActors = queryBySQL(oldSql);
        var oldList = [];
        if(oldActors != null && oldActors.size() > 0){
            for(var it = oldActors.iterator(); it.hasNext(); ){
                oldList.push(it.next().getItemValueAsString("actor_id"));
            }
        }
        oldApproverIds = oldList.join(";");

        // 更新审批人(使用方式1或方式2的代码)...

        // 记录日志
        var dName = sys_function.DATASOURCENAME;
        var logSql = "insert into tlk_流程日志 (item_文档ID, item_操作类型, item_原审批人, item_新审批人, item_操作人, item_操作时间) ";
        logSql += "values ('"+docId+"', '更新审批人', '"+oldApproverIds+"', '"+newApproverIds+"', '"+getWebUser().getName()+"', '"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"')";
        updateByDSName(dName, logSql);

        return "审批人更新成功,已记录日志";
    }

    return "审批人更新失败";
})();

示例2:根据角色更新审批人

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var roleName = "角色名称";

    // 获取角色下的所有用户
    var users = getUsersByRole(roleName);
    var approverIds = "";

    if(users != null && users.size() > 0){
        var idList = [];
        for(var i = 0; i < users.size(); i++){
            idList.push(users.get(i).getId());
        }
        approverIds = idList.join(";");
    }

    if(approverIds.trim().length == 0){
        return "角色下没有用户,无法更新审批人";
    }

    // 更新审批人(使用方式1或方式2的代码)...

    return "审批人更新成功";
})();

示例3:更新审批人并发送通知

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var newApproverIds = "新审批人ID1;新审批人ID2";

    // 更新审批人(使用方式1或方式2的代码)...

    // 发送通知给新审批人
    var ids = newApproverIds.split(";");
    for(var i = 0; i < ids.length; i++){
        if(ids[i] != null && ids[i].trim().length > 0){
            sendMessage(ids[i], "您已被设置为流程审批人,请及时处理");
        }
    }

    return "审批人更新成功,已发送通知";
})();

示例4:替换指定审批人

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var oldApproverId = "旧审批人ID";
    var newApproverId = "新审批人ID";

    var dName = sys_function.DATASOURCENAME;
    var flowStateSql = "select domainid,id ";
    flowStateSql += "from t_flowstatert ";
    flowStateSql += "where docid = '"+docId+"'";
    var flowState = findBySQL(flowStateSql);

    if(flowState != null){
        var flowStateId = flowState.getId();

        // 更新指定审批人
        var updateSql = " UPDATE T_ACTOR SET ACTOR_ID = '"+newApproverId+"', ACTOR_NAME = (SELECT NAME FROM T_USER WHERE ID = '"+newApproverId+"') ";
        updateSql += " WHERE FLOWSTATERT_ID = '"+flowStateId+"' ";
        updateSql += " AND ACTOR_ID = '"+oldApproverId+"' ";
        updateSql += " AND STATE = 0";
        updateByDSName(dName, updateSql);

        return "审批人替换成功";
    }

    return "审批人替换失败";
})();

示例5:更新审批人并验证

(function(){
    var doc = getCurrentDocument();
    var docId = doc.getId();
    var newApproverIds = "新审批人ID1;新审批人ID2";

    // 验证审批人是否存在
    var ids = newApproverIds.split(";");
    var validIds = [];

    for(var i = 0; i < ids.length; i++){
        if(ids[i] != null && ids[i].trim().length > 0){
            var user = getUserById(ids[i]);
            if(user != null){
                validIds.push(ids[i]);
            }
        }
    }

    if(validIds.length == 0){
        return "没有有效的审批人,无法更新";
    }

    var validApproverIds = validIds.join(";");

    // 更新审批人(使用方式1或方式2的代码)...

    return "审批人更新成功,共更新 " + validIds.length + " 个审批人";
})();

关键函数说明

  • getFlowProcess(): 获取流程处理对象
  • flowProcess.doViewByDocument(doc): 根据文档获取流程对象
  • flow.getCurrentNode(): 获取当前节点对象
  • node.setActors(ids): 设置节点审批人
  • updateByDSName(dName, sql): 在指定数据源中执行SQL更新语句
  • sys_function.DATASOURCENAME: 获取数据源名称
  • getUserById(userId): 根据用户ID获取用户对象
  • getUsersByRole(roleName): 根据角色获取用户列表

系统表说明

  • t_flowstatert: 流程状态运行时表,存储流程的运行时状态
  • t_actor: 流程执行人表,存储当前待处理的执行人信息
  • flowstatert_id: 流程状态运行时ID
  • node_id: 节点ID
  • actor_id: 审批人ID
  • actor_name: 审批人姓名
  • state: 状态(0=待处理,1=已处理)

更新审批人方式

方式1:完全替换

  • 删除所有旧的审批人
  • 添加新的审批人
  • 适用于需要完全更换审批人的场景

方式2:追加审批人

  • 保留原有审批人
  • 只添加新的审批人
  • 适用于需要增加审批人的场景

方式3:替换指定审批人

  • 只替换指定的审批人
  • 保留其他审批人
  • 适用于部分审批人变更的场景

注意事项

  • ⚠️ 审批人ID格式: 多个审批人ID用分号(;)分隔
  • ⚠️ 用户存在性: 确保设置的审批人ID存在且有效
  • ⚠️ 状态判断: 通常只更新 state = 0(待处理)的审批人
  • ⚠️ 数据一致性: 需要同时更新流程对象和数据库表
  • ⚠️ 权限控制: 更新审批人需要相应权限,建议添加权限验证
  • 更新审批人后,原有审批人的待办任务可能会消失
  • 建议记录更新日志,便于追溯
  • 注意SQL语句的正确性,避免数据错误

使用场景

  • 审批人变更
  • 审批人调整
  • 根据条件动态设置审批人
  • 审批人追加
  • 流程干预

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