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 async Task <IHttpActionResult> CreateOutboundOrderFromExternalRequest([FromUri] string appKey, [FromUri] string customerCode, [FromUri] string requestId, [FromUri] string version, [FromUri] string sign, [FromBody] FBAOutboundOrder order) { // 验证签名 var customerInDb = _context.UpperVendors.SingleOrDefault(x => x.CustomerCode == customerCode); var jsonResult = _validator.ValidateSign(appKey, customerInDb, requestId, version, sign); if (jsonResult.Code != 200) { return(Ok(jsonResult)); } // 检查推送过来的Order的字段完整性,缺省的字段套用默认值 var pickingStatus = await CreateShipOrderAsync(order, customerInDb, requestId); jsonResult.PickingStatus = new { Status = CheckStatus(pickingStatus) ? "Success" : "Failed", Details = pickingStatus }; jsonResult.Code = jsonResult.PickingStatus.Status == "Failed" ? 507 : jsonResult.Code; return(Created(Request.RequestUri, jsonResult)); }