using Microsoft.AspNetCore.Mvc; using MP.IOC.Data; using Newtonsoft.Json; using NLog; using System.Reflection; namespace MP.IOC.Controllers { [Route("api/[controller]")] [ApiController] public class IOBController : ControllerBase { #region Public Constructors public IOBController(IConfiguration configuration, MpDataService DataService) { _configuration = configuration; DService = DataService; } #endregion Public Constructors #region Public Methods /// SALVA x macchina KVP parametro/valore: /// GET: api/IOB/addOptPar/SIMUL_03?pName=PZREQ&pValue=1000 /// [HttpGet("addOptPar/{id}")] public async Task AddOptPar(string id, string pName, string pValue) { DService.ScriviKeepAlive(id, DateTime.Now); try { DService.AddOptPar4Machine(id, pName, pValue); return await GetOptPar(id); } catch { return StatusCode(StatusCodes.Status500InternalServerError, "Errore interno | AddOptPar"); } } /// /// GET: IOB/ /// /// [HttpGet] public IActionResult Alive() { return Ok("OK"); // Restituisce Status 200 } /// /// GET: IOB/enabled/SIMUL_03 /// /// /// [HttpGet("enabled/{id}")] public IActionResult Enabled(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); if (DService.IobInsEnab(id)) { return Ok("OK"); } else { //return StatusCode(503, "NO"); return UnprocessableEntity("NO"); } } /// /// Recupera COUNTER x macchina: /// GET: IOB/getCounter/SIMUL_03 /// /// /// Il conteggio pezzi o un errore strutturato [HttpGet("getCounter/{id}")] public async Task GetCounter(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); try { var pzCount = await DService.pzCounter(id); return Ok(pzCount); } catch (Exception exc) { Log.Error(exc, "Errore durante il recupero del counter per la macchina {MachineId}", id); return StatusCode(StatusCodes.Status500InternalServerError, "Errore interno | GetCounter"); } } /// /// Recupera COUNTER x macchina dal CONTEGGIO dei TCRecorded: /// /// GET: IOB/getCounterTCRec/5 /// /// /// Il conteggio pezzi o un errore strutturato [HttpGet("getCounterTCRec/{id}")] public async Task GetCounterTCRec(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); // Multi: gestione carattere "|" trasformato in "#" id = id.Replace("|", "#"); try { var pzCount = await DService.pzCounterTcAsync(id); return Ok(pzCount); } catch (Exception exc) { Log.Error(exc, "Errore durante il recupero del counter TC per la macchina {MachineId}", id); //return StatusCode(StatusCodes.Status500InternalServerError, "NO"); return StatusCode(StatusCodes.Status500InternalServerError, "Errore interno | GetCounterTCRec"); } } /// /// Recupera ODL corrente x macchina: /// GET: IOB/getCurrODL/SIMUL_03 /// /// /// [HttpGet("getCurrODL/{id}")] public async Task GetCurrODL(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); // Multi: gestione carattere "|" trasformato in "#" id = id.Replace("|", "#"); try { var odl = await DService.GetCurrOdlAsync(id); return Ok($"{odl}"); } catch (Exception exc) { Log.Error(exc, "Errore GetCurrODL | macchina {MachineId}", id); return StatusCode(StatusCodes.Status500InternalServerError, "NO"); //return StatusCode(StatusCodes.Status500InternalServerError, "Errore interno | GetCurrODL"); } } /// /// Recupera TASK richiesto x macchina: /// GET: IOB/getOptPar/SIMUL_03 /// /// /// Json contenente 1..n task da eseguire [HttpGet("getOptPar/{id}")] public async Task GetOptPar(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); // Multi: gestione carattere "|" trasformato in "#" id = id.Replace("|", "#"); string answ = ""; // scrivo keep alive!!! (se necessario, altrimenti è in cache...) DService.ScriviKeepAlive(id, DateTime.Now); try { // leggo da REDIS eventuale elenco task x macchina... Dictionary valori = DService.mOptParMacchina(id); answ = JsonConvert.SerializeObject(valori); } catch { } return Ok(answ); } /// /// Recupera TASK richiesto x macchina: /// GET: IOB/getTask2Exe/SIMUL_03 /// /// /// Json contenente 1..n task da eseguire [HttpGet("getTask2Exe/{id}")] public async Task GetTask2Exe(string id) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); // Multi: gestione carattere "|" trasformato in "#" id = id.Replace("|", "#"); string answ = ""; DService.ScriviKeepAlive(id, DateTime.Now); // leggo da REDIS eventuale elenco task x macchina... Dictionary valori = await DService.GetTask2ExeMacchinaAsync(id); answ = JsonConvert.SerializeObject(valori); return Ok(answ); } /// /// Metodo di dichiarazione "improprio" tramite get call totalmetne definita da URL /// GET: IOB/input/SIMUL_03?valore=3&dtEve=20181206180600000&dtCurr=20181206180600000&cnt=999 /// /// /// /// /// /// /// [HttpGet("input/{id}")] public async Task Input(string id, string valore, string dtEve, string dtCurr, string cnt) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); string answ = ""; if (cnt == null) { cnt = "0"; } DateTime dataOraEvento = DateTime.Now; try { answ = DService.processInput(id, valore, dtEve, dtCurr, cnt); } catch (Exception exc) { Log.Error($"Errore in processInput{Environment.NewLine}{exc}"); answ = "NO"; } return Ok(answ); } /// /// SALVA Counter x macchina restituendo il valore appena inviato o, se mancasse chiave /// redis, del valore da DB /// /// GET: IOB/setCounter/5?counter=10 /// /// cod macchina /// contapezzi da salvare /// [HttpGet("setCounter/{id}")] public async Task SetCounter(string id, string counter) { if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID"); // Multi: gestione carattere "|" trasformato in "#" id = id.Replace("|", "#"); string answ = "-1"; DateTime dataOraEvento = DateTime.Now; Log.Debug($"Salvataggio counter | id: {id} | pzCount: {counter}"); answ = DService.saveCounter(id, counter); return Ok(answ); } [HttpGet("version")] public IActionResult Version() { var version = Assembly .GetExecutingAssembly() .GetName() .Version? .ToString() ?? "unknown"; return Ok(version); } #endregion Public Methods #region Private Fields private static IConfiguration _configuration = null!; private static Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields #region Private Properties /// /// Dataservice x accesso DB /// private MpDataService DService { get; set; } #endregion Private Properties } }