public ApiResult <MerchantOrderBuyOutput> Buy([FromBody] MerchantOrderBuyInput parameter) { if (!this.IsFormValid()) { return(ApiResult.Failure <MerchantOrderBuyOutput>(this.FormInvalidReason(), MessageCodes.ParameterValidationFailure)); } var result = Resolve <IMerchantOrderService>().Buy(parameter); if (!result.Item1.Succeeded) { return(ApiResult.Failure <MerchantOrderBuyOutput>(result.Item1.ToString(), MessageCodes.ServiceFailure)); } return(ApiResult.Success(result.Item2)); }
/// <summary> /// 提交订单 /// </summary> /// <param name="orderBuyInput"></param> public Tuple <ServiceResult, MerchantOrderBuyOutput> Buy(MerchantOrderBuyInput orderBuyInput) { //check var orderBuyOutput = new MerchantOrderBuyOutput(); var user = Resolve <IUserService>().GetNomarlUser(orderBuyInput.UserId); if (user == null) { return(Tuple.Create(ServiceResult.Failure("用户不存在,或状态不正常"), orderBuyOutput)); } if (orderBuyInput.Products.Count <= 0) { return(Tuple.Create(ServiceResult.Failure("提交商品数据异常"), orderBuyOutput)); } //get cart from database var cartIds = orderBuyInput.Products.Select(c => c.Id.ToObjectId()).ToList(); var carts = Resolve <IMerchantCartService>().GetCart(cartIds); if (carts.Count <= 0) { return(Tuple.Create(ServiceResult.Failure("提交商品数据异常"), orderBuyOutput)); } //Calculator price var priceResult = CountPrice(carts); if (!priceResult.Item1.Succeeded) { return(Tuple.Create(priceResult.Item1, orderBuyOutput)); } var orderPrice = priceResult.Item2; //check input data if (orderBuyInput.TotalAmount != orderPrice.TotalAmount) { return(Tuple.Create(ServiceResult.Failure("商品价格计算有误"), orderBuyOutput)); } if (orderBuyInput.TotalCount != orderPrice.TotalCount) { return(Tuple.Create(ServiceResult.Failure("订单商品计算有误"), orderBuyOutput)); } //save var result = ServiceResult.Success; var context = Repository <IMerchantOrderRepository>().RepositoryContext; try { context.BeginTransaction(); //order var order = new MerchantOrder { UserId = user.Id, MerchantStoreId = orderBuyInput.MerchantStoreId, OrderStatus = MerchantOrderStatus.WaitingBuyerPay, OrderType = MerchantOrderType.Normal, TotalAmount = orderPrice.TotalAmount, TotalCount = orderPrice.TotalCount, PaymentAmount = orderPrice.TotalAmount }; order.MerchantOrderExtension = new MerchantOrderExtension { OrderAmount = new MerchantOrderAmount { ReceivedAmount = order.PaymentAmount, TotalAmount = orderPrice.TotalAmount, FeeAmount = orderPrice.FeeAmount }, MerchantProducts = orderPrice.Products }; order.Extension = order.MerchantOrderExtension.ToJson(); Resolve <IMerchantOrderService>().Add(order); //order product var productService = Resolve <IMerchantProductService>(); var orderProducts = new List <MerchantOrderProduct>(); carts.ForEach(product => { //add order product var orderProduct = new MerchantOrderProduct { MerchantStoreId = orderBuyInput.MerchantStoreId, OrderId = order.Id, MerchantProductId = product.MerchantProductId, SkuId = product.SkuId, Count = product.Count, Amount = product.Price, PaymentAmount = product.ProductAmount }; orderProducts.Add(orderProduct); //stock var productData = productService.GetSingle(p => p.Id == product.MerchantProductId.ToObjectId()); if (productData != null) { var sku = productData.Skus?.Find(s => s.SkuId == product.SkuId); if (sku != null) { sku.Stock -= product.Count; } productData.SoldCount += product.Count; productService.Update(productData); } //delete from cart Resolve <IMerchantCartService>().Delete(product.Id.ToObjectId()); }); Resolve <IMerchantOrderProductService>().AddMany(orderProducts); //TODO 2019年9月24日 重构 线下订单交易 //order for pay //var payOrder = new Shop.Order.Domain.Entities.Order { // Id = order.Id, // PaymentAmount = order.PaymentAmount, // TotalAmount = order.TotalAmount //}; ////pay record //var singlePayInput = new SinglePayInput { // Orders = new List<Shop.Order.Domain.Entities.Order> { payOrder }, // User = user, // ExcecuteSqlList = new BaseServiceMethod { // Method = "ExcecuteSqlList", // ServiceName = typeof(IMerchantOrderService).Name, // Parameter = order.Id // }, // BuyerCount = 1, // CheckoutType = CheckoutType.Offline //}; //var payResult = Resolve<IOrderAdminService>().AddSinglePay(singlePayInput); //if (!payResult.Item1.Succeeded) { // context.RollbackTransaction(); // return Tuple.Create(payResult.Item1, orderBuyOutput); //} ////update order pay id //Resolve<IMerchantOrderService>().Update(r => { // r.PayId = payResult.Item2.Id; //}, e => e.Id == order.Id); ////add order action //Resolve<IOrderActionService>().Add(payOrder, user, OrderActionType.OfflineUserCreateOrder); //output // orderBuyOutput.PayAmount = payResult.Item2.Amount; // orderBuyOutput.PayId = payResult.Item2.Id; orderBuyOutput.OrderIds = new List <long> { order.Id }; context.SaveChanges(); context.CommitTransaction(); } catch (Exception ex) { context.RollbackTransaction(); result = ServiceResult.Failure(ex.Message); } finally { context.DisposeTransaction(); } return(Tuple.Create(result, orderBuyOutput)); }