コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }