using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Shared { public class Logistics { public object NullData { get; private set; } public string JobID { get; private set; } //CellName public long Sequence { get; private set; } //Ticks public DateTime DateTimeFromSequence { get; private set; } public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; } public string MesEntity { get; private set; } //SPC public string ReportFullPath { get; private set; } //Extract file public string ProcessJobID { get; internal set; } //Reactor (duplicate but I want it in the logistics) public string MID { get; internal set; } //Lot & Pocket || Lot public List Tags { get; internal set; } public List Logistics1 { get; internal set; } public List Logistics2 { get; internal set; } public Logistics() { DateTime dateTime = DateTime.Now; NullData = null; JobID = Description.GetCellName(); Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; MesEntity = DefaultMesEntity(dateTime); ReportFullPath = string.Empty; ProcessJobID = nameof(ProcessJobID); MID = nameof(MID); Tags = new List(); Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); Logistics2 = new List(); } public Logistics(object nullData, Dictionary cellNames, Dictionary mesEntities, FileInfo fileInfo, bool useSplitForMID, int? fileInfoLength = null) { NullData = nullData; string mesEntity = string.Empty; string jobID = Description.GetCellName(); DateTime dateTime = fileInfo.LastWriteTime; if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value) dateTime = dateTime.AddTicks(-1); if (string.IsNullOrEmpty(jobID)) { if (cellNames.Count == 1) jobID = cellNames.ElementAt(0).Key; else { string reportFullPathLower = fileInfo.FullName.ToLower(); foreach (var element in cellNames) { if (reportFullPathLower.Contains(element.Key) || reportFullPathLower.Contains(element.Value)) { jobID = element.Key; break; } } } } if (string.IsNullOrEmpty(jobID)) throw new Exception(); if (mesEntities.ContainsKey(jobID)) mesEntity = mesEntities[jobID]; else if (mesEntities.Count == 1) mesEntity = mesEntities.ElementAt(0).Value; // if (string.IsNullOrEmpty(mesEntity)) throw new Exception(); JobID = jobID; Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; MesEntity = mesEntity; ReportFullPath = fileInfo.FullName; ProcessJobID = nameof(ProcessJobID); string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName); if (useSplitForMID) { if (fileNameWithoutExtension.IndexOf(".") > -1) fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim(); if (fileNameWithoutExtension.IndexOf("_") > -1) fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim(); if (fileNameWithoutExtension.IndexOf("-") > -1) fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim(); } MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower()); Tags = new List(); Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); Logistics2 = new List(); } public Logistics(string reportFullPath, string logistics) { string key; DateTime dateTime; string[] segments; Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1")) { NullData = null; JobID = "null"; dateTime = new FileInfo(reportFullPath).LastWriteTime; Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; MesEntity = DefaultMesEntity(dateTime); ReportFullPath = reportFullPath; ProcessJobID = "R##"; MID = "null"; Tags = new List(); Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); Logistics2 = new List(); } else { string logistics1Line1 = Logistics1[0]; key = "NULL_DATA="; if (!logistics1Line1.Contains(key)) NullData = null; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); NullData = segments[1].Split(';')[0]; } key = "JOBID="; if (!logistics1Line1.Contains(key)) JobID = "null"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); JobID = segments[1].Split(';')[0]; } key = "SEQUENCE="; if (!logistics1Line1.Contains(key)) dateTime = new FileInfo(reportFullPath).LastWriteTime; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); if (!long.TryParse(segments[1].Split(';')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks) dateTime = new FileInfo(reportFullPath).LastWriteTime; else dateTime = new DateTime(sequence); } Sequence = dateTime.Ticks; DateTimeFromSequence = dateTime; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds; DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime; if (TotalSecondsSinceLastWriteTimeFromSequence > 600) { if (lastWriteTime != dateTime) try { File.SetLastWriteTime(reportFullPath, dateTime); } catch (Exception) { } } key = "MES_ENTITY="; if (!logistics1Line1.Contains(key)) MesEntity = DefaultMesEntity(dateTime); else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); MesEntity = segments[1].Split(';')[0]; } ReportFullPath = reportFullPath; key = "PROCESS_JOBID="; if (!logistics1Line1.Contains(key)) ProcessJobID = "R##"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); ProcessJobID = segments[1].Split(';')[0]; } key = "MID="; if (!logistics1Line1.Contains(key)) MID = "null"; else { segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries); MID = segments[1].Split(';')[0]; } } Logistics2 logistics2; Tags = new List(); Logistics2 = new List(); for (int i = 1; i < Logistics1.Count(); i++) { if (Logistics1[i].StartsWith("LOGISTICS_2")) { logistics2 = new Logistics2(Logistics1[i]); Logistics2.Add(logistics2); } } for (int i = Logistics1.Count() - 1; i >= 0; i--) { if (Logistics1[i].StartsWith("LOGISTICS_2")) Logistics1.RemoveAt(i); } } public Logistics ShallowCopy() { return (Logistics)this.MemberwiseClone(); } private string DefaultMesEntity(DateTime dateTime) { return string.Concat(dateTime.Ticks, "_MES_ENTITY"); } internal string GetLotViaMostCommonMethod() { return MID.Substring(0, MID.Length - 2); } internal string GetPocketNumberViaMostCommonMethod() { return MID.Substring(MID.Length - 2); } internal void Update(string dateTime, string processJobID, string mid) { if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted)) dateTimeCasted = DateTime.Now; NullData = null; //JobID = Description.GetCellName(); Sequence = dateTimeCasted.Ticks; DateTimeFromSequence = dateTimeCasted; TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds; //MesEntity = DefaultMesEntity(dateTime); //ReportFullPath = string.Empty; ProcessJobID = processJobID; MID = mid; Tags = new List(); Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList(); Logistics2 = new List(); } } }