/// <summary> /// 发起转账单 /// </summary> /// <param name="transferBillType">转账单类型</param> /// <param name="status"></param> /// <param name="fromMemberUserName">发起转账用户Id</param> /// <param name="toMemberUserName">购买人用户名</param> /// <param name="amount">转账金额</param> public void Initiate(TransferBillType transferBillType, TransferBillStatus status, string fromMemberUserName, string toMemberUserName, decimal amount) { var session = DataBase.Session; ITransaction iTransaction = session.BeginTransaction(IsolationLevel.ReadCommitted); try { //创建转账单 var transferBill = new TransferBill { FromMemberUserName = fromMemberUserName, FromAccountType = transferBillType.FromAccount(), ToMemberUserName = toMemberUserName, ToAccountType = transferBillType.ToAccount(), Amount = amount, Status = status, TransferBillType = transferBillType, ExpiredAt = DateTime.Now }; DataBase.Save(transferBill, session); //扣除出账账户余额 var fromMember = GetFromMember(transferBill, session); if (fromMember != null) { DataBase.Update(fromMember, session); } //完成状态的交易单增加入账账户余额 if (transferBill.Status == TransferBillStatus.Completed) { if (transferBill.FromMemberUserName == transferBill.ToMemberUserName) { var propertyName = $"{transferBill.ToAccountType.ToString()}Balance"; var balance = fromMember.GetPropertyValue(propertyName).To <decimal>(); balance += transferBill.Amount; fromMember.SetPropertyValue(propertyName, balance); DataBase.Update(fromMember, session); } else { var toMember = GetToMember(transferBill, session); DataBase.Update(toMember, session); } } iTransaction.Commit(); } catch (Exception ex) { iTransaction.Rollback(); MiddleTier.LogManager.Error(ex); if (ex is PlatformException platformException) { throw platformException; } throw new PlatformException(ErrorCode.SystemError); } finally { session.Close(); } }
public static AccountType ToAccount(this TransferBillType type) { switch (type) { case TransferBillType.Active: return(AccountType.Gold); case TransferBillType.GoldTransfer: return(AccountType.Gold); case TransferBillType.GoldToCopper: return(AccountType.Copper); case TransferBillType.GoldToSilver: return(AccountType.Silver); case TransferBillType.SlagRefine: return(AccountType.Gold); default: throw new PlatformException(ErrorCode.TransferBillTypeError); } }