Esempio n. 1
0
 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})");
         }
     }
 }
Esempio n. 2
0
 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
     });
 }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        /// <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);
            }
        }
Esempio n. 5
0
        /// <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);
                }
            }
        }
Esempio n. 6
0
 void IWMSToUI.CancelCommand(DTOCommand cmd)
 {
     Model.Singleton().CancelCommand(cmd);
 }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 8
0
        /// <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})");
                }
            }
        }