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 PrintQueueLenController : 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; 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 "docPart": report = reportRichiesto.part; break; case "docOffline": report = reportRichiesto.offline; 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; } /// /// Restituisce numero jobs aperti (stato = 0...), se 0 = NESSUNO /// GET: api/PrintQueue?queueList=|queueOffline| /// /// Elenco code delimitate da |..| /// public int Get(string queueList) { // restituisco... int answ = 0; string redVal = memLayer.ML.getRSV($"{ComLib.redQueueCountSet}:{queueList}"); // cerco in redis se ci sia chiave.. if (!string.IsNullOrEmpty(redVal)) { // recupero int.TryParse(redVal, out answ); } else { // recupero da db e salvo answ = countWaitingDbQueueMult(queueList); memLayer.ML.setRSV($"{ComLib.redQueueCountSet}:{queueList}", answ.ToString(), memLayer.ML.CRI("cacheQueueSec")); // chiudo gli zombie (stampe non chiuse)... DLMan.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); } return answ; } #endregion } }