From 4e7d1251b9f879d38f5caed1fa082fb742a6b487 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Tue, 10 Oct 2017 06:36:05 +0000 Subject: [PATCH] =?UTF-8?q?Version=203.7.5:=20Einzelnachrichtenversand=20f?= =?UTF-8?q?=C3=BCr=20HIS-Nord,=20Vereinheitlichung=20der=20Sende.Logik=20i?= =?UTF-8?q?m=20NSWSendService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DangerousGoodsDetailControl.xaml.cs | 20 +- ...timeHealthDeclarationDetailControl.xaml.cs | 1 + .../WasteDetailControl.xaml | 24 +- .../WasteDetailControl.xaml.cs | 35 +- ENI-2/ENI2/ENI2/ENI2.csproj | 2 +- .../ENI2/EditControls/EditIBCDialog.xaml.cs | 2 + .../ENI2/EditControls/EditIGCDialog.xaml.cs | 2 + .../ENI2/EditControls/EditIMDGDialog.xaml.cs | 2 + .../ENI2/EditControls/EditIMSBCDialog.xaml.cs | 2 + .../EditControls/EditMarpolDialog.xaml.cs | 2 + .../ENI2/EditControls/VisitIdDialog.xaml.cs | 2 + Stundensheet.xlsx | Bin 34740 -> 34822 bytes .../SendNSWMessageService/NSWSendService.cs | 216 ++++++++-- nsw/Source/bsmd.ExcelReadService/LocodeDB.cs | 3 +- .../Properties/AssemblyProductInfo.cs | 2 +- .../Properties/AssemblyProjectInfo.cs | 2 +- nsw/Source/bsmd.database/SystemError.cs | 6 +- nsw/Source/bsmd.dbh/Request.cs | 4 +- nsw/Source/bsmd.hisnord/Request.cs | 401 +++++++----------- 19 files changed, 396 insertions(+), 332 deletions(-) diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/DangerousGoodsDetailControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailViewControls/DangerousGoodsDetailControl.xaml.cs index 69215603..c4c480e5 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/DangerousGoodsDetailControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailViewControls/DangerousGoodsDetailControl.xaml.cs @@ -314,7 +314,7 @@ namespace ENI2.DetailViewControls haz.MARPOLPositions.Add(eld.MARPOL); this.dataGridMARPOLItems.Items.Refresh(); eld.MARPOL = new MARPOL_Annex_I_Position(); - eld.MARPOL.Identifier = DatabaseEntity.GetNewIdentifier(haz.MARPOLPositions, "MARPOL-"); + eld.Identifier = DatabaseEntity.GetNewIdentifier(haz.MARPOLPositions, "MARPOL-"); eld.MARPOL.HAZ = this.haz; this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -349,7 +349,7 @@ namespace ENI2.DetailViewControls this.dataGridMARPOLItems.Items.Refresh(); ebd.MARPOL = new MARPOL_Annex_I_Position(); ebd.MARPOL.HAZ = this.haz; - ebd.MARPOL.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.MARPOLPositions, "MARPOL-"); + ebd.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.MARPOLPositions, "MARPOL-"); this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -392,7 +392,7 @@ namespace ENI2.DetailViewControls haz.IMSBCPositions.Add(eld.IMSBC); this.dataGridIMSBCItems.Items.Refresh(); eld.IMSBC = new IMSBCPosition(); - eld.IMSBC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMSBCPositions, "IMSBC-"); + eld.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMSBCPositions, "IMSBC-"); eld.IMSBC.HAZ = this.haz; this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -426,7 +426,7 @@ namespace ENI2.DetailViewControls this.dataGridIMSBCItems.Items.Refresh(); ebd.IMSBC = new IMSBCPosition(); ebd.IMSBC.HAZ = this.haz; - ebd.IMSBC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMSBCPositions, "IMSBC-"); + ebd.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMSBCPositions, "IMSBC-"); this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -469,7 +469,7 @@ namespace ENI2.DetailViewControls haz.IGCPositions.Add(eld.IGC); this.dataGridIGCItems.Items.Refresh(); eld.IGC = new IGCPosition(); - eld.IGC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IGCPositions, "IGC-"); + eld.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IGCPositions, "IGC-"); eld.IGC.HAZ = this.haz; this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -503,7 +503,7 @@ namespace ENI2.DetailViewControls this.dataGridIGCItems.Items.Refresh(); ebd.IGC = new IGCPosition(); ebd.IGC.HAZ = this.haz; - ebd.IGC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IGCPositions, "IGC-"); + ebd.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IGCPositions, "IGC-"); this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -546,7 +546,7 @@ namespace ENI2.DetailViewControls haz.IBCPositions.Add(eld.IBC); this.dataGridIBCItems.Items.Refresh(); eld.IBC = new IBCPosition(); - eld.IBC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IBCPositions, "IBC-"); + eld.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IBCPositions, "IBC-"); eld.IBC.HAZ = this.haz; this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -580,7 +580,7 @@ namespace ENI2.DetailViewControls this.dataGridIBCItems.Items.Refresh(); ebd.IBC = new IBCPosition(); ebd.IBC.HAZ = this.haz; - ebd.IBC.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IBCPositions, "IBC-"); + ebd.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IBCPositions, "IBC-"); this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -623,7 +623,7 @@ namespace ENI2.DetailViewControls haz.IMDGPositions.Add(eld.IMDG); this.dataGridIMDGItems.Items.Refresh(); eld.IMDG = new IMDGPosition(); - eld.IMDG.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMDGPositions, "IMDG-"); + eld.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMDGPositions, "IMDG-"); eld.IMDG.HAZ = this.haz; this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; @@ -657,7 +657,7 @@ namespace ENI2.DetailViewControls this.dataGridIMDGItems.Items.Refresh(); ebd.IMDG = new IMDGPosition(); ebd.IMDG.HAZ = this.haz; - ebd.IMDG.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMDGPositions, "IMDG-"); + ebd.Identifier = DatabaseEntity.GetNewIdentifier(this.haz.IMDGPositions, "IMDG-"); this.SublistElementChanged(this.IsDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA); }; diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml.cs index b26f0e91..8c8258be 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailViewControls/MaritimeHealthDeclarationDetailControl.xaml.cs @@ -232,6 +232,7 @@ namespace ENI2.DetailViewControls ((DateTime.Now - l10fc.PortFacilityDateOfDeparture.Value).TotalDays < 31)) { PortOfCallLast30Days poc30 = new PortOfCallLast30Days(); + poc30.Identifier = PortOfCallLast30Days.GetNewIdentifier(this._mdh.PortOfCallLast30Days); poc30.PortOfCallLast30DaysCrewMembersJoined = false; poc30.PortOfCallLast30DaysDateOfDeparture = l10fc.PortFacilityDateOfDeparture; poc30.PortOfCallLast30DaysLocode = l10fc.PortFacilityPortLoCode; diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml b/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml index 4aed0479..73be64e5 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml +++ b/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml @@ -102,18 +102,6 @@ - - - - - - - - - - - - @@ -126,6 +114,18 @@ + + + + + + + + + + + + diff --git a/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml.cs b/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml.cs index 25839566..80d1d8ff 100644 --- a/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml.cs +++ b/ENI-2/ENI2/ENI2/DetailViewControls/WasteDetailControl.xaml.cs @@ -58,21 +58,20 @@ namespace ENI2.DetailViewControls private void buttonAddMissingEntries_Click(object sender, RoutedEventArgs e) { - bool changedWaste = false; // Convenience Methode, die fehlende Waste Einträge ergänzt (interessant bei "manuellen" Anmeldungen) - foreach(int wasteCode in WAS.DKWasteCodes) + foreach (int wasteCode in WAS.DKWasteCodes) { - bool codeFound = false; - foreach(Waste waste in this._was.Waste) + Waste foundWaste = null; + foreach (Waste waste in this._was.Waste) { - if(waste.WasteType.HasValue && waste.WasteType.Value == wasteCode) + if (waste.WasteType.HasValue && waste.WasteType.Value == wasteCode) { - codeFound = true; + foundWaste = waste; break; } } - if(!codeFound) + if (foundWaste == null) { Waste newWaste = new Waste(); newWaste.Identifier = DatabaseEntity.GetNewIdentifier(this._was.Waste); @@ -80,20 +79,28 @@ namespace ENI2.DetailViewControls newWaste.WasteAmountGeneratedTillNextPort_MTQ = 0; newWaste.WasteAmountRetained_MTQ = 0; newWaste.WasteCapacity_MTQ = 0; - newWaste.WasteDescription = ""; + newWaste.WasteDescription = (wasteCode == 1300) ? "-" : ""; newWaste.WasteDisposalAmount_MTQ = 0; newWaste.WasteDisposalPort = "ZZUKN"; newWaste.WasteDisposedAtLastPort_MTQ = 0; newWaste.WasteType = wasteCode; this._was.Waste.Add(newWaste); - changedWaste = true; + } + else + { + if (!foundWaste.WasteAmountGeneratedTillNextPort_MTQ.HasValue) foundWaste.WasteAmountGeneratedTillNextPort_MTQ = 0; + if (!foundWaste.WasteAmountRetained_MTQ.HasValue) foundWaste.WasteAmountRetained_MTQ = 0; + if (!foundWaste.WasteCapacity_MTQ.HasValue) foundWaste.WasteCapacity_MTQ = 0; + if ((wasteCode == 1300) && foundWaste.WasteDescription.IsNullOrEmpty()) foundWaste.WasteDescription = "-"; + if (!foundWaste.WasteDisposalAmount_MTQ.HasValue) foundWaste.WasteDisposalAmount_MTQ = 0; + if (foundWaste.WasteDisposalPort.IsNullOrEmpty()) foundWaste.WasteDisposalPort = "ZZUKN"; + if (!foundWaste.WasteDisposedAtLastPort_MTQ.HasValue) foundWaste.WasteDisposedAtLastPort_MTQ = 0; } } - if(changedWaste) - { - this.SublistElementChanged(Message.NotificationClass.WAS); - this.dataGridWaste.Items.Refresh(); - } + + this.SublistElementChanged(Message.NotificationClass.WAS); + this.dataGridWaste.Items.Refresh(); + } public override void Initialize() diff --git a/ENI-2/ENI2/ENI2/ENI2.csproj b/ENI-2/ENI2/ENI2/ENI2.csproj index f352e1d1..7f7bcd1a 100644 --- a/ENI-2/ENI2/ENI2/ENI2.csproj +++ b/ENI-2/ENI2/ENI2/ENI2.csproj @@ -36,7 +36,7 @@ true publish.html 0 - 3.7.4.%2a + 3.7.5.%2a false true true diff --git a/ENI-2/ENI2/ENI2/EditControls/EditIBCDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/EditIBCDialog.xaml.cs index 0bf70f6f..da4bbcac 100644 --- a/ENI-2/ENI2/ENI2/EditControls/EditIBCDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/EditIBCDialog.xaml.cs @@ -24,6 +24,8 @@ namespace ENI2.EditControls public IBCPosition IBC { get; set; } + public string Identifier { get { return this.textBoxIdentifier.Text; } set { this.textBoxIdentifier.Text = value; } } + private void EditIBCDialog_Loaded(object sender, RoutedEventArgs e) { this.textBoxFlashpoint.Text = this.IBC.Flashpoint_CEL; diff --git a/ENI-2/ENI2/ENI2/EditControls/EditIGCDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/EditIGCDialog.xaml.cs index d063d1bb..340a3d28 100644 --- a/ENI-2/ENI2/ENI2/EditControls/EditIGCDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/EditIGCDialog.xaml.cs @@ -24,6 +24,8 @@ namespace ENI2.EditControls public IGCPosition IGC { get; set; } + public string Identifier { get { return this.textBoxIdentifier.Text; } set { this.textBoxIdentifier.Text = value; } } + private void EditIGCDialog_Loaded(object sender, RoutedEventArgs e) { this.textBoxIdentifier.Text = this.IGC.Identifier; diff --git a/ENI-2/ENI2/ENI2/EditControls/EditIMDGDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/EditIMDGDialog.xaml.cs index 0c24d75c..a85a9fea 100644 --- a/ENI-2/ENI2/ENI2/EditControls/EditIMDGDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/EditIMDGDialog.xaml.cs @@ -24,6 +24,8 @@ namespace ENI2.EditControls public IMDGPosition IMDG { get; set; } + public string Identifier { get { return this.textBoxIdentifier.Text; } set { this.textBoxIdentifier.Text = value; } } + private void EditIMDGDialog_Loaded(object sender, RoutedEventArgs e) { this.textBoxClass7NuclideName.Text = this.IMDG.Class7NuclideName; diff --git a/ENI-2/ENI2/ENI2/EditControls/EditIMSBCDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/EditIMSBCDialog.xaml.cs index 5e486549..31ac39e1 100644 --- a/ENI-2/ENI2/ENI2/EditControls/EditIMSBCDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/EditIMSBCDialog.xaml.cs @@ -24,6 +24,8 @@ namespace ENI2.EditControls public IMSBCPosition IMSBC { get; set; } + public string Identifier { get { return this.textBoxIdentifier.Text; } set { this.textBoxIdentifier.Text = value; } } + private void EditIMSBCDialog_Loaded(object sender, RoutedEventArgs e) { this.textBoxBulkCargoShippingName.Text = this.IMSBC.BulkCargoShippingName; diff --git a/ENI-2/ENI2/ENI2/EditControls/EditMarpolDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/EditMarpolDialog.xaml.cs index 8ad483fb..bec085b6 100644 --- a/ENI-2/ENI2/ENI2/EditControls/EditMarpolDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/EditMarpolDialog.xaml.cs @@ -24,6 +24,8 @@ namespace ENI2.EditControls public MARPOL_Annex_I_Position MARPOL { get; set; } + public string Identifier { get { return this.textBoxIdentifier.Text; } set { this.textBoxIdentifier.Text = value; } } + private void EditMarpolDialog_Loaded(object sender, RoutedEventArgs e) { this.textBoxFlashpoint.Text = this.MARPOL.Flashpoint_CEL; diff --git a/ENI-2/ENI2/ENI2/EditControls/VisitIdDialog.xaml.cs b/ENI-2/ENI2/ENI2/EditControls/VisitIdDialog.xaml.cs index bc88fb11..49f6ab0a 100644 --- a/ENI-2/ENI2/ENI2/EditControls/VisitIdDialog.xaml.cs +++ b/ENI-2/ENI2/ENI2/EditControls/VisitIdDialog.xaml.cs @@ -29,6 +29,8 @@ namespace ENI2.EditControls this.OKClicked += VisitIdDialog_OKClicked; List> comboDataSource = new List>() { + new KeyValuePair( Message.NSWProvider.DBH, "DBH live" ), + new KeyValuePair( Message.NSWProvider.DBH_TEST, "DBH Testsystem" ), new KeyValuePair( Message.NSWProvider.DUDR, "HIS-Nord live" ), new KeyValuePair( Message.NSWProvider.DUDR_TEST, "HIS-Nord Testsystem" ) }; diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 6409aba25a6cddafa1deb1da15ed9b6e2d349123..a8059a94233201c847595c380d025a3d360ab6d2 100644 GIT binary patch delta 23421 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 diff --git a/nsw/Source/SendNSWMessageService/NSWSendService.cs b/nsw/Source/SendNSWMessageService/NSWSendService.cs index c997f2db..449e3b69 100644 --- a/nsw/Source/SendNSWMessageService/NSWSendService.cs +++ b/nsw/Source/SendNSWMessageService/NSWSendService.cs @@ -82,56 +82,190 @@ namespace SendNSWMessageService if (DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString)) { // Datenbank auf zu sendende Objekte überprüfen und laden - List coresMarkedForSending = DBManager.Instance.GetMessageCoresByStatus(MessageCore.BSMDStatus.TOSEND); foreach (MessageCore core in coresMarkedForSending) { - // TODO: Hier sollten jeweils die "neuesten" Nachrichten geladen werden, wenn es mehrere geben sollte!! List messages = DBManager.Instance.GetMessagesForCore(core, DBManager.MessageLoad.ALL); + List toSendMessageList = new List(); - // - // if (core.InitialHIS != Message.NSWProvider.DBH_TEST) continue; // ignore everything else + bool coreSendSucceeded = true; + bool didSendSomething = false; - if ((core.InitialHIS == Message.NSWProvider.DUDR) || (core.InitialHIS == Message.NSWProvider.DUDR_TEST)) + + // Wenn es noch keine Visit-ID gibt können keine Meldeklassen versendet werden. Die Visit/Transit Meldung wird daher dann + // "leer" versendet + + if ((core.IsTransit && core.TransitId.IsNullOrEmpty()) || (!core.IsTransit && core.VisitId.IsNullOrEmpty())) { - // HIS-NORD: alles auf einmal - - // Um Fehlern vorzubeugen wird jetzt nicht eine Datei erzeugt sondern für jede Meldeklasse eine einzelne - // (Wunsch CH vom 6.10.17). - bool sendSucceeded = true; - bool didSendSomething = false; - - // Fall: keine Meldeklasse aber trotzdem auf TO_SEND. Entweder beim Beantragen von Visit-Id's oder beim Storno der gesamten - // Anmeldung - if ((core.DisplayId.Length == 0) || (core.Cancelled ?? false)) + foreach (Message message in messages) { - sendSucceeded = bsmd.hisnord.Request.CreateSendFile(core, messages, (core.InitialHIS == Message.NSWProvider.DUDR_TEST)) ?? false; - } - else - { - foreach (Message message in messages) + if (((message.MessageNotificationClass == Message.NotificationClass.VISIT) && (!core.IsTransit)) || + ((message.MessageNotificationClass == Message.NotificationClass.TRANSIT) && (core.IsTransit))) { - bool? sendResult = bsmd.hisnord.Request.CreateSendFile(core, messages, (core.InitialHIS == Message.NSWProvider.DUDR_TEST)); - if (sendResult.HasValue) + if ((message.InternalStatus == Message.BSMDStatus.UNDEFINED) || + (message.InternalStatus == Message.BSMDStatus.PREPARE) || + (message.InternalStatus == Message.BSMDStatus.TOSEND)) { - didSendSomething = true; - if (!sendResult.Value) sendSucceeded = false; - } + _log.Debug("Visit/Transit not found, sending VISIT/TRANSIT message"); + if (message.HIS == Message.NSWProvider.UNDEFINED) + message.HIS = core.InitialHIS; + if (core.DefaultReportingPartyId.HasValue) message.ReportingPartyId = core.DefaultReportingPartyId; + toSendMessageList.Add(message); + } } - } - - if (!didSendSomething) core.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; // zurück zu neutral - else - { - if (!sendSucceeded) core.BSMDStatusInternal = MessageCore.BSMDStatus.FAILURE; - else core.BSMDStatusInternal = MessageCore.BSMDStatus.SENT; } - - _log.InfoFormat("HIS-Nord Send: Core {0} [{1}] new Status {2}", core.Id, core.IMO, core.BSMDStatusInternal.ToString()); - - DBManager.Instance.Save(core); } + else + { + // VISIT / TRANSIT Id vorhanden, Daten können übertragen werden + + foreach (Message message in messages) + { + // Update 5.10.17: Alles was nicht explizit auf "TOSEND" steht wird nicht verschickt! + if (message.InternalStatus != Message.BSMDStatus.TOSEND) continue; + + // "Virtuelle" Meldeklassen (bisher: DK) werden hier nicht versendet! + if ((message.MessageNotificationClass == Message.NotificationClass.STO) || + (message.MessageNotificationClass == Message.NotificationClass.CREWD) || + (message.MessageNotificationClass == Message.NotificationClass.PASD)) + continue; + + if ((message.MessageNotificationClass == Message.NotificationClass.VISIT) || + (message.MessageNotificationClass == Message.NotificationClass.TRANSIT)) + continue; + + if (!XtraSendLogic.ShouldSendMessage(message)) + { + message.InternalStatus = Message.BSMDStatus.SUSPENDED; + DBManager.Instance.Save(message); + continue; + } + + if (core.DefaultReportingPartyId.HasValue) + { + message.ReportingPartyId = core.DefaultReportingPartyId; // Referenz umbiegen + if (DBManager.Instance.GetReportingPartyDict().ContainsKey(core.DefaultReportingPartyId.Value)) // geladenes Objekt ersetzen + message.ReportingParty = DBManager.Instance.GetReportingPartyDict()[core.DefaultReportingPartyId.Value]; + } + + toSendMessageList.Add(message); + } + } + + foreach (Message message in toSendMessageList) + { + try + { + bool sendSucceeded = false; + + message.HIS = core.InitialHIS; + _log.InfoFormat("Sending {0} message to {1}", + message.MessageNotificationClass.ToString(), message.HIS.ToString()); + + // switch über passendes HIS / Schnittstelle + switch (message.HIS) + { + + case Message.NSWProvider.DBH: + case Message.NSWProvider.DBH_TEST: + sendSucceeded = bsmd.dbh.Request.SendMessage(message, (message.HIS == Message.NSWProvider.DBH_TEST)); + if (!sendSucceeded) + message.InternalStatus = Message.BSMDStatus.SEND_FAILED; + else + didSendSomething = true; + break; + case Message.NSWProvider.DAKOSY: + case Message.NSWProvider.DAKOSY_TEST: + sendSucceeded = bsmd.dakosy.Request.Send(message, true); + if (!sendSucceeded) message.InternalStatus = Message.BSMDStatus.SEND_FAILED; + else didSendSomething = true; + break; + case Message.NSWProvider.DUDR: + case Message.NSWProvider.DUDR_TEST: + bool? sendResult = bsmd.hisnord.Request.CreateSendFile(core, message, (core.InitialHIS == Message.NSWProvider.DUDR_TEST)); + if (sendResult.HasValue) + { + didSendSomething = true; + sendSucceeded = sendResult.Value; + } + break; + default: + _log.WarnFormat("Initial HIS not specified for message {0}", message.Id); + break; + } + + coreSendSucceeded &= sendSucceeded; + + if(sendSucceeded) + { + message.ChangedBy = ""; // Leeren nach RS mit CH: Sie möchte das Feld als Indikator "zu versenden" verwenden (ich war dagegen ;-) + message.InternalStatus = Message.BSMDStatus.SENT; + } + else + { + message.InternalStatus = Message.BSMDStatus.SEND_FAILED; + } + message.StatusInfo = ""; + message.SentAt = DateTime.Now; + DBManager.Instance.DeleteSystemErrors(message); + DBManager.Instance.Save(message); + } + catch (Exception ex) + { + _log.ErrorFormat("SENDING message {0}: {1}", message.Id.ToString(), ex.Message); + } + } + + if (didSendSomething) + { + // falls nur eine Nachricht gescheitert ist geht der Core auf SEND_FAILED, sonst FAILURE + core.BSMDStatusInternal = coreSendSucceeded ? MessageCore.BSMDStatus.SENT : MessageCore.BSMDStatus.FAILURE; + } + else + { + core.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; // aus irgendwelchen Gründen wurde nichts verschickt -> zurück auf PREPARE + } + DBManager.Instance.Save(core); + + + /* + if ((core.InitialHIS == Message.NSWProvider.DUDR) || (core.InitialHIS == Message.NSWProvider.DUDR_TEST)) + { + + bool sendSucceeded = true; + bool didSendSomething = false; + + // Fall: keine Meldeklasse aber trotzdem auf TO_SEND. Entweder beim Beantragen von Visit-Id's oder beim Storno der gesamten + // Anmeldung + if ((core.DisplayId.Length == 0) || (core.Cancelled ?? false)) + { + sendSucceeded = bsmd.hisnord.Request.CreateSendFile(core, messages, (core.InitialHIS == Message.NSWProvider.DUDR_TEST)) ?? false; + } + else + { + foreach (Message message in messages) + { + bool? sendResult = bsmd.hisnord.Request.CreateSendFile(core, message, (core.InitialHIS == Message.NSWProvider.DUDR_TEST)); + if (sendResult.HasValue) + { + didSendSomething = true; + if (!sendResult.Value) sendSucceeded = false; + } + } + } + + if (!didSendSomething) core.BSMDStatusInternal = MessageCore.BSMDStatus.PREPARE; // zurück zu neutral + else + { + if (!sendSucceeded) core.BSMDStatusInternal = MessageCore.BSMDStatus.FAILURE; + else core.BSMDStatusInternal = MessageCore.BSMDStatus.SENT; + } + + _log.InfoFormat("HIS-Nord Send: Core {0} [{1}] new Status {2}", core.Id, core.IMO, core.BSMDStatusInternal.ToString()); + + DBManager.Instance.Save(core); + } else { @@ -250,7 +384,7 @@ namespace SendNSWMessageService if (!sendSucceeded) message.InternalStatus = Message.BSMDStatus.SEND_FAILED; } - + break; case Message.NSWProvider.DAKOSY: @@ -302,16 +436,18 @@ namespace SendNSWMessageService } } + */ + + } bsmd.hisnord.transmitter.CallTransmitter(true); // bsmd.hisnord.transmitter.CallTransmitter(false); // wird aktuell nicht funktionieren // ob test oder nicht ist in stat. dict gespeicher - bsmd.hisnord.Request.ReadResponseFiles(); - bsmd.hisnord.Request.Clear(); + bsmd.hisnord.Request.ReadResponseFiles(); bsmd.hisnord.Response.ReadAnswers(true); - bsmd.hisnord.Response.ReadAnswers(false); + // bsmd.hisnord.Response.ReadAnswers(false); List coresMarkedForStatusQuery = DBManager.Instance.GetMessageCoresWithNSWStatusFlag(); diff --git a/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs b/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs index b4300d1d..55f09ed5 100644 --- a/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs +++ b/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs @@ -96,8 +96,9 @@ namespace bsmd.ExcelReadService results.Add(entry); } } - string query = string.Format("SELECT locodes.name, city_code, countries.code FROM locodes JOIN countries ON locodes.country_id = countries.ID WHERE locodes.port='t' AND (locodes.name like '{0}' OR locodes.name_wo_diacritics like '{0}')", city); + string query = "SELECT locodes.name, city_code, countries.code FROM locodes JOIN countries ON locodes.country_id = countries.ID WHERE locodes.port='t' AND (locodes.name like $PAR OR locodes.name_wo_diacritics like $PAR)"; SQLiteCommand cmd = new SQLiteCommand(query, _con); + cmd.Parameters.AddWithValue("$PAR", city); IDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs index 49319a95..e0806c49 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProductInfo.cs @@ -2,6 +2,6 @@ [assembly: AssemblyCompany("Informatikbüro Daniel Schick")] [assembly: AssemblyProduct("BSMD NSW interface")] -[assembly: AssemblyInformationalVersion("3.7.4")] +[assembly: AssemblyInformationalVersion("3.7.5")] [assembly: AssemblyCopyright("Copyright © 2014-2017 Informatikbüro Daniel Schick. All rights reserved.")] [assembly: AssemblyTrademark("")] \ No newline at end of file diff --git a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs index ed9e9c48..42a7ed3a 100644 --- a/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/nsw/Source/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("3.7.4.*")] +[assembly: AssemblyVersion("3.7.5.*")] diff --git a/nsw/Source/bsmd.database/SystemError.cs b/nsw/Source/bsmd.database/SystemError.cs index fd60bae9..c16fa5a3 100644 --- a/nsw/Source/bsmd.database/SystemError.cs +++ b/nsw/Source/bsmd.database/SystemError.cs @@ -100,14 +100,16 @@ namespace bsmd.database switch (filter) { case Message.LoadFilter.BY_CORE: - query += "WHERE MessageCoreId = @COREID"; + query += "WHERE MessageCoreId = @COREID AND Deleted = 0"; ((SqlCommand)cmd).Parameters.AddWithValue("@COREID", criteria[0]); break; case Message.LoadFilter.MESSAGEHEADER: - query += "WHERE MessageHeaderId = @MHID"; + query += "WHERE MessageHeaderId = @MHID AND Deleted = 0"; ((SqlCommand)cmd).Parameters.AddWithValue("@MHID", criteria[0]); break; case Message.LoadFilter.ALL: + query += "WHERE Deleted = 0"; + break; default: break; } diff --git a/nsw/Source/bsmd.dbh/Request.cs b/nsw/Source/bsmd.dbh/Request.cs index 10c892ba..302c71b6 100644 --- a/nsw/Source/bsmd.dbh/Request.cs +++ b/nsw/Source/bsmd.dbh/Request.cs @@ -42,8 +42,8 @@ namespace bsmd.dbh return false; } - message.StatusInfo = ""; // zurücksetzen analog zu HIS-Nord (5.10.17) - message.ChangedBy = ""; + // message.StatusInfo = ""; // zurücksetzen analog zu HIS-Nord (5.10.17) + // message.ChangedBy = ""; // map message to dbh NSWRequest object Dbh_Osis_Answ_Ws client = new Dbh_Osis_Answ_Ws(); diff --git a/nsw/Source/bsmd.hisnord/Request.cs b/nsw/Source/bsmd.hisnord/Request.cs index 1480aec5..147882f4 100644 --- a/nsw/Source/bsmd.hisnord/Request.cs +++ b/nsw/Source/bsmd.hisnord/Request.cs @@ -21,9 +21,9 @@ namespace bsmd.hisnord { private static ILog _log = LogManager.GetLogger(typeof(Request)); private static Dictionary _reportingPartyDict = null; - private static Dictionary coreFilenameDict = new Dictionary(); + private static Dictionary> coreFilenameDict = new Dictionary>(); private static Dictionary coreUseTestDict = new Dictionary(); - private static Dictionary noteMessageDict = new Dictionary(); + //private static Dictionary noteMessageDict = new Dictionary(); internal static Dictionary ReportingPartyDict { @@ -35,105 +35,53 @@ namespace bsmd.hisnord } return _reportingPartyDict; } - } - - public static void Clear() - { - coreFilenameDict.Clear(); - coreUseTestDict.Clear(); - } + } public static void ReadResponseFiles() { foreach (MessageCore core in coreFilenameDict.Keys) - { - transmitter.result theResult = transmitter.GetResult(coreFilenameDict[core], coreUseTestDict[core]); - if (theResult != null) - { - _log.InfoFormat("Result: Code {0} Detail {1} Message {2}", theResult.code, theResult.detail, theResult.message); - - if (theResult.code > 0) - { - core.BSMDStatusInternal = MessageCore.BSMDStatus.FAILURE; - - Message helperRefMessage = null; - if (core.IsTransit) - helperRefMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.TRANSIT); - else - helperRefMessage = DBManager.Instance.GetMessage(core, Message.NotificationClass.VISIT); - - SystemError se = new SystemError(); - se.ErrorCode = theResult.code; - se.ErrorMessage = theResult.message.Truncate(255); - se.ErrorDescription = theResult.detail.Truncate(255); - se.ErrorAt = DateTime.Now; - se.MessageCoreId = core.Id.Value; - if (helperRefMessage != null) - se.MessageHeaderId = helperRefMessage.Id; - - DBManager.Instance.Save(se); - } - else - { - core.BSMDStatusInternal = MessageCore.BSMDStatus.SENT; - } - DBManager.Instance.Save(core); - } - } - } - - /// - /// Passende Nachricht (unter bestimmten Voraussetzungen) aus dem Sende-Dict holen (aber nur wenn sie wirklich - /// in die Nachricht serialisiert werden darf) - /// - private static Message GetSendMessage(Message.NotificationClass notificationClass) - { - Message result = null; - - if (noteMessageDict.ContainsKey(notificationClass)) { - if (noteMessageDict[notificationClass].InternalStatus == Message.BSMDStatus.TOSEND) + List responseList = new List(); + + foreach (Message message in coreFilenameDict[core].Keys) { - // "leere" Nachrichten mit Listenelementen ausfiltern! - if (Message.IsListClass(notificationClass) && (noteMessageDict[notificationClass].Elements.Count == 0)) + transmitter.result theResult = transmitter.GetResult(coreFilenameDict[core][message], coreUseTestDict[core]); + if (theResult != null) { - _log.DebugFormat("skipping empty list class {0},", noteMessageDict[notificationClass].MessageNotificationClassDisplay); - noteMessageDict[notificationClass].StatusInfo = "Meldeklasse ist leer"; - noteMessageDict[notificationClass].InternalStatus = Message.BSMDStatus.SUSPENDED; - } - else - { - if (!XtraSendLogic.ShouldSendMessage(noteMessageDict[notificationClass])) + _log.InfoFormat("Result: Code {0} Detail {1} Message {2}", theResult.code, theResult.detail, theResult.message); + + if (theResult.code > 0) { - _log.DebugFormat("skipping {0}", noteMessageDict[notificationClass].MessageNotificationClassDisplay); - noteMessageDict[notificationClass].InternalStatus = Message.BSMDStatus.SUSPENDED; - } - else - { - _log.DebugFormat("preparing {0}", noteMessageDict[notificationClass].MessageNotificationClassDisplay); - noteMessageDict[notificationClass].StatusInfo = ""; - noteMessageDict[notificationClass].ChangedBy = ""; // Leeren nach RS mit CH: Sie möchte das Feld als Indikator "zu versenden" verwenden (ich war dagegen ;-) - noteMessageDict[notificationClass].InternalStatus = Message.BSMDStatus.SENT; - noteMessageDict[notificationClass].SentAt = DateTime.Now; - DBManager.Instance.DeleteSystemErrors(noteMessageDict[notificationClass]); - result = noteMessageDict[notificationClass]; + core.BSMDStatusInternal = MessageCore.BSMDStatus.FAILURE; + DBManager.Instance.Save(core); + message.InternalStatus = Message.BSMDStatus.SEND_FAILED; + DBManager.Instance.Save(message); + + SystemError se = new SystemError(); + se.ErrorCode = theResult.code; + se.ErrorMessage = theResult.message.Truncate(255); + se.ErrorDescription = theResult.detail.Truncate(255); + se.ErrorAt = DateTime.Now; + se.MessageCoreId = core.Id.Value; + se.MessageHeaderId = message.Id; + + DBManager.Instance.Save(se); } + + + responseList.Add(message); } - DBManager.Instance.Save(noteMessageDict[notificationClass]); } + + foreach (Message removeMessage in responseList) + coreFilenameDict[core].Remove(removeMessage); + } - return result; - } + } - public static bool? CreateSendFile(MessageCore core, List messages, bool useTest) + public static bool? CreateSendFile(MessageCore core, Message message, bool useTest) { - bool? retval = null; - bool containsData = false; - - // dieses Dict wird benötigt, da die Meldeklassen in der richtigen Reihenfolge hinzugefügt werden müssen - Request.noteMessageDict.Clear(); - foreach (Message message in messages) - noteMessageDict[message.MessageNotificationClass] = message; + bool? retval = null; try { @@ -202,17 +150,13 @@ namespace bsmd.hisnord _nsw.conveyance.Items[2] = core.PoC; _nsw.conveyance.ItemsElementName[2] = ItemsChoiceType.PortOfCall; _nsw.conveyance.Items[3] = core.IsTransit ? core.ETAKielCanal : core.ETA; // TODO Datum konvertieren? - _nsw.conveyance.ItemsElementName[3] = ItemsChoiceType.ETAPortOfCall; - containsData = true; + _nsw.conveyance.ItemsElementName[3] = ItemsChoiceType.ETAPortOfCall; } #endregion #region NSW message area - Message visitTransitHeader = null; - Message message = null; - // wir wissen noch nicht wieviele es werden, von daher erstmal eine Liste! List items1ChoiceType = new List(); List items1 = new List(); @@ -221,33 +165,16 @@ namespace bsmd.hisnord { // nur das "STORNO" Element hinzufügen items1ChoiceType.Add(Items1ChoiceType.STORNO); - items1.Add(ytype.Y); - containsData = true; + items1.Add(ytype.Y); } else - { - - if(!core.IsTransit) - { - message = GetSendMessage(Message.NotificationClass.VISIT); - if (message != null) - - visitTransitHeader = message; - } - else - { - message = GetSendMessage(Message.NotificationClass.TRANSIT); - if (message != null) - - visitTransitHeader = message; - } + { #region STAT - message = GetSendMessage(Message.NotificationClass.STAT); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.STAT) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_STAT); @@ -290,10 +217,9 @@ namespace bsmd.hisnord #endregion #region NOA_NOD - message = GetSendMessage(Message.NotificationClass.NOA_NOD); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.NOA_NOD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_NOANOD); @@ -345,13 +271,10 @@ namespace bsmd.hisnord } #endregion - #region ATA/ATD + #region ATA / ATD - message = GetSendMessage(Message.NotificationClass.ATA); - - if (message != null) - { - containsData = true; + if (message.MessageNotificationClass == Message.NotificationClass.ATA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_ATA); @@ -365,14 +288,11 @@ namespace bsmd.hisnord items1ChoiceType.Add(Items1ChoiceType.ATA); items1.Add(ata.ATAPortOfCall); } - } - } + } } + - message = GetSendMessage(Message.NotificationClass.ATD); - - if (message != null) - { - containsData = true; + if (message.MessageNotificationClass == Message.NotificationClass.ATD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_ATD); @@ -392,10 +312,9 @@ namespace bsmd.hisnord #endregion #region POBA - message = GetSendMessage(Message.NotificationClass.POBA); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.POBA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_POBA); @@ -418,13 +337,13 @@ namespace bsmd.hisnord } } } + #endregion #region POBD - message = GetSendMessage(Message.NotificationClass.POBD); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.POBD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_POBD); @@ -447,13 +366,13 @@ namespace bsmd.hisnord } } } + #endregion #region NAME - message = GetSendMessage(Message.NotificationClass.NAME); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.NAME) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_NameOfMaster); @@ -469,13 +388,13 @@ namespace bsmd.hisnord } } } + #endregion - #region TIEFA - message = GetSendMessage(Message.NotificationClass.TIEFA); - if (message != null) - { - containsData = true; + #region TIEFA / TIEFD + + if (message.MessageNotificationClass == Message.NotificationClass.TIEFA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_TIEFA); @@ -495,11 +414,9 @@ namespace bsmd.hisnord } } } - - message = GetSendMessage(Message.NotificationClass.TIEFD); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.TIEFD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_TIEFD); @@ -522,10 +439,9 @@ namespace bsmd.hisnord #endregion #region INFO - message = GetSendMessage(Message.NotificationClass.INFO); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.INFO) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_INFO); @@ -560,14 +476,13 @@ namespace bsmd.hisnord } } } + #endregion - #region BKRA/BKRD + #region BKRA / BKRD - message = GetSendMessage(Message.NotificationClass.BKRA); - - if (message != null) { - containsData = true; + if (message.MessageNotificationClass == Message.NotificationClass.BKRA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_BKRA); @@ -590,12 +505,10 @@ namespace bsmd.hisnord items1.Add(hn_bkra); } } - } - - message = GetSendMessage(Message.NotificationClass.BKRD); - if (message != null) { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.BKRD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_BKRD); @@ -622,12 +535,10 @@ namespace bsmd.hisnord #endregion - #region HAZ - - message = GetSendMessage(Message.NotificationClass.HAZA); - if (message != null) - { - containsData = true; + #region HAZA / HAZD + + if (message.MessageNotificationClass == Message.NotificationClass.HAZA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_HAZA); @@ -687,11 +598,9 @@ namespace bsmd.hisnord } } } - - message = GetSendMessage(Message.NotificationClass.HAZD); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.HAZD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_HAZD); @@ -754,10 +663,9 @@ namespace bsmd.hisnord #endregion #region LADG - message = GetSendMessage(Message.NotificationClass.LADG); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.LADG) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_LADG); @@ -794,13 +702,13 @@ namespace bsmd.hisnord } } } + #endregion #region SERV - message = GetSendMessage(Message.NotificationClass.SERV); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.SERV) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_SERV); @@ -827,13 +735,13 @@ namespace bsmd.hisnord } } } + #endregion #region PRE72H - message = GetSendMessage(Message.NotificationClass.PRE72H); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.PRE72H) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_PRE72H); @@ -876,13 +784,13 @@ namespace bsmd.hisnord } } } + #endregion #region SEC - message = GetSendMessage(Message.NotificationClass.SEC); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.SEC) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_SEC); @@ -1040,13 +948,13 @@ namespace bsmd.hisnord } } } + #endregion #region MDH - message = GetSendMessage(Message.NotificationClass.MDH); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.MDH) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_MDH); @@ -1204,13 +1112,13 @@ namespace bsmd.hisnord } } } + #endregion #region WAS - message = GetSendMessage(Message.NotificationClass.WAS); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.WAS) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_WAS); @@ -1309,10 +1217,9 @@ namespace bsmd.hisnord #endregion #region BPOL - message = GetSendMessage(Message.NotificationClass.BPOL); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.BPOL) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_BPOL); @@ -1345,13 +1252,13 @@ namespace bsmd.hisnord } } } + #endregion #region PAS - message = GetSendMessage(Message.NotificationClass.PAS); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.PAS) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_PAS); @@ -1394,12 +1301,13 @@ namespace bsmd.hisnord } } } + #endregion #region CREW - message = GetSendMessage(Message.NotificationClass.CREW); - if (message != null) { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.CREW) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_CREW); @@ -1436,13 +1344,13 @@ namespace bsmd.hisnord } } } + #endregion - #region TOWA/TOWD - message = GetSendMessage(Message.NotificationClass.TOWA); - if (message != null) - { - containsData = true; + #region TOWA / TOWD + + if (message.MessageNotificationClass == Message.NotificationClass.TOWA) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_TOWA); @@ -1503,11 +1411,9 @@ namespace bsmd.hisnord } } } - - message = GetSendMessage(Message.NotificationClass.TOWD); - if (message != null) - { - containsData = true; + + if (message.MessageNotificationClass == Message.NotificationClass.TOWD) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_TOWD); @@ -1565,15 +1471,13 @@ namespace bsmd.hisnord } } } + #endregion - #region AGNT + #region AGNT - message = GetSendMessage(Message.NotificationClass.AGNT); - - if (message != null) - { - containsData = true; + if (message.MessageNotificationClass == Message.NotificationClass.AGNT) + { if (message.Reset) { items1ChoiceType.Add(Items1ChoiceType.RESET_AGNT); @@ -1613,27 +1517,27 @@ namespace bsmd.hisnord #region serialize and save message - if (containsData) + + string outputDir = Path.Combine(useTest ? Properties.Settings.Default.TestTransmitterRoot : Properties.Settings.Default.LiveTransmitterRoot, + Properties.Settings.Default.OutputDir); + + string filename = string.Format("BSMD_{1}-{2}-{0}.xml", message.MessageNotificationClassDisplay, DateTime.Now.ToString("yyyyMMddHHmmss"), core.Id.Value); + _log.InfoFormat("saving {0} to output directory", filename); + + string filePath = Path.Combine(outputDir, filename); + XmlSerializer serializer = new XmlSerializer(typeof(nsw)); + using (TextWriter tw = new StreamWriter(filePath)) { - string outputDir = Path.Combine(useTest ? Properties.Settings.Default.TestTransmitterRoot : Properties.Settings.Default.LiveTransmitterRoot, - Properties.Settings.Default.OutputDir); - - string filename = string.Format("BSMD_{0}-{1}.xml", DateTime.Now.ToString("yyyyMMddHHmmss"), core.Id.Value); - _log.InfoFormat("saving {0} to output directory", filename); - - string filePath = Path.Combine(outputDir, filename); - XmlSerializer serializer = new XmlSerializer(typeof(nsw)); - using (TextWriter tw = new StreamWriter(filePath)) - { - serializer.Serialize(tw, _nsw); - } - - coreFilenameDict[core] = filename; - coreUseTestDict[core] = useTest; - - retval = true; + serializer.Serialize(tw, _nsw); } + if (!coreFilenameDict.ContainsKey(core)) + coreFilenameDict[core] = new Dictionary(); + coreFilenameDict[core][message] = filename; + + coreUseTestDict[core] = useTest; + retval = true; + #endregion } @@ -1714,7 +1618,8 @@ namespace bsmd.hisnord if (pi.GeneralCargoIBCSpecified) pi.GeneralCargoIBC = imdgPosition.GeneralCargoIBC.Value ? yorntype.Y : yorntype.N; pi.ContainerNumber = imdgPosition.ContainerNumber; - pi.VehicleLicenseNumber = imdgPosition.VehicleLicenseNumber; + if(!imdgPosition.VehicleLicenseNumber.IsNullOrEmpty()) + pi.VehicleLicenseNumber = imdgPosition.VehicleLicenseNumber; if(!imdgPosition.StowagePosition.IsNullOrEmpty()) { pi.Item = imdgPosition.StowagePosition;