/// /////////////////////////////////////// private void m_timerClignotant_Tick(object sender, System.EventArgs e) { if (m_imageInterventionProcess.Image == null) { m_imageInterventionProcess.Image = m_icones.Images[c_nImageIntervention]; } else { m_imageInterventionProcess.Image = null; } if (m_nNbClignotementsWorkflowsRestant > 0) { if (m_nIdEtapeToLaunch != null) { int nId = m_nIdEtapeToLaunch.Value; m_nIdEtapeToLaunch = null; CEtapeWorkflow etape = new CEtapeWorkflow(CSc2iWin32DataClient.ContexteCourant); if (etape.ReadIfExists(nId)) { CGestionnaireWorkflowsEnCours.Instance.AfficheEtape(etape); } } m_pictureWorkflow.Visible = !m_pictureWorkflow.Visible; m_lblNbToDo.Visible = m_nNbEtapesEnCours > 0 && m_pictureWorkflow.Visible; m_nNbClignotementsWorkflowsRestant--; } if (m_nNbClignotementsWorkflowsRestant <= 0) { m_pictureWorkflow.Visible = true; m_lblNbToDo.Visible = m_nNbEtapesEnCours > 0; m_pictureWorkflow.Invalidate(); } }
//------------------------------------------------------------------------------------ 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 AfterInitFromContexteOnForm(IFormNavigable form, CContexteFormNavigable contexte) { CFormEditionStandard frmStd = form as CFormEditionStandard; if (frmStd != null) { int?nIdEtape = contexte[c_cleContexteEtape] as int?; if (nIdEtape != null) { CEtapeWorkflow etape = new CEtapeWorkflow(CSc2iWin32DataClient.ContexteCourant); if (etape.ReadIfExists(nIdEtape.Value)) { m_dicFormToEtape[frmStd] = etape; CFormMain.GetInstance().SetEtapeActive(etape, form as CFormEditionStandard); AppliqueEtape(etape, frmStd); } } } }
/// /////////////////////////////////////////// public override CResultAErreur RunService(object parametre) { CResultAErreur result = CResultAErreur.True; if (!(parametre is CActionAfficheEtapeWorkflow.CParametreAffichageEtapeWorkflow)) { result.EmpileErreur(I.T("Parameter type imcompatible with 'Display workflow' service|20589")); return(result); } CActionAfficheEtapeWorkflow.CParametreAffichageEtapeWorkflow parametreEdition = (CActionAfficheEtapeWorkflow.CParametreAffichageEtapeWorkflow)parametre; CEtapeWorkflow etape = new CEtapeWorkflow(CSc2iWin32DataClient.ContexteCourant); if (etape.ReadIfExists(parametreEdition.IdEtapeWorkflow)) { CFormMain.GetInstance().DisplayEtapeFromOtherThread(etape, parametreEdition.DansNouvelOnglet); } return(result); }
/// ////////////////////////////////////////////////// ///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()); } }