git_bsmd/nsw/Source/bsmd.database/Message.cs

209 lines
7.0 KiB
C#

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace bsmd.database
{
/// <summary>
/// Basisklasse aller Nachrichtentypen, zentrale Klasse für die NSW App
/// </summary>
public class Message : IDatabaseEntity
{
private Guid messageHeaderId;
private MessageCore messageCore;
private ReportingParty reportingParty;
#region Enumerations
/// <summary>
/// NSW notification class
/// </summary>
public enum NotificationClass
{
VISIT, TRANSIT, NOA_NOD, ATA, ATD, SEC, POBA, POBD, NAME, TIEFA, TIEFD,
BKRA, BKRD, STAT, LADG, INFO, SERV, PRE72H, MDH, WAS, CREW, PAS, BPOL, TOWA, TOWD, HAZA, HAZD
}
public enum MessageStatus
{ ACCEPTED, REJECTED }
/// <summary>
/// Anhand dieses Filters und den Parametern können die Klassen das passende LoadQuery generieren
/// </summary>
public enum LoadFilter
{
ALL,
MESSAGETYPE,
REPORTINGPARTY,
MESSAGEHEADER
}
/// <summary>
/// Dieser Status wird von den Services (MessageService, ResponseService) ausgewertet
/// </summary>
public enum BSMDStatus
{
PREPARE,
TOSEND,
SENT,
RESPONDED,
FAILURE,
REPORTREQUESTED,
ARCHIVED
}
/// <summary>
/// Spezifiziert das gewünschte HIS zur Übertragung der Daten
/// </summary>
public enum NSWProvider
{
DBH,
DAKOSY,
DUDR
}
#endregion
#region Properties
/// <summary>
/// Primärschlüssel
/// </summary>
public Guid MessageHeaderId { get { return this.messageHeaderId; } }
/// <summary>
/// Dieser Wert wird vom NSW / HIS vergeben
/// </summary>
public string ClientRequestId { set; get; }
/// <summary>
/// Referenz zur eigentlichen Schiffankunft
/// </summary>
public MessageCore MessageCore { get { return this.messageCore; } }
public Guid? MessageId { get; set; }
public DateTime? SentAt { get; set; }
public DateTime? ReceivedAt { get; set; }
public DateTime? RequestedAt { get; set; }
public bool Reset { get; set; }
public bool Cancel { get; set; }
public MessageStatus? Status { get; set; }
/// <summary>
/// Nachrichtentyp der abgeleiteten Meldeklassen
/// </summary>
public NotificationClass MessageNotificationClass { get; set; }
/// <summary>
/// Der Meldende
/// </summary>
public ReportingParty ReportingParty { get { return this.reportingParty; } }
/// <summary>
/// Status für Services
/// </summary>
public BSMDStatus InternalStatus { get; set; }
/// <summary>
/// die zur Kommunikation zu verwendende HIS Schnittstelle
/// </summary>
public NSWProvider HIS { get; set; }
#endregion
#region public virtual methods
#endregion
#region IDatabaseEntity implementation
public bool IsNew
{
get { throw new NotImplementedException(); }
}
public void Save(System.Data.IDbConnection connection)
{
SqlConnection sqlCon = connection as SqlConnection;
if (sqlCon == null) return;
if (this.IsNew)
{
string query = "INSERT INTO MessageHeader (ClientRequestId, MessageCoreId, MessageId, SentAt, ReceivedAt, RequestedAt, NotificationClass, Reset, Cancel, Status, ReportingPartyId) " +
"VALUES (@CLIENTREQUESTID, @MESSAGECOREID, @MESSAGEID, @SENTAT, @RECEIVEDAT, @REQUESTEDAT, @NOTIFICATIONCLASS, @RESET, @CANCEL, @STATUS, @REPORTINGPARTYID)";
SqlCommand cmd = new SqlCommand(query, sqlCon);
if (this.ClientRequestId != null)
cmd.Parameters.AddWithValue("@CLIENTREQUESTID", this.ClientRequestId);
else
cmd.Parameters.AddWithValue("@CLIENTREQUESTID", DBNull.Value);
cmd.Parameters.AddWithValue("@MESSAGECOREID", this.MessageCore.Id);
if (this.MessageId.HasValue)
cmd.Parameters.AddWithValue("@MESSAGEID", this.MessageId.Value);
else
cmd.Parameters.AddWithValue("@MESSAGEID", DBNull.Value);
if (this.SentAt.HasValue)
cmd.Parameters.AddWithValue("@SENTAT", this.SentAt.Value);
else
cmd.Parameters.AddWithValue("@SENTAT", DBNull.Value);
if (this.ReceivedAt.HasValue)
cmd.Parameters.AddWithValue("@RECEIVEDAT", this.ReceivedAt.Value);
else
cmd.Parameters.AddWithValue("@RECEIVEDAT", DBNull.Value);
if (this.RequestedAt.HasValue)
cmd.Parameters.AddWithValue("@REQUESTEDAT", this.RequestedAt.Value);
else
cmd.Parameters.AddWithValue("@REQUESTEDAT", DBNull.Value);
cmd.Parameters.AddWithValue("@NOTIFICATIONCLASS", (int) this.MessageNotificationClass);
cmd.Parameters.AddWithValue("@RESET", this.Reset);
cmd.Parameters.AddWithValue("@CANCEL", this.Cancel);
if (this.Status.HasValue)
cmd.Parameters.AddWithValue("@STATUS", (int)this.Status.Value);
else
cmd.Parameters.AddWithValue("@STATUS", DBNull.Value);
cmd.Parameters.AddWithValue("@REPORTINGPARTYID", this.ReportingParty.Id);
}
}
public void Delete(System.Data.IDbConnection connection)
{
throw new NotImplementedException();
}
public void PrepareLoadCommand(IDbCommand cmd, LoadFilter filter, params object[] criteria )
{
string query = "SELECT Id, ClientRequestId, MessageCoreId, MessageId, SentAt, ReceivedAt, NotificationClass, " +
"Reset, Cancel, Status, ReportingPartyId FROM MessageHeader ";
switch (filter)
{
case LoadFilter.REPORTINGPARTY:
{
query += "WHERE ReportingPartyId = @RPID";
((SqlCommand)cmd).Parameters.AddWithValue("RPID", criteria[0]);
break;
}
case LoadFilter.ALL:
default:
break;
}
cmd.CommandText = query;
}
#endregion
}
}