跳转至

干预提交(类似后台的流程监控)

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

使用场景

  • 流程异常处理
  • 流程加速
  • 流程纠正
  • 管理员干预
  • 流程监控操作

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