// 中台出库请求,在Ready和Release按钮按下后触发
        public ResponseBody UpdateOunboundOrderRequest(FBAShipOrder order)
        {
            var url        = "https://hzero-gateway.hzero-uat.nearbyexpress.com/hitf/v1/rest/invoke?namespace=HZERO&serverCode=HORD&interfaceCode=homs-order.shipment.wmsUpdate";
            var token      = GetAccessToken();
            var statusCode = order.Status == "Ready" ? "PICKED" : (order.Status == "Released" ? "SHIPPED" : "UNPICKED");
            var body       = new RequestBody
            {
                // 测试
                Payload = JsonConvert.SerializeObject(new { ShipmentCode = order.ShipOrderNumber, SystemSource = "CHINO", ShipmentStatusCode = statusCode, TrackingNumber = 0, ShippingFee = 0, DeliveryDate = order.ReleasedDate.ToString("yyyy-MM-dd hh:mm:ss") }, new JsonSerializerSettings
                {
                    ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
                })

                          // 生产
                          //Payload = JsonConvert.SerializeObject(new { ShipmentCode = order.ShipOrderNumber, SystemSource = "CHINO", ShipmentStatusCode = order.Status == statusCode, TrackingNumber = 0, ShippingFee = 0 }, new JsonSerializerSettings
                          //{
                          //    ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
                          //})
            };

            var responseString = SendHttpRequest(url, JsonConvert.SerializeObject(body, Formatting.Indented, new JsonSerializerSettings
            {
                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            }), "POST", token);

            var responseBody = new ResponseBody();

            using (var input = new StringReader(responseString))
            {
                responseBody = JsonConvert.DeserializeObject <ResponseBody>(responseString);
            }

            return(responseBody);
        }
 public void CallBackWhenOutboundOrderReleased(ApplicationDbContext _context, FBAShipOrder shipOrderInDb)
 {
     try
     {
         if (shipOrderInDb.CustomerCode == "SUNVALLEY" || shipOrderInDb.CustomerCode == "TEST")
         {
             var pickedCtnDetails = _context.FBAPickDetailCartons.Include(x => x.FBAPickDetail.FBAShipOrder).Include(x => x.FBACartonLocation).Where(x => x.FBAPickDetail.FBAShipOrder.Id == shipOrderInDb.Id);
             if (shipOrderInDb.Agency == "NetSuite" && shipOrderInDb.OrderType == FBAOrderType.Standard || shipOrderInDb.OrderType == FBAOrderType.Transfer)
             {
                 _nsManager.SendStandardOrderShippedRequest(shipOrderInDb, pickedCtnDetails);
             }
             else if (shipOrderInDb.Agency == "NetSuite" && shipOrderInDb.OrderType == FBAOrderType.DirectSell)
             {
                 _nsManager.SendDirectSellOrderShippedRequest(shipOrderInDb, pickedCtnDetails);
             }
             else if (shipOrderInDb.Agency == "跨境中台")
             {
                 _ztManager.UpdateOunboundOrderRequest(shipOrderInDb);
             }
         }
     }
     catch (Exception e)
     {
         throw new Exception("API call failed. Error message: " + e.Message);
     }
 }
        public async Task <IHttpActionResult> CreateNewShipOrder([FromBody] ShipOrderDto obj)
        {
            if (Checker.CheckString(obj.ShipOrderNumber))
            {
                throw new Exception("Container number cannot contain space.");
            }

            if (_context.FBAShipOrders.SingleOrDefault(x => x.ShipOrderNumber == obj.ShipOrderNumber) != null)
            {
                throw new Exception("Ship Order Number " + obj.ShipOrderNumber + " has been taken. Please delete the existed order and try agian.");
            }

            var shipOrder = new FBAShipOrder();
            var chargingItemDetailList = new List <ChargingItemDetail>();

            var customerWOInstructions = _context.UpperVendors
                                         .Include(x => x.InstructionTemplates)
                                         .SingleOrDefault(x => x.CustomerCode == obj.CustomerCode)
                                         .InstructionTemplates
                                         .ToList();

            foreach (var c in customerWOInstructions)
            {
                chargingItemDetailList.Add(new ChargingItemDetail {
                    Status         = c.Status,
                    HandlingStatus = FBAStatus.New,
                    Description    = c.Description,
                    CreateBy       = _userName,
                    CreateDate     = DateTime.Now
                });
            }

            _context.ChargingItemDetails.AddRange(chargingItemDetailList);

            shipOrder.AssembleBaseInfo(obj.ShipOrderNumber, obj.CustomerCode, obj.OrderType, obj.Destination, obj.PickReference);
            shipOrder.CreateBy            = _userName;
            shipOrder.CreateDate          = DateTime.Now;
            shipOrder.BOLNumber           = obj.BOLNumber;
            shipOrder.Carrier             = obj.Carrier;
            shipOrder.ETS                 = obj.ETS;
            shipOrder.ETSTimeRange        = obj.TimeRange;
            shipOrder.PickNumber          = obj.PickNumber;
            shipOrder.PurchaseOrderNumber = obj.PurchaseOrderNumber;
            shipOrder.Instruction         = obj.Instruction;
            shipOrder.ChargingItemDetails = chargingItemDetailList;

            _context.FBAShipOrders.Add(shipOrder);
            _context.SaveChanges();

            var sampleDto = Mapper.Map <FBAShipOrder, FBAShipOrderDto>(_context.FBAShipOrders.OrderByDescending(x => x.Id).First());

            await _logger.AddCreatedLogAsync <FBAShipOrder>(null, sampleDto, "Created a new FBA ship order", null, OperationLevel.Normal);

            return(Created(Request.RequestUri + "/" + sampleDto.Id, sampleDto));
        }
        private bool IsPending(FBAShipOrder shipOrderInDb)
        {
            var result = false;

            foreach (var s in shipOrderInDb.ChargingItemDetails)
            {
                if (s.HandlingStatus == FBAStatus.Pending)
                {
                    result = true;
                    break;
                }
            }
            return(result);
        }
        private bool IsAllowedToReady(FBAShipOrder shipOrderInDb)
        {
            var result = true;

            foreach (var s in shipOrderInDb.ChargingItemDetails)
            {
                if (s.HandlingStatus == FBAStatus.New || s.HandlingStatus == FBAStatus.ReturnedOrder || s.HandlingStatus == FBAStatus.Updated || s.HandlingStatus == FBAStatus.Pending || s.HandlingStatus == FBAStatus.Confirmed)
                {
                    result = false;
                    break;
                }
            }
            return(result);
        }
        public async Task CreateOutboundOrdersByAgentRequestV1(string customerCode, FBAInboundOrder order, string requestId)
        {
            // 添加Request日志
            var logger = new Logger(_context, order.Agency);

            var index = 1;

            foreach (var j in order.FBAJobs)
            {
                var shipOrder = new FBAShipOrder();

                shipOrder.ShipOrderNumber = order.Container + "-" + index + "-" + j.ShipmentId;
                shipOrder.CreateBy        = order.Agency;
                shipOrder.Carrier         = "Unknow";
                shipOrder.CustomerCode    = customerCode;
                shipOrder.Agency          = order.Agency;
                shipOrder.OrderType       = "Standard";
                shipOrder.ETSTimeRange    = "Unknow";
                shipOrder.Destination     = j.WarehouseCode;
                shipOrder.SubCustomer     = j.Subcustomer;
                shipOrder.Instruction     = "This order is generated by api automatically. Some fields are pending. Please fill out them once all information is clear.";
                shipOrder.OperationLog    = "Created by agency via API";

                _context.FBAShipOrders.Add(shipOrder);

                var instruction = new ChargingItemDetail();

                instruction.Description         = "To CSR: Please pick the following quantity of sku in system: " + j.Quantity + j.PackageType + " of shipmentID: " + j.ShipmentId + ", amz Ref Id: " + j.AmzRefId + ", warehouse code: " + j.WarehouseCode;
                instruction.HandlingStatus      = "N/A";
                instruction.Status              = FBAStatus.NoNeedForCharging;
                instruction.IsCharging          = false;
                instruction.IsInstruction       = true;
                instruction.IsOperation         = false;
                instruction.OriginalDescription = instruction.Description;
                instruction.FBAShipOrder        = shipOrder;

                _context.ChargingItemDetails.Add(instruction);

                await logger.AddCreatedLogAsync <FBAShipOrder>(null, Mapper.Map <FBAShipOrder, FBAShipOrderDto>(shipOrder), "Created by agency from api.", null, OperationLevel.Mediunm);

                var logInDb = _context.OperationLogs.OrderByDescending(x => x.Id).First();

                logInDb.RequestId = requestId;

                index += 1;
            }

            _context.SaveChanges();
        }
        public ReturnData SendStandardOrderShippedRequest(FBAShipOrder order, IEnumerable <FBAPickDetailCarton> pickedCtnList)
        {
            var url = "https://5802100-sb1.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=425&deploy=1";

            var lines = new List <TransLine>();

            foreach (var p in pickedCtnList)
            {
                if (lines.Where(x => x.ItemNum == p.FBACartonLocation.ShipmentId).Count() != 0)
                {
                    continue;
                }

                lines.Add(new TransLine {
                    Quantity = p.PickCtns,
                    ItemNum  = p.FBACartonLocation.ShipmentId
                });
            }
            var list = new List <ShippedData>();

            list.Add(new ShippedData
            {
                TransOrderNo = order.ShipOrderNumber,
                Memo         = "",
                Trandate     = order.ReleasedDate.ToString("yyyy-MM-dd"),
                Lines        = lines
            });

            var body = new TransOrderRequestBody {
                Data = list.ToArray()
            };

            var responseString = SendHttpRequest(url, JsonConvert.SerializeObject(body, Formatting.Indented, new JsonSerializerSettings
            {
                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            }), "POST");

            var responseBody = new ReturnData();

            using (var input = new StringReader(responseString))
            {
                responseBody = JsonConvert.DeserializeObject <ReturnData>(responseString);
            }

            return(responseBody);
        }
 public void CallBackWhenOutboundOrderCancelled(FBAShipOrder shipOrderInDb)
 {
     try
     {
         if (shipOrderInDb.CustomerCode == "SUNVALLEY" || shipOrderInDb.CustomerCode == "TEST")
         {
             if (shipOrderInDb.Agency == "跨境中台")
             {
                 _ztManager.UpdateOunboundOrderRequest(shipOrderInDb);
             }
         }
     }
     catch (Exception e)
     {
         throw new Exception("API call failed. Error message: " + e.Message);
     }
 }
 public void CallBackWhenOutboundOrderReady(FBAShipOrder shipOrderInDb)
 {
     try
     {
         if (shipOrderInDb.CustomerCode == "SUNVALLEY" || shipOrderInDb.CustomerCode == "TEST")
         {
             //var pickedCtnDetails = _context.FBAPickDetailCartons.Include(x => x.FBAPickDetail.FBAShipOrder).Include(x => x.FBACartonLocation).Where(x => x.FBAPickDetail.FBAShipOrder.Id == shipOrderInDb.Id);
             if (shipOrderInDb.Agency == "跨境中台")
             {
                 _ztManager.UpdateOunboundOrderRequest(shipOrderInDb);
             }
         }
     }
     catch (Exception e)
     {
         throw new Exception("API call failed. Error message: " + e.Message);
     }
 }
        public ReturnData SendDirectSellOrderShippedRequest(FBAShipOrder order, IEnumerable <FBAPickDetailCarton> pickedCtnList)
        {
            var url = "https://5802100-sb1.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=433&deploy=1";

            var skuList = new List <Sku>();

            foreach (var p in pickedCtnList)
            {
                skuList.Add(new Sku
                {
                    SkuNo   = p.FBACartonLocation.ShipmentId,
                    SkuCode = p.FBACartonLocation.ShipmentId,
                    Qty     = p.PickCtns
                });
            }

            var body = new DirectSaleOrderRequestBody
            {
                DeliverOrderId = order.Id.ToString(),
                SourceNo       = order.ShipOrderNumber,
                TrackNo        = "1",
                SkuList        = skuList
            };

            var responseString = SendHttpRequest(url, JsonConvert.SerializeObject(body, Formatting.Indented, new JsonSerializerSettings
            {
                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
            }), "POST");

            var responseBody = new ReturnData();

            using (var input = new StringReader(responseString))
            {
                responseBody = JsonConvert.DeserializeObject <ReturnData>(responseString);
            }

            return(responseBody);
        }
        public async Task <IList <PickingStatus> > CreateShipOrderAsync(FBAOutboundOrder order, UpperVendor customerInDb, string requestId)
        {
            var shipOrder = new FBAShipOrder
            {
                OrderType         = order.OrderType,
                CustomerCode      = customerInDb.CustomerCode,
                Status            = FBAStatus.Draft,
                CreateBy          = "External API",
                ETS               = DateTime.ParseExact(order.ETS, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture),
                ETSTimeRange      = order.EtsTimeRange,
                Destination       = order.Destionation,
                CreateDate        = DateTime.Now,
                Agency            = order.Agency,
                WarehouseLocation = order.WarehouseLocation == "" ? "W0" : order.WarehouseLocation,
                ShipOrderNumber   = GenerateShipOrderNumber(customerInDb.CustomerCode, order.ShipOrderNumber)
            };

            var logger = new Logger(_context, order.Agency);

            await logger.AddCreatedLogAsync <FBAShipOrder>(null, Mapper.Map <FBAShipOrder, FBAShipOrderDto>(shipOrder), "Created by agency from api.", null, OperationLevel.Mediunm);

            var logInDb = _context.OperationLogs.OrderByDescending(x => x.Id).First();

            logInDb.RequestId = requestId;

            var pickingStatusList    = new List <PickingStatus>();
            var pickDetailCartonList = new List <FBAPickDetailCarton>();

            _context.FBAShipOrders.Add(shipOrder);

            foreach (var p in order.PickingList)
            {
                var pickingStatus = new PickingStatus(shipOrder.ShipOrderNumber, p.Container, p.ShipmentId, p.AmzRefId, p.WarehouseCode, p.Quantity, p.PalletQuantity);

                var inventoryList = _picker.SearchPalletInventory(customerInDb.CustomerCode, p.Container, p.ShipmentId, p.AmzRefId, p.WarehouseCode, order.WarehouseLocation);

                if (inventoryList.Count() == 0 || inventoryList.First().FBACartonLocations.Count() == 0)
                {
                    pickingStatus.StatusCode = 3002;
                    pickingStatus.Status     = "Failed";
                    pickingStatus.Message    = "Picking failed. No target was found in inventory.";
                    pickingStatusList.Add(pickingStatus);
                    continue;
                }
                else if (inventoryList.Count() > 1)
                {
                    // 执行FIFO

                    pickingStatus.StatusCode = 3001;
                    pickingStatus.Status     = "Failed";
                    pickingStatus.Message    = "Picking failed. More than one target found in inventory.";
                    pickingStatusList.Add(pickingStatus);
                    continue;
                }

                var pltTarget = inventoryList.First();
                var ctnTarget = pltTarget.FBACartonLocations.First();
                var quantity  = p.Quantity;

                if (ctnTarget.AvailableCtns < quantity)
                {
                    pickingStatus.StatusCode = 3003;
                    pickingStatus.Status     = "Uncompleted";
                    pickingStatus.Message    = "Picking uncompeleted. Not enough quantity was found in inventory.";
                    pickingStatus.PickedCtns = ctnTarget.AvailableCtns;
                    quantity = ctnTarget.AvailableCtns;
                }

                var palletLocationInDb = _context.FBAPalletLocations
                                         .Include(x => x.FBAPallet.FBACartonLocations)
                                         .Include(x => x.FBAMasterOrder)
                                         .Include(x => x.FBAPallet.FBAPalletLocations)
                                         .SingleOrDefault(x => x.Id == pltTarget.Id);

                var pickCartonDtoList = new List <PickCartonDto>();
                pickCartonDtoList.Add(new PickCartonDto {
                    Id = ctnTarget.Id, PickQuantity = quantity
                });
                var pickDetail = _picker.CreateFBAPickDetailFromPalletLocation(palletLocationInDb, shipOrder, p.PalletQuantity, p.NewPallet, pickDetailCartonList, pickCartonDtoList, pickingStatus);

                pickingStatusList.Add(pickingStatus);
                pickDetail.PickableCtns = p.Quantity;
                _context.FBAPickDetailCartons.AddRange(pickDetailCartonList);
                _context.FBAPickDetails.Add(pickDetail);
            }

            if (!CheckStatus(pickingStatusList))
            {
                return(pickingStatusList);
            }

            _context.SaveChanges();

            return(pickingStatusList);
        }
        public void CloseShipOrder(ApplicationDbContext context, FBAShipOrder shipOrderInDb, string _userName, string reference, string invoiceType, DateTime closeDate, bool isAppliedMinCharge)
        {
            shipOrderInDb.InvoiceStatus = FBAStatus.Closed;
            shipOrderInDb.CloseDate     = closeDate;
            shipOrderInDb.ConfirmedBy   = _userName;

            if (isAppliedMinCharge)
            {
                var invoiceDetailsInDb = shipOrderInDb.InvoiceDetails;

                var outboundMinCharge = context.UpperVendors
                                        .SingleOrDefault(x => x.CustomerCode == shipOrderInDb.CustomerCode)
                                        .OutboundMinCharge;

                //检查是否已经存在差价收费项目
                var   priceDifference = invoiceDetailsInDb.SingleOrDefault(x => x.Activity == "Price Difference");
                float pd = 0;

                if (invoiceDetailsInDb.Count() == 0)
                {
                    pd = outboundMinCharge;
                }
                else
                {
                    pd = outboundMinCharge - (float)invoiceDetailsInDb.Sum(x => x.Amount);
                }

                if (priceDifference == null)
                {
                    //检查是否满足shiporder每单最小值,不满足的话则建立差价收费项目
                    if (pd > 0)
                    {
                        context.InvoiceDetails.Add(new InvoiceDetail
                        {
                            Activity     = "Price Difference",
                            ChargingType = "Price Difference",
                            Unit         = "N/A",
                            Quantity     = 1,
                            Rate         = Math.Round(pd, 2),
                            Amount       = Math.Round(pd, 2),
                            InvoiceType  = FBAInvoiceType.ShipOrder,
                            DateOfCost   = DateTime.Now,
                            Operator     = _userName,
                            FBAShipOrder = shipOrderInDb,
                            Memo         = "MIN CHARGE"
                        });
                    }
                }
                //如果已经有收费项目,则刷新收费项目中的金额
                else
                {
                    var amount = invoiceDetailsInDb.Where(x => x.Activity != "Price Difference").Sum(x => x.Amount);
                    pd = outboundMinCharge - (float)amount;

                    //如果仍然有差额,则刷新差额收费
                    if (pd > 0)
                    {
                        priceDifference.Amount = Math.Round(pd, 2);
                        priceDifference.Rate   = Math.Round(pd, 2);
                    }
                    //如果没有差额,则删除差额收费
                    else
                    {
                        context.InvoiceDetails.Remove(priceDifference);
                    }
                }
            }
        }
        private FBAWorkOrder GenerateWorkOrder(FBAShipOrder shipOrder)
        {
            var wo = new FBAWorkOrder();
            var pickCartonDetails = _context.FBAPickDetailCartons
                                    .Include(x => x.FBACartonLocation)
                                    .Include(x => x.FBAPickDetail.FBAShipOrder)
                                    .Where(x => x.FBAPickDetail.FBAShipOrder.Id == shipOrder.Id)
                                    .ToList();

            var pickDetails = _context.FBAPickDetails
                              .Include(x => x.FBAShipOrder)
                              .Include(x => x.FBAPickDetailCartons)
                              .Where(x => x.FBAShipOrder.Id == shipOrder.Id)
                              .ToList();

            wo.PlaceTime  = shipOrder.PlaceTime.Year == 1900 ? " " : shipOrder.PlaceTime.ToString("yyyy-MM-dd hh:mm");
            wo.ReadyTime  = shipOrder.ReadyTime.Year == 1900 ? " " : shipOrder.ReadyTime.ToString("yyyy-MM-dd hh:mm");
            wo.ETS        = shipOrder.ETS.ToString("yyyy-MM-dd") + shipOrder.ETSTimeRange;
            wo.PickMan    = shipOrder.PickMan;
            wo.Instructor = shipOrder.Instructor;

            wo.ShipOrderNumber = shipOrder.ShipOrderNumber;
            wo.Reference       = shipOrder.PickReference;
            wo.Destination     = shipOrder.Destination;
            wo.Carrier         = shipOrder.Carrier;
            wo.Lot             = shipOrder.Lot;

            wo.PickableCtns      = shipOrder.FBAPickDetails.Sum(x => x.ActualQuantity);
            wo.PickablePlts      = shipOrder.FBAPickDetails.Sum(x => x.PltsFromInventory);
            wo.PltsFromInventory = shipOrder.FBAPickDetails.Sum(x => x.PltsFromInventory);
            wo.NewPlts           = shipOrder.FBAPickDetails.Sum(x => x.NewPlts);
            wo.OutboundPlts      = shipOrder.FBAPickDetails.Sum(x => x.ActualPlts);

            var order = 1;

            foreach (var p in pickDetails)
            {
                if (p.FBAPickDetailCartons.Count == 0)
                {
                    wo.PickingLists.Add(new PickingList
                    {
                        Order        = order++,
                        Container    = p.Container,
                        SKU          = p.ShipmentId,
                        PickableCtns = p.ActualQuantity,
                        PickablePlts = p.PltsFromInventory,
                        Location     = p.Location
                    });
                }
            }

            if (pickCartonDetails.Count != 0)
            {
                var lastSku = " ";
                foreach (var p in pickCartonDetails)
                {
                    var pickList = new PickingList
                    {
                        Order        = order++,
                        Container    = p.FBAPickDetail.Container,
                        SKU          = p.FBACartonLocation.ShipmentId,
                        PickableCtns = p.PickCtns,
                        PickablePlts = 0,
                        Location     = p.FBAPickDetail.Location
                    };

                    if (p.FBAPickDetail.ShipmentId != lastSku)
                    {
                        pickList.PickablePlts = p.FBAPickDetail.PltsFromInventory;
                        lastSku = p.FBAPickDetail.ShipmentId;
                    }

                    wo.PickingLists.Add(pickList);
                }
            }

            var vaildDetails = shipOrder.ChargingItemDetails.Where(x => x.HandlingStatus != FBAStatus.Na);

            foreach (var c in vaildDetails)
            {
                wo.OperationInstructions.Add(new OperationInstruction {
                    Id             = c.Id,
                    Description    = c.Description,
                    Comment        = c.Comment,
                    CreateBy       = c.CreateBy,
                    CreateDate     = c.CreateDate,
                    Result         = c.Result,
                    HandlingStatus = c.HandlingStatus,
                    Status         = c.Status
                });
            }

            return(wo);
        }
        private void ChangeStatus(FBAShipOrder shipOrderInDb, string operation, DateTime operationDate)
        {
            //当操作类型为正向转换订单状态时
            if (operation == FBAOperation.ChangeStatus)
            {
                //新建的空单能被直接转换为Release状态
                if (shipOrderInDb.Status == FBAStatus.NewCreated)
                {
                    shipOrderInDb.Status       = FBAStatus.Ready;
                    shipOrderInDb.ReleasedBy   = _userName;
                    shipOrderInDb.ReleasedDate = operationDate;
                    shipOrderInDb.OperationLog = "Ready By " + _userName;
                }
                //如果订单为在拣状态,则转换为给仓库的新订单状态
                else if (shipOrderInDb.Status == FBAStatus.Picking)
                {
                    shipOrderInDb.Status       = FBAStatus.NewOrder;
                    shipOrderInDb.PlacedBy     = _userName;
                    shipOrderInDb.PlaceTime    = operationDate;
                    shipOrderInDb.OperationLog = "Placed by " + _userName;
                }
                //如果订单为新的订单状态,则转换为processing状态
                else if (shipOrderInDb.Status == FBAStatus.NewOrder || shipOrderInDb.Status == FBAStatus.ReturnedOrder)
                {
                    shipOrderInDb.Status       = FBAStatus.Processing;
                    shipOrderInDb.StartedBy    = _userName;
                    shipOrderInDb.StartedTime  = operationDate;
                    shipOrderInDb.OperationLog = "Started by " + _userName;
                }
                //如果订单为processing状态,如果仓库有返回不同的操作,转换为Pending状态,否则转换为ready状态
                else if (shipOrderInDb.Status == FBAStatus.Processing)
                {
                    if (IsPending(shipOrderInDb))
                    {
                        shipOrderInDb.Status       = FBAStatus.Pending;
                        shipOrderInDb.OperationLog = "Submited by " + _userName;
                    }
                    else
                    {
                        shipOrderInDb.Status       = FBAStatus.Ready;
                        shipOrderInDb.ReadyBy      = _userName;
                        shipOrderInDb.ReadyTime    = operationDate;
                        shipOrderInDb.OperationLog = "Ready by " + _userName;
                    }
                }
                //Pending状态,则转回Processing状态
                //else if (shipOrderInDb.Status == FBAStatus.Pending)
                //{
                //    shipOrderInDb.Status = FBAStatus.Updated;
                //    shipOrderInDb.OperationLog = "Returned by " + _userName;
                //}
                //如果订单为ready状态,则转换为Released状态(如果是空单则不会返回给仓库)
                else if (shipOrderInDb.Status == FBAStatus.Ready)
                {
                    shipOrderInDb.Status       = FBAStatus.Released;
                    shipOrderInDb.ReleasedDate = operationDate;
                    shipOrderInDb.ReleasedBy   = _userName;
                    shipOrderInDb.OperationLog = "Released by " + _userName;
                }
                //当状态为Release的情况下,从库存实际扣除
                else if (shipOrderInDb.Status == FBAStatus.Released)
                {
                    shipOrderInDb.OperationLog = "Shipping confirmed by " + _userName;
                    shipOrderInDb.Status       = FBAStatus.Shipped;
                    shipOrderInDb.ShippedBy    = _userName;
                    shipOrderInDb.ShipDate     = operationDate;

                    if (shipOrderInDb.FBAPickDetails.Count() != 0)
                    {
                        foreach (var pickDetailInDb in shipOrderInDb.FBAPickDetails)
                        {
                            ShipPickDetail(_context, pickDetailInDb.Id);
                        }
                    }
                }
            }
            //当操作类型为逆向转换订单状态时
            else if (operation == FBAOperation.ReverseStatus)
            {
                if (shipOrderInDb.Status == FBAStatus.Picking)
                {
                    if (shipOrderInDb.FBAPickDetails.Count != 0)
                    {
                        throw new Exception("Cannot reverse status because the pick details is not empty.");
                    }
                    else
                    {
                        shipOrderInDb.Status       = FBAStatus.NewCreated;
                        shipOrderInDb.OperationLog = "Revert by " + _userName;
                    }
                }
                else if (shipOrderInDb.Status == FBAStatus.NewOrder || shipOrderInDb.Status == FBAStatus.ReturnedOrder)
                {
                    shipOrderInDb.Status       = FBAStatus.Picking;
                    shipOrderInDb.OperationLog = "Recalled by " + _userName;
                }
                else if (shipOrderInDb.Status == FBAStatus.Processing || shipOrderInDb.Status == FBAStatus.Pending || shipOrderInDb.Status == FBAStatus.Updated)
                {
                    shipOrderInDb.Status       = FBAStatus.ReturnedOrder;
                    shipOrderInDb.OperationLog = "Reset by " + _userName;
                }
                else if (shipOrderInDb.Status == FBAStatus.Ready)
                {
                    shipOrderInDb.Status       = FBAStatus.ReturnedOrder;
                    shipOrderInDb.OperationLog = "Unready by " + _userName;
                }
                else if (shipOrderInDb.Status == FBAStatus.Released)
                {
                    shipOrderInDb.Status     = FBAStatus.Ready;
                    shipOrderInDb.ReleasedBy = "Cancelled by " + _userName;
                }
            }
            //当操作直接为ready时,直接将订单mark成ready
            else if (operation == FBAStatus.Ready)
            {
                if (IsPending(shipOrderInDb))
                {
                    throw new Exception("Cannot ready because some of the comments are pending.");
                }

                shipOrderInDb.Status       = FBAStatus.Ready;
                shipOrderInDb.ReadyTime    = operationDate;
                shipOrderInDb.OperationLog = "Approved by " + _userName;
            }
            else if (operation == FBAStatus.Released)
            {
                if (shipOrderInDb.FBAPickDetails.Count != 0)
                {
                    throw new Exception("操作失败!请不要利用状态刷新不及时的BUG将有拣货内容的运单跳过仓库端操作直接发货!");
                }

                shipOrderInDb.Status       = FBAStatus.Released;
                shipOrderInDb.ReleasedDate = operationDate;
                shipOrderInDb.OperationLog = "Release directly by " + _userName;
            }
        }
 private void UpdateWOInfo(FBAShipOrder shipOrderInDb, string pickMan, string instructor, string location)
 {
     shipOrderInDb.PickMan    = pickMan;
     shipOrderInDb.Instructor = instructor;
     shipOrderInDb.Lot        = location;
 }
Ejemplo n.º 16
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);
        }
Ejemplo n.º 17
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);
        }