Пример #1
0
        public ActionResult Edit([Bind(Include = "Id,StoragePlaceId,ReservedAmount,PickedAmount,Comment,OrderProductId")] PickingOrder updated)
        {
            var orderProduct = orderProductRepo.GetItem((int)updated.OrderProductId);

            if (updated.PickedAmount > updated.ReservedAmount)
            {
                ModelState.AddModelError("PickedAmount", "Plockat antal är större än det reserade antalet.");
            }
            if (updated.PickedAmount < 0)
            {
                ModelState.AddModelError("PickedAmount", "Plockat antal är mindre än 0.");
            }
            if (updated.ReservedAmount > orderProduct.OrderedAmount)
            {
                ModelState.AddModelError("ReservedAmount", $"Reserverat antal borde inte vara beställt antal {orderProduct.OrderedAmount}.");
            }
            if (updated.ReservedAmount < 0)
            {
                ModelState.AddModelError("ReservedAmount", "Reserverat antal är mindre än 0.");
            }
            if (ModelState.IsValid)
            {
                pickingOrderRepo.UpdateItem(updated);
                //return RedirectToAction("Index");
                var orderId = orderProduct.OrderId;
                return(RedirectToAction("ShowPickingOrder", "Orders", new { id = orderId }));
            }
            ViewBag.OrderProductId = new SelectList(orderProductRepo.GetItems(), "Id", "Id", updated.OrderProductId);
            ViewBag.StoragePlaceId = new SelectList(storageRepo.GetItems(), "Id", "Id", updated.StoragePlaceId);
            return(View(updated));
        }
Пример #2
0
        // GET: PickingOrders/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PickingOrder pickingOrder = pickingOrderRepo.GetItem((int)id);

            if (pickingOrder == null)
            {
                return(HttpNotFound());
            }
            return(View(pickingOrder));
        }
Пример #3
0
        // GET: PickingOrders/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PickingOrder pickingOrder = pickingOrderRepo.GetItem((int)id);

            if (pickingOrder == null)
            {
                return(HttpNotFound());
            }
            ViewBag.OrderProductId = new SelectList(orderProductRepo.GetItems(), "Id", "Id", pickingOrder.OrderProductId);
            ViewBag.StoragePlaceId = new SelectList(storageRepo.GetItems(), "Id", "Id", pickingOrder.StoragePlaceId);
            return(View(pickingOrder));
        }
Пример #4
0
        public ActionResult Create([Bind(Include = "Id,StoragePlaceId,ReservedAmount,PickedAmount,Comment,OrderProductId")] PickingOrder pickingOrder)
        {
            if (pickingOrder.OrderProductId == null)
            {
                ModelState.AddModelError("OrderProductId", "OrderProductId är inte satt");
            }
            if (ModelState.IsValid)
            {
                pickingOrderRepo.CreateItem(pickingOrder);
                return(RedirectToAction("Index"));
            }

            ViewBag.OrderProductId = new SelectList(orderProductRepo.GetItems(), "Id", "Id", pickingOrder.OrderProductId);
            ViewBag.StoragePlaceId = new SelectList(storageRepo.GetItems(), "Id", "Id", pickingOrder.StoragePlaceId);
            return(View(pickingOrder));
        }
Пример #5
0
        public void Create_Post_Success_Redirect_To_Index()
        {
            // Arrange
            var order = new PickingOrder
            {
                Id             = 3,
                OrderProductId = 1,
                StoragePlaceId = 1,
                ReservedAmount = 100
            };

            // Act
            var actualResult = _controller.Create(order) as RedirectToRouteResult;

            // Assert
            Assert.AreEqual("Index", actualResult.RouteValues["action"]);
        }
Пример #6
0
        public void Create_Post_Not_Valid_Return_View_Model()
        {
            // Arrange
            var order = new PickingOrder
            {
                Id = 5,

                StoragePlaceId = 1,
                ReservedAmount = 100
            };

            // Act
            var actualResult = _controller.Create(order) as ViewResult;
            var actual       = (PickingOrder)actualResult.Model;

            // Assert
            Assert.AreEqual(order.Id, actual.Id);
        }
