Пример #1
0
            public EntityWorkflowTransition CreateTransition(EntityWorkflow workflow, WorkflowProvider workflowProvider,
                                                             Dictionary <object, List <EntityWorkflowTransition> > transitionsTo,
                                                             Dictionary <object, List <EntityWorkflowTransition> > transitionsFrom)
            {
                if (_toStage == null)
                {
                    throw new ModelException(ErrorLevel.Warning, "Не указана стадия для перехода");
                }

                TransitionProvider transitionProvider = new TransitionProvider
                {
                    Workflow                 = workflowProvider,
                    FromStageIds             = new HashSet <object>(_fromStages.Select(s => s.StageId)),
                    ToStage                  = (StageProvider)workflow.GetStage(_toStage.StageId).Provider,
                    CommandText              = _commandText,
                    IconImageGuid            = _iconImageGuid.GetValueOrDefault(),
                    IconImageColor           = _iconImageColor,
                    CommandPlacement         = _commandPlacement,
                    MultipleSelectionEnabled = _multipleSelectionEnabled,
                    Roles = _roles ?? new IEntityWorkflowRole[0],
                    ConfirmationTextProvider = _confirmationTextProvider,
                    InputFormGenerate        = _inputFormGenerate,
                    CanExecute      = _canExecute,
                    Validators      = _validators,
                    OnChanging      = _onChanging,
                    OnChangingAsync = _onChangingAsync,
                    OnChanged       = _onChanged,
                    OnLog           = _onLog
                };

                EntityWorkflowTransition result = new EntityWorkflowTransition(workflow, transitionProvider);

                transitionsTo[_toStage.StageId].Add(result);
                foreach (IEntityWorkflowStage stage in _fromStages)
                {
                    transitionsFrom[stage.StageId].Add(result);
                }
                return(result);
            }
            public DataTransaction Execute(EntityWorkflowTransition transition,
                                           IEnumerable <Entity> entities, DataTransaction dataTransaction,
                                           IDictionary <string, object> inputValues, object context, bool force)
            {
                if (inputValues == null)
                {
                    inputValues = new Dictionary <string, object>(0);
                }

                using (DataTransactionSwitch transaction = new DataTransactionSwitch(Workflow.EntitySet.Connection, dataTransaction))
                {
                    foreach (Entity entity in entities)
                    {
                        if (!force && !CanChangeStage(entity, transaction, context))
                        {
                            throw new ModelException(ErrorLevel.Information, "Нельзя сменить стадию объекта на {0}", ToStage.Name);
                        }

                        entity.Edit(transaction);
                        ValidateEntities(new[] { entity }, true);

                        if (OnChanging != null && !OnChanging(entity, inputValues, context))
                        {
                            return(null);
                        }
                        if (OnChangingAsync != null)
                        {
                            bool result = false;
                            if (System.Windows.Application.Current != null && !System.Windows.Application.Current.Dispatcher.CheckAccess())
                            {
                                using (ManualResetEventSlim complete = new ManualResetEventSlim(false))
                                {
                                    System.Windows.Application.Current.Dispatcher.Invoke(new Action(async() =>
                                    {
                                        try
                                        {
                                            result = await OnChangingAsync(entity, inputValues, context);
                                        }
                                        finally
                                        {
                                            complete.Set();
                                        }
                                    }));
                                    complete.Wait();
                                }
                            }
                            else
                            {
                                throw new ModelException(ErrorLevel.Warning, "Попытка вызвать смену стадии по переходу с обработчиком OnChangingAsync из основного потока");
                            }

                            if (!result)
                            {
                                return(null);
                            }
                        }
                        if (!entity.OnWorkflowStageChanging(transition.ToStage, transition, inputValues))
                        {
                            return(null);
                        }
                        if (entity.EntitySet.Extension != null && !entity.EntitySet.Extension.OnWorkflowStageChanging(entity, transition.ToStage, transition, inputValues, context))
                        {
                            return(null);
                        }

                        Workflow.SetEntityStageId(entity, ToStageId, CommandText, inputValues, OnLog);
                    }

                    transaction.Commit();

                    if (OnChanged != null)
                    {
                        if (System.Windows.Application.Current != null && !System.Windows.Application.Current.Dispatcher.CheckAccess())
                        {
                            using (ManualResetEventSlim complete = new ManualResetEventSlim(false))
                            {
                                System.Windows.Application.Current.Dispatcher.Invoke(() =>
                                {
                                    try
                                    {
                                        OnChanged(entities, inputValues, context);
                                    }
                                    finally
                                    {
                                        complete.Set();
                                    }
                                });
                                complete.Wait();
                            }
                        }
                        else
                        {
                            OnChanged(entities, inputValues, context);
                        }
                    }

                    return(transaction);
                }
            }