private void ShipCartonsInPallet(ApplicationDbContext context, FBAPickDetail pickDetailInDb)
        {
            var cartonsInPalletInDb = context.FBAPickDetailCartons
                                      .Include(x => x.FBAPickDetail)
                                      .Include(x => x.FBACartonLocation)
                                      .Where(x => x.FBAPickDetail.Id == pickDetailInDb.Id);

            foreach (var carton in cartonsInPalletInDb)
            {
                carton.FBACartonLocation.ShippedCtns += carton.PickCtns;
                carton.FBACartonLocation.PickingCtns -= carton.PickCtns;

                if (carton.FBACartonLocation.Status != FBAStatus.InPallet)
                {
                    if (carton.FBACartonLocation.PickingCtns == 0 && carton.FBACartonLocation.AvailableCtns != 0 && carton.FBACartonLocation.Location != "Pallet")
                    {
                        carton.FBACartonLocation.Status = FBAStatus.InStock;
                    }
                    else if (carton.FBACartonLocation.PickingCtns == 0 && carton.FBACartonLocation.AvailableCtns != 0 && carton.FBACartonLocation.Location == "Pallet")
                    {
                        carton.FBACartonLocation.Status = FBAStatus.InPallet;
                    }
                    else if (carton.FBACartonLocation.PickingCtns == 0 && carton.FBACartonLocation.AvailableCtns == 0)
                    {
                        carton.FBACartonLocation.Status = FBAStatus.Shipped;
                    }
                }
            }
        }
