赞
踩
https://elsa-workflows.github.io/
elsa-workflows工作流持久化及通过MVC Page页面发起及完成
手工通过Page页面发起工作流,通过流程的实例Id,从数据库获取正在运行的实例,执行下一个节点(Activity)
多种方式启动Elsa工作流
//http://localhost:49814/Test/Start?name=dacong345
public class StartModel : PageModel
{
private readonly IWorkflowRegistry workflowRegistry;
private readonly IWorkflowDefinitionDispatcher workflowDispatcher;
private readonly IStartsWorkflow startsWorkflow;
private readonly IBuildsAndStartsWorkflow workflowRunner;
public StartModel(IWorkflowRegistry workflowRegistry,
IWorkflowDefinitionDispatcher workflowDispatcher,
IStartsWorkflow startsWorkflow,
IBuildsAndStartsWorkflow workflowRunner
)
{
this.workflowRegistry = workflowRegistry;
this.workflowDispatcher = workflowDispatcher;
this.startsWorkflow = startsWorkflow;
this.workflowRunner = workflowRunner;
}
public string Id { get; set; }
[BindProperty(SupportsGet = true)]
public string name { get; set; }
public async Task OnGetAsync()
{
var eventData = new NonConformingApplyEvent { Name = name, CreateTime = DateTime.Now };
if (string.IsNullOrEmpty(eventData.Name))
eventData.Name = "dacong2";
// Dispatch each workflow. Each workflow will be correlated by Document ID.
var instance = await workflowRunner.BuildAndStartWorkflowAsync<NonConformingWorkflow>(input: new WorkflowInput(eventData));
Id = instance.WorkflowInstance.Id;
}
public async Task OnGet2Async()
{
var workflowBlueprint = await workflowRegistry.FindByNameAsync(nameof(NonConformingWorkflow), VersionOptions.Published);
var eventData = new NonConformingApplyEvent { Name = name, CreateTime = DateTime.Now };
if (string.IsNullOrEmpty(eventData.Name))
eventData.Name = "dacong";
// Dispatch each workflow. Each workflow will be correlated by Document ID.
var instance = await startsWorkflow.StartWorkflowAsync(workflowBlueprint, input: new WorkflowInput(eventData));
Id = instance.WorkflowInstance.Id;
}
执行,信号量触发
//http://localhost:49814/test/instance?id=923f4f58ebde4a8ba69e4982987f1015&userAction=Approve
public class instanceModel : PageModel
{
private readonly IWorkflowInstanceStore workflowInstanceStore;
private readonly ISignaler signaler;
public instanceModel(IWorkflowInstanceStore workflowInstanceStore, ISignaler signaler)
{
this.workflowInstanceStore = workflowInstanceStore;
this.signaler = signaler;
}
[BindProperty(SupportsGet = true)]
public string id { get; set; }
[BindProperty(SupportsGet = true)]
public string userAction { get; set; }
public string DisplayName { get; set; }
public async Task OnGetAsync()
{
var ins = await workflowInstanceStore.FindAsync(new WorkflowInstanceIdSpecification(id));
DisplayName = $"{ins.Id},{ins.Input.GetType()}";
Log.Debug($"{this},Document={ins.Variables.Get("Document")}");
ins.Variables.Set("Document", "dacong");
var startedWorkflows = await signaler.TriggerSignalAsync(userAction, workflowInstanceId:id);
}
}
--用户任务
/// <summary>
/// http://localhost:49814/test/usertask?userAction=Accept
/// http://localhost:49814/test/usertask?userAction=Reject
/// </summary>
public class userTaskModel : PageModel
{
private readonly IWorkflowTriggerInterruptor _workflowInterruptor;
private readonly IWorkflowTriggerInterruptor workflowTriggerInterruptor;
public userTaskModel(IWorkflowTriggerInterruptor workflowInterruptor, IWorkflowTriggerInterruptor workflowTriggerInterruptor)
{
_workflowInterruptor = workflowInterruptor;
this.workflowTriggerInterruptor = workflowTriggerInterruptor;
}
public string Msg { get; set; }
[BindProperty(SupportsGet = true)]
public string userAction { get; set; }
public async Task OnGetAsync()
{
var workflowInstances = (await _workflowInterruptor.InterruptActivityTypeAsync(nameof(UserTask))).ToList();
var s = workflowInstances.FirstOrDefault();
if (s == null)
{
Msg = "0个";
return;
}
Msg = $"{s.ActivityId},{s.WorkflowInstance.CorrelationId}";
await workflowTriggerInterruptor.InterruptActivityTypeAsync(s.WorkflowInstance, userAction);
}
elsa 2.8.2,net6.0 vs2022
源代码下载:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。