Пример #7
0
        public void Create()
        {
            // Arrange
            var order = new PickingOrder
            {
                Id             = 3,
                OrderProductId = 1,
                StoragePlaceId = 1,
                ReservedAmount = 100
            };

            // Act
            _controller.Create(order);

            // Assert
            _mockSetPickingOrder.Verify(x => x.Add(order), Times.Once);
            _mockContext.Verify(x => x.SaveChanges(), Times.Once);
        }
Пример #8
0
        public PathFindingResult <PickingTravelStep> FindPath(PickingOrder order)
        {
            var result = new PathFindingResult <PickingTravelStep>
            {
                Success = true,
            };
            var currentPosition = new PickingTravelStep(_warehouseLayout.GetPickingStartPosition(), new Dictionary <long, int>(order.RequiredArticles));

            var possiblePickingSlots = order.RequiredArticles
                                       .SelectMany(x => _warehouseLayout.GetPickingSlotsWithSku(x.Key))
                                       .OrderBy(x => x.AlleyNumber).ThenBy(x => x.PositionNumber)
                                       .ToList();

            var precalculatedRoutes = GetRoutesBetweenSlots(possiblePickingSlots);
            var remainingInOrder    = new Dictionary <long, int>(order.RequiredArticles);

            foreach (var possiblePickingSlot in possiblePickingSlots)
            {
                var previousPosition = currentPosition;
                if (!remainingInOrder.TryGetValue(possiblePickingSlot.Sku, out int positionUnits) || remainingInOrder[possiblePickingSlot.Sku] < 1)
                {
                    continue;
                }

                if (positionUnits < 1)
                {
                    continue;
                }

                var unitsToTake = Math.Min(positionUnits, remainingInOrder[possiblePickingSlot.Sku]);

                _warehouseLayout.GetPickingSlots().FirstOrDefault(x => x == possiblePickingSlot).Units -= unitsToTake;
                remainingInOrder[possiblePickingSlot.Sku] -= unitsToTake;
                currentPosition        = new PickingTravelStep(possiblePickingSlot, unitsToTake, new Dictionary <long, int>(remainingInOrder));
                currentPosition.Parent = previousPosition;

                if (!remainingInOrder.Any(x => x.Value > 0))
                {
                    break;
                }
            }

            var endPosition = _warehouseLayout.GetPickingEndPosition();
            var finalStep   = new PickingTravelStep(endPosition, currentPosition.PendingSkus);

            finalStep.CostFromStart = currentPosition.CostFromStart + FindTravelCostBetween(precalculatedRoutes, finalStep.Position, currentPosition.Position);
            finalStep.Parent        = currentPosition;
            currentPosition         = finalStep;

            var steps = new List <ITravelStep>();

            while (currentPosition != null)
            {
                var nextPosition = currentPosition.Parent;
                currentPosition.Parent = null;
                steps.Add(currentPosition);
                if (nextPosition != null && currentPosition != (PickingTravelStep)nextPosition)
                {
                    var route = FindTravelRouteBetween(precalculatedRoutes, currentPosition.Position, nextPosition.Position).Route;
                    foreach (var coord in route)
                    {
                        result.PathCoordinates.Add(coord);
                    }
                }
                currentPosition = nextPosition as PickingTravelStep;
            }

            result.Steps = steps.ToArray();
            return(result);
        }
