/// <summary> /// 处理冻结余额为已完成或作废 /// </summary> /// <param name="transType">交易类型</param> /// <param name="orderId">订单ID/业务ID</param> /// <param name="toFrozeStatus">处理成作废或者完成</param> private TblCashWalletForzenDetail ProcessFrozeBalanceComplete(OrderTradeType transType, long orderId, BalanceFrozeStatus toFrozeStatus) { //1、根据处理后的状态来获取应要查询的状态 TblCashWalletForzenDetail detail = _forzenRepository.Value.GetByBusinessId(this._schoolId, (int)transType, orderId, (int)BalanceFrozeStatus.Process); //2、钱包余额冻结金额完成 TblCashWallet tblCashWallet = this.TblCashWallet; tblCashWallet.FrozenAmount = 0; tblCashWallet.UpdateTime = DateTime.Now; //防止数据重复操作 if (detail != null && toFrozeStatus == BalanceFrozeStatus.Cancel) { //如果取消,应将余额还回去 tblCashWallet.Balance += detail.Amount * (-1); } //3、冻结明细记录处理 //如果存在冻结明细,则记录冻结记录已完成 if (detail != null) { detail.Status = (int)toFrozeStatus; _forzenRepository.Value.Update(detail); //写入冻结明细 } //4、钱包余额 _repository.Value.Update(tblCashWallet); //更新用户钱包余额 return(detail); }
/// <summary> /// 冻结交易取消 /// </summary> /// <param name="sourceTradeType">原始订单交易类型</param> /// <param name="targetTradeType">目标订单交易类型</param> /// <param name="orderId"></param> internal void TradeFrozeCancel(OrderTradeType sourceTradeType, OrderTradeType targetTradeType, long orderId, string remark) { lock (LocalThreadLock.GetLockKeyName(LockKeyNames.LOCK_WALLET, this._studentId.ToString())) { TblCashWalletForzenDetail detail = this.ProcessFrozeBalanceComplete(sourceTradeType, orderId, BalanceFrozeStatus.Cancel); decimal transAmount = detail.Amount * (-1); //2、增加交易记录 TblCashWallet tblCashWallet = this.TblCashWallet; decimal transBefBalance = tblCashWallet.Balance + transAmount; //交易前余额,同下 decimal transAftBalance = tblCashWallet.Balance; //交易后余额,冻结交易,余额早已扣除,所以该余额即交易后余额 //余额交易明细 TblCashWalletTrade walletTrade = new TblCashWalletTrade() { WalletTradeId = IdGenerator.NextId(), OrderId = orderId, StudentId = this._studentId, SchoolId = this._schoolId, TradeType = (int)targetTradeType, TransBefBalance = transBefBalance, TransAftBalance = transAftBalance, TransAmount = transAmount, TransDate = DateTime.Now, Remark = remark }; //写入数据 _walletTradeRepository.Value.Add(walletTrade); } }
/// <summary> /// 冻结交易成功 /// </summary> /// <param name="transType"></param> /// <param name="orderId"></param> internal void TradeFrozeComplete(OrderTradeType transType, long orderId) { lock (LocalThreadLock.GetLockKeyName(LockKeyNames.LOCK_WALLET, this._studentId.ToString())) { //1、处理冻结余额数据 TblCashWalletForzenDetail detail = ProcessFrozeBalanceComplete(transType, orderId, BalanceFrozeStatus.Finish); } }
/// <summary> /// 钱包交易金额冻结 /// </summary> /// <param name="transType"></param> /// <param name="transAmount"></param> /// <param name="unitOfWork">事务工作单元</param> internal void TradeFroze(OrderTradeType transType, long orderId, decimal transAmount, string remark) { if (transAmount == 0) { return; } //TODO 以后应用分布式锁 lock (LocalThreadLock.GetLockKeyName(LockKeyNames.LOCK_WALLET, this._studentId.ToString())) { //1、钱包余额冻结金额 TblCashWallet tblCashWallet = this.TblCashWallet; decimal transBefBalance = tblCashWallet.Balance; //交易前余额 decimal transAftBalance = tblCashWallet.Balance + transAmount; //交易后余额 tblCashWallet.Balance = transAftBalance; tblCashWallet.FrozenAmount = transAmount; tblCashWallet.UpdateTime = DateTime.Now; //2、冻结明细记录 TblCashWalletForzenDetail detail = new TblCashWalletForzenDetail() { BusinessId = orderId, BusinessType = (int)transType, SchoolId = this._schoolId, Status = 1, Amount = transAmount, StudentId = this._studentId, WalletForzenDetailId = IdGenerator.NextId(), CreateTime = DateTime.Now }; //3、余额交易明细 TblCashWalletTrade walletTrade = new TblCashWalletTrade() { WalletTradeId = IdGenerator.NextId(), OrderId = orderId, StudentId = this._studentId, SchoolId = this._schoolId, TradeType = (int)transType, TransBefBalance = transBefBalance, TransAftBalance = transAftBalance, TransAmount = transAmount, TransDate = DateTime.Now, Remark = remark }; //4、写入数据 _walletTradeRepository.Value.Add(walletTrade); _repository.Value.Update(tblCashWallet); //更新用户钱包余额 _forzenRepository.Value.Add(detail); //写入冻结明细 } }