예제 #2
0
        private FBAPickDetail CreateFBAPickDetailFromCartonLocation(FBACartonLocation fbaCartonLocationInDb, FBAShipOrder shipOrderInDb, int ctnQuantity, IList <FBAPickDetailCarton> pickDetailCartonList)
        {
            var pickDetail = new FBAPickDetail();

            pickDetail.AssembleUniqueIndex(fbaCartonLocationInDb.Container, fbaCartonLocationInDb.GrandNumber);
            pickDetail.AssembleFirstStringPart(fbaCartonLocationInDb.ShipmentId, fbaCartonLocationInDb.AmzRefId, fbaCartonLocationInDb.WarehouseCode);
            pickDetail.AssembleActualDetails(fbaCartonLocationInDb.GrossWeightPerCtn * ctnQuantity, fbaCartonLocationInDb.CBMPerCtn * ctnQuantity, ctnQuantity);

            pickDetail.Status       = FBAStatus.Picking;
            pickDetail.Size         = FBAStatus.Na;
            pickDetail.CtnsPerPlt   = 0;
            pickDetail.PickableCtns = ctnQuantity;
            pickDetail.Location     = fbaCartonLocationInDb.Location;
            pickDetail.InboundDate  = fbaCartonLocationInDb.FBAOrderDetail.FBAMasterOrder.InboundDate;

            fbaCartonLocationInDb.PickingCtns   += ctnQuantity;
            fbaCartonLocationInDb.AvailableCtns -= ctnQuantity;
            fbaCartonLocationInDb.Status         = FBAStatus.Picking;

            pickDetail.FBACartonLocation = fbaCartonLocationInDb;
            pickDetail.OrderType         = FBAOrderType.ECommerce;
            pickDetail.HowToDeliver      = fbaCartonLocationInDb.HowToDeliver;

            pickDetail.FBAShipOrder = shipOrderInDb;

            var pickDetailCarton = new FBAPickDetailCarton();

            pickDetailCarton.FBACartonLocation = fbaCartonLocationInDb;
            pickDetailCarton.FBAPickDetail     = pickDetail;
            pickDetailCarton.PickCtns          = ctnQuantity;

            pickDetailCartonList.Add(pickDetailCarton);
            return(pickDetail);
        }
        private FBAPickDetail CreateFBAPickDetail(FBACartonLocation cartonLocation, int ctns, IList <FBAPickDetailCarton> pickDetailCartonList)
        {
            //如果不是放在托盘上的货,则直接建立pickdetail和cartondetail的关系
            if (cartonLocation.Status != "InPallet")
            {
                var location = CombineLocation(cartonLocation.FBAPallet.FBAPalletLocations.Select(x => x.Location).ToList());

                return(new FBAPickDetail
                {
                    Location = location,
                    GrandNumber = cartonLocation.GrandNumber,
                    Container = cartonLocation.Container,
                    ShipmentId = cartonLocation.ShipmentId,
                    AmzRefId = cartonLocation.AmzRefId,
                    WarehouseCode = cartonLocation.WarehouseCode,
                    ActualCBM = cartonLocation.CBMPerCtn * ctns,
                    Size = " ",
                    ActualGrossWeight = cartonLocation.GrossWeightPerCtn * ctns,
                    ActualQuantity = ctns,
                    OrderType = FBAOrderType.Standard,
                    HowToDeliver = cartonLocation.HowToDeliver,
                    Status = FBAStatus.Picking,
                    PickableCtns = ctns,
                    FBACartonLocation = cartonLocation
                });
            }
            //如果是托盘里的carton,先找到其托盘对象,再在托盘对象中拣货
            else
            {
                var palletLocation = cartonLocation.FBAPallet.FBAPalletLocations.First();
                var pickDetail     = new FBAPickDetail
                {
                    Location          = palletLocation.Location,
                    GrandNumber       = palletLocation.GrandNumber,
                    Container         = palletLocation.Container,
                    ShipmentId        = palletLocation.ShipmentId,
                    AmzRefId          = palletLocation.AmzRefId,
                    WarehouseCode     = palletLocation.WarehouseCode,
                    ActualCBM         = cartonLocation.CBMPerCtn * ctns,
                    Size              = " ",
                    ActualGrossWeight = cartonLocation.GrossWeightPerCtn * ctns,
                    ActualQuantity    = ctns,
                    OrderType         = FBAOrderType.Standard,
                    HowToDeliver      = palletLocation.HowToDeliver,
                    Status            = FBAStatus.Picking,
                    PickableCtns      = ctns,
                    FBAPalletLocation = palletLocation
                };

                pickDetailCartonList.Add(new FBAPickDetailCarton {
                    PickCtns          = ctns,
                    FBAPickDetail     = pickDetail,
                    FBACartonLocation = cartonLocation
                });

                return(pickDetail);
            }
        }
        private void ShipPickDetailCartons(FBACartonLocation cartonLocationInDb, FBAPickDetail pickDetailInDb)
        {
            cartonLocationInDb.ShippedCtns += pickDetailInDb.ActualQuantity;
            cartonLocationInDb.PickingCtns -= pickDetailInDb.ActualQuantity;

            if (cartonLocationInDb.PickingCtns == 0 && cartonLocationInDb.AvailableCtns != 0 && cartonLocationInDb.Location != "Pallet")
            {
                cartonLocationInDb.Status = FBAStatus.InStock;
            }
            else if (cartonLocationInDb.PickingCtns == 0 && cartonLocationInDb.AvailableCtns != 0 && cartonLocationInDb.Location == "Pallet")
            {
                cartonLocationInDb.Status = FBAStatus.InPallet;
            }
            else if (cartonLocationInDb.PickingCtns == 0 && cartonLocationInDb.AvailableCtns == 0)
            {
                cartonLocationInDb.Status = FBAStatus.Shipped;
            }
        }
        // 散箱放回方法
        public void PutbackPickedCartonItemToNewLocation(FBAPickDetail pickDetailInDb, string newLocation, string user)
        {
            pickDetailInDb.FBACartonLocation.ActualQuantity    -= pickDetailInDb.ActualQuantity;
            pickDetailInDb.FBACartonLocation.PickingCtns       -= pickDetailInDb.ActualQuantity;
            pickDetailInDb.FBACartonLocation.ActualGrossWeight -= pickDetailInDb.ActualGrossWeight;
            pickDetailInDb.FBACartonLocation.ActualCBM         -= pickDetailInDb.ActualCBM;

            var newFBACartonLocation = new FBACartonLocation
            {
                Status            = FBAStatus.InStock,
                ActualCBM         = pickDetailInDb.FBACartonLocation.CBMPerCtn * pickDetailInDb.ActualQuantity,
                ActualGrossWeight = pickDetailInDb.FBACartonLocation.GrossWeightPerCtn * pickDetailInDb.ActualQuantity,
                ActualQuantity    = pickDetailInDb.ActualQuantity,
                LocationStatus    = FBAStatus.PutBack,
                AmzRefId          = pickDetailInDb.FBACartonLocation.AmzRefId,
                AvailableCtns     = pickDetailInDb.ActualQuantity,
                CBMPerCtn         = pickDetailInDb.FBACartonLocation.CBMPerCtn,
                Container         = pickDetailInDb.FBACartonLocation.Container,
                GrandNumber       = pickDetailInDb.FBACartonLocation.GrandNumber,
                ShipmentId        = pickDetailInDb.FBACartonLocation.ShipmentId,
                GrossWeightPerCtn = pickDetailInDb.FBACartonLocation.GrossWeightPerCtn,
                Location          = newLocation,
                HowToDeliver      = pickDetailInDb.FBACartonLocation.HowToDeliver,
                WarehouseCode     = pickDetailInDb.FBACartonLocation.WarehouseCode,
                FBAOrderDetail    = pickDetailInDb.FBACartonLocation.FBAOrderDetail,
                FBAMasterOrder    = pickDetailInDb.FBACartonLocation.FBAMasterOrder,
                Memo = "Put back from shipping order: " + pickDetailInDb.FBAShipOrder.ShipOrderNumber + " on " + DateTime.Now.ToString("yyyy-MM-dd")
            };

            _context.OrderOperationLogs.Add(new OrderOperationLog
            {
                Type          = FBAStatus.PutBack,
                OperationDate = DateTime.Now,
                Operator      = user,
                FBAShipOrder  = pickDetailInDb.FBAShipOrder,
                Description   = "Put back " + pickDetailInDb.ActualQuantity + " loose carton(s) from Carton Location Id: " + pickDetailInDb.FBACartonLocation.Id + ", Container: " + pickDetailInDb.FBACartonLocation.Container + ", ShipmentId(SKU): " + pickDetailInDb.FBACartonLocation.ShipmentId + ", AmzRefId: " + pickDetailInDb.FBACartonLocation.AmzRefId + ", Warehouse code: " + pickDetailInDb.FBACartonLocation.WarehouseCode + " to new location: " + newLocation
            });

            _context.FBACartonLocations.Add(newFBACartonLocation);
            _context.FBAPickDetailCartons.RemoveRange(pickDetailInDb.FBAPickDetailCartons);
            _context.FBAPickDetails.Remove(pickDetailInDb);
            _context.SaveChanges();
        }
        // 托盘货放回方法
        public void PutbackPickedPalletItemsToNewLocation(FBAPickDetail pickDetailInDb, string newLocation, string user)
        {
            var pickedCtns = 0;

            pickDetailInDb.FBAPalletLocation.ActualPlts        -= pickDetailInDb.PltsFromInventory;
            pickDetailInDb.FBAPalletLocation.PickingPlts       -= pickDetailInDb.PltsFromInventory;
            pickDetailInDb.FBAPalletLocation.ActualGrossWeight -= pickDetailInDb.ActualGrossWeight;
            pickDetailInDb.FBAPalletLocation.ActualCBM         -= pickDetailInDb.ActualCBM;

            pickDetailInDb.FBAPalletLocation.FBAPallet.ActualPallets     -= pickDetailInDb.PltsFromInventory;
            pickDetailInDb.FBAPalletLocation.FBAPallet.ActualQuantity    -= pickDetailInDb.ActualQuantity;
            pickDetailInDb.FBAPalletLocation.FBAPallet.ActualGrossWeight -= pickDetailInDb.ActualGrossWeight;
            pickDetailInDb.FBAPalletLocation.FBAPallet.ActualCBM         -= pickDetailInDb.ActualCBM;
            pickDetailInDb.FBAPalletLocation.FBAPallet.ComsumedPallets   -= pickDetailInDb.PltsFromInventory;

            var newFBAPallet = new FBAPallet {
                ActualCBM             = pickDetailInDb.ActualCBM,
                ActualGrossWeight     = pickDetailInDb.ActualGrossWeight,
                ActualPallets         = pickDetailInDb.PltsFromInventory,
                ActualQuantity        = pickDetailInDb.ActualQuantity,
                AmzRefId              = pickDetailInDb.FBAPalletLocation.FBAPallet.AmzRefId,
                Container             = pickDetailInDb.FBAPalletLocation.FBAPallet.Container,
                ShipmentId            = pickDetailInDb.FBAPalletLocation.FBAPallet.ShipmentId,
                ComsumedPallets       = pickDetailInDb.PltsFromInventory,
                GrandNumber           = pickDetailInDb.FBAPalletLocation.FBAPallet.GrandNumber,
                HowToDeliver          = pickDetailInDb.FBAPalletLocation.FBAPallet.HowToDeliver,
                LocationStatus        = FBAStatus.PutBack,
                IsOverSizeOrOverwidth = pickDetailInDb.FBAPalletLocation.FBAPallet.IsOverSizeOrOverwidth,
                HasSortingMarking     = pickDetailInDb.FBAPalletLocation.FBAPallet.HasSortingMarking,
                PalletSize            = pickDetailInDb.FBAPalletLocation.FBAPallet.PalletSize,
                WarehouseCode         = pickDetailInDb.FBAPalletLocation.FBAPallet.WarehouseCode,
                DoesAppliedLabel      = pickDetailInDb.FBAPalletLocation.FBAPallet.DoesAppliedLabel,
                FBAMasterOrder        = pickDetailInDb.FBAPalletLocation.FBAPallet.FBAMasterOrder,
                Memo = "Put back from shipping order: " + pickDetailInDb.FBAShipOrder.ShipOrderNumber + " on " + DateTime.Now.ToString("yyyy-MM-dd")
            };

            var newCartonLocationsList = new List <FBACartonLocation>();
            var ctnLogList             = new List <OrderOperationLog>();

            foreach (var p in pickDetailInDb.FBAPickDetailCartons)
            {
                p.FBACartonLocation.ActualQuantity    -= p.PickCtns;
                p.FBACartonLocation.PickingCtns       -= p.PickCtns;
                p.FBACartonLocation.ActualGrossWeight -= p.FBACartonLocation.GrossWeightPerCtn * p.PickCtns;
                p.FBACartonLocation.ActualCBM         -= p.FBACartonLocation.CBMPerCtn * p.PickCtns;

                if (p.FBACartonLocation.ActualGrossWeight < 0)
                {
                    p.FBACartonLocation.ActualGrossWeight = 0;
                }

                if (p.FBACartonLocation.ActualCBM < 0)
                {
                    p.FBACartonLocation.ActualCBM = 0;
                }

                var newFBACartonLocation = new FBACartonLocation {
                    Status            = FBAStatus.InPallet,
                    ActualCBM         = p.FBACartonLocation.CBMPerCtn * p.PickCtns,
                    ActualGrossWeight = p.FBACartonLocation.GrossWeightPerCtn * p.PickCtns,
                    ActualQuantity    = p.PickCtns,
                    LocationStatus    = FBAStatus.PutBack,
                    AmzRefId          = p.FBACartonLocation.AmzRefId,
                    AvailableCtns     = p.PickCtns,
                    CBMPerCtn         = p.FBACartonLocation.CBMPerCtn,
                    Container         = p.FBACartonLocation.Container,
                    GrandNumber       = p.FBACartonLocation.GrandNumber,
                    ShipmentId        = p.FBACartonLocation.ShipmentId,
                    GrossWeightPerCtn = p.FBACartonLocation.GrossWeightPerCtn,
                    Location          = "Pallet",
                    HowToDeliver      = p.FBACartonLocation.HowToDeliver,
                    WarehouseCode     = p.FBACartonLocation.WarehouseCode,
                    FBAPallet         = newFBAPallet,
                    FBAOrderDetail    = p.FBACartonLocation.FBAOrderDetail,
                    FBAMasterOrder    = p.FBACartonLocation.FBAMasterOrder,
                    Memo = "Put back from shipping order: " + pickDetailInDb.FBAShipOrder.ShipOrderNumber + " on " + DateTime.Now.ToString("yyyy-MM-dd")
                };

                pickedCtns += p.PickCtns;
                newCartonLocationsList.Add(newFBACartonLocation);
                ctnLogList.Add(new OrderOperationLog {
                    Type          = FBAStatus.PutBack,
                    OperationDate = DateTime.Now,
                    Operator      = user,
                    FBAShipOrder  = pickDetailInDb.FBAShipOrder,
                    Description   = "Put back " + p.PickCtns + " in-pallet carton(s) from Carton Location Id: " + p.FBACartonLocation.Id + ", Container: " + p.FBACartonLocation.Container + ", ShipmentId(SKU): " + p.FBACartonLocation.ShipmentId + ", AmzRefId: " + p.FBACartonLocation.AmzRefId + ", Warehouse code: " + p.FBACartonLocation.WarehouseCode + " to new location: " + newLocation
                });
            }

            pickDetailInDb.FBAPalletLocation.ActualQuantity -= pickedCtns;

            var newFBAPalletLocation = new FBAPalletLocation {
                Status            = FBAStatus.InStock,
                ActualCBM         = pickDetailInDb.ActualCBM,
                ActualGrossWeight = pickDetailInDb.ActualGrossWeight,
                ActualPlts        = pickDetailInDb.PltsFromInventory,
                ActualQuantity    = pickedCtns,
                AvailablePlts     = pickDetailInDb.PltsFromInventory,
                AmzRefId          = pickDetailInDb.AmzRefId,
                Container         = pickDetailInDb.Container,
                CBMPerPlt         = pickDetailInDb.FBAPalletLocation.CBMPerPlt,
                CtnsPerPlt        = pickDetailInDb.FBAPalletLocation.CtnsPerPlt,
                GrandNumber       = pickDetailInDb.FBAPalletLocation.GrandNumber,
                GrossWeightPerPlt = pickDetailInDb.FBAPalletLocation.GrossWeightPerPlt,
                HowToDeliver      = pickDetailInDb.FBAPalletLocation.HowToDeliver,
                Location          = newLocation,
                PalletSize        = pickDetailInDb.FBAPalletLocation.PalletSize,
                ShipmentId        = pickDetailInDb.FBAPalletLocation.ShipmentId,
                LocationStatus    = FBAStatus.PutBack,
                WarehouseCode     = pickDetailInDb.FBAPalletLocation.WarehouseCode,
                FBAMasterOrder    = pickDetailInDb.FBAPalletLocation.FBAMasterOrder,
                FBAPallet         = newFBAPallet,
                Memo = "Put back from shipping order: " + pickDetailInDb.FBAShipOrder.ShipOrderNumber + " on " + DateTime.Now.ToString("yyyy-MM-dd")
            };

            var pltLog = new OrderOperationLog
            {
                Type          = FBAStatus.PutBack,
                FBAShipOrder  = pickDetailInDb.FBAShipOrder,
                OperationDate = DateTime.Now,
                Operator      = user
            };

            if (pickDetailInDb.FBAPickDetailCartons == null)
            {
                pltLog.Description = "Put back " + pickDetailInDb.PltsFromInventory + " empty pallet(s) from Pallet Location Id: " + pickDetailInDb.FBAPalletLocation.Id + ", Container: " + pickDetailInDb.Container + ", ShipmentId(SKU): " + pickDetailInDb.ShipmentId + ", AmzRefId: " + pickDetailInDb.AmzRefId + ", Warehouse code: " + pickDetailInDb.WarehouseCode + " to new location: " + newLocation;
            }
            else
            {
                pltLog.Description = "Put back " + pickDetailInDb.PltsFromInventory + " pallet(s) from Pallet Location Id: " + pickDetailInDb.FBAPalletLocation.Id + " Container: " + pickDetailInDb.Container + ", ShipmentId(SKU): " + pickDetailInDb.ShipmentId + ", AmzRefId: " + pickDetailInDb.AmzRefId + ", Warehouse code: " + pickDetailInDb.WarehouseCode + " to new location: " + newLocation;
            }

            _context.OrderOperationLogs.Add(pltLog);
            _context.OrderOperationLogs.AddRange(ctnLogList);

            _context.FBACartonLocations.AddRange(newCartonLocationsList);
            _context.FBAPallets.Add(newFBAPallet);
            _context.FBAPalletLocations.Add(newFBAPalletLocation);

            _context.FBAPickDetailCartons.RemoveRange(pickDetailInDb.FBAPickDetailCartons);
            _context.FBAPickDetails.Remove(pickDetailInDb);

            _context.SaveChanges();
        }
