private RegularCartonDetail CreateNewRegularCartonDetail(FCRegularLocationDetail cartonLocation, string sizeBundle, string pcsBundle, int currentPcs)
 {
     return(new RegularCartonDetail
     {
         PurchaseOrder = cartonLocation.PurchaseOrder,
         Style = cartonLocation.Style,
         Customer = cartonLocation.CustomerCode,
         CartonRange = cartonLocation.CartonRange + "(Broke)",
         SizeBundle = sizeBundle,
         PcsBundle = pcsBundle,
         PcsPerCarton = currentPcs,
         Quantity = currentPcs * cartonLocation.AvailableCtns,
         POSummary = cartonLocation.RegularCaronDetail.POSummary,
         Color = cartonLocation.Color,
         ActualPcs = currentPcs * cartonLocation.AvailableCtns,
         ToBeAllocatedCtns = 0,
         ToBeAllocatedPcs = 0,
         Status = "Allocated",
         Container = cartonLocation.Container,
         OrderType = "Solid Pack",
         Comment = "Break from pre-pack",
         Receiver = _userName,
         Adjustor = _userName,
         Operator = _userName,
         Vendor = cartonLocation.RegularCaronDetail.Vendor,
         Batch = cartonLocation.RegularCaronDetail.Batch + "(Broke)"
     });
 }
        private FCRegularLocationDetail CreateRegularLocationV2(RegularCartonDetail cartonDetailInDb)
        {
            var result = new FCRegularLocationDetail
            {
                Container          = cartonDetailInDb.POSummary.Container,
                PurchaseOrder      = cartonDetailInDb.PurchaseOrder,
                Style              = cartonDetailInDb.Style,
                Color              = cartonDetailInDb.Color,
                CustomerCode       = cartonDetailInDb.Customer,
                SizeBundle         = cartonDetailInDb.SizeBundle,
                PcsBundle          = cartonDetailInDb.PcsBundle,
                Cartons            = cartonDetailInDb.ToBeAllocatedCtns,
                Quantity           = cartonDetailInDb.ToBeAllocatedPcs,
                Location           = "FLOOR",
                PcsPerCaron        = cartonDetailInDb.PcsPerCarton,
                Status             = "In Stock",
                AvailableCtns      = cartonDetailInDb.ToBeAllocatedCtns,
                PickingCtns        = 0,
                ShippedCtns        = 0,
                AvailablePcs       = cartonDetailInDb.ToBeAllocatedPcs,
                PickingPcs         = 0,
                ShippedPcs         = 0,
                PreReceiveOrder    = cartonDetailInDb.POSummary.PreReceiveOrder,
                RegularCaronDetail = cartonDetailInDb,
                CartonRange        = cartonDetailInDb.CartonRange,
                Allocator          = _userName,
                Batch              = cartonDetailInDb.Batch,
                Vendor             = cartonDetailInDb.Vendor
            };

            cartonDetailInDb.ToBeAllocatedCtns = 0;
            cartonDetailInDb.ToBeAllocatedPcs  = 0;

            return(result);
        }
Exemple #3
0
 private string RefreshRegularStatus(FCRegularLocationDetail location)
 {
     if (location.PickingCtns != 0 || location.PickingPcs != 0)
     {
         return(Status.Picking);
     }
     else if (location.PickingCtns == 0 && location.PickingPcs == 0 && location.AvailableCtns == 0 && location.AvailablePcs == 0)
     {
         return(Status.Shipped);
     }
     else
     {
         return(Status.InStock);
     }
 }
