Beispiel #1
0
        private DocumentWorkflow CreateWorkflow(WtPtWorkoffice oldWorkoffice, int newDocumentId)
        {
            try
            {
                var wf = new DocumentWorkflow
                {
                    ControlDate    = GetNullableDate(oldWorkoffice.ControlDate),
                    CurrentStageId = GetObjectId <DicRouteStage>(oldWorkoffice.ToStageId),
                    CurrentUserId  = GetUserId(oldWorkoffice.ToUserId),
                    DateCreate     = new DateTimeOffset(oldWorkoffice.DateCreate.GetValueOrDefault(DateTime.Now)),
                    DateUpdate     = new DateTimeOffset(oldWorkoffice.Stamp.GetValueOrDefault(DateTime.Now)),
                    Description    = oldWorkoffice.Description,
                    ExternalId     = oldWorkoffice.Id,
                    FromStageId    = GetObjectId <DicRouteStage>(oldWorkoffice.FromStageId),
                    FromUserId     = GetUserId(oldWorkoffice.FromUserId),
                    IsComplete     = GenerateHelper.StringToNullableBool(oldWorkoffice.IsComplete),
                    IsMain         = false,
                    IsSystem       = GenerateHelper.StringToNullableBool(oldWorkoffice.IsSystem),
                    OwnerId        = newDocumentId,
                    RouteId        = GetObjectId <DicRoute>(oldWorkoffice.TypeId),
                    Timestamp      = BitConverter.GetBytes(DateTime.Now.Ticks),
                    IsCurent       = GetCurentFlag(oldWorkoffice)
                };

                return(wf);
            }
            catch (Exception)
            {
                return(null);
            }
        }
Beispiel #2
0
        public DocumentUserSignature GetDocumentUserSignature(DocumentWorkflow documentWorkflow, List <int> ignoreSignaturies)
        {
            var documentUserSingrature = _context.DocumentUsersSignaturies
                                         .AsNoTracking()
                                         .Where(us => us.DocId == documentWorkflow.OwnerId && documentWorkflow.CurrentUserId == us.UserId && !ignoreSignaturies.Contains(us.Id))
                                         .FirstOrDefault();

            if (documentUserSingrature == null)
            {
                return(null);
            }

            ignoreSignaturies.Add(documentUserSingrature.Id);

            return(new DocumentUserSignature
            {
                //TODO: УБРАЛ ID, Не переносится почему то
                //Id = documentUserSingrature.Id,
                UserId = documentUserSingrature.UserId,
                WorkflowId = documentWorkflow.Id,
                PlainData = documentUserSingrature.FingerPrint,
                SignedData = documentUserSingrature.SignedData,
                SignerCertificate = documentUserSingrature.SignerCertificate,
                DateCreate = documentUserSingrature.SignDate ?? DateTime.Now,
            });
        }
Beispiel #3
0
    public void TestKSM2()
    {
        int Undoc = 405193;

        DocumentWorkflow dwf = new DocumentWorkflow();

        // Пполучение документа внутри класса
        DocumentWorkflow.HeadDocumentInChain(Undoc);
        //InfoManager.MessageBox("DocumentWorkflow.HeadDocumentInChain(Undoc);");

        // Переход на стадию
        DocumentWorkflow.MoveNextChain(Undoc);
        //InfoManager.MessageBox("DocumentWorkflow.MoveNextChain(Undoc);");

        //DocumentWorkflow.MovePreviousStageIncome();
        //InfoManager.MessageBox("DocumentWorkflow.MovePreviousStageIncome();");

        // Пример проведения проводок по документу спомощью RRT метода
        DocumentWorkflow.CallRRTMetod(Undoc, "DMZ_DMR10");
        //InfoManager.MessageBox("DocumentWorkflow.CallRRTMetod(Undoc, 'DMZ_DMR10');");

        // Пример проведения проводок по документу
        DocumentWorkflow.FormEntries(Undoc);   //FormEntries(int Undoc)
        //InfoManager.MessageBox("DocumentWorkflow.FormEntries(Undoc)");

        // Пример удалления проводок по документу
        DocumentWorkflow.DeleteEntries(Undoc);

        //InfoManager.MessageBox("DocumentWorkflow.DeleteEntries(Undoc);");



        DocumentWorkflow.Refresh();
        //InfoManager.MessageBox("DocumentWorkflow.Refresh();");
    }
