weitere Bugs bei der Übertragung erschlagen
This commit is contained in:
parent
f0d3f5cbb1
commit
09220f1b9a
@ -45,7 +45,7 @@ namespace bsmd.dakosy
|
|||||||
File.Delete(inputFile); // alternativ: move to archive folder
|
File.Delete(inputFile); // alternativ: move to archive folder
|
||||||
}
|
}
|
||||||
// remote Dateien löschen
|
// remote Dateien löschen
|
||||||
SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile));
|
SFtp.RemoveProcessedFile(remoteDir, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -140,7 +140,7 @@ namespace bsmd.dakosy
|
|||||||
winscp.WaitForExit();
|
winscp.WaitForExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RemoveProcessedFile(string remoteDir, string filename)
|
public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName)
|
||||||
{
|
{
|
||||||
Process winscp = new Process();
|
Process winscp = new Process();
|
||||||
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
|
winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath;
|
||||||
@ -155,12 +155,18 @@ namespace bsmd.dakosy
|
|||||||
// Feed in the scripting commands
|
// Feed in the scripting commands
|
||||||
winscp.StandardInput.WriteLine("option batch abort");
|
winscp.StandardInput.WriteLine("option batch abort");
|
||||||
winscp.StandardInput.WriteLine("option confirm off");
|
winscp.StandardInput.WriteLine("option confirm off");
|
||||||
winscp.StandardInput.WriteLine("open " + Properties.Settings.Default.SFTPSessionName);
|
winscp.StandardInput.WriteLine("open " + sessionName);
|
||||||
|
|
||||||
// winscp.StandardInput.WriteLine("ls");
|
// winscp.StandardInput.WriteLine("ls");
|
||||||
if (remoteDir != null)
|
if (remoteDir != null)
|
||||||
winscp.StandardInput.WriteLine("cd " + remoteDir);
|
winscp.StandardInput.WriteLine("cd " + remoteDir);
|
||||||
winscp.StandardInput.WriteLine("rm " + filename);
|
winscp.StandardInput.WriteLine("rm " + filename);
|
||||||
|
if (remoteDir != null)
|
||||||
|
{
|
||||||
|
// move back up since winscp session remembers the last folder
|
||||||
|
winscp.StandardInput.WriteLine("cd ..");
|
||||||
|
winscp.StandardInput.WriteLine("cd ..");
|
||||||
|
}
|
||||||
winscp.StandardInput.Close();
|
winscp.StandardInput.Close();
|
||||||
|
|
||||||
// Collect all output
|
// Collect all output
|
||||||
|
|||||||
@ -107,7 +107,7 @@ namespace bsmd.dbh
|
|||||||
File.Move(inputFile, archivePath);
|
File.Move(inputFile, archivePath);
|
||||||
}
|
}
|
||||||
// remote Dateien löschen
|
// remote Dateien löschen
|
||||||
bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile));
|
bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -60,14 +60,22 @@ namespace bsmd.dbh
|
|||||||
root.ItemElementName = ItemChoiceType2.TransitId;
|
root.ItemElementName = ItemChoiceType2.TransitId;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.Reset)
|
if(core.Cancelled ?? false)
|
||||||
|
{
|
||||||
|
root.Type = RootType.CANCEL;
|
||||||
|
}
|
||||||
|
else if (message.Reset)
|
||||||
{
|
{
|
||||||
RootReportingClassesToReset rrctr = new RootReportingClassesToReset();
|
RootReportingClassesToReset rrctr = new RootReportingClassesToReset();
|
||||||
rrctr.ReportingClassToReset = new string[1];
|
rrctr.ReportingClassToReset = new string[1];
|
||||||
rrctr.ReportingClassToReset[0] = message.MessageNotificationClassDisplay;
|
rrctr.ReportingClassToReset[0] = message.MessageNotificationClassDisplay;
|
||||||
|
root.Items = new object[0];
|
||||||
|
root.Items[0] = rrctr;
|
||||||
|
root.Type = RootType.RESET;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
root.Type = RootType.DATA;
|
||||||
switch (message.MessageNotificationClass)
|
switch (message.MessageNotificationClass)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -118,7 +126,6 @@ namespace bsmd.dbh
|
|||||||
|
|
||||||
#region STAT
|
#region STAT
|
||||||
case Message.NotificationClass.STAT:
|
case Message.NotificationClass.STAT:
|
||||||
root.Type = RootType.DATA;
|
|
||||||
RootSTAT rootStat = new RootSTAT();
|
RootSTAT rootStat = new RootSTAT();
|
||||||
STAT stat = message.Elements[0] as STAT;
|
STAT stat = message.Elements[0] as STAT;
|
||||||
rootStat.ShipName = stat.ShipName;
|
rootStat.ShipName = stat.ShipName;
|
||||||
|
|||||||
@ -34,6 +34,9 @@ namespace bsmd.dbh
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Achtung! Die laufende Nummer der rücklaufenden Datei ist _nicht_ dieselbe und kann zur Identifikation der Meldeklasse
|
||||||
|
// nicht verwendet werden
|
||||||
|
|
||||||
string fileSeqString = m.Groups[1].Value;
|
string fileSeqString = m.Groups[1].Value;
|
||||||
|
|
||||||
if(!Int32.TryParse(fileSeqString, out int fileSeqNum))
|
if(!Int32.TryParse(fileSeqString, out int fileSeqNum))
|
||||||
@ -42,23 +45,7 @@ namespace bsmd.dbh
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// load message(s?) by file seq string
|
|
||||||
Message sentMessage = DBManager.Instance.GetMessageByFileSeqNum(fileSeqNum);
|
|
||||||
if(sentMessage == null)
|
|
||||||
{
|
|
||||||
_log.ErrorFormat("cannot find a message for file sequence number {0}", fileSeqNum);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageCore aCore = DBManager.Instance.GetMessageCoreById(sentMessage.MessageCoreId.Value);
|
|
||||||
if(aCore == null)
|
|
||||||
{
|
|
||||||
_log.ErrorFormat("There is no core with id {0}", sentMessage.MessageCoreId.Value);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bsmd.dbh.Response.Root root = null;
|
bsmd.dbh.Response.Root root = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
XmlSerializer serializer = new XmlSerializer(typeof(bsmd.dbh.Response.Root));
|
XmlSerializer serializer = new XmlSerializer(typeof(bsmd.dbh.Response.Root));
|
||||||
@ -67,44 +54,133 @@ namespace bsmd.dbh
|
|||||||
root = (bsmd.dbh.Response.Root) serializer.Deserialize(s);
|
root = (bsmd.dbh.Response.Root) serializer.Deserialize(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Message sentMessage = null;
|
||||||
|
MessageCore aCore = null;
|
||||||
|
|
||||||
if(Guid.TryParse(root.SenderReference, out Guid refGuid))
|
if(Guid.TryParse(root.SenderReference, out Guid refGuid))
|
||||||
{
|
{
|
||||||
if (!sentMessage.Id.Equals(refGuid))
|
// load message(s?) by file seq string
|
||||||
_log.WarnFormat("sender ref {0} does not match sent message id {1}", refGuid, sentMessage.Id);
|
sentMessage = DBManager.Instance.GetMessageById(refGuid) as Message;
|
||||||
|
if (sentMessage == null)
|
||||||
|
{
|
||||||
|
_log.ErrorFormat("cannot find a message for file sequence number {0}", fileSeqNum);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
aCore = DBManager.Instance.GetMessageCoreById(sentMessage.MessageCoreId.Value);
|
||||||
|
if (aCore == null)
|
||||||
|
{
|
||||||
|
_log.ErrorFormat("There is no core with id {0}", sentMessage.MessageCoreId.Value);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_log.WarnFormat("sender ref {0} is no guid", root.SenderReference);
|
_log.ErrorFormat("sender ref {0} is no guid", root.SenderReference);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(sentMessage.MessageNotificationClass)
|
switch(root.Type)
|
||||||
{
|
|
||||||
case Message.NotificationClass.VISIT:
|
|
||||||
if(root.Type == Response.RootType.VISIT)
|
|
||||||
{
|
{
|
||||||
|
case Response.RootType.VISIT:
|
||||||
if (aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty())
|
if (aCore.VisitId.IsNullOrEmpty() && !root.VisitId.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
aCore.VisitId = root.VisitId;
|
aCore.VisitId = root.VisitId;
|
||||||
|
sentMessage.SendSuccess = true;
|
||||||
|
sentMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
|
||||||
_log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id);
|
_log.InfoFormat("Received Visit-Id {0} for core {1}", root.VisitId, aCore.Id);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case Message.NotificationClass.TRANSIT:
|
case Response.RootType.TRANSIT:
|
||||||
if (root.Type == Response.RootType.TRANSIT)
|
|
||||||
{
|
|
||||||
if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty())
|
if (aCore.TransitId.IsNullOrEmpty() && !root.TransitId.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
aCore.TransitId = root.TransitId;
|
aCore.TransitId = root.TransitId;
|
||||||
|
sentMessage.SendSuccess = true;
|
||||||
|
sentMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
|
||||||
_log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id);
|
_log.InfoFormat("Received Transit-Id {0} for core {1}", root.TransitId, aCore.Id);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case Response.RootType.DATA:
|
||||||
|
if(root.ReportingClassesFull.ReportingClass.Length > 0)
|
||||||
|
{
|
||||||
|
_log.InfoFormat("Message {0} confirmed (full), {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length);
|
||||||
|
sentMessage.SendSuccess = true;
|
||||||
|
sentMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
|
||||||
|
}
|
||||||
|
if (root.ReportingClassesPartial.ReportingClass.Length > 0)
|
||||||
|
{
|
||||||
|
_log.WarnFormat("Message {0} confirmed (partial), {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length);
|
||||||
|
sentMessage.SendSuccess = true;
|
||||||
|
sentMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.VIOLATION;
|
||||||
|
}
|
||||||
|
if (root.ReportingClassesError.ReportingClass.Length > 0)
|
||||||
|
{
|
||||||
|
_log.ErrorFormat("Message {0} rejected, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length);
|
||||||
|
sentMessage.SendSuccess = false;
|
||||||
|
sentMessage.Status = Message.MessageStatus.REJECTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.ERROR;
|
||||||
|
sentMessage.StatusInfo = "Errors reported";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
case Response.RootType.RESET:
|
||||||
|
if(root.ReportingClassesResetted.ReportingClass.Length > 0)
|
||||||
|
{
|
||||||
|
_log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); ;
|
||||||
|
sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück
|
||||||
|
sentMessage.Status = Message.MessageStatus.ACCEPTED;
|
||||||
|
sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Response.RootType.CANCEL:
|
||||||
|
_log.InfoFormat("Core {0} CANCEL confirmed", aCore.DisplayId);
|
||||||
|
aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "alte" Meldungen entfernen
|
||||||
|
foreach (MessageError existingError in sentMessage.ErrorList)
|
||||||
|
DBManager.Instance.Delete(existingError);
|
||||||
|
|
||||||
|
foreach (MessageViolation existingViolation in sentMessage.ViolationList)
|
||||||
|
DBManager.Instance.Delete(existingViolation);
|
||||||
|
|
||||||
|
foreach (Response.RootMessage rootMessage in root.Messages)
|
||||||
|
{
|
||||||
|
_log.InfoFormat("Message[{0}]: {1} {2} {3}", rootMessage.ID, rootMessage.Type, rootMessage.Location, rootMessage.Text);
|
||||||
|
switch(rootMessage.Type)
|
||||||
|
{
|
||||||
|
case Response.RootMessageType.ERROR:
|
||||||
|
MessageError me = new MessageError();
|
||||||
|
me.MessageHeaderId = sentMessage.Id.Value;
|
||||||
|
me.MessageHeader = sentMessage;
|
||||||
|
me.ErrorText = rootMessage.Text;
|
||||||
|
DBManager.Instance.Save(me);
|
||||||
|
break;
|
||||||
|
case Response.RootMessageType.VIOLATION:
|
||||||
|
MessageViolation mv = new MessageViolation();
|
||||||
|
mv.MessageHeaderId = sentMessage.Id.Value;
|
||||||
|
mv.MessageHeader = sentMessage;
|
||||||
|
mv.ViolationText = rootMessage.Text;
|
||||||
|
DBManager.Instance.Save(mv);
|
||||||
|
break;
|
||||||
|
case Response.RootMessageType.XSD_ERROR:
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
case Response.RootMessageType.INFO:
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
case Response.RootMessageType.WARNING:
|
||||||
|
// TODO
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DBManager.Instance.Save(sentMessage);
|
||||||
|
|
||||||
if (!(aCore.Cancelled ?? false))
|
if (!(aCore.Cancelled ?? false))
|
||||||
aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED;
|
aCore.BSMDStatusInternal = MessageCore.BSMDStatus.RESPONDED;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user