简单的干预脚本¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a4et4eln5o
脚本说明¶
该脚本用于对流程进行简单的干预操作。流程干预是指在流程运行过程中,通过脚本对流程进行人工干预,如跳过节点、回退、终止等操作。
常见实现方式¶
方式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){
// 跳过当前节点,直接到下一个节点
var params = createParamsTable();
params.setParameter("_skipNode", "true");
flowProcess.doSkipNode(flow, currentNode, params, getWebUser());
}
}
})();
方式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 params = createParamsTable();
params.setParameter("_attitude", "回退原因");
flowProcess.doBack(flow, targetNode, params, getWebUser());
}
}
})();
方式3:终止流程¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 终止流程
var params = createParamsTable();
params.setParameter("_attitude", "终止原因");
flowProcess.doTerminate(flow, params, getWebUser());
}
})();
方式4:根据条件进行干预¶
(function(){
var doc = getCurrentDocument();
var condition = doc.getItemValueAsString("条件字段");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var params = createParamsTable();
// 根据条件执行不同的干预操作
if(condition != null && condition === "跳过"){
var currentNode = flow.getCurrentNode();
if(currentNode != null){
flowProcess.doSkipNode(flow, currentNode, params, getWebUser());
}
}else if(condition != null && condition === "终止"){
params.setParameter("_attitude", "条件终止");
flowProcess.doTerminate(flow, params, getWebUser());
}
}
})();
扩展示例¶
示例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){
var params = createParamsTable();
params.setParameter("_skipNode", "true");
params.setParameter("_attitude", "自动跳过节点");
flowProcess.doSkipNode(flow, currentNode, params, getWebUser());
// 记录日志
var logSql = "insert into tlk_日志表 (item_文档ID, item_操作, item_时间) ";
logSql += "values ('"+docId+"', '跳过节点', '"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"')";
updateByDSName("数据源", logSql);
}
}
})();
示例2:回退到上一个节点¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 获取上一个节点
var currentNode = flow.getCurrentNode();
var nodes = flow.getNodes();
if(nodes != null && nodes.size() > 0){
var currentIndex = -1;
for(var i = 0; i < nodes.size(); i++){
if(nodes.get(i).getId() === currentNode.getId()){
currentIndex = i;
break;
}
}
// 回退到上一个节点
if(currentIndex > 0){
var previousNode = nodes.get(currentIndex - 1);
var params = createParamsTable();
params.setParameter("_attitude", "回退到上一节点");
flowProcess.doBack(flow, previousNode, params, getWebUser());
}
}
}
})();
示例3:根据金额终止流程¶
(function(){
var doc = getCurrentDocument();
var amount = doc.getItemValueAsDouble("金额");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 如果金额超过限制,终止流程
if(amount > 100000){
var params = createParamsTable();
params.setParameter("_attitude", "金额超过限制,流程终止");
flowProcess.doTerminate(flow, params, getWebUser());
// 设置文档状态
doc.findItem("流程状态").setValue("已终止");
}
}
})();
示例4:干预并更新审批意见¶
(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){
// 更新最后一条审批意见
var dName = sys_function.DATASOURCENAME;
var attitude = "干预操作:跳过节点";
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 = (SELECT ID FROM T_FLOWSTATERT WHERE DOCID = '"+docId+"')) ";
updateSql += " AND FLOWSTATERT_ID = (SELECT ID FROM T_FLOWSTATERT WHERE DOCID = '"+docId+"') ";
updateByDSName(dName, updateSql);
// 跳过节点
var params = createParamsTable();
flowProcess.doSkipNode(flow, currentNode, params, getWebUser());
}
}
})();
示例5:干预前验证权限¶
(function(){
var doc = getCurrentDocument();
var currentUser = getWebUser();
var userRole = currentUser.getRole();
// 验证是否有干预权限
var hasPermission = false;
if(userRole != null){
var roleName = userRole.getName();
if(roleName === "管理员" || roleName === "流程管理员"){
hasPermission = true;
}
}
if(!hasPermission){
return "您没有流程干预权限";
}
// 执行干预操作
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var currentNode = flow.getCurrentNode();
if(currentNode != null){
var params = createParamsTable();
params.setParameter("_attitude", "管理员干预");
flowProcess.doSkipNode(flow, currentNode, params, getWebUser());
return "干预成功";
}
}
return "干预失败";
})();
关键函数说明¶
getFlowProcess(): 获取流程处理对象flowProcess.doViewByDocument(doc): 根据文档获取流程对象flow.getCurrentNode(): 获取当前节点对象flow.getNodeById(nodeId): 根据节点ID获取节点对象flow.getNodes(): 获取所有节点列表flowProcess.doSkipNode(flow, node, params, user): 跳过节点- 参数1: 流程对象
- 参数2: 要跳过的节点对象
- 参数3: 参数表
- 参数4: 用户对象
flowProcess.doBack(flow, node, params, user): 回退到指定节点flowProcess.doTerminate(flow, params, user): 终止流程
干预操作类型¶
跳过节点¶
- 说明: 跳过当前节点,直接流转到下一个节点
- 使用场景: 某些条件下不需要经过某个节点
- 函数:
doSkipNode()
回退节点¶
- 说明: 回退到指定的节点
- 使用场景: 需要重新审批某个节点
- 函数:
doBack()
终止流程¶
- 说明: 终止整个流程
- 使用场景: 流程不符合条件需要终止
- 函数:
doTerminate()
注意事项¶
- ⚠️ 权限控制: 流程干预操作需要相应的权限,建议添加权限验证
- ⚠️ 操作时机: 干预操作通常在"提交前"或"节点进入前"脚本中执行
- ⚠️ 参数设置: 可以通过参数表设置干预原因等信息
- ⚠️ 流程状态: 干预操作会改变流程状态,需要谨慎使用
- 干预操作不可恢复,建议先确认再执行
- 建议记录干预日志,便于追溯
- 不同版本的API可能有所不同
使用场景¶
- 根据条件跳过节点
- 流程回退操作
- 流程终止操作
- 流程异常处理
- 流程自动化控制
如需查看完整脚本代码,请访问源文档链接。