SharePoint 模拟审批Nintex工作流

  前言

  这个也是多年以前保存的草稿了,当时在XX公司做Nintex工作流的项目写的代码。

  简单的介绍下场景,因为跨过公司,很多人有多个域的同名账号(A\linyu B\linyu C\linyu),但是审批的时候工作流可不认这个啊,你给哪个账号权限哪个才能批,才能看见Task。后来写了个Service,发Ajax请求进行审批,通过服务器对象模型模拟权限审批。前台task也通过用户名来过滤,不要域的名字,完美解决了用户多域审批的问题。

复制代码
using (SPSite site = new SPSite(SiteUrl, sysToken))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.Lists.TryGetList(ListName);
        SPListItem item = list.GetItemById(ItemId);
        SPWorkflow workflow = item.Workflows[0];
        SPWorkflowTask task = workflow.Tasks[0];
        task.Web.AllowUnsafeUpdates = true;
        Hashtable ht = new Hashtable();
        ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]);
        ht["Completed"] = true;
        ht["PercentComplete"] = 1;
        ht["Status"] = "Completed";
        ht["WorkflowOutcome"] = OutCome;
        ht[Nintex.Workflow.Common.NWSharePointObjects.FieldDecision] = GetFlexiTaskOutcomeId(task, OutCome);
        ht[Nintex.Workflow.Common.NWSharePointObjects.FieldApprovalOutcome] = GetFlexiTaskOutcomeId(task, OutCome);
        ht["ApproverComments"] = Comment;
        ht["FormData"] = SPWorkflowStatus.Completed;
        result = AlterTask((task as SPListItem), ht, true, 5, 100);
        task.Web.AllowUnsafeUpdates = false;
    }
}
复制代码

   好多年前写的代码了,大家凑合看吧。 

复制代码
public static bool AlterTask(SPListItem task, Hashtable htData, bool fSynchronous, int attempts, int milisecondsTimeout)
{
    if ((int)task[SPBuiltInFieldId.WorkflowVersion] != 1)
    {
        SPList parentList = task.ParentList.ParentWeb.Lists[new Guid(task[SPBuiltInFieldId.WorkflowListId].ToString())];
        SPListItem parentItem = parentList.Items.GetItemById((int)task[SPBuiltInFieldId.WorkflowItemId]);
        for (int i = 0; i < attempts; i++)
        {
            SPWorkflow workflow = parentItem.Workflows[new Guid(task[SPBuiltInFieldId.WorkflowInstanceID].ToString())];
            if (!workflow.IsLocked)
            {
                task[SPBuiltInFieldId.WorkflowVersion] = 1;
                task.SystemUpdate();
                break;
            }

            if (i != attempts - 1)
            {
                Thread.Sleep(milisecondsTimeout);
            }
        }
    }

    var result = SPWorkflowTask.AlterTask(task, htData, fSynchronous);
    return result;
}

public static string GetFlexiTaskOutcomeId(Microsoft.SharePoint.Workflow.SPWorkflowTask task, string outcome)
{
    if (task["MultiOutcomeTaskInfo"] == null)
    {
        return string.Empty;
    }
    string xmlOutcome = HttpUtility.HtmlDecode(task["MultiOutcomeTaskInfo"].ToString());
    if (string.IsNullOrEmpty(xmlOutcome))
    {
        return string.Empty;
    }
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xmlOutcome);
    var node = doc.SelectSingleNode(string.Format("/MultiOutcomeResponseInfo/AvailableOutcomes/ConfiguredOutcome[@Name='{0}']", outcome));
    return node.Attributes["Id"].Value;
}
复制代码

 

posted @   霖雨  阅读(91)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-03-08 SharePoint Online 工作流添加历史记录
点击右上角即可分享
微信分享提示