Пример #1
0
        public Task <string> QueueStartAction(string processId, string actionId)
        {
            var process = _processStore.GetProcessAsync(processId);
            var newId   = Guid.NewGuid().ToString();

            _taskQueue.Enqueue(new ActionTask()
            {
                ProcessId     = processId,
                ProcessItemId = newId,
                ActionId      = actionId
            });
            return(Task.FromResult <string>(newId));
        }
Пример #2
0
        public async Task ProcessActionTask(IEngineTask task)
        {
            var actionTask = task as ActionTask;
            var process    = await _processStore.GetProcessAsync(actionTask.ProcessId);

            var processItem = await _processItemEventStore.GetProcessItemAsync(actionTask.ProcessItemId);

            if (processItem == null)
            {
                var action = process.StartActions[actionTask.ActionId];
                if (action == null)
                {
                    throw new Exception("Start action not found, and process item is null.");
                }

                processItem = new ProcessItem();
                processItem.ApplyMutation(new CreationActionProcessItemMutation()
                {
                    ProcessItemId   = actionTask.ProcessItemId,
                    ActionId        = actionTask.ActionId,
                    TargetStepId    = action.ArrivalStep,
                    PropertyChanges = actionTask.PropertyChanges
                });
                _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                             (processItemMutationId, mutationDateTimeUtc) =>
                {
                    processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
                });
            }
            else
            {
                _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem);
                _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem);

                if (process.Steps.TryGetValue(processItem.CurrentStepId, out var step))
                {
                    if (step.Actions.TryGetValue(actionTask.ActionId, out var action))
                    {
                        processItem.ApplyMutation(new ActionProcessItemMutation()
                        {
                            ActionId        = actionTask.ActionId,
                            TargetStepId    = action.ArrivalStep,
                            PropertyChanges = actionTask.PropertyChanges
                        });
                        _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                                     (processItemMutationId, mutationDateTimeUtc) =>
                        {
                            processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
                        });
                    }
                    else
                    {
                        throw new ActionNotFoundException(actionTask.ProcessItemId, actionTask.ProcessId, actionTask.PrincipalId, processItem.CurrentStepId, actionTask.ActionId);
                    }
                }
                else
                {
                    throw new Exception("Step not found.");
                }
            }
            _eventQueue.PublishEvent(new EventNotification()
            {
                ProcessId        = actionTask.ProcessId,
                ProcessItemId    = actionTask.ProcessItemId,
                ActionId         = actionTask.ActionId,
                NotificationKind = EventNotificationKinds.Action
            });
        }