using GMW_data; using Microsoft.Reporting.WinForms; using SteamWare; using System; using System.Collections.Generic; using System.Data; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Text; /// /// 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(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); Stream stream = new FileStream(SteamWare.fileMover.getFilePath(filePathName), FileMode.Create); //Stream stream = new FileStream(SteamWare.SteamwareStrings.getFilePath(filePathName), 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.fileMover.getFilePath(pdfPathName), 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 UDC) { DataTable tab = new DataTable(); switch (tipoReport) { case reportRichiesto.CartellinoAL: tab = (DataTable)DataProxy.obj.taPrtCartAL.GetData(UDC); break; case reportRichiesto.CartellinoALRX: tab = (DataTable)DataProxy.obj.taPrtCartAL.GetData(UDC); break; case reportRichiesto.CartellinoALTT: tab = (DataTable)DataProxy.obj.taPrtCartAL.GetData(UDC); break; case reportRichiesto.CartellinoAnime: tab = (DataTable)DataProxy.obj.taPrtCartAnime.GetData(UDC); break; case reportRichiesto.CartellinoFiniti: tab = (DataTable)DataProxy.obj.taPrtCartFiniti.GetData(UDC); break; case reportRichiesto.CartellinoFinitiRxSP: tab = (DataTable)DataProxy.obj.taPrtCartFinitiRxSP.GetData(UDC); break; case reportRichiesto.CartellinoFinitiSP: tab = (DataTable)DataProxy.obj.taPrtCartFinitiSP.GetData(UDC); break; case reportRichiesto.CartellinoFusi: tab = (DataTable)DataProxy.obj.taPrtCartFusi.GetData(UDC); break; case reportRichiesto.CartellinoALANkit: tab = (DataTable)DataProxy.obj.taPrtCartKitAnime.GetData(UDC); break; case reportRichiesto.CartellinoLiquidiF10: tab = (DataTable)DataProxy.obj.taPrtCartLiqF10.GetData(UDC); break; case reportRichiesto.CartellinoLiquidiF18: tab = (DataTable)DataProxy.obj.taPrtCartLiqF18.GetData(UDC); break; case reportRichiesto.CartellinoMP: tab = (DataTable)DataProxy.obj.taPrtCartMP.GetData(UDC); break; case reportRichiesto.CartellinoOdette: tab = (DataTable)Odette.mgr.taOdette.getByUdc(UDC); break; case reportRichiesto.CartellinoSterrati: tab = (DataTable)DataProxy.obj.taPrtCartSterrati.GetData(UDC); break; case reportRichiesto.CartellinoTara: tab = (DataTable)DataProxy.obj.taPrtCart.GetData(UDC); break; case reportRichiesto.CartellinoTrattati: tab = (DataTable)DataProxy.obj.taPrtCartTratt.GetData(UDC); break; case reportRichiesto.CartellinoWIP: tab = (DataTable)DataProxy.obj.taPrtCart.GetData(UDC); 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 UDC, devInfoParam deviceInfoParam) { LocalReport report = new LocalReport(); string deviceInfo = ""; switch (tipoReport) { case reportRichiesto.CartellinoAL: report.ReportPath = string.Format(@"{0}\CartellinoAL.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceAL"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoALRX: report.ReportPath = string.Format(@"{0}\CartellinoALRX.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceALRX"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoALTT: report.ReportPath = string.Format(@"{0}\CartellinoALTT.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceALTT"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoAnime: report.ReportPath = string.Format(@"{0}\CartellinoAnime.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceAnime"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoALANkit: report.ReportPath = string.Format(@"{0}\CartellinoALANkit.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceALANkit"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoFiniti: report.ReportPath = string.Format(@"{0}\CartellinoFiniti.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceFiniti"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoFinitiRxSP: report.ReportPath = string.Format(@"{0}\CartellinoFinitiRxSP.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceFinitiRxSP"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoFinitiSP: report.ReportPath = string.Format(@"{0}\CartellinoFinitiSP.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceFinitiSP"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoFusi: report.ReportPath = string.Format(@"{0}\CartellinoFusi.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceFusi"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoMP: report.ReportPath = string.Format(@"{0}\CartellinoMP.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasource"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoLiquidiF10: report.ReportPath = string.Format(@"{0}\CartellinoLiquidiF10.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceLiquidiF10"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoLiquidiF18: report.ReportPath = string.Format(@"{0}\CartellinoLiquidiF18.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceLiquidiF18"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoOdette: report.ReportPath = string.Format(@"{0}\CartellinoOdette.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceOdette"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoSterrati: report.ReportPath = string.Format(@"{0}\CartellinoSterrati.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceSterrati"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoTara: report.ReportPath = string.Format(@"{0}\CartellinoTara.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasource"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoTrattati: report.ReportPath = string.Format(@"{0}\CartellinoTrattati.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasourceTrattati"), caricaDati(tipoReport, UDC))); break; case reportRichiesto.CartellinoWIP: report.ReportPath = string.Format(@"{0}\CartellinoWip.rdlc", memLayer.ML.cdv("ReportBasePath")); report.DataSources.Add(new ReportDataSource(memLayer.ML.cdv("ReportDatasource"), caricaDati(tipoReport, UDC))); 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(tipoCartellino cartellino, string UDC, string printerName) { bool answ = false; int idxPrintJob = 0; DataProxy dtProx = new DataProxy(); // gestione coda: SE abilitata... if (memLayer.ML.confReadBool("enableQueue")) { // incomincio con gestione della coda di stampa... inserisco in tab la richiesta di stampa... if (memLayer.ML.CRB("disable_singleton")) { dtProx.taPJQ.insertQuery(cartellino.ToString(), UDC, printerName); } else { DataProxy.obj.taPJQ.insertQuery(cartellino.ToString(), UDC, printerName); } // faccio un ciclo while... finchè non sono "in testa" alla coda delle esecuzioni aspetto... string nextUdc = "ND"; try { if (memLayer.ML.CRB("disable_singleton")) { nextUdc = dtProx.taPJQ.getNext()[0].UDC; } else { nextUdc = DataProxy.obj.taPJQ.getNext()[0].UDC; } } catch { nextUdc = "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.confReadInt("zombieMsTime"))); } else { DataProxy.obj.taPJQ.chiudiZoombie(DateTime.Now.AddMilliseconds(-memLayer.ML.confReadInt("zombieMsTime"))); } // ora inizio a fare le mie stampe... Random rand = new Random(); int msWait = 200; while (nextUdc != UDC) { // indico che ho fatto un tentativo di stampa aggiornando dtLastTry if (memLayer.ML.CRB("disable_singleton")) { dtProx.taPJQ.updateLastTry(UDC); } else { DataProxy.obj.taPJQ.updateLastTry(UDC); } // 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")) { nextUdc = dtProx.taPJQ.getNext()[0].UDC; } else { nextUdc = DataProxy.obj.taPJQ.getNext()[0].UDC; } } // salvo idx job... if (memLayer.ML.CRB("disable_singleton")) { idxPrintJob = dtProx.taPJQ.getNext()[0].IdxPrintJob; } else { idxPrintJob = DataProxy.obj.taPJQ.getNext()[0].IdxPrintJob; } } string outForm = ""; string pagWidth = ""; string pagHeigth = ""; string margin = ""; reportRichiesto report = reportRichiesto.CartellinoFusi; string tipo = ""; switch (cartellino) { case tipoCartellino.cartAL: tipo = "CartAL"; report = reportRichiesto.CartellinoAL; break; case tipoCartellino.cartALRX: tipo = "CartAL"; report = reportRichiesto.CartellinoALRX; break; case tipoCartellino.cartALTT: tipo = "CartAL"; report = reportRichiesto.CartellinoALTT; break; case tipoCartellino.cartAnime: tipo = "CartAnime"; report = reportRichiesto.CartellinoAnime; break; case tipoCartellino.cartALANkit: tipo = "CartALANkit"; report = reportRichiesto.CartellinoALANkit; break; case tipoCartellino.cartFiniti: tipo = "CartFiniti"; report = reportRichiesto.CartellinoFiniti; break; case tipoCartellino.cartFinitiRxSP: tipo = "CartFiniti"; report = reportRichiesto.CartellinoFinitiRxSP; break; case tipoCartellino.cartFinitiSP: tipo = "CartFiniti"; report = reportRichiesto.CartellinoFinitiSP; break; case tipoCartellino.cartFusi: tipo = "CartFusi"; report = reportRichiesto.CartellinoFusi; break; case tipoCartellino.cartLiquidiF10: tipo = "CartLiquidiF10"; report = reportRichiesto.CartellinoLiquidiF10; break; case tipoCartellino.cartLiquidiF18: tipo = "CartLiquidiF18"; report = reportRichiesto.CartellinoLiquidiF18; break; case tipoCartellino.cartMP: tipo = "CartMP"; report = reportRichiesto.CartellinoMP; break; case tipoCartellino.cartOdette: tipo = "CartOdette"; report = reportRichiesto.CartellinoOdette; break; case tipoCartellino.cartSterr: tipo = "CartSterr"; report = reportRichiesto.CartellinoSterrati; break; case tipoCartellino.cartTara: tipo = "CartTara"; report = reportRichiesto.CartellinoTara; break; case tipoCartellino.cartTratt: tipo = "CartTratt"; report = reportRichiesto.CartellinoTrattati; break; case tipoCartellino.cartWip: tipo = "CartWip"; report = reportRichiesto.CartellinoWIP; 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(UDC, printerName, answ, report, deviceInfo); // gestione coda: SE abilitata... if (memLayer.ML.confReadBool("enableQueue")) { if (answ) { // registro stampato in tabella queue... if (memLayer.ML.CRB("disable_singleton")) { dtProx.taPJQ.updateStato(idxPrintJob, 1); } else { DataProxy.obj.taPJQ.updateStato(idxPrintJob, 1); } } else { // registro annullato in tab queue... if (memLayer.ML.CRB("disable_singleton")) { dtProx.taPJQ.updateStato(idxPrintJob, -1); } else { DataProxy.obj.taPJQ.updateStato(idxPrintJob, -1); } } } return answ; } /// /// effettua la vera e propria fase di stampa /// /// /// /// /// /// /// private bool printAndLog(string UDC, 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, UDC, 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.confReadInt("_logLevel"); doPdfCopy = memLayer.ML.confReadBool("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.confReadInt("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 } /// /// tipologia di report ammessi alla stampa... /// public enum reportRichiesto { CartellinoAL, CartellinoALANkit, CartellinoALRX, CartellinoALTT, CartellinoAnime, CartellinoFiniti, CartellinoFinitiRxSP, CartellinoFinitiSP, CartellinoFusi, CartellinoLiquidiF10, CartellinoLiquidiF18, CartellinoMP, CartellinoOdette, CartellinoSterrati, CartellinoTara, CartellinoTrattati, CartellinoWIP }