using CMS_CORE_Library.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using Thermo.Active.Model.DTOModels.ThProd; using Thermo.Active.NC; using Thermo.Active.Utils; using static Thermo.Active.Model.Constants; namespace Thermo.Active.Controllers.WebApi { [RoutePrefix("api/prod")] public class ProdController : ApiController { /// /// Oggetto adapter condiviso da WebAPI /// protected static NcAdapter ncAdapter = new NcAdapter(); /// /// Request mode SETUP /// /// [Route("mode/manual"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult RequestManual() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | RequestManual | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.StrobeMode(Model.DTOModels.ThProd.Mode.MANUAL); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"RequestManual error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } #if true /// /// Request mode AUTO /// /// [Route("mode/auto"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult RequestAuto() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | RequestAuto | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.StrobeMode(Model.DTOModels.ThProd.Mode.AUTO); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"RequestAuto error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } #endif /// /// Request mode SETUP /// /// [Route("mode/setup"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult RequestSetup() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | RequestSetup | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.StrobeMode(Model.DTOModels.ThProd.Mode.SETUP); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"RequestSetup error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } /// /// Set item as scrap /// /// item NUM /// scrap flag (true/false) /// [Route("setScrap"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult SetScrap(int num, bool isScrap) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | SetScrap | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul DB che il pezzo è SCRAPPED libraryError = ncAdapter.SetScrap(num, isScrap); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"SetScrap error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } /// /// Request start production /// /// item NUM /// scrap flag (true/false) /// [Route("start"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult StartProd(int requestQty, bool newWorkOrder) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | StartProd | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // legacy method short numCicliRisc = 0; // scrivo sul PLC pezzi richiesti, cicli riscaldo + comando strobe reset se encessario! libraryError = ncAdapter.UpdateProdInfoData((short)requestQty, newWorkOrder, numCicliRisc); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"StartProd error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // se new workorder --> registro nuova data x start lotto! if (newWorkOrder) { ncAdapter.lottoStart = DateTime.Now; } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.StrobeMode(Mode.AUTO); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"RequestAuto error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } /// /// Request start production /// /// item NUM /// scrap flag (true/false) /// warmup cycle requested (0=none) /// [Route("startFull"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult StartProdFull(int requestQty, bool newWorkOrder, int numCicliRisc) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | StartProd | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul PLC pezzi richiesti, cicli riscaldo + comando strobe reset se encessario! libraryError = ncAdapter.UpdateProdInfoData((short)requestQty, newWorkOrder, (short)numCicliRisc); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"StartProd error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // se new workorder --> registro nuova data x start lotto! if (newWorkOrder) { ncAdapter.lottoStart = DateTime.Now; } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.StrobeMode(Mode.AUTO); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"RequestAuto error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(); } /// /// Request production current data /// /// [Route("get"), HttpGet] public IHttpActionResult GetProd() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | GetProd | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // scrivo sul PLC il comando strobe richiesta AUTO! libraryError = ncAdapter.ReadProdInfoData(out DTOProdInfo prodInfoDat); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"GetProd error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(prodInfoDat); } /// /// Request gauges current data /// /// [Route("gauges"), HttpGet] public IHttpActionResult GetGauges() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | GetGauges | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // leggo dati gauges libraryError = ncAdapter.ReadGaugeData(out Dictionary currentLiveProd); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"GetGauges error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(currentLiveProd); } /// /// Request production data from indexStart record for numRecord items (DESCENDING) /// /// [Route("history"), HttpGet] public IHttpActionResult GetHistory(int indexStart, int numRecord) { List prodInfoDTO = new List(); // SOLO SE indice > 0 if (indexStart >= 0) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | GetHistory | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // recupero da DB i record richiesti libraryError = ncAdapter.GetHistProdInfoDataDesc(out List prodInfoDataList, indexStart, numRecord); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"GetHistory error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // converto da datiPLC a DTOProdInfo... foreach (var item in prodInfoDataList) { prodInfoDTO.Add(new DTOProdInfo(item)); } } // ritorno solo fatto! return Ok(prodInfoDTO); } /// /// Request Prod Panel data /// /// [Route("prodPanel"), HttpGet] public IHttpActionResult GetProdPanel() { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"NC Not connected! | GetProdPanel | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // recupero dati produzione libraryError = ncAdapter.ReadProdPanel(out DTOThermoPanelProd currentProdPanel); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"GetProdPanel error | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } // ritorno solo fatto! return Ok(currentProdPanel); } } }