Beispiel #4
0
        // Внимание! Желательно всякие странные условия, связанные получением следующих этапов бизнесс процесса документов,
        // которые по разным причинам нельзя реализовать на уровне базы данных, встраивать в этот метод, не загрязняя код в контроллерах или других местах.

        /// <summary>
        /// Фильтрует следующие этапы бизнес процесса, используя какую-то бизнес логику, которая не реализована на уровне бд.
        /// </summary>
        /// <param name="currentDocumentWorkflow">Текущий бизнес процесс документа.</param>
        /// <param name="nextRouteStages">Массив следующих этапов бизнес процесса документа.</param>
        /// <returns>Отфильтрованный массив следующих этапов бизнес процесса документа.</returns>
        private async Task <DicRouteStage[]> FilterRouteStagesUsingBusinessLogic(DocumentWorkflow currentDocumentWorkflow, DicRouteStage[] nextRouteStages)
        {
            Document document = currentDocumentWorkflow.Owner;

            // Если документ является свидетельством на ТЗ или НМПТ и его текущий этап бизнес процесса "Создание исходящего документа", то
            // он отправляет на этап "Контроль заместителя начальника департамента", если этот этап был в массиве следующих доступных этапов.
            // Если же документ является отчетом эксперта по заявке ТЗ и НМПТ и его текущий этап бизнес процесса "Создание внутреннего документа", то
            // доступных этапов для перехода у этого документа не будет.
            if (document.Type.Code == DicDocumentTypeCodes.NmptCertificate)
            {
                DicRouteStage fromStage = await GetRouteStageById(currentDocumentWorkflow.CurrentStageId ?? 0);

                if (fromStage.Code == RouteStageCodes.DocumentOutgoing_01_1)
                {
                    nextRouteStages = nextRouteStages
                                      .Where(routeStage => routeStage.Code == RouteStageCodes.OUT_DeputyHeadOfDepartment)
                                      .ToArray();
                }
            }
            else if (document.Type.Code == DicDocumentTypeCodes.TZPOL555 ||
                     document.Type.Code == DicDocumentTypeCodes.TZPOL555PR ||
                     document.Type.Code == DicDocumentTypeCodes.TZPOL555PRWD ||
                     document.Type.Code == DicDocumentTypeCodes.TZPOL555PF)
            {
                DicRouteStage fromStage = await GetRouteStageById(currentDocumentWorkflow.CurrentStageId ?? 0);

                if (fromStage.Code == RouteStageCodes.DocumentInternal_0_1)
                {
                    nextRouteStages = new DicRouteStage[] { };
                }
            }


            return(nextRouteStages);
        }
Beispiel #5
0
        /// <summary>
        /// Создает документ и возвращает его идентификатор.
        /// </summary>
        /// <param name="material">Материал.</param>
        /// <returns>Идентификатор созданного документа.</returns>
        private async Task <int> CreateDocumentAndGetId(MaterialDetailDto material)
        {
            Document newDocument = _executor
                                   .GetHandler <CreateDocumentFromUploadedFileHandler>()
                                   .Process(handler => handler.Execute(material));

            DicDocumentStatus workStatus = _executor
                                           .GetQuery <GetDocumentStatusByCodeQuery>()
                                           .Process(query => query.Execute(DicDocumentStatusCodes.InWork));

            newDocument.StatusId = workStatus.Id;

            int documentId = await _executor
                             .GetCommand <CreateDocumentCommand>()
                             .Process(command => command.ExecuteAsync(newDocument));

            DocumentWorkflow initialWorkflow = await _executor
                                               .GetQuery <GetInitialDocumentWorkflowQuery>()
                                               .Process(query => query.ExecuteAsync(documentId, NiisAmbientContext.Current.User.Identity.UserId));

            await _executor
            .GetCommand <ApplyDocumentWorkflowCommand>()
            .Process(command => command.ExecuteAsync(initialWorkflow));

            if (newDocument.DocumentType == DocumentType.Incoming)
            {
                await _executor
                .GetHandler <GenerateDocumentIncomingNumberHandler>()
                .Process(c => c.ExecuteAsync(documentId));
            }

            return(documentId);
        }
        public void Execute(DocumentWorkflow documentWorkflow)
        {
            var repo = Uow.GetRepository <DocumentWorkflow>();

            repo.Update(documentWorkflow);

            Uow.SaveChanges();
        }
