干预提交(类似后台的流程监控)¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a67s5jbkfd
脚本说明¶
该脚本用于对流程进行干预提交操作,类似于后台的流程监控功能。可以在不经过正常审批流程的情况下,对流程进行提交、回退、终止等操作,通常用于流程异常处理或管理员的流程干预。
常见实现方式¶
方式1:干预提交到指定节点¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
// 干预提交到指定节点
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
params.setParameter("_intervention", "true");
// 直接提交到目标节点
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
return "干预提交成功";
}
}
return "干预提交失败";
})();
方式2:干预提交并更新审批历史¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
// 更新审批历史
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 attitude = "管理员干预提交到节点:" + targetNode.getName();
// 更新最后一条审批意见
var updateSql = " UPDATE T_ACTORHIS SET [ATTITUDE] = '"+attitude+"' ";
updateSql += " WHERE PROCESSTIME = ";
updateSql += " (SELECT MAX(PROCESSTIME) FROM T_ACTORHIS ";
updateSql += " WHERE DOC_ID = '"+docId+"' ";
updateSql += " AND FLOWSTATERT_ID = '"+flowStateId+"') ";
updateSql += " AND FLOWSTATERT_ID = '"+flowStateId+"' ";
updateByDSName(dName, updateSql);
}
// 执行干预提交
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预");
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
return "干预提交成功";
}
}
return "干预提交失败";
})();
方式3:干预提交并记录监控日志¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
var currentUser = getWebUser();
// 记录监控日志
var dName = sys_function.DATASOURCENAME;
var logSql = "insert into tlk_流程监控日志 (item_文档ID, item_操作类型, item_操作人, item_目标节点, item_操作时间) ";
logSql += "values ('"+docId+"', '干预提交', '"+currentUser.getName()+"', '"+targetNode.getName()+"', '"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"')";
updateByDSName(dName, logSql);
// 执行干预提交
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
flowProcess.doSubmit(flow, targetNode, params, currentUser);
return "干预提交成功,已记录监控日志";
}
}
return "干预提交失败";
})();
方式4:根据条件干预提交¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var condition = doc.getItemValueAsString("条件字段");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNodeId = "";
// 根据条件选择目标节点
if(condition != null && condition === "类型1"){
targetNodeId = "节点ID1";
}else if(condition != null && condition === "类型2"){
targetNodeId = "节点ID2";
}else{
return "条件不符合,无法干预提交";
}
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
var params = createParamsTable();
params.setParameter("_attitude", "条件干预提交");
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
return "干预提交成功";
}
}
return "干预提交失败";
})();
扩展示例¶
示例1:干预提交并更新文档状态¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
// 更新文档字段
doc.findItem("干预操作").setValue("是");
doc.findItem("干预时间").setValue(format(new Date(), "yyyy-MM-dd HH:mm:ss"));
doc.findItem("干预人").setValue(getWebUser().getName());
doc.findItem("目标节点").setValue(targetNode.getName());
// 执行干预提交
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
// 保存文档
var docProcess = getDocumentProcess();
docProcess.doUpdate(doc);
return "干预提交成功";
}
}
return "干预提交失败";
})();
示例2:干预提交前验证权限¶
(function(){
var currentUser = getWebUser();
var userRole = currentUser.getRole();
// 验证是否有干预权限
var hasPermission = false;
if(userRole != null){
var roleName = userRole.getName();
if(roleName === "管理员" || roleName === "流程管理员" || roleName === "系统管理员"){
hasPermission = true;
}
}
if(!hasPermission){
return "您没有流程干预权限,无法执行干预提交";
}
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
flowProcess.doSubmit(flow, targetNode, params, currentUser);
return "干预提交成功";
}
}
return "干预提交失败";
})();
示例3:干预提交并发送通知¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
// 获取目标节点的审批人
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 params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
// 发送通知给目标节点审批人
var actorSql = "select domainid,actor_id ";
actorSql += "from t_actor ";
actorSql += "where flowstatert_id = '"+flowStateId+"' ";
actorSql += "and node_id = '"+targetNodeId+"' ";
actorSql += "and state = 0";
var actors = queryBySQL(actorSql);
if(actors != null && actors.size() > 0){
for(var it = actors.iterator(); it.hasNext(); ){
var actor = it.next();
var actorId = actor.getItemValueAsString("actor_id");
sendMessage(actorId, "流程已通过干预提交到您的节点,请及时处理");
}
}
return "干预提交成功,已发送通知";
}
}
}
return "干预提交失败";
})();
示例4:批量干预提交¶
(function(){
var docIds = ["docId1", "docId2", "docId3"];
var targetNodeId = "目标节点ID";
var successCount = 0;
var failCount = 0;
for(var i = 0; i < docIds.length; i++){
var docId = docIds[i];
var docProcess = getDocumentProcess();
var doc = docProcess.doView(docId);
if(doc != null){
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
if(targetNode != null){
var params = createParamsTable();
params.setParameter("_attitude", "批量干预提交");
flowProcess.doSubmit(flow, targetNode, params, getWebUser());
successCount++;
}else{
failCount++;
}
}else{
failCount++;
}
}else{
failCount++;
}
}
return "成功:" + successCount + ",失败:" + failCount;
})();
示例5:干预提交并记录详细日志¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var targetNodeId = "目标节点ID";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var targetNode = flow.getNodeById(targetNodeId);
var currentNode = flow.getCurrentNode();
if(targetNode != null){
var currentUser = getWebUser();
var dName = sys_function.DATASOURCENAME;
// 记录详细监控日志
var logSql = "insert into tlk_流程监控日志 (";
logSql += "item_文档ID, item_文档名称, item_流程名称, ";
logSql += "item_当前节点, item_目标节点, item_操作类型, ";
logSql += "item_操作人, item_操作时间, item_操作原因";
logSql += ") values (";
logSql += "'"+docId+"', ";
logSql += "'"+doc.getItemValueAsString("名称")+"', ";
logSql += "'"+flow.getName()+"', ";
logSql += "'"+(currentNode != null ? currentNode.getName() : "")+"', ";
logSql += "'"+targetNode.getName()+"', ";
logSql += "'干预提交', ";
logSql += "'"+currentUser.getName()+"', ";
logSql += "'"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"', ";
logSql += "'管理员干预提交'";
logSql += ")";
updateByDSName(dName, logSql);
// 执行干预提交
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预提交");
flowProcess.doSubmit(flow, targetNode, params, currentUser);
return "干预提交成功,已记录详细日志";
}
}
return "干预提交失败";
})();
关键函数说明¶
getFlowProcess(): 获取流程处理对象flowProcess.doViewByDocument(doc): 根据文档获取流程对象flow.getNodeById(nodeId): 根据节点ID获取节点对象flow.getCurrentNode(): 获取当前节点对象flowProcess.doSubmit(flow, node, params, user): 提交流程到指定节点- 参数1: 流程对象
- 参数2: 目标节点对象
- 参数3: 参数表
- 参数4: 用户对象
updateByDSName(dName, sql): 在指定数据源中执行SQL更新语句sys_function.DATASOURCENAME: 获取数据源名称
干预提交说明¶
- 干预提交: 管理员或具有权限的用户对流程进行人工干预,直接提交到指定节点
- 类似流程监控: 类似于后台流程监控功能,可以对流程进行强制操作
- 用途: 用于流程异常处理、流程加速、流程纠正等场景
- 特点: 不经过正常的审批流程,直接跳转到目标节点
系统表说明¶
- t_flowstatert: 流程状态运行时表,存储流程的运行时状态
- t_actor: 流程执行人表,存储当前待处理的执行人信息
- t_actorhis: 流程执行人历史表,存储审批历史记录
- tlk_流程监控日志: 流程监控日志表(如果存在),用于记录干预操作
注意事项¶
- ⚠️ 权限控制: 干预提交需要管理员或特殊权限,建议添加权限验证
- ⚠️ 目标节点: 需要确保目标节点ID正确且存在
- ⚠️ 流程状态: 干预提交会改变流程状态,需要谨慎使用
- ⚠️ 日志记录: 建议记录干预操作的详细日志,便于追溯
- ⚠️ 审批历史: 建议更新审批历史,记录干预原因
- 干预提交会跳过正常的审批流程,需要谨慎使用
- 建议在干预前先确认流程状态和目标节点
- 不同版本的API可能有所不同
使用场景¶
- 流程异常处理
- 流程加速
- 流程纠正
- 管理员干预
- 流程监控操作
如需查看完整脚本代码,请访问源文档链接。