ancora traduzioni SITE
This commit is contained in:
@@ -1,76 +1,77 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/WebMasterPages/MAPO_refresh30.master" AutoEventWireup="true" Inherits="MP_SITE.DettaglioMacchina" Title="Dettaglio Macchina" CodeBehind="DettaglioMacchina.aspx.cs" Async="true" %>
|
||||
|
||||
<%@ Register Src="~/WebUserControls/mod_sequencerStati.ascx" TagName="mod_sequencerStati"
|
||||
TagPrefix="uc5" %>
|
||||
TagPrefix="uc5" %>
|
||||
<%@ Register Src="~/WebUserControls/mod_grafico.ascx" TagName="mod_grafico" TagPrefix="uc4" %>
|
||||
<%@ Register Src="~/WebUserControls/mod_immagineStato.ascx" TagName="mod_immagineStato" TagPrefix="uc3" %>
|
||||
<%@ Register Src="~/WebUserControls/mod_periodoAnalisi.ascx" TagName="mod_periodoAnalisi" TagPrefix="uc2" %>
|
||||
<%@ Register Src="~/WebUserControls/mod_listaStatiEventi.ascx" TagName="mod_listaStatiEventi" TagPrefix="uc1" %>
|
||||
<%@ Register Src="WebUserControls/mod_sequencerTempiCiclo.ascx" TagName="mod_sequencerTempiCiclo" TagPrefix="uc6" %>
|
||||
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
|
||||
<div id="contenuto">
|
||||
<div id="alto">
|
||||
<div id="Div1" class="menuMainY">
|
||||
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Always">
|
||||
<ContentTemplate>
|
||||
<div style="float: left;">
|
||||
<asp:Button runat="server" ID="toStato" PostBackUrl="~/MappaStato.aspx" Text="Mappa Generale"></asp:Button>
|
||||
|
||||
</div>
|
||||
<div style="float: left;">
|
||||
<uc2:mod_periodoAnalisi ID="Mod_periodoAnalisi1" runat="server" />
|
||||
</div>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
<div id="medio">
|
||||
<asp:UpdatePanel ID="up_grafici" runat="server" UpdateMode="Conditional">
|
||||
<ContentTemplate>
|
||||
<uc5:mod_sequencerStati ID="Mod_sequencerStati1" runat="server"></uc5:mod_sequencerStati>
|
||||
<uc6:mod_sequencerTempiCiclo ID="mod_sequencerTempiCiclo1" runat="server" />
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
<div id="basso" class="m-2">
|
||||
<div class="row">
|
||||
<div class="col-4 pr-1">
|
||||
<div class="card">
|
||||
<div class="card-header p-1">
|
||||
<h4>Stato Macchina</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="alto1">
|
||||
<uc3:mod_immagineStato ID="Mod_immagineStato1" runat="server" />
|
||||
</div>
|
||||
<div id="medio1">
|
||||
<asp:CheckBox ID="chkHideSpenta" runat="server" AutoPostBack="True" OnCheckedChanged="chkHideSpenta_CheckedChanged" Text="Nascondi spenta" />
|
||||
</div>
|
||||
<div id="basso1">
|
||||
<asp:UpdatePanel ID="UpdatePanel3" runat="server" RenderMode="Block" UpdateMode="Always">
|
||||
<ContentTemplate>
|
||||
<uc4:mod_grafico ID="Mod_grafico2" runat="server" height="250" width="250"></uc4:mod_grafico>
|
||||
</ContentTemplate>
|
||||
<div id="contenuto">
|
||||
<div id="alto">
|
||||
<div id="Div1" class="menuMainY">
|
||||
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Always">
|
||||
<ContentTemplate>
|
||||
<div class="d-flex flex-row ">
|
||||
<div class="p-2">
|
||||
<asp:Button runat="server" ID="toStato" PostBackUrl="~/MappaStato.aspx" Text="Mappa Generale"></asp:Button>
|
||||
</div>
|
||||
<div class="p-2 text-nowrap">
|
||||
<uc2:mod_periodoAnalisi ID="Mod_periodoAnalisi1" runat="server" />
|
||||
</div>
|
||||
</div>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8 pl-1">
|
||||
<div class="card">
|
||||
<div class="card-header p-1">
|
||||
<h4>Dati Produzione</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Block" UpdateMode="Always">
|
||||
<div id="medio">
|
||||
<asp:UpdatePanel ID="up_grafici" runat="server" UpdateMode="Conditional">
|
||||
<ContentTemplate>
|
||||
<uc1:mod_listaStatiEventi ID="Mod_listaStatiEventi1" runat="server"></uc1:mod_listaStatiEventi>
|
||||
<uc5:mod_sequencerStati ID="Mod_sequencerStati1" runat="server"></uc5:mod_sequencerStati>
|
||||
<uc6:mod_sequencerTempiCiclo ID="mod_sequencerTempiCiclo1" runat="server" />
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
<div id="basso" class="m-2">
|
||||
<div class="row">
|
||||
<div class="col-4 pr-1">
|
||||
<div class="card">
|
||||
<div class="card-header p-1">
|
||||
<h4>Stato Macchina</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="alto1">
|
||||
<uc3:mod_immagineStato ID="Mod_immagineStato1" runat="server" />
|
||||
</div>
|
||||
<div id="medio1">
|
||||
<asp:CheckBox ID="chkHideSpenta" runat="server" AutoPostBack="True" OnCheckedChanged="chkHideSpenta_CheckedChanged" Text="Nascondi spenta" />
|
||||
</div>
|
||||
<div id="basso1">
|
||||
<asp:UpdatePanel ID="UpdatePanel3" runat="server" RenderMode="Block" UpdateMode="Always">
|
||||
<ContentTemplate>
|
||||
<uc4:mod_grafico ID="Mod_grafico2" runat="server" height="250" width="250"></uc4:mod_grafico>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-8 pl-1">
|
||||
<div class="card">
|
||||
<div class="card-header p-1">
|
||||
<h4>Dati Produzione</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Block" UpdateMode="Always">
|
||||
<ContentTemplate>
|
||||
<uc1:mod_listaStatiEventi ID="Mod_listaStatiEventi1" runat="server"></uc1:mod_listaStatiEventi>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</asp:Content>
|
||||
</asp:Content>
|
||||
+59
-57
@@ -1,122 +1,124 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <generato automaticamente>
|
||||
// Codice generato da uno strumento.
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se
|
||||
// il codice viene rigenerato.
|
||||
// </generato automaticamente>
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MP_SITE {
|
||||
|
||||
|
||||
public partial class DettaglioMacchina {
|
||||
|
||||
namespace MP_SITE
|
||||
{
|
||||
|
||||
|
||||
public partial class DettaglioMacchina
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Controllo UpdatePanel2.
|
||||
/// UpdatePanel2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.UpdatePanel UpdatePanel2;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo toStato.
|
||||
/// toStato control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Button toStato;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_periodoAnalisi1.
|
||||
/// Mod_periodoAnalisi1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_periodoAnalisi Mod_periodoAnalisi1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo up_grafici.
|
||||
/// up_grafici control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.UpdatePanel up_grafici;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_sequencerStati1.
|
||||
/// Mod_sequencerStati1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_sequencerStati Mod_sequencerStati1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo mod_sequencerTempiCiclo1.
|
||||
/// mod_sequencerTempiCiclo1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_sequencerTempiCiclo mod_sequencerTempiCiclo1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_immagineStato1.
|
||||
/// Mod_immagineStato1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_immagineStato Mod_immagineStato1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo chkHideSpenta.
|
||||
/// chkHideSpenta control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.CheckBox chkHideSpenta;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo UpdatePanel3.
|
||||
/// UpdatePanel3 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.UpdatePanel UpdatePanel3;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_grafico2.
|
||||
/// Mod_grafico2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_grafico Mod_grafico2;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo UpdatePanel1.
|
||||
/// UpdatePanel1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.UpdatePanel UpdatePanel1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_listaStatiEventi1.
|
||||
/// Mod_listaStatiEventi1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_listaStatiEventi Mod_listaStatiEventi1;
|
||||
}
|
||||
|
||||
@@ -4,41 +4,48 @@
|
||||
<%@ Register Src="~/WebUserControls/mod_periodoAnalisi.ascx" TagPrefix="uc1" TagName="mod_periodoAnalisi" %>
|
||||
|
||||
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
|
||||
<div id="medio" style="margin: 0 20px;">
|
||||
|
||||
<div id="medio" class="p-2">
|
||||
<div class="row">
|
||||
<div class="col-xs-4">
|
||||
<div class="uiMini" style="margin: 0 4px;">
|
||||
<div class="row panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="col-3">
|
||||
<div class="uiMini">
|
||||
<div class="card ">
|
||||
<div class="card-header">
|
||||
<h3 class="panel-title"><%: traduci("FiltroPeriodoImpianti") %></h3>
|
||||
</div>
|
||||
<div class="col-xs-12 pad3">
|
||||
<%--<div style="float: left; padding: 0px 4px;">--%>
|
||||
<uc1:mod_periodoAnalisi runat="server" ID="mod_periodoAnalisi" />
|
||||
<br />
|
||||
<asp:ListBox ID="listMacchine" runat="server" DataSourceID="odsMacchine" DataTextField="label" DataValueField="value" SelectionMode="Multiple" Height="400px" Width="100%" AutoPostBack="true" OnSelectedIndexChanged="listMacchine_SelectedIndexChanged" OnDataBound="listMacchine_DataBound" Font-Size="1.5em"></asp:ListBox>
|
||||
<asp:ObjectDataSource ID="odsMacchine" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="getAttive" TypeName="MapoDb.DS_UtilityTableAdapters.v_selMacchineTableAdapter" FilterExpression="NOT value LIKE '%#%'"></asp:ObjectDataSource>
|
||||
<div class="card-body p-0">
|
||||
<div class="row p-1">
|
||||
<div class="col-12">
|
||||
<uc1:mod_periodoAnalisi runat="server" ID="mod_periodoAnalisi" />
|
||||
<br />
|
||||
<asp:ListBox ID="listMacchine" runat="server" DataSourceID="odsMacchine" DataTextField="label" DataValueField="value" SelectionMode="Multiple" Height="400px" Width="100%" AutoPostBack="true" OnSelectedIndexChanged="listMacchine_SelectedIndexChanged" OnDataBound="listMacchine_DataBound" Font-Size="1.5em"></asp:ListBox>
|
||||
<asp:ObjectDataSource ID="odsMacchine" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="getAttive" TypeName="MapoDb.DS_UtilityTableAdapters.v_selMacchineTableAdapter" FilterExpression="NOT value LIKE '%#%'"></asp:ObjectDataSource>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-8 text-center">
|
||||
<div class="row panel panel-success">
|
||||
<div class="panel-heading">
|
||||
<div class="col-9 text-center">
|
||||
<div class="card ">
|
||||
<div class="card-header">
|
||||
<h3 class="panel-title"><%: traduci("Statistiche") %></h3>
|
||||
</div>
|
||||
<div class="col-xs-12 pad3">
|
||||
<%-- <div style="float: right;">--%>
|
||||
<div id="medio1">
|
||||
<asp:CheckBox ID="chkHideSpenta" runat="server" AutoPostBack="True" OnCheckedChanged="chkHideSpenta_CheckedChanged"
|
||||
Text="Nascondi spenta" />
|
||||
</div>
|
||||
<div id="basso1">
|
||||
<asp:UpdatePanel ID="UpdatePanel3" runat="server">
|
||||
<ContentTemplate>
|
||||
<uc4:mod_grafico ID="Mod_grafico2" runat="server" width="400" height="400" minPercent="0.01"></uc4:mod_grafico>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
<div class="card-body p-0">
|
||||
<div class="row p-1">
|
||||
<div class="col-12">
|
||||
<div id="medio1">
|
||||
<asp:CheckBox ID="chkHideSpenta" runat="server" AutoPostBack="True" OnCheckedChanged="chkHideSpenta_CheckedChanged"
|
||||
Text='<%# traduci("HideOff") %>' />
|
||||
</div>
|
||||
<div id="basso1">
|
||||
<asp:UpdatePanel ID="UpdatePanel3" runat="server">
|
||||
<ContentTemplate>
|
||||
<uc4:mod_grafico ID="Mod_grafico2" runat="server" width="400" height="400" minPercent="0.01"></uc4:mod_grafico>
|
||||
</ContentTemplate>
|
||||
</asp:UpdatePanel>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,10 +7,16 @@ namespace MP_SITE
|
||||
{
|
||||
public partial class StatisticheImpiego : BasePage
|
||||
{
|
||||
#region Protected Fields
|
||||
|
||||
protected intervalloDate _intervalloAnalisi;
|
||||
protected resoconti _resoconti;
|
||||
protected int durataMin;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
/// <summary>
|
||||
/// elenco idx COMMA separated da controllo selezione multiplo
|
||||
/// </summary>
|
||||
@@ -56,6 +62,28 @@ namespace MP_SITE
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private void Mod_periodoAnalisi1_eh_doUpdate(object sender, EventArgs e)
|
||||
{
|
||||
ridisegna();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// aggiorna dati x ridisegno
|
||||
/// </summary>
|
||||
private void ridisegna()
|
||||
{
|
||||
intervalloAnalisi = (intervalloDate)memLayer.ML.objSessionObj("_intervallo");
|
||||
setTorta();
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected void chkHideSpenta_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
// in base a quello ridisegno la torta...
|
||||
@@ -93,6 +121,7 @@ namespace MP_SITE
|
||||
mod_periodoAnalisi.eh_doUpdate += new EventHandler(Mod_periodoAnalisi1_eh_doUpdate);
|
||||
if (!Page.IsPostBack)
|
||||
{
|
||||
chkHideSpenta.DataBind();
|
||||
ridisegna();
|
||||
}
|
||||
}
|
||||
@@ -110,18 +139,6 @@ namespace MP_SITE
|
||||
}
|
||||
}
|
||||
|
||||
private void Mod_periodoAnalisi1_eh_doUpdate(object sender, EventArgs e)
|
||||
{
|
||||
ridisegna();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// aggiorna dati x ridisegno
|
||||
/// </summary>
|
||||
private void ridisegna()
|
||||
{
|
||||
intervalloAnalisi = (intervalloDate)memLayer.ML.objSessionObj("_intervallo");
|
||||
setTorta();
|
||||
}
|
||||
#endregion Protected Methods
|
||||
}
|
||||
}
|
||||
+23
-23
@@ -1,10 +1,10 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <generato automaticamente>
|
||||
// Codice generato da uno strumento.
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se
|
||||
// il codice viene rigenerato.
|
||||
// </generato automaticamente>
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MP_SITE
|
||||
@@ -15,56 +15,56 @@ namespace MP_SITE
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Controllo mod_periodoAnalisi.
|
||||
/// mod_periodoAnalisi control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_periodoAnalisi mod_periodoAnalisi;
|
||||
|
||||
/// <summary>
|
||||
/// Controllo listMacchine.
|
||||
/// listMacchine control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.ListBox listMacchine;
|
||||
|
||||
/// <summary>
|
||||
/// Controllo odsMacchine.
|
||||
/// odsMacchine control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.ObjectDataSource odsMacchine;
|
||||
|
||||
/// <summary>
|
||||
/// Controllo chkHideSpenta.
|
||||
/// chkHideSpenta control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.CheckBox chkHideSpenta;
|
||||
|
||||
/// <summary>
|
||||
/// Controllo UpdatePanel3.
|
||||
/// UpdatePanel3 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.UpdatePanel UpdatePanel3;
|
||||
|
||||
/// <summary>
|
||||
/// Controllo Mod_grafico2.
|
||||
/// Mod_grafico2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::MP_SITE.WebUserControls.mod_grafico Mod_grafico2;
|
||||
}
|
||||
|
||||
@@ -300,7 +300,9 @@
|
||||
<Content Include="images\LogoMapoNoText.png" />
|
||||
<Content Include="images\logoMoOnPro.png" />
|
||||
<Content Include="images\logoSteamware.png" />
|
||||
<Content Include="images\macchine\Steamware.png" />
|
||||
<Content Include="images\macchine\Steamware.png">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="images\ProgressBar.gif" />
|
||||
<Content Include="images\titoloCruscotto.png" />
|
||||
<Content Include="images\view.gif" />
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
<%@ Control Language="C#" AutoEventWireup="true" Inherits="MP_SITE.WebUserControls.mod_periodoAnalisi"
|
||||
CodeBehind="mod_periodoAnalisi.ascx.cs" %>
|
||||
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
|
||||
<div class="filtraggio" style="width: 100%;">
|
||||
<div class="floSx padSmall">
|
||||
|
||||
<div class="d-flex flex-row ">
|
||||
<div class="px-2 text-nowrap">
|
||||
<asp:TextBox ID="txtInizio" TabIndex="1" runat="server" Width="7em" MaxLength="10"
|
||||
AutoPostBack="True" OnTextChanged="txtInizio_TextChanged" />
|
||||
<asp:DropDownList ID="ddlOraInizio" TabIndex="2" runat="server" AutoPostBack="True"
|
||||
@@ -33,10 +34,9 @@
|
||||
<asp:ListItem>23</asp:ListItem>
|
||||
</asp:DropDownList>
|
||||
<asp:CalendarExtender ID="CalendarExtender1" runat="server" TargetControlID="txtInizio"
|
||||
FirstDayOfWeek="Monday" Format="dd/MM/yyyy">
|
||||
</asp:CalendarExtender>
|
||||
FirstDayOfWeek="Monday" Format="dd/MM/yyyy"></asp:CalendarExtender>
|
||||
</div>
|
||||
<div class="floSx padSmall">
|
||||
<div class="px-2 text-nowrap">
|
||||
<asp:TextBox ID="txtFine" TabIndex="3" runat="server" Width="7em" MaxLength="10"
|
||||
AutoPostBack="True" OnTextChanged="txtFine_TextChanged" />
|
||||
<asp:DropDownList ID="ddlOraFine" TabIndex="2" runat="server" AutoPostBack="True"
|
||||
@@ -67,10 +67,9 @@
|
||||
<asp:ListItem>23</asp:ListItem>
|
||||
</asp:DropDownList>
|
||||
<asp:CalendarExtender ID="CalendarExtender2" runat="server" TargetControlID="txtFine"
|
||||
FirstDayOfWeek="Monday" Format="dd/MM/yyyy">
|
||||
</asp:CalendarExtender>
|
||||
FirstDayOfWeek="Monday" Format="dd/MM/yyyy"></asp:CalendarExtender>
|
||||
</div>
|
||||
<div class="floSx padSmall">
|
||||
<div class="px-2 text-nowrap">
|
||||
<asp:DropDownList ID="ddlPeriodo" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlPeriodo_SelectedIndexChanged" Font-Size="Smaller" CssClass="pad3">
|
||||
<asp:ListItem>selezione</asp:ListItem>
|
||||
<asp:ListItem>oggi</asp:ListItem>
|
||||
@@ -80,15 +79,11 @@
|
||||
<asp:ListItem>questo mese</asp:ListItem>
|
||||
<asp:ListItem>ultimi 30gg</asp:ListItem>
|
||||
</asp:DropDownList>
|
||||
|
||||
|
||||
<asp:Button ID="btnUpdate" runat="server" Text="update" Visible="false" OnClick="btnUpdate_Click" />
|
||||
|
||||
</div>
|
||||
<div class="floSx padSmall">
|
||||
<asp:Label ID="lblDurataMin" runat="server" Visible="false" />
|
||||
|
||||
|
||||
<asp:TextBox ID="txtDurataMin" TabIndex="3" runat="server" Width="30px" MaxLength="3"
|
||||
AutoPostBack="True" OnTextChanged="txtInizio_TextChanged" Visible="false"></asp:TextBox>
|
||||
</div>
|
||||
<div class="clearDiv"></div>
|
||||
</div>
|
||||
</div>
|
||||
+51
-49
@@ -1,104 +1,106 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <generato automaticamente>
|
||||
// Codice generato da uno strumento.
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se
|
||||
// il codice viene rigenerato.
|
||||
// </generato automaticamente>
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MP_SITE.WebUserControls {
|
||||
|
||||
|
||||
public partial class mod_periodoAnalisi {
|
||||
|
||||
namespace MP_SITE.WebUserControls
|
||||
{
|
||||
|
||||
|
||||
public partial class mod_periodoAnalisi
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Controllo txtInizio.
|
||||
/// txtInizio control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtInizio;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo ddlOraInizio.
|
||||
/// ddlOraInizio control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList ddlOraInizio;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo CalendarExtender1.
|
||||
/// CalendarExtender1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::AjaxControlToolkit.CalendarExtender CalendarExtender1;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo txtFine.
|
||||
/// txtFine control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtFine;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo ddlOraFine.
|
||||
/// ddlOraFine control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList ddlOraFine;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo CalendarExtender2.
|
||||
/// CalendarExtender2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::AjaxControlToolkit.CalendarExtender CalendarExtender2;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo ddlPeriodo.
|
||||
/// ddlPeriodo control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList ddlPeriodo;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo btnUpdate.
|
||||
/// btnUpdate control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Button btnUpdate;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo lblDurataMin.
|
||||
/// lblDurataMin control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label lblDurataMin;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Controllo txtDurataMin.
|
||||
/// txtDurataMin control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Campo generato automaticamente.
|
||||
/// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtDurataMin;
|
||||
}
|
||||
|
||||
@@ -2,426 +2,464 @@ using MapoDb;
|
||||
using Newtonsoft.Json;
|
||||
using SteamWare;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace MP_SITE.WebUserControls
|
||||
{
|
||||
public partial class mod_statoMacchina : System.Web.UI.UserControl
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto datalayer specifico
|
||||
/// </summary>
|
||||
DataLayer DataLayerObj = new DataLayer();
|
||||
|
||||
#region area protected / private
|
||||
|
||||
/// <summary>
|
||||
/// seriale associato alla macchina da controllare
|
||||
/// </summary>
|
||||
protected string _IdxMacchina
|
||||
public partial class mod_statoMacchina : System.Web.UI.UserControl
|
||||
{
|
||||
get
|
||||
{
|
||||
return hfIdxMacchina.Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
hfIdxMacchina.Value = value.Trim();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// posizione macchina nella tabella
|
||||
/// </summary>
|
||||
protected string _locazione;
|
||||
protected bool _linkActive = true;
|
||||
#region Private Fields
|
||||
|
||||
protected DS_ProdTempi.MappaStatoExplDataTable tabMSE;
|
||||
protected DS_applicazione.AnagraficaStatiDataTable tabAnagStati;
|
||||
/// <summary>
|
||||
/// caricamento pagina
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
//updateMe();
|
||||
}
|
||||
/// <summary>
|
||||
/// aggiorna controllo
|
||||
/// </summary>
|
||||
public void updateMe()
|
||||
{
|
||||
//SE E SOLO SE ho una macchina e/o locazione...
|
||||
if (!string.IsNullOrEmpty(IdxMacchina) && !IdxMacchina.Contains("#") && (locazione != "00"))
|
||||
{
|
||||
// effettua update visualizzazione
|
||||
try
|
||||
{
|
||||
retrieveData();
|
||||
updateLayout();
|
||||
updateText();
|
||||
updateImg();
|
||||
updateHL();
|
||||
// controllo se link attivo...
|
||||
if (!_linkActive)
|
||||
{
|
||||
valMacchina.Enabled = false;
|
||||
}
|
||||
//logger.lg.scriviLog(string.Format("Retrieve: {0}", DateTime.Now.Subtract(tick).Milliseconds), tipoLog.INFO);
|
||||
divSegnaposto.Visible = false;
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
logger.lg.scriviLog($"Eccezione in fase popolamento statoMacchina per IdxMacchina {IdxMacchina} - locazione {locazione}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pnlMacchina.Visible = false;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// recupera i dati
|
||||
/// </summary>
|
||||
private void retrieveData()
|
||||
{
|
||||
// cerco se ho i dati in REDIS x non richiederli...
|
||||
string hashKeyMSE = memLayer.ML.redHash("Tab:MSE:" + IdxMacchina);
|
||||
string hashKeyAS = memLayer.ML.redHash("Tab:AnagStati");
|
||||
string serVal = "";
|
||||
if (memLayer.ML.redKeyPresent(hashKeyMSE))
|
||||
//if (memLayer.ML.redHashPresent(hashKeyMSE))
|
||||
{
|
||||
serVal = memLayer.ML.getRSV(hashKeyMSE);
|
||||
/// <summary>
|
||||
/// Oggetto datalayer specifico
|
||||
/// </summary>
|
||||
private DataLayer DataLayerObj = new DataLayer();
|
||||
|
||||
tabMSE = JsonConvert.DeserializeObject<DS_ProdTempi.MappaStatoExplDataTable>(serVal);
|
||||
//tabMSE = (DS_ProdTempi.MappaStatoExplDataTable)memLayer.ML.deserializeVal(serVal);
|
||||
#endregion Private Fields
|
||||
|
||||
serVal = memLayer.ML.getRSV(hashKeyAS);
|
||||
tabAnagStati = JsonConvert.DeserializeObject<DS_applicazione.AnagraficaStatiDataTable>(serVal);
|
||||
//tabAnagStati = (DS_applicazione.AnagraficaStatiDataTable)memLayer.ML.deserializeVal(serVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
// altrimenti prendo da DB...
|
||||
try
|
||||
{
|
||||
// popolazione tabelle
|
||||
tabMSE = DataLayerObj.taMSE.getByIdxMacchina(IdxMacchina);
|
||||
tabAnagStati = DataLayerObj.taAnagStati.GetData();
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
// salvo su DB! dati principali x 30 secondi...
|
||||
serVal = memLayer.ML.serializeVal(tabMSE);
|
||||
memLayer.ML.setRSV(hashKeyMSE, serVal, 30);
|
||||
// anche il resto...
|
||||
serVal = memLayer.ML.serializeVal(tabAnagStati);
|
||||
memLayer.ML.setRSV(hashKeyAS, serVal);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// sistema il testo
|
||||
/// </summary>
|
||||
private void updateText()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_IdxMacchina) && _IdxMacchina != "nd")
|
||||
{
|
||||
// labels
|
||||
lblCodArticolo.Text = "Art.";
|
||||
lblStato.Text = "Stato";
|
||||
lblProd.Text = "T.Ciclo"; // era OEE
|
||||
lblDurata.Text = "Durata";
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
// valMacchina.Text = tabMacchine.FindByIdxMacchina(IdxMacchina).Nome;
|
||||
// valCodArticolo.Text = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).CodArticolo;
|
||||
#region Protected Fields
|
||||
|
||||
// leggo valori da MSE...
|
||||
valMacchina.Text = tabMSE[0].Nome;
|
||||
valCodArticolo.Text = tabMSE[0].CodArticolo;
|
||||
// carico ultimo stato che sia durato almeno 6 sec (0.1 min)
|
||||
int idxStato = 0;
|
||||
int oreTot = 0;
|
||||
float minuti = 0;
|
||||
try
|
||||
{
|
||||
DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow rigaStato = DataLayerObj.taDatiStatoMacch.GetData(IdxMacchina, 0.1)[0];
|
||||
idxStato = rigaStato.idxStato;
|
||||
oreTot = Convert.ToInt32(Math.Floor(rigaStato.Minuti / 60));
|
||||
minuti = (float)rigaStato.Minuti - 60 * oreTot;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//idxStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato;
|
||||
//DateTime inizioStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).InizioStato;
|
||||
//DateTime ora = DateTime.Now;
|
||||
//TimeSpan durata = ora.Subtract(inizioStato);
|
||||
//oreTot = durata.Days * 24 + durata.Hours;
|
||||
//minuti = durata.Minutes;
|
||||
idxStato = tabMSE[0].idxStato;
|
||||
oreTot = (int)tabMSE[0].durata / 60;
|
||||
minuti = (int)tabMSE[0].durata - 60 * oreTot;
|
||||
}
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//valStato.Text = tabAnagStati.FindByIdxStato(idxStato).Descrizione;
|
||||
valStato.Text = tabMSE[0].DescrizioneStato;
|
||||
valDurata.Text = string.Format("{0}h {1}min", oreTot, minuti);
|
||||
// solo se in stato NON di run...
|
||||
if (idxStato != 13)
|
||||
{
|
||||
lblCausale.Text = "Causale fermo";
|
||||
string cauFermo = "nd";
|
||||
try
|
||||
{
|
||||
cauFermo = tabAnagStati.FindByIdxStato(tabMSE[0].idxStato).Descrizione;
|
||||
//cauFermo = tabAnagStati.FindByIdxStato(Convert.ToInt32(tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato)).Descrizione;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//cauFermo = string.Format("IN: {0}", tabStatoMacchine.FindByIdxMacchina(IdxMacchina).Value);
|
||||
cauFermo = string.Format("IN: {0}", tabMSE[0].idxStato);
|
||||
}
|
||||
valCausale.Text = cauFermo;
|
||||
}
|
||||
else
|
||||
{
|
||||
lblCausale.Text = "";
|
||||
valCausale.Text = "";
|
||||
}
|
||||
protected bool _linkActive = true;
|
||||
|
||||
// ATTENZIONE! dati generati casualmente, da cambiare in produzione!!!
|
||||
bool demoRandom = false;
|
||||
if (demoRandom)
|
||||
{
|
||||
// indico a caso % pz prodotti...
|
||||
Random RandomClass = new Random(DateTime.Now.Millisecond);
|
||||
if (idxStato == 13)
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 4 + 0.75);
|
||||
}
|
||||
else if (oreTot > 8)
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 2 + 0.25);
|
||||
}
|
||||
}
|
||||
else // mostra lo stesso valore per tutti e due
|
||||
{
|
||||
// prova...se non ha dati relativa mostra n/a - not available
|
||||
/// <summary>
|
||||
/// posizione macchina nella tabella
|
||||
/// </summary>
|
||||
protected string _locazione;
|
||||
|
||||
DateTime Ora = DateTime.Now;
|
||||
protected DS_applicazione.AnagraficaStatiDataTable tabAnagStati;
|
||||
|
||||
valProd.Text = "1H: ";
|
||||
string emptyVal = "n/a <br />";
|
||||
int numPezzi = 0;
|
||||
// prova l'ultima ora
|
||||
try
|
||||
{
|
||||
// conto num pezzi e divido 1h/pezzi
|
||||
numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-1), Ora).Rows.Count;
|
||||
if (numPezzi > 0)
|
||||
protected DS_ProdTempi.MappaStatoExplDataTable tabMSE;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
/// <summary>
|
||||
/// seriale associato alla macchina da controllare
|
||||
/// </summary>
|
||||
protected string _IdxMacchina
|
||||
{
|
||||
get
|
||||
{
|
||||
valProd.Text += String.Format("{0:#.00}m <br />", Math.Round((double)60 / numPezzi, 3));
|
||||
return hfIdxMacchina.Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
hfIdxMacchina.Value = value.Trim();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Public Properties
|
||||
|
||||
/// <summary>
|
||||
/// Idx della macchina controllata
|
||||
/// </summary>
|
||||
public string IdxMacchina
|
||||
{
|
||||
get
|
||||
{
|
||||
return _IdxMacchina;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (resoconti.mngr == null)
|
||||
{
|
||||
resoconti.mngr = new resoconti();
|
||||
}
|
||||
_IdxMacchina = value;
|
||||
_locazione = resoconti.mngr.locazioneDaIdx(_IdxMacchina);
|
||||
updateMe();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// definisce se sia attivo il link della pagina
|
||||
/// </summary>
|
||||
public bool linkActive
|
||||
{
|
||||
get
|
||||
{
|
||||
return _linkActive;
|
||||
}
|
||||
set
|
||||
{
|
||||
_linkActive = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// stringa locazione macchina in tabella
|
||||
/// </summary>
|
||||
public string locazione
|
||||
{
|
||||
get
|
||||
{
|
||||
return _locazione;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (resoconti.mngr == null)
|
||||
{
|
||||
resoconti.mngr = new resoconti();
|
||||
}
|
||||
_locazione = value;
|
||||
try
|
||||
{
|
||||
_IdxMacchina = resoconti.mngr.idxDaLocazione(_locazione);
|
||||
updateMe();
|
||||
}
|
||||
catch
|
||||
{
|
||||
_IdxMacchina = "nd";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// recupera i dati
|
||||
/// </summary>
|
||||
private void retrieveData()
|
||||
{
|
||||
// cerco se ho i dati in REDIS x non richiederli...
|
||||
string hashKeyMSE = memLayer.ML.redHash("Tab:MSE:" + IdxMacchina);
|
||||
string hashKeyAS = memLayer.ML.redHash("Tab:AnagStati");
|
||||
string serVal = "";
|
||||
if (memLayer.ML.redKeyPresent(hashKeyMSE))
|
||||
//if (memLayer.ML.redHashPresent(hashKeyMSE))
|
||||
{
|
||||
serVal = memLayer.ML.getRSV(hashKeyMSE);
|
||||
|
||||
tabMSE = JsonConvert.DeserializeObject<DS_ProdTempi.MappaStatoExplDataTable>(serVal);
|
||||
//tabMSE = (DS_ProdTempi.MappaStatoExplDataTable)memLayer.ML.deserializeVal(serVal);
|
||||
|
||||
serVal = memLayer.ML.getRSV(hashKeyAS);
|
||||
tabAnagStati = JsonConvert.DeserializeObject<DS_applicazione.AnagraficaStatiDataTable>(serVal);
|
||||
//tabAnagStati = (DS_applicazione.AnagraficaStatiDataTable)memLayer.ML.deserializeVal(serVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
// altrimenti prendo da DB...
|
||||
try
|
||||
{
|
||||
// popolazione tabelle
|
||||
tabMSE = DataLayerObj.taMSE.getByIdxMacchina(IdxMacchina);
|
||||
tabAnagStati = DataLayerObj.taAnagStati.GetData();
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
// salvo su DB! dati principali x 30 secondi...
|
||||
serVal = memLayer.ML.serializeVal(tabMSE);
|
||||
memLayer.ML.setRSV(hashKeyMSE, serVal, 30);
|
||||
// anche il resto...
|
||||
serVal = memLayer.ML.serializeVal(tabAnagStati);
|
||||
memLayer.ML.setRSV(hashKeyAS, serVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
catch
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
|
||||
// prova le ultime 8 ore
|
||||
|
||||
valProd.Text += "8H: ";
|
||||
numPezzi = 0;
|
||||
try
|
||||
{
|
||||
// conto num pezzi e divido 1h/pezzi
|
||||
numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-8), Ora).Rows.Count;
|
||||
if (numPezzi > 0)
|
||||
/// <summary>
|
||||
/// sistema hyperLink
|
||||
/// </summary>
|
||||
private void updateHL()
|
||||
{
|
||||
bool answ = false;
|
||||
int minuti = memLayer.ML.CRI("keepAliveMin");
|
||||
// controllo se il keep alive è oltre il termine...
|
||||
DateTime lastKA = DateTime.Now.AddMinutes(-minuti);
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
valProd.Text += String.Format("{0:#.00}m ", Math.Round((double)480 / numPezzi, 3));
|
||||
string nomeVar = string.Format("KeepAlive:{0}", _IdxMacchina);
|
||||
string redKey = memLayer.ML.redHash(nomeVar);
|
||||
var _lastKA = memLayer.ML.getRSV(redKey);
|
||||
if (_lastKA == null)
|
||||
{
|
||||
answ = true;
|
||||
//cerco su DB...
|
||||
try
|
||||
{
|
||||
var tabDati = DataLayerObj.taKeepAlive.getByIdxMacchina(_IdxMacchina);
|
||||
if (tabDati.Rows.Count > 0)
|
||||
{
|
||||
lastKA = tabDati[0].DataOraServer;
|
||||
answ = (lastKA.AddMinutes(minuti) < DateTime.Now);
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
logger.lg.scriviLog($"Eccezione in updateHL per IdxMacchina {IdxMacchina} - locazione {locazione}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
|
||||
}
|
||||
}
|
||||
}
|
||||
hlComWarning.Visible = answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// aggiorna il layout grafico
|
||||
/// </summary>
|
||||
private void updateLayout()
|
||||
{
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
try
|
||||
{
|
||||
// in base allo stato recupero il colore...
|
||||
string codColore = resoconti.mngr.semaforoDaIdxStato(resoconti.mngr.statoMacchina(_IdxMacchina));
|
||||
pnlMacchina.CssClass = codColore;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// sistema il testo
|
||||
/// </summary>
|
||||
private void updateText()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_IdxMacchina) && _IdxMacchina != "nd")
|
||||
{
|
||||
// labels
|
||||
lblCodArticolo.Text = "Art.";
|
||||
lblStato.Text = "Stato";
|
||||
lblProd.Text = "T.Ciclo"; // era OEE
|
||||
lblDurata.Text = "Durata";
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
// valMacchina.Text = tabMacchine.FindByIdxMacchina(IdxMacchina).Nome;
|
||||
// valCodArticolo.Text = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).CodArticolo;
|
||||
|
||||
// leggo valori da MSE...
|
||||
valMacchina.Text = tabMSE[0].Nome;
|
||||
valCodArticolo.Text = tabMSE[0].CodArticolo;
|
||||
// carico ultimo stato che sia durato almeno 6 sec (0.1 min)
|
||||
int idxStato = 0;
|
||||
int oreTot = 0;
|
||||
float minuti = 0;
|
||||
try
|
||||
{
|
||||
DS_ProdTempi.stp_repDonati_getLastStatoDurataMacchinaRow rigaStato = DataLayerObj.taDatiStatoMacch.GetData(IdxMacchina, 0.1)[0];
|
||||
idxStato = rigaStato.idxStato;
|
||||
oreTot = Convert.ToInt32(Math.Floor(rigaStato.Minuti / 60));
|
||||
minuti = (float)rigaStato.Minuti - 60 * oreTot;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//idxStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato;
|
||||
//DateTime inizioStato = tabStatoMacchine.FindByIdxMacchina(IdxMacchina).InizioStato;
|
||||
//DateTime ora = DateTime.Now;
|
||||
//TimeSpan durata = ora.Subtract(inizioStato);
|
||||
//oreTot = durata.Days * 24 + durata.Hours;
|
||||
//minuti = durata.Minutes;
|
||||
idxStato = tabMSE[0].idxStato;
|
||||
oreTot = (int)tabMSE[0].durata / 60;
|
||||
minuti = (int)tabMSE[0].durata - 60 * oreTot;
|
||||
}
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//valStato.Text = tabAnagStati.FindByIdxStato(idxStato).Descrizione;
|
||||
valStato.Text = tabMSE[0].DescrizioneStato;
|
||||
valDurata.Text = string.Format("{0}h {1}min", oreTot, minuti);
|
||||
// solo se in stato NON di run...
|
||||
if (idxStato != 13)
|
||||
{
|
||||
lblCausale.Text = "Causale fermo";
|
||||
string cauFermo = "nd";
|
||||
try
|
||||
{
|
||||
cauFermo = tabAnagStati.FindByIdxStato(tabMSE[0].idxStato).Descrizione;
|
||||
//cauFermo = tabAnagStati.FindByIdxStato(Convert.ToInt32(tabStatoMacchine.FindByIdxMacchina(IdxMacchina).IdxStato)).Descrizione;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 2018.02.05 cambio x fix nuovi impianti
|
||||
//cauFermo = string.Format("IN: {0}", tabStatoMacchine.FindByIdxMacchina(IdxMacchina).Value);
|
||||
cauFermo = string.Format("IN: {0}", tabMSE[0].idxStato);
|
||||
}
|
||||
valCausale.Text = cauFermo;
|
||||
}
|
||||
else
|
||||
{
|
||||
lblCausale.Text = "";
|
||||
valCausale.Text = "";
|
||||
}
|
||||
|
||||
// ATTENZIONE! dati generati casualmente, da cambiare in produzione!!!
|
||||
bool demoRandom = false;
|
||||
if (demoRandom)
|
||||
{
|
||||
// indico a caso % pz prodotti...
|
||||
Random RandomClass = new Random(DateTime.Now.Millisecond);
|
||||
if (idxStato == 13)
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 4 + 0.75);
|
||||
}
|
||||
else if (oreTot > 8)
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text = string.Format("{0:P}", RandomClass.NextDouble() / 2 + 0.25);
|
||||
}
|
||||
}
|
||||
else // mostra lo stesso valore per tutti e due
|
||||
{
|
||||
// prova...se non ha dati relativa mostra n/a - not available
|
||||
|
||||
DateTime Ora = DateTime.Now;
|
||||
|
||||
valProd.Text = "1H: ";
|
||||
string emptyVal = "n/a <br />";
|
||||
int numPezzi = 0;
|
||||
// prova l'ultima ora
|
||||
try
|
||||
{
|
||||
// conto num pezzi e divido 1h/pezzi
|
||||
numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-1), Ora).Rows.Count;
|
||||
if (numPezzi > 0)
|
||||
{
|
||||
valProd.Text += String.Format("{0:#.00}m <br />", Math.Round((double)60 / numPezzi, 3));
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
|
||||
// prova le ultime 8 ore
|
||||
|
||||
valProd.Text += "8H: ";
|
||||
numPezzi = 0;
|
||||
try
|
||||
{
|
||||
// conto num pezzi e divido 1h/pezzi
|
||||
numPezzi = DataLayerObj.taTempiCicloRilevati.getByMacchinaPeriodo(IdxMacchina, Ora.AddHours(-8), Ora).Rows.Count;
|
||||
if (numPezzi > 0)
|
||||
{
|
||||
valProd.Text += String.Format("{0:#.00}m ", Math.Round((double)480 / numPezzi, 3));
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
/// <summary>
|
||||
/// rimanda alla pagina di dettaglio della macchina scelta
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void lnkMacchina_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (linkActive)
|
||||
{
|
||||
memLayer.ML.setSessionVal("IdxMacchina", IdxMacchina);
|
||||
Response.Redirect(string.Format("~/DettaglioMacchina?IdxMacchina={0}", IdxMacchina));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// caricamento pagina
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
//updateMe();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// metto a posto l'immagine
|
||||
/// </summary>
|
||||
protected void updateImg()
|
||||
{
|
||||
string urlMacchina;
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
urlMacchina = $"~/images/macchine/{resoconti.mngr.urlMacchina(IdxMacchina)}";
|
||||
if (urlMacchina == "thumb_")
|
||||
{
|
||||
urlMacchina = "~/images/empty.png";
|
||||
}
|
||||
else
|
||||
{
|
||||
imgThumb.ToolTip = resoconti.mngr.nomeMacchina(IdxMacchina);
|
||||
}
|
||||
|
||||
string fullPath = Server.MapPath(urlMacchina);
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
// metto default Steamware
|
||||
urlMacchina = "~/images/macchine/Steamware.png";
|
||||
}
|
||||
|
||||
imgThumb.ImageUrl = urlMacchina;
|
||||
}
|
||||
else
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
urlMacchina = "~/images/empty.png";
|
||||
imgThumb.ImageUrl = urlMacchina;
|
||||
}
|
||||
}
|
||||
|
||||
catch
|
||||
{
|
||||
valProd.Text += emptyVal;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// rimanda alla pagina di dettaglio della macchina scelta
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void lnkMacchina_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (linkActive)
|
||||
{
|
||||
memLayer.ML.setSessionVal("IdxMacchina", IdxMacchina);
|
||||
Response.Redirect(string.Format("~/DettaglioMacchina?IdxMacchina={0}", IdxMacchina));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// aggiorna il layout grafico
|
||||
/// </summary>
|
||||
private void updateLayout()
|
||||
{
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
try
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// aggiorna controllo
|
||||
/// </summary>
|
||||
public void updateMe()
|
||||
{
|
||||
// in base allo stato recupero il colore...
|
||||
string codColore = resoconti.mngr.semaforoDaIdxStato(resoconti.mngr.statoMacchina(_IdxMacchina));
|
||||
pnlMacchina.CssClass = codColore;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// sistema hyperLink
|
||||
/// </summary>
|
||||
private void updateHL()
|
||||
{
|
||||
bool answ = false;
|
||||
int minuti = memLayer.ML.CRI("keepAliveMin");
|
||||
// controllo se il keep alive è oltre il termine...
|
||||
DateTime lastKA = DateTime.Now.AddMinutes(-minuti);
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
string nomeVar = string.Format("KeepAlive:{0}", _IdxMacchina);
|
||||
string redKey = memLayer.ML.redHash(nomeVar);
|
||||
var _lastKA = memLayer.ML.getRSV(redKey);
|
||||
if (_lastKA == null)
|
||||
{
|
||||
answ = true;
|
||||
//cerco su DB...
|
||||
try
|
||||
{
|
||||
var tabDati = DataLayerObj.taKeepAlive.getByIdxMacchina(_IdxMacchina);
|
||||
if (tabDati.Rows.Count > 0)
|
||||
//SE E SOLO SE ho una macchina e/o locazione...
|
||||
if (!string.IsNullOrEmpty(IdxMacchina) && !IdxMacchina.Contains("#") && (locazione != "00"))
|
||||
{
|
||||
lastKA = tabDati[0].DataOraServer;
|
||||
answ = (lastKA.AddMinutes(minuti) < DateTime.Now);
|
||||
// effettua update visualizzazione
|
||||
try
|
||||
{
|
||||
retrieveData();
|
||||
updateLayout();
|
||||
updateText();
|
||||
updateImg();
|
||||
updateHL();
|
||||
// controllo se link attivo...
|
||||
if (!_linkActive)
|
||||
{
|
||||
valMacchina.Enabled = false;
|
||||
}
|
||||
//logger.lg.scriviLog(string.Format("Retrieve: {0}", DateTime.Now.Subtract(tick).Milliseconds), tipoLog.INFO);
|
||||
divSegnaposto.Visible = false;
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
logger.lg.scriviLog($"Eccezione in fase popolamento statoMacchina per IdxMacchina {IdxMacchina} - locazione {locazione}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pnlMacchina.Visible = false;
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
logger.lg.scriviLog($"Eccezione in updateHL per IdxMacchina {IdxMacchina} - locazione {locazione}{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
|
||||
}
|
||||
}
|
||||
}
|
||||
hlComWarning.Visible = answ;
|
||||
}
|
||||
/// <summary>
|
||||
/// metto a posto l'immagine
|
||||
/// </summary>
|
||||
protected void updateImg()
|
||||
{
|
||||
string urlMacchina;
|
||||
if (_IdxMacchina != "nd")
|
||||
{
|
||||
urlMacchina = $"~/images/macchine/{resoconti.mngr.urlMacchina(IdxMacchina)}";
|
||||
if (urlMacchina == "thumb_")
|
||||
{
|
||||
urlMacchina = "~/images/empty.png";
|
||||
}
|
||||
else
|
||||
{
|
||||
imgThumb.ToolTip = resoconti.mngr.nomeMacchina(IdxMacchina);
|
||||
}
|
||||
imgThumb.ImageUrl = urlMacchina;
|
||||
}
|
||||
else
|
||||
{
|
||||
urlMacchina = "~/images/empty.png";
|
||||
imgThumb.ImageUrl = urlMacchina;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region area public
|
||||
|
||||
/// <summary>
|
||||
/// Idx della macchina controllata
|
||||
/// </summary>
|
||||
public string IdxMacchina
|
||||
{
|
||||
get
|
||||
{
|
||||
return _IdxMacchina;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (resoconti.mngr == null)
|
||||
{
|
||||
resoconti.mngr = new resoconti();
|
||||
}
|
||||
_IdxMacchina = value;
|
||||
_locazione = resoconti.mngr.locazioneDaIdx(_IdxMacchina);
|
||||
updateMe();
|
||||
}
|
||||
#endregion Public Methods
|
||||
}
|
||||
/// <summary>
|
||||
/// stringa locazione macchina in tabella
|
||||
/// </summary>
|
||||
public string locazione
|
||||
{
|
||||
get
|
||||
{
|
||||
return _locazione;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (resoconti.mngr == null)
|
||||
{
|
||||
resoconti.mngr = new resoconti();
|
||||
}
|
||||
_locazione = value;
|
||||
try
|
||||
{
|
||||
_IdxMacchina = resoconti.mngr.idxDaLocazione(_locazione);
|
||||
updateMe();
|
||||
}
|
||||
catch
|
||||
{
|
||||
_IdxMacchina = "nd";
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// definisce se sia attivo il link della pagina
|
||||
/// </summary>
|
||||
public bool linkActive
|
||||
{
|
||||
get
|
||||
{
|
||||
return _linkActive;
|
||||
}
|
||||
set
|
||||
{
|
||||
_linkActive = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user