Пример #9
0
        public PathFindingResult <PickingTravelStep> FindPath(PickingOrder order)
        {
            var result = new PathFindingResult <PickingTravelStep>
            {
                Success = true,
            };

            var openList = new Heap <PickingTravelStep>();

            var currentPosition = new PickingTravelStep(_warehouseLayout.GetPickingStartPosition(), new Dictionary <long, int>(order.RequiredArticles));

            var possiblePickingSlots = order.RequiredArticles
                                       .SelectMany(x => _warehouseLayout.GetPickingSlotsWithSku(x.Key))
                                       .ToList();

            var routesBetweenSlots = GetRoutesBetweenSlots(possiblePickingSlots);
            var endPosition        = _warehouseLayout.GetPickingEndPosition();

            while (currentPosition.PendingSkus.Any(x => x.Value > 0))
            {
                if (currentPosition.Sku > 0 && currentPosition.PickingSlot.Units > 0 && currentPosition.PendingSkus.ContainsKey(currentPosition.Sku))
                {
                    var requiredUnits = currentPosition.PendingSkus[currentPosition.Sku];
                    var unitsToTake   = Math.Min(requiredUnits, currentPosition.PickingSlot.AvailableUnits);
                    currentPosition.PendingSkus[currentPosition.Sku] -= unitsToTake;
                }

                if (currentPosition.PendingSkus.All(x => x.Value == 0))
                {
                    result.Success = true;
                    break;
                }

                var possibleNextSlots = possiblePickingSlots.Where(x => !currentPosition.VisitedSlots.Contains(x) &&
                                                                   currentPosition.PendingSkus.TryGetValue(x.Sku, out var value) &&
                                                                   value > 0)
                                        .ToList();
                if (!possibleNextSlots.Any())
                {
                    result.Success = false;
                    break;
                }


                foreach (var nextSlot in possibleNextSlots)
                {
                    var remainingRequiredUnits = currentPosition.PendingSkus[nextSlot.Sku];
                    var unitsToTake            = Math.Min(remainingRequiredUnits, nextSlot.Units - nextSlot.ReservedUnits);

                    var remainingSlots = possibleNextSlots.Where(x => x != nextSlot);
                    if (unitsToTake == remainingRequiredUnits)
                    {
                        remainingSlots = remainingSlots.Where(x => x.Sku != nextSlot.Sku);
                    }

                    var remainingSlotsList = remainingSlots.ToList();

                    var next = new PickingTravelStep(nextSlot, unitsToTake, new Dictionary <long, int>(currentPosition.PendingSkus))
                    {
                        Parent = currentPosition,
                    };
                    next.CostFromStart = currentPosition.CostFromStart + FindTravelCostBetween(routesBetweenSlots, next.Position, currentPosition.Position);
                    next.VisitedSlots  = new List <PickingSlot>(currentPosition.VisitedSlots)
                    {
                        nextSlot
                    };

                    var tentativeCost = FindTravelCostBetween(routesBetweenSlots, nextSlot.Position, endPosition);
                    tentativeCost += currentPosition.CostFromStart;
                    tentativeCost += remainingSlotsList.Sum(x => FindTravelCostBetween(routesBetweenSlots, nextSlot.Position, x.Position));


                    openList.Add(new HeapNode <PickingTravelStep>(next, tentativeCost));
                }

                currentPosition = openList.TakeHeapHeadPosition();
            }

            var finalStep = new PickingTravelStep(endPosition, currentPosition.PendingSkus);

            finalStep.CostFromStart = currentPosition.CostFromStart + FindTravelCostBetween(routesBetweenSlots, finalStep.Position, currentPosition.Position);
            finalStep.Parent        = currentPosition;
            currentPosition         = finalStep;

            // recreate found path and reserve items on stock
            var pickedArticles = order.RequiredArticles.Select(x => x.Key).ToDictionary(x => x, x => 0);
            var steps          = new List <ITravelStep>();

            while (currentPosition != null)
            {
                if (pickedArticles.ContainsKey(currentPosition.Sku))
                {
                    pickedArticles[currentPosition.Sku] += currentPosition.UnitsToTake;
                }

                if (currentPosition.PickingSlot != null)
                {
                    _warehouseLayout.ReserveArticles(currentPosition.PickingSlot.Address, currentPosition.Sku, currentPosition.UnitsToTake);
                }

                var nextPosition = currentPosition.Parent;
                currentPosition.Parent = null;
                steps.Add(currentPosition);
                if (nextPosition != null && currentPosition != (PickingTravelStep)nextPosition)
                {
                    var route = FindTravelRouteBetween(routesBetweenSlots, currentPosition.Position, nextPosition.Position).Route;
                    foreach (var coord in route)
                    {
                        result.PathCoordinates.Add(coord);
                    }
                }

                currentPosition = nextPosition as PickingTravelStep;
            }

            result.Steps = steps.ToArray();
            return(result);
        }
Пример #10
0
 /// <summary>
 /// 生成拣货单号
 /// </summary>
 /// <param name="po">拣货单</param>
 /// <returns></returns>
 public string InsertPickingOrder(PickingOrder po)
 {
     return(Db.Insertable(po).ExecuteReturnEntity().code);
 }