public async Task <Result> Address(ShipmentAddressRequest request)
        {
            var shipment = await _shipmentRepository.Query()
                           .Include(e => e.ShipmentOrderItems).ThenInclude(e => e.OrderItem)
                           .FirstOrDefaultAsync(e => e.Id == request.Id);

            if (shipment == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }

            ShippingAddress shippingAddress = null;

            if (request.ShippingAddressId > 0)
            {
                var address = await _customerAddressRepository.Query()
                              .Include(e => e.Province)
                              .Include(e => e.City)
                              .Include(e => e.Area)
                              .FirstOrDefaultAsync(e => e.Id == request.ShippingAddressId);

                if (address == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "送货地址不存在"));
                }

                shippingAddress = new ShippingAddress
                {
                    ShipmentId   = request.Id,
                    PostalCode   = address.PostalCode.ToString(),
                    ProvinceName = address.Province.Name,
                    CityName     = address.City.Name,
                    AreaName     = address.Area.Name,
                    DetailInfo   = address.DetailInfo,
                    TelNumber    = address.TelNumber,
                    UserName     = address.UserName,
                    Createat     = DateTime.Now
                };
            }
            else if (request.ShippingAddress != null && !string.IsNullOrEmpty(request.ShippingAddress.UserName))
            {
                shippingAddress = new ShippingAddress
                {
                    ShipmentId   = request.Id,
                    PostalCode   = request.ShippingAddress.PostalCode,
                    ProvinceName = request.ShippingAddress.ProvinceName,
                    CityName     = request.ShippingAddress.CityName,
                    AreaName     = request.ShippingAddress.CountyName,
                    DetailInfo   = request.ShippingAddress.DetailInfo,
                    TelNumber    = request.ShippingAddress.TelNumber,
                    UserName     = request.ShippingAddress.UserName,
                    Createat     = DateTime.Now
                };
            }
            else
            {
                return(Result.Fail(ResultCodes.RequestParamError, "请选择送货地址"));
            }

            var orderItems = shipment.ShipmentOrderItems.Select(e => e.OrderItem);
            var goodsIds   = orderItems.Select(e => e.GoodsItemId);
            var goodses    = await _goodsRepository.Query().Where(e => goodsIds.Contains(e.Id)).ToListAsync();

            foreach (var item in orderItems)
            {
                var goods = goodses.FirstOrDefault(e => e.Id == item.GoodsItemId);
                if (goods == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "商品不存在"));
                }
                if (goods.ParentId == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "选择的商品不是有效的商品"));
                }
                if (goods.StockQuantity <= 0)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"商品{goods.Name} {goods.NormalizedName} 库存不足"));
                }
                //减库存
                goods.StockQuantity -= item.Quantity;

                item.Status = OrderItemStatus.PendingShipment;
            }

            shipment.IsValid         = true;
            shipment.Remarks         = request.Remarks;
            shipment.ShippingAddress = shippingAddress;

            _shipmentRepository.Update(shipment, false);

            using (var transaction = _shipmentRepository.BeginTransaction())
            {
                await _shipmentRepository.SaveAsync();

                await _goodsRepository.UpdateRangeAsync(goodses);

                transaction.Commit();
            }

            var notify = new ShippingApplyNotify
            {
                Name = shippingAddress.UserName,
                Tel  = shippingAddress.TelNumber,
            };
            await _adminUserManager.WarehouseNotify(notify);

            return(Result.Ok());
        }
        public async Task <Result> Apply([FromBody] ShipmentApplyRequest request)
        {
            var userId = HttpContext.GetUserId();

            ShippingAddress shippingAddress = null;

            if (request.ShippingAddressId > 0)
            {
                var address = await _customerAddressRepository.Query()
                              .Include(e => e.Province)
                              .Include(e => e.City)
                              .Include(e => e.Area)
                              .FirstOrDefaultAsync(e => e.Id == request.ShippingAddressId);

                if (address == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "送货地址不存在"));
                }

                shippingAddress = new ShippingAddress
                {
                    PostalCode   = address.PostalCode.ToString(),
                    ProvinceName = address.Province.Name,
                    CityName     = address.City.Name,
                    AreaName     = address.Area.Name,
                    DetailInfo   = address.DetailInfo,
                    TelNumber    = address.TelNumber,
                    UserName     = address.UserName,
                    Createat     = DateTime.Now
                };
            }
            else if (request.ShippingAddress != null)
            {
                shippingAddress = new ShippingAddress
                {
                    PostalCode   = request.ShippingAddress.PostalCode,
                    ProvinceName = request.ShippingAddress.ProvinceName,
                    CityName     = request.ShippingAddress.CityName,
                    AreaName     = request.ShippingAddress.CountyName,
                    DetailInfo   = request.ShippingAddress.DetailInfo,
                    TelNumber    = request.ShippingAddress.TelNumber,
                    UserName     = request.ShippingAddress.UserName,
                    Createat     = DateTime.Now
                };
            }

            var orderItemIds = request.Items.Select(e => e.Id).Distinct().ToList();
            var orderItems   = await _orderItemRepository.Query().Where(e => orderItemIds.Contains(e.Id)).ToListAsync();

            // var goodsIds = request.Items.Select(e => e.GoodsId);
            // var goodses = await _goodsRepository.Query().Where(e => goodsIds.Contains(e.Id)).ToListAsync();
            var shipmentOrderItems = new List <ShipmentOrderItem>();

            foreach (var item in request.Items.Distinct())
            {
                var first = orderItems.FirstOrDefault(e => e.Id == item.Id);
                if (first == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"订单不存在 {item.Id}"));
                }

                // var goods = goodses.FirstOrDefault(e => e.Id == item.GoodsId);
                // if (goods == null) return Result.Fail(ResultCodes.RequestParamError, "商品不存在");
                // if (goods.ParentId == null) return Result.Fail(ResultCodes.RequestParamError, "选择的商品不是有效的商品");
                // if (goods.StockQuantity <= 0) return Result.Fail(ResultCodes.RequestParamError, $"商品{goods.Name} {goods.NormalizedName} 库存不足");
                // //减库存
                // goods.StockQuantity -= first.Quantity;

                first.GoodsItemId    = item.GoodsId;
                first.NormalizedName = item.NormalizedName;
                // first.ShippingStatus = ShippingStatus.PendingShipment;
                // first.ShippingTime = DateTime.Now;

                shipmentOrderItems.Add(new ShipmentOrderItem(first.Id));
            }

            var shipment = new Shipment
            {
                CustomerId         = userId,
                Quantity           = orderItems.Count,
                ShippingStatus     = ShippingStatus.PendingShipment,
                ShippingTime       = DateTime.Now,
                Createat           = DateTime.Now,
                Remarks            = request.Remarks,
                ShippingAddress    = shippingAddress,
                ShipmentOrderItems = shipmentOrderItems
            };

            _shipmentRepository.Insert(shipment, false);

            using (var transaction = _shipmentRepository.BeginTransaction())
            {
                await _shipmentRepository.SaveAsync();

                // await _goodsRepository.UpdateRangeAsync(goodses);

                transaction.Commit();
            }

            await _orderItemRepository.UpdateRangeAsync(orderItems);

            return(Result.Ok(_mapper.Map <ShipmentResponse>(shipment)));
        }