//------------------------------------------------------------------------------------ public void GetInfosPopup(IDonneeNotification donnee, ref bool bShouldDisplay, ref string strLibelle, ref Image image) { bShouldDisplay = false; CDonneeNotificationWorkflow dw = donnee as CDonneeNotificationWorkflow; if (dw == null) { return; } string[] strCodesInteressants = CUtilSession.GetCodesAffectationsEtapeConcernant(CSc2iWin32DataClient.ContexteCourant); bool bPourMoi = false; foreach (string strCode in strCodesInteressants) { if (dw.CodesAffectations.Contains("~" + strCode + "~")) { bPourMoi = true; break; } } if (bPourMoi) { strLibelle = dw.Libelle; image = Resources._1346738948_task; bShouldDisplay = true; } }
void m_recepteurWorkflow_OnReceiveNotification(IDonneeNotification donnee) { CDonneeNotificationWorkflow dw = donnee as CDonneeNotificationWorkflow; if (dw == null) { return; } string[] strCodesInteressants = CUtilSession.GetCodesAffectationsEtapeConcernant(CSc2iWin32DataClient.ContexteCourant); bool bPourMoi = false; foreach (string strCode in strCodesInteressants) { if (dw.CodesAffectations.Contains("~" + strCode + "~")) { bPourMoi = true; break; } } if (bPourMoi) { CSessionClient session = CSessionClient.GetSessionForIdSession(dw.IdSessionEnvoyeur); CSousSessionClient sousSession = session as CSousSessionClient; if (sousSession != null) { session = sousSession.RootSession; } if (session != null && session.IdSession == CTimosApp.SessionClient.IdSession && dw.ExecutionAutomatique ) { m_nIdEtapeToLaunch = dw.IdEtapeSource; } m_nNbClignotementsWorkflowsRestant += c_nNbClignotementsWorkflow; CDonneesActeurUtilisateur user = CUtilSession.GetUserForSession(CSc2iWin32DataClient.ContexteCourant); if (user != null) { CListeObjetsDonnees lstPourActeur = user.Acteur.GetEtapeWorkflowsEnCours(); m_nNbEtapesEnCours = lstPourActeur.Count; if (m_nNbEtapesEnCours > 0) { m_lblNbToDo.Text = m_nNbEtapesEnCours.ToString(); m_lblNbToDo.Visible = true; } else { m_lblNbToDo.Text = "0"; m_lblNbToDo.Visible = false; } } } }
//------------------------------------------------------------------------------------ public void ExecuteNotification(IDonneeNotification donnee) { CDonneeNotificationWorkflow dw = donnee as CDonneeNotificationWorkflow; if (dw != null) { int nId = dw.IdEtapeSource; CEtapeWorkflow etape = new CEtapeWorkflow(CSc2iWin32DataClient.ContexteCourant); if (etape.ReadIfExists(nId)) { CGestionnaireWorkflowsEnCours.Instance.AfficheEtape(etape); } } }
//----------------------------------------------------------------------------------------------------- private void m_menuSendNotifications_Click(object sender, EventArgs e) { CEtapeWorkflow etape = EtapeSelectionnee; if (etape != null) { CDonneeNotificationWorkflow notification = new CDonneeNotificationWorkflow( etape.ContexteDonnee.IdSession, etape.Id, etape.Libelle, etape.CodeAffectations, etape.TypeEtape.ExecutionAutomatique); CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { notification }); } }
/// ////////////////////////////////////////////////// ///Démarre une étape. ///Attention, un étape ne peut démarrer que si elle n'est pas déjà démarrée public void RunEtape(int nIdSessionMain, int nIdEtape) { CResultAErreur result = CResultAErreur.True; CDbKey keyUser = null; //Attend la fin des transactions en cours pour la session principale IDatabaseConnexion cnx = null; do { CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); if (session != null && session.IsConnected) { IInfoUtilisateur info = session.GetInfoUtilisateur(); //TESTDBKEYTODO if (info != null) { keyUser = info.KeyUtilisateur; } try { cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeof(CEtapeWorkflow)); } catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller ! { cnx = null; } System.Threading.Thread.Sleep(50); } else { cnx = null; } }while (cnx != null && cnx.IsInTrans()); lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps ! { List <CDonneeNotificationWorkflow> lstNotifications = new List <CDonneeNotificationWorkflow>(); CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess(); using (CSessionClient sousSession = CSessionClient.CreateInstance()) { try { Console.WriteLine("Thread : " + System.Diagnostics.Process.GetCurrentProcess().Threads.Count); sousSession.OpenSession(auth, "Workflow step " + nIdEtape, ETypeApplicationCliente.Process); //TESTDBKEYTODO if (keyUser != null) { sousSession.ChangeUtilisateur(keyUser); } using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true)) { CEtapeWorkflow etape = new CEtapeWorkflow(ctx); int nWaiter = 10; while (!etape.ReadIfExists(nIdEtape) && nWaiter > 0) { //On ne trouve pas l'étape, c'est peut être que l'écriture en base n'est pas completement terminée //On va retenter toutes les 2 secondes pendant 20 secondes, si elle n'existe jamais, //c'est qu'il y a eu suppression (ou au moins non commit). nWaiter--; Thread.Sleep(2000); } if (etape.ReadIfExists(nIdEtape)) { result = etape.InternalSetInfosDemarrageInCurrentContext(); etape.EtatCode = (int)EEtatEtapeWorkflow.Démarrée; result = ctx.SaveAll(true); if (result) { result = etape.InternalRunAndSaveifOk(); } if (result && etape.CodeAffectations.Length > 0 && etape.DateFin == null) { CDonneeNotificationWorkflow donneeWorkflow = new CDonneeNotificationWorkflow( nIdSessionMain, etape.Id, etape.Libelle, etape.CodeAffectations, etape.TypeEtape.ExecutionAutomatique); lstNotifications.Add(donneeWorkflow); // Déclenche l'evenement spécifique au démarrage de l'étape result = etape.EnregistreEvenement(CEtapeWorkflow.c_codeEvenementOnRunStep, true); } if (!result) { NoteErreurSurEtape(etape, result.Erreur.ToString()); return; } } } } catch (Exception e) { } finally { sousSession.CloseSession(); } } if (lstNotifications != null) { CEnvoyeurNotification.EnvoieNotifications(lstNotifications.ToArray()); } } }
//------------------------------------------------------------------------ private void ExecuteEtape(CParametresStartEtapeInPile parametreStart) { //C2iEventLog.WriteInfo("DEBUG_TODO - ExecuteEtape()"); List <CDonneeNotificationWorkflow> lstNotifications = new List <CDonneeNotificationWorkflow>(); //TESTDBKEYTODO if (parametreStart.KeyUtilisateur != null) { m_session.ChangeUtilisateur(parametreStart.KeyUtilisateur); } try { using (CContexteDonnee ctx = new CContexteDonnee(m_session.IdSession, true, false)) { CResultAErreur result = CResultAErreur.True; CEtapeWorkflow etape = new CEtapeWorkflow(ctx); //C2iEventLog.WriteInfo("DEBUG_TODO - ExecuteEtape() - etape.ReadIfExists(" + parametreStart.IdEtape + ")"); if (etape.ReadIfExists(parametreStart.IdEtape)) { //C2iEventLog.WriteInfo("DEBUG_TODO - ExecuteEtape() OK étape existe Id = " + parametreStart.IdEtape); result = etape.InternalSetInfosDemarrageInCurrentContext(); //C2iEventLog.WriteInfo("DEBUG_TODO - etape.InternalSetInfosDemarrageInCurrentContext() Id = " + parametreStart.IdEtape); etape.EtatCode = (int)EEtatEtapeWorkflow.Démarrée; result = ctx.SaveAll(true); //C2iEventLog.WriteInfo("DEBUG_TODO - ctx.SaveAll(true) Id = " + parametreStart.IdEtape + " - result = " + result.Result); if (result) { //C2iEventLog.WriteInfo("DEBUG_TODO - before InternalRunAndSaveifOk() Id = " + parametreStart.IdEtape); result = etape.InternalRunAndSaveifOk(); //C2iEventLog.WriteInfo("DEBUG_TODO - after InternalRunAndSaveifOk() Id = " + parametreStart.IdEtape); } else { C2iEventLog.WriteInfo("DEBUG_TODO - InternalRunAndSaveifOk() - Erreur : " + result.MessageErreur); } if (result && etape.CodeAffectations.Length > 0 && etape.DateFin == null) { CDonneeNotificationWorkflow donneeWorkflow = new CDonneeNotificationWorkflow( m_session.IdSession, etape.Id, etape.Libelle, etape.CodeAffectations, etape.TypeEtape.ExecutionAutomatique); lstNotifications.Add(donneeWorkflow); // Déclenche l'evenement spécifique au démarrage de l'étape result = etape.EnregistreEvenement(CEtapeWorkflow.c_codeEvenementOnRunStep, true); //C2iEventLog.WriteInfo("DEBUG_TODO - ExecuteEtape() - etape.EnregistreEvenement()"); } if (!result) { NoteErreurSurEtape(etape, result.MessageErreur); return; } //C2iEventLog.WriteInfo("DEBUG_TODO - ExecuteEtape() - Fin traitement étape Id = " + parametreStart.IdEtape); } } } catch (Exception e) { C2iEventLog.WriteErreur("DEBUG_TODO - ExecuteEtape() - Exception executing step Id = " + parametreStart.IdEtape + Environment.NewLine + e.Message); } if (lstNotifications != null) { CEnvoyeurNotification.EnvoieNotifications(lstNotifications.ToArray()); } }