Version 3.7.5: Einzelnachrichtenversand für HIS-Nord, Vereinheitlichung der Sende.Logik im NSWSendService

This commit is contained in:
Daniel Schick 2017-10-10 06:36:05 +00:00
parent 938b760951
commit 4e7d1251b9
19 changed files with 396 additions and 332 deletions

View File

@ -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);
};

View File

@ -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;

View File

@ -102,18 +102,6 @@
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn IsReadOnly="True" Width="0.12*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{x:Static p:Resources.textWasteAmountDischargedLastPort}" FontSize="9"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock TextAlignment="Center" Text="{Binding WasteDisposedAtLastPort_MTQ, StringFormat={}{0:N3}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn IsReadOnly="True" Width="0.12*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
@ -126,6 +114,18 @@
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn IsReadOnly="True" Width="0.12*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{x:Static p:Resources.textWasteAmountDischargedLastPort}" FontSize="9"/>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock TextAlignment="Center" Text="{Binding WasteDisposedAtLastPort_MTQ, StringFormat={}{0:N3}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</enictrl:ENIDataGrid>

View File

@ -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;
}
}
if(changedWaste)
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;
}
}
this.SublistElementChanged(Message.NotificationClass.WAS);
this.dataGridWaste.Items.Refresh();
}
}
public override void Initialize()

View File

@ -36,7 +36,7 @@
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.html</WebPage>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>3.7.4.%2a</ApplicationVersion>
<ApplicationVersion>3.7.5.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>
<PublishWizardCompleted>true</PublishWizardCompleted>

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -29,6 +29,8 @@ namespace ENI2.EditControls
this.OKClicked += VisitIdDialog_OKClicked;
List<KeyValuePair<bsmd.database.Message.NSWProvider, string>> comboDataSource = new List<KeyValuePair<bsmd.database.Message.NSWProvider, string>>()
{
new KeyValuePair<bsmd.database.Message.NSWProvider, string>( Message.NSWProvider.DBH, "DBH live" ),
new KeyValuePair<bsmd.database.Message.NSWProvider, string>( Message.NSWProvider.DBH_TEST, "DBH Testsystem" ),
new KeyValuePair<bsmd.database.Message.NSWProvider, string>( Message.NSWProvider.DUDR, "HIS-Nord live" ),
new KeyValuePair<bsmd.database.Message.NSWProvider, string>( Message.NSWProvider.DUDR_TEST, "HIS-Nord Testsystem" )
};

Binary file not shown.

View File

