public RealLot(LotActivity activity, LotActivityRaw raw, DateTime?startTime, DateTime?endTime, DateTime?snapshotTime = null) { SnapshotTime = snapshotTime; StartTime = startTime; EndTime = endTime; IRDGroup = activity.IRDGroup; StepName = raw.Stepname; LotID = activity.LotId; Qty = activity.QtyIn; Location = raw.Location; DeviceType = raw.ProductType; Status = raw.Status; LotActivity = activity; }
public List <LotActivity> CalculateEPTs(List <LotActivity> lotActivities) { LotActivities = lotActivities.ToList(); allSortedOnDeparture = LotActivities.OrderBy(x => x.Departure).ToList(); subsetNoDeparture = LotActivities.Where(x => x.Arrival != null && x.Departure == null).ToList(); subsetNoArrivalDeparture = LotActivities.Where(x => x.Arrival == null && x.Departure == null).ToList(); DateTime?prevDepart = null; for (int i = 0; i < allSortedOnDeparture.Count; i++) { LotActivity act = allSortedOnDeparture[i]; if (act.Departure != null && prevDepart != null && act.WIPIn > -1) { TimeSpan ept = new TimeSpan(); // Calculate EPT if (act.WIPIn > 0) { ept = (DateTime)act.Departure - (DateTime)prevDepart; } else if (act.WIPIn == 0) { ept = (DateTime)act.Departure - (DateTime)act.Arrival; } act.EPT = ept.TotalSeconds; // Calculate overtaken lots (this operation is slow) act.OvertakenLots = subsetNoArrivalDeparture.Count + subsetNoDeparture.Where(x => x.Arrival < act.Arrival).Count() + allSortedOnDeparture.GetRange(i, allSortedOnDeparture.Count - i).Where(x => x.Arrival < act.Arrival).Count(); } prevDepart = act.Departure; } return(LotActivities); }