/// <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); } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }