From dd453176e4d9c7040b1f39aa4b4f79ff77783e53 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 5 Nov 2017 20:15:03 +0000 Subject: [PATCH] =?UTF-8?q?Report-Erzeugung=20auf=20neue=20Bed=C3=BCrfniss?= =?UTF-8?q?e=20aktualisiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Stundensheet.xlsx | Bin 34982 -> 35006 bytes nsw/Source/bsmd.ReportGenerator/App.config | 3 + .../bsmd.ReportGenerator/BSMDDocument.cs | 162 +++++++++++++++++- .../Properties/Settings.Designer.cs | 13 +- .../Properties/Settings.settings | 3 + .../bsmd.ReportGenerator/ReportService.cs | 108 ++++++++++-- .../bsmd.ReportGenerator.csproj | 4 + .../bsmd.ReportGenerator.licenseheader | 15 ++ nsw/Source/bsmd.ReportGenerator/readme.txt | 17 ++ .../bsmd.dbh.ResponseService/packages.config | 4 + nsw/Source/bsmd.dbh/Response.cs | 5 +- nsw/Source/bsmd.hisnord/transmitter.cs | 18 +- 12 files changed, 330 insertions(+), 22 deletions(-) create mode 100644 nsw/Source/bsmd.ReportGenerator/bsmd.ReportGenerator.licenseheader create mode 100644 nsw/Source/bsmd.ReportGenerator/readme.txt create mode 100644 nsw/Source/bsmd.dbh.ResponseService/packages.config diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 65328b84d4793d6152b656f4292075fea9b667e6..5b4c842b788b97c441b6e7ca54efac46f6e671eb 100644 GIT binary patch delta 22591 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 delta 22637 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 Bi97%R diff --git a/nsw/Source/bsmd.ReportGenerator/App.config b/nsw/Source/bsmd.ReportGenerator/App.config index 96b98d8b..d40bb9be 100644 --- a/nsw/Source/bsmd.ReportGenerator/App.config +++ b/nsw/Source/bsmd.ReportGenerator/App.config @@ -45,6 +45,9 @@ + + False + \ No newline at end of file diff --git a/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs b/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs index 02c8f3d0..27626c0e 100644 --- a/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs +++ b/nsw/Source/bsmd.ReportGenerator/BSMDDocument.cs @@ -51,6 +51,23 @@ namespace bsmd.ReportGenerator return document; } + internal static Document CreateSingleClassDocument(MessageCore reportCore, List reportMessages, + Dictionary coverInfos, string classes, ReportingParty rp) + { + + Document document = new Document(); + document.Info.Title = string.Format("{0} for {1}", classes, reportCore.DisplayId); + document.Info.Subject = "Reporting class info"; + document.Info.Author = Properties.Settings.Default.ReportAuthor; + + BSMDDocument.DefineSingleStyle(document); + BSMDDocument.DefineSingleHeader(document, coverInfos, rp); + BSMDDocument.DefineContentSectionInitial(document); + + + return document; + } + /// /// create the final output document /// @@ -130,9 +147,43 @@ namespace bsmd.ReportGenerator style.ParagraphFormat.Font.Color = Colors.Blue; } + static void DefineSingleStyle(Document doc) + { + Style style = doc.Styles["Normal"]; + style.Font.Name = "Verdana"; + + Style tableStyle = doc.Styles.AddStyle("Table", "Normal"); + tableStyle.Font.Name = "Verdana"; + tableStyle.Font.Size = 9; + + // usw + Style tableHeaderStyle = doc.Styles.AddStyle("TableHeader", "Normal"); + //tableHeaderStyle.Font.Name = "Verdana"; + tableHeaderStyle.Font.Size = 10; + tableHeaderStyle.Font.Bold = true; + + Style tableValueStyle = doc.Styles.AddStyle("TableValue", "Normal"); + tableValueStyle.Font.Size = 9; + tableValueStyle.Font.Bold = true; + + style = doc.Styles["Heading2"]; + style.Font.Size = 12; + style.Font.Bold = true; + style.ParagraphFormat.SpaceBefore = 6; + style.ParagraphFormat.SpaceAfter = 6; + + style = doc.Styles["Heading3"]; + style.Font.Size = 10; + style.Font.Bold = true; + style.Font.Italic = true; + style.ParagraphFormat.SpaceBefore = 6; + style.ParagraphFormat.SpaceAfter = 3; + + } + #endregion - #region Cover + #region Cover (alt, EU-NOAD) /// /// Defines the cover page. @@ -177,13 +228,110 @@ namespace bsmd.ReportGenerator row.Cells[0].AddParagraph(key); row.Cells[1].AddParagraph(coverInfos[key] ?? string.Empty); } - } #endregion + #region "Neuer" EUREPORT Header Block für Einzelnachrichten + + internal static void DefineSingleHeader(Document document, Dictionary coverInfos, ReportingParty rp) + { + Section section = document.AddSection(); + section.PageSetup.StartingNumber = 1; + + Table table = document.LastSection.AddTable(); + table.Style = "Table"; + table.Borders.Color = Colors.LightGray; + table.Borders.Width = 0.25; + + // Define Colums + Column col = table.AddColumn(80); // die Bildspalte + col.Format.Alignment = ParagraphAlignment.Center; + + col = table.AddColumn(70); + col = table.AddColumn(140); + col = table.AddColumn(60); + col = table.AddColumn(140); + + Row row = table.AddRow(); + Image logoImage = row.Cells[0].AddImage(Properties.Settings.Default.LogoPath); + logoImage.Width = 80; + row.Cells[0].MergeDown = 6; + + Paragraph paragraph = row.Cells[1].AddParagraph("Visit Details"); + row.Cells[1].MergeRight = 3; + row.Cells[1].Shading.Color = Colors.LightGray; + paragraph.Style = "TableHeader"; + + row = table.AddRow(); + row.Cells[1].AddParagraph("Visit-ID"); + paragraph = row.Cells[2].AddParagraph(coverInfos["Visit-ID"]); + paragraph.Style = "TableValue"; + row.Cells[3].AddParagraph("Name"); + paragraph = row.Cells[4].AddParagraph(coverInfos["Ship"]); + paragraph.Style = "TableValue"; + + row = table.AddRow(); + row.Cells[1].AddParagraph("Port of call"); + paragraph = row.Cells[2].AddParagraph(coverInfos["Port of call"]); + paragraph.Style = "TableValue"; + row.Cells[3].AddParagraph("ETA"); + paragraph = row.Cells[4].AddParagraph(coverInfos["ETA"]); + paragraph.Style = "TableValue"; + + row = table.AddRow(); + row.Shading.Color = Colors.LightGray; + paragraph = row.Cells[1].AddParagraph("Reporting Party"); + row.Cells[1].MergeRight = 3; + paragraph.Style = "TableHeader"; + + row = table.AddRow(); + row.Cells[1].AddParagraph("Organization"); + paragraph = row.Cells[2].AddParagraph(rp.Name); + paragraph.Style = "TableValue"; + row.Cells[2].MergeRight = 2; + + row = table.AddRow(); + row.Cells[1].AddParagraph("Last name"); + paragraph = row.Cells[2].AddParagraph(rp.LastName); + paragraph.Style = "TableValue"; + + row.Cells[3].AddParagraph("City"); + paragraph = row.Cells[4].AddParagraph(rp.City); + paragraph.Style = "TableValue"; + + row = table.AddRow(); + row.Cells[1].AddParagraph("Phone"); + paragraph = row.Cells[2].AddParagraph(rp.Phone); + paragraph.Style = "TableValue"; + + row.Cells[3].AddParagraph("Email"); + paragraph = row.Cells[4].AddParagraph(rp.EMail); + paragraph.Style = "TableValue"; + + } + + #endregion + #region setup, header and footers + public static void DefineContentSectionInitial(Document document) + { + Section section = document.LastSection; + section.PageSetup.OddAndEvenPagesHeaderFooter = false; + section.PageSetup.Orientation = Orientation.Portrait; + HeaderFooter header = section.Headers.Primary; + header.AddParagraph(string.Format("EUREPORT - created {0}", DateTime.Now.ToString())); + + Paragraph paragraph = new Paragraph(); + paragraph.AddTab(); + paragraph.AddPageField(); + paragraph.AddText(" / "); + paragraph.AddNumPagesField(); + section.Footers.Primary.Add(paragraph); + + } + /// /// Defines page setup, headers, and footers. /// @@ -211,7 +359,7 @@ namespace bsmd.ReportGenerator // Add clone of paragraph to footer for odd pages. Cloning is necessary because an object must // not belong to more than one other object. If you forget cloning an exception is thrown. section.Footers.EvenPage.Add(paragraph.Clone()); - } + } #endregion @@ -301,7 +449,7 @@ namespace bsmd.ReportGenerator BSMDDocument.AddActualTableParagraph(document, childParagraph.MessageText, true); } } - } + } #region CREW private static void CreateCrewTable(Document document, Message message) @@ -778,16 +926,16 @@ namespace bsmd.ReportGenerator private static void AddActualTableParagraph(Document document, List> messageText, bool isSubTable) { Table table = document.LastSection.AddTable(); - + table.Borders.Color = Colors.LightGray; // table.LeftPadding = new Unit(0.5, UnitType.Centimeter); - Column leadColumn = table.AddColumn(Unit.FromCentimeter(8)); + Column leadColumn = table.AddColumn(200); leadColumn.Format.Alignment = ParagraphAlignment.Left; - Column mainColumn = table.AddColumn(Unit.FromCentimeter(8)); + Column mainColumn = table.AddColumn(290); mainColumn.Format.Alignment = ParagraphAlignment.Left; for (int i = 0; i < messageText.Count; i++) diff --git a/nsw/Source/bsmd.ReportGenerator/Properties/Settings.Designer.cs b/nsw/Source/bsmd.ReportGenerator/Properties/Settings.Designer.cs index 52fd5d2d..abf8e5aa 100644 --- a/nsw/Source/bsmd.ReportGenerator/Properties/Settings.Designer.cs +++ b/nsw/Source/bsmd.ReportGenerator/Properties/Settings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34209 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -12,7 +12,7 @@ namespace bsmd.ReportGenerator.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -114,5 +114,14 @@ namespace bsmd.ReportGenerator.Properties { return ((string)(this["LogoPath"])); } } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool DeleteFileAfterSend { + get { + return ((bool)(this["DeleteFileAfterSend"])); + } + } } } diff --git a/nsw/Source/bsmd.ReportGenerator/Properties/Settings.settings b/nsw/Source/bsmd.ReportGenerator/Properties/Settings.settings index a7368bb1..da3a5781 100644 --- a/nsw/Source/bsmd.ReportGenerator/Properties/Settings.settings +++ b/nsw/Source/bsmd.ReportGenerator/Properties/Settings.settings @@ -35,5 +35,8 @@ + + False + \ No newline at end of file diff --git a/nsw/Source/bsmd.ReportGenerator/ReportService.cs b/nsw/Source/bsmd.ReportGenerator/ReportService.cs index cdec4ba3..d79126c8 100644 --- a/nsw/Source/bsmd.ReportGenerator/ReportService.cs +++ b/nsw/Source/bsmd.ReportGenerator/ReportService.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) 2015-2017 schick Informatik +// Service entry point + +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -10,6 +13,7 @@ using MigraDoc.DocumentObjectModel; using bsmd.database; using bsmd.email; +using System.Text; namespace bsmd.ReportGenerator { @@ -27,6 +31,8 @@ namespace bsmd.ReportGenerator InitializeComponent(); } + #region windows service overrides + protected override void OnStart(string[] args) { this.EventLog.Source = this.ServiceName; @@ -40,6 +46,15 @@ namespace bsmd.ReportGenerator this.DoOnce(); } + protected override void OnStop() + { + _log.Info("Report Service stopping."); + } + + #endregion + + #region timer functions + private void Init(string[] args) { this._timer = new Timer(); @@ -96,19 +111,16 @@ namespace bsmd.ReportGenerator { this.processRunning = false; } - } - - protected override void OnStop() - { - _log.Info("Report Service stopping."); - } + } internal void DoOnce() { this._timer_Elapsed(null, null); } - #region create and send report + #endregion + + #region create and send "old" EU-NOAD report private void CreateReport(MessageCore reportCore) { @@ -118,7 +130,7 @@ namespace bsmd.ReportGenerator bool isReportUpdate = reportCore.ReportStatus != MessageCore.ReportStatusEnum.COMPLETE; coverInfos.Add("Type", reportCore.HerbergReportType); - coverInfos.Add("Ship", DBManager.Instance.GetShipNameFromCore(reportCore)); + coverInfos.Add("Ship", DBManager.Instance.GetShipNameFromCore(reportCore)); coverInfos.Add("E-Mail Ship", reportCore.HerbergEmailContactReportingVessel); coverInfos.Add("IMO", reportCore.IMO); DateTime eta = reportCore.ETA ?? (reportCore.ETAKielCanal ?? new DateTime(0)); @@ -213,19 +225,93 @@ namespace bsmd.ReportGenerator } } + #region create (and send) "single" report (a report per message class) + internal void CreateSingleReport(MessageCore reportCore) { List messages = DBManager.Instance.GetMessagesForCore(reportCore, DBManager.MessageLoad.ALL); + List reportMessages = new List(); messages.Sort(new ANSWMessageComparer()); - Dictionary coverInfos = new Dictionary(); + StringBuilder sb = new StringBuilder(); + Guid reportingPartyId = Guid.Empty; - string subject = string.Format("NEW EU-NOAD message IMO {0}", reportCore.IMO); + foreach (Message aMessage in messages) + { + if (aMessage.InternalStatus == Message.BSMDStatus.REPORT) + { + reportMessages.Add(aMessage); + aMessage.InternalStatus = Message.BSMDStatus.PREPARE; + DBManager.Instance.Save(aMessage); + sb.Append(aMessage.MessageNotificationClassDisplay); + sb.Append(" "); + if (aMessage.ReportingPartyId.HasValue) + reportingPartyId = aMessage.ReportingPartyId.Value; + } + } + string classes = sb.ToString(); + if (!classes.IsNullOrEmpty()) + { + ReportingParty rp = null; + if (DBManager.Instance.GetReportingPartyDict().ContainsKey(reportingPartyId)) + { + rp = DBManager.Instance.GetReportingPartyDict()[reportingPartyId]; + + Dictionary coverInfos = new Dictionary(); + coverInfos.Add("Ship", DBManager.Instance.GetShipNameFromCore(reportCore)); + coverInfos.Add("ETA", reportCore.ETADisplay.ToString()); + coverInfos.Add("Port of call", reportCore.PoC); + coverInfos.Add("Visit-ID", reportCore.DisplayId); + coverInfos.Add("Class", classes); + + string subject = string.Format("PDF report IMO {0} class(es) {1}", reportCore.IMO, classes); + + Document migraDocument = BSMDDocument.CreateSingleClassDocument(reportCore, reportMessages, coverInfos, classes, rp); + + // print messages to document + foreach (Message message in reportMessages) + { + BSMDDocument.AddNSWMessageParagraph(migraDocument, message); + } + + // prepare and send E-Mail with generated attachment + string fullPath = string.Format("{0}\\{1}.pdf", Properties.Settings.Default.OutputDirectory, reportCore.Id); + + BSMDDocument.RenderDocument(migraDocument, fullPath); + _log.InfoFormat("Document created for MessageCoreId {0}, IMO {1}", reportCore.Id, reportCore.IMO); + List attachments = new List(); + attachments.Add(fullPath); + + BSMDMail.SendNSWReportWithAttachments(subject, attachments, rp.EMail); + + // remove + if (Properties.Settings.Default.DeleteFileAfterSend) + { + try + { + File.Delete(fullPath); + } + catch (Exception ex) + { + _log.ErrorFormat("Cannot delete {0}: {1}", fullPath, ex.Message); + } + } + } + else + { + _log.WarnFormat("Default reporting party not set on core {0}", reportCore.Id); + } + } + else + { + _log.WarnFormat("Core {0} set for report, but no message classes!", reportCore.Id); + } // reset report status reportCore.ReportStatus = MessageCore.ReportStatusEnum.NONE; DBManager.Instance.Save(reportCore); } + #endregion #endregion diff --git a/nsw/Source/bsmd.ReportGenerator/bsmd.ReportGenerator.csproj b/nsw/Source/bsmd.ReportGenerator/bsmd.ReportGenerator.csproj index 35e5c4b5..a98526c6 100644 --- a/nsw/Source/bsmd.ReportGenerator/bsmd.ReportGenerator.csproj +++ b/nsw/Source/bsmd.ReportGenerator/bsmd.ReportGenerator.csproj @@ -108,6 +108,7 @@ + SettingsSingleFileGenerator @@ -132,6 +133,9 @@ bsmd.email + + + \ No newline at end of file diff --git a/nsw/Source/bsmd.ReportGenerator/readme.txt b/nsw/Source/bsmd.ReportGenerator/readme.txt new file mode 100644 index 00000000..32f75e98 --- /dev/null +++ b/nsw/Source/bsmd.ReportGenerator/readme.txt @@ -0,0 +1,17 @@ +Es gibt zwei unterschiedliche Verfahren: + +1) MigraDoc Document (MigraDoc.*.dll) +Das erfolgt im HTML Style bei dem man einfach Paragrafen an ein Dokument anfügt und der +Flow wird dann vom Renderer berechnet. Es gehen auch absolute Positionen aber keine +grafischen Elemente außer Bildern und Tabellen + +2) PdfDocument (PdfSharp.*.dll) +Das ist der "Drawing" Style, hier können auch MigraDoc Dokumente eingebettet werden wenn +man beides machen will. Es geht aber über eine graph. Context (XGraphics) und absolute +Koordinaten. Man kann damit z.B. auch mehrere MigraDoc's in kleine Rectangles "reinrendern". + +Auf dieser Seite wird das sehr gut an einem Beispiel gegenübergestellt: +http://www.pdfsharp.net/wiki/MixMigraDocAndPdfSharp-sample.ashx + +Koordinatensystem ist "Points" (72pt = 1 inch), es gibt Umrechnungsfunktionen für cm etc. +In Points hat eine DIN-A4 Seite dann die Ausdehnung von 595 x 842. diff --git a/nsw/Source/bsmd.dbh.ResponseService/packages.config b/nsw/Source/bsmd.dbh.ResponseService/packages.config new file mode 100644 index 00000000..9a0551c5 --- /dev/null +++ b/nsw/Source/bsmd.dbh.ResponseService/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/nsw/Source/bsmd.dbh/Response.cs b/nsw/Source/bsmd.dbh/Response.cs index e86c36ec..584a7270 100644 --- a/nsw/Source/bsmd.dbh/Response.cs +++ b/nsw/Source/bsmd.dbh/Response.cs @@ -71,11 +71,13 @@ namespace bsmd.dbh // neue VISIT - ID aMessage.MessageCore.VisitId = VisitId; aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; + aMessage.SendSuccess = true; DBManager.Instance.Save(aMessage.MessageCore); break; case dbh.response.RootType.TRANSIT: aMessage.MessageCore.TransitId = TransitId; aMessage.MessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; + aMessage.SendSuccess = true; DBManager.Instance.Save(aMessage.MessageCore); break; case dbh.response.RootType.CANCEL: @@ -99,6 +101,7 @@ namespace bsmd.dbh (int) ReportingClassesFull[0].ReportingClass[0] == (int)aMessage.MessageNotificationClass) { // this was successful, save status to MessageHeader + aMessage.SendSuccess = true; aMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; aMessage.Status = Message.MessageStatus.ACCEPTED; } @@ -125,7 +128,7 @@ namespace bsmd.dbh error.MessageHeaderId = aMessage.Id.Value; aMessage.InternalStatus = Message.BSMDStatus.ERROR; DBManager.Instance.Save(error); - + aMessage.SendSuccess = false; break; case dbh.response.RootMessageType.VIOLATION: diff --git a/nsw/Source/bsmd.hisnord/transmitter.cs b/nsw/Source/bsmd.hisnord/transmitter.cs index 7f352c45..89181858 100644 --- a/nsw/Source/bsmd.hisnord/transmitter.cs +++ b/nsw/Source/bsmd.hisnord/transmitter.cs @@ -45,7 +45,23 @@ namespace bsmd.hisnord { _log.WarnFormat("Transmitter process not exited within {0} minute", Properties.Settings.Default.BatchTimeoutMins); // kill Kill KILLLL!!! - process.Kill(); + try + { + process.Kill(); + process.WaitForExit(500); + if (process.HasExited) + { + _log.Info("Transmitter killed, process exited"); + } + else + { + _log.Warn("Killing Transmitter failed, this thing hangs and we're in trouble now"); + } + } + catch (Exception e) + { + _log.WarnFormat("Killing Transmitter failed: {0}", e.Message); + } } string errorString = process.StandardError.ReadToEnd(); if(!errorString.IsNullOrEmpty())