public void InitiateWorkflowRequestHandler(InitiateWorkflowRequest message)
        {
            InitiateWorkflowResponse response = null;
            try
            {
                response = new InitiateWorkflowResponse();
                using (var dataContext = new DataContext(message.TenantId, message.AuditContext))
                {
                    response.AuditContext = message.AuditContext;
                    response.CorrelationId = message.CorrelationId;
                    response.TenantId = message.TenantId;

                    var newWorkflow = makeNewWorkflowInstance(message, dataContext, _bus);
                    response.WorkflowInstanceId = newWorkflow.Id;
                    _bus.Reply(response);

                    Utils.PublishWorkflowState(_bus, newWorkflow, message.AuditContext);
                    Utils.PublishNewTasks(_bus, newWorkflow, message.AuditContext);
                }
            }
            catch (Exception exc)
            {
                response = null;
                _bus.Reply(response, 0);
            }
        }
 private static WorkflowInstance makeNewWorkflowInstance(InitiateWorkflowRequest message, DataContext dataContext, IMessagingService bus)
 {
     var objType = message.TargetObjectType;
     var newWorkflow = new WorkflowInstance();
     newWorkflow.TargetObjectId = message.TargetObjectId;
     newWorkflow.TargetObjectTenantId = message.TenantId;
     newWorkflow.WorkflowTemplate = Utils.GetWorkflowTemplate(dataContext, null, objType, message.WorkflowTemplateName);
     newWorkflow.StartDate = DateTime.UtcNow;
     newWorkflow.Completed = false;
     newWorkflow.CurrentState = new State()
     {
         LastState = false,
         MetaData = null,
         StateTemplate = newWorkflow.WorkflowTemplate.States.FirstOrDefault(x => x.FirstState),
         TransitionDate = DateTime.UtcNow,
         TransitionedBy = message.AuditContext,
         TransitionEvent = new WorkflowEvent()
         {
             EventDate = DateTime.UtcNow,
             EventType = newWorkflow.WorkflowTemplate.EventsTypes.FirstOrDefault(x => x.Event == "Start_Workflow"),
             ExecutedBy = message.AuditContext,
             StateParent = newWorkflow.CurrentState,
             WorkflowInstance = newWorkflow,
         },
         Tasks = new List<Models.Task>(),
     };
     newWorkflow.CurrentState.StateTemplate.Tasks.Where(x => x.FirstTask == true).ToList().ForEach(x =>
     {
         newWorkflow.CurrentState.Tasks.Add(new Models.Task()
         {
             IsCurrentTask = true,
             State = newWorkflow.CurrentState,
             TaskTemplate = x,
             TransitionDate = DateTime.UtcNow,
             TransitionedBy = message.AuditContext,
             WorkflowInstance = newWorkflow,
         });
     }
     );
     newWorkflow.TargetObjectType = message.TargetObjectType;
     dataContext.WorkflowInstances.Add(newWorkflow);
     dataContext.SaveChanges();
     return newWorkflow;
 }
示例#3
0
        static void Main(string[] args)
        {
            IMessagingService bus = IoCContext.Current.Container.Resolve<IMessagingService>();
            IDictionary<string, string> settings = new Dictionary<string, string>();
            settings.Add("EndpointName", "PocketBoss_Test_Client");
            settings.Add("HandlersAssembly", "PocketBoss.TestingCLI.exe");
            bus.OpenConnection(settings);
            bus.AddSubscription<WorkflowStateNotification>();
            bus.AddSubscription<WorkflowTaskNotification>();

            System.Console.WriteLine("Press enter to start workflow");
            var templatesRequest = new GetWorkflowTemplatesRequest()
            {
                AuditContext = "Console App",
                CorrelationId = Guid.NewGuid(),
                TargetObjectType = "PocketBoss.Samples.User",
                TenantId = System.Guid.Empty
            };

            GetWorkflowTemplatesResponse templateLookupData = null;
            long workflowTemplateId;

            templateLookupData = bus.Send<GetWorkflowTemplatesRequest, GetWorkflowTemplatesResponse>(templatesRequest).Result;

            System.Console.WriteLine("Workflows Registered:" + templateLookupData.WorkflowTemplates.Count());

            if (!templateLookupData.WorkflowTemplates.Exists(t => t.WorkflowTemplateName.Contains("Sample Workflow")))
            {
                System.Console.WriteLine("Test Workflow not seeded");
                System.Console.Read();
                return;
            }
            else
            {
                workflowTemplateId = templateLookupData.WorkflowTemplates[0].WorkflowTemplateId;
            }

            while (Console.ReadLine() != null)
            {
                WorkflowTemplate workflowTemplate = new WorkflowTemplate();
                GetSingleWorkflowTemplateRequest templateRequest = new GetSingleWorkflowTemplateRequest()
                {
                    AuditContext = "Console App",
                    CorrelationId = Guid.NewGuid(),
                    TenantId = System.Guid.Empty,
                    WorkflowTemplateId = workflowTemplateId
                };
                GetSingleWorkflowTemplateResponse searchResponse = bus.Send<GetSingleWorkflowTemplateRequest, GetSingleWorkflowTemplateResponse>(templateRequest).Result;
                workflowTemplate = searchResponse.WorkflowTemplate;

                var startWorkflowInstance = new InitiateWorkflowRequest()
                {
                    AuditContext = "Console App",
                    CorrelationId = Guid.NewGuid(),
                    TargetObjectId = DateTime.Now.Ticks.ToString(),
                    TargetObjectType = workflowTemplate.TargetObjectType,
                    TenantId = System.Guid.Empty,
                    WorkflowTemplateName = workflowTemplate.WorkflowName
                };

                long workflowInstanceId = 0;
                InitiateWorkflowResponse initializeResponse = bus.Send<InitiateWorkflowRequest, InitiateWorkflowResponse>(startWorkflowInstance).Result;
                workflowInstanceId = initializeResponse.WorkflowInstanceId;
                System.Console.WriteLine("Workflow InstanceId = " + workflowInstanceId.ToString());
            }
        }