public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            //using (var docRepo = new DocRepository(dataContext, context.UserId))
            var docRepo = provider.Get <IDocRepository>();
            {
                try
                {
                    var doc = context.CurrentDocument;
                    if (doc != null)
                    {
                        docRepo.SetDocState(doc, DocStateTypeId);
                    }
                    else if (context.CurrentDocumentId != null)
                    {
                        docRepo.SetDocState((Guid)context.CurrentDocumentId, DocStateTypeId);
                    }
                    else
                    {
                        context.ThrowException("Document Id not found", "Идентификатор документа не найден!");
                    }

                    base.Execute(context, provider, dataContext);
                }
                catch (Exception e)
                {
                    OnException(context, e);
                    context.ThrowException(e);
                }
            }
        }
Exemple #2
0
        public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            /*
             * Действие (Execute) StartActivity заключается в том,
             * что выполняется переход к следующему действию.
             */
            /*var queryTargetId = from l in dataContext.ObjectDefs.OfType<Activity_Link>()
             *                  where l.Source_Id == Id //context.ActivityId //&& l.Parent_Id == context.ProcessId
             *                        && (l.Deleted == null || l.Deleted == false)
             *                  select l.Target_Id;*/

            var link = TargetLinks != null?TargetLinks.FirstOrDefault(l => l.UserActionId == null) : null;

            if (link == null) //(!queryTargetId.Any())
            {
                context.ThrowException("", "Не удалось найти действие для продолжения");
                return;
            }

            Guid?newGuid = link.TargetId;  //queryTargetId.First();

            if (!newGuid.HasValue)
            {
                context.ThrowException("", "В Activity_Link не указано следующее действие (TargetId)");
                return;
            }

            context.RunActivity(newGuid.Value);
        }
Exemple #3
0
 public override void AfterExecution(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
 {
     try
     {
         /*if (context.ReturnVariables != null)
          * {
          *  var parser = new CsParser(ReturnVars);
          *
          *  while (parser.NextToken() != TokenType.Eof)
          *  {
          *      if (parser.Token == TokenType.Ident)
          *      {
          *          CopyVar(parser, context);
          *      }
          *      else if (parser.Token == TokenType.Eof)
          *          break;
          *      else
          *      {
          *          context.ThrowException("ProcessCallReturn", "Ошибка в выражении");
          *          return;
          *      }
          *  }
          * }*/
         base.Execute(context, provider, dataContext);
     }
     catch (Exception e)
     {
         context.ThrowException(e);
     }
 }
        private WorkflowContext Run(WorkflowProcess process, Dictionary <String, object> processParameters)
        {
            var contextData = new WorkflowContextData(process != null ? process.Id : Guid.Empty, UserId);
            var context     = new WorkflowContext(contextData, Provider);

            context.SetVariables(processParameters);

            if (process != null)
            {
                if (process.StartActivityId == Guid.Empty)
                {
                    throw new ApplicationException("Для процесса не задан StartActivity");
                }

                ScriptManager.LoadScript(process.Script);

                context.RunActivity(process.StartActivityId);

                return(RunActivities(context));
            }

            context.ThrowException("No Process", "Процесс не существует!");

            return(context);
        }
        public virtual void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            try
            {
                Guid?id = GetNextActivityId(context);

                if (id != null)
                {
                    context.RunActivity((Guid)id);
                }
                else
                {
                    context.ThrowException("Unexpected end of process", "Неожиданное завершение процесса");
                }
            }
            catch (Exception e)
            {
                context.ThrowException(e);
            }
        }
Exemple #6
0
 public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
 {
     if (CallProcessId != null)
     {
         context.CallProcess((Guid)CallProcessId);
     }
     else
     {
         context.ThrowException("No Call Process", "Вызываемый процесс не указан");
     }
 }
Exemple #7
0
 public override void AfterExecution(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
 {
     try
     {
         base.Execute(context, provider, dataContext);
     }
     catch (Exception e)
     {
         context.ThrowException(e);
     }
 }
Exemple #8
0
 public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
 {
     if (CallGateId != null)
     {
         context.CallGateProcess((Guid)CallGateId, ProcessName);
     }
     else
     {
         context.ThrowException("No Call Gate", "Вызываемый шлюз не указан");
     }
 }
        public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            if ((Operation >= (int)PresentationActivityType.Default &&
                 Operation <= (int)PresentationActivityType.OpenParamForm) && FormId == null)
            {
                context.ThrowException("FormId is null", "Идентификатор формы не указан!");
            }

            switch (Operation)
            {
            case (int)PresentationActivityType.Default:
            case (int)PresentationActivityType.OpenForm:
                context.ShowForm(FormId);
                context.FormCaption = Message;
                break;

            case (int)PresentationActivityType.OpenSelectForm:
                context.ShowSelectForm(FormId);
                context.FormCaption = Message;
                break;

            case (int)PresentationActivityType.OpenParamForm:
                context.ShowParamForm(FormId);
                context.FormCaption = Message;
                break;

            case (int)PresentationActivityType.ShowMessage:
                context.ShowMessage(String.IsNullOrEmpty(Message) ? context.Message : Message);
                break;

            case (int)PresentationActivityType.DefineFormId:
                context.CurrentFormId = FormId;
                base.Execute(context, provider, dataContext);
                break;

            case (int)PresentationActivityType.GenerateReportFromTemplate:
                context.ShowTemplateReport(Message);
                break;

            case (int)PresentationActivityType.DownloadFile:
                context.SendFile(Message);
                break;

            case (int)PresentationActivityType.UploadFile:
                context.UploadFile(Message);
                break;

            default:
                context.ShowForm(FormId);
                break;
            }
        }
