public async Task <Result> PostByProduct([FromBody] OrderCreateByProductParam model)
        {
            var user = await _workContext.GetCurrentUserAsync();

            var param = new OrderCreateBaseParam()
            {
                CustomerId            = user.Id,
                DiscountAmount        = 0,
                OrderNote             = model.OrderNote,
                ShippingUserAddressId = model.ShippingUserAddressId,
                PaymentType           = PaymentType.OnlinePayment,
                ShippingMethod        = ShippingMethod.Free,
                ShippingFeeAmount     = 0,
            };

            param.Items.Add(new OrderCreateBaseItemParam()
            {
                ProductId = model.ProductId,
                Quantity  = model.Quantity
            });
            var order = await _orderService.OrderCreate(user.Id, param);

            var result = new OrderCreateResult()
            {
                OrderId    = order.Id,
                OrderNo    = order.No.ToString(),
                OrderTotal = order.OrderTotal
            };

            return(Result.Ok(result));
        }
Exemple #2
0
        public async Task <OrderCreateResult> OrderCrateByCart2(int cartId, OrderCreateBaseParam param, string adminNote = null)
        {
            if (param == null)
            {
                throw new Exception("参数异常");
            }

            var user = await _workContext.GetCurrentOrThrowAsync();

            var customerId = param.CustomerId;
            var cart       = await _cartRepository.Query()
                             .Include(c => c.Items)
                             .FirstOrDefaultAsync(x => x.CustomerId == customerId && x.IsActive && x.Id == cartId);

            if (cart == null || cart.Items == null || cart.Items.Where(c => c.IsChecked).Count() <= 0)
            {
                throw new Exception("请选择商品");
            }
            if (cart.Items.Where(c => c.IsChecked).Any(c => c.Quantity <= 0))
            {
                throw new Exception("商品数量必须大于0");
            }
            param.Items = cart.Items.Where(c => c.IsChecked).Select(c => new OrderCreateBaseItemParam()
            {
                ProductId = c.ProductId,
                Quantity  = c.Quantity
            }).ToList();

            var order = await this.OrderCreate(user.Id, param, adminNote);

            // 清除已下单的商品
            foreach (var item in cart.Items.Where(c => c.IsChecked))
            {
                if (order.OrderItems.Any(c => c.ProductId == item.ProductId))
                {
                    item.IsDeleted = true;
                    item.UpdatedOn = DateTime.Now;
                }
            }

            await _cartRepository.SaveChangesAsync();

            return(new OrderCreateResult()
            {
                OrderId = order.Id,
                OrderNo = order.No.ToString(),
                OrderTotal = order.OrderTotal
            });
        }
        public async Task <Result> PostByOrder([FromBody] OrderCreateByOrderParam model)
        {
            var user = await _workContext.GetCurrentUserAsync();

            var oldOrder = await _orderRepository.Query()
                           .Include(c => c.OrderItems)
                           .FirstOrDefaultAsync(c => c.Id == model.OrderId && c.CustomerId == user.Id);

            if (oldOrder == null)
            {
                throw new Exception("订单不存在");
            }
            var param = new OrderCreateBaseParam()
            {
                CustomerId            = user.Id,
                DiscountAmount        = 0,
                OrderNote             = model.OrderNote,
                ShippingUserAddressId = model.ShippingUserAddressId,
                PaymentType           = PaymentType.OnlinePayment,
                ShippingMethod        = ShippingMethod.Free,
                ShippingFeeAmount     = 0,
            };

            param.Items = oldOrder.OrderItems.Select(c => new OrderCreateBaseItemParam()
            {
                ProductId = c.ProductId,
                Quantity  = c.Quantity
            }).ToList();
            var order = await _orderService.OrderCreate(user.Id, param);

            var result = new OrderCreateResult()
            {
                OrderId    = order.Id,
                OrderNo    = order.No.ToString(),
                OrderTotal = order.OrderTotal
            };

            return(Result.Ok(result));
        }
Exemple #4
0
        public async Task <OrderCreateResult> OrderCreateByCart(int cartId, OrderCreateBaseParam param, string adminNote = null)
        {
            if (param == null)
            {
                throw new Exception("参数异常");
            }

            var user = await _workContext.GetCurrentUserAsync();

            var customerId = param.CustomerId;

            return(await OrderCrateByCart2(cartId, param, adminNote));

            // TODO 下单锁
            //var isLocker = _locker.PerformActionWithLock(OrderKeys.CustomerCreateOrderLock + customerId, TimeSpan.FromSeconds(10),
            //    async () => await OrderCrateByCart2(cartId, param, adminNote));

            //if (!isLocker)
            //{
            //    throw new Exception("正在下单,请勿重复操作");
            //}
        }
