/// <summary> ///Perform Process. /// </summary> /// <returns>Message (variables are parsed)</returns> protected override String DoIt() { string msg = null; MWFActivity activity = new MWFActivity(GetCtx(), p_AD_WF_Activity_ID, Get_Trx()); log.Info("" + activity); MUser user = MUser.Get(GetCtx(), GetAD_User_ID()); // Abort if (p_IsAbort) { msg = user.GetName() + ": Abort"; activity.SetTextMsg(msg); activity.SetAD_User_ID(GetAD_User_ID()); activity.SetWFState(StateEngine.STATE_ABORTED); //JID_0278 : To mark processing checkbox false. // Mohit // Date : 22 May 2019 MTable table = new MTable(GetCtx(), activity.GetAD_Table_ID(), null); PO po = MTable.GetPO(GetCtx(), table.GetTableName(), activity.GetRecord_ID(), Get_Trx()); if (po != null && po.Get_ColumnIndex("Processing") >= 0) { po.Set_Value("Processing", false); po.Save(); } return(msg); } // Change User if (p_AD_User_ID != 0 && activity.GetAD_User_ID() != p_AD_User_ID) { MUser from = MUser.Get(GetCtx(), activity.GetAD_User_ID()); MUser to = MUser.Get(GetCtx(), p_AD_User_ID); msg = user.GetName() + ": " + from.GetName() + " -> " + to.GetName(); activity.SetTextMsg(msg); activity.SetAD_User_ID(p_AD_User_ID); } // Change Responsible if (p_AD_WF_Responsible_ID != 0 && activity.GetAD_WF_Responsible_ID() != p_AD_WF_Responsible_ID) { MWFResponsible from = MWFResponsible.Get(GetCtx(), activity.GetAD_WF_Responsible_ID()); MWFResponsible to = MWFResponsible.Get(GetCtx(), p_AD_WF_Responsible_ID); String msg1 = user.GetName() + ": " + from.GetName() + " -> " + to.GetName(); activity.SetTextMsg(msg1); activity.SetAD_WF_Responsible_ID(p_AD_WF_Responsible_ID); if (msg == null) { msg = msg1; } else { msg += " - " + msg1; } } activity.Save(); return(msg); }
/// <summary> /// Start Next Activity /// </summary> /// <param name="last">last activity</param> /// <param name="activities">all activities</param> /// <returns>true if there is a next activity</returns> private bool StartNext(MWFActivity last, MWFActivity[] activities) { log.Config("Last=" + last); // transitions from the last processed node MWFNodeNext[] transitions = GetWorkflow().GetNodeNexts(last.GetAD_WF_Node_ID(), last.GetAD_Client_ID()); if (transitions == null || transitions.Length == 0) { log.Config("none"); return(false); // done } // We need to wait for last activity if (MWFNode.JOINELEMENT_AND.Equals(last.GetNode().GetJoinElement())) { // get previous nodes // check if all have closed activities // return false for all but the last } // eliminate from active processed //last.SetProcessed(true); last.Set_ValueNoCheck("Processed", true); last.Save(); // Start next activity String split = last.GetNode().GetSplitElement(); for (int i = 0; i < transitions.Length; i++) { // Is this a valid transition? if (!transitions[i].IsValidFor(last)) { continue; } // Start new Activity MWFActivity activity = new MWFActivity(this, transitions[i].GetAD_WF_Next_ID()); // set Last Activity ID property in current WF Activity activity.SetLastActivity(last.GetAD_WF_Activity_ID()); // new Thread(activity).Start(); //thred = new Thread(new ThreadStart(activity.Run)); //thred.CurrentCulture = Utility.Env.GetLanguage(Utility.Env.GetContext()).GetCulture(Utility.Env.GetLoginLanguage(Utility.Env.GetContext()).GetAD_Language()); //thred.CurrentUICulture = Utility.Env.GetLanguage(Utility.Env.GetContext()).GetCulture(Utility.Env.GetLoginLanguage(Utility.Env.GetContext()).GetAD_Language()); activity.Run(); // thred.Start(); // only the first valid if XOR if (MWFNode.SPLITELEMENT_XOR.Equals(split)) { return(true); } } // for all transitions return(true); }
/// <summary> ///Perform Process. /// </summary> /// <returns>Message (variables are parsed)</returns> protected override String DoIt() { string msg = null; MWFActivity activity = new MWFActivity(GetCtx(), p_AD_WF_Activity_ID, Get_Trx()); log.Info("" + activity); MUser user = MUser.Get(GetCtx(), GetAD_User_ID()); // Abort if (p_IsAbort) { msg = user.GetName() + ": Abort"; activity.SetTextMsg(msg); activity.SetAD_User_ID(GetAD_User_ID()); activity.SetWFState(StateEngine.STATE_ABORTED); return(msg); } // Change User if (p_AD_User_ID != 0 && activity.GetAD_User_ID() != p_AD_User_ID) { MUser from = MUser.Get(GetCtx(), activity.GetAD_User_ID()); MUser to = MUser.Get(GetCtx(), p_AD_User_ID); msg = user.GetName() + ": " + from.GetName() + " -> " + to.GetName(); activity.SetTextMsg(msg); activity.SetAD_User_ID(p_AD_User_ID); } // Change Responsible if (p_AD_WF_Responsible_ID != 0 && activity.GetAD_WF_Responsible_ID() != p_AD_WF_Responsible_ID) { MWFResponsible from = MWFResponsible.Get(GetCtx(), activity.GetAD_WF_Responsible_ID()); MWFResponsible to = MWFResponsible.Get(GetCtx(), p_AD_WF_Responsible_ID); String msg1 = user.GetName() + ": " + from.GetName() + " -> " + to.GetName(); activity.SetTextMsg(msg1); activity.SetAD_WF_Responsible_ID(p_AD_WF_Responsible_ID); if (msg == null) { msg = msg1; } else { msg += " - " + msg1; } } activity.Save(); return(msg); }
} // wakeup private void DynamicPriority() { // suspened activities with dynamic priority node String sql = "SELECT * " + "FROM AD_WF_Activity a " + "WHERE Processed='N' AND WFState='OS'" // suspended + " AND EXISTS (SELECT * FROM AD_Workflow wf" + " INNER JOIN AD_WF_Node wfn ON (wf.AD_Workflow_ID=wfn.AD_Workflow_ID) " + "WHERE a.AD_WF_Node_ID=wfn.AD_WF_Node_ID AND wf.AD_WorkflowProcessor_ID=@AD_WorkflowProcessor_ID" + " AND wfn.DynPriorityUnit IS NOT NULL AND wfn.DynPriorityChange IS NOT NULL)"; int count = 0; try { SqlParameter[] param = new SqlParameter[1]; param[0] = new SqlParameter("@AD_WorkflowProcessor_ID", m_model.GetAD_WorkflowProcessor_ID()); DataSet ds = DB.ExecuteDataset(sql, param); foreach (DataRow dr in ds.Tables[0].Rows) { MWFActivity activity = new MWFActivity(GetCtx(), dr, null); if (activity.GetDynPriorityStart() == 0) { activity.SetDynPriorityStart(activity.GetPriority()); } long ms = CommonFunctions.CurrentTimeMillis() - CommonFunctions.CurrentTimeMillis(activity.GetCreated()); MWFNode node = activity.GetNode(); int prioDiff = node.CalculateDynamicPriority((int)(ms / 1000)); activity.SetPriority(activity.GetDynPriorityStart() + prioDiff); activity.Save(); count++; } } catch (Exception e) { log.Log(Level.SEVERE, sql, e); } m_summary.Append("DynPriority #").Append(count).Append(" - "); } // setPriority
} // setPriority private void SendAlerts() { int count = 0; int countEMails = 0; String sql = ""; // Alert over Priority if (m_model.GetAlertOverPriority() > 0) { sql = "SELECT * " + "FROM AD_WF_Activity a " + "WHERE Processed='N' AND WFState='OS'" // suspended + " AND Priority >= @Priority" // ##1 + " AND (DateLastAlert IS NULL"; if (m_model.GetRemindDays() > 0) { sql += " OR (DateLastAlert+" + m_model.GetRemindDays() + ") < SysDate"; } sql += ") AND EXISTS (SELECT * FROM AD_Workflow wf " + " INNER JOIN AD_WF_Node wfn ON (wf.AD_Workflow_ID=wfn.AD_Workflow_ID) " + "WHERE a.AD_WF_Node_ID=wfn.AD_WF_Node_ID" + " AND wf.AD_WorkflowProcessor_ID IS NULL OR wf.AD_WorkflowProcessor_ID=@AD_WorkflowProcessor_ID)"; try { SqlParameter[] param = new SqlParameter[2]; param[0] = new SqlParameter("@Priority", m_model.GetAlertOverPriority()); param[1] = new SqlParameter("@AD_WorkflowProcessor_ID", m_model.GetAD_WorkflowProcessor_ID()); DataSet ds = DB.ExecuteDataset(sql, param); foreach (DataRow dr in ds.Tables[0].Rows) { MWFActivity activity = new MWFActivity(GetCtx(), dr, null); bool escalate = activity.GetDateLastAlert() != null; countEMails += SendEmail(activity, "ActivityOverPriority", escalate, true); activity.SetDateLastAlert(CommonFunctions.CovertMilliToDate(CommonFunctions.CurrentTimeMillis())); activity.Save(); count++; } } catch (SqlException e) { log.Log(Level.SEVERE, "(Priority) - " + sql, e); } m_summary.Append("OverPriority #").Append(count); if (countEMails > 0) { m_summary.Append(" (").Append(countEMails).Append(" EMail)"); } m_summary.Append(" - "); } // Alert over Priority /** * Over End Wait */ sql = "SELECT * " + "FROM AD_WF_Activity a " + "WHERE Processed='N' AND WFState='OS'" // suspended + " AND EndWaitTime > SysDate" + " AND (DateLastAlert IS NULL"; if (m_model.GetRemindDays() > 0) { sql += " OR (DateLastAlert+" + m_model.GetRemindDays() + ") < SysDate"; } sql += ") AND EXISTS (SELECT * FROM AD_Workflow wf " + " INNER JOIN AD_WF_Node wfn ON (wf.AD_Workflow_ID=wfn.AD_Workflow_ID) " + "WHERE a.AD_WF_Node_ID=wfn.AD_WF_Node_ID" + " AND wfn.Action<>'Z'" // not sleeping + " AND wf.AD_WorkflowProcessor_ID IS NULL OR wf.AD_WorkflowProcessor_ID=@AD_WorkflowProcessor_ID)"; count = 0; countEMails = 0; try { SqlParameter[] param = new SqlParameter[1]; param[0] = new SqlParameter("@AD_WorkflowProcessor_ID", m_model.GetAD_WorkflowProcessor_ID()); DataSet ds = DB.ExecuteDataset(sql, param); foreach (DataRow dr in ds.Tables[0].Rows) { MWFActivity activity = new MWFActivity(GetCtx(), dr, null); bool escalate = activity.GetDateLastAlert() != null; countEMails += SendEmail(activity, "ActivityEndWaitTime", escalate, false); activity.SetDateLastAlert(CommonFunctions.CovertMilliToDate(CommonFunctions.CurrentTimeMillis())); activity.Save(); count++; } } catch (Exception e) { log.Log(Level.SEVERE, "(EndWaitTime) - " + sql, e); } m_summary.Append("EndWaitTime #").Append(count); if (countEMails > 0) { m_summary.Append(" (").Append(countEMails).Append(" EMail)"); } m_summary.Append(" - "); /** * Send inactivity alerts */ if (m_model.GetInactivityAlertDays() > 0) { sql = "SELECT * " + "FROM AD_WF_Activity a " + "WHERE Processed='N' AND WFState='OS'" // suspended + " AND (Updated+" + m_model.GetInactivityAlertDays() + ") < SysDate" + " AND (DateLastAlert IS NULL"; if (m_model.GetRemindDays() > 0) { sql += " OR (DateLastAlert+" + m_model.GetRemindDays() + ") < SysDate"; } sql += ") AND EXISTS (SELECT * FROM AD_Workflow wf " + " INNER JOIN AD_WF_Node wfn ON (wf.AD_Workflow_ID=wfn.AD_Workflow_ID) " + "WHERE a.AD_WF_Node_ID=wfn.AD_WF_Node_ID" + " AND wf.AD_WorkflowProcessor_ID IS NULL OR wf.AD_WorkflowProcessor_ID=@AD_WorkflowProcessor_ID)"; count = 0; countEMails = 0; try { SqlParameter[] param = new SqlParameter[1]; param[0] = new SqlParameter("@AD_WorkflowProcessor_ID", m_model.GetAD_WorkflowProcessor_ID()); DataSet ds = DB.ExecuteDataset(sql, param); foreach (DataRow dr in ds.Tables[0].Rows) { MWFActivity activity = new MWFActivity(GetCtx(), dr, null); bool escalate = activity.GetDateLastAlert() != null; countEMails += SendEmail(activity, "ActivityInactivity", escalate, false); activity.SetDateLastAlert(CommonFunctions.CovertMilliToDate(CommonFunctions.CurrentTimeMillis())); activity.Save(); count++; } } catch (SqlException e) { log.Log(Level.SEVERE, "(Inactivity): " + sql, e); } m_summary.Append("Inactivity #").Append(count); if (countEMails > 0) { m_summary.Append(" (").Append(countEMails).Append(" EMail)"); } m_summary.Append(" - "); } // Inactivity } // sendAlerts
/// <summary> /// Check Status of Activities. /// - update Process if required /// - start new activity /// </summary> public void CheckActivities() { log.Info(ToString()); if (_state.IsClosed()) { return; } // MWFActivity[] activities = GetActivities(true, true); // requery active String closedState = null; bool suspended = false; bool running = false; for (int i = 0; i < activities.Length; i++) { MWFActivity activity = activities[i]; activity.SetAD_Window_ID(GetAD_Window_ID()); StateEngine activityState = activity.GetState(); // Completed - Start Next if (activityState.IsCompleted() || activityState.IsBackground()) { if (StartNext(activity, activities)) { continue; } } // String activityWFState = activity.GetWFState(); if (activityState.IsClosed() || activityState.IsBackground()) { // eliminate from active processed //activity.SetProcessed(true); activity.Set_ValueNoCheck("Processed", true); //activities activity.Save(); // if (closedState == null) { closedState = activityWFState; } else if (!closedState.Equals(activityState)) { // Overwrite if terminated if (WFSTATE_Terminated.Equals(activityState)) { closedState = activityWFState; } // Overwrite if activity aborted and no other terminated else if (WFSTATE_Aborted.Equals(activityState) && !WFSTATE_Terminated.Equals(closedState)) { closedState = activityWFState; } } } else // not closed { closedState = null; // all need to be closed if (activityState.IsSuspended()) { suspended = true; } if (activityState.IsRunning()) { running = true; } } } // for all activities if (activities.Length == 0) { SetTextMsg("No Active Processed found"); closedState = WFSTATE_Terminated; } if (closedState != null) { if (closedState == StateEngine.STATE_BACKGROUND) { _state.SetState(StateEngine.STATE_BACKGROUND); } SetWFState(closedState); GetPO(); if (_po != null) { _po.Unlock(Get_TrxName()); } } else if (suspended) { SetWFState(WFSTATE_Suspended); } else if (running) { SetWFState(WFSTATE_Running); } }