예제 #1
0
        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));
        }
예제 #2
0
        /// <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));
        }