/// ////////////////////////////////////////////////////////
        protected override CResultAErreur ExecuteAction(CContexteExecutionAction contexte)
        {
            CResultAErreur result = CResultAErreur.True;


            //Calcule le message
            string strMessage = "";
            CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(contexte.Branche.Process);

            contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee);
            result = FormuleMessage.Eval(contexteEval);
            if (!result)
            {
                result     = CResultAErreur.True;
                strMessage = FormuleMessage.GetString();
            }
            else
            {
                strMessage = result.Data == null?"":result.Data.ToString();
            }

            string strCodeAttente = "";

            if (FormuleCodeAttente != null)
            {
                result = FormuleCodeAttente.Eval(contexteEval);
                if (!result || result.Data == null)
                {
                    strCodeAttente = "";
                }
                else
                {
                    strCodeAttente = result.Data.ToString();
                }
            }

            //TESTDBKEYOK (SC)
            CDbKey keyUtilisateur = contexte.Branche.KeyUtilisateur;

            if (m_formuleIdUtilisateur != null)
            {
                //TESTDBKEYOK

                result = m_formuleIdUtilisateur.Eval(contexteEval);
                if (result)
                {
                    if (result.Data is int)
                    {
                        keyUtilisateur = CUtilInfosUtilisateur.GetKeyUtilisateurFromId((int)result.Data);
                    }
                    if (result.Data is string)
                    {
                        keyUtilisateur = CDbKey.CreateFromStringValue((string)result.Data);
                    }
                    if (result.Data is CDbKey)
                    {
                        keyUtilisateur = (CDbKey)result.Data;
                    }
                    if (keyUtilisateur != null)
                    {
                        contexte.Branche.KeyUtilisateur = keyUtilisateur;
                    }
                }
            }

            //Si le code d'attente n'est pas null et qu'il y a déjà une attente,
            //il faut la supprimer
            if (strCodeAttente != null && strCodeAttente.Trim() != "")
            {
                CFiltreData filtre = new CFiltreData(
                    CBesoinInterventionProcess.c_champCodeAttente + "=@1",
                    strCodeAttente);
                CListeObjetsDonnees listeToDelete = new CListeObjetsDonnees(contexte.ContexteDonnee, typeof(CBesoinInterventionProcess));
                listeToDelete.Filtre = filtre;
                if (listeToDelete.Count != 0)
                {
                    CObjetDonneeAIdNumerique.Delete(listeToDelete);
                }
            }

            CBesoinInterventionProcess intervention = new CBesoinInterventionProcess(contexte.ContexteDonnee);

            intervention.CreateNewInCurrentContexte();
            intervention.ProcessEnExecution = contexte.ProcessEnExecution;
            //TESTDBKEYOK
            intervention.KeyUtilisateur = keyUtilisateur;
            intervention.DateDemande    = DateTime.Now;
            intervention.CodeAttente    = strCodeAttente;
            intervention.Libelle        = strMessage;
            CLienAction[] liens = GetLiensSortantHorsErreur();
            if (liens.Length == 1)
            {
                intervention.IdAction = liens[0].ActionArrivee.IdObjetProcess;
            }
            else
            {
                intervention.IdAction = -1;
            }

            //Mise du process en pause !
            result.Data = new CMetteurDeProcessEnPause(  );
            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Execute une action
        /// </summary>
        /// <param name="action"></param>
        /// <param name="contexte"></param>
        /// <param name="bIsActionPrincipaleProcess">Si vrai, considère que le process en execution est fermé en sortie,
        /// si non, il s'agit d'une action appelée dans une boucle par exemple</param>
        /// <returns></returns>
        public CResultAErreur ExecuteAction(
            CAction action,
            CContexteExecutionAction contexte,
            object objetCible,
            bool bIsActionPrincipaleProcess)
        {
            CResultAErreur result = CResultAErreur.True;

            m_pile.Add(new CInfoPileExecution(null, action));
            m_nIdActionEnCours = action.IdObjetProcess;
            action.Process.SetValeurChamp(CProcess.c_strIdVariableElement, objetCible);
            bool                      bFermerLaSessionEnSortant = IsModeAsynchrone && bIsActionPrincipaleProcess;
            CSessionClient            sessionClient             = CSessionClient.GetSessionForIdSession(contexte.IdSession);
            CConfigurationsImpression oldConf = null;

            contexte.SetInfoProgression(action.Libelle);
            try
            {
                if (contexte.IndicateurProgression != null && contexte.IndicateurProgression.CancelRequest)
                {
                    result.EmpileErreur(I.T("User cancellation|182"));
                    result.Data = null;
                    return(result);
                }
            }
            catch { }
            if (sessionClient != null)
            {
                oldConf = sessionClient.ConfigurationsImpression;
            }
            try
            {
                if (sessionClient != null)
                {
                    sessionClient.ConfigurationsImpression = ConfigurationImpression;
                }
                action.Process.ContexteExecution = contexte;
                result = action.Execute(contexte);
                while (result.Data != null && result)
                {
                    //retourne un lien : on continue
                    if (result.Data is CLienAction)
                    {
                        m_nIdActionEnCours = action.IdObjetProcess;
                        CLienAction lien = (CLienAction)result.Data;
                        m_pile.Add(new CInfoPileExecution(lien, lien.ActionArrivee));
                        contexte.ProcessEnExecution.LibelleActionEnCours = lien.ActionArrivee.Libelle;
                        if (lien is CLienAsynchrone && !IsModeAsynchrone)
                        {
                            IsModeAsynchrone = true;
                            //Execution de l'action en mode asynchrone et fin
                            m_actionAsynchroneAExecuter = lien.ActionArrivee;
                            m_contexteAsynchrone        = contexte;
                            Thread th = new Thread(new ThreadStart(ExecuteActionAsynchrone));
                            th.Start();
                            bFermerLaSessionEnSortant = false;
                            result.Data = null;
                            return(result);
                        }
                        else
                        {
                            action = ((CLienAction)result.Data).ActionArrivee;
                            action.Process.ContexteExecution = contexte;

                            contexte.SetInfoProgression(action.Libelle);
                            try
                            {
                                if (contexte.IndicateurProgression != null && contexte.IndicateurProgression.CancelRequest)
                                {
                                    result.EmpileErreur(I.T("User cancellation|182"));
                                    result.Data = null;
                                    return(result);
                                }
                            }
                            catch { }

                            result = action.Execute(contexte);
                        }
                    }
                    else if (result.Data is CMetteurDeProcessEnPause)
                    {
                        //Mise en pause du process
                        result      = contexte.ProcessEnExecution.PauseProcess(contexte);
                        result.Data = null;
                        return(result);
                    }
                    else
                    {
                        result.Data = null;
                    }
                }
                if (bIsActionPrincipaleProcess && result)
                {
                    CResultAErreur resultTmp = contexte.ProcessEnExecution.EnProcess(contexte);
                    if (!resultTmp)
                    {
                        result.Erreur += resultTmp.Erreur;
                        result.Result  = false;
                    }
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }
            finally
            {
                if (sessionClient != null)
                {
                    sessionClient.ConfigurationsImpression = oldConf;
                }
                if (!result && bIsActionPrincipaleProcess)
                {
                    //Pour ne modifier que le process et ne surtout pas faire les sauvegardes autres
                    contexte.ProcessEnExecution.BeginEdit();
                    contexte.ProcessEnExecution.Etat           = EtatProcess.Erreur;
                    contexte.ProcessEnExecution.BrancheEnCours = this;
                    contexte.ProcessEnExecution.InfoEtat       = result.Erreur.ToString();

                    if (IsModeAsynchrone)
                    {
                        //Notifie l'utilisateur qu'un erreur est survenue
                        CBesoinInterventionProcess intervention = new CBesoinInterventionProcess(contexte.ProcessEnExecution.ContexteDonnee);
                        intervention.CreateNewInCurrentContexte();
                        intervention.Libelle     = I.T("@1 action error|259", contexte.ProcessEnExecution.Libelle);
                        intervention.DateDemande = DateTime.Now;
                        //Crée une boite de message pour afficher l'erreur
                        CProcess          process     = contexte.Branche.Process;
                        CActionMessageBox actionNotif = new CActionMessageBox(process);
                        actionNotif.FormuleMessage = new sc2i.expression.C2iExpressionConstante(intervention.Libelle + "\r\n" + result.Erreur.ToString());
                        actionNotif.Libelle        = I.T("Error notification|260");
                        process.AddAction(actionNotif);
                        intervention.IdAction = actionNotif.IdObjetProcess;
                        //TESTDBKEYOK
                        intervention.KeyUtilisateur                = KeyUtilisateur;
                        intervention.ProcessEnExecution            = contexte.ProcessEnExecution;
                        contexte.ProcessEnExecution.BrancheEnCours = contexte.Branche;
                    }
                    contexte.ProcessEnExecution.CommitEdit();
                }
                if (IsModeAsynchrone && bFermerLaSessionEnSortant)
                {
                    //Ferme la session
                    try
                    {
                        CSessionClient session = CSessionClient.GetSessionForIdSession(contexte.IdSession);
                        session.CloseSession();
                    }
                    catch {}
                }
            }
            result.Data = null;
            return(result);
        }