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
}
}