• 简述SharePoint designer 工作流实现用户撤回申请得解决方案,how to revoke/recall application in SharePoint designer workflow


    在工作中很容易碰到用户提出,需要可以撤回申请得需求。有这么几种实现方法。

    方案一:designer中加一个parallel(平行)得anction, 然后在里面添加两个平行运行得审批

    第一个是给真正得审批者得task, 第二个是给申请者得撤回task(可以设置生产task得时候不发邮件提醒,不回设置? 可以联系哥),  这两个task相互平行,只要有一个先完成,另一个就自动取消。

    相信一个图片你们就明白了。

    提示:要主要那个isshortcut得参数

    优点:无代码,配置搞定

    缺点:当撤回后,虽然工作流往下流转了,但正式得审批者task没有被自动取消,用户还能看到待办。

    方案二:代码处理审批者得task,是适用于task没有控制权限得时候

    首先在单据里面加一个标记列:revokeFlag, 当用户撤回得时候,先要把单据得revokeflag设为true, 然后用JSOM, CSOM, 等语言把审批得者得task都处理了,同意或者拒绝都行

    在designer里,当task有结果得时候要判断revokeflag在做下一步。

    优点:task都被处理了,不存在撤回后,task还在得问题。

    缺点:对代码能力有一点要求,自己心里有点数,先要代码也可以联系哥。

    方案三:完全用代码来cancel工作流

    用代码把工作流取消掉,注意是取消,不是终止工作流, 取消工作流,相应得task也会自动取消,但是终止工作流,相应得task不回自动取消。

    优点:听起来比较正统。

    缺点:对代码能力要求高,自己心里还是得要有点数。而且想取消工作流,对用户得权限是有要求得,用户至少能有对站点manage permission得权限才能去取消工作流,对应得默认权限级别至少是edit, 注意必须是要对站点,单单对列表打破继承具有edit权限是不够得。因此需要放大用户得权限,对站点比较危险。

    放一段取消工作流得代码给你们:

    this.cancelWorkflow = function(listId, itemId, subId){
            var defer = jQuery.Deferred();
            var context = new SP.ClientContext.get_current();
            var workflowServicesManager = SP.WorkflowServices.WorkflowServicesManager.newObject(context, context.get_web()); 
            var workflowInstanceService = workflowServicesManager.getWorkflowInstanceService();
            var wfInstances = workflowInstanceService.enumerateInstancesForListItem(listId, itemId);
            context.load(wfInstances);
            context.executeQueryAsync(
                function(sender, args){
                    var instancesEnum = wfInstances.getEnumerator();
                    var hasOneRunning = false;
                    while(instancesEnum.moveNext()){
                        var instance = instancesEnum.get_current();
                        var instanceSubId = instance.get_workflowSubscriptionId().toString();
                        console.log(instanceSubId);
                        var status = instance.get_status();
                        
                        console.log(status);
                        if(instanceSubId == subId){
                            var instanceFound = null;
                            if (status == 2) {
                                instanceFound = instance;
                                workflowInstanceService.terminateWorkflow(instanceFound);
                            }
                            if (status == 1) {
                                instanceFound = instance;
                                hasOneRunning = true;
                                workflowInstanceService.cancelWorkflow(instanceFound);
                            }
                            if(instanceFound){
                                context.executeQueryAsync(
                                    function(sender, args){
                                        console.log("cancel Successful");
                                        defer.resolve();
                                    },
                                    function(sender,args){
                                        console.log("Failed to terminate workflow.");
                                        console.log("Error: " + args.get_message() + "
    " + args.get_stackTrace());
                                        var errorMessage = 'cancel workflow error: ' + args.get_message() + '
    ' + args.get_stackTrace();
                                        alert(errorMessage);
                                        defer.reject();
                                    }
                                );
                            }
                            
                        }
                    }
                    
                    if(!hasOneRunning){
                        defer.resolve();
                    }
                },
                function(sender,args){
                    
                    console.log("get workflow instance error.");
                    console.log("Error: " + args.get_message() + "
    " + args.get_stackTrace());
                    var errorMessage = 'get workflow instance error: ' + args.get_message() + '
    ' + args.get_stackTrace();
                    alert(errorMessage);
                    defer.reject();
                }
            );
            
            return defer;
        }

    总结:自己把握吧

  • 相关阅读:
    C# 基础笔记
    ASP.Net Jquery 随机验证码 文本框判断
    html 随机验证码
    冒泡排序
    工厂方法模式[Factory Mothod]
    单例设计模式[Singleton]
    设计模式之SOLID原则
    linux下配置zookeeper
    linux中安装nginx
    linux安装tomcat
  • 原文地址:https://www.cnblogs.com/cwyang/p/8854888.html
Copyright © 2020-2023  润新知