Impostata pagina x selezione interventi da anticipare (vanno davvero generati ora...)

This commit is contained in:
Samuele E. Locatelli
2017-07-13 19:20:31 +02:00
parent 1f01812fd8
commit ac89a34f27
5 changed files with 222 additions and 166 deletions
+175 -160
View File
@@ -8,180 +8,195 @@ using SteamWare;
/// </summary>
public class mtzProgr
{
#region table adapters
#region table adapters
public GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgrammataTableAdapter taMtzProg;
public GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgPendingTableAdapter taMtzPend;
public GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgrammataTableAdapter taMtzProg;
public GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgPendingTableAdapter taMtzPend;
#endregion
#endregion
/// <summary>
/// avvio componente
/// </summary>
protected mtzProgr()
{
initTA();
setupConnectionString();
}
/// <summary>
/// avvio componente
/// </summary>
protected mtzProgr()
{
initTA();
setupConnectionString();
}
private void initTA()
private void initTA()
{
taMtzPend = new GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgPendingTableAdapter();
taMtzProg = new GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgrammataTableAdapter();
}
/// <summary>
/// effettua setup dei connection strings da web.config della singola applicazione
/// </summary>
protected virtual void setupConnectionString()
{
// connections del db
string connString = memLayer.ML.confReadString("AppConnectionString");
taMtzPend.Connection.ConnectionString = connString;
taMtzProg.Connection.ConnectionString = connString;
}
/// <summary>
/// singleton accesso ai metodi di manutenzione programmata
/// </summary>
public static mtzProgr obj = new mtzProgr();
/// <summary>
/// anticipa l'intervneto indicato e genera il successivo a scadenza normale
/// </summary>
public void anticipaIntervento(int numIntMtzPend)
{
DateTime nextDate = DateTime.Now;
// genero l'intervento
logger.lg.scriviLog(string.Format("Anticipata la richiesta di manutenzione (programmata) num {0}", numIntMtzPend), tipoLog.INFO);
// modifico intervento pending portando avanti secondo schedulazione...
nextDate = nextDate.AddDays(1);
logger.lg.scriviLog(string.Format("Generata nuova scadenza di manutenzione (programmata) num {0} alla data {1}", numIntMtzPend, nextDate), tipoLog.INFO);
}
/// <summary>
/// verifica se ci siano interventi pending ed eventualmente li accoda
/// </summary>
public void processaCodaMtzPro()
{
// cerco eventuali interventi scaduti
insertPending();
// metto in coda tutte le ricorrenze non presenti...
rebuildPending();
}
/// <summary>
/// inserisce nelle richieste attuali gli interventi programmati scaduti
/// </summary>
private void insertPending()
{
int richInserted = 0;
//recupero solo gli interventi già "scaduti"
foreach (GIM_dataLayer.DS_applicazione.MtzProgPendingRow rigaMtz in taMtzPend.getByDataScad(DateTime.Now))
{
taMtzPend = new GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgPendingTableAdapter();
taMtzProg = new GIM_dataLayer.DS_applicazioneTableAdapters.MtzProgrammataTableAdapter();
richInserted = insRich(rigaMtz);
// inserisco trasformandoli in richieste ...
if (richInserted != 0) // se va a buon fine
{
logger.lg.scriviLog(string.Format("Accodata la richiesta di manutenzione (programmata) num {0}", richInserted), tipoLog.INFO);
// ...e li tolgo dall'elenco pending
taMtzPend.Delete(rigaMtz.idxPending);
}
else
{
logger.lg.scriviLog(string.Format("Non è stato possibile accodare la richiesta di manutenzione programmata cod {0} relativa alla macchina {1}", rigaMtz.idxIntPro, rigaMtz.idxMacchina), tipoLog.ERROR);
}
}
/// <summary>
/// effettua setup dei connection strings da web.config della singola applicazione
/// </summary>
protected virtual void setupConnectionString()
}
/// <summary>
/// ricostruisce la coda degli intervneti pending
/// </summary>
private void rebuildPending()
{
int multiplo = 0;
int stimaIniz = 0;
double ggEquiv = 0;
TimeSpan distDate;
DateTime adesso = DateTime.Now;
DateTime dataProp;
foreach (GIM_dataLayer.DS_applicazione.MtzProgrammataRow rigaMtz in taMtzProg.getNotScheduled())
{
// connections del db
string connString = memLayer.ML.confReadString("AppConnectionString");
taMtzPend.Connection.ConnectionString = connString;
taMtzProg.Connection.ConnectionString = connString;
}
/// <summary>
/// singleton accesso ai metodi di manutenzione programmata
/// </summary>
public static mtzProgr obj = new mtzProgr();
/// <summary>
/// verifica se ci siano interventi pending ed eventualmente li accoda
/// </summary>
public void processaCodaMtzPro()
{
// cerco eventuali interventi scaduti
insertPending();
// metto in coda tutte le ricorrenze non presenti...
rebuildPending();
}
/// <summary>
/// inserisce nelle richieste attuali gli interventi programmati scaduti
/// </summary>
private void insertPending()
{
int richInserted = 0;
//recupero solo gli interventi già "scaduti"
foreach (GIM_dataLayer.DS_applicazione.MtzProgPendingRow rigaMtz in taMtzPend.getByDataScad(DateTime.Now))
dataProp = rigaMtz.inizio;
// proseguo SOLO se inizio interventi <= data odierna...)
if (rigaMtz.inizio < adesso)
{
//calcolo l'intervallo timeSpan tra inizio interventi e data odierna
distDate = adesso.Subtract(rigaMtz.inizio);
// in base al tipo di intervallo faccio un calcolo grezzo del periodo trascorso...
ggEquiv = distDate.TotalDays;
switch (rigaMtz.codFrequenza)
{
richInserted = insRich(rigaMtz);
// inserisco trasformandoli in richieste ...
if (richInserted != 0) // se va a buon fine
{
logger.lg.scriviLog(string.Format("Accodata la richiesta di manutenzione (programmata) num {0}", richInserted), tipoLog.INFO);
// ...e li tolgo dall'elenco pending
taMtzPend.Delete(rigaMtz.idxPending);
}
else
{
logger.lg.scriviLog(string.Format("Non è stato possibile accodare la richiesta di manutenzione programmata cod {0} relativa alla macchina {1}", rigaMtz.idxIntPro, rigaMtz.idxMacchina), tipoLog.ERROR);
}
case "dd":
stimaIniz = (int)Math.Floor(ggEquiv / rigaMtz.cadenza);
break;
case "ww":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 7));
break;
case "MM":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 30));
break;
case "yy":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 365));
break;
}
}
/// <summary>
/// ricostruisce la coda degli intervneti pending
/// </summary>
private void rebuildPending()
{
int multiplo = 0;
int stimaIniz = 0;
double ggEquiv = 0;
TimeSpan distDate;
DateTime adesso = DateTime.Now;
DateTime dataProp;
foreach (GIM_dataLayer.DS_applicazione.MtzProgrammataRow rigaMtz in taMtzProg.getNotScheduled())
// parto con la stima iniziale decrementata (se >0...)
if (stimaIniz == 0)
{
dataProp = rigaMtz.inizio;
// proseguo SOLO se inizio interventi <= data odierna...)
if (rigaMtz.inizio < adesso)
{
//calcolo l'intervallo timeSpan tra inizio interventi e data odierna
distDate = adesso.Subtract(rigaMtz.inizio);
// in base al tipo di intervallo faccio un calcolo grezzo del periodo trascorso...
ggEquiv = distDate.TotalDays;
switch (rigaMtz.codFrequenza)
{
case "dd":
stimaIniz = (int)Math.Floor(ggEquiv / rigaMtz.cadenza);
break;
case "ww":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 7));
break;
case "MM":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 30));
break;
case "yy":
stimaIniz = (int)Math.Floor(ggEquiv / (rigaMtz.cadenza * 365));
break;
}
// parto con la stima iniziale decrementata (se >0...)
if (stimaIniz == 0)
{
multiplo = 0;
}
else
{
multiplo = stimaIniz - 1;
}
// ciclo fino a quando la data indicata non è successiva all'adesso...
while (dataProp < adesso)
{
// aggiorno la data di riferimento
switch (rigaMtz.codFrequenza)
{
case "dd":
dataProp = rigaMtz.inizio.AddDays(rigaMtz.cadenza * multiplo);
break;
case "ww":
dataProp = rigaMtz.inizio.AddDays(rigaMtz.cadenza * 7 * multiplo);
break;
case "MM":
dataProp = rigaMtz.inizio.AddMonths(rigaMtz.cadenza * multiplo);
break;
case "yy":
dataProp = rigaMtz.inizio.AddYears(rigaMtz.cadenza * multiplo);
break;
}
multiplo++;
}
// salvo la data trovata...
rigaMtz.inizio = dataProp;
}
// infine inserisco intervento...
insMtzPend(rigaMtz);
multiplo = 0;
}
}
/// <summary>
/// inserisce l'intervento della riga indicata tra quelli "pending"
/// </summary>
/// <param name="riga"></param>
protected void insMtzPend(GIM_dataLayer.DS_applicazione.MtzProgrammataRow riga)
{
mtzProgr.obj.taMtzPend.Insert(riga.idxIntPro, riga.idxMacchina, riga.inizio, riga.descrizione, riga.idxPriorita, riga.isFermo, riga.idxTipo, riga.idxCausale);
}
/// <summary>
/// genera la richiesta di manutenzione dalla richiesta pending associata
/// </summary>
/// <param name="riga"></param>
/// <returns></returns>
protected int insRich(GIM_dataLayer.DS_applicazione.MtzProgPendingRow riga)
{
int? answ = 0;
// calcolo date riferimento...
DateTime adesso = DateTime.Now;
int shift = memLayer.ML.confReadInt("shiftTurno");
int durataTurno = memLayer.ML.confReadInt("durataTurno");
int turno = Convert.ToInt32(Math.Ceiling((double)Convert.ToDouble(DateTime.Now.AddHours(-shift + 1).Hour) / durataTurno));
int idxAmbito = 7; //mtz programmata...
int idxImpianto = 0;
try
else
{
idxImpianto = TA_app.obj.taMacchine.getByIdxMacchina(riga.idxMacchina)[0].idxImpianto;
multiplo = stimaIniz - 1;
}
catch (Exception e)
// ciclo fino a quando la data indicata non è successiva all'adesso...
while (dataProp < adesso)
{
logger.lg.scriviLog(string.Format("Errore nel recuperare impianto relativo alla macchina {0}, eccezione {1}", riga.idxMacchina, e), tipoLog.EXCEPTION);
// aggiorno la data di riferimento
switch (rigaMtz.codFrequenza)
{
case "dd":
dataProp = rigaMtz.inizio.AddDays(rigaMtz.cadenza * multiplo);
break;
case "ww":
dataProp = rigaMtz.inizio.AddDays(rigaMtz.cadenza * 7 * multiplo);
break;
case "MM":
dataProp = rigaMtz.inizio.AddMonths(rigaMtz.cadenza * multiplo);
break;
case "yy":
dataProp = rigaMtz.inizio.AddYears(rigaMtz.cadenza * multiplo);
break;
}
multiplo++;
}
// inserisco
TA_app.obj.taInterventiMtz.sp_insRichiesta(adesso, adesso.AddHours(-shift + 1), turno, "PROG", riga.data, idxAmbito, riga.idxPriorita, riga.isFermo, riga.idxTipo, idxImpianto, riga.idxMacchina, riga.descrizione, riga.idxCausale, true, ref answ);
return (int)answ;
// salvo la data trovata...
rigaMtz.inizio = dataProp;
}
// infine inserisco intervento...
insMtzPend(rigaMtz);
}
}
/// <summary>
/// inserisce l'intervento della riga indicata tra quelli "pending"
/// </summary>
/// <param name="riga"></param>
protected void insMtzPend(GIM_dataLayer.DS_applicazione.MtzProgrammataRow riga)
{
mtzProgr.obj.taMtzPend.Insert(riga.idxIntPro, riga.idxMacchina, riga.inizio, riga.descrizione, riga.idxPriorita, riga.isFermo, riga.idxTipo, riga.idxCausale);
}
/// <summary>
/// genera la richiesta di manutenzione dalla richiesta pending associata
/// </summary>
/// <param name="riga"></param>
/// <returns></returns>
protected int insRich(GIM_dataLayer.DS_applicazione.MtzProgPendingRow riga)
{
int? answ = 0;
// calcolo date riferimento...
DateTime adesso = DateTime.Now;
int shift = memLayer.ML.confReadInt("shiftTurno");
int durataTurno = memLayer.ML.confReadInt("durataTurno");
int turno = Convert.ToInt32(Math.Ceiling((double)Convert.ToDouble(DateTime.Now.AddHours(-shift + 1).Hour) / durataTurno));
int idxAmbito = 7; //mtz programmata...
int idxImpianto = 0;
try
{
idxImpianto = TA_app.obj.taMacchine.getByIdxMacchina(riga.idxMacchina)[0].idxImpianto;
}
catch (Exception e)
{
logger.lg.scriviLog(string.Format("Errore nel recuperare impianto relativo alla macchina {0}, eccezione {1}", riga.idxMacchina, e), tipoLog.EXCEPTION);
}
// inserisco
TA_app.obj.taInterventiMtz.sp_insRichiesta(adesso, adesso.AddHours(-shift + 1), turno, "PROG", riga.data, idxAmbito, riga.idxPriorita, riga.isFermo, riga.idxTipo, idxImpianto, riga.idxMacchina, riga.descrizione, riga.idxCausale, true, ref answ);
return (int)answ;
}
}
@@ -2,17 +2,16 @@
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<div class="row">
<div class="col-xs-3">
<div class="col-sm-4">
<asp:CheckBox runat="server" ID="chkAnticipaEnabled" Text='<%# traduci("AbilitaAnticipo")%>' AutoPostBack="True" OnCheckedChanged="chkAnticipaEnabled_CheckedChanged" />
</div>
<div class="col-xs-6">
<div class="col-sm-4">
<asp:Button runat="server" ID="btnCreateInt" Text='<%# traduci("getIntMtzProgSel") %>' Visible="false" CssClass="btn btn-success" Width="100%" OnClick="btnCreateInt_Click" />
</div>
<div class="col-xs-3 text-right">
<div class="col-sm-4 text-right">
<asp:HyperLink ID="hlExportExcel" runat="server" Target="_blank" />
</div>
</div>
<%--<div style="text-align: right;">
</div>--%>
<div style="font-size: 8pt;">
<asp:GridView ID="grView" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CssClass="table table-striped" DataKeyNames="idxPending" DataSourceID="ods" OnDataBound="grView_DataBound" OnPageIndexChanged="grView_PageIndexChanged">
<PagerStyle CssClass="active GridPager" />
@@ -42,6 +42,7 @@ public partial class mod_mtzPrevPending : ApplicationUserControl
if (!Page.IsPostBack)
{
chkAnticipaEnabled.DataBind();
btnCreateInt.DataBind();
hlExportExcel.Text = traduci("hlExportExcel");
hlExportExcel.NavigateUrl = "~/ExcelExportMtzPrevPending";
// verifico se devo generare degli interventi di MTZ programmata..
@@ -104,12 +105,17 @@ public partial class mod_mtzPrevPending : ApplicationUserControl
((CheckBox)riga.FindControl("chkSelect")).Checked = isChecked;
}
}
/// <summary>
/// Gestione click pulsante "abilita anticipo"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void chkAnticipaEnabled_CheckedChanged(object sender, EventArgs e)
{
// seleziono tutti i valori visibili nel datagrid
CheckBox chkbox = ((CheckBox)sender);
bool isChecked = chkbox.Checked;
btnCreateInt.Visible = isChecked;
if (!isChecked)
{
chkbox.Text = traduci("AbilitaAnticipo");
@@ -121,4 +127,31 @@ public partial class mod_mtzPrevPending : ApplicationUserControl
// aggiorno il gridview...
grView.DataBind();
}
/// <summary>
/// Richiesta generazione anticipo interventi selezionati
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnCreateInt_Click(object sender, EventArgs e)
{
int idxIntervento = 0;
foreach (GridViewRow riga in grView.Rows)
{
if (((CheckBox)riga.FindControl("chkSelect")).Checked)
{
try
{
idxIntervento = Convert.ToInt32(((Label)riga.FindControl("lblidxPending")).Text);
}
catch
{ }
if (idxIntervento > 0)
{
// genero intervento selezionato e predispongo NUOVA schedulazione..
mtzProgr.obj.anticipaIntervento(idxIntervento);
}
}
}
grView.DataBind();
}
}
@@ -20,6 +20,15 @@ public partial class mod_mtzPrevPending {
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox chkAnticipaEnabled;
/// <summary>
/// Controllo btnCreateInt.
/// </summary>
/// <remarks>
/// Campo generato automaticamente.
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnCreateInt;
/// <summary>
/// Controllo hlExportExcel.
/// </summary>
Binary file not shown.