diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 12aceae5..b6ecc2ef 100644 Binary files a/Stundensheet.xlsx and b/Stundensheet.xlsx differ diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs index d816d079..9e2a4389 100644 --- a/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs +++ b/nsw/Source/bsmd.ExcelReadService/ExcelReadService.cs @@ -68,11 +68,19 @@ namespace bsmd.ExcelReadService using (BSMDPopClient bsmdPopClient = new BSMDPopClient()) { - if (!bsmdPopClient.IsConnected) - { - _log.Error("cannot connect to pop3 server, aborting!"); - this.Stop(); - } + // if (!bsmdPopClient.IsConnected) + //{ + // _log.Error("cannot connect to pop3 server, aborting!"); + // this.Stop(); + //} + + // just for testing + + ExcelReader er = new ExcelReader(@"E:\work\bsmd\nsw\Source\bsmd.ExcelReadService\2016_01_08_BMSD - EUNoAD Tool Rev 3.0_mit Testdaten.xls"); + string amsg; + MessageCore aCore; + bool aReadResult = Util.ProcessSheet(er, out amsg, out aCore); + er.Dispose(); // check and download next e-Mail, saving attachment while (bsmdPopClient.ReceiveSingleMail(out attachmentLocalPath, out messageId, out mailSender)) @@ -90,7 +98,7 @@ namespace bsmd.ExcelReadService _log.Error("Excel sheet could not be interpreted"); } - // set messagecore to createreport and let reportGenerator create a reply + // set messagecore to createreport and let reportGenerator create a reply? // remove e-Mail _log.InfoFormat("deleting mail with messageId {0}", messageId); @@ -100,6 +108,11 @@ namespace bsmd.ExcelReadService _log.InfoFormat("removing local file {0}", attachmentLocalPath); // File.Delete(attachmentLocalPath); + // create a reply sheet (template + scanned highlighted content for verification + + // send reply sheet back to sender + + } } diff --git a/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs b/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs index 2b35c831..2fc29cb7 100644 --- a/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs +++ b/nsw/Source/bsmd.ExcelReadService/ExcelReader.cs @@ -10,50 +10,120 @@ using System; using System.Collections.Generic; using System.Data; +using System.Globalization; using System.IO; using log4net; - -using Excel.Core; -using Excel; +using Microsoft.Office.Interop.Excel; namespace bsmd.ExcelReadService { public class ExcelReader : IDisposable - { - private IExcelDataReader dataReader; + { private ILog _log = LogManager.GetLogger(typeof(ExcelReader)); + private Workbooks _excelWorkbooks; + private Application _excelApp; + private Dictionary _nameDict; public ExcelReader(string filePath) { - using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read)) + this._excelApp = new Application(); + this._excelWorkbooks = _excelApp.Workbooks; + Workbook portcall = _excelWorkbooks.Open(filePath, 0, true, 5, "", "", false, XlPlatform.xlWindows, "", false, false, 0, false, false, false); + _nameDict = new Dictionary(); + foreach(Name name in portcall.Names) { - if (filePath.EndsWith(".xls", StringComparison.InvariantCultureIgnoreCase)) - dataReader = ExcelReaderFactory.CreateBinaryReader(fs); - else if (filePath.EndsWith(".xlsx", StringComparison.InvariantCultureIgnoreCase)) - dataReader = ExcelReaderFactory.CreateOpenXmlReader(fs); - else - throw new ArgumentException(string.Format("saved file {0} is not an excel file", filePath)); + _nameDict[name.Name] = name; } } - public object GetCell(string workSheetName, int row, int col) + public string ReadText(string lookup) { - this.dataReader.IsFirstRowAsColumnNames = false; - DataSet dataSet = dataReader.AsDataSet(); - DataTable workSheet = dataSet.Tables[workSheetName]; - - var cellValue = workSheet.Rows[row][col]; - - return cellValue; + if (!_nameDict.ContainsKey(lookup)) return null; + var val = _nameDict[lookup].RefersToRange.Value; + var val2 = _nameDict[lookup].RefersToRange.Value2; + if(val != null) + return val.ToString(); + if (val2 != null) + return val2.ToString(); + return null; } - public void Dispose() { - if (this.dataReader != null) - this.dataReader.Dispose(); + if (this._excelWorkbooks != null) + this._excelWorkbooks.Close(); + if (this._excelApp != null) + this._excelApp.Quit(); } + + internal DateTime? ReadDate(string lookup) + { + try + { + var val = _nameDict[lookup].RefersToRange.Value; + if (val is DateTime) return val; + if (val is double) + return DateTime.FromOADate(val); + DateTime date; + if (DateTime.TryParse(val, out date)) + return date; + // TODO: weitere varianten ausprobieren + + return null; + } + catch (Exception) + { + _log.WarnFormat("error parsing datetime for lookup {0}", lookup); + return null; + } + } + + internal DateTime? ReadTime(string lookup) + { + try + { + var val = _nameDict[lookup].RefersToRange.Value; + if (val is DateTime) return val; + if (val is double) + return DateTime.FromOADate(val); + DateTime date; + if (DateTime.TryParseExact(val, "HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out date)) + return date; + if (DateTime.TryParseExact(val, "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out date)) + return date; + return null; + } + catch (Exception) + { + _log.WarnFormat("error reading time for lookup {0}", lookup); + return null; + } + } + + internal double? ReadNumber(string lookup) + { + double result; + try + { + var val = _nameDict[lookup].RefersToRange.Value; + if (val is double) return val; + if (val is string) + { + if (double.TryParse(val, NumberStyles.None, CultureInfo.InvariantCulture, out result)) + return result; + if (double.TryParse(val, out result)) + return result; + } + return null; + } + catch (Exception) + { + _log.WarnFormat("error reading number for lookup {0}", lookup); + return null; + } + } + } } diff --git a/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs b/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs new file mode 100644 index 00000000..3bb397b5 --- /dev/null +++ b/nsw/Source/bsmd.ExcelReadService/LocodeDB.cs @@ -0,0 +1,87 @@ +// +// Class: LocodeDB +// Current CLR: 4.0.30319.42000 +// System: Microsoft Visual Studio 10.0 +// Author: dani +// Created: 1/9/2016 10:10:20 PM +// +// Copyright (c) 2016 Informatikbüro Daniel Schick. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SQLite; + +namespace bsmd.ExcelReadService +{ + /// + /// Locodes suchen (zu Orten), die DB ist aus einem github Projekt: + /// https://github.com/kabisa/un_locode + /// + public class LocodeDB + { + private static SQLiteConnection _con; + private const string _locode_DB_NAME = "db.sqlite"; + static LocodeDB() + { + _con = new SQLiteConnection(string.Format("data source={0}; Version=3;", _locode_DB_NAME)); + _con.Open(); + } + + #region public static methods + + public static string LocodeGERFromCity(string city) + { + return LocodeDB.LocodeFromCity(city, "DE"); + } + + /// + /// Lookup and create locode from local sqlite database + /// + public static string LocodeFromCity(string city, string country) + { + string result = null; + string query = string.Format("SELECT city_code FROM locodes JOIN countries ON locodes.country_id = countries.ID WHERE countries.code = '{0}' AND locodes.port='t' AND locodes.name like '{1}'", + country, city); + SQLiteCommand cmd = new SQLiteCommand(query, _con); + IDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + result = reader.GetString(0); + break; + } + reader.Close(); + if (result != null) + result = string.Format("{0}{1}", country, result); + return result; + } + + /// + /// Lookup 2CHAR Country Code from country name (like search). Hopefully this will result in many hits + /// + public static string CountryCodeFromName(string countryName) + { + string result = null; + string query = string.Format("SELECT code FROM countries WHERE countries.name like '{0}'", countryName); + + SQLiteCommand cmd = new SQLiteCommand(query, _con); + IDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + result = reader.GetString(0); + break; + } + reader.Close(); + return result; + + } + + public static void CloseDB() + { + _con.Close(); + } + + #endregion + + } +} diff --git a/nsw/Source/bsmd.ExcelReadService/Util.cs b/nsw/Source/bsmd.ExcelReadService/Util.cs index cb9eb148..8414e01b 100644 --- a/nsw/Source/bsmd.ExcelReadService/Util.cs +++ b/nsw/Source/bsmd.ExcelReadService/Util.cs @@ -9,6 +9,9 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using log4net; using bsmd.database; @@ -21,43 +24,487 @@ namespace bsmd.ExcelReadService public static bool ProcessSheet(ExcelReader reader, out string readMessage, out MessageCore messageCore) { readMessage = "ok"; - messageCore = Util.LookupMessageCore(reader); + + messageCore = Util.LookupMessageCore(reader, out readMessage); + + if (messageCore == null) return false; // cannot work with this sheet or create one + + // load messages if already present + List messages = DBManager.Instance.GetMessagesForCore(messageCore); // start parsing fields - string sheetVersion = reader.GetCell("Portcall", 2, 1) as string; - messageCore.SietasSheetVersion = sheetVersion; + if (messageCore.IsTransit) + { + // scan for transit messages + + // AGNT + + // NOA_NOD + + // SEC + + // POBA + + // POBD + + ScanTIEFA(messages, messageCore, reader); + + ScanBKRA(messages, messageCore, reader); + + ScanSTAT(messages, messageCore, reader); + + // MDH + + // CREW + + // PAS + + // BPOL + + // TOWA + + // HAZA + + // HAZD + + } + else + { + // scan for visit messages + + // AGNT + + // NOA_NOD + + ScanATA(messages, messageCore, reader); + + ScanATD(messages, messageCore, reader); + + // SEC + + // POBA + + // POBD + + ScanNAME(messages, messageCore, reader); + + ScanTIEFA(messages, messageCore, reader); + + ScanTIEFD(messages, messageCore, reader); + + ScanBKRA(messages, messageCore, reader); + + ScanBKRD(messages, messageCore, reader); + + ScanSTAT(messages, messageCore, reader); + + // LADG + + // INFO + + // SERV + + // PRE72H + + // MDH + + // WAS + + // CREW + + // PAS + + // BPOL + + // TOWA + + // TOWD + + // HAZA + + // HAZD + + } + + //string sheetVersion = reader.GetCell("Portcall", 2, 1) as string; + //messageCore.SietasSheetVersion = sheetVersion; + + // save all messages now + + foreach(Message message in messages) + { + DBManager.Instance.Save(message); + + // TODO: Die abhängigen Listen müssen auch gespeichert werden + + } + DBManager.Instance.Save(messageCore); - - return true; } + #region ATA + + static void ScanATA(List messages, MessageCore messageCore, ExcelReader reader) + { + Message ataMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.ATA); + if (ataMessage.Elements.Count == 0) + { + ATA newATA = new ATA(); + newATA.MessageHeader = ataMessage; + ataMessage.Elements.Add(newATA); + } + ATA ata = ataMessage.Elements[0] as ATA; + Util.ScanMessage(ata, reader); + if (!ata.ATAPortOfCall.HasValue && ataMessage.IsNew) + messages.Remove(ataMessage); + } + + #endregion + + #region ATD + + static void ScanATD(List messages, MessageCore messageCore, ExcelReader reader) + { + Message atdMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.ATD); + if (atdMessage.Elements.Count == 0) + { + ATD newATD = new ATD(); + newATD.MessageHeader = atdMessage; + atdMessage.Elements.Add(newATD); + } + ATD atd = atdMessage.Elements[0] as ATD; + Util.ScanMessage(atd, reader); + if (!atd.ATDPortOfCall.HasValue && atdMessage.IsNew) + messages.Remove(atdMessage); + } + + #endregion + + #region TIEFA + + static void ScanTIEFA(List messages, MessageCore messageCore, ExcelReader reader) + { + Message tiefaMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.TIEFA); + if (tiefaMessage.Elements.Count == 0) + { + TIEFA newTIEFA = new TIEFA(); + newTIEFA.MessageHeader = tiefaMessage; + tiefaMessage.Elements.Add(newTIEFA); + } + TIEFA tiefa = tiefaMessage.Elements[0] as TIEFA; + Util.ScanMessage(tiefa, reader); + if (!tiefa.DraughtUponArrival_DMT.HasValue && tiefaMessage.IsNew) + messages.Remove(tiefaMessage); + } + + #endregion + + #region TIEFD + + static void ScanTIEFD(List messages, MessageCore messageCore, ExcelReader reader) + { + Message tiefdMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.TIEFD); + if(tiefdMessage.Elements.Count == 0) + { + TIEFD newTIEFD = new TIEFD(); + newTIEFD.MessageHeader = tiefdMessage; + tiefdMessage.Elements.Add(newTIEFD); + } + TIEFD tiefd = tiefdMessage.Elements[0] as TIEFD; + Util.ScanMessage(tiefd, reader); + if (!tiefd.DraughtUponDeparture_DMT.HasValue && tiefdMessage.IsNew) + messages.Remove(tiefdMessage); + } + + #endregion + + #region NAME + + static void ScanNAME(List messages, MessageCore messageCore, ExcelReader reader) + { + Message nameMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.NAME); + if (nameMessage.Elements.Count == 0) + { + NAME newNAME = new NAME(); + newNAME.MessageHeader = nameMessage; + nameMessage.Elements.Add(newNAME); + } + NAME name = nameMessage.Elements[0] as NAME; + Util.ScanMessage(name, reader); + if (name.NameOfMaster.IsNullOrEmpty() && name.IsNew) + messages.Remove(nameMessage); + } + + #endregion + + #region STAT + + static void ScanSTAT(List messages, MessageCore messageCore, ExcelReader reader) + { + Message statMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.STAT); + if(statMessage.Elements.Count == 0) + { + STAT newSTAT = new STAT(); + newSTAT.MessageHeader = statMessage; + statMessage.Elements.Add(newSTAT); + } + STAT stat = statMessage.Elements[0] as STAT; + Util.ScanMessage(stat, reader); + + if (!stat.Flag.IsNullOrEmpty() && stat.Flag.Length > 2) + stat.Flag = LocodeDB.CountryCodeFromName(stat.Flag); + + if (!stat.Flag.IsNullOrEmpty() && stat.Flag.Length == 2) + { + if (!stat.PortOfRegistry.IsNullOrEmpty() && stat.PortOfRegistry.Length != 5) + stat.PortOfRegistry = LocodeDB.LocodeFromCity(stat.PortOfRegistry, stat.Flag); + } + // wird nicht wieder entfernt (core ist auch da!) + + } + + #endregion + + #region BKRA + + static void ScanBKRA(List messages, MessageCore messageCore, ExcelReader reader) + { + Message bkraMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.BKRA); + for (int i = 0; i < bkraMessage.NumberOfExcelRows; i++) + { + string lnQuantity = string.Format("BKRA.BunkerFuelQuantity_TNE_{0}", i + 1); + string lnType = string.Format("BKRA.BunkerFuelType_{0}", i + 1); + BRKA bkra = bkraMessage.GetSublistElementWithIdentifier((i + 1).ToString()) as BRKA; + if (bkra == null) + { + bkra = new BRKA(); + bkra.Identifier = (i + 1).ToString(); + bkra.MessageHeader = bkraMessage; + bkraMessage.Elements.Add(bkra); + } + + bkra.BunkerFuelQuantity_TNE = reader.ReadNumber(lnQuantity); + bkra.BunkerFuelType = reader.ReadText(lnType); + + // dont save empty element + if(bkra.IsNew && !bkra.BunkerFuelQuantity_TNE.HasValue && bkra.BunkerFuelType.IsNullOrEmpty()) + bkraMessage.Elements.Remove(bkra); + } + } + + #endregion + + #region BKRD + + static void ScanBKRD(List messages, MessageCore messageCore, ExcelReader reader) + { + Message bkrdMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.BKRD); + for (int i = 0; i < bkrdMessage.NumberOfExcelRows; i++) + { + string lnQuantity = string.Format("BKRD.BunkerFuelQuantity_TNE_{0}", i + 1); + string lnType = string.Format("BKRD.BunkerFuelType_{0}", i + 1); + BRKD bkrd = bkrdMessage.GetSublistElementWithIdentifier((i + 1).ToString()) as BRKD; + if (bkrd == null) + { + bkrd = new BRKD(); + bkrd.Identifier = (i + 1).ToString(); + bkrd.MessageHeader = bkrdMessage; + bkrdMessage.Elements.Add(bkrd); + } + + bkrd.BunkerFuelQuantity_TNE = reader.ReadNumber(lnQuantity); + bkrd.BunkerFuelType = reader.ReadText(lnType); + + // dont save empty element + if(bkrd.IsNew && !bkrd.BunkerFuelQuantity_TNE.HasValue && bkrd.BunkerFuelType.IsNullOrEmpty()) + bkrdMessage.Elements.Remove(bkrd); + } + } + + #endregion + + #region LADG + + static void ScanLADG(List messages, MessageCore messageCore, ExcelReader reader) + { + Message ladgMessage = Util.GetMessageWithType(messages, messageCore, Message.NotificationClass.LADG); + for (int i = 0; i < ladgMessage.NumberOfExcelRows; i++) + { + string lnCHT = string.Format("LADG.CargoHandlingType_{0}", i + 1); + string lnType = string.Format("LADG.CargoType_{0}", i + 1); + string lnCNOI = string.Format("LADG.CargoNumberOfItems_{0}", i + 1); + string lnCGQ = string.Format("LADG.CargoGrossQuantity_TNE_{0}", i + 1); + LADG ladg = ladgMessage.GetSublistElementWithIdentifier((i + 1).ToString()) as LADG; + if (ladg == null) + { + ladg = new LADG(); + ladg.Identifier = (i + 1).ToString(); + ladg.MessageHeader = ladgMessage; + ladgMessage.Elements.Add(ladg); + } + + string handlingTypeString = reader.ReadText(lnCHT); + if (!handlingTypeString.IsNullOrEmpty()) + { + // irgendwas mit "*load*" drin wird load, alles andere discharge + ladg.CargoHandlingType = handlingTypeString.Contains("load", StringComparison.InvariantCultureIgnoreCase) ? (byte) 0 : (byte) 1; + } + + ladg.CargoCodeNST = reader.ReadText(lnType); + if (ladg.CargoCodeNST.Length != 2) ladg.CargoCodeNST = null; // stupid validation + + ladg.CargoNumberOfItems = (int?) reader.ReadNumber(lnCNOI); + ladg.CargoGrossQuantity_TNE = reader.ReadNumber(lnCGQ); + + // dont save empty element + if (ladg.IsNew && !ladg.CargoHandlingType.HasValue) + ladgMessage.Elements.Remove(ladg); + } + } + + + #endregion + + + + private static void ScanMessage(DatabaseEntity dbEntity, ExcelReader reader) + { + Type objType = dbEntity.GetType(); + List props = new List(); + + // add lookup properties to scan list + props.AddRange(objType.GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(LookupNameAttribute)))); + + foreach (PropertyInfo property in props) + { + object propValue = property.GetValue(dbEntity, null); + string value = (propValue == null) ? string.Empty : propValue.ToString(); + LookupNameAttribute lookupNameAttribute = Attribute.GetCustomAttribute(property, typeof(LookupNameAttribute)) as LookupNameAttribute; + if (property.PropertyType == typeof(DateTime?)) + { + DateTime? sheetValue = reader.ReadDate(lookupNameAttribute.LookupName); + if (sheetValue != null) + property.SetValue(dbEntity, sheetValue); + } + else if (property.PropertyType == typeof(double?)) + { + double? sheetValue = reader.ReadNumber(lookupNameAttribute.LookupName); + if (sheetValue != null) + property.SetValue(dbEntity, sheetValue); + } + else if (property.PropertyType == typeof(string)) + { + string sheetValue = reader.ReadText(lookupNameAttribute.LookupName); + if (sheetValue != null) + property.SetValue(dbEntity, sheetValue); + } else { + + } + + } + + } + + /// /// Check with cell values if this message core is already in our DB /// - private static MessageCore LookupMessageCore(ExcelReader reader) + private static MessageCore LookupMessageCore(ExcelReader reader, out string message) { - // lookup using field values - double imoDouble = (double) reader.GetCell("SHIP", 13, 6); - string imo = Convert.ToInt32(imoDouble).ToString(); - - string etaDateString = reader.GetCell("Portcall", 16, 8).ToString(); - string etaTime = reader.GetCell("Portcall", 16, 10).ToString(); - DateTime dt = Util.ConstructDate(etaDateString, etaTime); - string poc = reader.GetCell("Portcall", 16, 1) as string; - + // lookup using field values MessageCore result = null; + DateTime? eta = null; + string poc = null; + string imo = null; + message = string.Empty; + bool isTransit = false; - if (DBManager.Instance.GetMessageCoreByShipInfos(imo, dt, poc) == null) + // first check with visit/transit ID + string visitTransitId = reader.ReadText("ID"); + if (visitTransitId != null) { - result = new MessageCore(); + if (bsmd.database.Util.IsVisitId(visitTransitId)) + { + result = DBManager.Instance.GetMessageCoreByVisitId(visitTransitId); + } + else if (bsmd.database.Util.IsTransitId(visitTransitId)) + { + result = DBManager.Instance.GetMessageCoreByTransitId(visitTransitId); + } + } + else + { + // lookup poc, imo, eta + poc = reader.ReadText("Visit.PortOfCall"); + // Prüfen auf Transit + if (poc.ToUpper().Contains("CANAL")) + { + poc = "ZZNOK"; + isTransit = true; + } + else + { + // Im Sheet könnte der Name statt des LOCODES stehen! + if (!RuleEngine.IsGermanLocode(poc)) + { + // somehow lookup LOCODE from the port's name! + poc = LocodeDB.LocodeGERFromCity(poc); + } + } + + imo = reader.ReadText("Visit.IMONumber"); + + // ETA + + DateTime? etaDate = reader.ReadDate("NOA_NOD.ETADateToPortOfCall"); + DateTime? etaTime = reader.ReadTime("NOA_NOD.ETATimeToPortOfCall"); + if (etaDate != null) + { + eta = new DateTime(etaDate.Value.Year, etaDate.Value.Month, etaDate.Value.Day); + if (etaTime != null) + { + eta = new DateTime(etaDate.Value.Year, etaDate.Value.Month, etaDate.Value.Day, etaTime.Value.Hour, etaTime.Value.Minute, etaTime.Value.Second); + } + } + + result = DBManager.Instance.GetMessageCoreByShipInfos(imo, eta.Value, poc); + if (result.IsNew) + result.IsTransit = isTransit; + + } + + + + if (result == null) + { + if (imo == null) + { + message = "IMO number missing or not found"; + return null; + } + + if(poc == null) + { + message = string.Format("Port of call missing or not found for IMO {0}", imo); + return null; + } + + if(eta == null) + { + message = string.Format("ETA missing or not found for IMO {0}", imo); + return null; + } + + result = new MessageCore(); + result.IMO = imo; result.ReportStatus = MessageCore.ReportStatusEnum.COMPLETE; result.Portname = poc; - result.ETA = dt; + result.ETA = eta; if (result.IMO.Length > 7) { _log.WarnFormat("IMO {0} is longer than 7 chars, truncating!", result.IMO); @@ -66,9 +513,8 @@ namespace bsmd.ExcelReadService DBManager.Instance.Save(result); } - return result; - } + } private static DateTime ConstructDate(string etaDateString, string etaTime) { @@ -82,5 +528,18 @@ namespace bsmd.ExcelReadService return result; } + private static Message GetMessageWithType(List messages, MessageCore core, Message.NotificationClass type) + { + foreach(Message message in messages) + if (message.MessageNotificationClass == type) return message; + + Message newMessage = new Message(); + newMessage.MessageNotificationClass = type; + messages.Add(newMessage); + newMessage.MessageCore = core; + + return newMessage; + } + } } diff --git a/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj b/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj index c848f3c5..b5210965 100644 --- a/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj +++ b/nsw/Source/bsmd.ExcelReadService/bsmd.ExcelReadService.csproj @@ -32,18 +32,18 @@ 4 - - ..\packages\ExcelDataReader.2.1.2.3\lib\net45\Excel.dll - - - ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - ..\packages\log4net.2.0.3\lib\net40-full\log4net.dll + + True + + + ..\packages\System.Data.SQLite.Core.1.0.99.0\lib\net45\System.Data.SQLite.dll + @@ -69,6 +69,7 @@ ExcelReadService.cs + Component @@ -85,6 +86,10 @@ + + db.sqlite + PreserveNewest + @@ -114,6 +119,7 @@ +