• 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下载

  • 相关阅读:
    神奇的python的上下文管理器
    【C++设计模式之简单工厂模式】分析及示例
    1907_Arm Cortex-M3的基本了解
    数据结构——初识数据结构
    「TCP 重要机制」滑动窗口 & 粘包问题 & 异常情况处理
    【Qt项目专栏】贪吃蛇小游戏1.0
    Kafka(二)- Kafka集群部署
    区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试
    机器学习模型5——贝叶斯分类器
    SHAP 和 LIME 解释模型
  • 原文地址:https://blog.csdn.net/dacong/article/details/126440283