예제 #1
0
        /// <summary>
        /// Modifie les données d'un SelectorInstance. Les données sont d'abord sauvées, puis le SelectorInstance passe en Act et en Constraints.
        /// </summary>
        /// <param name="selectorInstanceId">Id du SelectorInstance</param>
        /// <param name="values">Valeurs à modifier</param>
        /// <remarks>Les valeurs à modifier sont au format suivant : {id de la cellule}:{nouvelle valeur}</remarks>
        /// <returns>Message à modifier</returns>
        public async Task <HttpResponseMessageResult> SaveData(long selectorInstanceId, IEnumerable <KeyValuePair <long, double> > values)
        {
            // Création de la transaction
            using (IDbContextTransaction transaction = UnitOfWork.GetDbContext().Database.BeginTransaction())
            {
                SessionStatsHelper.HttpHitSaveDBTransaction(transaction, _serviceProvider);

                // Recherche du selectorInstance
                List <SelectorInstance> lstSelectInst = await UnitOfWork.GetDbContext().SelectorInstance
                                                        .Where(si => si.Id == selectorInstanceId)
                                                        .Include(si => si.SelectorConfig)
                                                        .Include(si => si.WorkflowInstance)
                                                        .ThenInclude(wfi => wfi.WorkflowConfig)
                                                        .ToAsyncEnumerable()
                                                        .ToList();

                SelectorInstance selectorInstance = lstSelectInst.FirstOrDefault();

                if (selectorInstance == null)
                {
                    throw new WrongParameterException($"SelectorEngine.SaveData: bad SelectorInstance Id ({selectorInstanceId}).");
                }

                // On pousse les valeurs volatiles vers les futures valeurs.
                HttpResponseMessageResult res = await SelectorInstanceDomain.PushVolatileToFuture(selectorInstance);

                // Passage aux étapes suivantes
                UnitOfWork.SelectorInstanceRepository.PrepareUpdateForObject(selectorInstance);
                res.Append(await NextStep(selectorInstance, selectorInstance.WorkflowInstance, SelectorStateEnum.Init, values));

                transaction.Commit();
                return(res);
            }
        }
예제 #2
0
        /// <summary>
        /// Génére tous les SelectorInstance depuis les criteria donnés.
        /// </summary>
        /// <param name="selectConf">SelectorConfig cible</param>
        /// <param name="wfInstance">WorkflowInstance nouvellement démarré</param>
        /// <param name="parent">Eventuel SelectorInstance pouvant être à l'origine de la création de nouvelles instances</param>
        /// <returns>Message de résultat</returns>
        public async Task <HttpResponseMessageResult> GenerateSelectorsInstances(SelectorConfig selectConf, WorkflowInstance wfInstance, SelectorInstance parent = null)
        {
            if (selectConf == null)
            {
                throw new SequenceException("Process.SelectorConfig.Init: SelectorConfig are null.");
            }

            if (selectConf.Criterias == null)
            {
                throw new DataLoadingException("SelectorConfig : Criterias not loaded!");
            }

            // WOR-174 - Créer en chaine les SelectorInstance selon la liste de Criterias...
            // On passe directement les criteria valorisés dans la requête de sélection...
            IEnumerable <IEnumerable <CriteriaValues> > lstCV = await CriteriaDomain.ExtractAllCriteriaValues(selectConf.Criterias, wfInstance);

            IEnumerable <IEnumerable <CriteriaValues> > lstCrit = await GetValueObjectsFromCriteria(lstCV, wfInstance.DataSetId);

            HttpResponseMessageResult res = new HttpResponseMessageResult()
            {
                IsSuccess = true
            };

            foreach (IEnumerable <CriteriaValues> cvs in lstCrit)
            {
                SelectorInstance si = await SelectorInstanceDomain.Create(selectConf, cvs, parent, wfInstance);

                UnitOfWork.SelectorInstanceRepository.PrepareUpdateForObject(si);
                res.Append(await NextStep(si, wfInstance));
            }

            return(res);
        }
예제 #3
0
        /// <summary>
        /// This function permits to do a COMMIT action.
        /// </summary>
        /// <remarks>
        /// This method can to execute from the frontal
        /// </remarks>
        /// <param name="selectorInstance">SelectorInstance</param>
        public async Task Commit(SelectorInstance selectorInstance)
        {
            selectorInstance.Status = SelectorStateEnum.Commit;

            await SelectorInstanceDomain.Update(selectorInstance);

            await PropagateAsync(selectorInstance);
        }
예제 #4
0
        /// <summary>
        /// Récupére l'entité désignée par l'id en paramétre.
        /// </summary>
        /// <param name="id">Id de l'entité</param>
        /// <returns>Message de retour avec l'entité</returns>
        public async Task <DTO.SelectorInstance> GetById(long id)
        {
            ENT.SelectorInstance selectorInstance = await SelectorInstanceDomain.Get(id);

            DTO.SelectorInstance dtoSelectorInstance = null;
            if (selectorInstance != null)
            {
                dtoSelectorInstance = Mapper.Map <ENT.SelectorInstance, DTO.SelectorInstance>(selectorInstance);
            }

            return(dtoSelectorInstance);
        }
