Пример #1
0
        /// <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();
            }
        }
Пример #2
0
        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);
            }
        }