跳转至

流程审批人脚本

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

脚本说明

该脚本用于设置或获取流程审批人。在流程审批过程中,经常需要动态设置审批人,或者获取当前节点的审批人信息。

常见实现方式

方式1:设置流程审批人

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

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

        if(currentNode != null){
            // 设置审批人(用户ID,多个用分号分隔)
            var approverIds = "用户ID1;用户ID2";
            currentNode.setActors(approverIds);

            // 或者设置审批人对象
            var actors = createObject("java.util.ArrayList");
            var user1 = getUserById("用户ID1");
            var user2 = getUserById("用户ID2");
            actors.add(user1);
            actors.add(user2);
            currentNode.setActors(actors);
        }
    }
})();

方式2:根据条件设置审批人

(function(){
    var doc = getCurrentDocument();
    var condition = doc.getItemValueAsString("条件字段");
    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            var approverIds = "";

            // 根据条件设置不同的审批人
            if(condition != null && condition === "类型1"){
                approverIds = "用户ID1;用户ID2";
            }else if(condition != null && condition === "类型2"){
                approverIds = "用户ID3;用户ID4";
            }else{
                approverIds = getWebUser().getId();  // 默认当前用户
            }

            currentNode.setActors(approverIds);
        }
    }
})();

方式3:根据角色设置审批人

(function(){
    var doc = getCurrentDocument();
    var roleName = "角色名称";
    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            // 获取角色下的所有用户
            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(";");
            }

            currentNode.setActors(approverIds);
        }
    }
})();

方式4:根据部门设置审批人

(function(){
    var doc = getCurrentDocument();
    var departmentName = doc.getItemValueAsString("部门字段");
    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            // 获取部门下的所有用户
            var department = getDepartmentByName(departmentName);
            var approverIds = "";

            if(department != null){
                var users = department.getUsers();
                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(";");
                }
            }

            currentNode.setActors(approverIds);
        }
    }
})();

扩展示例

示例1:设置审批人并记录日志

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

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

        if(currentNode != null){
            var approverIds = "用户ID1;用户ID2";
            currentNode.setActors(approverIds);

            // 记录到日志
            var logSql = "insert into tlk_日志表 (item_文档ID, item_审批人, item_设置时间) ";
            logSql += "values ('"+doc.getId()+"', '"+approverIds+"', '"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"')";
            updateByDSName("数据源", logSql);
        }
    }
})();

示例2:根据金额设置不同审批人

(function(){
    var doc = getCurrentDocument();
    var amount = doc.getItemValueAsDouble("金额");
    var flowProcess = getFlowProcess();
    var flow = flowProcess.doViewByDocument(doc);

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

        if(currentNode != null){
            var approverIds = "";

            // 根据金额设置不同的审批人
            if(amount <= 1000){
                approverIds = "部门经理ID";
            }else if(amount <= 10000){
                approverIds = "部门经理ID;财务经理ID";
            }else{
                approverIds = "部门经理ID;财务经理ID;总经理ID";
            }

            currentNode.setActors(approverIds);
        }
    }
})();

示例3:设置审批人并发送通知

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

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

        if(currentNode != null){
            var approverIds = "用户ID1;用户ID2";
            currentNode.setActors(approverIds);

            // 发送通知给审批人
            var ids = approverIds.split(";");
            for(var i = 0; i < ids.length; i++){
                if(ids[i] != null && ids[i].trim().length > 0){
                    sendMessage(ids[i], "您有新的待办事项需要处理");
                }
            }
        }
    }
})();

示例4:获取当前审批人并设置

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

    // 获取当前审批人
    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 sql = "select domainid,actor_id ";
        sql += "from t_actor ";
        sql += "where flowstatert_id = '"+flowStateId+"' ";
        sql += "and state = 0";

        var actors = queryBySQL(sql);
        var approverIds = "";

        if(actors != null && actors.size() > 0){
            var idList = [];
            for(var it = actors.iterator(); it.hasNext(); ){
                var actor = it.next();
                idList.push(actor.getItemValueAsString("actor_id"));
            }
            approverIds = idList.join(";");
        }

        // 设置到字段
        doc.findItem("审批人ID").setValue(approverIds);

        return approverIds;
    }

    return "";
})();

示例5:动态计算审批人

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

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

        if(currentNode != null){
            // 获取申请人
            var applicantId = doc.getAuthor();
            var applicant = getUserById(applicantId);

            // 获取申请人的部门
            var department = applicant != null ? applicant.getDepartment() : null;

            // 获取部门经理
            var approverIds = "";
            if(department != null){
                var manager = department.getManager();
                if(manager != null){
                    approverIds = manager.getId();
                }
            }

            // 如果没有部门经理,使用默认审批人
            if(approverIds == null || approverIds.trim().length == 0){
                approverIds = "默认审批人ID";
            }

            currentNode.setActors(approverIds);
        }
    }
})();

关键函数说明

  • getFlowProcess(): 获取流程处理对象
  • flowProcess.doViewByDocument(doc): 根据文档获取流程对象
  • flow.getCurrentNode(): 获取当前节点对象
  • node.setActors(ids): 设置节点审批人
  • 参数: 用户ID字符串,多个用分号分隔,或用户对象列表
  • getUsersByRole(roleName): 根据角色获取用户列表
  • getDepartmentByName(name): 根据部门名称获取部门对象
  • getUserById(userId): 根据用户ID获取用户对象

审批人设置方式

方式1:用户ID字符串

var approverIds = "用户ID1;用户ID2;用户ID3";
node.setActors(approverIds);

方式2:用户对象列表

var actors = createObject("java.util.ArrayList");
actors.add(getUserById("用户ID1"));
actors.add(getUserById("用户ID2"));
node.setActors(actors);

方式3:单个用户

var approverId = "用户ID";
node.setActors(approverId);

系统表说明

  • t_flowstatert: 流程状态运行时表,存储流程的运行时状态
  • t_actor: 流程执行人表,存储当前待处理的执行人信息
  • t_flow_node: 流程节点表,存储流程节点信息

注意事项

  • ⚠️ 设置时机: 通常在"提交前"或"节点进入前"脚本中设置审批人
  • ⚠️ 用户ID格式: 多个用户ID用分号(;)分隔
  • ⚠️ 用户存在性: 确保设置的用户ID存在且有效
  • ⚠️ 节点对象: 需要先获取节点对象才能设置审批人
  • 设置审批人后,流程会按照设置的审批人进行流转
  • 如果节点已有审批人,设置会覆盖原有审批人
  • 建议在设置前先判断节点是否存在

使用场景

  • 根据条件动态设置审批人
  • 根据角色或部门设置审批人
  • 根据金额或其他业务规则设置审批人
  • 流程审批人动态分配
  • 审批人权限控制

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