348 lines
14 KiB
C#
348 lines
14 KiB
C#
// Copyright (c) 2017 schick Informatik
|
|
// Description: PO Nummer Übersicht. Ergänzung Nummern. Excel Export
|
|
//
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using Microsoft.Win32;
|
|
|
|
using Microsoft.Office.Interop.Excel;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using bsmd.database;
|
|
using ExcelDataReader;
|
|
using System.Collections.ObjectModel;
|
|
using ENI2.Excel;
|
|
|
|
namespace ENI2.Controls
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for MaerskListControl.xaml
|
|
/// </summary>
|
|
public partial class MaerskListControl : UserControl
|
|
{
|
|
|
|
#region Fields
|
|
|
|
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
|
|
|
|
#endregion
|
|
|
|
#region Construction
|
|
|
|
public MaerskListControl()
|
|
{
|
|
InitializeComponent();
|
|
Loaded += POList_Loaded;
|
|
this.dateTimePickerFrom.Value = DateTime.Today.AddDays(-14);
|
|
this.dateTimePickerTo.Value = DateTime.Today.AddDays(14);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region control event handler
|
|
|
|
private void POList_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
dataGridPOCores.ItemsSource = maerskDataList;
|
|
}
|
|
|
|
private void dataGridPOCores_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
|
|
{
|
|
/*
|
|
if (e.EditAction == DataGridEditAction.Commit)
|
|
{
|
|
if (e.Column == gridColumnPONumber)
|
|
{
|
|
// validate for "true" number
|
|
var el = e.EditingElement as System.Windows.Controls.TextBox;
|
|
if (!el.Text.IsDigitsOnly())
|
|
{
|
|
el.Text = string.Empty;
|
|
e.Cancel = true;
|
|
}
|
|
else
|
|
{
|
|
// buttonSaveChanges.IsEnabled = true;
|
|
MessageCore editedCore = this.filteredResult[e.Row.GetIndex()];
|
|
editedCore.IsDirty = true;
|
|
}
|
|
}
|
|
if(e.Column == gridColumnGroup)
|
|
{
|
|
var el = e.EditingElement as ComboBox;
|
|
DictionaryEntry selectedItem = (DictionaryEntry) el.SelectedItem;
|
|
MessageCore.CoreFlags coreFlag = (MessageCore.CoreFlags) Enum.Parse(typeof(MessageCore.CoreFlags), selectedItem.Value.ToString());
|
|
MessageCore editedCore = this.filteredResult[e.Row.GetIndex()];
|
|
// clear all first
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.MAERSK_BHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_BHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_WHV);
|
|
editedCore.SetFlag(false, MessageCore.CoreFlags.HOEGH);
|
|
if (coreFlag != MessageCore.CoreFlags.NONE)
|
|
{
|
|
editedCore.SetFlag(true, coreFlag);
|
|
}
|
|
// buttonSaveChanges.IsEnabled = true;
|
|
editedCore.IsDirty = true;
|
|
}
|
|
if(e.Column == gridColumnATA)
|
|
{
|
|
var el = e.EditingElement as System.Windows.Controls.TextBox;
|
|
if(DateTime.TryParse(el.Text, out DateTime localATA))
|
|
{
|
|
MessageCore editedCore = this.filteredResult[e.Row.GetIndex()];
|
|
editedCore.ATA = DateTime.SpecifyKind(localATA, DateTimeKind.Local).ToUniversalTime();
|
|
// buttonSaveChanges.IsEnabled = true;
|
|
editedCore.IsDirty = true;
|
|
}
|
|
else
|
|
{
|
|
el.Text = string.Empty;
|
|
e.Cancel = true;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region private methods
|
|
|
|
private async void PerformSearch()
|
|
{
|
|
|
|
Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>();
|
|
|
|
// Die Suche findet in dem eingestellten Intervall statt
|
|
uint from = this.dateTimePickerFrom.Value.Value.ToUniversalTime().ToUnixTimeStamp();
|
|
uint to = this.dateTimePickerTo.Value.Value.ToUniversalTime().ToUnixTimeStamp();
|
|
filterDict.Add(MessageCore.SearchFilterType.FILTER_ETA, string.Format("{0}:{1}", from.ToString() ?? "", to.ToString() ?? ""));
|
|
// eingeschränkt auf flags
|
|
filterDict.Add(MessageCore.SearchFilterType.FILTER_FLAG_EQ, "0");
|
|
|
|
// suche auslösen
|
|
List<MessageCore> searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict);
|
|
|
|
// alle anderen Häfen weg
|
|
searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals("DEBRV") && !item.PoC.Equals("DEWHV") && !item.PoC.Equals("DEWVN")));
|
|
|
|
// 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;
|
|
}
|
|
|
|
private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
|
|
{
|
|
if (fieldNum >= reader.FieldCount) return null;
|
|
if (reader.GetFieldType(fieldNum) == typeof(string))
|
|
return reader.GetString(fieldNum).Clean();
|
|
if (reader.GetFieldType(fieldNum) == typeof(DateTime))
|
|
return reader.GetDateTime(fieldNum).ToString();
|
|
if (reader.GetFieldType(fieldNum) == typeof(int))
|
|
return reader.GetInt32(fieldNum).ToString();
|
|
if (reader.GetFieldType(fieldNum) == typeof(double))
|
|
return ((int) reader.GetDouble(fieldNum)).ToString();
|
|
Type theType = reader.GetFieldType(fieldNum);
|
|
return null;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region button event handler
|
|
|
|
private void buttonLoad_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Util.UIHelper.SetBusyState();
|
|
this.PerformSearch();
|
|
}
|
|
|
|
private async void buttonImport_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
OpenFileDialog ofd = new OpenFileDialog
|
|
{
|
|
Filter = "Excel Files|*.xls;*.xlsx"
|
|
};
|
|
if (ofd.ShowDialog() ?? false)
|
|
{
|
|
FileStream stream;
|
|
try
|
|
{
|
|
stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
return;
|
|
}
|
|
|
|
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
|
|
{
|
|
List<MaerskData> importData = new List<MaerskData>();
|
|
uint emptyRowCnt = 0;
|
|
|
|
try
|
|
{
|
|
while (reader.Read())
|
|
{
|
|
if (reader.FieldCount < 13)
|
|
{
|
|
throw new InvalidDataException("Sheet must have 13 columns of data");
|
|
}
|
|
|
|
MaerskData md = new MaerskData();
|
|
md.ColA = ReadFieldAsString(reader, 0);
|
|
if (!reader.IsDBNull(1)) md.ColB = ReadFieldAsString(reader, 1);
|
|
if (!reader.IsDBNull(2)) md.ColC = ReadFieldAsString(reader, 2);
|
|
if (!reader.IsDBNull(3)) md.ColD = ReadFieldAsString(reader, 3);
|
|
if (!reader.IsDBNull(4)) md.ColE = ReadFieldAsString(reader, 4);
|
|
if (!reader.IsDBNull(5)) md.ColF = ReadFieldAsString(reader, 5);
|
|
if (!reader.IsDBNull(6)) md.ColG = ReadFieldAsString(reader, 6);
|
|
if (!reader.IsDBNull(7)) md.ColH = ReadFieldAsString(reader, 7);
|
|
if (!reader.IsDBNull(8)) md.ColI = ReadFieldAsString(reader, 8);
|
|
if (!reader.IsDBNull(9)) md.ColJ = ReadFieldAsString(reader, 9);
|
|
if (!reader.IsDBNull(10)) { md.ETA = reader.GetDateTime(10); md.ColK = md.ETA.ToString(); }
|
|
if (!reader.IsDBNull(11)) md.ColL = ReadFieldAsString(reader, 11);
|
|
if (!reader.IsDBNull(12)) md.ColM = ReadFieldAsString(reader, 12);
|
|
if (!reader.IsDBNull(13)) md.Remark = ReadFieldAsString(reader, 13);
|
|
|
|
if (!md.ColF.IsNullOrEmpty()) // only add this if IMO is set
|
|
importData.Add(md);
|
|
else
|
|
emptyRowCnt++;
|
|
if (emptyRowCnt > MAX_EMPTY_ROWS_ON_IMPORT) break;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
|
|
// we only want cores for the next 3 days
|
|
if (importData.Count > 0)
|
|
{
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.BUSY;
|
|
// TODO: find matching message cores..
|
|
foreach(MaerskData md in importData)
|
|
{
|
|
if(!md.ColM.IsNullOrEmpty())
|
|
{
|
|
md.MessageCore = await DBManagerAsync.LoadCoreByVisitIdAsync(md.ColM);
|
|
}
|
|
}
|
|
busyControl.BusyState = Util.UIHelper.BusyStateEnum.NEUTRAL;
|
|
}
|
|
|
|
// sort
|
|
// importData.Sort((x, y) => DateTime.Compare(x.ETA ?? DateTime.MaxValue, y.ETA ?? DateTime.MaxValue));
|
|
|
|
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();
|
|
}
|
|
|
|
stream.Close();
|
|
}
|
|
}
|
|
|
|
private void buttonExport_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
// Export of the current collection
|
|
SaveFileDialog sfd = new SaveFileDialog()
|
|
{
|
|
Filter = "Excel Files|*.xls;*.xlsx"
|
|
};
|
|
if(sfd.ShowDialog() ?? false)
|
|
{
|
|
Util.UIHelper.SetBusyState();
|
|
ExcelManager em = new ExcelManager();
|
|
try
|
|
{
|
|
List<MaerskData> exportList = new List<MaerskData>(this.maerskDataList);
|
|
em.ExportMaersk(exportList, sfd.FileName);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Export failed", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
private async void buttonSave_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
// save the current list to DB (only if the entries have matching cores!)
|
|
foreach(MaerskData md in this.maerskDataList)
|
|
{
|
|
if(md.MessageCore != null)
|
|
{
|
|
await DBManagerAsync.Save(md.MessageCore);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
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
|
|
|
|
}
|
|
}
|