3.6.4.2: Remote Update detection, Neuanlage Anmeldung (ENI-Teil), Neuanlage Anmeldung (NSWSender Teil)
This commit is contained in:
parent
c64ae501ac
commit
4ec9ed8be6
@ -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>
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -50,7 +50,8 @@ namespace ENI2.EditControls
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Loaded += EditCallPurposeDialog_Loaded;
|
||||
Loaded += EditCallPurposeDialog_Loaded;
|
||||
AddClicked += () => { this.comboBoxCode.Focus(); };
|
||||
}
|
||||
|
||||
public CallPurpose CallPurpose { get; set; }
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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
|
||||
|
||||
31
ENI-2/ENI2/ENI2/Properties/Settings.Designer.cs
generated
31
ENI-2/ENI2/ENI2/Properties/Settings.Designer.cs
generated
@ -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"]));
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
|
||||
90
ENI-2/ENI2/ENI2/Util/DatabaseEntityWatchdog.cs
Normal file
90
ENI-2/ENI2/ENI2/Util/DatabaseEntityWatchdog.cs
Normal 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.
@ -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
|
||||
|
||||
38
nsw/Source/SQL/Import_Tables.sql
Normal file
38
nsw/Source/SQL/Import_Tables.sql
Normal 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
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
158
nsw/Source/bsmd.database/ImportHeader.cs
Normal file
158
nsw/Source/bsmd.database/ImportHeader.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
||||
158
nsw/Source/bsmd.database/ImportValue.cs
Normal file
158
nsw/Source/bsmd.database/ImportValue.cs
Normal 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
|
||||
|
||||
}
|
||||
}
|
||||
@ -139,7 +139,8 @@ namespace bsmd.database
|
||||
SEARCH_CORE_FILTERS,
|
||||
QUERY_NSW_STATUS,
|
||||
NOT_DELETED,
|
||||
DELETED
|
||||
DELETED,
|
||||
IMPORTHEADER_ID
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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("")]
|
||||
@ -1,4 +1,4 @@
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion("3.6.4.*")]
|
||||
[assembly: AssemblyVersion("3.6.5.*")]
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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" />
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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"]));
|
||||
|
||||
@ -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>
|
||||
@ -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
|
||||
|
||||
@ -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.
Loading…
Reference in New Issue
Block a user