private WorkflowContext RunNext(WorkflowContext context) { if (context.State == WorkflowRuntimeState.Finish) { if (context.Parent != null && context.Parent.State == WorkflowRuntimeState.ProcessCall) { var callContext = new WorkflowContext(context.Parent, Provider); callContext.ProcessReturn(context.Data); return(RunNext(callContext)); } return(context); } if (context.State == WorkflowRuntimeState.Run) { return(Continue(context, context.ActivityId /*CurrentActivity.Id*/)); } if (context.State == WorkflowRuntimeState.ProcessCall) { var process = Repository.LoadProcessById(context.ProcessId ?? Guid.Empty); if (process != null) { var processContext = new WorkflowContextData(process, context.Data); return(Run(process, new WorkflowContext(processContext, Provider))); } context.ThrowException("No Process", "Процесс не найден"); } if (context.State == WorkflowRuntimeState.GateProcessCall) { var gateRef = Repository.LoadGateRefById(context.GateId ?? Guid.Empty); if (gateRef != null) { context = new WorkflowContext(RunExternalProcess(gateRef, context.GateProcessName, context.Data), Provider); return(RunNext(context)); } context.ThrowException("No GateRef", "Ссылка на шлюз внешнего процесса не найдена"); } if (context.State == WorkflowRuntimeState.ProcessReturn) { var activity = Repository.LoadActivityById(context.ActivityId /*CurrentActivity.Id*/); if (activity != null) { new WorkflowActivityEngine(activity, Provider, DataContext).AfterExecution(context); return(RunNext(context)); } context.ThrowException("No Activity", "Действие не найдено"); } if (context.State == WorkflowRuntimeState.ShowReturn || context.State == WorkflowRuntimeState.ShowSelectReturn || context.State == WorkflowRuntimeState.UploadFileReturn) { var activity = Repository.LoadActivityById(context.ActivityId); if (activity != null) { new WorkflowActivityEngine(activity, Provider, DataContext).AfterExecution(context); return(RunNext(context)); } context.ThrowException("No Activity", "Действие не найдено"); } if (context.State == WorkflowRuntimeState.Exception) { return(HandleException(context)); } /* * if (context.State == WorkflowRuntimeState.ShowForm) * return context; * if (context.State == WorkflowRuntimeState.ShowMessage) * return context; * if (context.State == WorkflowRuntimeState.ShowReport) * return context; * if (context.State == WorkflowRuntimeState.SendFile) * return context; */ return(context); }
private WorkflowContext RunProcessActivities(WorkflowContext context) { while (true) { switch (context.State) { case WorkflowRuntimeState.Finish: if (context.Parent != null && context.Parent.State == WorkflowRuntimeState.ProcessCall) { var callContext = new WorkflowContext(context.Parent, Provider); callContext.ProcessReturn(context.Data); context = callContext; break; } return(context); case WorkflowRuntimeState.Run: var runActivity = Repository.LoadActivityById(context.ActivityId); if (runActivity == null) { context.ThrowException("No Activity", "Операции не существует!"); } else { new WorkflowActivityEngine(runActivity, Provider, DataContext).Execute(context); } break; case WorkflowRuntimeState.ProcessCall: var process = Repository.LoadProcessById(context.ProcessId ?? Guid.Empty); if (process != null) { var processContext = new WorkflowContextData(process, context.Data); context = RunSubProcess(process, new WorkflowContext(processContext, Provider)); /*if (context.State == WorkflowRuntimeState.Finish) * { * context.ProcessReturn(returnedContext.Data); * context.Data.ReturnedExceptionFlag = false; * } * else if (returnedContext.State == WorkflowRuntimeState.Exception) * { * context.ProcessReturn(returnedContext.Data); * context.Data.ReturnedExceptionFlag = true; * }*/ } else { context.ThrowException("No Process", "Процесс не найден"); } break; case WorkflowRuntimeState.GateProcessCall: var gateRef = Repository.LoadGateRefById(context.GateId ?? Guid.Empty); if (gateRef != null) { context = new WorkflowContext( RunExternalProcess(gateRef, context.GateProcessName, context.Data), Provider); } else { context.ThrowException("No GateRef", "Ссылка на шлюз внешнего процесса не найдена"); } break; case WorkflowRuntimeState.ProcessReturn: var processReturnActivity = Repository.LoadActivityById(context.ActivityId); if (processReturnActivity != null) { new WorkflowActivityEngine(processReturnActivity, Provider, DataContext) .AfterExecution(context); } else { context.ThrowException("No Activity", "Действие не найдено"); } break; case WorkflowRuntimeState.ShowReturn: case WorkflowRuntimeState.ShowSelectReturn: case WorkflowRuntimeState.UploadFileReturn: var returnActivity = Repository.LoadActivityById(context.ActivityId); if (returnActivity != null) { new WorkflowActivityEngine(returnActivity, Provider, DataContext) .AfterExecution(context); } else { context.ThrowException("No Activity", "Действие не найдено"); } break; case WorkflowRuntimeState.Exception: return(HandleException(context)); default: return(context); } } }
public WorkflowContextData RunExternalProcess(WorkflowGateRef gateRef, string processName, WorkflowContextData contextData) { var context = new WorkflowContext(contextData, Provider); if (gateRef != null) { try { var launcher = Provider.Get <IExternalProcessLauncher>(); context.Data.ReturnData = null; var result = launcher.Launch(gateRef, processName, Clone(contextData)); context.Data.ReturnData = new ExternalProcessReturnData { ResultType = result.Type, Correct = false, WithException = false }; switch (result.Type) { case ExternalProcessExecuteResultType.Success: context.ProcessReturn(result.ReturnData); if (result.ReturnData.State == WorkflowRuntimeState.Finish) { context.ReturnData.Correct = true; return(context.Data); } if (result.ReturnData.State != WorkflowRuntimeState.Exception) { /*context.ThrowException("Process invalid state", * String.Format("Процесс \"{0}\", на внешнем сервисе, вернул неверный статус завершения", processName));*/ context.ReturnData.ExceptionMessage = String.Format( "Процесс \"{0}\", на внешнем сервисе, вернул неверный статус завершения", processName); return(context.Data); } /*context.ThrowException("Process failed", * String.Format("Ошибка при выполнении процесса \"{0}\" на внешнем сервисе: {1}", processName, result.ReturnData.ExceptionName));*/ context.ReturnData.WithException = true; context.ReturnData.ExceptionMessage = String.Format("Ошибка при выполнении процесса \"{0}\" на внешнем сервисе: {1}", processName, result.ReturnData.ExceptionName); return(context.Data); case ExternalProcessExecuteResultType.GateNotFound: context.ThrowException("Gate not Found", result.Message ?? "Интерфейс доступа на внешнем сервисе не найден"); break; case ExternalProcessExecuteResultType.ProcessNotFound: context.ThrowException("Process not Found", result.Message ?? "Процесс на внешнем сервисе не найден"); break; case ExternalProcessExecuteResultType.Failed: context.ThrowException("Process failed", result.Message ?? "Ошибка при выполнении процесса на внешнем сервисе"); break; } } catch (Exception e) { var msg = String.Format("Произошла ошибка при вызове внешнего процесса \"{0}\"", processName); context.ThrowException(e.Message, msg); var fileName = Logger.GetLogFileName("ExProccessLaunch"); Logger.OutputLog(fileName, e, msg); return(context.Data); } } else { context.ThrowException("No Process Gate", "Не могу запустить внешний процесс, индерфейс доступа к внешнему сервису не найден!"); } return(context.Data); }