// 中台出库请求,在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; }
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 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); }