264 lines
11 KiB
C#
264 lines
11 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;
|
|
|
|
namespace ENI2.Controls
|
|
{
|
|
/// <summary>
|
|
/// 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
|
|
|
|
#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 void PerformSearch()
|
|
{
|
|
this.dataGridPOCores.ItemsSource = null;
|
|
this.filteredResult.Clear();
|
|
|
|
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
|
|
this.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")));
|
|
|
|
// sortieren nach ETA (kombiniert)
|
|
searchResult.Sort((x, y) => DateTime.Compare(x.ETADisplay ?? DateTime.MaxValue, y.ETADisplay ?? DateTime.MaxValue));
|
|
|
|
this.dataGridPOCores.SelectedItem = null;
|
|
this.filteredResult.AddRange(searchResult);
|
|
|
|
}
|
|
|
|
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 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)
|
|
{
|
|
// TODO: find matching message cores..
|
|
|
|
}
|
|
|
|
// 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)
|
|
maerskDataList.Add(md);
|
|
this.dataGridPOCores.Items.Refresh();
|
|
}
|
|
|
|
stream.Close();
|
|
}
|
|
}
|
|
|
|
private void buttonExport_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|