コード例 #1
0
ファイル: UnitTest1.cs プロジェクト: makejack/distribution
        public void PaymentReceived()
        {
            string      connectionString = "Data Source=localhost;Initial Catalog=mytime_distribution;User ID=sa;Password=sa";
            var         options          = new DbContextOptionsBuilder <AppDatabase>().UseSqlServer(connectionString).Options;
            AppDatabase db = new AppDatabase(options);
            //Given
            // var dbMock = new Mock<AppDatabase>(options);
            // var a = orderMock.Object.FirstOrDefaultAsync(10027);
            // var order = a.Result;
            // var mock = new Mock<IRepositoryByInt<Orders>>();
            // mock.Setup(s => s.FirstOrDefaultAsync(10018)).ReturnsAsync(new Orders
            // {
            //     Createat = DateTime.Now,
            //     Id = 10018,
            //     OrderNo = "20201230793793187574448128",
            //     OrderStatus = Domain.Shared.OrderStatus.PendingPayment
            // });
            // var cMock = new Mock<IRepositoryByInt<Customer>>();
            // cMock.Setup(s => s.FirstOrDefaultAsync(1)).ReturnsAsync(new Customer
            // {
            //     Id = 10001,
            //     NickName = "sea",
            //     Role = Domain.Shared.PartnerRole.Default
            // });

            IRepositoryByInt <Orders>   orderRes    = new RepositoryByInt <Orders>(db);
            IRepositoryByInt <Customer> customerRes = new RepositoryByInt <Customer>(db);
            var order    = orderRes.FirstOrDefaultAsync(1).Result;
            var customer = customerRes.FirstOrDefaultAsync(0).Result;
            PaymentReceivedRequest request = new PaymentReceivedRequest
            {
                OrderNo       = "20201230793793187574448128",
                PaymentFee    = 1100,
                PaymentMethod = Domain.Shared.PaymentMethods.Wechat,
                PaymentTime   = DateTime.Now
            };
            //When

            //Then

            IOrderService orderService = new OrderService(orderRes, customerRes, null);

            orderService.PaymentReceived(request);
        }
コード例 #2
0
ファイル: OrderService.cs プロジェクト: makejack/distribution
        /// <summary>
        /// 支付接收
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task PaymentReceived(PaymentReceivedRequest request)
        {
            var order = await _orderRepository.Query()
                        .Include(e => e.OrderItems)
                        .ThenInclude(e => e.CommissionHistory)
                        .FirstOrDefaultAsync(e => e.OrderNo == request.OrderNo);

            if (order == null)
            {
                return;
            }

            var status = new OrderStatus[] { OrderStatus.PendingPayment, OrderStatus.PaymentFailed };

            if (!status.Contains(order.OrderStatus))
            {
                return;
            }

            var         roleResult = false;
            PartnerRole role       = PartnerRole.Default;

            if (!string.IsNullOrEmpty(order.ExtendParams))
            {
                roleResult = Enum.TryParse <PartnerRole>(order.ExtendParams, true, out role);
            }

            var totalCommission = 0;
            var totalAmount     = 0;
            var commissions     = order.OrderItems.Where(e => e.CommissionHistory != null).Select(e => e.CommissionHistory);

            if (commissions.Count() > 0)
            {
                foreach (var item in commissions)
                {
                    if (order.IsFirstOrder)
                    {
                        totalAmount        += item.Commission;
                        item.Status         = CommissionStatus.Complete;
                        item.SettlementTime = DateTime.Now;
                    }
                    else
                    {
                        totalCommission += item.Commission;
                        item.Status      = CommissionStatus.PendingSettlement;
                    }
                }
            }

            order.OrderStatus   = OrderStatus.PaymentReceived;
            order.PaymentMethod = request.PaymentMethod;
            order.PaymentTime   = request.PaymentTime;
            order.PaymentFee    = request.PaymentFee;

            _orderRepository.Update(order, false);

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

                if (roleResult)
                {
                    await _customerRepository.UpdateProperyAsync(new Customer
                    {
                        Id   = order.CustomerId,
                        Role = role
                    }, nameof(Customer.Role));
                }

                if (totalCommission > 0 || totalAmount > 0)
                {
                    var parentId = commissions.Select(e => e.CustomerId).FirstOrDefault();
                    await _customerManager.UpdateAssets(parentId, totalCommission, totalAmount, "下级首单返佣金");
                }

                if (order.WalletAmount > 0)
                {
                    await _customerManager.UpdateAssets(order.CustomerId, 0, 0, -order.WalletAmount, "商品抵扣金额");
                }

                transaction.Commit();
            }
        }