Beispiel #7
0
        public void Execute(DocumentWorkflow workflow)
        {
            var requestWorkflowRepository = Uow.GetRepository <DocumentWorkflow>();

            requestWorkflowRepository.Update(workflow);

            Uow.SaveChanges();
        }
Beispiel #8
0
        /// <summary>
        /// Получает массив всех доступных маршрутов документа по его текущему бизнес процессу.
        /// </summary>
        /// <param name="currentDocumentWorkflow">Текущий бизнес процесс документа.</param>
        /// <returns>Массив доступных маршрутов документа.</returns>
        private async Task <RouteStageOrder[]> GetAllNextRouteStageOrders(DocumentWorkflow currentDocumentWorkflow)
        {
            IRepository <RouteStageOrder> routeStageOrderRepository = Uow.GetRepository <RouteStageOrder>();

            return(await routeStageOrderRepository
                   .AsQueryable()
                   .Where(routeStageOrder => routeStageOrder.CurrentStageId == currentDocumentWorkflow.CurrentStageId && !routeStageOrder.IsAutomatic)
                   .ToArrayAsync());
        }
        /// <summary>
        /// Выполнение обработчика.
        /// </summary>
        /// <param name="ownerId">Идентификатор родительской сущности.</param>
        /// <param name="ownerType">Тип родительской сущности.</param>
        /// <param name="documentTypeCode">Код типа документа.</param>
        /// <param name="type">Тип документа.</param>
        /// <param name="userInput">Пользовательский ввод.</param>
        /// <param name="executorId">Идентификатор исполнителя.</param>
        /// <returns>Идентификатор созданного документа.</returns>
        public async Task <int> ExecuteAsync(
            int ownerId,
            Owner.Type ownerType,
            string documentTypeCode,
            DocumentType type,
            UserInputDto userInput,
            int executorId)
        {
            DicDocumentType documentType = GetDocumentTypeWithValidation(documentTypeCode);

            int?addresseeId = await GetAddresseeId(ownerId, ownerType);

            Document document = new Document
            {
                TypeId       = documentType.Id,
                AddresseeId  = addresseeId,
                DocumentType = type,
                DateCreate   = DateTimeOffset.Now
            };

            int documentId = await Executor
                             .GetCommand <CreateDocumentCommand>()
                             .Process(command => command.ExecuteAsync(document));

            await AddDocumentToOwner(ownerId, ownerType, documentId);

            DocumentWorkflow documentWorkflow = await Executor
                                                .GetQuery <GetInitialDocumentWorkflowQuery>()
                                                .Process(query => query.ExecuteAsync(documentId, executorId));

            await Executor
            .GetCommand <ApplyDocumentWorkflowCommand>()
            .Process(command => command.ExecuteAsync(documentWorkflow));

            await Executor
            .GetCommand <UpdateDocumentCommand>()
            .Process(command => command.Execute(document));

            await Executor
            .GetHandler <GenerateDocumentBarcodeHandler>()
            .Process(handler => handler.ExecuteAsync(documentId));

            await Executor
            .GetHandler <GenerateRegisterDocumentNumberHandler>()
            .Process(handler => handler.ExecuteAsync(documentId));

            await Executor
            .GetCommand <CreateUserInputCommand>()
            .Process(command => command.ExecuteAsync(documentId, userInput));

            await Executor
            .GetHandler <ProcessWorkflowByDocumentIdHandler>()
            .Process(handler => handler.ExecuteAsync(documentId));

            return(document.Id);
        }
        public int Execute(DocumentWorkflow workflow)
        {
            var requestWorkflowRepository = Uow.GetRepository <DocumentWorkflow>();

            requestWorkflowRepository.Create(workflow);

            Uow.SaveChanges();

            return(workflow.Id);
        }
