using AppData; using Newtonsoft.Json; using NKC_SDK; using SteamWare; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Web.Http; namespace NKC_WF.Controllers { public class PrintQueueController : ApiController { /// /// oggetto static/singleton per fare chiamate sul datalayer /// protected DataLayer DLMan = new DataLayer(); #region classi gestione PJQ /// /// Conteggio elementi in attesa stampa da DB /// protected int countWaitingDb { get { int answ = 0; // resetto conteggio in redis... DS_Report.PrintJobQueueDataTable tabPJQ = DLMan.taPJQ.getWaiting(); if (tabPJQ != null) { answ = tabPJQ.Count; } return answ; } } /// /// Conteggio elementi in attesa stampa da DB che fanno parte di un SET di queue /// protected int countWaitingDbQueueMult(string queueSet) { int answ = 0; // resetto conteggio in redis... DS_Report.PrintJobQueueDataTable tabPJQ = DLMan.taPJQ.getWaiting(); if (tabPJQ != null) { var selQueue = tabPJQ.Where(x => queueSet.Contains($"|{x.prtName}|")).ToList(); if (selQueue != null) { answ = selQueue.Count; } } return answ; } /// /// Carica i dati richiesti dal report dalla StoredProcedure (filtrando quindi...) e restituisce Dictionary [nome RDS / tab RDS] /// /// /// cod UDC /// tabella dati private Dictionary caricaDati(reportRichiesto tipoReport, string keyParam) { int intIdx = 0; Dictionary answ = new Dictionary(); DataTable tab = new DataTable(); // FIXME TODO... string qrCodeBaseUrl = ""; string imagePath = ""; //"http://seriate.steamware.net:8083/NKC/PartsImg/"; switch (tipoReport) { case reportRichiesto.binPost: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepBin.GetData(intIdx, true, imagePath, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocBin"), tab); break; case reportRichiesto.binPre: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepBin.GetData(intIdx, false, imagePath, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocBin"), tab); break; case reportRichiesto.bunkGroup: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepBunkGroup.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocBunkGroup"), tab); break; case reportRichiesto.bunkList: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepBunkList.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocBunkList"), tab); break; case reportRichiesto.cart: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepCart.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocCart"), tab); break; case reportRichiesto.offline: case reportRichiesto.part: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepPart.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocPart"), tab); break; case reportRichiesto.otherPart: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepOtherPart.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocOtherPart"), tab); break; case reportRichiesto.cartIRKGroup: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepIRKSum.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocIRKGroup"), tab); break; case reportRichiesto.cartIRKList: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepIRK.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocIRKList"), tab); break; case reportRichiesto.cartSpecParts: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepSpecPart.GetData(intIdx, imagePath, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocCartSpecPart"), tab); break; case reportRichiesto.remnants: int.TryParse(keyParam, out intIdx); tab = (DataTable)DLMan.taRepIRK.GetData(intIdx, qrCodeBaseUrl); answ.Add(memLayer.ML.cdv("ReportDS_DocIRKList"), tab); break; default: break; } tab.Dispose(); return answ; } /// /// Calcola report da tipo + nome coda... /// /// /// /// protected reportRichiesto reportByTipo(string tipo, string queueName) { reportRichiesto report = reportRichiesto.bunkGroup; switch (tipo) { case "docStack": if (queueName == "queueBunkDetail") { report = reportRichiesto.bunkList; } else { report = reportRichiesto.bunkGroup; } break; case "docBinPre": report = reportRichiesto.binPre; break; case "docBinPost": report = reportRichiesto.binPost; break; case "docCart": report = reportRichiesto.cart; break; case "docCartIRKSum": report = reportRichiesto.cartIRKGroup; break; case "docCartIRK": report = reportRichiesto.cartIRKList; break; case "docPart": report = reportRichiesto.part; break; case "docOtherPart": report = reportRichiesto.otherPart; break; case "docOffline": report = reportRichiesto.offline; break; case "docCartSpecialPart": report = reportRichiesto.cartSpecParts; break; default: break; } return report; } #endregion #region REST api call /// /// Restituisce numero jobs aperti (stato = 0...), se 0 = NESSUNO /// GET: api/PrintQueue /// /// public int Get() { // restituisco... int answ = 0; string redVal = memLayer.ML.getRSV(ComLib.redQueueCount); // cerco in redis se ci sia chiave.. if (!string.IsNullOrEmpty(redVal)) { // recupero int.TryParse(redVal, out answ); } else { // recupero da db e salvo answ = countWaitingDb; memLayer.ML.setRSV(ComLib.redQueueCount, answ.ToString(), memLayer.ML.CRI("cacheQueueSec")); // chiudo gli zombie (stampe non chiuse)... DLMan.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); } return answ; } /// /// Elenco dei jobs aperti per la coda indicata /// GET: api/PrintQueue/queue_01 /// /// /// public List Get(string id) { List answ = new List(); // recupero da DB... DS_Report.PrintJobQueueDataTable tabPJQ = DLMan.taPJQ.getByQueue(id); if (tabPJQ.Count > 0) { reportData currReport = new reportData(); Dictionary currRdsData; // ciclo! foreach (var pjReq in tabPJQ) { currRdsData = caricaDati(reportByTipo(pjReq.TipoReport, pjReq.prtName), pjReq.KeyParam); // in base alla coda --> recupero i dati currReport = new reportData() { ticketNum = pjReq.IdxPrintJob.ToString(), rdsData = currRdsData }; answ.Add(currReport); } } // compongo risposta... return answ; } /// /// Processa una chiamata POST per l'invio in blocco del risultato dell'elaborazione /// POST: api/PrintQueue /// /// [HttpPost] public string Post() { string answ = "UNKN"; // 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(System.Web.HttpContext.Current.Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true)) { content = reader.ReadToEnd(); } //Rest System.Web.HttpContext.Current.Request.InputStream.Position = 0; // procedo a deserializzare in blocco l'oggetto... try { // deserializzo. printTask printAnsw = JsonConvert.DeserializeObject(content); // verifico se mi abbia dato esito 1 --> aggiorno DB! if (printAnsw != null) { int idxPJQ = 0; int.TryParse(printAnsw.ticketNum, out idxPJQ); DLMan.taPJQ.updateStato(idxPJQ, printAnsw.newStatus); // resetto conteggio in redis... memLayer.ML.setRSV(ComLib.redQueueCount, countWaitingDb.ToString(), memLayer.ML.CRI("cacheQueueSec")); // svuoto code redis salvate.. memLayer.ML.redFlushKey(ComLib.redQueueCountSet); answ = "OK"; } } catch { } // restituisco esito! return answ; } #endregion } }