modifica call checkCambbiaStato in ASYNC
This commit is contained in:
@@ -364,6 +364,40 @@ namespace MP.Data.Controllers
|
||||
return fatto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inserimento record in DDB
|
||||
/// </summary>
|
||||
/// <param name="idxMacchina"></param>
|
||||
/// <param name="inizioStato"></param>
|
||||
/// <param name="idxStato"></param>
|
||||
/// <param name="codArt"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="matrOpr"></param>
|
||||
/// <param name="pallet"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> DDB_InsStatoBatchAsync(string idxMacchina, DateTime inizioStato, int idxStato, string codArt, string value, int matrOpr, string pallet)
|
||||
{
|
||||
bool fatto = false;
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
|
||||
var InizioStato = new SqlParameter("@InizioStato", inizioStato);
|
||||
var IdxStato = new SqlParameter("@IdxStato", idxStato);
|
||||
var CodArticolo = new SqlParameter("@codArticolo", codArt);
|
||||
var Value = new SqlParameter("@Value", value);
|
||||
var MatrOpr = new SqlParameter("@MatrOpr", matrOpr);
|
||||
var Pallet = new SqlParameter("@pallet", pallet);
|
||||
|
||||
var result = await dbCtx
|
||||
.Database
|
||||
.ExecuteSqlRawAsync("exec dbo.stp_DDB_InsStatoBatch @IdxMacchina, @InizioStato, @IdxStato, @codArticolo, @Value, @MatrOpr, @pallet", IdxMacchina, InizioStato, IdxStato, CodArticolo, Value, MatrOpr, Pallet);
|
||||
|
||||
// indico eseguito!
|
||||
fatto = result > 0;
|
||||
}
|
||||
return fatto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco tabella decodifica articoli / codice decimale
|
||||
/// </summary>
|
||||
@@ -1227,6 +1261,37 @@ namespace MP.Data.Controllers
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco ODL data macchina e periodo
|
||||
/// </summary>
|
||||
/// <param name="idxMacchina"></param>
|
||||
/// <param name="dtStart"></param>
|
||||
/// <param name="dtEnd"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ODLExpModel>> OdlListByMaccPeriodoAsync(string idxMacchina, DateTime dtStart, DateTime dtEnd)
|
||||
{
|
||||
List<ODLExpModel> dbResult = new List<ODLExpModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
try
|
||||
{
|
||||
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
|
||||
var DataFrom = new SqlParameter("@dataFrom", dtStart);
|
||||
var DataTo = new SqlParameter("@dataTo", dtEnd);
|
||||
dbResult = await dbCtx
|
||||
.DbSetODLExp
|
||||
.FromSqlRaw("EXEC stp_ODL_getByMacchinaPeriodo @IdxMacchina, @dataFrom, @dataTo", IdxMacchina, DataFrom, DataTo)
|
||||
.AsNoTracking()
|
||||
.ToListAsync();
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Eccezione durante OdlListByMaccPeriodoAsync{Environment.NewLine}{exc}");
|
||||
}
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Conteggio PzProd Macchina
|
||||
/// </summary>
|
||||
@@ -1634,6 +1699,26 @@ namespace MP.Data.Controllers
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
/// <summary>
|
||||
/// Tabella state machine eventi 2 stati data macchina e tipo evento
|
||||
/// </summary>
|
||||
/// <param name="idxTipo"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<TransizioneStatiModel>> SMES_getHwTransitionsAsync(string idxMacchina, int idxTipo)
|
||||
{
|
||||
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
|
||||
var IdxTipo = new SqlParameter("@IdxTipo", idxTipo);
|
||||
dbResult = await dbCtx
|
||||
.DbSetSMES
|
||||
.FromSqlRaw("exec dbo.stp_TS_getByIdxMacchIdxTipoEv @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo)
|
||||
.AsNoTracking()
|
||||
.ToListAsync();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tabella state machine eventi 2 stati data macchina e tipo evento
|
||||
@@ -1657,6 +1742,28 @@ namespace MP.Data.Controllers
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tabella state machine eventi 2 stati data macchina e tipo evento
|
||||
/// </summary>
|
||||
/// <param name="idxTipo"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<TransizioneStatiModel>> SMES_getUserForcedAsync(string idxMacchina, int idxTipo)
|
||||
{
|
||||
List<TransizioneStatiModel> dbResult = new List<TransizioneStatiModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
|
||||
var IdxTipo = new SqlParameter("@IdxTipo", idxTipo);
|
||||
dbResult = await dbCtx
|
||||
.DbSetSMES
|
||||
.FromSqlRaw("exec dbo.stp_TS_getUserForcedTrans @IdxMacchina, @IdxTipo", IdxMacchina, IdxTipo)
|
||||
.AsNoTracking()
|
||||
//.AsEnumerable()
|
||||
.ToListAsync();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Intera tabella state machine ingressi 2 eventi
|
||||
/// </summary>
|
||||
|
||||
+23
-108
@@ -1882,7 +1882,7 @@ namespace MP.IOC.Data
|
||||
result = await IocDbController.Macchine2SlaveAsync();
|
||||
// serializzo e salvo...
|
||||
rawData = JsonConvert.SerializeObject(result);
|
||||
await redisDb.StringSetAsync(currKey, rawData, getRandTOut(redisLongTimeCache));
|
||||
await redisDb.StringSetAsync(currKey, rawData, getRandTOut(redisLongTimeCache * 10));
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
@@ -2291,7 +2291,7 @@ namespace MP.IOC.Data
|
||||
// se è vuoto... leggo da DB e popolo!
|
||||
if (answ.Count == 0)
|
||||
{
|
||||
answ = ResetDatiMacchina(idxMacchina);
|
||||
answ = await ResetDatiMacchinaAsync(idxMacchina);
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
@@ -3828,7 +3828,7 @@ namespace MP.IOC.Data
|
||||
/// <param name="dtEve">DataOra evento</param>
|
||||
/// <param name="dtCurr">DataOra corrente</param>
|
||||
/// <returns></returns>
|
||||
public string saveCaricoPezzi(string idxMacchina, string qty, string dtEve = "", string dtCurr = "")
|
||||
public async Task<string> SaveCaricoPezziAsync(string idxMacchina, string qty, string dtEve = "", string dtCurr = "")
|
||||
{
|
||||
// default: 0, non registrato x cautela...
|
||||
string answ = "0";
|
||||
@@ -3848,7 +3848,7 @@ namespace MP.IOC.Data
|
||||
// se il conteggio è >= 0 SALVO evento...
|
||||
if (numPzIncr >= 0)
|
||||
{
|
||||
var listOdl = IocDbController.OdlListByMaccPeriodo(idxMacchina, dtEvent, dtEvent.AddSeconds(1));
|
||||
var listOdl = await IocDbController.OdlListByMaccPeriodoAsync(idxMacchina, dtEvent, dtEvent.AddSeconds(1));
|
||||
if (listOdl != null && listOdl.Count > 0)
|
||||
{
|
||||
string codArticolo = listOdl.FirstOrDefault()?.CodArticolo ?? "ND";
|
||||
@@ -3866,7 +3866,7 @@ namespace MP.IOC.Data
|
||||
Value = qty
|
||||
};
|
||||
// salva e processa
|
||||
var resp = scriviRigaEvento(newRecEv);
|
||||
var resp = await scriviRigaEventoAsync(newRecEv);
|
||||
// registro in risposta che è andato tutto bene... ovvero la qty richiesta...
|
||||
answ = qty;
|
||||
}
|
||||
@@ -4526,7 +4526,7 @@ namespace MP.IOC.Data
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// verifica se sia necessario inserire un cambio di stato impianto (DiarioDi Bordo) in modalità batch
|
||||
/// Verifica se sia necessario inserire un cambio di stato impianto (DiarioDi Bordo) in modalità batch
|
||||
/// </summary>
|
||||
/// <param name="tipoInput"></param>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
@@ -4536,7 +4536,7 @@ namespace MP.IOC.Data
|
||||
/// <param name="Value"></param>
|
||||
/// <param name="MatrOpr"></param>
|
||||
/// <param name="pallet"></param>
|
||||
private void checkCambiaStatoBatch(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
|
||||
private async Task CheckCambiaStatoBatchAsync(tipoInputEvento tipoInput, string IdxMacchina, DateTime InizioStato, int IdxTipo, string CodArt, string Value, int MatrOpr, string pallet)
|
||||
{
|
||||
//DS_applicazione.TransizioneStatiDataTable tabTransStati;
|
||||
//DS_applicazione.TransizioneStatiRow rigaTransStati;
|
||||
@@ -4546,7 +4546,7 @@ namespace MP.IOC.Data
|
||||
{
|
||||
case tipoInputEvento.barcode:
|
||||
// effettuo cambio stato INDIPENDENTEMENTE da stato precedente
|
||||
listTransit = IocDbController.SMES_getUserForced(IdxMacchina, IdxTipo);
|
||||
listTransit = await IocDbController.SMES_getUserForcedAsync(IdxMacchina, IdxTipo);
|
||||
|
||||
if (listTransit.Count > 0)
|
||||
{
|
||||
@@ -4554,9 +4554,9 @@ namespace MP.IOC.Data
|
||||
// solo se cambia stato...
|
||||
if (rigaTrans != null && rigaTrans.IdxStato != rigaTrans.next_IdxStato)
|
||||
{
|
||||
IocDbController.DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
|
||||
await IocDbController.DDB_InsStatoBatchAsync(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
|
||||
// aggiorno MSE
|
||||
IocDbController.RecalcMse(IdxMacchina, 0);
|
||||
await IocDbController.RecalcMseAsync(IdxMacchina, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -4567,22 +4567,24 @@ namespace MP.IOC.Data
|
||||
|
||||
case tipoInputEvento.hw:
|
||||
// verifico se ci sia necessità di cambio stato
|
||||
listTransit = IocDbController.SMES_getHwTransitions(IdxMacchina, IdxTipo);
|
||||
listTransit = await IocDbController.SMES_getHwTransitionsAsync(IdxMacchina, IdxTipo);
|
||||
if (listTransit.Count > 0)
|
||||
{
|
||||
rigaTrans = listTransit.FirstOrDefault();
|
||||
if (rigaTrans != null && rigaTrans.IdxStato != rigaTrans.next_IdxStato)
|
||||
{
|
||||
IocDbController.DDB_InsStatoBatch(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
|
||||
await IocDbController.DDB_InsStatoBatchAsync(IdxMacchina, InizioStato, rigaTrans.next_IdxStato, CodArt, Value, MatrOpr, pallet);
|
||||
// aggiorno MSE
|
||||
IocDbController.RecalcMse(IdxMacchina, 0);
|
||||
await IocDbController.RecalcMseAsync(IdxMacchina, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Debug($"Non trovata riga per: HW | IdxMacchina: {IdxMacchina} | IdxTipo: {IdxTipo} | CodArt: {CodArt} | Value: {Value} | MatrOpr: {MatrOpr} | pallet: {pallet}");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -4712,25 +4714,6 @@ namespace MP.IOC.Data
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce il valore booleano se la macchina sia di tipo MULTI (con più state machine x INGRESSI)
|
||||
/// </summary>
|
||||
/// <param name="idxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
private bool isMulti(string idxMacchina)
|
||||
{
|
||||
bool answ = false;
|
||||
try
|
||||
{
|
||||
answ = Convert.ToBoolean(mDatiMacchinaVal(idxMacchina, "Multi") == "1");
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Eccezione in isMulti{Environment.NewLine}{exc}");
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce il valore booleano se la macchina sia di tipo MULTI (con più state machine x INGRESSI)
|
||||
/// usando dati macchina in cache per evitare lookup ridondanti
|
||||
@@ -4767,54 +4750,6 @@ namespace MP.IOC.Data
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calcola l'effettivo valore da passare alla macchina a stati INGRESSI data conf Macchine2FamigliaIngressi
|
||||
/// </summary>
|
||||
/// <param name="idxMacchina"></param>
|
||||
/// <param name="valore"></param>
|
||||
/// <returns></returns>
|
||||
private string preProcInput(string idxMacchina, string valore)
|
||||
{
|
||||
string newVal = "";
|
||||
try
|
||||
{
|
||||
// variabili
|
||||
int valINT = 0;
|
||||
int BitFilt = 0;
|
||||
int BSR = 0;
|
||||
bool ExplodeBit = false;
|
||||
int NumBit = 0;
|
||||
int newValInt = 0;
|
||||
// recupero parametri...
|
||||
int.TryParse(mDatiMacchinaVal(idxMacchina, "BitFilt"), out BitFilt);
|
||||
int.TryParse(mDatiMacchinaVal(idxMacchina, "BSR"), out BSR);
|
||||
Boolean.TryParse(mDatiMacchinaVal(idxMacchina, "ExplodeBit"), out ExplodeBit);
|
||||
int.TryParse(mDatiMacchinaVal(idxMacchina, "NumBit"), out NumBit); // non usato (x ora)
|
||||
// recupero valore
|
||||
valINT = int.Parse(valore, NumberStyles.HexNumber);
|
||||
// filtro
|
||||
newValInt = MP.Core.Utils.bMaskInt(valINT, BitFilt);
|
||||
// effettuo eventuale BitShiftRight
|
||||
if (BSR > 0)
|
||||
{
|
||||
newValInt = newValInt >> BSR;
|
||||
}
|
||||
// effettuo eventuale esplosione in BIT esclusivi
|
||||
if (ExplodeBit)
|
||||
{
|
||||
newValInt = Convert.ToInt32(1 << newValInt);
|
||||
}
|
||||
// riconverto a STRING HEX!!!
|
||||
newVal = newValInt.ToString("X");
|
||||
}
|
||||
catch
|
||||
{
|
||||
newVal = valore;
|
||||
}
|
||||
|
||||
return newVal;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calcola l'effettivo valore da passare alla macchina a stati INGRESSI usando dati macchina in cache
|
||||
/// </summary>
|
||||
@@ -4927,7 +4862,7 @@ namespace MP.IOC.Data
|
||||
result.Add("Slave", isSlave);
|
||||
|
||||
// durata cache in secondi dal valore insEnabled...
|
||||
double numSecCache = 60 * ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache / 4 : redisShortTimeCache);
|
||||
double numSecCache = ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
|
||||
// ...e salvo...
|
||||
RedisSetHashDict(currHash, result, numSecCache);
|
||||
|
||||
@@ -4993,7 +4928,7 @@ namespace MP.IOC.Data
|
||||
result.Add("Slave", isSlave);
|
||||
|
||||
// durata cache in secondi dal valore insEnabled...
|
||||
double numSecCache = 60 * ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
|
||||
double numSecCache = ((result["insEnabled"].ToLower() == "true") ? redisShortTimeCache : redisLongTimeCache);
|
||||
// ...e salvo...
|
||||
await RedisSetHashDictAsync(currHash, result, numSecCache);
|
||||
|
||||
@@ -5077,6 +5012,7 @@ namespace MP.IOC.Data
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Scrive una riga di evento nel db + check cambio stato DiarioDiBordo
|
||||
/// </summary>
|
||||
@@ -5090,7 +5026,7 @@ namespace MP.IOC.Data
|
||||
// inserisco evento
|
||||
inserito = IocDbController.EvListInsert(newRec);
|
||||
// faccio controllo per eventuale cambio stato da tab transizioni...
|
||||
checkCambiaStatoBatch(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
CheckCambiaStatoBatchAsync(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
@@ -5101,7 +5037,8 @@ namespace MP.IOC.Data
|
||||
answ.outValue = inserito.ToString();
|
||||
answ.needStatusRefresh = true;
|
||||
return answ;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Scrive una riga di evento nel db + check cambio stato DiarioDiBordo
|
||||
@@ -5116,7 +5053,7 @@ namespace MP.IOC.Data
|
||||
// inserisco evento
|
||||
inserito = await IocDbController.EvListInsertAsync(newRec);
|
||||
// faccio controllo per eventuale cambio stato da tab transizioni...
|
||||
checkCambiaStatoBatch(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
await CheckCambiaStatoBatchAsync(tipoInputEvento.hw, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
@@ -5142,7 +5079,7 @@ namespace MP.IOC.Data
|
||||
// inserisco evento
|
||||
inserito = await IocDbController.EvListInsertAsync(newRec);
|
||||
// faccio controllo per eventuale cambio stato da tab transizioni...
|
||||
checkCambiaStatoBatch(tipoInputEvento.barcode, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
CheckCambiaStatoBatchAsync(tipoInputEvento.barcode, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
@@ -5155,26 +5092,6 @@ namespace MP.IOC.Data
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce il valore booleano se la macchina sia abilitata all'inserimento COMPLETO nel
|
||||
/// Signal Log
|
||||
/// </summary>
|
||||
/// <param name="idxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
private bool sLogEnab(string idxMacchina)
|
||||
{
|
||||
bool answ = false;
|
||||
try
|
||||
{
|
||||
answ = Convert.ToBoolean(mDatiMacchinaVal(idxMacchina, "sLogEnabled"));
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Eccezione in sLogEnab{Environment.NewLine}{exc}");
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stato prod macchina (completo)
|
||||
/// </summary>
|
||||
@@ -5184,7 +5101,6 @@ namespace MP.IOC.Data
|
||||
private StatoProdModel StatoProdMacchina(string idxMacchina, DateTime dtReq, bool forceDb = false)
|
||||
{
|
||||
// setup parametri costanti
|
||||
string source = "DB";
|
||||
StatoProdModel? result = new StatoProdModel();
|
||||
// cerco in _redisConn...
|
||||
string currKey = $"{Utils.redisStatoProd}:{idxMacchina}:{dtReq:HHmm}";
|
||||
@@ -5192,7 +5108,6 @@ namespace MP.IOC.Data
|
||||
if (rawData.HasValue && !forceDb)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<StatoProdModel>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Version>6.16.2604.1811</Version>
|
||||
<Version>6.16.2604.1812</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MP-IOC </i>
|
||||
<h4>Versione: 6.16.2604.1811</h4>
|
||||
<h4>Versione: 6.16.2604.1812</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2604.1811
|
||||
6.16.2604.1812
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2604.1811</version>
|
||||
<version>6.16.2604.1812</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
Reference in New Issue
Block a user