예제 #7
0
        private FBAPickDetail CreateFBAPickDetailFromPalletLocation(FBAPalletLocation fbaPalletLocationInDb, FBAShipOrder shipOrderInDb, int pltQuantity, int newPltQuantity, IList <FBAPickDetailCarton> pickDetailCartonList, IEnumerable <PickCartonDto> objArray)
        {
            var pickDetail = new FBAPickDetail();

            pickDetail.AssembleUniqueIndex(fbaPalletLocationInDb.Container, fbaPalletLocationInDb.GrandNumber);
            pickDetail.AssembleFirstStringPart(fbaPalletLocationInDb.ShipmentId, fbaPalletLocationInDb.AmzRefId, fbaPalletLocationInDb.WarehouseCode);
            pickDetail.AssembleActualDetails(0, 0, objArray.Sum(x => x.PickQuantity));

            pickDetail.Status            = FBAStatus.Picking;
            pickDetail.Size              = fbaPalletLocationInDb.PalletSize;
            pickDetail.PickableCtns      = objArray.Sum(x => x.PickQuantity);
            pickDetail.NewPlts           = newPltQuantity;
            pickDetail.PltsFromInventory = pltQuantity;
            //pickDetail.ActualPlts = pltQuantity + newPltQuantity;
            //现在强行规定,实际出库托盘数量为0,防止仓库偷懒不调整
            pickDetail.ActualPlts = 0;
            pickDetail.CtnsPerPlt = fbaPalletLocationInDb.CtnsPerPlt;
            pickDetail.Location   = fbaPalletLocationInDb.Location;

            fbaPalletLocationInDb.PickingPlts += pltQuantity;
            //如果需要在库存中体现新打的托盘数量,禁用上面一行,启用下面一行
            //fbaPalletLocationInDb.PickingPlts += pltQuantity + newPltQuantity;

            fbaPalletLocationInDb.AvailablePlts -= pltQuantity;
            fbaPalletLocationInDb.Status         = FBAStatus.Picking;

            pickDetail.HowToDeliver      = fbaPalletLocationInDb.HowToDeliver;
            pickDetail.FBAPalletLocation = fbaPalletLocationInDb;
            pickDetail.OrderType         = FBAOrderType.Standard;
            pickDetail.HowToDeliver      = fbaPalletLocationInDb.HowToDeliver;
            pickDetail.InboundDate       = fbaPalletLocationInDb.FBAMasterOrder.InboundDate;

            pickDetail.FBAShipOrder = shipOrderInDb;

            var cartonLocationInPalletsInDb = fbaPalletLocationInDb.FBAPallet.FBACartonLocations;

            foreach (var obj in objArray)
            {
                if (obj.PickQuantity == 0)
                {
                    continue;
                }

                var cartonInPalletInDb = cartonLocationInPalletsInDb.SingleOrDefault(x => x.Id == obj.Id);

                cartonInPalletInDb.PickingCtns += obj.PickQuantity;

                var pickDetailCarton = new FBAPickDetailCarton
                {
                    PickCtns          = obj.PickQuantity,
                    FBAPickDetail     = pickDetail,
                    FBACartonLocation = cartonInPalletInDb
                };

                cartonInPalletInDb.AvailableCtns -= obj.PickQuantity;
                pickDetail.ActualCBM             += obj.PickQuantity * cartonInPalletInDb.CBMPerCtn;
                pickDetail.ActualGrossWeight     += obj.PickQuantity * cartonInPalletInDb.GrossWeightPerCtn;

                pickDetailCartonList.Add(pickDetailCarton);
            }

            // 如果捡完了托盘数量但是箱子还有剩余,则报错
            var availablePlts = fbaPalletLocationInDb.FBAPallet.FBAPalletLocations.Sum(x => x.AvailablePlts);
            var availableCtns = fbaPalletLocationInDb.FBAPallet.FBACartonLocations.Sum(x => x.AvailableCtns);

            if (availablePlts == 0 && availableCtns != 0)
            {
                throw new Exception("Pick failed. The pallets number of SKU " + fbaPalletLocationInDb.ShipmentId + " will be 0 after this pick but there are still many cartons inside. Please make sure there is no thing left before picking the last pallte.");
            }

            // 如果托盘中的箱子捡完了但是托盘数没捡完,则自动把所有剩下的托盘数带上

            if (availableCtns == 0 && availablePlts != 0)
            {
                pickDetail.PltsFromInventory       += availablePlts;
                fbaPalletLocationInDb.PickingPlts  += availablePlts;
                fbaPalletLocationInDb.AvailablePlts = 0;
            }

            return(pickDetail);
        }