@ -82,23 +82,157 @@ namespace SendNSWMessageService
if (DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString))
{
// Datenbank auf zu sendende Objekte überprüfen und laden
List<MessageCore> 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<Message> messages = DBManager.Instance.GetMessagesForCore(core, DBManager.MessageLoad.ALL);
List<Message> toSendMessageList = new List<Message>();
//
// if (core.InitialHIS != Message.NSWProvider.DBH_TEST) continue; // ignore everything else
bool coreSendSucceeded = true;
bool didSendSomething = false;
// 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()))
{
foreach (Message message in messages)
{
if (((message.MessageNotificationClass == Message.NotificationClass.VISIT) && (!core.IsTransit)) ||
((message.MessageNotificationClass == Message.NotificationClass.TRANSIT) && (core.IsTransit)))
{
if ((message.InternalStatus == Message.BSMDStatus.UNDEFINED) ||
(message.InternalStatus == Message.BSMDStatus.PREPARE) ||
(message.InternalStatus == Message.BSMDStatus.TOSEND))
{
_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);
}
}
}
}
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))
{
// 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;
@ -112,7 +246,7 @@ namespace SendNSWMessageService
{
foreach (Message message in messages)
{
bool? sendResult = bsmd.hisnord.Request.CreateSendFile(core, messages, (core.InitialHIS == Message.NSWProvider.DUDR_TEST));
bool? sendResult = bsmd.hisnord.Request.CreateSendFile(core, message, (core.InitialHIS == Message.NSWProvider.DUDR_TEST));
if (sendResult.HasValue)
{
didSendSomething = true;
@ -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.Response.ReadAnswers(true);
bsmd.hisnord.Response.ReadAnswers(false);
// bsmd.hisnord.Response.ReadAnswers(false);
List<MessageCore> coresMarkedForStatusQuery = DBManager.Instance.GetMessageCoresWithNSWStatusFlag();

View File

@ -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())
{

View File

@ -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("")]

View File

@ -1,4 +1,4 @@
using System.Reflection;
[assembly: AssemblyVersion("3.7.4.*")]
[assembly: AssemblyVersion("3.7.5.*")]

View File

@ -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;
}

View File

@ -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();

View File

@ -21,9 +21,9 @@ namespace bsmd.hisnord
{
private static ILog _log = LogManager.GetLogger(typeof(Request));
private static Dictionary<Guid, ReportingParty> _reportingPartyDict = null;
private static Dictionary<MessageCore, string> coreFilenameDict = new Dictionary<MessageCore, string>();
private static Dictionary<MessageCore, Dictionary<Message, string>> coreFilenameDict = new Dictionary<MessageCore, Dictionary<Message,string>>();
private static Dictionary<MessageCore, bool> coreUseTestDict = new Dictionary<MessageCore, bool>();
private static Dictionary<Message.NotificationClass, Message> noteMessageDict = new Dictionary<Message.NotificationClass, Message>();
//private static Dictionary<Message.NotificationClass, Message> noteMessageDict = new Dictionary<Message.NotificationClass, Message>();
internal static Dictionary<Guid, ReportingParty> ReportingPartyDict
{
@ -37,17 +37,15 @@ namespace bsmd.hisnord
}
}
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]);
List<Message> responseList = new List<Message>();
foreach (Message message in coreFilenameDict[core].Keys)
{
transmitter.result theResult = transmitter.GetResult(coreFilenameDict[core][message], coreUseTestDict[core]);
if (theResult != null)
{
_log.InfoFormat("Result: Code {0} Detail {1} Message {2}", theResult.code, theResult.detail, theResult.message);
@ -55,12 +53,9 @@ namespace bsmd.hisnord
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);
DBManager.Instance.Save(core);
message.InternalStatus = Message.BSMDStatus.SEND_FAILED;
DBManager.Instance.Save(message);
SystemError se = new SystemError();
se.ErrorCode = theResult.code;
@ -68,72 +63,25 @@ namespace bsmd.hisnord
se.ErrorDescription = theResult.detail.Truncate(255);
se.ErrorAt = DateTime.Now;
se.MessageCoreId = core.Id.Value;
if (helperRefMessage != null)
se.MessageHeaderId = helperRefMessage.Id;
se.MessageHeaderId = message.Id;
DBManager.Instance.Save(se);
}
else
{
core.BSMDStatusInternal = MessageCore.BSMDStatus.SENT;
}
DBManager.Instance.Save(core);
}
responseList.Add(message);
}
}
/// <summary>
/// Passende Nachricht (unter bestimmten Voraussetzungen) aus dem Sende-Dict holen (aber nur wenn sie wirklich
/// in die Nachricht serialisiert werden darf)
/// </summary>
private static Message GetSendMessage(Message.NotificationClass notificationClass)
{
Message result = null;
foreach (Message removeMessage in responseList)
coreFilenameDict[core].Remove(removeMessage);
if (noteMessageDict.ContainsKey(notificationClass))
{
if (noteMessageDict[notificationClass].InternalStatus == Message.BSMDStatus.TOSEND)
{
// "leere" Nachrichten mit Listenelementen ausfiltern!
if (Message.IsListClass(notificationClass) && (noteMessageDict[notificationClass].Elements.Count == 0))
{
_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.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];
}
}
DBManager.Instance.Save(noteMessageDict[notificationClass]);
}
}
return result;
}
public static bool? CreateSendFile(MessageCore core, List<Message> 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;
try
{
@ -203,16 +151,12 @@ namespace bsmd.hisnord
_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;
}
#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> items1ChoiceType = new List<Items1ChoiceType>();
List<object> items1 = new List<object>();
@ -222,32 +166,15 @@ namespace bsmd.hisnord
// nur das "STORNO" Element hinzufügen
items1ChoiceType.Add(Items1ChoiceType.STORNO);
items1.Add(ytype.Y);
containsData = true;
}
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)
if (message.MessageNotificationClass == Message.NotificationClass.STAT)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.NOA_NOD)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.ATA)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.ATD)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.POBA)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.POBD)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.NAME)
{
containsData = true;
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)
#region TIEFA / TIEFD
if (message.MessageNotificationClass == Message.NotificationClass.TIEFA)
{
containsData = true;
if (message.Reset)
{
items1ChoiceType.Add(Items1ChoiceType.RESET_TIEFA);
@ -496,10 +415,8 @@ namespace bsmd.hisnord
}
}
message = GetSendMessage(Message.NotificationClass.TIEFD);
if (message != null)
if (message.MessageNotificationClass == Message.NotificationClass.TIEFD)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.INFO)
{
containsData = true;
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
#region HAZA / HAZD
message = GetSendMessage(Message.NotificationClass.HAZA);
if (message != null)
if (message.MessageNotificationClass == Message.NotificationClass.HAZA)
{
containsData = true;
if (message.Reset)
{
items1ChoiceType.Add(Items1ChoiceType.RESET_HAZA);
@ -688,10 +599,8 @@ namespace bsmd.hisnord
}
}
message = GetSendMessage(Message.NotificationClass.HAZD);
if (message != null)
if (message.MessageNotificationClass == Message.NotificationClass.HAZD)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.LADG)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.SERV)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.PRE72H)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.SEC)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.MDH)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.WAS)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.BPOL)
{
containsData = true;
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)
if (message.MessageNotificationClass == Message.NotificationClass.PAS)
{
containsData = true;
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)
#region TOWA / TOWD
if (message.MessageNotificationClass == Message.NotificationClass.TOWA)
{
containsData = true;
if (message.Reset)
{
items1ChoiceType.Add(Items1ChoiceType.RESET_TOWA);
@ -1504,10 +1412,8 @@ namespace bsmd.hisnord
}
}
message = GetSendMessage(Message.NotificationClass.TOWD);
if (message != null)
if (message.MessageNotificationClass == Message.NotificationClass.TOWD)
{
containsData = true;
if (message.Reset)
{
items1ChoiceType.Add(Items1ChoiceType.RESET_TOWD);
@ -1565,15 +1471,13 @@ namespace bsmd.hisnord
}
}
}
#endregion
#region AGNT
message = GetSendMessage(Message.NotificationClass.AGNT);
if (message != null)
if (message.MessageNotificationClass == Message.NotificationClass.AGNT)
{
containsData = true;
if (message.Reset)
{
items1ChoiceType.Add(Items1ChoiceType.RESET_AGNT);
@ -1613,12 +1517,11 @@ 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_{0}-{1}.xml", DateTime.Now.ToString("yyyyMMddHHmmss"), core.Id.Value);
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);
@ -1628,11 +1531,12 @@ namespace bsmd.hisnord
serializer.Serialize(tw, _nsw);
}
coreFilenameDict[core] = filename;
coreUseTestDict[core] = useTest;
if (!coreFilenameDict.ContainsKey(core))
coreFilenameDict[core] = new Dictionary<Message, string>();
coreFilenameDict[core][message] = filename;
coreUseTestDict[core] = useTest;
retval = true;
}
#endregion
@ -1714,6 +1618,7 @@ namespace bsmd.hisnord
if (pi.GeneralCargoIBCSpecified)
pi.GeneralCargoIBC = imdgPosition.GeneralCargoIBC.Value ? yorntype.Y : yorntype.N;
pi.ContainerNumber = imdgPosition.ContainerNumber;
if(!imdgPosition.VehicleLicenseNumber.IsNullOrEmpty())
pi.VehicleLicenseNumber = imdgPosition.VehicleLicenseNumber;
if(!imdgPosition.StowagePosition.IsNullOrEmpty())
{