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); }
/// <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(); } }