• elsa-workflows工作流持久化及通过MVC Page页面发起及完成


    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(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);
            }
        }

    --用户任务

    ///


        /// http://localhost:49814/test/usertask?userAction=Accept
        /// http://localhost:49814/test/usertask?userAction=Reject
        ///

        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

     

    源代码下载:

    通过asp.netcore页面发起Elsa工作流-C#文档类资源-CSDN下载

  • 相关阅读:
    一款新的webshell管理工具
    【Java八股文总结】之JDK常见问题排查
    随smart登陆欧洲,亿咖通科技踏上出海新征程
    深圳考生注意!取得信息系统项目管理师证书还可以享受这些福利!
    基于SSM+Vue的药品商超销售进销存网站设计与实现
    【MySQL从0到1】第六篇:内置函数
    单目视频估计人体姿态+形状【注意力机制--连续性+相关性】含6数据集及补充材料
    计算机网络知多少面试---第2篇
    题目 1209: 密码截获
    关于个人考取PMP认证考试的这些关键问题
  • 原文地址:https://blog.csdn.net/dacong/article/details/126440283