public async Task <GetOrderOutput> Create(CreateOrderInput input) { // 扣减库存 var product = await _productAppService.DeductStock(new DeductStockInput() { Quantity = input.Quantity, ProductId = input.ProductId }); // 创建订单 var order = input.MapTo <Domain.Orders.Order>(); order.Amount = product.UnitPrice * input.Quantity; order = await Create(order); RpcContext.GetContext().SetAttachment("orderId", order.Id); //扣减账户余额 var deductBalanceInput = new DeductBalanceInput() { OrderId = order.Id, AccountId = input.AccountId, OrderBalance = order.Amount }; var orderBalanceId = await _accountAppService.DeductBalance(deductBalanceInput); if (orderBalanceId.HasValue) { RpcContext.GetContext().SetAttachment("orderBalanceId", orderBalanceId.Value); } return(order.MapTo <GetOrderOutput>()); }
public async Task <long?> DeductBalance(DeductBalanceInput input, TccMethodType tccMethodType) { var account = await GetAccountById(input.AccountId); var trans = await _repository.BeginTransactionAsync(); BalanceRecord balanceRecord = null; switch (tccMethodType) { case TccMethodType.Try: account.Balance -= input.OrderBalance; account.LockBalance += input.OrderBalance; balanceRecord = new BalanceRecord() { OrderBalance = input.OrderBalance, OrderId = input.OrderId, PayStatus = PayStatus.NoPay }; await _repository.InsertAsync(balanceRecord); RpcContext.GetContext().SetAttachment("balanceRecordId", balanceRecord.Id); break; case TccMethodType.Confirm: account.LockBalance -= input.OrderBalance; var balanceRecordId1 = RpcContext.GetContext().GetAttachment("orderBalanceId")?.To <long>(); if (balanceRecordId1.HasValue) { balanceRecord = await _repository.GetByIdAsync <BalanceRecord>(balanceRecordId1.Value); balanceRecord.PayStatus = PayStatus.Payed; await _repository.UpdateAsync(balanceRecord); } break; case TccMethodType.Cancel: account.Balance += input.OrderBalance; account.LockBalance -= input.OrderBalance; var balanceRecordId2 = RpcContext.GetContext().GetAttachment("orderBalanceId")?.To <long>(); if (balanceRecordId2.HasValue) { balanceRecord = await _repository.GetByIdAsync <BalanceRecord>(balanceRecordId2.Value); balanceRecord.PayStatus = PayStatus.Cancel; await _repository.UpdateAsync(balanceRecord); } break; } await _repository.UpdateAsync(account); await trans.CommitAsync(); await _accountCache.RemoveAsync($"Account:Name:{account.Name}"); return(balanceRecord?.Id); }
public async Task <long?> DeductBalance(DeductBalanceInput input) { var account = await _accountDomainService.GetAccountById(input.AccountId); if (input.OrderBalance > account.Balance) { throw new BusinessException("账号余额不足"); } return(await _accountDomainService.DeductBalance(input, TccMethodType.Try)); }
public Task DeductBalanceCancel(DeductBalanceInput input) { return(_accountDomainService.DeductBalance(input, TccMethodType.Cancel)); }