From 9f31b3cea48de558d91a7697a6294823cfa57b45 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 13 Feb 2023 09:38:42 +0100 Subject: [PATCH] Laden korrigiert, Status Enum statt Flags --- ENI2/App.xaml.cs | 5 +- ENI2/Controls/MaerskListControl.xaml | 18 +++- ENI2/Controls/MaerskListControl.xaml.cs | 71 ++++++++++---- .../OverViewDetailControl.xaml.cs | 4 +- bsmd.database/DBManagerAsync.cs | 42 ++++++--- bsmd.database/MaerskData.cs | 93 +++++++++++++------ bsmd.database/MessageCore.cs | 17 +--- 7 files changed, 171 insertions(+), 79 deletions(-) diff --git a/ENI2/App.xaml.cs b/ENI2/App.xaml.cs index f8cc4b82..c64a3b6e 100644 --- a/ENI2/App.xaml.cs +++ b/ENI2/App.xaml.cs @@ -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 diff --git a/ENI2/Controls/MaerskListControl.xaml b/ENI2/Controls/MaerskListControl.xaml index ab188f04..6285a3ed 100644 --- a/ENI2/Controls/MaerskListControl.xaml +++ b/ENI2/Controls/MaerskListControl.xaml @@ -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"> @@ -54,16 +55,29 @@ + diff --git a/ENI2/Controls/MaerskListControl.xaml.cs b/ENI2/Controls/MaerskListControl.xaml.cs index 0738f479..0eda6839 100644 --- a/ENI2/Controls/MaerskListControl.xaml.cs +++ b/ENI2/Controls/MaerskListControl.xaml.cs @@ -23,12 +23,10 @@ namespace ENI2.Controls /// Interaction logic for MaerskListControl.xaml /// public partial class MaerskListControl : UserControl - { + { #region Fields - - private List searchResult = new List(); - private readonly List filteredResult = new List(); + private readonly ObservableCollection maerskDataList = new ObservableCollection(); 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 filterDict = new Dictionary(); @@ -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 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 requestList = new List(); + 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 diff --git a/ENI2/DetailViewControls/OverViewDetailControl.xaml.cs b/ENI2/DetailViewControls/OverViewDetailControl.xaml.cs index acfc8e62..a0f1db91 100644 --- a/ENI2/DetailViewControls/OverViewDetailControl.xaml.cs +++ b/ENI2/DetailViewControls/OverViewDetailControl.xaml.cs @@ -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) { diff --git a/bsmd.database/DBManagerAsync.cs b/bsmd.database/DBManagerAsync.cs index 9c43ffd9..7960f426 100644 --- a/bsmd.database/DBManagerAsync.cs +++ b/bsmd.database/DBManagerAsync.cs @@ -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 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 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 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; } diff --git a/bsmd.database/MaerskData.cs b/bsmd.database/MaerskData.cs index 433a0ad1..e5fb45d1 100644 --- a/bsmd.database/MaerskData.cs +++ b/bsmd.database/MaerskData.cs @@ -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 /// @@ -41,9 +62,7 @@ namespace bsmd.database /// 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> LoadListAsync(SqlDataReader reader) + { + List result = new List(); + + 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); diff --git a/bsmd.database/MessageCore.cs b/bsmd.database/MessageCore.cs index 1a395ae3..b9c1e99a 100644 --- a/bsmd.database/MessageCore.cs +++ b/bsmd.database/MessageCore.cs @@ -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)