Beispiel #11
0
        } = LATEST_VERSION;                                                 // Don't return a hard code value in the get. Change the LATEST_VERSION variable. This is needed for upgrading workflows.

        public override DocumentWorkflow UpgradeWorkflow()
        {
            DocumentWorkflow upgradedWorkflow = base.UpgradeWorkflow();

            if (this.WorkflowVersion == LATEST_VERSION)
            {
                // Upgrade Workflow
            }
            return(upgradedWorkflow);
        }
        } = LATEST_VERSION;                                                 // Don't return a hard coded value in the get. Change the LATEST_VERSION variable. This is needed for upgrading workflows.

        public override DocumentWorkflow UpgradeWorkflow()
        {
            DocumentWorkflow currentWorkflow = base.UpgradeWorkflow();

            if (this.WorkflowVersion < LATEST_VERSION)
            {
                // Upgrade workflow settings
            }

            return(currentWorkflow);
        }
Beispiel #13
0
        public void Apply(DocumentWorkflow workflow)
        {
            var document = workflow.Owner ?? _context.Documents.SingleOrDefault(d => d.Id == workflow.OwnerId);

            if (document == null)
            {
                throw new ApplicationException($"Workflow has incorrect document id: {workflow.OwnerId}");
            }

            document.CurrentWorkflow = workflow;
            _context.DocumentWorkflows.Add(workflow);
        }
Beispiel #14
0
        public async Task <int> ExecuteAsync(DocumentWorkflow workflow, bool isPrevious = false)
        {
            var documentRepo   = Uow.GetRepository <Document>();
            var documentWfRepo = Uow.GetRepository <DocumentWorkflow>();
            var routeStageRepo = Uow.GetRepository <DicRouteStage>();
            var document       = await documentRepo.GetByIdAsync(workflow.OwnerId);

            if (document == null)
            {
                throw new DataNotFoundException(nameof(Document), DataNotFoundException.OperationType.Read, workflow.OwnerId);
            }

            var workflowRepo = Uow.GetRepository <DocumentWorkflow>();

            var currentWorkflows = documentWfRepo
                                   .AsQueryable()
                                   .Include(d => d.CurrentStage)
                                   .Where(d => d.OwnerId == workflow.OwnerId && d.IsCurent == true);

            DocumentWorkflow currentWorkflow = null;

            var prevStage = await routeStageRepo.GetByIdAsync(workflow.FromStageId.GetValueOrDefault(0));

            if (prevStage != null)
            {
                currentWorkflow = currentWorkflows.FirstOrDefault(d => d.CurrentStage.Code == prevStage.Code);
            }

            if (isPrevious)
            {
                var previousWorkflow = await workflowRepo.GetByIdAsync(currentWorkflow?.PreviousWorkflowId);

                workflow.PreviousWorkflowId = previousWorkflow?.PreviousWorkflowId;
            }
            else
            {
                workflow.PreviousWorkflowId = currentWorkflow?.Id;
            }

            if (currentWorkflow != null)
            {
                currentWorkflow.IsCurent = false;
                workflowRepo.Update(currentWorkflow);
            }

            workflow.IsCurent = true;
            await workflowRepo.CreateAsync(workflow);

            await Uow.SaveChangesAsync();

            return(workflow.Id);
        }
