8.人工审核工作流
  TEZNKK3IfmPf 2023年11月15日 10 0


需要安装Nuget包Install-Package WorkflowCore.Users 使用方法
在构建工作流时,使用.userTask拓展方法,其中参数2是用于解析此步骤将分配给那些用户

public class HumanWorkflow : IWorkflow
{
...
    public void Build(IWorkflowBuilder<object> builder)
    {
        builder
            .StartWith(context => .WriteLine("start"))
                .UserTask("Do you approve", data => "MYDOMAIN\\user")
                    .WithOption("yes", "I approve").Do(then => then
                        .StartWith(context => Console.WriteLine("You approved"))
                    )
                    .WithOption("no", "I do not approve").Do(then => then
                        .StartWith(context => Console.WriteLine("You did not approve"))
                    )
                .Then(context => Console.WriteLine("end"));
    }
  }

使用WorkflowHost服务上的. getopenuseractions获取给定工作流的可用用户操作列表,
var openItems = host.GetOpenUserActions(workflowId); 然后使用. publishuseraction响应给定工作流的开放用户操作
host.PublishUserAction(openItems.First().Key, "MYDOMAIN\\someuser", chosenValue);案例:
Workflow:

public class HumanWorkflow : IWorkflow
{
 public string Id => "HumanWorkflow";
     
 public int Version => 1;
     
 public void Build(IWorkflowBuilder<object> builder)
 {
     builder
         .StartWith(context => ExecutionResult.Next())
         .UserTask("Do you approve", data => @"domain\bob")
             .WithOption("yes", "I approve").Do(then => then
                 .StartWith(context => Console.WriteLine("You approved"))
             )
             .WithOption("no", "I do not approve").Do(then => then
                 .StartWith(context => Console.WriteLine("You did not approve"))
             )
             .WithEscalation(x => TimeSpan.FromSeconds(20), x => @"domain\frank", action => action
                 .StartWith(context => Console.WriteLine("Escalated task"))
                 .Then(context => Console.WriteLine("Sending notification..."))
                 )
         .Then(context => Console.WriteLine("end"));
 }
}

program

var host = serviceProvider.GetService<IWorkflowHost>();
host.RegisterWorkflow<HumanWorkflow>();
host.Start();
Console.WriteLine("Starting workflow...");
string workflowId = host.StartWorkflow("HumanWorkflow").Result;

var timer = new Timer(new TimerCallback((state) => { PrintOptions(host, workflowId); }), null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));

Thread.Sleep(1000);
Console.WriteLine();
Console.WriteLine("Open user actions are");
var openItems = host.GetOpenUserActions(workflowId);
foreach (var item in openItems)
{
 Console.WriteLine(item.Prompt + ", Assigned to " + item.AssignedPrincipal);
 Console.WriteLine("Options are ");
 foreach (var option in item.Options)
 {
     Console.WriteLine(" - " + option.Key + " : " + option.Value + ", ");
 }

 //Thread.Sleep(500);

 var input = Console.ReadLine();
 Console.WriteLine();

 string key = item.Key;
 string value = item.Options.Single(x => x.Value == input).Value;

 Console.WriteLine("Choosing key:" + key + " value:" + value);

 host.PublishUserAction(key, @"domain\john", value).Wait();
}
Thread.Sleep(1000);
Console.WriteLine("Open user actions left:" + host.GetOpenUserActions(workflowId).Count().ToString());
timer.Dispose();
timer = null;
Console.WriteLine("Workflow ended.");
Console.ReadLine();
host.Stop();



private static void PrintOptions(IWorkflowHost host, string workflowId)
{
 var openItems = host.GetOpenUserActions(workflowId);
 foreach (var item in openItems)
 {
     Console.WriteLine(item.Prompt + ", Assigned to " + item.AssignedPrincipal);
     Console.WriteLine("Options are ");
     foreach (var option in item.Options)
     {
         Console.WriteLine(" - " + option.Key + " : " + option.Value + ", ");
     }
 }
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

TEZNKK3IfmPf