/// <summary>
        /// 获取充值记录
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回充值记录</returns>
        public PageResult<RechargeRecordExport> GetRechargeRecords(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            int startRow = settingOfBase.PageSizeForAdmin * (this.PageIndex - 1);

            Expression<Func<RechargeRecord, bool>> predicate1 = x => x.Id > 0;
            Expression<Func<RechargeRecord, bool>> predicate2 = x => x.Id > 0;
            Expression<Func<RechargeRecord, bool>> predicate3 = x => x.Id > 0;
            Expression<Func<RechargeRecord, bool>> predicate4 = x => x.Id > 0;
            Expression<Func<RechargeRecord, bool>> predicate5 = x => x.Id > 0;

            if (this.KeywordForUsername != null)
            {
                this.KeywordForUsername = VerifyHelper.EliminateSpaces(this.KeywordForUsername);
                string[] keywords = this.KeywordForUsername.Split(new char[] { ' ' });
                predicate1 = x => keywords.All(kw => x.Owner.Username.Contains(kw));
            }
            if (this.UserId != null)
            {
                int userId = (int)this.UserId;
                predicate2 = x => x.Owner.Id == userId;
            }
            if (this.BeginTime != null)
            {
                DateTime beginTime = (DateTime)this.BeginTime;
                predicate3 = x => x.CreatedTime >= beginTime;
            }
            if (this.EndTime != null)
            {
                DateTime endtime = (DateTime)this.EndTime;
                predicate4 = x => x.CreatedTime <= endtime;
            }
            if (this.Status != null)
            {
                RechargeStatus status = (RechargeStatus)this.Status;
                predicate5 = x => x.Status == status;
            }

            int countOfAllMessages = db.RechargeRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Where(predicate4)
                .Where(predicate5)
                .Count();
            var tList = db.RechargeRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Where(predicate4)
                .Where(predicate5)
                .OrderByDescending(x => x.CreatedTime)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForAdmin)
                .ToList()
                .ConvertAll(x => new RechargeRecordExport(x));

            return new PageResult<RechargeRecordExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForAdmin, tList);
        }
 /// <summary>
 /// 设置并保存
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 public void SetAndSave(IModelToDbContextOfAuthor db)
 {
     List<SystemQuota> sqs = db.SystemQuotas.ToList();
     sqs.Where(x => !this.Quotas.Any(q => q.Rebate == x.Rebate)).ToList()
         .ForEach(x =>
         {
             db.SystemQuotas.Remove(x);
         });
     this.Quotas
         .ForEach(quota =>
         {
             SystemQuota sq = sqs.FirstOrDefault(x => x.Rebate == quota.Rebate);
             if (sq == null)
             {
                 sq = new SystemQuota(quota.Rebate, new List<SystemQuotaDetail>());
                 db.SystemQuotas.Add(sq);
             }
             sq.Details.RemoveAll(x => !quota.Details.Any(d => d.Rebate == x.Rebate));
             quota.Details
                 .ForEach(detail =>
                 {
                     SystemQuotaDetail sqd = sq.Details.FirstOrDefault(x => x.Rebate == detail.Rebate);
                     if (sqd == null)
                     {
                         sqd = new SystemQuotaDetail(detail.Rebate, detail.Sum);
                         sq.Details.Add(sqd);
                     }
                     else
                     {
                         sqd.Sum = detail.Sum;
                     }
                 });
         });
     db.SaveChanges();
 }
        /// <summary>
        /// 保持心跳
        /// </summary>
        /// <param name="db">数据库存储指针</param>
        public void KeepHeartbeat(IModelToDbContextOfAuthor db)
        {
            SettingOfBase setting = new SettingOfBase(db);
            int s = setting.HeartbeatInterval * 3;

            this.Timeout = DateTime.Now.AddSeconds(s);
        }
        /// <summary>
        /// 获取用户组信息
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回用户组信息</returns>
        public PageResult<UserGroupExport> GetUserGroups(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            int startRow = settingOfBase.PageSizeForAdmin * (this.PageIndex - 1);

            Expression<Func<UserGroup, bool>> predicate1 = x => x.Id > 0;

            if (this.KeywordForGroupName != null)
            {
                this.KeywordForGroupName = VerifyHelper.EliminateSpaces(this.KeywordForGroupName);
                string[] keywords = this.KeywordForGroupName.Split(new char[] { ' ' });
                predicate1 = x => keywords.All(kw => x.Name.Contains(kw));
            }

            int countOfAllMessages = db.UserGroups
                .Where(predicate1)
                .Count();
            var tList = db.UserGroups
                .Where(predicate1)
                .OrderBy(x => x.Grade)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForAdmin)
                .ToList()
                .ConvertAll(userGroup => new UserGroupExport(userGroup));

            return new PageResult<UserGroupExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForAdmin, tList);
        }
 /// <summary>
 /// 保持心跳
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <param name="token">身份标识</param>
 public static void KeepHeartbeat(IModelToDbContextOfAuthor db, string token)
 {
     AuthorLoginInfo info = infos.FirstOrDefault(x => x.Token == token);
     if (info == null)
     {
         throw new Exception("指定的身份标识所标示的用户不存在");
     }
     info.KeepHeartbeat(db);
 }
        /// <summary>
        /// 获取系统设置
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回系统设置</returns>
        public NormalResult<SettingExport> GetSetting(IModelToDbContextOfAuthor db)
        {
            SettingOfBase settingOfBase = new SettingOfBase(db);
            SettingOfAuthor settingOfAuthor = new SettingOfAuthor(db);
            SettingOfLottery settingOfLottery = new SettingOfLottery(db);

            var s = new SettingExport(settingOfBase, settingOfAuthor, settingOfLottery);
            return new NormalResult<SettingExport>(s);
        }
        /// <summary>
        /// 实例化一个新的用户的登陆信息
        /// </summary>
        /// <param name="db">数据库存储指针</param>
        /// <param name="userId">用户信息的存储指针</param>
        public AuthorLoginInfo(IModelToDbContextOfAuthor db, int userId)
        {
            SettingOfBase setting = new SettingOfBase(db);
            int s = setting.HeartbeatInterval * 3;

            this.Token = Guid.NewGuid().ToString("N");
            this.UserId = userId;
            this.LoginTime = DateTime.Now;
            this.Timeout = this.LoginTime.AddSeconds(s);
        }
 /// <summary>
 /// 声明用户登入
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <param name="userId">用户信息的存储指针</param>
 /// <returns>返回身份标识</returns>
 public static string AddInfo(IModelToDbContextOfAuthor db, int userId)
 {
     lock (infos)
     {
         RemoveInfo(userId);
         AuthorLoginInfo info = new AuthorLoginInfo(db, userId);
         CallEvent(Logining, info);
         infos.Add(info);
         CallEvent(Logined, info);
         return info.Token;
     }
 }
        /// <summary>
        /// 获取银行账户信息
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回银行账户信息</returns>
        public PageResult<SystemBankAccountExport> GetSystemBankAccounts(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            int startRow = settingOfBase.PageSizeForAdmin * (this.PageIndex - 1);

            int countOfAllMessages = db.SystemBankAccounts
                .Count();
            var tList = db.SystemBankAccounts
                .OrderBy(x => x.Order)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForAdmin)
                .ToList()
                .ConvertAll(x => new SystemBankAccountExport(x));

            return new PageResult<SystemBankAccountExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForAdmin, tList);
        }
        /// <summary>
        /// 获取提现记录
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回提现记录</returns>
        public PageResult<WithdrawalsRecordExport> GetWithdrawDetails(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            int startRow = settingOfBase.PageSizeForClient * (this.PageIndex - 1);

            Expression<Func<WithdrawalsRecord, bool>> predicate1 = x => x.Id == this.Self.Id;
            Expression<Func<WithdrawalsRecord, bool>> predicate2 = x => x.Id > 0;
            Expression<Func<WithdrawalsRecord, bool>> predicate3 = x => x.Id > 0;
            Expression<Func<WithdrawalsRecord, bool>> predicate4 = x => x.Id > 0;
            if (this.BeginTime != null)
            {
                DateTime beginTime = (DateTime)this.BeginTime;
                predicate2 = x => x.CreatedTime >= beginTime;
            }
            if (this.EndTime != null)
            {
                DateTime endTime = (DateTime)this.EndTime;
                predicate3 = x => x.CreatedTime < endTime;
            }
            if (this.Status != null)
            {
                WithdrawalsStatus status = (WithdrawalsStatus)this.Status;
                predicate4 = x => x.Status == status;
            }

            int countOfAllMessages = db.WithdrawalsRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Where(predicate4)
                .Count();
            var tList = db.WithdrawalsRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Where(predicate4)
                .OrderByDescending(x => x.CreatedTime)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForClient)
                .ToList()
                .ConvertAll(x => new WithdrawalsRecordExport(x));

            return new PageResult<WithdrawalsRecordExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForClient, tList);
        }
        /// <summary>
        /// 获取自己的用户信息
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回自己的用户信息</returns>
        public NormalResult<AuthorExport> GetSelf(IModelToDbContextOfAuthor db)
        {
            SettingOfAuthor settingOfAuthor = new SettingOfAuthor(db);
            UserGroup group = db.UserGroups.FirstOrDefault(g => g.LowerOfConsumption <= this.Self.Consumption && g.CapsOfConsumption > this.Self.Consumption);
            SystemQuota systemQuota = db.SystemQuotas.FirstOrDefault(s => s.Rebate == this.Self.PlayInfo.Rebate_Normal);
            if (systemQuota == null)
            {
                systemQuota = new SystemQuota(this.Self.PlayInfo.Rebate_Normal, new List<SystemQuotaDetail>());
                for (double i = settingOfAuthor.LowerRebateOfHigh; i <= settingOfAuthor.CapsRebateOfHigh; i += 0.1)
                {
                    SystemQuotaDetail sqd = new SystemQuotaDetail(i, 0);
                    systemQuota.Details.Add(sqd);
                }
            }

            AuthorExport authorExport = new AuthorExport(this.Self, group, systemQuota.Details);
            return new NormalResult<AuthorExport>(authorExport);
        }
        /// <summary>
        /// 获取转账记录
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回转账记录</returns>
        public PageResult<TransferRecordExport> GetTransferRecords(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            int startRow = settingOfBase.PageSizeForAdmin * (this.PageIndex - 1);

            Expression<Func<TransferRecord, bool>> predicate1 = x => x.Id > 0;
            Expression<Func<TransferRecord, bool>> predicate2 = x => x.Id > 0;
            Expression<Func<TransferRecord, bool>> predicate3 = x => x.Id > 0;

            if (this.BeginTime != null)
            {
                DateTime beginTime = (DateTime)this.BeginTime;
                predicate1 = x => x.CreatedTime >= beginTime;
            }
            if (this.EndTime != null)
            {
                DateTime endtime = (DateTime)this.EndTime;
                predicate2 = x => x.CreatedTime <= endtime;
            }
            if (this.Status != null)
            {
                TransferStatus status = (TransferStatus)this.Status;
                predicate3 = x => x.Status == status;
            }

            int countOfAllMessages = db.TransferRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Count();
            var tList = db.TransferRecords
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .OrderByDescending(x => x.CreatedTime)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForAdmin)
                .ToList()
                .ConvertAll(x => new TransferRecordExport(x));

            return new PageResult<TransferRecordExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForAdmin, tList);
        }
        /// <summary>
        /// 获取用户信息列表
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回用户信息列表</returns>
        public PageResult<BasicAuthorExport> GetUsers(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            SettingOfAuthor settingOfAuthor = new SettingOfAuthor(db);
            int startRow = settingOfBase.PageSizeForClient * (this.PageIndex - 1);

            Expression<Func<Author, bool>> predicate1 = x => x.Id > 0;
            Expression<Func<Author, bool>> predicate2 = x => x.Id > 0;
            Expression<Func<Author, bool>> predicate3 = x => x.Relatives.Any(r => r.NodeId == this.Self.Id);

            if (this.KeywordForUsername != null)
            {
                this.KeywordForUsername = VerifyHelper.EliminateSpaces(this.KeywordForUsername);
                string[] keywords = this.KeywordForUsername.Split(new char[] { ' ' });
                predicate1 = x => keywords.All(kw => x.Username.Contains(kw));
            }
            if (this.OnlyImmediate == true)
            {
                predicate2 = x => x.Layer == this.Self.Layer + 1;
            }

            int countOfAllMessages = db.Authors
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Count();
            var tList = db.Authors
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .OrderByDescending(x => x.Layer)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForClient)
                .ToList()
                .ConvertAll(x =>
                {
                    UserGroup group = db.UserGroups.FirstOrDefault(g => g.LowerOfConsumption <= x.Consumption && g.CapsOfConsumption > x.Consumption);
                    return new BasicAuthorExport(x, group);
                });

            return new PageResult<BasicAuthorExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForClient, tList);
        }
 /// <summary>
 /// 获取用户信息
 /// </summary>
 /// <param name="db">数据库存储指针</param>
 /// <returns>返回用户信息</returns>
 public Author GetUser(IModelToDbContextOfAuthor db)
 {
     return db.Authors.Find(this.UserId);
 }
        /// <summary>
        /// 获取用户信息列表
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        /// <returns>返回用户信息列表</returns>
        public PageResult<AuthorExport> GetUsers(IModelToDbContextOfAuthor db)
        {
            if (this.PageIndex < 1) { this.PageIndex = 1; }
            SettingOfBase settingOfBase = new SettingOfBase(db);
            SettingOfAuthor settingOfAuthor = new SettingOfAuthor(db);
            int startRow = settingOfBase.PageSizeForAdmin * (this.PageIndex - 1);

            Expression<Func<Author, bool>> predicate1 = x => x.Id > 0;
            Expression<Func<Author, bool>> predicate2 = x => x.Id > 0;
            Expression<Func<Author, bool>> predicate3 = x => x.Id > 0;

            if (this.KeywordForUsername != null)
            {
                this.KeywordForUsername = VerifyHelper.EliminateSpaces(this.KeywordForUsername);
                string[] keywords = this.KeywordForUsername.Split(new char[] { ' ' });
                predicate1 = x => keywords.All(kw => x.Username.Contains(kw));
            }
            if (this.GroupId != null)
            {
                int groupId = (int)this.GroupId;
                UserGroup group = db.UserGroups.Find(groupId);
                predicate2 = x => x.Consumption >= group.LowerOfConsumption
                    && x.Consumption < group.CapsOfConsumption;
            }
            if (this.BelongingUserId != null)
            {
                int belongingUserId = (int)this.BelongingUserId;
                predicate3 = x => x.Relatives.Any(r => r.NodeId == belongingUserId);
            }

            int countOfAllMessages = db.Authors
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .Count();
            var tList = db.Authors
                .Where(predicate1)
                .Where(predicate2)
                .Where(predicate3)
                .OrderBy(x => x.Username)
                .Skip(startRow)
                .Take(settingOfBase.PageSizeForAdmin)
                .ToList()
                .ConvertAll(x =>
                {
                    UserGroup group = db.UserGroups.FirstOrDefault(g => g.LowerOfConsumption <= x.Consumption && g.CapsOfConsumption > x.Consumption);
                    SystemQuota systemQuota = db.SystemQuotas.FirstOrDefault(s => s.Rebate == x.PlayInfo.Rebate_Normal);
                    var t = db.SystemQuotas.ToList();
                    if (systemQuota == null)
                    {
                        systemQuota = new SystemQuota(x.PlayInfo.Rebate_Normal, new List<SystemQuotaDetail>());
                        for (double i = settingOfAuthor.LowerRebateOfHigh; i <= settingOfAuthor.CapsRebateOfHigh; i += 0.1)
                        {
                            SystemQuotaDetail sqd = new SystemQuotaDetail(i, 0);
                            systemQuota.Details.Add(sqd);
                        }
                    }
                    Author parent = db.Authors.FirstOrDefault(p => x.Relatives.Any(r => r.NodeId == p.Id) && p.Layer == x.Layer - 1);
                    return new AuthorExport(x, parent, group, systemQuota.Details);
                });

            return new PageResult<AuthorExport>(this.PageIndex, countOfAllMessages, settingOfBase.PageSizeForAdmin, tList);
        }
 /// <summary>
 /// 获取用户信息
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <param name="token">身份标识</param>
 /// <returns>返回用户信息</returns>
 public static Author GetUserInfo(IModelToDbContextOfAuthor db, string token)
 {
     AuthorLoginInfo info = infos.FirstOrDefault(x => x.Token == token);
     if (info == null)
     {
         throw new Exception("指定的身份标识所标示的用户不存在");
     }
     return info.GetUser(db);
 }
 /// <summary>
 /// 获取未处理的提现记录
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <returns>返回</returns>
 public NormalResult<int> GetCountOfUntreatedWithdrawalsRecords(IModelToDbContextOfAuthor db)
 {
     int count = db.WithdrawalsRecords.Count(x => x.Status == WithdrawalsStatus.处理中);
     return new NormalResult<int>(count);
 }
 /// <summary>
 /// 获取系统设定的高点号配额方案
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <returns>返回系统设定的高点号配额方案</returns>
 public NormalResult<List<SystemQuotaExport>> GetSystemQuota(IModelToDbContextOfAuthor db)
 {
     var tlist = db.SystemQuotas.ToList().ConvertAll(x => new SystemQuotaExport(x));
     return new NormalResult<List<SystemQuotaExport>>(tlist);
 }
 /// <summary>
 /// 获取基础的用户组信息
 /// </summary>
 /// <param name="db">数据库连接对象</param>
 /// <returns>返回基础的用户组信息</returns>
 public NormalResult<List<BasicUserGroupExport>> GetBasicUserGroups(IModelToDbContextOfAuthor db)
 {
     List<BasicUserGroupExport> tList = db.UserGroups.ToList().ConvertAll(x => new BasicUserGroupExport(x));
     return new NormalResult<List<BasicUserGroupExport>>(tList);
 }
        /// <summary>
        /// 设置并保存
        /// </summary>
        /// <param name="db">数据库连接对象</param>
        public void SetAndSave(IModelToDbContextOfAuthor db)
        {
            SettingOfAuthor settingOfAuthor = new SettingOfAuthor(db);
            settingOfAuthor.LowerRebate = this.LowerRebate;
            settingOfAuthor.CapsRebate = this.CapsRebate;
            settingOfAuthor.LowerRebateOfHigh = this.LowerRebateOfHigh;
            settingOfAuthor.CapsRebateOfHigh = this.CapsRebateOfHigh;
            settingOfAuthor.RechargeRecordTimeout = this.RechargeRecordTimeout;
            settingOfAuthor.SpreadRecordTimeout = this.SpreadRecordTimeout;
            settingOfAuthor.ForgotPasswordRecordTimeout = this.ForgotPasswordRecordTimeout;
            settingOfAuthor.DaysOfDividend = this.DaysOfDividend;
            settingOfAuthor.TimesOfWithdrawal = this.TimesOfWithdrawal;
            settingOfAuthor.MinimumWithdrawalAmount = this.MinimumWithdrawalAmount;
            settingOfAuthor.MaximumWithdrawalAmount = this.MaximumWithdrawalAmount;
            settingOfAuthor.Commission_A = this.Commission_A;
            settingOfAuthor.Commission_B = this.Commission_B;
            settingOfAuthor.LowerConsumptionForCommission = this.LowerConsumptionForCommission;
            settingOfAuthor.Dividend_A = this.Dividend_A;
            settingOfAuthor.Dividend_B = this.Dividend_B;
            settingOfAuthor.LowerConsumptionForDividend = this.LowerConsumptionForDividend;

            settingOfAuthor.ClearUser_DaysOfInactive = this.ClearUser_DaysOfInactive;
            settingOfAuthor.ClearUser_DaysOfUnSetIn = this.ClearUser_DaysOfUnSetIn;
            settingOfAuthor.ClearUser_LowerOfMoney = this.ClearUser_LowerOfMoney;
            settingOfAuthor.ClearUser_DaysOfUnMoneyChange = this.ClearUser_DaysOfUnMoneyChange;

            settingOfAuthor.Save(db);
        }