终止流程¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1kd9dqk95sp
脚本说明¶
该脚本用于终止流程。流程终止是指强制结束流程,流程将不再继续流转,通常用于流程异常、业务取消等场景。
常见实现方式¶
方式1:基本终止流程¶
(function(){
var doc = getCurrentDocument();
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var params = createParamsTable();
params.setParameter("_attitude", "流程终止");
flowProcess.doTerminate(flow, params, getWebUser());
return "流程终止成功";
}
return "流程终止失败";
})();
方式2:终止流程并更新审批历史¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = "终止原因";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != 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 = "流程终止:" + terminateReason;
// 更新最后一条审批意见
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", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
return "流程终止成功";
}
return "流程终止失败";
})();
方式3:终止流程并更新文档状态¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = doc.getItemValueAsString("终止原因");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 更新文档字段
doc.findItem("流程状态").setValue("已终止");
doc.findItem("终止时间").setValue(format(new Date(), "yyyy-MM-dd HH:mm:ss"));
doc.findItem("终止人").setValue(getWebUser().getName());
doc.findItem("终止原因").setValue(terminateReason);
// 执行终止
var params = createParamsTable();
params.setParameter("_attitude", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
// 保存文档
var docProcess = getDocumentProcess();
docProcess.doUpdate(doc);
return "流程终止成功";
}
return "流程终止失败";
})();
方式4:根据条件终止流程¶
(function(){
var doc = getCurrentDocument();
var condition = doc.getItemValueAsString("条件字段");
// 根据条件判断是否终止
if(condition == null || condition !== "终止"){
return "条件不符合,无法终止流程";
}
var terminateReason = doc.getItemValueAsString("终止原因");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var params = createParamsTable();
params.setParameter("_attitude", terminateReason != null ? terminateReason : "条件终止");
flowProcess.doTerminate(flow, params, getWebUser());
return "流程终止成功";
}
return "流程终止失败";
})();
扩展示例¶
示例1:终止流程并记录日志¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = "终止原因";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 记录终止日志
var dName = sys_function.DATASOURCENAME;
var logSql = "insert into tlk_流程日志 (item_文档ID, item_操作类型, item_终止原因, item_操作人, item_操作时间) ";
logSql += "values ('"+docId+"', '终止流程', '"+terminateReason+"', '"+getWebUser().getName()+"', '"+format(new Date(), "yyyy-MM-dd HH:mm:ss")+"')";
updateByDSName(dName, logSql);
// 执行终止
var params = createParamsTable();
params.setParameter("_attitude", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
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 terminateReason = doc.getItemValueAsString("终止原因");
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var params = createParamsTable();
params.setParameter("_attitude", terminateReason != null ? terminateReason : "管理员终止");
flowProcess.doTerminate(flow, params, currentUser);
return "流程终止成功";
}
return "流程终止失败";
})();
示例3:终止流程并发送通知¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = "终止原因";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 获取文档作者
var authorId = doc.getAuthor();
// 执行终止
var params = createParamsTable();
params.setParameter("_attitude", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
// 发送通知给文档作者
if(authorId != null && authorId.trim().length > 0){
sendMessage(authorId, "您的流程已被终止,终止原因:" + terminateReason);
}
// 发送通知给当前审批人
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 actorSql = "select domainid,actor_id ";
actorSql += "from t_actor ";
actorSql += "where flowstatert_id = '"+flowStateId+"' ";
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 doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = "终止原因";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 执行终止
var params = createParamsTable();
params.setParameter("_attitude", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
// 清理待办任务
var dName = sys_function.DATASOURCENAME;
var taskSql = " DELETE FROM T_TASK ";
taskSql += " WHERE DOC_ID = '"+docId+"' ";
taskSql += " AND STATE = 0";
updateByDSName(dName, taskSql);
// 更新执行人状态
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 actorSql = " UPDATE T_ACTOR SET STATE = 2 ";
actorSql += " WHERE FLOWSTATERT_ID = '"+flowStateId+"' ";
actorSql += " AND STATE = 0";
updateByDSName(dName, actorSql);
}
return "流程终止成功,已清理相关数据";
}
return "流程终止失败";
})();
示例5:终止流程并更新流程状态¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var terminateReason = "终止原因";
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
// 执行终止
var params = createParamsTable();
params.setParameter("_attitude", terminateReason);
flowProcess.doTerminate(flow, params, getWebUser());
// 更新流程状态
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_FLOWSTATERT SET STATE = '已终止', STATE_LABEL = '已终止' ";
updateSql += " WHERE ID = '"+flowStateId+"'";
updateByDSName(dName, updateSql);
}
// 更新文档状态
doc.setState("已终止");
doc.setStateLabel("已终止");
var docProcess = getDocumentProcess();
docProcess.doUpdate(doc);
return "流程终止成功";
}
return "流程终止失败";
})();
关键函数说明¶
getFlowProcess(): 获取流程处理对象flowProcess.doViewByDocument(doc): 根据文档获取流程对象flowProcess.doTerminate(flow, params, user): 终止流程- 参数1: 流程对象
- 参数2: 参数表
- 参数3: 用户对象
updateByDSName(dName, sql): 在指定数据源中执行SQL更新语句sys_function.DATASOURCENAME: 获取数据源名称
流程终止说明¶
- 流程终止: 强制结束流程,流程将不再继续流转
- 用途: 用于流程异常、业务取消、流程错误等场景
- 特点: 终止后流程无法恢复,需要谨慎使用
- 状态: 流程状态会变为"已终止"
系统表说明¶
- t_flowstatert: 流程状态运行时表,存储流程的运行时状态
- t_actor: 流程执行人表,存储当前待处理的执行人信息
- t_actorhis: 流程执行人历史表,存储审批历史记录
- t_task: 待办任务表,存储待办任务信息
注意事项¶
- ⚠️ 终止不可恢复: 流程终止后无法恢复,需要谨慎使用
- ⚠️ 权限控制: 流程终止需要相应权限,建议添加权限验证
- ⚠️ 终止原因: 建议设置终止原因,便于追溯
- ⚠️ 数据清理: 终止后可能需要清理待办任务等相关数据
- ⚠️ 通知发送: 建议发送通知给相关人员
- 终止操作会改变流程状态,需要谨慎使用
- 建议记录终止日志,便于追溯
- 不同版本的API可能有所不同
使用场景¶
- 流程异常处理
- 业务取消
- 流程错误纠正
- 管理员干预
- 流程监控操作
如需查看完整脚本代码,请访问源文档链接。