Fix configurazione IOB x file log da nome file (NON IOB gestito)
This commit is contained in:
@@ -1063,7 +1063,7 @@ namespace IOB_UT_NEXT.Config
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgDebug(string txt2log)
|
||||
{
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.CodIOB;
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.FilenameIOB;
|
||||
Log.Debug(txt2log);
|
||||
}
|
||||
|
||||
@@ -1075,7 +1075,7 @@ namespace IOB_UT_NEXT.Config
|
||||
{
|
||||
if (!string.IsNullOrEmpty(txt2log))
|
||||
{
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.CodIOB;
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.FilenameIOB;
|
||||
Log.Error(txt2log);
|
||||
}
|
||||
}
|
||||
@@ -1086,7 +1086,7 @@ namespace IOB_UT_NEXT.Config
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgInfo(string txt2log)
|
||||
{
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.CodIOB;
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.FilenameIOB;
|
||||
Log.Info(txt2log);
|
||||
}
|
||||
|
||||
@@ -1096,7 +1096,7 @@ namespace IOB_UT_NEXT.Config
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgTrace(string txt2log)
|
||||
{
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.CodIOB;
|
||||
Log.Factory.Configuration.Variables["codIOB"] = General.FilenameIOB;
|
||||
Log.Trace(txt2log);
|
||||
}
|
||||
|
||||
|
||||
@@ -1111,7 +1111,7 @@ namespace IOB_WIN_FORM
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgDebug(string txt2log)
|
||||
{
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;//IOBConfFull.General.FilenameIOB ??this.CurrIOB;
|
||||
lg.Debug(txt2log);
|
||||
// salvo anche in logwatcher...
|
||||
newDisplayData currDispData = new newDisplayData();
|
||||
@@ -1127,7 +1127,7 @@ namespace IOB_WIN_FORM
|
||||
{
|
||||
if (!string.IsNullOrEmpty(txt2log))
|
||||
{
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;//IOBConfFull.General.FilenameIOB ??this.CurrIOB;
|
||||
lg.Error(txt2log);
|
||||
// salvo anche in logwatcher... SE non si dimostra ricorsivo...
|
||||
if (!txt2log.Contains("logWatcher"))
|
||||
@@ -1145,7 +1145,7 @@ namespace IOB_WIN_FORM
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgInfo(string txt2log)
|
||||
{
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;//IOBConfFull.General.FilenameIOB ??this.CurrIOB;
|
||||
lg.Info(txt2log);
|
||||
// salvo anche in logwatcher...
|
||||
newDisplayData currDispData = new newDisplayData();
|
||||
@@ -1159,7 +1159,7 @@ namespace IOB_WIN_FORM
|
||||
/// <param name="txt2log"></param>
|
||||
protected void lgTrace(string txt2log)
|
||||
{
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;
|
||||
lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB;//IOBConfFull.General.FilenameIOB ??this.CurrIOB;
|
||||
lg.Trace(txt2log);
|
||||
// salvo anche in logwatcher...
|
||||
newDisplayData currDispData = new newDisplayData();
|
||||
@@ -1774,11 +1774,10 @@ namespace IOB_WIN_FORM
|
||||
Dictionary<string, string> setPar = new Dictionary<string, string>();
|
||||
setPar.Add("IP", iobObj.IOBConfFull.Device.Connect.IpAddr);
|
||||
setPar.Add("PORT", iobObj.IOBConfFull.Device.Connect.Port);
|
||||
string note = $"{iobObj.IOBConfFull.General.CodIOB} | DT ultimo avvio: {iobObj.dtAvvioAdp}";
|
||||
string note = $"{iobObj.IOBConfFull.General.FilenameIOB} | DT ultimo avvio: {iobObj.dtAvvioAdp}";
|
||||
// verifico IOB status
|
||||
IobWinStatus currIobStatus = new IobWinStatus()
|
||||
{
|
||||
//CodIob = iobObj.cIobConf.filenameIOB,
|
||||
CodIob = iobObj.IOBConfFull.General.FilenameIOB,
|
||||
IobType = $"{iobObj.IOBConfFull.General.IobType}",//iobObj.cIobConf.tipoIob.ToString(),
|
||||
queueAlLen = alQueueLen,
|
||||
|
||||
@@ -445,7 +445,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
get
|
||||
{
|
||||
List<GenLogRow> answ = new List<GenLogRow>();
|
||||
string redKeyFLog = redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:LogFile:FluxLog");
|
||||
string redKeyFLog = redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:LogFile:FluxLog");
|
||||
var rawData = redisMan.getRSV(redKeyFLog);
|
||||
if (!string.IsNullOrEmpty(rawData))
|
||||
{
|
||||
@@ -455,7 +455,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
}
|
||||
set
|
||||
{
|
||||
string redKeyFLog = redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:LogFile:FluxLog");
|
||||
string redKeyFLog = redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:LogFile:FluxLog");
|
||||
string fluxLogRaw = JsonConvert.SerializeObject(value);
|
||||
redisMan.setRSV(redKeyFLog, fluxLogRaw);
|
||||
}
|
||||
@@ -594,7 +594,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
protected Dictionary<string, string> OptVar2TranslInt { get; set; } = new Dictionary<string, string>();
|
||||
|
||||
/// <summary>
|
||||
/// Elenco dei path utili x processing
|
||||
/// Elenco dei fullPath utili x processing
|
||||
/// </summary>
|
||||
protected Dictionary<string, string> pathList { get; set; } = new Dictionary<string, string>();
|
||||
|
||||
@@ -606,7 +606,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
get
|
||||
{
|
||||
Dictionary<int, PODLModel> answ = new Dictionary<int, PODLModel>();
|
||||
string redKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:POdlSent");
|
||||
string redKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:POdlSent");
|
||||
string rawData = redisMan.getRSV(redKey);
|
||||
if (!string.IsNullOrEmpty(rawData))
|
||||
{
|
||||
@@ -625,7 +625,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
set
|
||||
{
|
||||
string rawVal = JsonConvert.SerializeObject(value);
|
||||
string redKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:POdlSent");
|
||||
string redKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:POdlSent");
|
||||
redisMan.setRSV(redKey, rawVal);
|
||||
lgDebug($"Salvataggio status POdlSentFileArch | {value.Count} record");
|
||||
}
|
||||
@@ -678,22 +678,22 @@ namespace IOB_WIN_FORM.Iob
|
||||
|
||||
protected string redKeyLogfileAct
|
||||
{
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:LogFile:Act");
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:LogFile:Act");
|
||||
}
|
||||
|
||||
protected string redKeyLogfileLast
|
||||
{
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:LogFile:Last");
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:LogFile:Last");
|
||||
}
|
||||
|
||||
protected string redKeyProdLastArt
|
||||
{
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:prodDecod:lastArtDesc");
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:prodDecod:lastArtDesc");
|
||||
}
|
||||
|
||||
protected string redKeyProdRunState
|
||||
{
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.CodIOB}:prodDecod:isRunningState");
|
||||
get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:prodDecod:isRunningState");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -701,7 +701,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
/// </summary>
|
||||
protected string rKeyFluxMem
|
||||
{
|
||||
get => redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:FluxMem");
|
||||
get => redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:FluxMem");
|
||||
}
|
||||
|
||||
protected Random rndGen { get; set; } = new Random();
|
||||
@@ -1684,7 +1684,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
// se inviato --> salvo stato da current...
|
||||
item.updStatusVal(i, (uint)(item.alarmsMask[i] & currStatus));
|
||||
// salvo in redis...
|
||||
string alarmHash = redisMan.redHash($"IOB:ALARM_STATUS:{IOBConfFull.General.CodIOB}:{item.memAddr}");
|
||||
string alarmHash = redisMan.redHash($"IOB:ALARM_STATUS:{IOBConfFull.General.FilenameIOB}:{item.memAddr}");
|
||||
string rawAlarms = JsonConvert.SerializeObject(item.alarmsState);
|
||||
redisMan.setRSV(alarmHash, rawAlarms);
|
||||
}
|
||||
@@ -2358,8 +2358,8 @@ namespace IOB_WIN_FORM.Iob
|
||||
// test file import da conf... se hasRecipe=true --> modalità Tenditalia/FIMAT...
|
||||
if (hasRecipe)
|
||||
{
|
||||
string archBasePath = Path.Combine(pathList["path-locBase"], pathList["path-03-Recv"]);
|
||||
string reportBasePath = pathList["path-outReport"];
|
||||
string archBasePath = Path.Combine(pathList["fullPath-locBase"], pathList["fullPath-03-Recv"]);
|
||||
string reportBasePath = pathList["fullPath-outReport"];
|
||||
baseUtils.checkDir(reportBasePath);
|
||||
// verifico x cosa è stato richiesto attività (che esista la folder...)
|
||||
string folderPath = Path.Combine(archBasePath, keyReq);
|
||||
@@ -2416,8 +2416,8 @@ namespace IOB_WIN_FORM.Iob
|
||||
if (hasRecipe)
|
||||
{
|
||||
// recupera i NUOVI file e li sposta in folder locale temp
|
||||
string remoPath = Path.Combine(pathList["path-locBase"], pathList["path-05-remExe"]);
|
||||
string archBasePath = Path.Combine(pathList["path-locBase"], pathList["path-03-Recv"]);
|
||||
string remoPath = Path.Combine(pathList["fullPath-locBase"], pathList["fullPath-05-remExe"]);
|
||||
string archBasePath = Path.Combine(pathList["fullPath-locBase"], pathList["fullPath-03-Recv"]);
|
||||
string tempPath = Path.Combine(archBasePath, "TEMP");
|
||||
baseUtils.checkDir(tempPath);
|
||||
bool okRetrieve = RecipeTaskDoneRetrieve(remoPath, tempPath);
|
||||
@@ -2589,7 +2589,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
redHashWeek.Add(cWeek, rawWeek);
|
||||
}
|
||||
// salvo in redis...
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:WeekStats");
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:WeekStats");
|
||||
var okHashDict = redisMan.redSaveHashDict(fullKey, redHashWeek);
|
||||
|
||||
// invio ANCHE in MP-IO l'update delle info...
|
||||
@@ -2618,7 +2618,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
// verifico se ci sia la settimana indicata in elenco...
|
||||
string currWeek = $"{adesso:yyyy}-{week:00}";
|
||||
// recupero elenco delle settimane da processare da redis/WeekStats
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:WeekStats");
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:WeekStats");
|
||||
Dictionary<string, string> currStats = redisMan.redGetHashDict(fullKey);
|
||||
if (currStats != null && currStats.Count > 0)
|
||||
{
|
||||
@@ -2646,10 +2646,10 @@ namespace IOB_WIN_FORM.Iob
|
||||
DateTime asdesso = DateTime.Now;
|
||||
try
|
||||
{
|
||||
string recLocalArchPath = Path.Combine(pathList["path-locBase"], pathList["path-00-Arch"]);
|
||||
string recRemArchPath = pathList["path-06-remRec"];
|
||||
string recLocalArchPath = Path.Combine(pathList["fullPath-locBase"], pathList["fullPath-00-Arch"]);
|
||||
string recRemArchPath = pathList["fullPath-06-remRec"];
|
||||
// leggo da redis (se disponibile) elenco hast file/MD5....
|
||||
string fullKey = redisMan.redHash($"IOB:Remote:{IOBConfFull.General.CodIOB}:FileCheck");
|
||||
string fullKey = redisMan.redHash($"IOB:Remote:{IOBConfFull.General.FilenameIOB}:FileCheck");
|
||||
Dictionary<string, string> dictRecMd5 = redisMan.redGetHashDict(fullKey);
|
||||
// leggo la directory remota...
|
||||
var remoteList = Directory.GetFiles(recRemArchPath);
|
||||
@@ -2822,7 +2822,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prepara le ricette dato path temp scaricando elenco PODL
|
||||
/// Prepara le ricette dato fullPath temp scaricando elenco PODL
|
||||
/// </summary>
|
||||
/// <param name="tempPath">
|
||||
/// Percorso temp di appoggio x preparare ricette (compreso nome macchina)
|
||||
@@ -2868,8 +2868,8 @@ namespace IOB_WIN_FORM.Iob
|
||||
string recFilePath = "";
|
||||
try
|
||||
{
|
||||
// calcolo path ricetta...
|
||||
recFilePath = Path.Combine(pathList["path-locBase"], pathList["path-00-Arch"], actPodlReq.Recipe);
|
||||
// calcolo fullPath ricetta...
|
||||
recFilePath = Path.Combine(pathList["fullPath-locBase"], pathList["fullPath-00-Arch"], actPodlReq.Recipe);
|
||||
// preparo file ricetta x PODL
|
||||
bool fileOk = RecipePrepare(tempPath, recFilePath, actPodlReq);
|
||||
if (fileOk)
|
||||
@@ -3081,7 +3081,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
if (IOBConfFull != null)
|
||||
{
|
||||
// creo obj dati necessari...
|
||||
currDict.Add("IobName", IOBConfFull.General.CodIOB);
|
||||
currDict.Add("IobName", IOBConfFull.General.FilenameIOB);
|
||||
currDict.Add("IobType", $"{IOBConfFull.General.IobType}");
|
||||
currDict.Add("MachIp", IOBConfFull.Device.Connect.IpAddr);
|
||||
currDict.Add("MachPort", IOBConfFull.Device.Connect.Port);
|
||||
@@ -3201,7 +3201,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
{
|
||||
item.setupData();
|
||||
// se ho in redis una tab di allarmi precedenti la carico...
|
||||
string alarmHash = redisMan.redHash($"IOB:ALARM_STATUS:{IOBConfFull.General.CodIOB}:{item.memAddr}");
|
||||
string alarmHash = redisMan.redHash($"IOB:ALARM_STATUS:{IOBConfFull.General.FilenameIOB}:{item.memAddr}");
|
||||
string rawVal = redisMan.getRSV(alarmHash);
|
||||
if (!string.IsNullOrEmpty(rawVal))
|
||||
{
|
||||
@@ -3484,7 +3484,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
else
|
||||
{
|
||||
// recupero le folder specifiche x IN/OUT ricette filtrando direttamente l'area di memoria...
|
||||
sCond = "path";
|
||||
sCond = "fullPath";
|
||||
var dirList = memMap.OptKVP
|
||||
.Where(x => x.Key.StartsWith(sCond))
|
||||
.ToList();
|
||||
@@ -3970,7 +3970,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// URL come urlCommand + aggiunta codice IOB da file (= specifico x Reboot)da cui viene inviato
|
||||
/// URL come urlCommand + aggiunta codice IOB da file (= specifico x Reboot) da cui viene inviato
|
||||
/// </summary>
|
||||
protected string urlCommandIobFile(string cmqReq)
|
||||
{
|
||||
@@ -4184,7 +4184,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
/// </summary>
|
||||
private string rKeyCurrProdData
|
||||
{
|
||||
get => redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:CurrProdData");
|
||||
get => redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:CurrProdData");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -4365,18 +4365,20 @@ namespace IOB_WIN_FORM.Iob
|
||||
/// </summary>
|
||||
private void checkShrinkDir()
|
||||
{
|
||||
// comprimo x prima cosa la folder dell'IOB corrente
|
||||
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", IOBConfFull.General.CodIOB);
|
||||
try
|
||||
// comprimo x prima cosa la folder dell'IOB corrente... testo sia IOBConf che FilenameIOB
|
||||
List<string> path2chk = new List<string>() { IOBConfFull.General.CodIOB, IOBConfFull.General.FilenameIOB, "MAIN" };
|
||||
string fullPath = "";
|
||||
foreach (var item in path2chk)
|
||||
{
|
||||
baseUtils.shrinkDir(path);
|
||||
// provo a comprimere anche la folder MAIN....
|
||||
path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", "MAIN");
|
||||
baseUtils.shrinkDir(path);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lgError($"Eccezione in checkShrinkDir{Environment.NewLine}{exc}");
|
||||
fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs", item);
|
||||
try
|
||||
{
|
||||
baseUtils.shrinkDir(fullPath);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lgError($"Eccezione in checkShrinkDir{Environment.NewLine}{exc}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4636,10 +4638,10 @@ namespace IOB_WIN_FORM.Iob
|
||||
// se scaduto tempo da ultimo invio... e ho valori
|
||||
if (currWritePar.Count > 0 && (lastWriteParamsUpsert.AddMinutes(vetoSendWriteUpsert) < adesso))
|
||||
{
|
||||
lastWriteParamsUpsert = adesso;
|
||||
// invio su cloud parametri!
|
||||
utils.callUrl($"{urlUpdateWriteParams}", JsonConvert.SerializeObject(currWritePar));
|
||||
var res = utils.callUrl($"{urlUpdateWriteParams}", JsonConvert.SerializeObject(currWritePar));
|
||||
lgInfo($"Reinviato a server stato {updatedPar.Count} parametri WRITE");
|
||||
lastWriteParamsUpsert = adesso;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4745,7 +4747,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
List<ConsRec> ListConsDet = new List<ConsRec>();
|
||||
List<ConsOut> ListConsSum = new List<ConsOut>();
|
||||
// file conf x conversioni...
|
||||
string confSetupPath = pathList["path-confSetup"];
|
||||
string confSetupPath = pathList["fullPath-confSetup"];
|
||||
ConvSetup currConf = new ConvSetup();
|
||||
bool addHeader = false;
|
||||
int numDec = 4;
|
||||
@@ -4898,7 +4900,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
/// <param name="keyReq"></param>
|
||||
private void RecipeRemoveWeekStatus(string keyReq)
|
||||
{
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.CodIOB}:WeekStats");
|
||||
string fullKey = redisMan.redHash($"IOB:Status:{IOBConfFull.General.FilenameIOB}:WeekStats");
|
||||
var okHashDict = redisMan.redRemoveHashField(fullKey, keyReq);
|
||||
// rileggo status hash
|
||||
Dictionary<string, string> currDict = redisMan.redGetHashDict(fullKey);
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
parentForm = caller;
|
||||
|
||||
// imposto le code!
|
||||
QueueIN = new DataQueue(IOBConfFull.General.CodIOB, "QueueIN", IOBConfFull.General.EnabRedisQue);
|
||||
QueueIN = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueIN", IOBConfFull.General.EnabRedisQue);
|
||||
|
||||
lastConnectTry = DateTime.Now;
|
||||
|
||||
@@ -1815,7 +1815,7 @@ namespace IOB_WIN_FORM.Iob
|
||||
foreach (TimeRec item in TimingData.results)
|
||||
{
|
||||
// loggo SOLO se del mio IOB corrente...
|
||||
if (item.classCall == IOBConfFull.General.CodIOB)
|
||||
if (item.classCall == IOBConfFull.General.FilenameIOB)
|
||||
{
|
||||
lgInfo("{4}|Chiamate {0}: effettuate {1}, tempo medio {2:N2} msec | impegno canale {3:P3}", item.codCall, item.numCall, item.avgMsec, item.totMsec.TotalSeconds / DateTime.Now.Subtract(dtAvvioAdp).TotalSeconds, IOBConfFull.General.CodIOB);
|
||||
globNumCall += item.numCall;
|
||||
|
||||
Reference in New Issue
Block a user