From 8a15551efbe9ad2b7c91305cbe8825323cb10ee5 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Sat, 25 Jul 2020 17:38:30 +0200 Subject: [PATCH 1/2] Start new vers - fix printQueue varie --- AppData/DataLayer.cs | 7 +- AppData/reportPrinter.cs | 914 +++++++++++---------- Jenkinsfile | 2 +- NKC_WF/WebUserControls/cmp_barcode.ascx.cs | 8 +- 4 files changed, 471 insertions(+), 460 deletions(-) diff --git a/AppData/DataLayer.cs b/AppData/DataLayer.cs index 0927d19..66c09e8 100644 --- a/AppData/DataLayer.cs +++ b/AppData/DataLayer.cs @@ -248,10 +248,10 @@ namespace AppData public bool stampaDoc(string keyParam, string printer, tipoDocumento tipoDoc, string clientIp) { bool answ = false; - // controllo se esista UDC + // controllo se esista DOC if (checkDoc(tipoDoc, keyParam)) { - answ = reportPrinter.obj.stampaCartellino(tipoDoc, keyParam, printer); + answ = reportPrinter.obj.stampaCartellino(tipoDoc, keyParam, printer, false); if (answ) { logger.lg.scriviLog(string.Format(" | {0} | stampato UDC {1} | stampante {2} | tipo {3}", clientIp, keyParam, printer, tipoDoc), tipoLog.INFO); @@ -282,6 +282,9 @@ namespace AppData case tipoDocumento.docBinPre: break; case tipoDocumento.docBinPost: + int.TryParse(keyParam, out intIdx); + var tabBinPre = taBN.getByKey(intIdx); + answ = tabBinPre.Count > 0; break; case tipoDocumento.docCart: break; diff --git a/AppData/reportPrinter.cs b/AppData/reportPrinter.cs index 99d231c..2b8f1ba 100644 --- a/AppData/reportPrinter.cs +++ b/AppData/reportPrinter.cs @@ -11,474 +11,482 @@ using System.Text; namespace AppData { - /// - /// Classe che si occupa di stampare report da reportViewer via printer remota - /// - public class reportPrinter - { - #region area codice da non modificare + /// + /// Classe che si occupa di stampare report da reportViewer via printer remota + /// + public class reportPrinter + { + #region area codice da non modificare - private int m_currentPageIndex; - protected int logLevel = 0; - protected bool doPdfCopy = false; - /// - /// stream del report... - /// - private IList m_streams; - /// - /// ciclo da fornire al renderizzatore dei report, per salvare 1 immagine da ogni pagina del report - /// - /// - /// - /// - /// - /// - /// - private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) - { - // creo files con nomi univoci... - string filePathName = string.Format(@"~\temp\{0}_{1:HHmmss}_{1:ffff}.{2}", name, DateTime.Now, fileNameExtension); - Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(filePathName), FileMode.Create); - //Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); - m_streams.Add(stream); - return stream; - } - /// - /// ciclo da fornire al renderizzatore dei report, per salvare 1 pdf da ogni pagina del report - /// - /// - /// - /// - /// - /// - /// - private Stream CreateStreamPdf(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) - { - // creo Directory se non c'è - SteamWare.fileMover fm = new fileMover(string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\", memLayer.ML.confReadString("PdfFolder"), DateTime.Now), ""); - fm.checkDir(); - string pdfPathName = string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\{2}_{1:HHmmss}_{1:ffff}.{3}", memLayer.ML.confReadString("PdfFolder"), DateTime.Now, name, fileNameExtension); - //Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); - Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(pdfPathName), FileMode.Create); - m_streams.Add(stream); - return stream; - } - /// - /// Handler per PrintPageEvents - /// - /// - /// - private void PrintPage(object sender, PrintPageEventArgs ev) - { - Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); - ev.Graphics.DrawImage(pageImage, ev.PageBounds); - m_currentPageIndex++; - ev.HasMorePages = (m_currentPageIndex < m_streams.Count); - } - /// - /// funzione di stampa... - /// - private void Print(string printerName) - { - //const string printerName = "Microsoft Office Document Image Writer"; - //const string printerName = "Brother HL-2170W series"; - if (m_streams == null || m_streams.Count == 0) - return; - PrintDocument printDoc = new PrintDocument(); - printDoc.PrinterSettings.PrinterName = printerName; - if (!printDoc.PrinterSettings.IsValid) - { - logger.lg.scriviLog(String.Format("Impostazioni non valide per la stampante \"{0}\".", printerName), tipoLog.ERROR); - return; - } - printDoc.PrintPage += new PrintPageEventHandler(PrintPage); - printDoc.Print(); - } - /// - /// Export del report come EMF (Enhanced Metafile) file. - /// - /// - private void Export(LocalReport report, string deviceInfo) - { - Warning[] warnings; - m_streams = new List(); - report.Render("Image", deviceInfo, CreateStream, out warnings); - foreach (Stream stream in m_streams) stream.Position = 0; - } - /// - /// Export del report come PDF file. - /// - /// - private void ExportPDF(LocalReport report, string deviceInfo) - { - Warning[] warnings; - m_streams = new List(); - report.Render("PDF", deviceInfo, CreateStreamPdf, out warnings); - foreach (Stream stream in m_streams) stream.Position = 0; - } - /// - /// dispone l'applicazione e rilascia le risorse - /// - public void Dispose() - { - if (m_streams != null) - { - foreach (Stream stream in m_streams) - stream.Close(); - m_streams = null; - } - } - - #endregion - - #region area codice da modificare - - /// - /// carica i dati richiesti dal report dalla StoredProcedure (filtrando quindi...) - /// - /// - /// cod UDC - /// tabella dati - private DataTable caricaDati(reportRichiesto tipoReport, string keyParam) - { - int intIdx = 0; - DataTable tab = new DataTable(); - switch (tipoReport) - { - case reportRichiesto.cartLabel: - // int.TryParse(keyParam, out intIdx); - // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); - break; - case reportRichiesto.paintLabelPre: - // int.TryParse(keyParam, out intIdx); - // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); - break; - case reportRichiesto.paintLabelPost: - // int.TryParse(keyParam, out intIdx); - // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); - break; - case reportRichiesto.partLabel: - int.TryParse(keyParam, out intIdx); - tab = (DataTable)DataLayer.man.taIL.getByKey(intIdx); - break; - case reportRichiesto.stackLabel: - int.TryParse(keyParam, out intIdx); - tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); - break; - default: - break; - } - return tab; - } - /// - /// Crea un report locale da file rdlc, carica i dati, esporta report come EMF file e quindi lo invia alla stampante - /// - /// report ammessi: ElencoMacchine / RichiestaIntervento - /// nome completo stampante (rispetto al server) - /// cod UDC - /// parametri "device input" - public void printReport(reportRichiesto tipoReport, string printerName, string keyParam, devInfoParam deviceInfoParam) - { - LocalReport report = new LocalReport(); - report.EnableExternalImages = true; - string deviceInfo = ""; - string repoBasePath = utils.getPath(memLayer.ML.cdv("ReportBasePath")); - repoBasePath = repoBasePath.Replace("\\site", ""); - switch (tipoReport) - { - case reportRichiesto.cartLabel: - report.ReportPath = string.Format(@"{0}\CartLabel.rdlc", repoBasePath); - report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocCart"), caricaDati(tipoReport, keyParam))); - break; - case reportRichiesto.paintLabelPre: - report.ReportPath = string.Format(@"{0}\PaintPreLabel.rdlc", repoBasePath); - report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPaintPre"), caricaDati(tipoReport, keyParam))); - break; - case reportRichiesto.paintLabelPost: - report.ReportPath = string.Format(@"{0}\PaintPreLabel.rdlc", repoBasePath); - report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPaintPre"), caricaDati(tipoReport, keyParam))); - break; - case reportRichiesto.partLabel: - report.ReportPath = string.Format(@"{0}\PartLabel.rdlc", repoBasePath); - report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPart"), caricaDati(tipoReport, keyParam))); - break; - case reportRichiesto.stackLabel: - report.ReportPath = string.Format(@"{0}\StackLabel.rdlc", repoBasePath); - report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocStack"), caricaDati(tipoReport, keyParam))); - break; - } - deviceInfo = deviceInfoParam.xmlParam; - doEmfPrint(printerName, report, deviceInfo); - // controllo se devo fare copia PDF... stampiamo ANCHE su pdf su una folder locale - if (doPdfCopy) - { - deviceInfoParam.OutputFormat = "PDF"; - deviceInfo = deviceInfoParam.xmlParam; - doLocalPdfPrint(report, deviceInfo); - } - } - /// - /// esegue print vero e proprio - /// - /// - /// - /// - private void doEmfPrint(string printerName, LocalReport report, string deviceInfo) - { - // export in EMF - Export(report, deviceInfo); - m_currentPageIndex = 0; - // stampo - Print(printerName); - // do dispose? - Dispose(); - } - /// - /// effettua stampa in PDF dei vari report in una cartella Anno/Mese/Giorno - /// - /// - /// - private void doLocalPdfPrint(LocalReport report, string deviceInfo) - { - // export in PDF - ExportPDF(report, deviceInfo); - m_currentPageIndex = 0; - // do dispose? - Dispose(); - } - /// - /// effettua la stampa del cartellino indicato - /// - /// - /// - /// indirizzo di rete completo stampante del tipo \\nomePc\nomeStampante, oppure "" x default - /// - public bool stampaCartellino(tipoDocumento documento, string keyParam, string printerName) - { - bool answ = false; - int idxPrintJob = 0; - DataLayer dtProx = new DataLayer(); - // gestione coda stampa... - - // incomincio con gestione della coda di stampa... inserisco in tab la richiesta di stampa... - if (memLayer.ML.CRB("disable_singleton")) - { - dtProx.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); - } - else - { - DataLayer.man.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); - } - // faccio un ciclo while... finchè non sono "in testa" alla coda delle esecuzioni aspetto... - string nextJob = "ND"; - try - { - if (memLayer.ML.CRB("disable_singleton")) + private int m_currentPageIndex; + protected int logLevel = 0; + protected bool doPdfCopy = false; + /// + /// stream del report... + /// + private IList m_streams; + /// + /// ciclo da fornire al renderizzatore dei report, per salvare 1 immagine da ogni pagina del report + /// + /// + /// + /// + /// + /// + /// + private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { - nextJob = dtProx.taPJQ.getNext()[0].KeyParam; + // creo files con nomi univoci... + string filePathName = string.Format(@"~\temp\{0}_{1:HHmmss}_{1:ffff}.{2}", name, DateTime.Now, fileNameExtension); + Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(filePathName), FileMode.Create); + //Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); + m_streams.Add(stream); + return stream; } - else + /// + /// ciclo da fornire al renderizzatore dei report, per salvare 1 pdf da ogni pagina del report + /// + /// + /// + /// + /// + /// + /// + private Stream CreateStreamPdf(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { - nextJob = DataLayer.man.taPJQ.getNext()[0].KeyParam; + // creo Directory se non c'è + SteamWare.fileMover fm = new fileMover(string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\", memLayer.ML.confReadString("PdfFolder"), DateTime.Now), ""); + fm.checkDir(); + string pdfPathName = string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\{2}_{1:HHmmss}_{1:ffff}.{3}", memLayer.ML.confReadString("PdfFolder"), DateTime.Now, name, fileNameExtension); + //Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); + Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(pdfPathName), FileMode.Create); + m_streams.Add(stream); + return stream; } - } - catch - { - nextJob = "ND"; - } - // verifico eventuali processi zombie: quelli in stato 0 con LastTry superiore a data attuale meno zombieMsTime - if (memLayer.ML.CRB("disable_singleton")) - { - dtProx.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); - } - else - { - DataLayer.man.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); - } - // ora inizio a fare le mie stampe... - Random rand = new Random(); - int msWait = 200; - while (nextJob != keyParam) - { - // indico che ho fatto un tentativo di stampa aggiornando dtLastTry - if (memLayer.ML.CRB("disable_singleton")) + /// + /// Handler per PrintPageEvents + /// + /// + /// + private void PrintPage(object sender, PrintPageEventArgs ev) { - dtProx.taPJQ.updateLastTry(keyParam); + Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); + ev.Graphics.DrawImage(pageImage, ev.PageBounds); + m_currentPageIndex++; + ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } - else + /// + /// funzione di stampa... + /// + private void Print(string printerName) { - DataLayer.man.taPJQ.updateLastTry(keyParam); + //const string printerName = "Microsoft Office Document Image Writer"; + //const string printerName = "Brother HL-2170W series"; + if (m_streams == null || m_streams.Count == 0) + return; + PrintDocument printDoc = new PrintDocument(); + printDoc.PrinterSettings.PrinterName = printerName; + if (!printDoc.PrinterSettings.IsValid) + { + logger.lg.scriviLog(String.Format("Impostazioni non valide per la stampante \"{0}\".", printerName), tipoLog.ERROR); + return; + } + printDoc.PrintPage += new PrintPageEventHandler(PrintPage); + printDoc.Print(); } - // aspetto... - msWait = rand.Next(memLayer.ML.confReadInt("minWait"), memLayer.ML.confReadInt("maxWait")); - System.Threading.Thread.Sleep(msWait); - // leggo prox record da coda - if (memLayer.ML.CRB("disable_singleton")) + /// + /// Export del report come EMF (Enhanced Metafile) file. + /// + /// + private void Export(LocalReport report, string deviceInfo) { - nextJob = dtProx.taPJQ.getNext()[0].KeyParam; + Warning[] warnings; + m_streams = new List(); + report.Render("Image", deviceInfo, CreateStream, out warnings); + foreach (Stream stream in m_streams) stream.Position = 0; } - else + /// + /// Export del report come PDF file. + /// + /// + private void ExportPDF(LocalReport report, string deviceInfo) { - nextJob = DataLayer.man.taPJQ.getNext()[0].KeyParam; + Warning[] warnings; + m_streams = new List(); + report.Render("PDF", deviceInfo, CreateStreamPdf, out warnings); + foreach (Stream stream in m_streams) stream.Position = 0; } - } - // salvo idx job... - try - { - if (memLayer.ML.CRB("disable_singleton")) + /// + /// dispone l'applicazione e rilascia le risorse + /// + public void Dispose() { - idxPrintJob = dtProx.taPJQ.getNext()[0].IdxPrintJob; - } - else - { - idxPrintJob = DataLayer.man.taPJQ.getNext()[0].IdxPrintJob; - } - } - catch (Exception exc) - { - logger.lg.scriviLog($"Errore in recupero IdxPrint Job:{exc}", tipoLog.EXCEPTION); - } - - // dimensioni pagina - string outForm = ""; - string pagWidth = ""; - string pagHeigth = ""; - string margin = ""; - reportRichiesto report = reportRichiesto.stackLabel; - string tipo = ""; - - switch (documento) - { - case tipoDocumento.docBinPre: - tipo = "DocPaint"; - report = reportRichiesto.paintLabelPre; - break; - case tipoDocumento.docBinPost: - tipo = "DocPaintPost"; - report = reportRichiesto.paintLabelPost; - break; - case tipoDocumento.docCart: - tipo = "DocCart"; - report = reportRichiesto.cartLabel; - break; - case tipoDocumento.docPart: - tipo = "DocPart"; - report = reportRichiesto.partLabel; - break; - case tipoDocumento.docStack: - tipo = "DocStack"; - report = reportRichiesto.stackLabel; - break; - default: - break; - } - // carico di dati con lettura da web.config parametrica - if (string.IsNullOrEmpty(printerName)) - { - printerName = memLayer.ML.cdv(string.Format("printer{0}", tipo)); - } - outForm = "EMF"; - pagWidth = memLayer.ML.cdv(string.Format("PageWidth{0}", tipo)); - pagHeigth = memLayer.ML.cdv(string.Format("PageHeight{0}", tipo)); - margin = memLayer.ML.cdv(string.Format("Margin{0}", tipo)); - // compongo parametri stampa - devInfoParam deviceInfo = new devInfoParam(outForm, pagHeigth, pagWidth, margin, margin, margin, margin); - answ = printAndLog(keyParam, printerName, answ, report, deviceInfo); - if (answ) - { - // registro stampato in tabella queue... - if (memLayer.ML.CRB("disable_singleton")) - { - dtProx.taPJQ.updateStato(idxPrintJob, 1); - } - else - { - DataLayer.man.taPJQ.updateStato(idxPrintJob, 1); - } - } - else - { - // registro annullato in tab queue... - if (memLayer.ML.CRB("disable_singleton")) - { - dtProx.taPJQ.updateStato(idxPrintJob, -1); - } - else - { - DataLayer.man.taPJQ.updateStato(idxPrintJob, -1); + if (m_streams != null) + { + foreach (Stream stream in m_streams) + stream.Close(); + m_streams = null; + } } - } - return answ; - } - /// - /// effettua la vera e propria fase di stampa - /// - /// - /// - /// - /// - /// - /// - private bool printAndLog(string keyParam, string printerName, bool answ, reportRichiesto report, devInfoParam deviceInfo) - { - try - { - if (logLevel > 5) logger.lg.scriviLog(String.Format("Sto per inviare un report alla stampante {0}", printerName), tipoLog.INFO); - reportPrinter.obj.printReport(report, printerName, keyParam, deviceInfo); - if (logLevel > 5) logger.lg.scriviLog(String.Format("inviato comando print alla stampante {0}", printerName), tipoLog.INFO); - answ = true; - } - catch (Exception e) - { - logger.lg.scriviLog(String.Format("Errore in fase di creazione e stampa report: stampante {0}, errore riscontrato {1}", printerName, e), tipoLog.EXCEPTION); - } - return answ; - } - /// - /// oggetto protected - /// - /// - protected reportPrinter() - { - logLevel = memLayer.ML.CRI("_logLevel"); - doPdfCopy = memLayer.ML.CRB("doPdfCopy"); - } - /// - /// singleton pubblico - /// - public static reportPrinter obj = new reportPrinter(); - /// - /// effettua pulizia della cartella temp x i files più vecchi di X ore (web.config) - /// - public void pulisciDir() - { - // num max ore di età x files "vecchi" da tenere in temp area... - int maxOre = memLayer.ML.CRI("maxAgeTempAreaHours"); - int eliminati = 0; - // ottengo elenco files *.emf - fileMover.obj.setDirectory(@"~\temp\"); - FileInfo[] _fis = fileMover.obj.elencoFiles_FI("*.emf"); - bool fatto = false; - foreach (FileInfo _file in _fis) - { - if (_file.CreationTime < DateTime.Now.AddHours(-maxOre)) // elimino files vecchi... - { - fatto = fileMover.obj.eliminaFile(_file); - if (fatto) - { - logger.lg.scriviLog(String.Format("Eliminato file {0}", _file.Name), tipoLog.INFO); - eliminati++; - } - } - } - // salvo il log degli update - if (eliminati > 0) - { - logger.lg.scriviLog(String.Format("Eliminati {0} files temporanei da area temp", eliminati), tipoLog.INFO); - } - } + #endregion - #endregion - } + #region area codice da modificare + + /// + /// carica i dati richiesti dal report dalla StoredProcedure (filtrando quindi...) + /// + /// + /// cod UDC + /// tabella dati + private DataTable caricaDati(reportRichiesto tipoReport, string keyParam) + { + int intIdx = 0; + DataTable tab = new DataTable(); + switch (tipoReport) + { + case reportRichiesto.cartLabel: + // int.TryParse(keyParam, out intIdx); + // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); + break; + case reportRichiesto.paintLabelPre: + // int.TryParse(keyParam, out intIdx); + // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); + break; + case reportRichiesto.paintLabelPost: + // int.TryParse(keyParam, out intIdx); + // tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); + break; + case reportRichiesto.partLabel: + int.TryParse(keyParam, out intIdx); + tab = (DataTable)DataLayer.man.taIL.getByKey(intIdx); + break; + case reportRichiesto.stackLabel: + int.TryParse(keyParam, out intIdx); + tab = (DataTable)DataLayer.man.taRepStack.GetData(intIdx); + break; + default: + break; + } + return tab; + } + /// + /// Crea un report locale da file rdlc, carica i dati, esporta report come EMF file e quindi lo invia alla stampante + /// + /// report ammessi: ElencoMacchine / RichiestaIntervento + /// nome completo stampante (rispetto al server) + /// cod UDC + /// parametri "device input" + public void printReport(reportRichiesto tipoReport, string printerName, string keyParam, devInfoParam deviceInfoParam) + { + LocalReport report = new LocalReport(); + report.EnableExternalImages = true; + string deviceInfo = ""; + string repoBasePath = utils.getPath(memLayer.ML.cdv("ReportBasePath")); + repoBasePath = repoBasePath.Replace("\\site", ""); + switch (tipoReport) + { + case reportRichiesto.cartLabel: + report.ReportPath = string.Format(@"{0}\CartLabel.rdlc", repoBasePath); + report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocCart"), caricaDati(tipoReport, keyParam))); + break; + case reportRichiesto.paintLabelPre: + report.ReportPath = string.Format(@"{0}\PaintPreLabel.rdlc", repoBasePath); + report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPaintPre"), caricaDati(tipoReport, keyParam))); + break; + case reportRichiesto.paintLabelPost: + report.ReportPath = string.Format(@"{0}\PaintPreLabel.rdlc", repoBasePath); + report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPaintPre"), caricaDati(tipoReport, keyParam))); + break; + case reportRichiesto.partLabel: + report.ReportPath = string.Format(@"{0}\PartLabel.rdlc", repoBasePath); + report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocPart"), caricaDati(tipoReport, keyParam))); + break; + case reportRichiesto.stackLabel: + report.ReportPath = string.Format(@"{0}\StackLabel.rdlc", repoBasePath); + report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDS_DocStack"), caricaDati(tipoReport, keyParam))); + break; + } + deviceInfo = deviceInfoParam.xmlParam; + doEmfPrint(printerName, report, deviceInfo); + // controllo se devo fare copia PDF... stampiamo ANCHE su pdf su una folder locale + if (doPdfCopy) + { + deviceInfoParam.OutputFormat = "PDF"; + deviceInfo = deviceInfoParam.xmlParam; + doLocalPdfPrint(report, deviceInfo); + } + } + /// + /// esegue print vero e proprio + /// + /// + /// + /// + private void doEmfPrint(string printerName, LocalReport report, string deviceInfo) + { + // export in EMF + Export(report, deviceInfo); + m_currentPageIndex = 0; + // stampo + Print(printerName); + // do dispose? + Dispose(); + } + /// + /// effettua stampa in PDF dei vari report in una cartella Anno/Mese/Giorno + /// + /// + /// + private void doLocalPdfPrint(LocalReport report, string deviceInfo) + { + // export in PDF + ExportPDF(report, deviceInfo); + m_currentPageIndex = 0; + // do dispose? + Dispose(); + } + /// + /// effettua la stampa del cartellino indicato + /// + /// + /// + /// indirizzo di rete completo stampante del tipo \\nomePc\nomeStampante, oppure "" x default + /// true = si limita ad accodare SENZA stampare + /// + public bool stampaCartellino(tipoDocumento documento, string keyParam, string printerName, bool queueOnly) + { + bool answ = false; + int idxPrintJob = 0; + DataLayer dtProx = new DataLayer(); + // gestione coda stampa... + + // incomincio con gestione della coda di stampa... inserisco in tab la richiesta di stampa... + if (memLayer.ML.CRB("disable_singleton")) + { + dtProx.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); + } + else + { + DataLayer.man.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); + } + if (queueOnly) + { + answ = true; + } + else + { + // faccio un ciclo while... finchè non sono "in testa" alla coda delle esecuzioni aspetto... + string nextJob = "ND"; + try + { + if (memLayer.ML.CRB("disable_singleton")) + { + nextJob = dtProx.taPJQ.getNext()[0].KeyParam; + } + else + { + nextJob = DataLayer.man.taPJQ.getNext()[0].KeyParam; + } + } + catch + { + nextJob = "ND"; + } + // verifico eventuali processi zombie: quelli in stato 0 con LastTry superiore a data attuale meno zombieMsTime + if (memLayer.ML.CRB("disable_singleton")) + { + dtProx.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); + } + else + { + DataLayer.man.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.CRI("zombieMsTime"))); + } + // ora inizio a fare le mie stampe... + Random rand = new Random(); + int msWait = 200; + while (nextJob != keyParam) + { + // indico che ho fatto un tentativo di stampa aggiornando dtLastTry + if (memLayer.ML.CRB("disable_singleton")) + { + dtProx.taPJQ.updateLastTry(keyParam); + } + else + { + DataLayer.man.taPJQ.updateLastTry(keyParam); + } + // aspetto... + msWait = rand.Next(memLayer.ML.confReadInt("minWait"), memLayer.ML.confReadInt("maxWait")); + System.Threading.Thread.Sleep(msWait); + // leggo prox record da coda + if (memLayer.ML.CRB("disable_singleton")) + { + nextJob = dtProx.taPJQ.getNext()[0].KeyParam; + } + else + { + nextJob = DataLayer.man.taPJQ.getNext()[0].KeyParam; + } + } + // salvo idx job... + try + { + if (memLayer.ML.CRB("disable_singleton")) + { + idxPrintJob = dtProx.taPJQ.getNext()[0].IdxPrintJob; + } + else + { + idxPrintJob = DataLayer.man.taPJQ.getNext()[0].IdxPrintJob; + } + } + catch (Exception exc) + { + logger.lg.scriviLog($"Errore in recupero IdxPrint Job:{exc}", tipoLog.EXCEPTION); + } + + // dimensioni pagina + string outForm = ""; + string pagWidth = ""; + string pagHeigth = ""; + string margin = ""; + reportRichiesto report = reportRichiesto.stackLabel; + string tipo = ""; + + switch (documento) + { + case tipoDocumento.docBinPre: + tipo = "DocPaint"; + report = reportRichiesto.paintLabelPre; + break; + case tipoDocumento.docBinPost: + tipo = "DocPaintPost"; + report = reportRichiesto.paintLabelPost; + break; + case tipoDocumento.docCart: + tipo = "DocCart"; + report = reportRichiesto.cartLabel; + break; + case tipoDocumento.docPart: + tipo = "DocPart"; + report = reportRichiesto.partLabel; + break; + case tipoDocumento.docStack: + tipo = "DocStack"; + report = reportRichiesto.stackLabel; + break; + default: + break; + } + // carico di dati con lettura da web.config parametrica + if (string.IsNullOrEmpty(printerName)) + { + printerName = memLayer.ML.cdv(string.Format("printer{0}", tipo)); + } + outForm = "EMF"; + pagWidth = memLayer.ML.cdv(string.Format("PageWidth{0}", tipo)); + pagHeigth = memLayer.ML.cdv(string.Format("PageHeight{0}", tipo)); + margin = memLayer.ML.cdv(string.Format("Margin{0}", tipo)); + // compongo parametri stampa + devInfoParam deviceInfo = new devInfoParam(outForm, pagHeigth, pagWidth, margin, margin, margin, margin); + answ = printAndLog(keyParam, printerName, answ, report, deviceInfo); + if (answ) + { + // registro stampato in tabella queue... + if (memLayer.ML.CRB("disable_singleton")) + { + dtProx.taPJQ.updateStato(idxPrintJob, 1); + } + else + { + DataLayer.man.taPJQ.updateStato(idxPrintJob, 1); + } + } + else + { + // registro annullato in tab queue... + if (memLayer.ML.CRB("disable_singleton")) + { + dtProx.taPJQ.updateStato(idxPrintJob, -1); + } + else + { + DataLayer.man.taPJQ.updateStato(idxPrintJob, -1); + } + + } + } + return answ; + } + /// + /// effettua la vera e propria fase di stampa + /// + /// + /// + /// + /// + /// + /// + private bool printAndLog(string keyParam, string printerName, bool answ, reportRichiesto report, devInfoParam deviceInfo) + { + try + { + if (logLevel > 5) logger.lg.scriviLog(String.Format("Sto per inviare un report alla stampante {0}", printerName), tipoLog.INFO); + reportPrinter.obj.printReport(report, printerName, keyParam, deviceInfo); + if (logLevel > 5) logger.lg.scriviLog(String.Format("inviato comando print alla stampante {0}", printerName), tipoLog.INFO); + answ = true; + } + catch (Exception e) + { + logger.lg.scriviLog(String.Format("Errore in fase di creazione e stampa report: stampante {0}, errore riscontrato {1}", printerName, e), tipoLog.EXCEPTION); + } + return answ; + } + /// + /// oggetto protected + /// + /// + protected reportPrinter() + { + logLevel = memLayer.ML.CRI("_logLevel"); + doPdfCopy = memLayer.ML.CRB("doPdfCopy"); + } + /// + /// singleton pubblico + /// + public static reportPrinter obj = new reportPrinter(); + /// + /// effettua pulizia della cartella temp x i files più vecchi di X ore (web.config) + /// + public void pulisciDir() + { + // num max ore di età x files "vecchi" da tenere in temp area... + int maxOre = memLayer.ML.CRI("maxAgeTempAreaHours"); + int eliminati = 0; + // ottengo elenco files *.emf + fileMover.obj.setDirectory(@"~\temp\"); + FileInfo[] _fis = fileMover.obj.elencoFiles_FI("*.emf"); + bool fatto = false; + foreach (FileInfo _file in _fis) + { + if (_file.CreationTime < DateTime.Now.AddHours(-maxOre)) // elimino files vecchi... + { + fatto = fileMover.obj.eliminaFile(_file); + if (fatto) + { + logger.lg.scriviLog(String.Format("Eliminato file {0}", _file.Name), tipoLog.INFO); + eliminati++; + } + } + } + // salvo il log degli update + if (eliminati > 0) + { + logger.lg.scriviLog(String.Format("Eliminati {0} files temporanei da area temp", eliminati), tipoLog.INFO); + } + } + + #endregion + } } diff --git a/Jenkinsfile b/Jenkinsfile index d69dbf4..f25b09a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,7 +11,7 @@ pipeline { steps { /* calcolo numero versione... diverso x branch MASTER/DEVELOP */ script { - withEnv(['NEXT_BUILD_NUMBER=295']) { + withEnv(['NEXT_BUILD_NUMBER=296']) { // env.versionNumber = VersionNumber(versionNumberString : '0.10.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2019-07-01', skipFailedBuilds: true) env.versionNumber = VersionNumber(versionNumberString : '0.10.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2019-07-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') env.versionNumberBeta = VersionNumber(versionNumberString : '0.10.${BUILD_DATE_FORMATTED, "yyMM"}-beta.${BUILDS_ALL_TIME}', projectStartDate : '2019-07-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') diff --git a/NKC_WF/WebUserControls/cmp_barcode.ascx.cs b/NKC_WF/WebUserControls/cmp_barcode.ascx.cs index 7059774..14b8812 100644 --- a/NKC_WF/WebUserControls/cmp_barcode.ascx.cs +++ b/NKC_WF/WebUserControls/cmp_barcode.ascx.cs @@ -12,10 +12,10 @@ namespace NKC_WF.WebUserControls resetInput(); resetMessage(); } - //else if (string.IsNullOrEmpty(inputAcquired)) - //{ - // checkRaiseEv(); - //} + else if (string.IsNullOrEmpty(inputAcquired)) + { + checkRaiseEv(); + } } /// /// evento modifica testo From b4df8dc622197c720b78106420bbf1cca4d8ec9a Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Sat, 25 Jul 2020 18:00:54 +0200 Subject: [PATCH 2/2] Fix printing conf --- AppData/DataLayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppData/DataLayer.cs b/AppData/DataLayer.cs index 66c09e8..7a72a3b 100644 --- a/AppData/DataLayer.cs +++ b/AppData/DataLayer.cs @@ -251,7 +251,7 @@ namespace AppData // controllo se esista DOC if (checkDoc(tipoDoc, keyParam)) { - answ = reportPrinter.obj.stampaCartellino(tipoDoc, keyParam, printer, false); + answ = reportPrinter.obj.stampaCartellino(tipoDoc, keyParam, printer, true); if (answ) { logger.lg.scriviLog(string.Format(" | {0} | stampato UDC {1} | stampante {2} | tipo {3}", clientIp, keyParam, printer, tipoDoc), tipoLog.INFO);