public async Task UpdateShipOrder([FromUri] int shipOrderId, [FromBody] ShipOrderDto obj)
        {
            if (Checker.CheckString(obj.ShipOrderNumber))
            {
                throw new Exception("Container number cannot contain space.");
            }

            var shipOrderInDb = _context.FBAShipOrders.Find(shipOrderId);
            var oldValueDto   = Mapper.Map <FBAShipOrder, FBAShipOrderDto>(shipOrderInDb);

            //如果更新的运单号不是之前的运单号且在数据库中有重复,则报错
            if (obj.ShipOrderNumber != shipOrderInDb.ShipOrderNumber && _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.");
            }

            shipOrderInDb.ShipOrderNumber     = obj.ShipOrderNumber;
            shipOrderInDb.CustomerCode        = obj.CustomerCode;
            shipOrderInDb.OrderType           = obj.OrderType;
            shipOrderInDb.Destination         = obj.Destination;
            shipOrderInDb.PickReference       = obj.PickReference;
            shipOrderInDb.Carrier             = obj.Carrier;
            shipOrderInDb.BOLNumber           = obj.BOLNumber;
            shipOrderInDb.ETS                 = obj.ETS;
            shipOrderInDb.ETSTimeRange        = obj.TimeRange;
            shipOrderInDb.PickNumber          = obj.PickNumber;
            shipOrderInDb.PurchaseOrderNumber = obj.PurchaseOrderNumber;
            shipOrderInDb.EditBy              = _userName;
            shipOrderInDb.Instruction         = obj.Instruction;

            var resultDto = Mapper.Map <FBAShipOrder, FBAShipOrderDto>(shipOrderInDb);

            await _logger.AddUpdatedLogAndSaveChangesAsync <FBAShipOrder>(oldValueDto, resultDto, "Updated some basic ship order info", null, OperationLevel.Mediunm);
        }
        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));
        }