跳转至

终止流程

本文档内容来源于 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可能有所不同

使用场景

  • 流程异常处理
  • 业务取消
  • 流程错误纠正
  • 管理员干预
  • 流程监控操作

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