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)); }
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)); }
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("正在下单,请勿重复操作"); //} }
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); }