From de8b7de10dbbfc493c6698e0ac7dc1770afd9a58 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 26 Feb 2017 09:06:03 +0000 Subject: [PATCH] Aktueller Stand FormReader wird eingefroren, da der Service nicht fortgesetzt wird. --- Stundensheet.xlsx | Bin 26296 -> 26333 bytes nsw/Source/SQL/Update_3.5.1_To_4.0.sql | 13 ++- .../bsmd.ExcelReadService/Confirmation.cs | 3 +- nsw/Source/bsmd.ExcelReadService/ExcelBase.cs | 103 ++++++++++++++++++ .../bsmd.ExcelReadService/ExcelReadService.cs | 16 +++ .../bsmd.ExcelReadService/ExcelReader.cs | 83 ++------------ .../bsmd.ExcelReadService/ExcelWriter.cs | 37 +++++++ nsw/Source/bsmd.ExcelReadService/Util.cs | 2 +- .../bsmd.ExcelReadService.csproj | 2 + nsw/Source/bsmd.database/DBManager.cs | 25 +++-- nsw/Source/bsmd.database/Message.cs | 3 +- nsw/Source/bsmd.database/MessageCore.cs | 25 ++++- nsw/Source/bsmd.herberg.FormService/Util.cs | 8 +- 13 files changed, 223 insertions(+), 97 deletions(-) create mode 100644 nsw/Source/bsmd.ExcelReadService/ExcelBase.cs create mode 100644 nsw/Source/bsmd.ExcelReadService/ExcelWriter.cs diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 2fbd48ab5f58846e0ad2f7345ef59cea8c9ea0b6..4c566228c64e91f1941688be1699d12595765240 100644 GIT binary patch delta 13546 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 delta 13493 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ν|#~F0+G?++CZVw35FT`do>_p;;c->v3S^X1d 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 _nameDict; + protected ILog _log; + + #endregion + + #region Properties + + internal CountryMode Mode { get { return _countryMode; } } + + #endregion + + #region Saving + + internal bool Save(string filePath) + { + bool result = true; + if (this._excelApp == null) return false; + try + { + this._excelApp.SaveWorkspace(filePath); + } + catch (Exception ex) + { + _log.WarnFormat("cannot save workspace: {0}", ex.Message); + result = false; + } + return result; + } + + internal bool SaveCopy(string filePath) + { + bool result = true; + if (this._excelApp == null) return false; + try + { + this._portcall.Saved = true; + this._portcall.SaveCopyAs(filePath); + } + catch (Exception ex) + { + _log.WarnFormat("cannot save copy of workbook: {0}", ex.Message); + result = false; + } + return result; + } + + #endregion + + #region Dispose + + public void Dispose() + { + if (this._portcall != null) + { + this._portcall.Close(0); + _log.Debug("Close Worksheet"); + Marshal.ReleaseComObject(this._portcall); + } + + if (this._excelWorkbooks != null) + { + this._excelWorkbooks.Close(); + _log.Debug("Close Workbooks"); + Marshal.ReleaseComObject(this._excelWorkbooks); + // this._excelWorkbooks.Close(); + } + if (this._excelApp != null) + { + _log.Debug("Quit Excel"); + this._excelApp.Quit(); + Marshal.ReleaseComObject(this._excelApp); + } + } + + #endregion + + + } +} diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs index 5bfe70c2..9301d8e2 100644 --- a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs +++ b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs @@ -178,6 +178,22 @@ namespace bsmd.ExcelReadService } } + #region Phase II - Excel Sheets auf Anforderung erzeugen + + List excelMessageCoreList = DBManager.Instance.GetMessageCoresForExcelCreate(); + if(excelMessageCoreList.Count > 0) + _log.InfoFormat("{0} excel sheets to create from database", excelMessageCoreList.Count); + foreach(MessageCore excelCore in excelMessageCoreList) + { + // load messages + List messages = DBManager.Instance.GetMessagesForCore(excelCore, DBManager.MessageLoad.ALL); + + // template + + } + + #endregion + DBManager.Instance.Disconnect(); } catch (Exception ex) diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs b/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs index 35d07040..e23fccfd 100644 --- a/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs +++ b/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs @@ -12,7 +12,6 @@ using Microsoft.Office.Interop.Excel; using System; using System.Collections.Generic; using System.Data; -using System.IO; using System.Globalization; using System.Linq; @@ -21,22 +20,15 @@ using bsmd.database; namespace bsmd.ExcelReadService { - public class ExcelReader : IDisposable - { - private ILog _log = LogManager.GetLogger(typeof(ExcelReader)); - private Workbooks _excelWorkbooks; - private Workbook _portcall; - private Application _excelApp; - private Dictionary _nameDict; + internal class ExcelReader : ExcelBase + { - internal enum ReadState { NONE, OK, WARN, FAIL }; - internal enum CountryMode { NONE, DE, DK }; - - private CountryMode _countryMode = CountryMode.NONE; - + internal enum ReadState { NONE, OK, WARN, FAIL }; public ExcelReader(string filePath) { + _log = LogManager.GetLogger(typeof(ExcelReader)); + this._excelApp = new Application(); this._excelApp.DisplayAlerts = false; this._excelWorkbooks = _excelApp.Workbooks; @@ -50,9 +42,7 @@ namespace bsmd.ExcelReadService } - internal Confirmation Conf { get; set; } - - internal CountryMode Mode { get { return _countryMode; } } + internal Confirmation Conf { get; set; } internal void SetConfirmation(System.Collections.Specialized.StringCollection templatePaths) { @@ -60,40 +50,7 @@ namespace bsmd.ExcelReadService if (templatePaths == Properties.Settings.Default.ConfirmationDK) _countryMode = CountryMode.DK; this.Conf = new Confirmation(templatePaths, _excelApp); - } - - internal bool Save(string filePath) - { - bool result = true; - if (this._excelApp == null) return false; - try - { - this._excelApp.SaveWorkspace(filePath); - } - catch(Exception ex) - { - _log.WarnFormat("cannot save workspace: {0}", ex.Message); - result = false; - } - return result; - } - - internal bool SaveCopy(string filePath) - { - bool result = true; - if (this._excelApp == null) return false; - try - { - this._portcall.Saved = true; - this._portcall.SaveCopyAs(filePath); - } - catch (Exception ex) - { - _log.WarnFormat("cannot save copy of workbook: {0}", ex.Message); - result = false; - } - return result; - } + } internal List SaveConfirmationSheets(string attachmentLocalPath) { @@ -353,31 +310,7 @@ namespace bsmd.ExcelReadService this.Conf.ConfirmText(lookup, val, ReadState.FAIL); } return result; - } - - public void Dispose() - { - if(this._portcall != null) - { - this._portcall.Close(0); - _log.Debug("Close Worksheet"); - Marshal.ReleaseComObject(this._portcall); - } - - if (this._excelWorkbooks != null) - { - this._excelWorkbooks.Close(); - _log.Debug("Close Workbooks"); - Marshal.ReleaseComObject(this._excelWorkbooks); - // this._excelWorkbooks.Close(); - } - if (this._excelApp != null) - { - _log.Debug("Quit Excel"); - this._excelApp.Quit(); - Marshal.ReleaseComObject(this._excelApp); - } - } + } internal DateTime? ReadBirthDate(string lookup) { diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelWriter.cs b/nsw/Source/bsmd.ExcelReadService/ExcelWriter.cs new file mode 100644 index 00000000..51044947 --- /dev/null +++ b/nsw/Source/bsmd.ExcelReadService/ExcelWriter.cs @@ -0,0 +1,37 @@ +// Copyright (c) 2017 Informatikbüro Daniel Schick +// + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace bsmd.ExcelReadService +{ + + /// + /// Diese Klasse generiert aus einer Anmeldung ein Excel-Sheet, die Vorlage ist dabei landesabhängig (PoC) + /// Das ist notwendig bei Anmeldungen die nicht als Excel kommen (EU-NOAD) und aber in ein Excel-Upload Portal + /// gespeist werden müssen (z.B. Dänemark) + /// + internal class ExcelWriter : ExcelBase + { + + public ExcelWriter(CountryMode countryMode) + { + switch(countryMode) + { + case CountryMode.DK: + + break; + case CountryMode.DE: + default: + + break; + } + } + + } +} diff --git a/nsw/Source/bsmd.ExcelReadService/Util.cs b/nsw/Source/bsmd.ExcelReadService/Util.cs index 6dd32e2e..dd393ba9 100644 --- a/nsw/Source/bsmd.ExcelReadService/Util.cs +++ b/nsw/Source/bsmd.ExcelReadService/Util.cs @@ -20,7 +20,7 @@ namespace bsmd.ExcelReadService { private static ILog _log = LogManager.GetLogger(typeof(Util)); - public static bool ProcessSheet(ExcelReader reader, out string readMessage, out MessageCore messageCore) + internal static bool ProcessSheet(ExcelReader reader, out string readMessage, out MessageCore messageCore) { readMessage = "ok"; diff --git a/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj b/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj index db906d2b..eb076f52 100644 --- a/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj +++ b/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj @@ -72,6 +72,7 @@ Properties\AssemblyProjectKeyInfo.cs + Component @@ -79,6 +80,7 @@ ExcelReadService.cs + diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index f67d1c4d..3a42b829 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -89,17 +89,22 @@ namespace bsmd.database #region public helper funcs - /* - public Dictionary GetToSendMessageCoreList() - { - List toSendList = this.GetMessageCoresByStatus(MessageCore.BSMDStatus.TOSEND); - Dictionary result = new Dictionary(); - foreach (MessageCore core in toSendList) - result.Add(core.Id.Value, core); - return result; - } + public List GetMessageCoresForExcelCreate() + { + MessageCore aMessageCore = new MessageCore(); + SqlCommand cmd = new SqlCommand(); + aMessageCore.PrepareLoadCommand(cmd, Message.LoadFilter.CREATE_EXCEL); - */ + SqlDataReader reader = this.PerformCommand(cmd); + List cores = aMessageCore.LoadList(reader); + List result = new List(); + foreach (MessageCore core in cores) + { + this.LoadCustomer(core); + result.Add(core); + } + return result; + } public List GetMessageCoresByStatus(MessageCore.BSMDStatus status) { diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index cbce0cf1..2a5f693f 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -133,7 +133,8 @@ namespace bsmd.database BY_TRANSITID, BY_CORE_ENI, BY_CORE_EXCEL, - BY_CORE_HE + BY_CORE_HE, + CREATE_EXCEL } /// diff --git a/nsw/Source/bsmd.database/MessageCore.cs b/nsw/Source/bsmd.database/MessageCore.cs index 6c7e6c3b..d3ecc565 100644 --- a/nsw/Source/bsmd.database/MessageCore.cs +++ b/nsw/Source/bsmd.database/MessageCore.cs @@ -117,6 +117,16 @@ namespace bsmd.database public DateTime? Created { get { return this.created; } } + public bool IsDK + { + get { return this.PoC?.StartsWith("DK") ?? false; } + } + + /// + /// Flag zeigt an ob ein Excelsheet erzeugt werden soll + /// + public bool CreateExcel { get; set; } + #endregion #region DatabaseEntity implementation @@ -161,6 +171,7 @@ namespace bsmd.database scmd.Parameters.AddWithNullableValue("@P23", this.SietasSheetVersion); scmd.Parameters.AddWithValue("@P24", this.Incoming ? 1 : 0); scmd.Parameters.AddWithNullableValue("@P25", this.DefaultReportingPartyId); + scmd.Parameters.AddWithValue("@P26", this.CreateExcel ? 1 : 0); if (this.IsNew) { @@ -169,9 +180,9 @@ namespace bsmd.database string query = string.Format("INSERT INTO {0} (Id, VisitId, TransitId, IMO, ENI, PoC, Portname, ETA, CustomerId, " + "Previous, Next, IsTransit, Wetris_zz_56_datensatz_id, BSMDStatus, InitialHIS, HerbergFormGuid, " + "HerbergFormTemplateGuid, HerbergReportType, HerbergEmailcontactReportingVessel, HerbergEmail24HrsContact, " + - "ETAKielCanal, HerbergRevDate, ReportStatus, SietasSheetVersion, Incoming, DefaultReportingPartyId) VALUES " + + "ETAKielCanal, HerbergRevDate, ReportStatus, SietasSheetVersion, Incoming, DefaultReportingPartyId, CreateExcel) VALUES " + "(@ID, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17, " + - "@P18, @P19, @P20, @P21, @P22, @P23, @P24, @P25)", + "@P18, @P19, @P20, @P21, @P22, @P23, @P24, @P25, @P26)", this.Tablename); scmd.CommandText = query; } @@ -183,7 +194,7 @@ namespace bsmd.database "Wetris_zz_56_datensatz_id = @P12, BSMDStatus = @P13, InitialHIS = @P14, HerbergFormGuid = @P15, " + "HerbergFormTemplateGuid = @P16, HerbergReportType = @P17, HerbergEmailContactReportingVessel = @P18, " + "HerbergEmail24HrsContact = @P19, ETAKielCanal = @P20, HerbergRevDate = @P21, ReportStatus = @P22, " + - "SietasSheetVersion = @P23, Incoming = @P24, DefaultReportingPartyId = @P25 WHERE Id = @ID", this.Tablename); + "SietasSheetVersion = @P23, Incoming = @P24, DefaultReportingPartyId = @P25, CreateExcel = @P26 WHERE Id = @ID", this.Tablename); scmd.CommandText = query; } } @@ -194,7 +205,7 @@ namespace bsmd.database "ETA, CustomerId, Previous, Next, IsTransit, Wetris_zz_56_datensatz_id, BSMDStatus, InitialHIS, " + "HerbergFormGuid, HerbergFormTemplateGuid, HerbergReportType, HerbergEmailContactReportingVessel, " + "HerbergEmail24HrsContact, ETAKielCanal, HerbergRevDate, ReportStatus, SietasSheetVersion, Incoming, " + - "DefaultReportingPartyId, Created, Changed FROM {0} ", + "DefaultReportingPartyId, Created, Changed, CreateExcel FROM {0} ", this.Tablename); switch (filter) @@ -249,6 +260,11 @@ namespace bsmd.database ((SqlCommand)cmd).Parameters.AddWithValue("@TRANSITID", criteria[0]); break; } + case Message.LoadFilter.CREATE_EXCEL: + { + query += "WHERE CreateExcel = 1"; + break; + } case Message.LoadFilter.ALL: default: break; @@ -291,6 +307,7 @@ namespace bsmd.database if (!reader.IsDBNull(25)) core.DefaultReportingPartyId = reader.GetGuid(25); if (!reader.IsDBNull(26)) core.created = reader.GetDateTime(26); if (!reader.IsDBNull(27)) core.changed = reader.GetDateTime(27); + if (!reader.IsDBNull(28)) core.CreateExcel = reader.GetBoolean(28); result.Add(core); } diff --git a/nsw/Source/bsmd.herberg.FormService/Util.cs b/nsw/Source/bsmd.herberg.FormService/Util.cs index 0c3c47a9..ef190dcb 100644 --- a/nsw/Source/bsmd.herberg.FormService/Util.cs +++ b/nsw/Source/bsmd.herberg.FormService/Util.cs @@ -811,9 +811,10 @@ namespace bsmd.herberg.FormService Dictionary pDict = nDict[key]; keysInMessage.Add(key.ToString(), key.ToString()); CREW crew = theMessage.GetSublistElementWithIdentifier(key.ToString()) as CREW; - if (crew == null) - { + if (crew == null || (!crew.IsDeparture && isDeparture && aMessageCore.IsDK)) // für DK wird bei Abfahrt ein neuer Datensatz (=CREWD) angelegt + { crew = new CREW(); + crew.IsDeparture = isDeparture; crew.MessageHeader = theMessage; crew.Identifier = key.ToString(); theMessage.MessageNotificationClass = Message.NotificationClass.CREW; @@ -1072,9 +1073,10 @@ namespace bsmd.herberg.FormService Dictionary pDict = nDict[key]; keysInMessage.Add(key.ToString(), key.ToString()); PAS pas = theMessage.GetSublistElementWithIdentifier(key.ToString()) as PAS; - if (pas == null) + if ((pas == null) || (!pas.IsDeparture && isDeparture && aMessageCore.IsDK)) { pas = new PAS(); + pas.IsDeparture = isDeparture; pas.MessageHeader = theMessage; pas.Identifier = key.ToString(); theMessage.MessageNotificationClass = Message.NotificationClass.PAS;