Exemple #5
0
        public async Task <Order> OrderCreate(int userId, OrderCreateBaseParam param, string adminNote = null)
        {
            if (param == null)
            {
                throw new Exception("参数异常");
            }
            if (param.Items == null || param.Items.Count <= 0)
            {
                throw new Exception("购买商品不存在或已下架");
            }
            if (param.Items.Any(c => c.Quantity <= 0))
            {
                throw new Exception("购买商品数量必须>0");
            }

            param.Items = param.Items.GroupBy(c => c.ProductId).Select(c => new OrderCreateBaseItemParam()
            {
                ProductId = c.Key,
                Quantity  = c.Sum(x => x.Quantity)
            }).ToList();

            var customerId       = param.CustomerId;
            var payEndTimeForMin = await _appSettingService.Get <int>(OrderKeys.OrderAutoCanceledTimeForMinute);

            var productIds = param.Items.Select(c => c.ProductId).Distinct();
            var products   = await _productRepository.Query()
                             .Where(c => productIds.Contains(c.Id) && c.IsPublished && c.IsAllowToOrder)
                             .Include(c => c.ThumbnailImage)
                             .ToListAsync();

            if (products == null || products.Count <= 0)
            {
                throw new Exception("购买商品不存在或已下架");
            }

            var stocks = await _stockRepository.Query().Where(c => productIds.Contains(c.ProductId)).ToListAsync();

            var order = new Order()
            {
                OrderStatus       = OrderStatus.PendingPayment, // 默认创建订单,待付款
                CreatedById       = userId,
                UpdatedById       = userId,
                CustomerId        = customerId,
                AdminNote         = adminNote,
                OrderNote         = param.OrderNote,
                ShippingMethod    = param.ShippingMethod,
                PaymentType       = param.PaymentType,
                ShippingFeeAmount = param.ShippingFeeAmount,
                DiscountAmount    = param.DiscountAmount,
                PaymentEndOn      = DateTime.Now.AddMinutes(payEndTimeForMin)
            };

            var orderShipping = await UserAddressToOrderAddress(param.ShippingUserAddressId, customerId, AddressType.Shipping, order);

            OrderAddress orderBilling = null;

            if (param.BillingUserAddressId.HasValue && param.BillingUserAddressId.Value > 0)
            {
                orderBilling = await this.UserAddressToOrderAddress(param.BillingUserAddressId.Value, customerId, AddressType.Billing, order);
            }

            var addStockHistories = new List <StockHistory>();

            foreach (var item in param.Items)
            {
                var product = products.FirstOrDefault(c => c.Id == item.ProductId);
                if (product == null)
                {
                    continue;
                }

                OrderStockDoWorker(stocks, addStockHistories, product, userId, -item.Quantity, order, "创建订单");

                var orderItem = new OrderItem()
                {
                    Order           = order,
                    Product         = product,
                    ItemWeight      = 0,
                    ItemAmount      = item.Quantity * product.Price,
                    Quantity        = item.Quantity,
                    ProductPrice    = product.Price,
                    DiscountAmount  = 0,
                    CreatedById     = userId,
                    UpdatedById     = userId,
                    ProductName     = product.Name,
                    ProductMediaUrl = product.ThumbnailImage?.Url
                };
                order.OrderItems.Add(orderItem);
            }

            order.SubTotal             = order.OrderItems.Sum(c => c.Quantity * c.ProductPrice);
            order.SubTotalWithDiscount = order.OrderItems.Sum(c => c.DiscountAmount);
            order.OrderTotal           = order.OrderItems.Sum(c => c.Product.Price * c.Quantity) + order.ShippingFeeAmount - order.SubTotalWithDiscount - order.DiscountAmount;
            _orderRepository.Add(order);

            // Unable to save changes because a circular dependency was detected in the data to be saved
            // https://github.com/aspnet/EntityFrameworkCore/issues/11888
            // https://docs.microsoft.com/zh-cn/ef/core/saving/transactions
            // https://stackoverflow.com/questions/40073149/entity-framework-circular-dependency-for-last-entity
            using (var transaction = _orderRepository.BeginTransaction())
            {
                await _orderRepository.SaveChangesAsync();

                order.ShippingAddress = orderShipping;
                order.BillingAddress  = orderBilling;
                await _orderRepository.SaveChangesAsync();

                var orderCreated = new OrderCreated
                {
                    OrderId = order.Id,
                    Order   = order,
                    UserId  = order.CreatedById,
                    Note    = order.OrderNote
                };
                await _mediator.Publish(orderCreated);

                await _stockRepository.SaveChangesAsync();

                if (addStockHistories.Count > 0)
                {
                    _stockHistoryRepository.AddRange(addStockHistories);
                    await _stockHistoryRepository.SaveChangesAsync();
                }

                // 订单取消任务 如果n分钟内用户支付或主动取消订单时,则自动取消此任务
                var min = await _appSettingService.Get <int>(OrderKeys.OrderAutoCanceledTimeForMinute);

                await _jobService.Schedule(() => Cancel(order.Id, (int)UserWithId.System, "超时自动取消"), TimeSpan.FromMinutes(min));

                transaction.Commit();
            }

            //TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }
            //using (var ts = new TransactionScope())
            //{
            //    ts.Complete();
            //}

            return(order);
        }