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

时间:2024-01-23 08:31:10

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

方案一: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() + "\n" + args.get_stackTrace());
                                    var errorMessage = \'cancel workflow error: \' + args.get_message() + \'\n\' + 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() + "\n" + args.get_stackTrace());
                var errorMessage = \'get workflow instance error: \' + args.get_message() + \'\n\' + args.get_stackTrace();
                alert(errorMessage);
                defer.reject();
            }
        );
        
        return defer;
    }

 

 

总结:自己把握吧