3.6.4.2: Remote Update detection, Neuanlage Anmeldung (ENI-Teil), Neuanlage Anmeldung (NSWSender Teil)

This commit is contained in:
Daniel Schick 2017-06-18 11:46:54 +00:00
parent c64ae501ac
commit 4ec9ed8be6
35 changed files with 852 additions and 132 deletions

View File

@ -19,16 +19,17 @@
<setting name="UseLocking" serializeAs="String">
<value>True</value>
</setting>
<setting name="LockingServerAddress" serializeAs="String">
<!--value>http://heupferd/bsmd.LockingService/LockingService.svc</value-->
<value>http://192.168.2.4/LockingService/LockingService.svc</value>
</setting>
<setting name="RequestTimeout" serializeAs="String">
<value>60</value>
</setting>
<setting name="changeTimerTimeout" serializeAs="String">
<value>1000</value>
</setting>
<setting name="LockingServerAddress" serializeAs="String">
<value>http://192.168.2.4/LockingService/LockingService.svc</value>
</setting>
<setting name="ConnectionString" serializeAs="String">
<value>Data Source=192.168.2.12;Initial Catalog=nsw;Uid=dfuser;Pwd=dfpasswd;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False</value>
<!--value>Data Source=(localdb)\Projects;Initial Catalog=nsw;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False</value-->
<value>Data Source=192.168.2.12;Initial Catalog=nsw;Uid=dfuser;Pwd=dfpasswd;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False</value>
</setting>
</ENI2.Properties.Settings>
</applicationSettings>

View File

@ -41,34 +41,81 @@ namespace ENI2.Controls
/// </summary>
public class ClosableTabItem : TabItem
{
private Storyboard blinkTextStoryboard;
/*
*
static ClosableTabItem()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ClosableTabItem), new FrameworkPropertyMetadata(typeof(ClosableTabItem)));
}
*/
private TextBlock textBlock;
public event EventHandler TabClosing;
protected Storyboard BlinkTextStoryboard
{
get
{
if(blinkTextStoryboard == null)
{
this.blinkTextStoryboard = new Storyboard();
ColorAnimationUsingKeyFrames cauk = new ColorAnimationUsingKeyFrames();
cauk.AutoReverse = true;
cauk.KeyFrames.Add(new DiscreteColorKeyFrame(Colors.Black, KeyTime.FromTimeSpan(new TimeSpan(0,0,1))));
cauk.KeyFrames.Add(new DiscreteColorKeyFrame(Colors.Red, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 2))));
cauk.KeyFrames.Add(new DiscreteColorKeyFrame(Colors.White, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3))));
Storyboard.SetTarget(cauk, this.textBlock.Foreground);
Storyboard.SetTargetProperty(cauk, new PropertyPath(SolidColorBrush.ColorProperty));
this.blinkTextStoryboard.Children.Add(cauk);
}
return blinkTextStoryboard;
}
}
public bool IsHighlighted
{
private get { return false; }
set
{
if (value) this.textBlock.Foreground = Brushes.Red; //this.BlinkTextStoryboard.Begin(); // warum auch immer das nicht funktioniert
else this.textBlock.Foreground = Brushes.Black; //this.BlinkTextStoryboard.Stop();
}
}
public void SetHeaderText(string headerText, bool lockedTab)
{
// Container for header controls
var dockPanel = new DockPanel();
var header = new TextBlock { Text = headerText };
header.Background = lockedTab ? Brushes.LightGreen : Brushes.Orange;
dockPanel.Children.Add(header);
DockPanel dockPanel = new DockPanel();
dockPanel.Height = 22;
this.textBlock = new TextBlock { Text = headerText };
this.textBlock.Foreground = new SolidColorBrush(Colors.Black);
this.textBlock.Background = lockedTab ? Brushes.LightGreen : Brushes.Orange;
this.textBlock.Margin = new Thickness(1);
this.textBlock.VerticalAlignment = VerticalAlignment.Center;
dockPanel.Children.Add(this.textBlock);
// Close button to remove the tab
var closeButton = new Button();
closeButton.Content = "X";
closeButton.Margin = new Thickness(5, 0, 0, 0);
closeButton.Foreground = Brushes.Red;
closeButton.Foreground = Brushes.Red;
closeButton.Height = 18;
closeButton.Width = 15;
closeButton.Opacity = 0.2;
closeButton.FontSize = 8;
closeButton.FontWeight = FontWeights.Bold;
closeButton.VerticalAlignment = VerticalAlignment.Center;
closeButton.MouseEnter += (sender, e) => {
DoubleAnimation animation = new DoubleAnimation(0.2, 1.0, new TimeSpan(0, 0, 0, 0, 500));

View File

@ -36,8 +36,8 @@ namespace ENI2.Controls
var okButton = (Button)Template.FindName("buttonOK", this);
var cancelButton = (Button)Template.FindName("buttonCancel", this);
var addButton = (Button)Template.FindName("buttonAdd", this);
okButton.Click += (s, e) => { if (IsModal) DialogResult = true; else this.Close(); OKClicked?.Invoke(); };
cancelButton.Click += (s, e) => { if (IsModal) DialogResult = false; else this.Close(); CancelClicked?.Invoke(); };
okButton.Click += (s, e) => { if (IsModal) DialogResult = true; OKClicked?.Invoke(); this.Close(); };
cancelButton.Click += (s, e) => { if (IsModal) DialogResult = false; CancelClicked?.Invoke(); this.Close(); };
addButton.Click += (s, e) => { AddClicked?.Invoke(); };
};
this.IsModal = true; // default

View File

@ -9,6 +9,7 @@ using System.Windows.Controls;
using bsmd.database;
using ENI2.DetailViewControls;
using ENI2.Util;
using System.Windows;
using System.Windows.Data;
@ -39,6 +40,8 @@ namespace ENI2
public ReportingParty LockedBy { get; set; }
internal event DatabaseEntityWatchdog.DatabaseEntityChangedHandler HighlightReset;
#endregion
#region Construction
@ -243,9 +246,17 @@ namespace ENI2
// return to "new" overview
Dispatcher.BeginInvoke((Action)(() => this.listBoxMessages_SelectionChanged(this, null)));
// if the entity has been highlighted (through remote change detection), reset this here
this.OnHighlightReset();
}
#endregion
protected virtual void OnHighlightReset()
{
this.HighlightReset?.Invoke(this.Core);
}
}
}

