public DataTransaction ForceChangeStage(IEnumerable <Entity> entities, EntityWorkflowStage stage, DataTransaction dataTransaction) { using (DataTransactionSwitch transaction = new DataTransactionSwitch(EntitySet.Connection, dataTransaction)) { foreach (Entity entity in entities) { if (!GetEntityStageId(entity, transaction, out object stageId)) { throw new ModelException(ErrorLevel.Information, "Нельзя сменить стадию объекта на {0}", stage); } if (!entity.OnWorkflowStageChanging(stage, null, null)) { return(null); } entity.Edit(transaction); if (entity.EntitySet.Extension != null && !entity.EntitySet.Extension.OnWorkflowStageChanging(entity, stage, null, null, null)) { return(null); } SetEntityStageId(entity, stage.Id, "Назначение стадии", null, null); } transaction.Commit(); return(transaction.Transaction); } }
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); } }