Beispiel #15
0
    void NextStateAndPostingDo(int Undoc)
    {
        // Следуящая стадия
        //InfoManager.MessageBox("Процедура включения");

        DocumentWorkflow dwf = new DocumentWorkflow();

        DocumentWorkflow.MoveNextChain(Undoc);

        //DocumentWorkflow dwf = new DocumentWorkflow();
        //InfoManager.MessageBox("Переход на след. стадию произошел");
        //DocumentWorkflow.DoPosting(Undoc);

        //InfoManager.MessageBox("Разноска произошла успешно");
        //DocumentWorkflow.Refresh();
    }
        /// <summary>
        /// Создание материала
        /// </summary>
        /// <param name="document">Объект</param>
        public void CreateDocument(Document document)
        {
            var user = _niisContext.Users.FirstOrDefault(d => d.Id == _configuration.AuthorAttachmentDocumentId);

            document.DepartmentId = user?.DepartmentId;
            document.DivisionId   = user?.Department?.DivisionId;

            if (document.DocumentType == DocumentType.Incoming)
            {
                GenerateDocumentIncomingNumber(document);
            }

            _numberGenerator.GenerateBarcode(document);
            _numberGenerator.GenerateNumForRegisters(document);
            _niisContext.Documents.Add(document);
            _niisContext.SaveChanges();

            var routeId = _integrationDictionaryHelper.GetRouteIdDocumentTypeId(document.TypeId);

            if (!routeId.HasValue)
            {
                throw new NotSupportedException("Необработанный тип объекта");
            }
            var stage = _integrationDictionaryHelper.GetRouteStage(routeId.Value);

            var documentWorkflow = new DocumentWorkflow
            {
                OwnerId        = document.Id,
                DateCreate     = DateTimeOffset.Now,
                RouteId        = routeId,
                CurrentStageId = stage.Id,
                CurrentUserId  = _configuration.AuthorAttachmentDocumentId,
                IsComplete     = stage.IsLast,
                IsCurent       = true,
                IsSystem       = stage.IsSystem,
                IsMain         = stage.IsMain,
                DateUpdate     = DateTimeOffset.Now
            };

            _niisContext.DocumentWorkflows.Add(documentWorkflow);
            _niisContext.SaveChanges();
        }
Beispiel #17
0
        /// <summary>
        /// Выполнение запроса.
        /// </summary>
        /// <param name="documentCurrentWorkflowId">Идентификатор текущего бизнес процесса документа.</param>
        /// <returns>Массив следующих доступных этапов бизнес процесса.</returns>
        public async Task <DicRouteStage[]> ExecuteAsync(int documentCurrentWorkflowId)
        {
            // Получаем текущий бизнес процесс документа и документ с его типом, связанный с этим бизнес процессом.
            DocumentWorkflow currentDocumentWorkflow = await GetDocumentWorkflowWithOwnerAndItsType(documentCurrentWorkflowId);

            Document document = currentDocumentWorkflow.Owner;

            // Получаем массив всех следующих маршрутов, по текущому бизнес процессу документа.
            RouteStageOrder[] allNextRouteStageOrders = await GetAllNextRouteStageOrders(currentDocumentWorkflow);

            // Фильтруем все маршруты и получаем маршруты, у которых есть классификаторы.
            RouteStageOrder[] nextRouteStageOrdersWithClassifications = allNextRouteStageOrders
                                                                        .Where(routeStageOrder => routeStageOrder.ClassificationId.HasValue)
                                                                        .ToArray();

            // Создаем массив доступных маршрутов и записываем туда маршруты, классификаторы которых совпадают с классификатором документа.
            RouteStageOrder[] nextStageOrders = nextRouteStageOrdersWithClassifications
                                                .Where(routeStageOrder => routeStageOrder.ClassificationId == document.Type.ClassificationId)
                                                .ToArray();

            // Если маршрутов с классификаторами не найдено, то в доступные маршруты записываются все маршруты без классификаторов.
            if (!nextStageOrders.Any())
            {
                RouteStageOrder[] nextRouteStageOrdersWithoutClassifications = allNextRouteStageOrders
                                                                               .Where(routeStageOrder => !routeStageOrder.ClassificationId.HasValue)
                                                                               .ToArray();

                nextStageOrders = nextRouteStageOrdersWithoutClassifications;
            }

            // Получаем идентификаторы следующих этапов.
            IEnumerable <int> nextStageIds = nextStageOrders.Select(routeStageOrder => routeStageOrder.NextStageId);

            // Получаем следующие этапы бизнес процесса.
            DicRouteStage[] nextRouteStages = await GetRouteStagesByIds(nextStageIds);

            // Фильтруем следующие этапы, используя бизнес логику.
            nextRouteStages = await FilterRouteStagesUsingBusinessLogic(currentDocumentWorkflow, nextRouteStages);

            return(nextRouteStages);
        }