跳转至

简单的干预脚本

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

使用场景

  • 根据条件跳过节点
  • 流程回退操作
  • 流程终止操作
  • 流程异常处理
  • 流程自动化控制

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