View File

@ -35,7 +35,7 @@
<MinimumRequiredVersion>3.5.1.0</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.html</WebPage>
<ApplicationRevision>1</ApplicationRevision>
<ApplicationRevision>2</ApplicationRevision>
<ApplicationVersion>3.6.4.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>
@ -240,6 +240,7 @@
<DependentUpon>SucheControl.xaml</DependentUpon>
</Compile>
<Compile Include="Util\BoolToVisibilityConverter.cs" />
<Compile Include="Util\DatabaseEntityWatchdog.cs" />
<Compile Include="VorgaengeControl.xaml.cs">
<DependentUpon>VorgaengeControl.xaml</DependentUpon>
</Compile>

View File

@ -50,7 +50,8 @@ namespace ENI2.EditControls
{
InitializeComponent();
Loaded += EditCallPurposeDialog_Loaded;
Loaded += EditCallPurposeDialog_Loaded;
AddClicked += () => { this.comboBoxCode.Focus(); };
}
public CallPurpose CallPurpose { get; set; }

View File

@ -45,6 +45,12 @@ namespace ENI2.EditControls
this.Core.ETA = this.datePickerETA.SelectedDate;
}
if (this.doubleUpDownIMO.Value.HasValue)
this.Core.IMO = this.doubleUpDownIMO.Value.ToString();
if (this.doubleUpDownENI.Value.HasValue)
this.Core.ENI = this.doubleUpDownENI.Value.ToString();
this.Core.PoC = this.locodePoC.LocodeValue;
this._isOK = true;
}
@ -89,8 +95,8 @@ namespace ENI2.EditControls
isComplete &= this.datePickerETA.SelectedDate.HasValue; // ETA
bool imo_OR_eni = ((doubleUpDownIMO.Value.HasValue) && (doubleUpDownIMO.Value > 1000000) && (doubleUpDownIMO.Value < 9999999)) ||
((doubleUpDownENI.Value.HasValue) && (doubleUpDownENI.Value > 100000) && (doubleUpDownENI.Value < 99999999));
bool imo_OR_eni = ((doubleUpDownIMO.Value.HasValue) && (doubleUpDownIMO.Value >= 1000000) && (doubleUpDownIMO.Value <= 9999999)) ||
((doubleUpDownENI.Value.HasValue) && (doubleUpDownENI.Value >= 100000) && (doubleUpDownENI.Value <= 99999999));
isComplete &= imo_OR_eni;

View File

@ -5,6 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:p="clr-namespace:ENI2.Properties"
xmlns:enidtctrl="clr-namespace:ENI2.DetailViewControls"
xmlns:ctrl="clr-namespace:ENI2.Controls"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:util="clr-namespace:ENI2.Util"
xmlns:local="clr-namespace:ENI2"
@ -20,6 +21,7 @@
<Window.Resources>
<util:BoolToVisibilityConverter x:Key="BoolToHiddenConverter" TrueValue="Visible" FalseValue="Hidden" />
</Window.Resources>
<xctk:BusyIndicator Name="busyIndicator" IsBusy="True">
<xctk:BusyIndicator.ProgressBarStyle>
<Style TargetType="ProgressBar">

View File

@ -9,12 +9,14 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Threading;
using bsmd.database;
using System.Windows.Controls;
using ENI2.Controls;
using ENI2.EditControls;
using System.Threading;
using ENI2.Util;
using log4net;
namespace ENI2
@ -37,6 +39,7 @@ namespace ENI2
private int failedLogonCount = 0;
private ReportingParty userEntity = null;
private ILog _log = LogManager.GetLogger(typeof(MainWindow));
private DatabaseEntityWatchdog _dbWatchDog;
#endregion
@ -52,10 +55,12 @@ namespace ENI2
this.sucheControl.buttonSuche.IsDefault = true;
this.sucheControl.MessageCoreSelected += AnmeldungenControl_MessageCoreSelected;
this.mainPanel.LayoutTransform = this._transform;
this._dbWatchDog = new DatabaseEntityWatchdog();
this._dbWatchDog.DatabaseEntityChanged += _dbWatchDog_DatabaseEntityChanged;
App.SplashScreen.ShowMessage("done");
Thread.Sleep(500);
App.SplashScreen.LoadComplete();
}
}
#endregion
@ -97,6 +102,10 @@ namespace ENI2
this.mainFrame.Items.Add(searchResultItem);
Dispatcher.BeginInvoke((Action)(() => this.mainFrame.SelectedIndex = (this.mainFrame.Items.Count - 1)));
this.openTabs.Add(aMessageCore.Id.Value, searchResultItem);
this._dbWatchDog.Register(aMessageCore);
drc.HighlightReset += Drc_HighlightReset;
}
else
{
@ -105,6 +114,18 @@ namespace ENI2
}
}
private void Drc_HighlightReset(DatabaseEntity entity)
{
MessageCore resetCore = entity as MessageCore;
if (resetCore != null)
{
if (openTabs.ContainsKey(resetCore.Id.Value))
{
openTabs[resetCore.Id.Value].IsHighlighted = false;
}
}
}
private void SearchResultItem_TabClosing(object sender, EventArgs e)
{
ClosableTabItem tabItem = sender as ClosableTabItem;
@ -125,7 +146,10 @@ namespace ENI2
DetailRootControl drc = tabItem.Content as DetailRootControl;
if (openTabs.ContainsKey(drc.Core.Id.Value))
{
this._dbWatchDog.UnRegister(drc.Core);
openTabs.Remove(drc.Core.Id.Value);
}
}
}
@ -225,10 +249,12 @@ namespace ENI2
closedDialog.Core.BSMDStatusInternal = MessageCore.BSMDStatus.TOSEND;
closedDialog.Core.InitialHIS = Message.NSWProvider.DUDR_TEST;
}
closedDialog.Core.DefaultReportingPartyId = this.userEntity.Id;
DBManager.Instance.Save(closedDialog.Core);
// Meldeklassen für neuen Anlauf erzeugen:
bsmd.database.Util.CreateMessagesForCore(closedDialog.Core);
bsmd.database.Util.CreateMessagesForCore(closedDialog.Core);
this.AnmeldungenControl_MessageCoreSelected(closedDialog.Core); // in einem neuen Reiter öffnen
}
};
visitIdDialog.Show();
@ -244,6 +270,24 @@ namespace ENI2
}
}
private void _dbWatchDog_DatabaseEntityChanged(DatabaseEntity entity)
{
MessageCore changedCore = entity as MessageCore;
if(changedCore != null)
{
// tab färben
if(this.openTabs.ContainsKey(changedCore.Id.Value))
{
TabItem tabitem = this.openTabs[changedCore.Id.Value];
this.Dispatcher.BeginInvoke(new Action(() =>
{
if (tabitem is ClosableTabItem)
((ClosableTabItem)tabitem).IsHighlighted = true;
}));
}
}
}
#endregion
#region mouse wheel / zooming events

