更新流程审批人¶
本文档内容来源于 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: 流程状态运行时IDnode_id: 节点IDactor_id: 审批人IDactor_name: 审批人姓名state: 状态(0=待处理,1=已处理)
更新审批人方式¶
方式1:完全替换¶
- 删除所有旧的审批人
- 添加新的审批人
- 适用于需要完全更换审批人的场景
方式2:追加审批人¶
- 保留原有审批人
- 只添加新的审批人
- 适用于需要增加审批人的场景
方式3:替换指定审批人¶
- 只替换指定的审批人
- 保留其他审批人
- 适用于部分审批人变更的场景
注意事项¶
- ⚠️ 审批人ID格式: 多个审批人ID用分号(;)分隔
- ⚠️ 用户存在性: 确保设置的审批人ID存在且有效
- ⚠️ 状态判断: 通常只更新
state = 0(待处理)的审批人 - ⚠️ 数据一致性: 需要同时更新流程对象和数据库表
- ⚠️ 权限控制: 更新审批人需要相应权限,建议添加权限验证
- 更新审批人后,原有审批人的待办任务可能会消失
- 建议记录更新日志,便于追溯
- 注意SQL语句的正确性,避免数据错误
使用场景¶
- 审批人变更
- 审批人调整
- 根据条件动态设置审批人
- 审批人追加
- 流程干预
如需查看完整脚本代码,请访问源文档链接。