Exemple #10
0
        private WorkflowContext Continue(WorkflowContext context, Guid activityId)
        {
            var activity = Repository.LoadActivityById(activityId);

            if (activity == null)
            {
                context.ThrowException("No Activity", "Операции не существует!");
            }
            else
            {
                new WorkflowActivityEngine(activity, Provider, DataContext).Execute(context);
            }

            return(RunProcessActivities(context));
        }
Exemple #11
0
        private WorkflowContext RunSubProcess(WorkflowProcess process, WorkflowContext context)
        {
            if (process != null)
            {
                ScriptManager.LoadScript(process.Script);

                context.RunActivity(process.StartActivityId);

                return(RunProcessActivities(context));
            }

            context.ThrowException("No Process", "Процесс не существует!");

            return(RunProcessActivities(context));
        }
Exemple #12
0
        // private static readonly object ScriptExecLock = new object();

        public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            try
            {
                var scriptManager = new ScriptManager(_script);

                //lock(ScriptExecLock)
                {
                    scriptManager.Execute(context);
                }

                base.Execute(context, provider, dataContext);
            }
            catch (Exception e)
            {
                OnException(context, e);
                context.ThrowException(e);
            }
        }
 public virtual void HandleException(WorkflowContext context, string exceptionName, string message)
 {
     context.ThrowException(exceptionName, message);
 }
 public virtual void AfterExecution(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
 {
     context.ThrowException("NotImplementedException", "Вызов нереализован");
 }
Exemple #15
0
        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);
                }
            }
        }
Exemple #16
0
        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);
        }
        public override void Execute(WorkflowContext context, IAppServiceProvider provider, IDataContext dataContext)
        {
            //using (var docRepo = new DocRepository(dataContext, context.UserId))
            var docRepo = provider.Get <IDocRepository>();
            {
                try
                {
                    switch ((WorkflowDocumentOperation)Operation)
                    {
                    case WorkflowDocumentOperation.CreateNew:
                        context.CurrentDocument = docRepo.New(DocumentDefId);
                        break;

                    case WorkflowDocumentOperation.SaveCurrent:
                        if (context.CurrentDocument != null)
                        {
                            //lock(DocRepository.DocSaveLock)
                            context.CurrentDocument   = docRepo.Save(context.CurrentDocument);
                            context.CurrentDocumentId = context.CurrentDocument.Id;

                            // Сохранение BLOB данных из контекста
                            if (context.Data.BlobDatas != null)
                            {
                                foreach (var blobData in
                                         context.Data.BlobDatas.Where(
                                             bd => bd.DocumentId == context.CurrentDocument.Id))
                                {
                                    docRepo.SaveBlobAttrData(context.CurrentDocument.Id, blobData.AttributeDefId,
                                                             blobData.Data, blobData.FileName);
                                }
                            }
                        }
                        else
                        {
                            throw new ApplicationException("Нет документа для сохранения");
                        }
                        break;

                    case WorkflowDocumentOperation.DeleteCurrent:
                        if (context.CurrentDocument != null)
                        {
                            docRepo.DeleteById(context.CurrentDocument.Id);
                        }
                        else
                        {
                            throw new ApplicationException("Нет документа для удаления");
                        }
                        break;

                    case WorkflowDocumentOperation.CreateNewById:
                        if (context.CurrentDocumentDefId != null)
                        {
                            context.CurrentDocument = docRepo.New((Guid)context.CurrentDocumentDefId);
                        }
                        else
                        {
                            throw new ApplicationException("Не могу создать документ. Класс документа не указан!");
                        }
                        break;

                    case WorkflowDocumentOperation.LoadById:
                        if (context.CurrentDocumentId != null)
                        {
                            context.CurrentDocument = docRepo.LoadById((Guid)context.CurrentDocumentId);
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Не могу загрузить документ. Идентификатор документа не указан!");
                        }
                        break;

                    case WorkflowDocumentOperation.DeleteById:
                        if (context.CurrentDocumentId != null)
                        {
                            docRepo.DeleteById((Guid)context.CurrentDocumentId);
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Не могу удалить документ. Идентификатор документа не указан!");
                        }
                        break;

                    case WorkflowDocumentOperation.DefineDocDefId:
                        context.CurrentDocumentDefId = DocumentDefId;
                        break;

                        /*
                         *              case WorkflowDocumentOperation.FindDoc:
                         * //                        List<Guid> docs = new List<Guid>();
                         *                  var en = new Entities();
                         *
                         *                  var docs = en.Object_Defs.OfType<Document_Def>()
                         *                  break;
                         */
                    }

                    base.Execute(context, provider, dataContext);
                }
                catch (Exception e)
                {
                    OnException(context, e);
                    context.ThrowException(e);
                }
            }
        }
Exemple #18
0
        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);
        }