/// <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);      //写入冻结明细
            }
        }