Laden korrigiert, Status Enum statt Flags
This commit is contained in:
parent
6031b5df94
commit
9f31b3cea4
@ -60,7 +60,10 @@ namespace ENI2
|
||||
|
||||
ResetSplashCreated.WaitOne();
|
||||
|
||||
base.OnStartup(e);
|
||||
base.OnStartup(e);
|
||||
|
||||
// set connectnion string to async loader
|
||||
DBManagerAsync.ConnectionString = ENI2.Properties.Settings.Default.ConnectionString;
|
||||
|
||||
// initialize static / localized lookups from sqlite database
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
|
||||
xmlns:p="clr-namespace:ENI2.Properties"
|
||||
xmlns:local="clr-namespace:ENI2.Controls"
|
||||
xmlns:db="clr-namespace:bsmd.database;assembly=bsmd.database"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<UserControl.Resources>
|
||||
@ -54,16 +55,29 @@
|
||||
<local:ENIDataGrid.RowStyle>
|
||||
<Style TargetType="DataGridRow">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsNextThreeDays}" Value="true">
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.ID}">
|
||||
<Setter Property="Background" Value="LightGreen"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding HasNoIdea}" Value="true">
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.NO_ID}">
|
||||
<Setter Property="Background" Value="LightPink"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.UPDATED}">
|
||||
<Setter Property="Background" Value="LightYellow"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.REQUESTING_ID}">
|
||||
<Setter Property="Background" Value="Yellow"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.ID_ASSIGNED}">
|
||||
<Setter Property="Background" Value="GreenYellow"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.NO_ID_AND_DUE}">
|
||||
<Setter Property="Background" Value="Red"></Setter>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</local:ENIDataGrid.RowStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Col A" Binding="{Binding ColA}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Col B" Binding="{Binding ColB}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Ship. Area" Binding="{Binding ColC}" IsReadOnly="True" />
|
||||
|
||||
@ -23,12 +23,10 @@ namespace ENI2.Controls
|
||||
/// Interaction logic for MaerskListControl.xaml
|
||||
/// </summary>
|
||||
public partial class MaerskListControl : UserControl
|
||||
{
|
||||
{
|
||||
|
||||
#region Fields
|
||||
|
||||
private List<MessageCore> searchResult = new List<MessageCore>();
|
||||
private readonly List<MessageCore> filteredResult = new List<MessageCore>();
|
||||
|
||||
private readonly ObservableCollection<MaerskData> maerskDataList = new ObservableCollection<MaerskData>();
|
||||
private const uint MAX_EMPTY_ROWS_ON_IMPORT = 3; // import breaks if more than this count of empty rows have been read
|
||||
|
||||
@ -116,10 +114,8 @@ namespace ENI2.Controls
|
||||
|
||||
#region private methods
|
||||
|
||||
private void PerformSearch()
|
||||
private async void PerformSearch()
|
||||
{
|
||||
this.dataGridPOCores.ItemsSource = null;
|
||||
this.filteredResult.Clear();
|
||||
|
||||
Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>();
|
||||
|
||||
@ -131,17 +127,25 @@ namespace ENI2.Controls
|
||||
filterDict.Add(MessageCore.SearchFilterType.FILTER_FLAG_EQ, "0");
|
||||
|
||||
// suche auslösen
|
||||
this.searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict);
|
||||
List<MessageCore> searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict);
|
||||
|
||||
// alle anderen Häfen weg
|
||||
this.searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals("DEBRV") && !item.PoC.Equals("DEWHV") && !item.PoC.Equals("DEWVN")));
|
||||
searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals("DEBRV") && !item.PoC.Equals("DEWHV") && !item.PoC.Equals("DEWVN")));
|
||||
|
||||
// sortieren nach ETA (kombiniert)
|
||||
searchResult.Sort((x, y) => DateTime.Compare(x.ETADisplay ?? DateTime.MaxValue, y.ETADisplay ?? DateTime.MaxValue));
|
||||
// alles entfernen was keine Maersk Xtra-Data hat (=noch nicht schon einmal importiert wurde)
|
||||
foreach(MessageCore core in searchResult)
|
||||
{
|
||||
MaerskData md = await DBManagerAsync.LoadMaerskDataForCoreAsync(core.Id.Value);
|
||||
if(md != null)
|
||||
{
|
||||
md.MessageCore = core;
|
||||
md.MessageCoreId = core.Id.Value;
|
||||
if(!maerskDataList.Contains(md)) // DatabaseEntity implements IEquatable
|
||||
this.maerskDataList.Add(md);
|
||||
}
|
||||
}
|
||||
|
||||
this.dataGridPOCores.SelectedItem = null;
|
||||
this.filteredResult.AddRange(searchResult);
|
||||
|
||||
}
|
||||
|
||||
private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
|
||||
@ -248,11 +252,23 @@ namespace ENI2.Controls
|
||||
// sort
|
||||
// importData.Sort((x, y) => DateTime.Compare(x.ETA ?? DateTime.MaxValue, y.ETA ?? DateTime.MaxValue));
|
||||
|
||||
// merge the result into our grid data source list
|
||||
// TODO
|
||||
|
||||
foreach (MaerskData md in importData)
|
||||
{
|
||||
md.Status = MaerskData.MDStatus.ID;
|
||||
|
||||
if (md.ColM.IsNullOrEmpty())
|
||||
{
|
||||
md.Status = MaerskData.MDStatus.NO_ID;
|
||||
if (md.ETA.HasValue && md.ETA.Value.IsNextXDays(3))
|
||||
md.Status = MaerskData.MDStatus.NO_ID_AND_DUE;
|
||||
}
|
||||
|
||||
// TODO: check if data has been updated
|
||||
|
||||
// TODO: Check if data is already present
|
||||
|
||||
maerskDataList.Add(md);
|
||||
}
|
||||
this.dataGridPOCores.Items.Refresh();
|
||||
}
|
||||
|
||||
@ -281,6 +297,29 @@ namespace ENI2.Controls
|
||||
private void buttonRequestIds_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// find all entries from now until 3 days into the future and track parallel requests
|
||||
List<MaerskData> requestList = new List<MaerskData>();
|
||||
foreach (MaerskData md in this.dataGridPOCores.SelectedItems)
|
||||
{
|
||||
if ((md.MessageCore != null) || (!md.ColM.IsNullOrEmpty())) continue; // already requested
|
||||
requestList.Add(md);
|
||||
md.Status = MaerskData.MDStatus.REQUESTING_ID;
|
||||
}
|
||||
if(requestList.Count == 0)
|
||||
{
|
||||
MessageBox.Show("No valid rows selected", "Warning", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Todo:
|
||||
|
||||
// 1) create MessageCore and message classes
|
||||
|
||||
// 2) request dbh Id
|
||||
|
||||
// 3) register watchdog for request completion
|
||||
|
||||
}
|
||||
this.dataGridPOCores.Items.Refresh();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -417,11 +417,11 @@ namespace ENI2.DetailViewControls
|
||||
mhd.MessageHistories = DBManager.Instance.GetMessageHistories(historyMessage.Id.Value);
|
||||
mhd.RequestReload += () => this.OnRequestReload(this.Core.Id.Value);
|
||||
mhd.Show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void contextSendMessage(object sender, RoutedEventArgs e)
|
||||
{
|
||||
{
|
||||
MessageBoxResult result = MessageBox.Show(Properties.Resources.textConfirmSend, Properties.Resources.textConfirm, MessageBoxButton.YesNo, MessageBoxImage.Question);
|
||||
if (result == MessageBoxResult.Yes)
|
||||
{
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
// connection pooling.. will try it out in Maersk/PO numbers and expand over the whole
|
||||
// app later
|
||||
|
||||
using log4net;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
@ -10,16 +11,13 @@ using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using log4net;
|
||||
|
||||
namespace bsmd.database
|
||||
{
|
||||
public static class DBManagerAsync
|
||||
{
|
||||
#region Fields
|
||||
|
||||
private static ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
|
||||
private static readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
|
||||
private static readonly ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
|
||||
|
||||
#endregion
|
||||
|
||||
@ -66,6 +64,24 @@ namespace bsmd.database
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<MaerskData> LoadMaerskDataForCoreAsync(Guid messageCoreId)
|
||||
{
|
||||
SqlCommand cmd = new SqlCommand();
|
||||
MaerskData md = new MaerskData();
|
||||
md.PrepareLoadCommand(cmd, Message.LoadFilter.BY_CORE, messageCoreId);
|
||||
SqlDataReader reader = await PerformCommandAsync(cmd);
|
||||
List<MaerskData> resultList = await md.LoadListAsync(reader);
|
||||
MaerskData result = null;
|
||||
if(resultList.Count > 0)
|
||||
{
|
||||
if(resultList.Count > 1)
|
||||
_log.WarnFormat("more than one xtra data found for core id {0}", messageCoreId);
|
||||
result = resultList[0];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
@ -75,15 +91,13 @@ namespace bsmd.database
|
||||
internal static async Task<SqlDataReader> PerformCommandAsync(SqlCommand cmd)
|
||||
{
|
||||
SqlDataReader reader = null;
|
||||
|
||||
// await _asyncSemaphore.WaitAsync();
|
||||
|
||||
try
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(ConnectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
reader = await cmd.ExecuteReaderAsync();
|
||||
}
|
||||
SqlConnection connection = new SqlConnection(ConnectionString);
|
||||
await connection.OpenAsync();
|
||||
cmd.Connection = connection;
|
||||
reader = await cmd.ExecuteReaderAsync();
|
||||
}
|
||||
catch (SqlException ex)
|
||||
{
|
||||
@ -96,10 +110,6 @@ namespace bsmd.database
|
||||
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
// _asyncSemaphore.Release();
|
||||
}
|
||||
|
||||
return reader;
|
||||
}
|
||||
@ -113,6 +123,7 @@ namespace bsmd.database
|
||||
using (SqlConnection connection = new SqlConnection(ConnectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
cmd.Connection = connection;
|
||||
result = await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
@ -139,6 +150,7 @@ namespace bsmd.database
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(ConnectionString))
|
||||
{
|
||||
cmd.Connection = connection;
|
||||
object r = await cmd.ExecuteScalarAsync();
|
||||
if (r == null) { result = null; }
|
||||
else if (r == DBNull.Value) { result = null; }
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
@ -29,6 +30,26 @@ namespace bsmd.database
|
||||
|
||||
#endregion
|
||||
|
||||
#region Enums
|
||||
|
||||
public enum MDStatus
|
||||
{
|
||||
[Description("No id")]
|
||||
NO_ID,
|
||||
[Description("Updated")]
|
||||
UPDATED,
|
||||
[Description("Requesting id")]
|
||||
REQUESTING_ID,
|
||||
[Description("Id assigned")]
|
||||
ID_ASSIGNED,
|
||||
[Description("upcoming without id")]
|
||||
NO_ID_AND_DUE,
|
||||
[Description("Has id")]
|
||||
ID
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
@ -41,9 +62,7 @@ namespace bsmd.database
|
||||
/// </summary>
|
||||
public MessageCore Core { get; set; }
|
||||
|
||||
public bool HasNoIdea => ColM.IsNullOrEmpty();
|
||||
|
||||
public bool IsNextThreeDays => ETA.HasValue && ETA.Value.IsNextXDays(3);
|
||||
public MDStatus Status { get; set; }
|
||||
|
||||
public DateTime? ETA { get; set; }
|
||||
|
||||
@ -106,36 +125,56 @@ namespace bsmd.database
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
MaerskData md = new MaerskData();
|
||||
|
||||
md.id = reader.GetGuid(0);
|
||||
if (!reader.IsDBNull(1)) md.MessageCoreId = reader.GetGuid(1);
|
||||
if (!reader.IsDBNull(2)) md.ColA = reader.GetString(2);
|
||||
if (!reader.IsDBNull(3)) md.ColB = reader.GetString(3);
|
||||
if (!reader.IsDBNull(4)) md.ColC = reader.GetString(4);
|
||||
if (!reader.IsDBNull(5)) md.ColD = reader.GetString(5);
|
||||
if (!reader.IsDBNull(6)) md.ColE = reader.GetString(6);
|
||||
if (!reader.IsDBNull(7)) md.ColF = reader.GetString(7);
|
||||
if (!reader.IsDBNull(8)) md.ColG = reader.GetString(8);
|
||||
if (!reader.IsDBNull(9)) md.ColH = reader.GetString(9);
|
||||
if (!reader.IsDBNull(10)) md.ColI = reader.GetString(10);
|
||||
if (!reader.IsDBNull(11)) md.ColJ = reader.GetString(11);
|
||||
if (!reader.IsDBNull(12)) md.ColK = reader.GetString(12);
|
||||
if (!reader.IsDBNull(13)) md.ColL = reader.GetString(13);
|
||||
if (!reader.IsDBNull(14)) md.ColM = reader.GetString(14);
|
||||
if (!reader.IsDBNull(15)) md.Remark = reader.GetString(15);
|
||||
|
||||
// try parsing the column to datetime
|
||||
if (DateTime.TryParse(md.ColK, out DateTime eta))
|
||||
ETA = eta;
|
||||
|
||||
result.Add(md);
|
||||
result.Add(ReadRowFromReader(reader));
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<List<MaerskData>> LoadListAsync(SqlDataReader reader)
|
||||
{
|
||||
List<MaerskData> result = new List<MaerskData>();
|
||||
|
||||
while (await reader.ReadAsync())
|
||||
{
|
||||
result.Add(ReadRowFromReader(reader));
|
||||
}
|
||||
reader.Close();
|
||||
return result;
|
||||
}
|
||||
|
||||
private MaerskData ReadRowFromReader(IDataReader reader)
|
||||
{
|
||||
MaerskData md = null;
|
||||
if (reader != null)
|
||||
{
|
||||
md = new MaerskData();
|
||||
|
||||
md.id = reader.GetGuid(0);
|
||||
if (!reader.IsDBNull(1)) md.MessageCoreId = reader.GetGuid(1);
|
||||
if (!reader.IsDBNull(2)) md.ColA = reader.GetString(2);
|
||||
if (!reader.IsDBNull(3)) md.ColB = reader.GetString(3);
|
||||
if (!reader.IsDBNull(4)) md.ColC = reader.GetString(4);
|
||||
if (!reader.IsDBNull(5)) md.ColD = reader.GetString(5);
|
||||
if (!reader.IsDBNull(6)) md.ColE = reader.GetString(6);
|
||||
if (!reader.IsDBNull(7)) md.ColF = reader.GetString(7);
|
||||
if (!reader.IsDBNull(8)) md.ColG = reader.GetString(8);
|
||||
if (!reader.IsDBNull(9)) md.ColH = reader.GetString(9);
|
||||
if (!reader.IsDBNull(10)) md.ColI = reader.GetString(10);
|
||||
if (!reader.IsDBNull(11)) md.ColJ = reader.GetString(11);
|
||||
if (!reader.IsDBNull(12)) md.ColK = reader.GetString(12);
|
||||
if (!reader.IsDBNull(13)) md.ColL = reader.GetString(13);
|
||||
if (!reader.IsDBNull(14)) md.ColM = reader.GetString(14);
|
||||
if (!reader.IsDBNull(15)) md.Remark = reader.GetString(15);
|
||||
|
||||
// try parsing the column to datetime
|
||||
if (DateTime.TryParse(md.ColK, out DateTime eta))
|
||||
ETA = eta;
|
||||
}
|
||||
return md;
|
||||
}
|
||||
|
||||
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
|
||||
{
|
||||
string query = string.Format("SELECT Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12 , Field13, Field14 FROM {0} ", this.Tablename);
|
||||
|
||||
@ -466,12 +466,7 @@ namespace bsmd.database
|
||||
}
|
||||
}
|
||||
|
||||
public override void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
|
||||
{
|
||||
this.PrepareLoadCommand(cmd, filter, false, criteria);
|
||||
}
|
||||
|
||||
public void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, bool joinXtraData, params object[] criteria)
|
||||
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder("SELECT ");
|
||||
if (this.ResultLimit > 0)
|
||||
@ -498,18 +493,8 @@ namespace bsmd.database
|
||||
}
|
||||
}
|
||||
|
||||
if(joinXtraData)
|
||||
{
|
||||
sb.Append(", [XtraData].[Id], [XtraData].[Field1], "); // ist das so schlau?
|
||||
}
|
||||
|
||||
sb.AppendFormat(" FROM {0} ", this.Tablename);
|
||||
|
||||
if(joinXtraData)
|
||||
{
|
||||
sb.AppendFormat(" LEFT JOIN XtraData ON [{0}].Id = [XtraData].[ReferenceId] ", this.Tablename);
|
||||
}
|
||||
|
||||
this.SetFilters(sb, cmd, filter, criteria);
|
||||
bool latestIdSearch = false;
|
||||
if(filter == Message.LoadFilter.SEARCH_CORE_FILTERS)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user