public static Place GetRandomRelocationPlace(this DTOCommand command) { using (var dc = new WMSContext()) { var relocationLocs = dc.PlaceIds .Where(p => p.ID.StartsWith("W:") && p.Status == 0) .Where(p => !p.FK_Places.Any()) .SelectMany(p => dc.Places .Where(pp => pp.PlaceID.StartsWith("W:") && pp.FK_PlaceID.Status == 0 && pp.FK_TU_ID.Blocked == 0) .Where(pp => pp.FK_TU_ID.DimensionClass < pp.FK_PlaceID.DimensionClass) .Where(pp => pp.FK_TU_ID.DimensionClass <= p.DimensionClass) ) .OrderBy(p => p.PlaceID); int count = relocationLocs.Count(); if (count > 0) { return(relocationLocs.Skip(Random.Next(count - 1)).FirstOrDefault()); } else { throw new Exception($"Warehouse full (demand from {command.Source})"); } } }
public static Command ToCommand(this DTOCommand cmd) { return(new Command { Order_ID = cmd.Order_ID, Source = cmd.Source, TU_ID = cmd.TU_ID, Status = cmd.Status, Target = cmd.Target, LastChange = cmd.LastChange }); }
public static string GetSourcePlace(this DTOCommand command) { using (var dc = new WMSContext()) { var place = dc.Places.First(pp => pp.TU_ID == command.TU_ID).PlaceID; if (place == null) { throw new Exception($"No Source found for {command.TU_ID})"); } return(place); } }
/// <summary> /// Find identical TU (skuid,batch,qty) with nearest prod date on level 2 with free level 1 /// </summary> /// <param name="cmd"></param> /// <returns></returns> public static string FindBrotherOnDepth2(this DTOCommand cmd) { List <string> reck = new List <string> { "W:11", "W:12", "W:21", "W:22" }; using (var dc = new WMSContext()) { TU tu = dc.TUs.FirstOrDefault(prop => prop.TU_ID == cmd.TU_ID); string brother = dc.Places .Where(prop => reck.Any(p => prop.PlaceID.StartsWith(p)) && prop.PlaceID.EndsWith("2")) .Where(prop => prop.FK_PlaceID.Status == 0) .Where(prop => !dc.Places.Any(p => p.PlaceID == prop.PlaceID.Substring(0, 10) + ":1")) .Where(prop => !dc.Commands.Any(p => (p.Source == prop.PlaceID && p.Status < Command.CommandStatus.Canceled) || (p.Target == prop.PlaceID.Substring(0, 10) + ":1" && p.Status < Command.CommandStatus.Canceled))) .Select(prop => new { Place = prop.PlaceID, TU = prop.FK_TU_ID.FK_TU.FirstOrDefault() }) .Where(prop => prop.TU.Batch == tu.Batch && prop.TU.SKU_ID == tu.SKU_ID && prop.TU.Qty == tu.Qty) .Union( dc.Commands .Where(prop => reck.Any(p => prop.Target.StartsWith(p)) && prop.Target.EndsWith("2") && prop.Status < Command.CommandStatus.Canceled) .Where(prop => !dc.Commands.Any(p => p.Target == prop.Target.Substring(0, 10) + ":1" && p.Status < Command.CommandStatus.Canceled)) .Where(prop => !dc.Places.Any(p => p.PlaceID == prop.Target.Substring(0, 10) + ":1")) .Where(prop => dc.PlaceIds.Any(p => p.ID == prop.Target.Substring(0, 10) + ":1" && p.Status == 0)) .Select(prop => new { Place = prop.Target, TU = prop.FK_TU_ID.FK_TU.FirstOrDefault() }) .Where(prop => prop.TU.Batch == tu.Batch && prop.TU.SKU_ID == tu.SKU_ID && prop.TU.Qty == tu.Qty) ) .Where(prop => prop.Place.EndsWith("2")) .OrderBy(prop => DbFunctions.DiffHours(prop.TU.ExpDate, tu.ExpDate)) // add order by production date .Select(prop => prop.Place) .FirstOrDefault(); return(brother); } }
/// <summary> /// Get random place /// </summary> /// <param name="command"></param> /// <returns></returns> public static string GetRandomPlace(this DTOCommand command, List <string> forbidden) { using (var dc = new WMSContext()) { var type = dc.TU_IDs .FirstOrDefault(p => p.ID == command.TU_ID); var free = dc.PlaceIds .Where(p => p.ID.StartsWith("W:") && !p.FK_Places.Any() && p.DimensionClass >= type.DimensionClass && p.Status == 0 && (command.Source.StartsWith("T") || (p.ID.Substring(0, 3) == command.Source.Substring(0, 3))) && !p.FK_Target_Commands.Any(prop => prop.Status < Command.CommandStatus.Canceled) && !forbidden.Any(pp => pp == p.ID)) .OrderBy(p => p.DimensionClass) .ThenBy(p => p.ID); int count = free .Where(p => p.DimensionClass == type.DimensionClass) .Count(); if (count == 0) { count = free.Count(); } if (count > 0) { return(free.Skip(Random.Next(count)).FirstOrDefault().ID); } else { return(null); } } }
void IWMSToUI.CancelCommand(DTOCommand cmd) { Model.Singleton().CancelCommand(cmd); }
public static IEnumerable <Command> ToCommand(this DTOCommand cmd) { Command c; if (cmd.Target.StartsWith("W:any") && cmd.Operation == CommandOperation.MoveTray) // move to WH { string target = cmd.GetRandomPlace(new List <string>()); if (target == null) { Place reloc = cmd.GetRandomRelocationPlace(); target = reloc.PlaceID; var dtocmdreloc = new DTOCommand { Source = reloc.PlaceID, TU_ID = reloc.TU_ID }; c = new Command { Order_ID = cmd.Order_ID, Operation = cmd.Operation, TU_ID = reloc.TU_ID, Box_ID = "-", Source = reloc.PlaceID, Target = dtocmdreloc.GetRandomPlace(new List <string>()), Status = cmd.Status, LastChange = cmd.LastChange }; yield return(c); } c = new Command { Order_ID = cmd.Order_ID, Operation = cmd.Operation, TU_ID = cmd.TU_ID, Box_ID = cmd.Box_ID, Source = cmd.Source, Target = target, Status = cmd.Status, LastChange = cmd.LastChange }; if (c.Source == c.Target && c.Operation == CommandOperation.MoveTray) { c.Status = CommandStatus.Finished; } yield return(c); } else { c = new Command { Order_ID = cmd.Order_ID, Operation = cmd.Operation, TU_ID = cmd.TU_ID, Box_ID = cmd.Box_ID, Source = cmd.Source.StartsWith("W:any") && cmd.Operation == CommandOperation.MoveTray ? cmd.GetSourcePlace() : cmd.Source, Target = cmd.Target, Status = cmd.Status, LastChange = cmd.LastChange }; if (c.Source == c.Target && c.Operation == CommandOperation.MoveTray) { c.Status = CommandStatus.Finished; } yield return(c); } }
/// <summary> /// Get random place /// </summary> /// <param name="command"></param> /// <returns></returns> public static string GetRandomPlace(this DTOCommand command, List <string> forbidden) { using (var dc = new WMSContext()) { int frequencyClass = 0; var type = dc.TU_IDs .FirstOrDefault(prop => prop.ID == command.TU_ID); var tu = dc.TUs .FirstOrDefault(prop => prop.TU_ID == command.TU_ID); if (tu != null) { var skuid = dc.SKU_IDs .FirstOrDefault(prop => prop.ID == tu.SKU_ID); frequencyClass = skuid.FrequencyClass; } var source = dc.PlaceIds .FirstOrDefault(prop => prop.ID == command.Source); var bothFree = dc.PlaceIds .Where(p => !p.FK_Places.Any() && p.ID.EndsWith("2") && p.DimensionClass == type.DimensionClass && p.Status == 0 && (command.Source.StartsWith("T") || (p.ID.Substring(0, 3) == command.Source.Substring(0, 3))) && !p.FK_Target_Commands.Any(prop => prop.Status < Command.CommandStatus.Canceled) && !forbidden.Any(prop => p.ID == prop)) .Join(dc.PlaceIds, place => place.ID.Substring(0, 10) + ":1", neighbour => neighbour.ID, (place, neighbour) => new { Place = place, Neighbour = neighbour }) .Where(p => !p.Neighbour.FK_Places.Any() && !p.Neighbour.FK_Target_Commands.Any(prop => prop.Status < Command.CommandStatus.Canceled) && p.Neighbour.Status == 0) .Select(p => p.Place); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 1"); int count = bothFree .Where(p => p.FrequencyClass == frequencyClass) .OrderBy(p => p.ID) .Count(); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 1b"); bothFree = count > 0 ? bothFree .Where(p => p.FrequencyClass == frequencyClass) .OrderBy(p => p.ID) : bothFree .OrderBy(p => p.ID); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 2"); if (count == 0) { count = bothFree.Count(); } if (count > 0) { if (command.Source.StartsWith("W")) { bothFree = bothFree .OrderBy(prop => (prop.PositionHoist - source.PositionHoist) * (prop.PositionHoist - source.PositionHoist) + (prop.PositionTravel - source.PositionTravel) * (prop.PositionTravel - source.PositionTravel)); } Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 3"); return(command.Source.StartsWith("W") ? bothFree.FirstOrDefault().ID : bothFree.Skip(Random.Next(count)).FirstOrDefault().ID); } else { Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 4"); var oneFree = dc.PlaceIds .Where(p => !p.FK_Places.Any() && p.ID.EndsWith("1") && p.DimensionClass == type.DimensionClass && p.Status == 0 && (command.Source.StartsWith("T") || (p.ID.Substring(0, 3) == command.Source.Substring(0, 3))) && !p.FK_Target_Commands.Any(prop => prop.Status < Command.CommandStatus.Canceled) && !forbidden.Any(prop => p.ID == prop)); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 5"); count = oneFree .Where(p => p.FrequencyClass == frequencyClass) .OrderBy(p => p.ID) .Count(); oneFree = count > 0 ? oneFree .Where(p => p.FrequencyClass == frequencyClass) .OrderBy(p => p.ID) : oneFree .OrderBy(p => p.ID); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 6"); if (count == 0) { count = oneFree.Count(); } if (command.Source.StartsWith("W")) { oneFree = oneFree .OrderBy(prop => (prop.PositionHoist - source.PositionHoist) * (prop.PositionHoist - source.PositionHoist) + (prop.PositionTravel - source.PositionTravel) * (prop.PositionTravel - source.PositionTravel)); } count = oneFree.Count(); Log.AddLog(Log.SeverityEnum.Event, nameof(GetRandomPlace), $"CreateInputCommand {command.TU_ID}: random 7"); if (count != 0) { return(command.Source.StartsWith("W") ? oneFree.FirstOrDefault().ID : oneFree.Skip(Random.Next(count)).FirstOrDefault().ID); } throw new Exception($"Warehouse is full (demand from {command.Source})"); } } }