View File

@ -44,15 +44,6 @@ namespace ENI2.Properties {
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://heupferd/bsmd.LockingService/LockingService.svc")]
public string LockingServerAddress {
get {
return ((string)(this["LockingServerAddress"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("60")]
@ -64,8 +55,26 @@ namespace ENI2.Properties {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Data Source=(localdb)\\Projects;Initial Catalog=nsw;Integrated Security=True;Conne" +
"ct Timeout=30;Encrypt=False;TrustServerCertificate=False")]
[global::System.Configuration.DefaultSettingValueAttribute("1000")]
public int changeTimerTimeout {
get {
return ((int)(this["changeTimerTimeout"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("http://192.168.2.4/LockingService/LockingService.svc")]
public string LockingServerAddress {
get {
return ((string)(this["LockingServerAddress"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Data Source=192.168.2.12;Initial Catalog=nsw;Uid=dfuser;Pwd=dfpasswd;Connect Time" +
"out=30;Encrypt=False;TrustServerCertificate=False")]
public string ConnectionString {
get {
return ((string)(this["ConnectionString"]));

View File

@ -8,14 +8,17 @@
<Setting Name="UseLocking" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="LockingServerAddress" Type="System.String" Scope="Application">
<Value Profile="(Default)">http://heupferd/bsmd.LockingService/LockingService.svc</Value>
</Setting>
<Setting Name="RequestTimeout" Type="System.Int32" Scope="Application">
<Value Profile="(Default)">60</Value>
</Setting>
<Setting Name="changeTimerTimeout" Type="System.Int32" Scope="Application">
<Value Profile="(Default)">1000</Value>
</Setting>
<Setting Name="LockingServerAddress" Type="System.String" Scope="Application">
<Value Profile="(Default)">http://192.168.2.4/LockingService/LockingService.svc</Value>
</Setting>
<Setting Name="ConnectionString" Type="System.String" Scope="Application">
<Value Profile="(Default)">Data Source=(localdb)\Projects;Initial Catalog=nsw;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False</Value>
<Value Profile="(Default)">Data Source=192.168.2.12;Initial Catalog=nsw;Uid=dfuser;Pwd=dfpasswd;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -39,8 +39,8 @@
<!-- TODO das hier lokalisieren! -->
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="5" HorizontalAlignment="Right">
<Button Width="80" Content="Add" Name="buttonAdd" Margin="0,0,10,0" Visibility="Hidden" />
<Button Width="80" Content="OK" IsDefault="True" Name="buttonOK" Margin="0,0,10,0" />
<Button Width="80" Content="Cancel" IsCancel="True" Name="buttonCancel" />
<Button Width="80" Content="OK" IsDefault="True" IsCancel="False" Name="buttonOK" Margin="0,0,10,0" />
<Button Width="80" Content="Cancel" IsCancel="True" IsDefault="False" Name="buttonCancel" />
</StackPanel>
</Grid>
</ControlTemplate>

View File

@ -0,0 +1,90 @@
// Copyright (c) 2017 schick Informatik
// Description: Diese Klasse überwacht Änderungen in Datenbankobjekten (durch zykl. Abfrage eines Threads
// und Vgl. des "Changed" Felds bezogen auf den Beginn der Überwachung. Voraussetzung ist das die Entität ein
// entsprechendes "Changed" Feld besitzt. (aktuell nur MessageCore, generisch nicht so einfach weil DatabaseEntity
// aktuell eine abstrakte Klasse ist und daher nicht direkt instanziert werden kann (DBManager)
using System;
using System.Collections.Generic;
using System.Timers;
using bsmd.database;
namespace ENI2.Util
{
internal class DatabaseEntityWatchdog
{
private Dictionary<MessageCore, DateTime> _watchedEntities = new Dictionary<MessageCore, DateTime>();
private object _entityLock = new object();
private Timer bgTimer;
public delegate void DatabaseEntityChangedHandler (DatabaseEntity entity);
public event DatabaseEntityChangedHandler DatabaseEntityChanged;
public DatabaseEntityWatchdog()
{
this.bgTimer = new Timer();
this.bgTimer.Elapsed += BgTimer_Elapsed;
this.bgTimer.Interval = Properties.Settings.Default.changeTimerTimeout;
}
private void BgTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (this._entityLock)
{
List<MessageCore> changedCores = new List<MessageCore>();
foreach (MessageCore watchedEntity in this._watchedEntities.Keys)
{
MessageCore entity = DBManager.Instance.GetMessageCoreById(watchedEntity.Id ?? Guid.Empty);
if (entity != null)
{
if (entity.Changed.HasValue && (entity.Changed.Value > this._watchedEntities[watchedEntity]))
{
OnDatabaseEntityChanged(entity);
changedCores.Add(entity);
}
}
}
foreach(MessageCore changedCore in changedCores)
this._watchedEntities[changedCore] = DateTime.Now; // nur einmal auslösen
}
}
public void Register(MessageCore entity)
{
lock (this._entityLock)
{
if (!this._watchedEntities.ContainsKey(entity))
{
this._watchedEntities.Add(entity, DateTime.Now);
if (this._watchedEntities.Count == 1)
this.bgTimer.Start();
}
}
}
public void UnRegister(MessageCore entity)
{
lock (this._entityLock)
{
if (this._watchedEntities.ContainsKey(entity)) // hier wird mit Id verglichen (IEquatable<T> impl.)
this._watchedEntities.Remove(entity);
if (this._watchedEntities.Count == 0)
this.bgTimer.Stop();
}
}
#region private / protected
protected void OnDatabaseEntityChanged(DatabaseEntity entity)
{
this.DatabaseEntityChanged?.Invoke(entity);
}
#endregion
}
}

Binary file not shown.

View File

@ -224,3 +224,7 @@
-----------------------------
20.01.2016 19:15:25 No files to send
20.01.2016 19:15:26 No more Answers
-----------------------------
17.06.2017 10:14:59 Client started
-----------------------------
17.06.2017 10:15:00 wrong Version of XML file

View File

@ -0,0 +1,38 @@
-- Table ImportHeader
PRINT N'Creating [dbo].[ImportHeader]...';
CREATE TABLE [dbo].[ImportHeader] (
[Id] UNIQUEIDENTIFIER NOT NULL,
[ReportingPartyId] UNIQUEIDENTIFIER NULL,
[SenderEMail] NVARCHAR (100) NULL,
[ImportDate] DATETIME NULL,
[Filename] NVARCHAR (100) NULL,
[MessageCoreId] UNIQUEIDENTIFIER NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
ALTER TABLE [dbo].[ImportHeader]
ADD DEFAULT newid() FOR [Id];
GO
-- Table ImportValue
PRINT N'Creating [dbo].[ImportValue]...';
GO
CREATE TABLE [dbo].[ImportValue] (
[Id] UNIQUEIDENTIFIER NOT NULL,
[ImportHeaderId] UNIQUEIDENTIFIER NOT NULL,
[NotificationClass] TINYINT NULL,
[Name] NVARCHAR (128) NULL,
[Value] NVARCHAR (512) NULL,
[Identifier] TINYINT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
ALTER TABLE [dbo].[ImportValue] ADD DEFAULT newid() FOR [Id];
GO

View File

@ -198,7 +198,7 @@ namespace bsmd.ExcelReadService
range.Value = value;
}
Marshal.ReleaseComObject(range);
_log.InfoFormat("Value {0} for lookup {1} OK", value, lookup);
// _log.InfoFormat("Value {0} for lookup {1} OK", value, lookup);
}
}
catch(Exception ex)

View File

@ -68,6 +68,8 @@ namespace bsmd.ExcelReadService
string receiptSubject = "NSW Sheet Service Status INFO";
string mailSubject = "";
Dictionary<Guid, ReportingParty> reportingPartyDict = DBManager.Instance.GetReportingPartyDict();
using (BSMDPopClient bsmdPopClient = new BSMDPopClient())
{
if(bsmdPopClient.IsConnected)
@ -127,7 +129,40 @@ namespace bsmd.ExcelReadService
{
try
{
ImportHeader importHeader = new ImportHeader();
importHeader.ImportDate = DateTime.Now;
readResult = Util.ProcessSheet(reader, out readMessage, out messageCore);
if(readResult)
{
// Saving plaintext data (ImportHeader + ImportValues) for each reading
importHeader.MessageCoreId = messageCore.Id.Value;
importHeader.Filename = Path.GetFileName(attachmentLocalPath);
importHeader.SenderEmail = mailSender;
bool foundReportingParty = false;
foreach (Guid rpKey in reportingPartyDict.Keys)
{
if (reportingPartyDict[rpKey].UserEMail.IsNullOrEmpty()) continue;
if (reportingPartyDict[rpKey].UserEMail.Equals(mailSender, StringComparison.OrdinalIgnoreCase))
{
importHeader.ReportingPartyId = rpKey;
foundReportingParty = true;
break;
}
}
if(!foundReportingParty)
{
_log.WarnFormat("Sender {0} is an unknown reporting party", mailSender);
}
DBManager.Instance.Save(importHeader);
List<ImportValue> valueList = importHeader.CreateUpdateList(reader.ImportValues);
// Bulk save recommended here..
ImportValue.BulkSave(valueList);
}
}
catch (Exception ex)
{
@ -223,7 +258,7 @@ namespace bsmd.ExcelReadService
{
try
{
_log.DebugFormat("Killing process {0} {1}", p.ProcessName, p.Id);
_log.InfoFormat("Killing process {0} {1}", p.ProcessName, p.Id);
p.Kill();
}
catch (Exception ex)

View File

@ -22,12 +22,17 @@ namespace bsmd.ExcelReadService
{
internal class ExcelReader : ExcelBase
{
private Dictionary<string, string> stringVals = new Dictionary<string, string>();
internal enum ReadState { NONE, OK, WARN, FAIL };
internal Dictionary<string, string> ImportValues { get { return this.stringVals; } }
public ExcelReader(string filePath)
{
_log = LogManager.GetLogger(typeof(ExcelReader));
this._excelApp = new Application();
this._excelApp.DisplayAlerts = false;
@ -104,21 +109,27 @@ namespace bsmd.ExcelReadService
internal string ReadText(string lookup)
{
if (!_nameDict.ContainsKey(lookup)) return null;
try
string result = null;
if (_nameDict.ContainsKey(lookup))
{
var val = _nameDict[lookup].RefersToRange.Value;
var val2 = _nameDict[lookup].RefersToRange.Value2;
if (val != null)
return val.ToString().Trim();
if (val2 != null)
return val2.ToString().Trim();
try
{
var val = _nameDict[lookup].RefersToRange.Value;
var val2 = _nameDict[lookup].RefersToRange.Value2;
if (val != null)
result = val.ToString().Trim();
else if (val2 != null)
result = val2.ToString().Trim();
}
catch (COMException ex)
{
_log.WarnFormat("COMException reading field {0}: {1}", lookup, ex.ErrorCode);
}
}
catch(COMException ex)
{
_log.WarnFormat("COMException reading field {0}: {1}", lookup, ex.ErrorCode);
}
return null;
if (result != null)
this.stringVals[lookup] = result;
return result;
}
internal string ReadTextNoWhitespace(string lookup)

View File

@ -142,6 +142,30 @@ namespace bsmd.database
return result;
}
internal List<ImportHeader> GetImportHeader(Guid messageCoreId)
{
ImportHeader ih = new ImportHeader();
SqlCommand cmd = new SqlCommand();
ih.PrepareLoadCommand(cmd, Message.LoadFilter.BY_CORE, messageCoreId);
SqlDataReader reader = this.PerformCommand(cmd);
List<ImportHeader> result = new List<ImportHeader>();
foreach (ImportHeader existingHeader in ih.LoadList(reader))
result.Add(existingHeader);
return result;
}
internal List<ImportValue> GetValuesForImportHeader(ImportHeader importHeader)
{
ImportValue iv = new ImportValue();
SqlCommand cmd = new SqlCommand();
iv.PrepareLoadCommand(cmd, Message.LoadFilter.IMPORTHEADER_ID, importHeader.Id.Value);
SqlDataReader reader = this.PerformCommand(cmd);
List<ImportValue> result = new List<ImportValue>();
foreach (ImportValue existingValue in iv.LoadList(reader))
result.Add(existingValue);
return result;
}
public List<MessageCore> GetMessageCoresWithNSWStatusFlag()
{
MessageCore aMessageCore = new MessageCore();
@ -344,7 +368,7 @@ namespace bsmd.database
}
return result;
}
public MessageCore GetMessageCoreByVisitId(string visitId)
{
MessageCore aCore = new MessageCore();
@ -962,7 +986,7 @@ namespace bsmd.database
}
reader.Close();
return result;
}
}
#region DB access methods
@ -1073,6 +1097,25 @@ namespace bsmd.database
return result;
}
public void PerformBulkInsert(DataTable table)
{
lock (this._lock)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this._con, SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.TableLock, null))
{
bulkCopy.BulkCopyTimeout = 180;
foreach (DataColumn dataColumn in table.Columns)
{
bulkCopy.ColumnMappings.Add(dataColumn.ColumnName, dataColumn.ColumnName);
}
bulkCopy.BatchSize = table.Rows.Count;
bulkCopy.DestinationTableName = table.TableName;
bulkCopy.WriteToServer(table);
}
}
}
#endregion
#endregion

View File

@ -17,7 +17,7 @@ using System.Reflection;
namespace bsmd.database
{
public abstract class DatabaseEntity : IMessageParagraph
public abstract class DatabaseEntity : IMessageParagraph, IEquatable<DatabaseEntity>
{
protected Guid? id;
protected string tablename;
@ -152,6 +152,27 @@ namespace bsmd.database
#endregion
#region IEquatable<T> implementation
public bool Equals(DatabaseEntity other)
{
return null != other && Id == other.Id;
}
public override bool Equals(object obj)
{
return this.Equals(obj as DatabaseEntity);
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
#endregion
#region IMessageParagraph implementation
public virtual string Title

View File

@ -0,0 +1,158 @@
// Copyright (c) 2015-2017 schick Informatik
// Description: Kopfdaten eines Excel-Einlesevorgangs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace bsmd.database
{
public class ImportHeader : DatabaseEntity
{
public ImportHeader()
{
this.tablename = "[dbo].[ImportHeader]";
}
#region Properties
public Guid? ReportingPartyId { get; set; }
public string SenderEmail { get; set; }
public DateTime ImportDate { get; set; }
public string Filename { get; set; }
public Guid MessageCoreId { get; set; }
#endregion
#region DatabaseEntity implementation
public override List<DatabaseEntity> LoadList(IDataReader reader)
{
List<DatabaseEntity> result = new List<DatabaseEntity>();
while (reader.Read())
{
ImportHeader ih = new ImportHeader();
ih.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) ih.ReportingPartyId = reader.GetGuid(1);
if (!reader.IsDBNull(2)) ih.SenderEmail = reader.GetString(2);
if (!reader.IsDBNull(3)) ih.ImportDate = reader.GetDateTime(3);
if (!reader.IsDBNull(4)) ih.Filename = reader.GetString(4);
if (!reader.IsDBNull(5)) ih.MessageCoreId = reader.GetGuid(5);
result.Add(ih);
}
reader.Close();
return result;
}
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{
string query = string.Format("SELECT Id, ReportingPartyId, SenderEMail, ImportDate, Filename, MessageCoreId FROM {0} ", this.Tablename);
switch (filter)
{
case Message.LoadFilter.BY_CORE:
query += " WHERE MessageCoreId = @MCID";
((SqlCommand)cmd).Parameters.AddWithValue("@MCID", criteria[0]);
break;
default:
break;
}
query += " ORDER BY ImportDate DESC";
cmd.CommandText = query;
}
public override void PrepareSave(IDbCommand cmd)
{
SqlCommand scmd = cmd as SqlCommand;
scmd.Parameters.AddWithNullableValue("@RPID", this.ReportingPartyId);
scmd.Parameters.AddWithNullableValue("@SENDER", this.SenderEmail);
scmd.Parameters.AddWithNullableValue("@IMPORTDATE", this.ImportDate);
scmd.Parameters.AddWithNullableValue("@FILENAME", this.Filename);
scmd.Parameters.AddWithNullableValue("@MESSAGECOREID", this.MessageCoreId);
if (this.IsNew)
{
this.CreateId();
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("INSERT INTO {0} (Id, ReportingPartyId, SenderEMail, ImportDate, Filename, MessageCoreId) " +
"VALUES (@ID, @RPID, @SENDER, @IMPORTDATE, @FILENAME, @MESSAGECOREID)", this.Tablename);
}
else
{
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("UPDATE {0} SET ReportingPartyId = @RPID, SenderEMail = @SENDER, ImportDate = @IMPORTDATE, " +
"Filename = @FILENAME, MessageCoreId = @MESSAGECOREID WHERE Id = @ID", this.Tablename);
}
}
#endregion
#region public methods
/// <summary>
/// Diese Methode erzeugt ImportValue Entitäten aus den eingelesenen Excel-Werten. Dabei werden nur
/// Deltas gespeichert, d.h. alle Änderungen bezogen
/// </summary>
/// <param name="importValues"></param>
/// <returns></returns>
public List<ImportValue> CreateUpdateList(Dictionary<string, string> importValues)
{
List<ImportHeader> existingListHeaders = DBManager.Instance.GetImportHeader(this.MessageCoreId);
List<ImportValue> result = new List<ImportValue>();
// in diesem Dict wird der "neueste" eingelesene Stand aufbereitet, der dann direkt mit den neu
// eingelesenen Werten verglichen werden kann. Dazu müssen alle Values der Anmeldung gelesen werden und
// von hinten nach vorne überschrieben werden.
Dictionary<string, string> comparisonDict = new Dictionary<string, string>();
// existingListHeaders sind von neu..alt sortiert, man muss also von hinten lesen
for(int i = (existingListHeaders.Count - 1); i >= 0; i--)
{
List<ImportValue> values = DBManager.Instance.GetValuesForImportHeader(existingListHeaders[i]);
foreach(ImportValue anImportValue in values)
{
comparisonDict[anImportValue.Name] = anImportValue.Value;
}
}
// jetzt alle Einträge suchen, die es noch nicht gibt oder geändert sind und dafür ImportValue Entitäten anlegen
foreach(string key in importValues.Keys)
{
if(comparisonDict.ContainsKey(key))
{
if (comparisonDict[key].Equals(importValues[key])) continue;
}
// Wert ist anders oder nicht vorhanden
ImportValue iv = new ImportValue();
iv.Value = importValues[key];
iv.Name = key;
string[] elems = key.Split('.');
Message.NotificationClass aNotificationClass = Message.NotificationClass.VISIT;
if (Enum.TryParse<Message.NotificationClass>(elems[0], out aNotificationClass))
iv.NotificationClass = aNotificationClass;
iv.ImportHeaderId = this.Id.Value;
result.Add(iv);
}
return result;
}
#endregion
}
}

View File

@ -0,0 +1,158 @@
// Copyright (c) 2015-2017 schick Informatik
// Description: Einzeldatenwert eines Excel-Imports (als String), zum Vergleichen mit Vorversionen usw.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
namespace bsmd.database
{
public class ImportValue : DatabaseEntity
{
public ImportValue()
{
this.tablename = "[dbo].[ImportValue]";
}
#region Properties
public Guid ImportHeaderId { get; set; }
public Message.NotificationClass NotificationClass { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public int? Identifier { get; set; }
#endregion
#region DatabaseEntity implementation
public override List<DatabaseEntity> LoadList(IDataReader reader)
{
List<DatabaseEntity> result = new List<DatabaseEntity>();
while (reader.Read())
{
ImportValue iv = new ImportValue();
iv.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) iv.ImportHeaderId = reader.GetGuid(1);
if (!reader.IsDBNull(2)) iv.NotificationClass = (Message.NotificationClass)Enum.ToObject(typeof(Message.NotificationClass), reader.GetByte(2));
if (!reader.IsDBNull(3)) iv.Name = reader.GetString(3);
if (!reader.IsDBNull(4)) iv.Value = reader.GetString(4);
if (!reader.IsDBNull(5)) iv.Identifier = reader.GetInt32(5);
result.Add(iv);
}
reader.Close();
return result;
}
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{
string query = string.Format("SELECT Id, ImportHeaderId, NotificationClass, Name, Value, Identifier FROM {0} ", this.Tablename);
switch (filter)
{
case Message.LoadFilter.IMPORTHEADER_ID:
query += " WHERE ImportHeaderId = @IHID";
((SqlCommand)cmd).Parameters.AddWithValue("@IHID", criteria[0]);
break;
default:
break;
}
cmd.CommandText = query;
}
public override void PrepareSave(IDbCommand cmd)
{
SqlCommand scmd = cmd as SqlCommand;
scmd.Parameters.AddWithNullableValue("@IHID", this.ImportHeaderId);
scmd.Parameters.AddWithNullableValue("@NCLASS", this.NotificationClass);
scmd.Parameters.AddWithNullableValue("@NAME", this.Name);
scmd.Parameters.AddWithNullableValue("@VALUE", this.Value);
scmd.Parameters.AddWithNullableValue("@IDENTIFIER", this.Identifier);
if (this.IsNew)
{
this.CreateId();
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("INSERT INTO {0} (Id, ImportHeaderId, NotificationClass, Name, Value, Identifiert) VALUES " +
"(@ID, @IHID, @NCLASS, @NAME, @VALUE, @IDENTIFIER)", this.Tablename);
}
else
{
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("UPDATE {0} SET ImportHeaderId = @IHID, NotificationClass = @NCLASS, Name = @NAME, Value = @VALUE, " +
"Identifier = @IDENTIFIER WHERE Id = @ID", this.Tablename);
}
}
#endregion
#region public static methods
public static void BulkSave(List<ImportValue> importValues)
{
// create data table from entities
DataTable table = new DataTable();
PropertyInfo[] properties = typeof(ImportValue).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
// create table columns
foreach (PropertyInfo p in properties)
{
if (!(p.CanRead && p.CanWrite)) continue;
Type propType = p.PropertyType;
DataColumn dc = new DataColumn();
dc.ColumnName = p.Name;
if (p.Name == "Identifier")
{
dc.AllowDBNull = true;
dc.DataType = Type.GetType("System.Int32");
}
else
{
dc.DataType = propType;
}
table.Columns.Add(dc);
}
// insert entity data in table columns
foreach (ImportValue importValue in importValues)
{
DataRow row = table.NewRow();
foreach (PropertyInfo p in properties)
{
if (!(p.CanRead && p.CanWrite)) continue;
if (p.GetValue(importValue, null) == null)
row[p.Name] = DBNull.Value;
else
row[p.Name] = p.GetValue(importValue, null);
}
table.Rows.Add(row);
}
table.TableName = "[dbo].[ImportValue]";
DBManager.Instance.PerformBulkInsert(table);
}
#endregion
#region overrides
public override string ToString()
{
return string.Format("{0} - {1}", this.Name, this.Value);
}
#endregion
}
}

View File

@ -139,7 +139,8 @@ namespace bsmd.database
SEARCH_CORE_FILTERS,
QUERY_NSW_STATUS,
NOT_DELETED,
DELETED
DELETED,
IMPORTHEADER_ID
}
/// <summary>

View File

@ -9,7 +9,7 @@ using System.Text;
namespace bsmd.database
{
public class MessageCore : DatabaseEntity, IComparable
public class MessageCore : DatabaseEntity, IComparable, IEquatable<MessageCore>
{
#region Fields
@ -328,7 +328,7 @@ namespace bsmd.database
this.SetFilters(sb, cmd, filter, criteria);
sb.Append(" ORDER BY ETA DESC");
sb.Append(" ORDER BY COALESCE(ETA, ETAKielCanal) DESC");
cmd.CommandText = sb.ToString();
}
@ -606,5 +606,14 @@ namespace bsmd.database
#endregion
#region IEquatable<T> implementation
public bool Equals(MessageCore other)
{
return null != other && Id == other.Id;
}
#endregion
}
}

View File

@ -2,6 +2,6 @@
[assembly: AssemblyCompany("Informatikbüro Daniel Schick")]
[assembly: AssemblyProduct("BSMD NSW interface")]
[assembly: AssemblyInformationalVersion("3.6.4")]
[assembly: AssemblyInformationalVersion("3.6.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.6.4.*")]
[assembly: AssemblyVersion("3.6.5.*")]

View File

@ -147,12 +147,18 @@ namespace bsmd.database
}
Message message = new Message();
message.MessageCoreId = core.Id;
message.MessageCore = core;
message.MessageNotificationClass = notificationClass;
DatabaseEntity classElement = DBManager.CreateMessage(notificationClass);
DBManager.Instance.Save(classElement);
message.Elements.Add(classElement);
message.SaveElements();
DBManager.Instance.Save(message);
if (classElement != null) // null für Visit/Transit
{
classElement.MessageHeader = message;
DBManager.Instance.Save(classElement);
message.Elements.Add(classElement);
message.SaveElements();
}
result.Add(message);
}
}

View File

@ -65,6 +65,8 @@
<Compile Include="IGCPosition.cs" />
<Compile Include="IMDGPosition.cs" />
<Compile Include="IMessageParagraph.cs" />
<Compile Include="ImportHeader.cs" />
<Compile Include="ImportValue.cs" />
<Compile Include="IMSBCPosition.cs" />
<Compile Include="InfectedArea.cs" />
<Compile Include="ISublistContainer.cs" />

View File

@ -8,7 +8,6 @@
// Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved.
using System;
using System.Collections.Generic;
using System.IO;
using OpenPop.Pop3;
using OpenPop.Mime;
@ -78,7 +77,7 @@ namespace bsmd.email
foreach(MessagePart part in mailMessage.FindAllAttachments())
{
_log.DebugFormat("found attachment named {0}, ContentType {1}", part.FileName, part.ContentType);
_log.InfoFormat("found attachment named {0}, ContentType {1}", part.FileName, part.ContentType);
if (part.FileName.EndsWith(".xls", StringComparison.InvariantCultureIgnoreCase))
{
attachmentLocalFile = Path.Combine(Properties.Settings.Default.ArchiveFolder, part.FileName);
@ -97,7 +96,7 @@ namespace bsmd.email
}
else
{
_log.Debug("no new mail on server");
_log.Info("no new mail on server");
return false;
}
}

View File

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34209
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -12,7 +12,7 @@ namespace bsmd.hisnord.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -23,30 +23,6 @@ namespace bsmd.hisnord.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\work\\bsmd\\nsw\\HIS-NORD\\Transmitter-Tool\\IMP")]
public string OutputDir {
get {
return ((string)(this["OutputDir"]));
}
set {
this["OutputDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\work\\bsmd\\nsw\\HIS-NORD\\Transmitter-Tool\\client.bat")]
public string Transmitter {
get {
return ((string)(this["Transmitter"]));
}
set {
this["Transmitter"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("5")]
@ -61,7 +37,31 @@ namespace bsmd.hisnord.Properties {
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\work\\bsmd\\nsw\\HIS-NORD\\Transmitter-Tool\\RESULTS")]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\svnlager\\BSMD\\nsw\\HIS-NORD\\Transmitter-Tool\\IMP")]
public string OutputDir {
get {
return ((string)(this["OutputDir"]));
}
set {
this["OutputDir"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\svnlager\\BSMD\\nsw\\HIS-NORD\\Transmitter-Tool\\client.bat")]
public string Transmitter {
get {
return ((string)(this["Transmitter"]));
}
set {
this["Transmitter"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\svnlager\\BSMD\\nsw\\HIS-NORD\\Transmitter-Tool\\RESULTS")]
public string ResultDir {
get {
return ((string)(this["ResultDir"]));
@ -73,7 +73,7 @@ namespace bsmd.hisnord.Properties {
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\work\\bsmd\\nsw\\HIS-NORD\\Transmitter-Tool\\ANSWERS")]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\svnlager\\BSMD\\nsw\\HIS-NORD\\Transmitter-Tool\\ANSWERS")]
public string AnswerDir {
get {
return ((string)(this["AnswerDir"]));
@ -85,7 +85,7 @@ namespace bsmd.hisnord.Properties {
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\work\\bsmd\\nsw\\HIS-NORD\\Transmitter-Tool\\ANSWERS_DONE")]
[global::System.Configuration.DefaultSettingValueAttribute("E:\\svnlager\\BSMD\\nsw\\HIS-NORD\\Transmitter-Tool\\ANSWERS_DONE")]
public string AnswerArchiveDir {
get {
return ((string)(this["AnswerArchiveDir"]));

View File

@ -2,23 +2,23 @@
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="bsmd.hisnord.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="OutputDir" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\IMP</Value>
</Setting>
<Setting Name="Transmitter" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\client.bat</Value>
</Setting>
<Setting Name="BatchTimeoutMins" Type="System.Int32" Scope="User">
<Value Profile="(Default)">5</Value>
</Setting>
<Setting Name="OutputDir" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\IMP</Value>
</Setting>
<Setting Name="Transmitter" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\client.bat</Value>
</Setting>
<Setting Name="ResultDir" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\RESULTS</Value>
<Value Profile="(Default)">E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\RESULTS</Value>
</Setting>
<Setting Name="AnswerDir" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\ANSWERS</Value>
<Value Profile="(Default)">E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\ANSWERS</Value>
</Setting>
<Setting Name="AnswerArchiveDir" Type="System.String" Scope="User">
<Value Profile="(Default)">E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\ANSWERS_DONE</Value>
<Value Profile="(Default)">E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\ANSWERS_DONE</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -20,7 +20,19 @@ namespace bsmd.hisnord
public class Request
{
private static ILog _log = LogManager.GetLogger(typeof(Request));
private static Dictionary<Guid, ReportingParty> _reportingPartyDict = null;
internal static Dictionary<Guid, ReportingParty> ReportingPartyDict
{
get
{
if (_reportingPartyDict == null)
{
_reportingPartyDict = DBManager.Instance.GetReportingPartyDict();
}
return _reportingPartyDict;
}
}
public static bool Send(List<Message> messages, bool useTest)
{
bool retval = true;
@ -38,26 +50,33 @@ namespace bsmd.hisnord
_nsw.message_sender = "BSMD";
_nsw.message_recipient = "HIS-NORD";
_nsw.conveyance.owner_sender = new broker_owner();
_nsw.conveyance.owner_sender.contact = new contacts();
// das hier ist der e-mail(!) Empfänger für Error/Violation Meldungen
_nsw.conveyance.owner_sender.contact.name = "BSMD";
_nsw.conveyance.owner_sender.contact.email = "nsw@textbausteine.de";
_nsw.conveyance.owner_sender.contact.firstname = "Daniel Schick";
_nsw.conveyance.owner_sender.contact.phone = "0171 641 6421";
_nsw.conveyance.owner_sender.contact.fax = "+49 (0)421 38 08 887";
if (messages[0].MessageCore.Customer != null)
ReportingParty rp = null;
if(messages[0].MessageCore.DefaultReportingPartyId.HasValue && Request.ReportingPartyDict.ContainsKey(messages[0].MessageCore.DefaultReportingPartyId.Value))
rp = Request.ReportingPartyDict[messages[0].MessageCore.DefaultReportingPartyId.Value];
if(rp == null)
{
_nsw.conveyance.owner_sender.name_short = @"BSMD"; // messages[0].MessageCore.Customer.Name;
_nsw.conveyance.owner_sender.name_long = @"BSMD"; // messages[0].MessageCore.Customer.Name;
_nsw.conveyance.owner_sender.address = new addresstype();
_nsw.conveyance.owner_sender.address.StreetNumber = messages[0].MessageCore.Customer.StreetAndNumber;
_nsw.conveyance.owner_sender.address.PostCode = messages[0].MessageCore.Customer.PostalCode;
_nsw.conveyance.owner_sender.address.Place = messages[0].MessageCore.Customer.City;
_log.ErrorFormat("Cannot find reporting party for core {0}", messages[0].MessageCore.Id);
return false;
}
_nsw.conveyance.owner_sender.name_short = @"BSMD";
_nsw.conveyance.owner_sender.name_long = rp.Name; // messages[0].MessageCore.Customer.Name;
_nsw.conveyance.owner_sender.address = new addresstype();
_nsw.conveyance.owner_sender.address.StreetNumber = rp.StreetAndNumber;
_nsw.conveyance.owner_sender.address.PostCode = rp.PostalCode;
_nsw.conveyance.owner_sender.address.Place = rp.City;
// das hier ist der e-mail(!) Empfänger für Error/Violation Meldungen
_nsw.conveyance.owner_sender.contact = new contacts();
_nsw.conveyance.owner_sender.contact.name = rp.LastName;
_nsw.conveyance.owner_sender.contact.email = rp.EMail;
_nsw.conveyance.owner_sender.contact.firstname = rp.FirstName;
_nsw.conveyance.owner_sender.contact.phone = rp.Phone;
_nsw.conveyance.owner_sender.contact.fax = rp.Fax;
_nsw.document_reference = messages[0].MessageCore.Id.Value.ToString();
if (!messages[0].MessageCore.VisitId.IsNullOrEmpty())
@ -76,7 +95,7 @@ namespace bsmd.hisnord
}
else // liegt noch nichts vor, Id muss beantragt werden
{
_nsw.conveyance.Items = new string[5];
_nsw.conveyance.Items = new object[5];
_nsw.conveyance.ItemsElementName = new ItemsChoiceType[5];
_nsw.conveyance.Items[0] = messages[0].MessageCore.Shipname;
_nsw.conveyance.ItemsElementName[0] = ItemsChoiceType.name;
@ -87,6 +106,7 @@ namespace bsmd.hisnord
_nsw.conveyance.Items[3] = messages[0].MessageCore.PoC;
_nsw.conveyance.ItemsElementName[3] = ItemsChoiceType.PortOfCall;
_nsw.conveyance.Items[4] = messages[0].MessageCore.IsTransit ? messages[0].MessageCore.ETAKielCanal : messages[0].MessageCore.ETA; // TODO Datum konvertieren?
_nsw.conveyance.ItemsElementName[4] = ItemsChoiceType.ETAPortOfCall;
}
#endregion

View File

@ -7,23 +7,23 @@
</configSections>
<userSettings>
<bsmd.hisnord.Properties.Settings>
<setting name="OutputDir" serializeAs="String">
<value>E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\IMP</value>
</setting>
<setting name="Transmitter" serializeAs="String">
<value>E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\client.bat</value>
</setting>
<setting name="BatchTimeoutMins" serializeAs="String">
<value>5</value>
</setting>
<setting name="OutputDir" serializeAs="String">
<value>E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\IMP</value>
</setting>
<setting name="Transmitter" serializeAs="String">
<value>E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\client.bat</value>
</setting>
<setting name="ResultDir" serializeAs="String">
<value>E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\RESULTS</value>
<value>E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\RESULTS</value>
</setting>
<setting name="AnswerDir" serializeAs="String">
<value>E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\ANSWERS</value>
<value>E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\ANSWERS</value>
</setting>
<setting name="AnswerArchiveDir" serializeAs="String">
<value>E:\work\bsmd\nsw\HIS-NORD\Transmitter-Tool\ANSWERS_DONE</value>
<value>E:\svnlager\BSMD\nsw\HIS-NORD\Transmitter-Tool\ANSWERS_DONE</value>
</setting>
</bsmd.hisnord.Properties.Settings>
</userSettings>

Binary file not shown.