Exemple #4
0
        public IHttpActionResult CreatePutBackLocation([FromBody] PutBackJsonObj obj)
        {
            var locationInDb = _context.FCRegularLocationDetails
                               .Include(x => x.PreReceiveOrder)
                               .Where(x => x.Container == obj.Container)
                               .FirstOrDefault();

            if (locationInDb == null)
            {
                throw new Exception("Cannot find location info of container " + obj.Container + ". The location cannot be empty.");
            }

            var prereceivedOrderInDb = _context.PreReceiveOrders.Find(locationInDb.PreReceiveOrder.Id);

            var putBackCartonLocation = new FCRegularLocationDetail {
                Container       = obj.Container,
                Status          = "Put Back",
                CartonRange     = "Put Back",
                PurchaseOrder   = obj.PurchaseOrder,
                Style           = obj.Style,
                Color           = obj.Color,
                CustomerCode    = obj.Customer,
                SizeBundle      = obj.SizeBundle,
                PcsBundle       = obj.PcsBundle,
                AvailableCtns   = obj.Cartons,
                PickingCtns     = 0,
                ShippedCtns     = -obj.Cartons,
                AvailablePcs    = obj.Quantity,
                PickingPcs      = 0,
                ShippedPcs      = -obj.Quantity,
                Location        = obj.Location + "(Put Back)",
                PcsPerCaron     = obj.PcsPerCarton,
                Cartons         = 0,
                Quantity        = 0,
                PreReceiveOrder = prereceivedOrderInDb
            };

            _context.FCRegularLocationDetails.Add(putBackCartonLocation);
            _context.SaveChanges();

            var sample    = _context.FCRegularLocationDetails.OrderByDescending(x => x.Id).First();
            var sampleDto = Mapper.Map <FCRegularLocationDetail, FCRegularLocationDetailDto>(sample);

            return(Created(Request.RequestUri + "/" + sampleDto.Id, sampleDto));
        }
        private void AdjustMainAvailableCartons(ApplicationDbContext context, FCRegularLocationDetail locationDetailInDb)
        {
            //如果其本身就是宿主对象
            if (locationDetailInDb.Cartons != 0)
            {
                var originalAvailableCtns = locationDetailInDb.AvailableCtns;
                var remainableCtns        = Math.Max(locationDetailInDb.AvailableCtns, Ceiling(locationDetailInDb.AvailablePcs, locationDetailInDb.PcsPerCaron));

                locationDetailInDb.AvailableCtns = remainableCtns;
                locationDetailInDb.PickingCtns   = locationDetailInDb.Cartons - locationDetailInDb.AvailableCtns - locationDetailInDb.ShippedCtns;
            }
            else
            {
                //查找当前对象的宿主对象
                try
                {
                    var mainLocationInDbtest = context.FCRegularLocationDetails
                                               .SingleOrDefault(x => x.Container == locationDetailInDb.Container &&
                                                                x.CartonRange == locationDetailInDb.CartonRange &&
                                                                x.Batch == locationDetailInDb.Batch &&
                                                                x.Location == locationDetailInDb.Location &&
                                                                x.Cartons != 0);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message + " Container=" + locationDetailInDb.Container + ", Carton Range=" + locationDetailInDb.CartonRange + ", Batch=" + locationDetailInDb.Batch + ", Location=" + locationDetailInDb.Location);
                }

                var mainLocationInDb = context.FCRegularLocationDetails
                                       .SingleOrDefault(x => x.Container == locationDetailInDb.Container &&
                                                        x.CartonRange == locationDetailInDb.CartonRange &&
                                                        x.Batch == locationDetailInDb.Batch &&
                                                        x.Location == locationDetailInDb.Location &&
                                                        x.Cartons != 0);

                var originaAvailableCtns = mainLocationInDb.AvailableCtns;
                var remainableCtns       = Math.Max(mainLocationInDb.AvailableCtns, Ceiling(locationDetailInDb.AvailablePcs, locationDetailInDb.PcsPerCaron));

                mainLocationInDb.AvailableCtns = remainableCtns;
                mainLocationInDb.PickingCtns   = mainLocationInDb.Cartons - mainLocationInDb.AvailableCtns - mainLocationInDb.ShippedCtns;
            }
        }
        private void AdjustMainShippedCartons(ApplicationDbContext context, FCRegularLocationDetail locationDetailInDb, IEnumerable <FCRegularLocationDetail> parasiticLocationDetail)
        {
            //如果其本身就是宿主对象
            if (locationDetailInDb.Cartons != 0)
            {
                var originaShippedCtns = locationDetailInDb.ShippedCtns;
                var updatedShippedCtns = locationDetailInDb.Cartons;

                foreach (var location in parasiticLocationDetail)
                {
                    updatedShippedCtns = Math.Min(updatedShippedCtns, location.ShippedPcs / location.PcsPerCaron);
                }

                locationDetailInDb.ShippedCtns  = updatedShippedCtns;
                locationDetailInDb.PickingCtns -= updatedShippedCtns - originaShippedCtns;
            }
            else
            {
                //查找当前对象的宿主对象
                try
                {
                    var mainLocationInDbtest = context.FCRegularLocationDetails
                                               .SingleOrDefault(x => x.Container == locationDetailInDb.Container &&
                                                                x.CartonRange == locationDetailInDb.CartonRange &&
                                                                x.Batch == locationDetailInDb.Batch &&
                                                                x.Location == locationDetailInDb.Location &&
                                                                x.Cartons != 0);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message + " Container=" + locationDetailInDb.Container + ", Carton Range=" + locationDetailInDb.CartonRange + ", Batch=" + locationDetailInDb.Batch + ", Location=" + locationDetailInDb.Location);
                }

                var mainLocationInDb = context.FCRegularLocationDetails
                                       .SingleOrDefault(x => x.Container == locationDetailInDb.Container &&
                                                        x.CartonRange == locationDetailInDb.CartonRange &&
                                                        x.Batch == locationDetailInDb.Batch &&
                                                        x.Location == locationDetailInDb.Location &&
                                                        x.Cartons != 0);

                if (mainLocationInDb == null)
                {
                    throw new Exception("Did not find the main object. Please check container=" + locationDetailInDb.Container + ", Carton Range=" + locationDetailInDb.CartonRange + ", Batch=" + locationDetailInDb.Batch);
                }

                var originaShippedCtns = mainLocationInDb.ShippedCtns;
                var updatedShippedCtns = mainLocationInDb.Cartons;

                foreach (var location in parasiticLocationDetail)
                {
                    //如果当前对象的pcspercarton是0,说明是全为0的无效储存对象,直接跳过
                    if (location.PcsPerCaron == 0)
                    {
                        continue;
                    }
                    else
                    {
                        updatedShippedCtns = Math.Min(updatedShippedCtns, location.ShippedPcs / location.PcsPerCaron);
                    }
                }

                mainLocationInDb.ShippedCtns  = updatedShippedCtns;
                mainLocationInDb.PickingCtns -= updatedShippedCtns - originaShippedCtns;
            }
        }
        //用来将SizeBundle和PcsBundle打碎成独立的条目
        public void BreakPrePack(int locationId)
        {
            var cartonLocation = _context.FCRegularLocationDetails
                                 .Include(x => x.RegularCaronDetail.POSummary.PreReceiveOrder)
                                 .Include(x => x.PreReceiveOrder)
                                 .SingleOrDefault(x => x.Id == locationId);

            var sizeArry = cartonLocation.SizeBundle.Split(' ');
            var pcsArr   = cartonLocation.PcsBundle.Split(' ');

            var newCartonDetailList = new List <RegularCartonDetail>();
            var breakedItemList     = new List <FCRegularLocationDetail>();

            for (int i = 0; i < sizeArry.Count(); i++)
            {
                var currentPcs = int.Parse(pcsArr[i]);

                if (currentPcs != 0)
                {
                    var currentSize        = sizeArry[i];
                    var sameLocationDetail = _context.FCRegularLocationDetails
                                             .Include(x => x.RegularCaronDetail)
                                             .Where(x => x.Container == cartonLocation.Container &&
                                                    x.PurchaseOrder == cartonLocation.PurchaseOrder &&
                                                    x.Style == cartonLocation.Style &&
                                                    x.Color == cartonLocation.Color &&
                                                    x.CartonRange == cartonLocation.CartonRange + "(Broke)" &&
                                                    x.SizeBundle == currentSize &&
                                                    x.Batch == cartonLocation.Batch + "(Broke)");

                    var sameLocation = sameLocationDetail.Where(x => x.Location == cartonLocation.Location);

                    //为每一个Size检测是否已经存在分裂后的库存,没有的话就新建一个库存和cartonDetail,否则直接加上去
                    if (sameLocationDetail.Count() == 0)
                    {
                        var newCartonDetail = CreateNewRegularCartonDetail(cartonLocation, sizeArry[i], pcsArr[i], currentPcs);

                        var newLocation = new FCRegularLocationDetail();

                        newLocation.Container     = cartonLocation.Container;
                        newLocation.Vendor        = cartonLocation.Vendor;
                        newLocation.Status        = "In Stock";
                        newLocation.PurchaseOrder = cartonLocation.PurchaseOrder;
                        newLocation.Style         = cartonLocation.Style;
                        newLocation.Color         = cartonLocation.Color;
                        newLocation.CustomerCode  = cartonLocation.CustomerCode;
                        newLocation.Allocator     = _userName;
                        newLocation.Location      = cartonLocation.Location;

                        newLocation.SizeBundle  = sizeArry[i];
                        newLocation.PcsBundle   = currentPcs.ToString();
                        newLocation.PcsPerCaron = currentPcs;

                        newLocation.CartonRange = cartonLocation.CartonRange + "(Broke)";
                        newLocation.Batch       = cartonLocation.Batch + "(Broke)";

                        newLocation.Cartons  = 0;
                        newLocation.Quantity = currentPcs * cartonLocation.AvailableCtns;

                        newLocation.AvailableCtns = 0;
                        newLocation.ShippedCtns   = 0;
                        newLocation.PickingCtns   = 0;

                        newLocation.AvailablePcs = currentPcs * cartonLocation.AvailableCtns;
                        newLocation.PickingPcs   = 0;
                        newLocation.ShippedPcs   = 0;

                        newLocation.PickDetails        = null;
                        newLocation.RegularCaronDetail = cartonLocation.RegularCaronDetail;
                        newLocation.PreReceiveOrder    = cartonLocation.RegularCaronDetail.POSummary.PreReceiveOrder;

                        newLocation.RegularCaronDetail = newCartonDetail;

                        newCartonDetailList.Add(newCartonDetail);
                        breakedItemList.Add(newLocation);
                    }
                    //已经有其他库存的Broke对象但没有选中库存的Broke对象时,新建选中对象的location库位对象,并调整已存在的cartonDetail对象的值
                    else if (sameLocation.Count() == 0)
                    {
                        //调整已经存在的broke CartonDetail对象值
                        sameLocationDetail.First().RegularCaronDetail.Quantity = currentPcs * cartonLocation.AvailableCtns;
                        sameLocationDetail.First().RegularCaronDetail.ActualPcs = currentPcs * cartonLocation.AvailableCtns;
                        sameLocationDetail.First().RegularCaronDetail.Adjustor = _userName;

                        if (sameLocationDetail.First().RegularCaronDetail.Cartons != 0)
                        {
                            sameLocationDetail.First().RegularCaronDetail.Cartons += cartonLocation.AvailableCtns;
                            sameLocationDetail.First().RegularCaronDetail.ActualCtns += cartonLocation.AvailableCtns;
                        }

                        //新建location对象
                        var newLocation = new FCRegularLocationDetail();

                        newLocation.Container     = cartonLocation.Container;
                        newLocation.Vendor        = cartonLocation.Vendor;
                        newLocation.Status        = "In Stock";
                        newLocation.PurchaseOrder = cartonLocation.PurchaseOrder;
                        newLocation.Style         = cartonLocation.Style;
                        newLocation.Color         = cartonLocation.Color;
                        newLocation.CustomerCode  = cartonLocation.CustomerCode;
                        newLocation.Allocator     = _userName;
                        newLocation.Location      = cartonLocation.Location;

                        newLocation.SizeBundle  = sizeArry[i];
                        newLocation.PcsBundle   = currentPcs.ToString();
                        newLocation.PcsPerCaron = currentPcs;

                        newLocation.CartonRange = cartonLocation.CartonRange + "(Broke)";
                        newLocation.Batch       = cartonLocation.Batch + "(Broke)";

                        newLocation.Cartons  = 0;
                        newLocation.Quantity = currentPcs * cartonLocation.AvailableCtns;

                        newLocation.AvailableCtns = 0;
                        newLocation.ShippedCtns   = 0;
                        newLocation.PickingCtns   = 0;

                        newLocation.AvailablePcs = currentPcs * cartonLocation.AvailableCtns;
                        newLocation.PickingPcs   = 0;
                        newLocation.ShippedPcs   = 0;

                        newLocation.PickDetails        = null;
                        newLocation.RegularCaronDetail = cartonLocation.RegularCaronDetail;
                        newLocation.PreReceiveOrder    = cartonLocation.RegularCaronDetail.POSummary.PreReceiveOrder;

                        newLocation.RegularCaronDetail = sameLocationDetail.First().RegularCaronDetail;

                        breakedItemList.Add(newLocation);
                    }
                    //如果已经把当前对象break过了,则找到break过的对象,直接调整
                    else if (sameLocation.Count() != 0)
                    {
                        sameLocation.First().Quantity     += currentPcs * cartonLocation.AvailableCtns;
                        sameLocation.First().AvailablePcs += currentPcs * cartonLocation.AvailableCtns;

                        sameLocation.First().RegularCaronDetail.Quantity += currentPcs * cartonLocation.AvailableCtns;
                        sameLocation.First().RegularCaronDetail.ActualPcs += currentPcs * cartonLocation.AvailableCtns;

                        if (sameLocation.First().Cartons != 0)
                        {
                            sameLocation.First().Cartons       += cartonLocation.AvailableCtns;
                            sameLocation.First().AvailableCtns += cartonLocation.AvailableCtns;

                            sameLocation.First().RegularCaronDetail.Cartons += cartonLocation.AvailableCtns;
                            sameLocation.First().RegularCaronDetail.ActualCtns += cartonLocation.AvailableCtns;
                        }
                    }
                }
            }

            //将新建列表中的第一项对象当作宿主对象
            if (newCartonDetailList.Count != 0)
            {
                newCartonDetailList.First().Cartons    = cartonLocation.AvailableCtns;
                newCartonDetailList.First().ActualCtns = cartonLocation.AvailableCtns;
            }

            if (breakedItemList.Count != 0)
            {
                breakedItemList.First().Cartons       = cartonLocation.AvailableCtns;
                breakedItemList.First().AvailableCtns = cartonLocation.AvailableCtns;
            }

            //保留之前的记录,调整库存Available值和cartonDetail的实际收货箱数和件数
            cartonLocation.RegularCaronDetail.ActualCtns -= cartonLocation.AvailableCtns;
            cartonLocation.RegularCaronDetail.ActualPcs  -= cartonLocation.AvailablePcs;
            cartonLocation.RegularCaronDetail.Cartons    -= cartonLocation.AvailableCtns;
            cartonLocation.RegularCaronDetail.Quantity   -= cartonLocation.AvailablePcs;

            cartonLocation.Cartons      -= cartonLocation.AvailableCtns;
            cartonLocation.Quantity     -= cartonLocation.AvailablePcs;
            cartonLocation.AvailableCtns = 0;
            cartonLocation.AvailablePcs  = 0;

            if (cartonLocation.Status != "Picking")
            {
                cartonLocation.Status = "Shipped";
            }

            _context.RegularCartonDetails.AddRange(newCartonDetailList);
            _context.FCRegularLocationDetails.AddRange(breakedItemList);

            _context.SaveChanges();
        }