Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e0b89abaea | |||
| a9983d141d | |||
| c582b88e4a | |||
| 0bcdca1148 | |||
| a8d5f88f3d | |||
| 8039dfbc14 | |||
| f619f3f45e | |||
| 85c11fb8c4 | |||
| 43d613eb67 | |||
| 6276d86b5b | |||
| 0bfff6fff0 |
+293
-279
@@ -4,304 +4,318 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mvc;
|
||||
|
||||
using MP_IO.Interfaces;
|
||||
|
||||
namespace MP_IO.Controllers
|
||||
{
|
||||
public class BENCHController : Controller, IBENCHService
|
||||
{
|
||||
/// <summary>
|
||||
/// Oggetto datalayer specifico
|
||||
/// </summary>
|
||||
DataLayer DataLayerObj = new DataLayer();
|
||||
public class BENCHController : Controller, IBENCHService
|
||||
{
|
||||
#region Public Methods
|
||||
|
||||
// GET: IOB (è un check alive)
|
||||
public string Index()
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
// GET BENCH/CNTKEY/test
|
||||
public string CNTKEY(string id)
|
||||
{
|
||||
string answ = "ND";
|
||||
if (id == null) id = "";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// conto quanti oggetti ho in memoria REDIS...
|
||||
string groupHash = ""; // DataLayer.mHash("");
|
||||
if (id.Length > 0)
|
||||
{
|
||||
groupHash += id + ":";
|
||||
}
|
||||
groupHash += "*";
|
||||
answ = string.Format("Trovate {0} Hash per {1}", memLayer.ML.redCountKey(groupHash), groupHash);
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
|
||||
// GET BENCH/RCLEAN/100
|
||||
public string RCLEAN(int? id)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
// GET BENCH/DTMAC/SIMUL_01
|
||||
public string DTMAC(string id)
|
||||
{
|
||||
// svuoto i precedenti hash... CICLO!
|
||||
for (int i = 0; i < id; i++)
|
||||
{
|
||||
chiave = string.Format("test:{0}", i);
|
||||
memLayer.ML.redDelKey(chiave);
|
||||
}
|
||||
answ = "OK";
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "";
|
||||
try
|
||||
{
|
||||
Dictionary<string, string> valori = DataLayerObj.mDatiMacchine(id);
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/RSETUP/100
|
||||
public string RSETUP(int? id)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
|
||||
// GET BENCH/fSMI/18?idxMS=1&valore=1
|
||||
public string fSMI(int? id, int? idxMS, int? valore)
|
||||
{
|
||||
// salvo il datasetet come insieme di hash in redis...
|
||||
for (int i = 0; i < id; i++)
|
||||
{
|
||||
chiave = string.Format("test:{0}", i);
|
||||
valori[0] = new KeyValuePair<string, string>("numero", i.ToString());
|
||||
valori[1] = new KeyValuePair<string, string>("doppio", (i * 2).ToString());
|
||||
memLayer.ML.redSaveHash(chiave, valori);
|
||||
}
|
||||
answ = "OK";
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero dati x sapere quale famiglia SMI è necessaria e quale stato / segnale si sia ricevuto
|
||||
int idxFamIn = Convert.ToInt32(id);
|
||||
int idxMicroStato = Convert.ToInt32(idxMS);
|
||||
int valIOB = Convert.ToInt32(valore);
|
||||
// recupero microstato macchina da chiave relativa
|
||||
answ = "";
|
||||
try
|
||||
{
|
||||
// verifico se ci sia in memoria tab della fam macchina relativa (sennò carico)
|
||||
string fiHASH = DataLayer.hSMI(idxFamIn);
|
||||
string outVal = "";
|
||||
bool trovato = memLayer.ML.redHashPresentSz(fiHASH);
|
||||
if (!trovato)
|
||||
{
|
||||
// ricarico tabella!
|
||||
KeyValuePair<string, string>[] valori = DataLayerObj.mTabSMI(idxFamIn);
|
||||
answ = string.Format("Ricaricata SMI per famiglia {0}<br/>", fiHASH);
|
||||
}
|
||||
answ += string.Format("Trovata {0} Hash per {1}<br />", memLayer.ML.redCountKey(fiHASH), fiHASH);
|
||||
// recupero singolo valore (stringa) x chiave
|
||||
outVal = DataLayerObj.valoreSMI(idxFamIn, idxMicroStato, valIOB);
|
||||
// mostro output
|
||||
answ += string.Format("idxFamIN: {0} | idxMS: {1} | valIOB: {2} | out: {3} <br/>", idxFamIn, idxMicroStato, valIOB, outVal);
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Total Time Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/RSH/100
|
||||
public string RSH(int? id)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "";
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
|
||||
// GET: IOB (è un check alive)
|
||||
public string Index()
|
||||
{
|
||||
// ora restituisco record completo dell'hash con ID indicato
|
||||
chiave = string.Format("test:{0}", id);
|
||||
valori = memLayer.ML.redGetHash(chiave);
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
return "OK";
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/DTMAC/SIMUL_01
|
||||
public string DTMAC(string id)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "";
|
||||
try
|
||||
|
||||
// GET BENCH/INSEN/2004
|
||||
public string INSEN(string id)
|
||||
{
|
||||
Dictionary<string, string> valori = DataLayerObj.mDatiMacchine(id);
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero microstato macchina da chiave relativa
|
||||
answ = "";
|
||||
try
|
||||
{
|
||||
answ += string.Format("Macchina {0}, insEnabled {1}<br />", id, DataLayerObj.insEnab(id));
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Total Time Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/CNTKEY/test
|
||||
public string CNTKEY(string id)
|
||||
{
|
||||
string answ = "ND";
|
||||
if (id == null) id = "";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// conto quanti oggetti ho in memoria REDIS...
|
||||
string groupHash = ""; // DataLayer.mHash("");
|
||||
if (id.Length > 0)
|
||||
{
|
||||
groupHash += id + ":";
|
||||
}
|
||||
groupHash += "*";
|
||||
answ = string.Format("Trovate {0} Hash per {1}", memLayer.ML.redCountKey(groupHash), groupHash);
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/tSMI/60
|
||||
public string tSMI(int? id)
|
||||
{
|
||||
string answ = "ND";
|
||||
long splitTime = 0;
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
int idxFamIn = Convert.ToInt32(id);
|
||||
answ = "";
|
||||
try
|
||||
|
||||
// GET BENCH/RCLEAN/100
|
||||
public string RCLEAN(int? id)
|
||||
{
|
||||
KeyValuePair<string, string>[] valori = DataLayerObj.mTabSMI(idxFamIn);
|
||||
splitTime = stopWatch.ElapsedMilliseconds;
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
{
|
||||
// svuoto i precedenti hash... CICLO!
|
||||
for (int i = 0; i < id; i++)
|
||||
{
|
||||
chiave = string.Format("test:{0}", i);
|
||||
memLayer.ML.redDelKey(chiave);
|
||||
}
|
||||
answ = "OK";
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>ReadTime: {0}ms<br>Total Time Elapsed: {1}ms", splitTime, ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/fSMI/18?idxMS=1&valore=1
|
||||
public string fSMI(int? id, int? idxMS, int? valore)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero dati x sapere quale famiglia SMI è necessaria e quale stato / segnale si sia ricevuto
|
||||
int idxFamIn = Convert.ToInt32(id);
|
||||
int idxMicroStato = Convert.ToInt32(idxMS);
|
||||
int valIOB = Convert.ToInt32(valore);
|
||||
// recupero microstato macchina da chiave relativa
|
||||
answ = "";
|
||||
try
|
||||
|
||||
// GET BENCH/RSETUP/100
|
||||
public string RSETUP(int? id)
|
||||
{
|
||||
// verifico se ci sia in memoria tab della fam macchina relativa (sennò carico)
|
||||
string fiHASH = DataLayer.hSMI(idxFamIn);
|
||||
string outVal = "";
|
||||
bool trovato = memLayer.ML.redHashPresentSz(fiHASH);
|
||||
if (!trovato)
|
||||
{
|
||||
// ricarico tabella!
|
||||
KeyValuePair<string, string>[] valori = DataLayerObj.mTabSMI(idxFamIn);
|
||||
answ = string.Format("Ricaricata SMI per famiglia {0}<br/>", fiHASH);
|
||||
}
|
||||
answ += string.Format("Trovata {0} Hash per {1}<br />", memLayer.ML.redCountKey(fiHASH), fiHASH);
|
||||
// recupero singolo valore (stringa) x chiave
|
||||
outVal = DataLayerObj.valoreSMI(idxFamIn, idxMicroStato, valIOB);
|
||||
// mostro output
|
||||
answ += string.Format("idxFamIN: {0} | idxMS: {1} | valIOB: {2} | out: {3} <br/>", idxFamIn, idxMicroStato, valIOB, outVal);
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
{
|
||||
// salvo il datasetet come insieme di hash in redis...
|
||||
for (int i = 0; i < id; i++)
|
||||
{
|
||||
chiave = string.Format("test:{0}", i);
|
||||
valori[0] = new KeyValuePair<string, string>("numero", i.ToString());
|
||||
valori[1] = new KeyValuePair<string, string>("doppio", (i * 2).ToString());
|
||||
memLayer.ML.redSaveHash(chiave, valori);
|
||||
}
|
||||
answ = "OK";
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Total Time Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
// GET BENCH/INSEN/2004
|
||||
public string INSEN(string id)
|
||||
{
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero microstato macchina da chiave relativa
|
||||
answ = "";
|
||||
try
|
||||
|
||||
// GET BENCH/RSH/100
|
||||
public string RSH(int? id)
|
||||
{
|
||||
answ += string.Format("Macchina {0}, insEnabled {1}<br />", id, DataLayerObj.insEnab(id));
|
||||
string answ = "ND";
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
answ = "";
|
||||
string chiave;
|
||||
KeyValuePair<string, string>[] valori = new KeyValuePair<string, string>[2];
|
||||
try
|
||||
{
|
||||
// ora restituisco record completo dell'hash con ID indicato
|
||||
chiave = string.Format("test:{0}", id);
|
||||
valori = memLayer.ML.redGetHash(chiave);
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>Total Time Elapsed: {0}ms", ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
|
||||
// GET BENCH/tSMI/60
|
||||
public string tSMI(int? id)
|
||||
{
|
||||
string answ = "ND";
|
||||
long splitTime = 0;
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
int idxFamIn = Convert.ToInt32(id);
|
||||
answ = "";
|
||||
try
|
||||
{
|
||||
KeyValuePair<string, string>[] valori = DataLayerObj.mTabSMI(idxFamIn);
|
||||
splitTime = stopWatch.ElapsedMilliseconds;
|
||||
foreach (var item in valori)
|
||||
{
|
||||
answ += string.Format("{0}|{1}<br/>", item.Key, item.Value);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
stopWatch.Stop();
|
||||
// Get the elapsed time as a TimeSpan value.
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
// accodo tempo!
|
||||
answ += string.Format("<hr/>ReadTime: {0}ms<br>Total Time Elapsed: {1}ms", splitTime, ts.TotalMilliseconds);
|
||||
// ritorno
|
||||
return answ;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto datalayer specifico
|
||||
/// </summary>
|
||||
private DataLayer DataLayerObj = new DataLayer();
|
||||
|
||||
#endregion Private Fields
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
using System;
|
||||
using MP_IO.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
using MP_IO.Interfaces;
|
||||
|
||||
namespace MP_IO.Controllers
|
||||
{
|
||||
public class HomeController : Controller, IHomeService
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using MagData;
|
||||
using MapoDb;
|
||||
using MapoSDK;
|
||||
using MP_IO.Interfaces;
|
||||
using Newtonsoft.Json;
|
||||
using StackExchange.Redis;
|
||||
using SteamWare;
|
||||
@@ -207,11 +208,6 @@ namespace MP_IO.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
#if false
|
||||
DataLayer DataLayerObj = new DataLayer();
|
||||
// salvo risposta!
|
||||
answ = DataLayerObj.insEnab(id) ? "OK" : "NO";
|
||||
#endif
|
||||
answ = DataLayerMan.insEnab(id) ? "OK" : "NO";
|
||||
// 2025.03.04 aggiunto keepalive x evitare C101
|
||||
MapoDb.MapoDb connDb = new MapoDb.MapoDb();
|
||||
@@ -226,9 +222,6 @@ namespace MP_IO.Controllers
|
||||
return answ;
|
||||
}
|
||||
|
||||
|
||||
protected static DataLayer DataLayerMan = new DataLayer();
|
||||
|
||||
/// <summary>
|
||||
/// Processa una chiamata POST per l'invio di un array Json di oggetti input (EVENTI)
|
||||
/// POST: IOB/evListJson/SIMUL_03
|
||||
@@ -461,24 +454,6 @@ namespace MP_IO.Controllers
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Invio record flog secco
|
||||
/// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999
|
||||
/// </summary>
|
||||
/// <param name="id">IdxMacchina</param>
|
||||
/// <param name="flux">CodFlux</param>
|
||||
/// <param name="valore">Valore da registrare</param>
|
||||
/// <param name="dtEve">DataOra evento (IOB time)</param>
|
||||
/// <param name="dtCurr">DataOra corrente (IOB time)</param>
|
||||
/// <param name="cnt">Contatore eventi (IOB)</param>
|
||||
/// <returns></returns>
|
||||
public string flog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt)
|
||||
{
|
||||
return flog(id, flux, valore, dtEve, dtCurr, cnt, "false");
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Invio record flog secco
|
||||
/// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999&disabKA=false
|
||||
@@ -522,37 +497,6 @@ namespace MP_IO.Controllers
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Processa una chiamata POST per l'invio di un array Json di oggetti fluxLog
|
||||
/// PUT: IOB/flogJson/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public string flogJson(string id)
|
||||
{
|
||||
int insDone = 0;
|
||||
string answ = "-";
|
||||
// questa classe è derivata da Controller.Response... x cui recupero lo stream in altro modo...
|
||||
string content = "";
|
||||
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
|
||||
using (var reader = new StreamReader(
|
||||
Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true))
|
||||
{
|
||||
content = reader.ReadToEnd();
|
||||
}
|
||||
//Rest
|
||||
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
|
||||
// se ho dati...
|
||||
if (content != "")
|
||||
{
|
||||
answ = processFLogJson(id, false, insDone, answ, content);
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Processa una chiamata POST per l'invio di un array Json di oggetti fluxLog
|
||||
/// PUT: IOB/flogJson/SIMUL_03
|
||||
@@ -2652,6 +2596,12 @@ namespace MP_IO.Controllers
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
protected static DataLayer DataLayerMan = new DataLayer();
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
@@ -2730,7 +2680,7 @@ namespace MP_IO.Controllers
|
||||
answ = "NO";
|
||||
}
|
||||
// leggo parametri correnti...
|
||||
DateTime adesso= DateTime.Now;
|
||||
DateTime adesso = DateTime.Now;
|
||||
try
|
||||
{
|
||||
List<objItem> currParams = DataLayerObj.getCurrObjItems(id);
|
||||
@@ -2762,9 +2712,8 @@ namespace MP_IO.Controllers
|
||||
else
|
||||
{
|
||||
// richiesto 10 sec prima...
|
||||
trovato.lastRequest= adesso.AddSeconds(-10);
|
||||
trovato.lastRequest = adesso.AddSeconds(-10);
|
||||
}
|
||||
|
||||
}
|
||||
// altrimenti AGGIUNGO (READ ONLY)...
|
||||
else
|
||||
@@ -2798,4 +2747,4 @@ namespace MP_IO.Controllers
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Web;
|
||||
using System.Web.Http.Filters;
|
||||
|
||||
namespace MP_IO.Controllers.WebAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Gestione cache x chaimate WebAPI
|
||||
///
|
||||
/// rif: https://www.c-sharpcorner.com/article/implementing-caching-in-web-api/
|
||||
/// </summary>
|
||||
public class CacheFilter : ActionFilterAttribute
|
||||
{
|
||||
public int TimeDuration { get; set; }
|
||||
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
|
||||
{
|
||||
actionExecutedContext.Response.Headers.CacheControl = new CacheControlHeaderValue
|
||||
{
|
||||
MaxAge = TimeSpan.FromSeconds(TimeDuration),
|
||||
MustRevalidate = true,
|
||||
Public = true
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
using MapoDb;
|
||||
using SteamWare;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Web.Http;
|
||||
|
||||
namespace MP_IO.Controllers.WebAPI
|
||||
{
|
||||
public class IOBController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// GET api/IOB
|
||||
/// è un check alive del server
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[CacheFilter(TimeDuration = 10)]
|
||||
[HttpGet]
|
||||
public string Get()
|
||||
{
|
||||
if (memLayer.ML.CRB("IOB_RedEnab"))
|
||||
{
|
||||
// conto la richiesta nel contatore REDIS
|
||||
long nCall = memLayer.ML.setRCntI(DataLayer.mHash("COUNT:pCall:IOB_INDEX"));
|
||||
//... se == nCall2Log scrivo su log e resetto
|
||||
long nCall2Log = memLayer.ML.cdvi("nCall2Log");
|
||||
if (nCall >= nCall2Log)
|
||||
{
|
||||
// loggo
|
||||
logger.lg.scriviLog(string.Format("IOB_INDEX: effettuate {0} call", nCall), tipoLog.INFO);
|
||||
// resetto!
|
||||
memLayer.ML.resetRCnt(DataLayer.mHash("COUNT:pCall:IOB_INDEX"));
|
||||
}
|
||||
}
|
||||
return "OK";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// GET api/IOB/SIMUL_03
|
||||
/// Verifica stato enabled di un determinato IOB
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[CacheFilter(TimeDuration = 5)]
|
||||
[HttpGet]
|
||||
public string Get(string id)
|
||||
{
|
||||
string answ = "ND";
|
||||
// se id nullo --> KO!
|
||||
if (id == null)
|
||||
{
|
||||
answ = "KO";
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
DataLayer DataLayerObj = new DataLayer();
|
||||
// salvo risposta!
|
||||
answ = DataLayerObj.insEnab(id) ? "OK" : "NO";
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
logger.lg.scriviLog(string.Format("Errore in enabled{0}{1}", Environment.NewLine, exc));
|
||||
answ = "NO";
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
// POST api/<controller>
|
||||
public void Post([FromBody]string value)
|
||||
{
|
||||
}
|
||||
|
||||
// PUT api/<controller>/5
|
||||
public void Put(int id, [FromBody]string value)
|
||||
{
|
||||
}
|
||||
|
||||
// DELETE api/<controller>/5
|
||||
public void Delete(int id)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,33 @@ namespace MP_IO.Interfaces
|
||||
{
|
||||
public interface IBENCHService
|
||||
{
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/CNTKEY/test
|
||||
/// </summary>
|
||||
string CNTKEY(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/DTMAC/SIMUL_01
|
||||
/// </summary>
|
||||
string DTMAC(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/fSMI/18?idxMS=1&valore=1
|
||||
/// </summary>
|
||||
string fSMI(int? id, int? idxMS, int? valore);
|
||||
|
||||
/// <summary>
|
||||
/// GET: IOB (è un check alive)
|
||||
/// </summary>
|
||||
string Index();
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/INSEN/2004
|
||||
/// </summary>
|
||||
string INSEN(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/RCLEAN/100
|
||||
/// </summary>
|
||||
@@ -22,29 +44,11 @@ namespace MP_IO.Interfaces
|
||||
/// </summary>
|
||||
string RSH(int? id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/DTMAC/SIMUL_01
|
||||
/// </summary>
|
||||
string DTMAC(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/CNTKEY/test
|
||||
/// </summary>
|
||||
string CNTKEY(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/tSMI/60
|
||||
/// </summary>
|
||||
string tSMI(int? id);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/fSMI/18?idxMS=1&valore=1
|
||||
/// </summary>
|
||||
string fSMI(int? id, int? idxMS, int? valore);
|
||||
|
||||
/// <summary>
|
||||
/// GET BENCH/INSEN/2004
|
||||
/// </summary>
|
||||
string INSEN(string id);
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,16 @@
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace MP_IO.Interfaces
|
||||
{
|
||||
public interface IHomeService
|
||||
{
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// GET: Home
|
||||
/// </summary>
|
||||
string Index();
|
||||
RedirectResult Index();
|
||||
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,51 +1,445 @@
|
||||
namespace MP_IO.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// SALVA x macchina KVP parametro/valore:
|
||||
/// GET: IOB/addOptPar/SIMUL_03?pName=PZREQ&pValue=1000
|
||||
/// </summary>
|
||||
public interface IIOBService
|
||||
{
|
||||
#region Public Methods
|
||||
|
||||
/// <param name="id"></param>
|
||||
/// <param name="pName"></param>
|
||||
/// <param name="pValue"></param>
|
||||
string addOptPar(string id, string pName, string pValue);
|
||||
|
||||
/// <summary>
|
||||
/// AGGIUNGE TASK richiesto x macchina:
|
||||
/// GET: IOB/addTask2Exe/3010?taskName=startSetup&taskVal=T190406101512
|
||||
/// GET: IOB/addTask2Exe/3010?taskName=stopSetup&taskVal=T190406101512
|
||||
/// GET: IOB/addTask2Exe/SIMUL_03?taskName=setProg&taskVal=P00000001
|
||||
/// GET: IOB/addTask2Exe/SIMUL_03?taskName=setComm&taskVal=ODL_0000123
|
||||
/// GET: IOB/addTask2Exe/SIMUL_03?taskName=setArt&taskVal=ART_0000321
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="taskName"></param>
|
||||
/// <param name="taskVal"></param>
|
||||
string addTask2Exe(string id, string taskName, string taskVal);
|
||||
|
||||
/// <summary>
|
||||
/// Richiesta chiusura manuale ODL x macchina (popup utente):
|
||||
/// GET: IOB/askCloseODL/SIMUL_03?idxOdl=123
|
||||
/// </summary>
|
||||
/// <param name="id">id macchina</param>
|
||||
/// <param name="idxOdl">idx dell'ODL da chiudere</param>
|
||||
/// <returns>bool esecuzione</returns>
|
||||
bool askCloseODL(string id, int idxOdl);
|
||||
|
||||
/// <summary>
|
||||
/// Chiude ODL x macchina:
|
||||
/// GET: IOB/closeODL/SIMUL_03?idxOdl=123&dtEve=20230323151100000&dtCurr=20230323221100000
|
||||
/// </summary>
|
||||
/// <param name="id">id macchina</param>
|
||||
/// <param name="idxOdl">idx dell'ODL da chiudere</param>
|
||||
/// <param name="dtEve">DataOra evento</param>
|
||||
/// <param name="dtCurr">DataOra corrente x fix</param>
|
||||
/// <returns>bool esecuzione</returns>
|
||||
bool closeODL(string id, int idxOdl, string dtEve = "", string dtCurr = "");
|
||||
|
||||
/// <summary>
|
||||
/// Chiude PODL --> ODL x macchina:
|
||||
/// GET: IOB/closePODL/SIMUL_03?idxPOdl=123&dtEve=20230323151100000&dtCurr=20230323221100000
|
||||
/// </summary>
|
||||
/// <param name="id">id macchina</param>
|
||||
/// <param name="idxPOdl">idx del POdl da chiudere</param>
|
||||
/// <param name="dtEve">DataOra evento</param>
|
||||
/// <param name="dtCurr">DataOra corrente x fix</param>
|
||||
/// <returns>bool esecuzione</returns>
|
||||
bool closePODL(string id, int idxPOdl, string dtEve = "", string dtCurr = "");
|
||||
|
||||
/// <summary>
|
||||
/// GET: IOB/enabled/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string enabled(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Processa una chiamata POST per l'invio di un array Json di oggetti input (EVENTI)
|
||||
/// POST: IOB/evListJson/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <returns></returns>
|
||||
string evListJson(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Sistema Dossier/Snapshot giornalieri x impianto indicato, andando a generare 1 Dossier
|
||||
/// giornaliero x ogni giornata dall'ultimo registrato alla data corrente
|
||||
/// es: http://url_site/MP/IO/IOB/fixDailyDossier/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string fixDailyDossier(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Sistema ODL giornalieri x impianto indicato, andando a generare 1 ODL giornaliero x ogni
|
||||
/// giornata dall'ultimo ODL aperto alla data corrente
|
||||
/// es: http://url_site/MP/IO/IOB/fixDailyOdl/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string fixDailyOdl(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Sistema ODL giornalieri x impianto indicato, andando a generare 1 ODL giornaliero x ogni
|
||||
/// giornata dall'ultimo ODL aperto alla data corrente + conferma pezzi (es TFT x ODL
|
||||
/// giornalieri energia)
|
||||
/// es: http://url_site/MP/IO/IOB/fixDailyOdlConfPzCount/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string fixDailyOdlConfPzCount(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Invio record flog secco
|
||||
/// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999&disabKA=false
|
||||
/// </summary>
|
||||
/// <param name="id">IdxMacchina</param>
|
||||
/// <param name="flux">CodFlux</param>
|
||||
/// <param name="valore">Valore da registrare</param>
|
||||
/// <param name="dtEve">DataOra evento (IOB time)</param>
|
||||
/// <param name="dtCurr">DataOra corrente (IOB time)</param>
|
||||
/// <param name="cnt">Contatore eventi (IOB)</param>
|
||||
/// <param name="disabKA">Disabilitazione scrittura record KeepAlive</param>
|
||||
/// <returns></returns>
|
||||
string flog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt, string disabKA = "false");
|
||||
|
||||
/// <summary>
|
||||
/// Processa una chiamata POST per l'invio di un array Json di oggetti fluxLog
|
||||
/// PUT: IOB/flogJson/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <param name="disabKA">Disabilitazione della scrittura del record KeepAlive</param>
|
||||
/// <returns></returns>
|
||||
string flogJson(string id, string disabKA = "false");
|
||||
|
||||
/// <summary>
|
||||
/// Creazione nuovo ODL dato CodXdl + numPz
|
||||
/// GET: IOB/forceCreatePOdl/SIMUL_03?CodXdl=ABCD_1234&numPz=5
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="CodArt"></param>
|
||||
/// <param name="CodGruppo"></param>
|
||||
/// <param name="numPz"></param>
|
||||
/// <returns>IdxODL creato</returns>
|
||||
int forceCreatePOdl(string id, string CodArt, string CodGruppo, int numPz);
|
||||
|
||||
/// <summary>
|
||||
/// Chiude ODL precedente ed avvia uno nuovo (duplicandolo e sitemando quantità RIMANENTE),
|
||||
/// e CONFERMA produzione...
|
||||
/// GET: IOB/forceSplitOdl/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns>Esito chiamata (OK/vuoto)</returns>
|
||||
string forceSplitOdl(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Chiude ODL precedente ed avvia uno nuovo (duplicandolo e sitemando quantità
|
||||
/// RIMANENTE), e CONFERMA produzione...
|
||||
/// GET: IOB/forceSplitOdl/SIMUL_03?doConfirm=true&qtyFromLast=true&roundStep=150&extOrderCode=ABCDE1234
|
||||
/// </summary>
|
||||
/// <param name="id">id impianto</param>
|
||||
/// <param name="doConfirm"></param>
|
||||
/// <param name="qtyFromLast"></param>
|
||||
/// <param name="roundStep"></param>
|
||||
/// <param name="keyRichiesta">Cod esterno da legare all'ODL x tracciare lotti prod</param>
|
||||
/// <param name="matrOpr">matricola operatore che effettua la fuzione (default = 0)</param>
|
||||
/// <returns>Esito chiamata (OK/vuoto)</returns>
|
||||
string forceSplitOdlFull(string id, bool doConfirm, bool qtyFromLast, int? roundStep, string keyRichiesta = "", int matrOpr = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Avvia PODL indicato
|
||||
/// - se esistesse un ODL da altro PODL --> chiude
|
||||
/// - se fosse già in essere ODL collegato --> lascia aperto
|
||||
/// - se fosse chiuso ODL collegato --> duplica PODL e poi avvia nuovo ODL.
|
||||
/// GET: IOB/forceStartPOdl/SIMUL_03?idxPODL=123&dtEve=20230323151100000&dtCurr=20230323221100000
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="idxPODL">idx del PDL da avviare</param>
|
||||
/// <param name="dtEve">data-ora di avvio (opzionale)</param>
|
||||
/// <param name="dtCurr">data-ora attuale (opzionale)</param>
|
||||
/// <param name="matrOpr">matricola operatore (default 0)</param>
|
||||
/// <returns>Esito chiamata (OK/vuoto)</returns>
|
||||
string forceStartPOdl(string id, int idxPODL, string dtEve = "", string dtCurr = "", int matrOpr = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera elenco articoli dei PODL correnti:
|
||||
/// GET: IOB/getArtCurrPODL
|
||||
/// </summary>
|
||||
/// <returns>Json contenente lista oggetti ARTICOLI serializzati</returns>
|
||||
string getArtCurrPODL();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera ArtNum dato CodXdl (per impianti che accettano solo INT in scrittura):
|
||||
/// GET: IOB/getArtNum/SIMUL_03?CodXdl=ABC123
|
||||
/// </summary>
|
||||
/// <param name="id">IdxMacchina (NON considerato)</param>
|
||||
/// <param name="CodArt">CodXdl richiesto, se vuoto restituisce TUTTI i valori in tabella di decodifica</param>
|
||||
/// <returns>Json contenente le righe delle codifiche attive Articolo/Numero</returns>
|
||||
string getArtNum(string id, string CodArt = "");
|
||||
|
||||
/// <summary>
|
||||
/// Recupera elenco articoli USATI:
|
||||
/// GET: IOB/getArtUsed
|
||||
/// </summary>
|
||||
/// <returns>Json contenente lista oggetti ARTICOLI serializzati</returns>
|
||||
string getArtUsed();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera COUNTER x macchina:
|
||||
/// GET: IOB/getCounter/5
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCounter(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera COUNTER x macchina dal CONTEGGIO dei TCRecorded:
|
||||
/// GET: IOB/getCounterTCRec/5
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCounterTCRec(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera DATI correnti x macchina:
|
||||
/// GET: IOB/getCurrData/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns>Json contenente la riga di stato macchina</returns>
|
||||
string getCurrData(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera ODL corrente x macchina:
|
||||
/// GET: IOB/getCurrODL/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCurrODL(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce la quantità pezzi dell'odl correntemente in lavorazione sulla macchina...
|
||||
/// GET: IOB/getCurrOdlQtaReq/SIMUL_01
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
int getCurrOdlQtaReq(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce intera riga dell'odl correntemente in lavorazione sulla macchina...
|
||||
/// GET: IOB/getCurrOdlRow/SIMUL_01
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCurrOdlRow(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce data-ora inizio dell'odl correntemente in lavorazione sulla macchina...
|
||||
/// es: http://url_site/MP/IO/IOB/getCurrOdlStart/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCurrOdlStart(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera DATI PODL correnti (=NON AVVIATI) x macchina:
|
||||
/// GET: IOB/getCurrPODL/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">id macchina, se "" mostra tutto</param>
|
||||
/// <returns>Json contenente lista oggetti PODL serializzati</returns>
|
||||
string getCurrPODL(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce intera riga dello stato di macchina...
|
||||
/// GET: IOB/getCurrStatoRow/SIMUL_01
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getCurrStatoRow(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce un array JSon di files di una IOB
|
||||
/// PUT: IOB/getFiles/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <returns>Oggetto Json in formato MapoSDK.fileEmbed</returns>
|
||||
string getFiles(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce il valore dello stato di IDLE della macchina, quindi SOLO SE NON é in lavoro
|
||||
/// e già convertito in minuti...
|
||||
/// GET: IOB/getIdlePeriod/SIMUL_01
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
int getIdlePeriod(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce il (primo) codice IOB da dover gestire (se un IOBMAN chiede di gestirne uno
|
||||
/// in +...)
|
||||
/// </summary>
|
||||
/// <param name="GWIP">IP del Gateway</param>
|
||||
/// <returns></returns>
|
||||
string getIob2call(string GWIP);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera elenco articoli USATI per ultimi:
|
||||
/// - quelli dei PODL correnti
|
||||
/// - quelli degli ultimi n (DOSS_LastArt in config) ODL lavorati
|
||||
/// GET: IOB/getArtByMacc
|
||||
/// </summary>
|
||||
/// <returns>Json contenente lista oggetti ARTICOLI serializzati</returns>
|
||||
string getLastArtByMacc(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera DATI dell'ultimo dossier dato articolo:
|
||||
/// GET: IOB/getLastDossArt/cod_articolo
|
||||
/// </summary>
|
||||
/// <param name="id">codice articolo, se vuoto --> non fa nulla</param>
|
||||
/// <returns>Json contenente lista oggetti DOSSIER serializzati</returns>
|
||||
string getLastDossArt(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera DATI dell'ultimo dossier dato macchina:
|
||||
/// GET: IOB/getLastDossByMacc/cod_articolo
|
||||
/// </summary>
|
||||
/// <param name="id">codice articolo, se vuoto --> non fa nulla</param>
|
||||
/// <returns>Json contenente lista oggetti DOSSIER serializzati</returns>
|
||||
string getLastDossByMacc(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera DATI dell'ultimo dossier dato PODL correnti:
|
||||
/// GET: IOB/getLastDossPODL
|
||||
/// </summary>
|
||||
/// <returns>Json contenente lista oggetti DOSSIER serializzati</returns>
|
||||
string getLastDossPODL();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera elenco ListValues data tabella:
|
||||
/// GET: IOB/getListValByTable
|
||||
/// </summary>
|
||||
/// <param name="id">nome tabella x cui filtrare risultati, se "" mostra tutto</param>
|
||||
/// <returns>Json contenente lista oggetti ListValue serializzati</returns>
|
||||
string getListValByTable(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce dati di associazione tra macchina, device IOB chiamante e sue info
|
||||
/// </summary>
|
||||
/// <param name="id">Id della macchina</param>
|
||||
/// <returns></returns>
|
||||
string getM2IOB(string id);
|
||||
|
||||
/// <summary>
|
||||
/// restituisce elenco parametri correnti come una List Json di oggetti objItem
|
||||
/// GET: IOB/getObjItems/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <returns></returns>
|
||||
string getObjItems(string id);
|
||||
|
||||
/// <summary>
|
||||
/// restituisce elenco parametri CHE RICHIEDONO scrittura su PLC come una List Json di
|
||||
/// oggetti objItem
|
||||
/// GET: IOB/getObjItems2Write/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id">ID dell'IOB</param>
|
||||
/// <returns></returns>
|
||||
string getObjItems2Write(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET: IOB/getOptPar/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getOdlAtDate(string id, string dateRif);
|
||||
|
||||
string getOptPar(string id);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera PODL prossimo da avviare x macchina:
|
||||
/// GET: IOB/getPOdlNext/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getPODL(string id, int idxPODL);
|
||||
|
||||
string getPOdlAct(string id);
|
||||
|
||||
string getPOdlNext(string id);
|
||||
|
||||
/// <summary>
|
||||
/// GET: IOB/getTask2Exe/SIMUL_03
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
string getTask2Exe(string id);
|
||||
bool insDisab(string id, bool stato);
|
||||
string processInput(string id, int valore, string dtEve, string dtCurr, string cnt);
|
||||
string setProg(string id, string prog, string art, string comm, string disabKA = "false");
|
||||
|
||||
string getXdlNum(string id, string CodXdl = "");
|
||||
|
||||
string Index();
|
||||
|
||||
string input(string id, string valore, string dtEve, string dtCurr, string cnt);
|
||||
|
||||
string liveJson(string id);
|
||||
|
||||
string liveRec(string id, string liveData);
|
||||
|
||||
string rawTransfJson(string id);
|
||||
|
||||
string remOptPar(string id, string pName);
|
||||
|
||||
string remTask2Exe(string id, string taskName);
|
||||
|
||||
string resetCurrODL(string id);
|
||||
|
||||
string saveConf(string id);
|
||||
|
||||
string saveConfYaml(string id);
|
||||
|
||||
string saveDataItems(string id);
|
||||
|
||||
string saveMachineIobConf(string id);
|
||||
|
||||
string savePzCountInc(string id, string qty);
|
||||
|
||||
string savePzCountIncAtDate(string id, string qty, string dtEve = "", string dtCurr = "");
|
||||
|
||||
string sendAlarmBankUpdate(string id, string memAddr, int index, int currStatus);
|
||||
|
||||
string sendReboot(string id, string mac);
|
||||
|
||||
string sendRebootGateway(string GWIP);
|
||||
|
||||
string setCounter(string id, string counter);
|
||||
|
||||
string setM2IOB(string id, string IOB_name);
|
||||
|
||||
string setObjItems(string id);
|
||||
|
||||
string setRedisHashDict(string id);
|
||||
|
||||
string slog(string id);
|
||||
|
||||
string takeFlogSnapshot(string id);
|
||||
|
||||
string ulog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt, string matrOpr, string label, string valNum);
|
||||
|
||||
string ulogJson(string id);
|
||||
|
||||
string uploadFile(string id);
|
||||
|
||||
string upsertObjItems(string id);
|
||||
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -331,8 +331,6 @@
|
||||
<Compile Include="Controllers\BENCH.cs" />
|
||||
<Compile Include="Controllers\HomeController.cs" />
|
||||
<Compile Include="Controllers\IOBController.cs" />
|
||||
<Compile Include="Controllers\WebAPI\CacheFilter.cs" />
|
||||
<Compile Include="Controllers\WebAPI\IOBController.cs" />
|
||||
<Compile Include="enabled.aspx.cs">
|
||||
<DependentUpon>enabled.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
@@ -350,6 +348,9 @@
|
||||
<Compile Include="inputIOB.aspx.designer.cs">
|
||||
<DependentUpon>inputIOB.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Interfaces\IBENCHService.cs" />
|
||||
<Compile Include="Interfaces\IHomeService.cs" />
|
||||
<Compile Include="Interfaces\IIOBService.cs" />
|
||||
<Compile Include="lastUpdate.aspx.cs">
|
||||
<DependentUpon>lastUpdate.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="it">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Analisi Produzione - Evoluzione</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-container">
|
||||
<header class="main-header">
|
||||
<div class="logo">MP-SITE <span class="active">EVOLUTION</span></div>
|
||||
<nav>
|
||||
<a href="index.html">Mappa Stato</a>
|
||||
<a href="analisi.html" class="active">Analisi</a>
|
||||
<a href="sequencer.html">Sequencer</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="content">
|
||||
<div class="kpi-grid">
|
||||
<div class="kpi-card green">
|
||||
<h4>PRODUZIONE TOTALE</h4>
|
||||
<div class="val">124,502</div>
|
||||
</div>
|
||||
<div class="kpi-card">
|
||||
<h4>EFFICIENZA (OEE)</h4>
|
||||
<div class="val">88.4%</div>
|
||||
</div>
|
||||
<div class="kpi-card red">
|
||||
<h4>SCARTI TOTALI</h4>
|
||||
<div class="val">412</div>
|
||||
</div>
|
||||
<div class="kpi-card">
|
||||
<h4>TEMPO DISPONIBILE</h4>
|
||||
<div class="val">22h 15m</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="display: flex; gap: 2rem; flex-wrap: wrap;">
|
||||
<div style="flex: 2; min-width: 500px;">
|
||||
<div class="chart-placeholder">
|
||||
<div class="neon-line-mock"></div>
|
||||
<p>Grafico Storico Produzione (Dettaglio Periodo Selezionato)</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex: 1; min-width: 300px;">
|
||||
<div class="sidebar">
|
||||
<h3 style="margin-bottom: 1rem; color: var(--neon-blue);">Filtri Rapidi</h3>
|
||||
<div style="margin-bottom: 1rem;">
|
||||
<label style="font-size: 0.8rem; color: var(--text-dim);">Linee Attive</label>
|
||||
<div style="margin-top: 0.5rem;">
|
||||
<input type="checkbox" checked> Linea A (Verde) <br>
|
||||
<input type="checkbox" checked> Linea B (Blu) <br>
|
||||
<input type="checkbox"> Linea C (Ambra)
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-bottom: 1rem;">
|
||||
<label style="font-size: 0.8rem; color: var(--text-dim);">Tipo Prodotto</label>
|
||||
<select style="width: 100%; padding: 0.5rem; margin-top: 0.5rem; background: #222; color: white; border: 1px solid var(--border-color);">
|
||||
<option>Tutti i prodotti</option>
|
||||
<option>Codice X100</option>
|
||||
<option>Codice Y200</option>
|
||||
</select>
|
||||
</div>
|
||||
<button style="width: 100%; padding: 0.8rem; background: var(--neon-blue); border: none; border-radius: 4px; font-weight: bold; cursor: pointer;">ESPORTA REPORT</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,102 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="it">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Mappa Stato - Evoluzione</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-container">
|
||||
<header class="main-header">
|
||||
<div class="logo">MP-SITE <span class="active">EVOLUTION</span></div>
|
||||
<nav>
|
||||
<a href="index.html" class="active">Mappa Stato</a>
|
||||
<a href="analisi.html">Analisi</a>
|
||||
<a href="sequencer.html">Sequencer</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="content">
|
||||
<div class="dashboard-grid">
|
||||
<!-- Macchina 01 -->
|
||||
<div class="machine-card status-production">
|
||||
<div class="card-header">
|
||||
<span class="machine-name">MACCHINA 01</span>
|
||||
<span class="badge">PROD</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="status-indicator">
|
||||
<i class="fa fa-bolt"></i>
|
||||
<span class="status-text">ATTIVA</span>
|
||||
</div>
|
||||
<div class="metrics">
|
||||
<div class="metric-item"><label>Velocità</label><div class="value">145 <small>u/min</small></div></div>
|
||||
<div class="metric-item"><label>Target</label><div class="value">150 <small>u/min</small></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">UPTIME: 12h 45m</div>
|
||||
</div>
|
||||
|
||||
<!-- Macchina 02 -->
|
||||
<div class="machine-card status-alarm">
|
||||
<div class="card-header">
|
||||
<span class="machine-name">MACCHINA 02</span>
|
||||
<span class="badge">ALLARME</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="status-indicator">
|
||||
<i class="fa fa-exclamation-triangle"></i>
|
||||
<span class="status-text">FERMO</span>
|
||||
</div>
|
||||
<div class="metrics">
|
||||
<div class="metric-item"><label>Motivo</label><div class="value">Guasto Sensore</div></div>
|
||||
<div class="metric-item"><label>Fermo</label><div class="value">04m 12s</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">ALLARMO ATTIVO</div>
|
||||
</div>
|
||||
|
||||
<!-- Macchina 03 -->
|
||||
<div class="machine-card status-setup">
|
||||
<div class="card-header">
|
||||
<span class="machine-name">MACCHINA 03</span>
|
||||
<span class="badge">SETUP</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="status-indicator">
|
||||
<i class="fa fa-tools"></i>
|
||||
<span class="status-text">PREPARAZIONE</span>
|
||||
</div>
|
||||
<div class="metrics">
|
||||
<div class="metric-item"><label>Progresso</label><div class="value">65%</div></div>
|
||||
<div class="metric-item"><label>Operatore</label><div class="value">ID:442</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">IN ATTESA</div>
|
||||
</div>
|
||||
|
||||
<!-- Macchina 04 -->
|
||||
<div class="machine-card status-offline">
|
||||
<div class="card-header">
|
||||
<span class="machine-name">MACCHINA 04</span>
|
||||
<span class="badge">OFFLINE</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="status-indicator">
|
||||
<i class="fa fa-power-off"></i>
|
||||
<span class="status-text">DISCONNESSA</span>
|
||||
</div>
|
||||
<div class="metrics">
|
||||
<div class="metric-item"><label>Ultimo Segnale</label><div class="value">02:14:05</div></div>
|
||||
<div class="metric-item"><label>Stato</label><div class="value">N/A</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">DISCONNESSA</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,90 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="it">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Sequencer - Evoluzione</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-container">
|
||||
<header class="main-header">
|
||||
<div class="logo">MP-SITE <span class="active">EVOLUTION</span></div>
|
||||
<nav>
|
||||
<a href="index.html">Mappa Stato</a>
|
||||
<a href="analisi.html">Analisi</a>
|
||||
<a href="sequencer.html" class="active">Sequencer</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main class="content">
|
||||
<div class="sidebar" style="margin-bottom: 2rem;">
|
||||
<h3 style="margin-bottom: 1rem; color: var(--neon-purple);">Controllo Sequenza</h3>
|
||||
<div style="display: flex; gap: 10px;">
|
||||
<button style="flex: 1; padding: 0.5rem; background: var(--neon-red); border: none; border-radius: 4px; font-weight: bold; cursor: pointer;">FORZA RELOAD</button>
|
||||
<select style="padding: 0.5rem; background: #222; color: white; border: 1px solid var(--border-color); border-radius: 4px;">
|
||||
<option>Ultimi 90 Giorni</option>
|
||||
<option>Ultimi 30 Giorni</option>
|
||||
<option>Ultimi 7 Giorni</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" style="background: var(--card-bg); border: 1px solid var(--border-color); border-radius: 12px; padding: 1.5rem;">
|
||||
<h3 style="margin-bottom: 1rem;">Timeline Transizione Stati</h3>
|
||||
<div class="timeline-container">
|
||||
<div class="timeline-bar">
|
||||
<div class="timeline-segment" style="width: 20%; background: var(--neon-green);"></div>
|
||||
<div class="timeline-segment" style="width: 40%; background: var(--neon-blue);"></div>
|
||||
<div class="timeline-segment" style="width: 30%; background: var(--neon-amber);"></div>
|
||||
<div class="timeline-segment" style="width: 10%; background: var(--neon-red);"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="sequencer-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Macchina</th>
|
||||
<th>Stato Attuale</th>
|
||||
<th>Stato Precedente</th>
|
||||
<th>Durata Transizione</th>
|
||||
<th>Evento</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>MACCHINA 01</td>
|
||||
<td><span style="color: var(--neon-green);">Produzione</span></td>
|
||||
<td>Setup</td>
|
||||
<td>00:45</td>
|
||||
<td>Cambio Stampo Completato</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MACCHINA 02</td>
|
||||
<td><span style="color: var(--neon-red);">Allarme</span></td>
|
||||
<td>Produzione</td>
|
||||
<td>00:02</td>
|
||||
<td>Guasto Critico Sensore Prossimità</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MACCHINA 03</td>
|
||||
<td><span style="color: var(--neon-amber);">Setup</span></td>
|
||||
<td>Offline</td>
|
||||
<td>00:12</td>
|
||||
<td>Avviamento Ciclo Manuale</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MACCHINA 04</td>
|
||||
<td><span style="color: #888;">Offline</span></td>
|
||||
<td>Setup</td>
|
||||
<td>--</td>
|
||||
<td>Spegnimento Totale</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,300 @@
|
||||
:root {
|
||||
--bg-color: #0d0d0d;
|
||||
--card-bg: #1a1a1a;
|
||||
--text-main: #e0e0e0;
|
||||
--text-dim: #a0a0a0;
|
||||
--neon-blue: #00f3ff;
|
||||
--neon-purple: #bc13fe;
|
||||
--neon-green: #39ff14;
|
||||
--neon-red: #ff003c;
|
||||
--neon-amber: #ffbf00;
|
||||
--border-color: #333;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-main);
|
||||
font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.app-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.main-header {
|
||||
padding: 1rem 2rem;
|
||||
background: rgba(26, 26, 26, 0.8);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
backdrop-filter: blur(10px);
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.logo span {
|
||||
color: var(--neon-blue);
|
||||
text-shadow: 0 0 10px var(--neon-blue);
|
||||
}
|
||||
|
||||
nav a {
|
||||
text-decoration: none;
|
||||
background: transparent;
|
||||
border: 1px solid var(--border-color);
|
||||
color: var(--text-main);
|
||||
padding: 0.5rem 1rem;
|
||||
margin-left: 10px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
nav a:hover, nav a.active {
|
||||
border-color: var(--neon-blue);
|
||||
background: rgba(0, 243, 255, 0.1);
|
||||
box-shadow: 0 0 10px rgba(0, 243, 255, 0.3);
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Dashboard Grid */
|
||||
.dashboard-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
gap: 2rem;
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
.machine-card {
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 12px;
|
||||
padding: 1.5rem;
|
||||
position: relative;
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.machine-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 10px 20px rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.card-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 1.5rem;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.machine-name {
|
||||
font-weight: bold;
|
||||
color: var(--text-main);
|
||||
}
|
||||
|
||||
.badge {
|
||||
font-size: 0.7rem;
|
||||
padding: 2px 8px;
|
||||
border-radius: 10px;
|
||||
border: 1px solid currentColor;
|
||||
}
|
||||
|
||||
.card-body {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.status-indicator {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.status-text {
|
||||
font-weight: bold;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.metrics {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.metric-item label {
|
||||
display: block;
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.metric-item .value {
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.metric-item small {
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-dim);
|
||||
margin-top: 1rem;
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
|
||||
/* Stati Specifici */
|
||||
.status-production {
|
||||
border: 1px solid var(--neon-green);
|
||||
box-shadow: inset 0 0 15px rgba(57, 255, 20, 0.05);
|
||||
}
|
||||
.status-production .status-text { color: var(--neon-green); }
|
||||
.status-production .badge { color: var(--neon-green); }
|
||||
|
||||
.status-alarm {
|
||||
border: 1px solid var(--neon-red);
|
||||
box-shadow: inset 0 0 15px rgba(255, 0, 60, 0.1);
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
@keyframes pulse {
|
||||
0% { border-color: var(--neon-red); }
|
||||
50% { border-color: #ff6666; }
|
||||
100% { border-color: var(--neon-red); }
|
||||
}
|
||||
.status-alarm .status-text { color: var(--neon-red); }
|
||||
.status-alarm .badge { color: var(--neon-red); }
|
||||
|
||||
.status-setup {
|
||||
border: 1px solid var(--neon-amber);
|
||||
}
|
||||
.status-setup .status-text { color: var(--neon-amber); }
|
||||
.status-setup .badge { color: var(--neon-amber); }
|
||||
|
||||
.status-offline {
|
||||
border: 1px solid #444;
|
||||
opacity: 0.8;
|
||||
}
|
||||
.status-offline .status-text { color: #888; }
|
||||
.status-offline .badge { color: #888; }
|
||||
|
||||
/* Analytics & Sequencer Styles */
|
||||
.sidebar {
|
||||
width: 260px;
|
||||
background: rgba(30, 30, 30, 0.9);
|
||||
border: 1px solid var(--border-color);
|
||||
padding: 1.5rem;
|
||||
border-radius: 12px;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
.kpi-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.kpi-card {
|
||||
padding: 1.5rem;
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 12px;
|
||||
border-left: 4px solid var(--neon-blue);
|
||||
}
|
||||
|
||||
.kpi-card.green { border-left-color: var(--neon-green); }
|
||||
.kpi-card.red { border-left-color: var(--neon-red); }
|
||||
|
||||
.kpi-card h4 {
|
||||
color: var(--text-dim);
|
||||
font-size: 0.8rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.kpi-card .val {
|
||||
font-size: 2rem;
|
||||
font-weight: bold;
|
||||
color: var(--text-main);
|
||||
}
|
||||
|
||||
.sequencer-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.sequencer-table th {
|
||||
text-align: left;
|
||||
padding: 1rem;
|
||||
border-bottom: 2px solid var(--border-color);
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.sequencer-table td {
|
||||
padding: 1rem;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.timeline-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.timeline-bar {
|
||||
height: 30px;
|
||||
background: #222;
|
||||
border-radius: 4px;
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.timeline-segment {
|
||||
height: 100%;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.chart-placeholder {
|
||||
height: 400px;
|
||||
border: 2px dashed var(--border-color);
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 2rem;
|
||||
background: rgba(255,255,255,0.02);
|
||||
}
|
||||
|
||||
.neon-line-mock {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent 0%, rgba(0, 243, 255, 0.1) 50%, transparent 100%);
|
||||
clip-path: polygon(0% 100%, 20% 80%, 40% 90%, 60% 40%, 80% 50%, 100% 0%);
|
||||
opacity: 0.3;
|
||||
}
|
||||
Reference in New Issue
Block a user