public async Task <IHttpActionResult> CreateNewManifestItem([FromUri] string grandNumber, [FromUri] string operation, [FromBody] ManifestItem item)
        {
            var masterOrderInDb = _context.FBAMasterOrders.SingleOrDefault(x => x.GrandNumber == grandNumber);

            var newItem = new FBAOrderDetail {
                ShipmentId     = item.ShipmentId,
                Container      = masterOrderInDb.Container,
                AmzRefId       = item.AmzRefId,
                WarehouseCode  = item.WarehouseCode,
                HowToDeliver   = item.Deliver,
                GrossWeight    = item.GrossWeight,
                CBM            = item.CBM,
                Quantity       = item.Quantity,
                Remark         = item.Remark,
                FBAMasterOrder = masterOrderInDb,
                GrandNumber    = grandNumber
            };

            _context.FBAOrderDetails.Add(newItem);
            _context.SaveChanges();

            var resultDto = Mapper.Map <FBAOrderDetail, FBAOrderDetailDto>(_context.FBAOrderDetails.OrderByDescending(x => x.Id).First());

            await _logger.AddCreatedLogAsync <FBAOrderDetail>(null, resultDto, "Added a new manifest item", null, OperationLevel.Normal);

            return(Created(Request.RequestUri + "/" + resultDto.Id, resultDto));
        }
        //抽取FBA通用PackingList模板
        public void ExtractFBAPackingListTemplate(string grandNumber)
        {
            var orderDetailsList = new List <FBAOrderDetail>();

            _ws = _wb.Worksheets[1];
            var masterOrderInDb = _context.FBAMasterOrders.SingleOrDefault(x => x.GrandNumber == grandNumber);

            var countOfOrderDetail = 0;
            var index = 2;

            var shipmentId    = string.Empty;
            var amzRefId      = string.Empty;
            var lotSize       = string.Empty;
            var warehouseCode = string.Empty;
            var howToDeliver  = string.Empty;
            var grossWeight   = 0f;
            var cbm           = 0f;
            var quantity      = 0;
            var remark        = string.Empty;

            //扫描有多少个OrderDetail对象(行数-1)
            while (_ws.Cells[index, 1].Value2 != null)
            {
                countOfOrderDetail++;
                index++;
            }

            for (int i = 0; i < countOfOrderDetail; i++)
            {
                shipmentId    = _ws.Cells[i + 2, 1].Value2.ToString();
                amzRefId      = _ws.Cells[i + 2, 2].Value2 == null ? "NA" : _ws.Cells[i + 2, 2].Value2.ToString();
                lotSize       = _ws.Cells[i + 2, 3].Value2 == null ? "NA" : _ws.Cells[i + 2, 3].Value2.ToString();
                warehouseCode = _ws.Cells[i + 2, 4].Value2 == null ? "NA" : _ws.Cells[i + 2, 4].Value2.ToString();
                howToDeliver  = _ws.Cells[i + 2, 5].Value2 == null ? "NA" : _ws.Cells[i + 2, 5].Value2.ToString();
                grossWeight   = _ws.Cells[i + 2, 6].Value2 == null ? 0 : (float)_ws.Cells[i + 2, 6].Value2;
                cbm           = _ws.Cells[i + 2, 7].Value2 == null ? 0 : (float)_ws.Cells[i + 2, 7].Value2;
                quantity      = (int)_ws.Cells[i + 2, 8].Value2;
                remark        = _ws.Cells[i + 2, 9].Value2 == null ? "NA" : _ws.Cells[i + 2, 9].Value2.ToString();

                var orderDetail = new FBAOrderDetail();

                orderDetail.AssembleFirstStringPart(shipmentId, amzRefId, warehouseCode);
                orderDetail.AssembleSecontStringPart(lotSize, howToDeliver, remark);
                orderDetail.AssembleNumberPart(grossWeight, cbm, quantity);

                orderDetail.Container      = masterOrderInDb.Container == "" ? "NULL" : masterOrderInDb.Container;
                orderDetail.GrandNumber    = grandNumber;
                orderDetail.FBAMasterOrder = masterOrderInDb;

                orderDetailsList.Add(orderDetail);
            }

            _context.FBAOrderDetails.AddRange(orderDetailsList);
            _context.SaveChanges();
        }
        public async Task CreateInboundOrderByAgentRequestV1(UpperVendor customer, string customerCode, FBAInboundOrder order, string requestId)
        {
            // 建立主单
            var newMasterOrder = new FBAMasterOrder();

            newMasterOrder.GrandNumber       = "N/A";
            newMasterOrder.Agency            = order.Agency;
            newMasterOrder.Container         = order.Container;
            newMasterOrder.CreatedBy         = order.Agency;
            newMasterOrder.SubCustomer       = order.Subcustomer;
            newMasterOrder.StorageType       = "SEE INSTRUCTION";
            newMasterOrder.Status            = FBAStatus.Draft;
            newMasterOrder.UnloadingType     = "DROP-OFF";
            newMasterOrder.InboundType       = "FCL";
            newMasterOrder.Palletizing       = "<=80";
            newMasterOrder.TotalCBM          = order.FBAJobs.Sum(x => x.CBM);
            newMasterOrder.TotalCtns         = order.FBAJobs.Sum(x => x.Quantity);
            newMasterOrder.OriginalPlts      = order.FBAJobs.Sum(x => x.PalletQuantity);
            newMasterOrder.CustomerCode      = customerCode;
            newMasterOrder.WarehouseLocation = order.WarehouseLocation == "" ? "W0" : order.WarehouseLocation;
            newMasterOrder.Customer          = customer;
            newMasterOrder.PortOfLoading     = order.PortOfLoading;
            newMasterOrder.ETAPort           = order.ETADate;
            newMasterOrder.ETA             = order.ETADate;
            newMasterOrder.PlaceOfDelivery = order.DeliveryPort;
            newMasterOrder.Vessel          = order.Vessel;
            newMasterOrder.Carrier         = order.Carrier;
            newMasterOrder.ContainerSize   = order.ContainerSize;
            newMasterOrder.SealNumber      = order.SealNumber;
            newMasterOrder.Comment         = "ETL DATE: " + order.ETLDate;
            newMasterOrder.UpdateLog       = "Created by agency via API";

            _context.FBAMasterOrders.Add(newMasterOrder);

            foreach (var j in order.FBAJobs)
            {
                var orderDetail = new FBAOrderDetail();
                orderDetail.Container      = order.Container;
                orderDetail.GrandNumber    = "N/A";
                orderDetail.GrossWeight    = j.GrossWeight;
                orderDetail.CBM            = j.CBM;
                orderDetail.Quantity       = j.Quantity;
                orderDetail.ShipmentId     = j.ShipmentId;
                orderDetail.AmzRefId       = j.AmzRefId;
                orderDetail.WarehouseCode  = j.WarehouseCode;
                orderDetail.Remark         = "包装:" + j.PackageType + ";产品类型:" + j.ProductType + ";打托数量:" + j.PalletQuantity;
                orderDetail.FBAMasterOrder = newMasterOrder;
                _context.FBAOrderDetails.Add(orderDetail);
            }

            var instruction = new ChargingItemDetail();

            instruction.Description         = "To CSR: This inbound order is created by an agency from api. If there is no further customer's instructions below, please contact customer to do a further confirmation.";
            instruction.HandlingStatus      = "N/A";
            instruction.Status              = FBAStatus.NoNeedForCharging;
            instruction.IsCharging          = false;
            instruction.IsInstruction       = true;
            instruction.IsOperation         = false;
            instruction.OriginalDescription = instruction.Description;
            instruction.FBAMasterOrder      = newMasterOrder;
            _context.ChargingItemDetails.Add(instruction);

            if (order.Instructions != null)
            {
                foreach (var i in order.Instructions)
                {
                    var customerInstruction = new ChargingItemDetail();

                    customerInstruction.Description         = i;
                    customerInstruction.HandlingStatus      = "N/A";
                    customerInstruction.Status              = FBAStatus.TBD;
                    customerInstruction.IsCharging          = false;
                    customerInstruction.IsInstruction       = true;
                    customerInstruction.IsOperation         = false;
                    customerInstruction.OriginalDescription = instruction.Description;
                    customerInstruction.FBAMasterOrder      = newMasterOrder;
                    _context.ChargingItemDetails.Add(customerInstruction);
                }
            }

            // 添加Request日志
            var logger = new Logger(_context, order.Agency);

            await logger.AddCreatedLogAsync <FBAMasterOrder>(null, Mapper.Map <FBAMasterOrder, FBAMasterOrderDto>(newMasterOrder), "Created by agency from api.", null, OperationLevel.Mediunm);

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

            logInDb.RequestId = requestId;

            _context.SaveChanges();
        }
        public IHttpActionResult UpdateInfo([FromUri] int orderDetailId, [FromUri] string operation, [FromBody] FBAOrderDetail obj)
        {
            var orderDetailInDb = _context.FBAOrderDetails
                                  .Include(x => x.FBAMasterOrder)
                                  .SingleOrDefault(x => x.Id == orderDetailId);

            // TO DO: 等办公室不再用旧UI操作后,这里的else中部分可以简化
            if (operation == "Edit")
            {
                orderDetailInDb.ShipmentId    = obj.ShipmentId;
                orderDetailInDb.AmzRefId      = obj.AmzRefId;
                orderDetailInDb.WarehouseCode = obj.WarehouseCode;
                orderDetailInDb.HowToDeliver  = obj.HowToDeliver;
                orderDetailInDb.GrossWeight   = obj.GrossWeight;
                orderDetailInDb.Barcode       = obj.Barcode;
                orderDetailInDb.CBM           = obj.CBM;
                orderDetailInDb.Quantity      = obj.Quantity;
                orderDetailInDb.Remark        = obj.Remark;
                orderDetailInDb.LotSize       = obj.LotSize;
            }
            else
            {
                //如果该主单还未被确认收货(没有收货日期),则禁止单个调节
                if (orderDetailInDb.FBAMasterOrder.InboundDate.Year == 1900)
                {
                    throw new Exception("Cannot update info because this master order is unreceived yet.");
                }

                //如果该detail被分配,则禁止更改实收数据
                if (orderDetailInDb.ComsumedQuantity != 0)
                {
                    throw new Exception("Cannot update info because this item has been comsumed.");
                }

                orderDetailInDb.ActualQuantity    = obj.ActualQuantity;
                orderDetailInDb.ActualGrossWeight = obj.ActualGrossWeight;
                orderDetailInDb.ActualCBM         = obj.ActualCBM;
                orderDetailInDb.Comment           = obj.Comment;
                orderDetailInDb.LotSize           = obj.LotSize;
                orderDetailInDb.Remark            = obj.Remark;
            }

            _context.SaveChanges();
            return(Ok(Mapper.Map <FBAOrderDetail, FBAOrderDetailDto>(orderDetailInDb)));
        }