コード例 #1
0
ファイル: OrderDomainService.cs プロジェクト: binbin0915/lms
        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>());
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: AccountAppService.cs プロジェクト: binbin0915/lms
        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));
        }
コード例 #4
0
ファイル: AccountAppService.cs プロジェクト: binbin0915/lms
 public Task DeductBalanceCancel(DeductBalanceInput input)
 {
     return(_accountDomainService.DeductBalance(input, TccMethodType.Cancel));
 }