예제 #5
0
        /// <summary>
        /// Récupére toutes les entités DTO existantes.
        /// </summary>
        /// <returns>Message de retour avec la liste en json</returns>
        public async Task <IEnumerable <DTO.SelectorInstance> > GetAll()
        {
            IEnumerable <ENT.SelectorInstance> selectorInstance = await SelectorInstanceDomain.Get();

            IEnumerable <DTO.SelectorInstance> dtoSelectorInstance = null;

            if (selectorInstance != null)
            {
                dtoSelectorInstance = Mapper.Map <IEnumerable <ENT.SelectorInstance>, IEnumerable <DTO.SelectorInstance> >(selectorInstance);
            }
            else
            {
                dtoSelectorInstance = new List <DTO.SelectorInstance>();
            }

            return(dtoSelectorInstance);
        }
예제 #6
0
        /// <summary>
        /// This function permits to do a INIT action.
        /// </summary>
        /// <param name="selectorInstance">SelectorInstance</param>
        /// <param name="wfInstance">Workflow instance</param>
        /// <returns>Message</returns>
        public async Task <HttpResponseMessageResult> Init(SelectorInstance selectorInstance, WorkflowInstance wfInstance)
        {
            if ((selectorInstance == null) || (wfInstance == null))
            {
                throw new WrongParameterException("Process.SelectorInstance.Init: SelectorInstance or WorkflowInstance are null!");
            }

            HttpResponseMessageResult res = new HttpResponseMessageResult()
            {
                IsSuccess = true
            };

            // Sélection des données et enregistrement des liaisons (subset)
            ICollection <CriteriaValues>        lstCv  = selectorInstance.CriteriaValues;
            Dictionary <long, DataSetDimension> dimIds = await DataSetDimensionDomain.GetDimensionColumns(wfInstance.DataSetId);

            List <Expression <Func <ValueObject, bool> > > where = new List <Expression <Func <ValueObject, bool> > >();

            res.Append(ValueObjectDomain.BuildFilterRequest(where, new List <IEnumerable <CriteriaValues> >()
            {
                lstCv
            }, dimIds, true));

            IQueryable <ValueObject> dbQuery = UnitOfWork.GetDbContext().Set <ValueObject>();
            // Vérification que le SelectorInstance n'utilise pas les données d'un autre SelectorInstance.
            int nbrLinkVoSi = await where
                              .Aggregate(dbQuery, (current, predicate) => current.Where(predicate))
                              .Include(vo => vo.SelectorInstanceValueObject)
                              .Where(vo => vo.SelectorInstanceValueObject.Count > 0)
                              .AsNoTracking()
                              .CountAsync();

            if (nbrLinkVoSi > 0)
            {
                throw new SequenceException($"SelecotrEngine.Init: Can't allocate data for SelectorInstance (from {selectorInstance?.SelectorConfig?.Name}) because there are already SelectorInstance for data.");
            }

            IEnumerable <ValueObject> lstValueObject = await where
                                                       .Aggregate(dbQuery, (current, predicate) => current.Where(predicate))
                                                       .Include(vo => vo.DataSet)
                                                       .Where(vo => vo.DataSet.Id == wfInstance.DataSetId)
                                                       //.AsNoTracking()
                                                       .ToAsyncEnumerable()
                                                       .ToList();

            selectorInstance.SelectorInstanceValueObject = new List <SelectorInstanceValueObject>();
            foreach (ValueObject vo in lstValueObject)
            {
                vo.FutureValue = null;
                SelectorInstanceValueObject sivo = new SelectorInstanceValueObject()
                {
                    SelectorInstance = selectorInstance,
                    ValueObject      = vo
                };
                sivo.InitDatesAndUser("");

                selectorInstance.SelectorInstanceValueObject.Add(sivo);
                vo.SelectorInstanceValueObject.Add(sivo);
                vo.Status = ValueObjectStatusEnum.Modify;
            }
            int nbr = await UnitOfWork.GetDbContext().SaveChangesAsync();

            // Création de la table temporaire de données...
            res.Append(await GridConfigurationDomain.CreateDataTableDB(selectorInstance, wfInstance));

            // Recherche des modificateurs
            res.Append(await SelectorInstanceDomain.FindModificator(selectorInstance, wfInstance));

            // Recherche des validateurs
            res.Append(await SelectorInstanceDomain.FindValidators(selectorInstance, wfInstance));

            // On régle les données modifiables
            res.Append(await SelectorInstanceDomain.SetModifyData(selectorInstance, wfInstance, dimIds));

            return(res);
        }