Exemple #1
0
        /// <summary>
        /// 用户.今日已结/未结明细
        /// 今日已结在封盘时job生成, 包括奖金+退水
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public PagerResult <Bet> GetUserBetReport(UserReportSearchModel model)
        {
            using (var db = new RacingDbContext())
            {
                var query = db.Bet.Where(b => b.UserId == model.UserId &&
                                         b.IsSettlementDone == model.IsSettlementDone &&
                                         DbFunctions.DiffDays(b.PK.EndTime, DateTime.Now) == 0);//今日


                if (model.IsSettlementDone)
                {
                    //已结
                    query = query.Where(b => DbFunctions.DiffSeconds(b.PK.EndTime, DateTime.Now) > 0);
                }
                else
                {
                    //未结
                    query = query.Where(b => DbFunctions.DiffSeconds(b.PK.EndTime, DateTime.Now) < 0);
                }

                var result = query
                             .OrderByDescending(b => b.BetId)
                             .Pager(model.PageIndex, model.PageSize);

                // 奖金
                if (model.IsSettlementDone)
                {
                    //已结
                    var betIds  = result.Items.Select(b => b.BetId).ToList();
                    var pkBonus = db.PKBonus.Where(b => betIds.Contains(b.BetId)).ToList();
                    foreach (var bet in result.Items)
                    {
                        var bonus  = pkBonus.Where(b => b.BetId == bet.BetId).ToList();
                        var amount = bonus.Count() > 0 ? bonus.Sum(b => b.Amount) : 0;
                        bet.BonusAmount = amount - bet.Amount;  // 退水后奖金 = 中奖金额+退水-本金, 奖金+退水 job生成
                    }
                }
                else
                {
                    //未结
                    var pkIds       = result.Items.Select(b => b.PKId).ToList();
                    var pkRates     = db.PKRate.Where(r => pkIds.Contains(r.PKId)).ToList();
                    var userRebates = db.UserRebate.Include(nameof(UserRebate.User)).Where(u => u.UserId == model.UserId).ToList();
                    foreach (var bet in result.Items)
                    {
                        var pkRate     = pkRates.Where(r => r.PKId == bet.PKId && r.Num == bet.Num && r.Rank == bet.Rank).First();
                        var bonus      = bet.Amount * pkRate.Rate;
                        var userRebate = userRebates.Where(u => u.UserId == bet.UserId && u.RebateNo == bet.Num).First();
                        var rebate     = bet.Amount * UserRebateService.GetDefaultRebate(userRebate, userRebate.User.DefaultRebateType);
                        bet.BonusAmount = bonus + rebate - bet.Amount;  // 退水后奖金 = 中奖金额+退水-本金, 奖金+退水 job生成
                    }
                }

                return(result);
            }
        }
Exemple #2
0
        /// <summary>
        /// 添加/修改 User
        /// </summary>
        /// <param name="roleId">角色</param>
        /// <param name="user">用户信息</param>
        public ResponseResult SaveUser(int roleId, User user, RebateType defaultRebateType, decimal?rechargeAmount)
        {
            using (var db = new RacingDbContext())
            {
                var response = new ResponseResult();

                UserOperation userOperation = user.UserId == 0 ? UserOperation.Add : UserOperation.Edit;

                if (userOperation == UserOperation.Add)
                {
                    var existUserName = db.User.Where(u => u.UserName.ToLower() == user.UserName.ToLower()).Any();

                    if (existUserName)
                    {
                        response.Success = false;
                        response.Message = MessageConst.USER_EXIST_USERNAME;
                        return(response);
                    }

                    user.CreateDate = DateTime.Now;
                    user.Enabled    = true;
                    user.IsLocked   = user.IsLocked;
                    user.Password   = CryptoUtils.Encrypt(user.Password);
                    user.FailedPasswordAttemptWindowStart = DateTime.Parse("1900-01-01");
                    user.UserRoles = new List <UserRole> {
                        new UserRole {
                            RoleId = roleId
                        }
                    };
                    user.UserRebates = new UserRebateService().GetNewUserRebates(user.ParentUserId.Value);

                    user.DefaultRebateType = defaultRebateType;// 默认退水

                    // UserExtension
                    user.UserExtension = new UserExtension
                    {
                        Amount = rechargeAmount ?? 0
                    };

                    db.User.Add(user);
                }
                else
                {
                    var dbUser = db.User
                                 .Include(nameof(User.UserExtension))
                                 .Include(nameof(User.UserRebates))
                                 .Where(u => u.UserId == user.UserId).FirstOrDefault();
                    if (dbUser != null)
                    {
                        dbUser.ParentUserId          = user.ParentUserId;
                        dbUser.UserName              = user.UserName;
                        dbUser.Password              = !string.IsNullOrEmpty(user.Password) ? CryptoUtils.Encrypt(user.Password) : dbUser.Password;
                        dbUser.IsLocked              = user.IsLocked;
                        dbUser.UserExtension.Amount += rechargeAmount ?? 0;
                        dbUser.DefaultRebateType     = defaultRebateType;// 默认退水

                        if (dbUser.UserRebates == null || dbUser.UserRebates.Count() == 0)
                        {
                            var userRebates = new UserRebateService().GetNewUserRebates(user.ParentUserId.Value);
                            userRebates.ForEach(r => r.UserId = dbUser.UserId);
                            // 退水 = 上级退水
                            db.UserRebate.AddRange(userRebates);
                        }
                    }
                }

                db.SaveChanges();

                // 更新父User.UserExtension的AgentCount/MemberCount
                if (userOperation == UserOperation.Add)
                {
                    UpdateUserExtension(user, roleId);
                    UpdateParentUserExtension(user, roleId, UserOperation.Add);
                }

                response.Data = user;

                return(response);
            }
        }
Exemple #3
0
        /// <summary>
        /// 用户.今日已结/未结明细 统计
        /// 今日已结在封盘时job生成, 包括奖金+退水
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public UserBonusReportStatistics GetUserBetItemReportStatistics(UserReportSearchModel model)
        {
            using (var db = new RacingDbContext())
            {
                var statistics = new UserBonusReportStatistics();

                var queryBet = db.BetItem.Include(nameof(BetItem.Bet)).Where(b => b.Bet.UserId == model.UserId &&
                                                                             b.Bet.IsSettlementDone == model.IsSettlementDone &&         //今日已结/未结明细
                                                                             DbFunctions.DiffDays(b.Bet.PK.EndTime, DateTime.Now) == 0); //今日


                #region Bonus 今日已结在封盘时job生成, 包括奖金+退水
                //var queryBonus = db.PKBonus
                //    .Where(b => b.UserId == model.UserId && b.IsSettlementDone == model.IsSettlementDone && DbFunctions.DiffDays(b.PK.EndTime, DateTime.Now) == 0);

                //if (model.IsSettlementDone)
                //{
                //    //已结
                //    queryBonus = queryBonus.Where(b => DbFunctions.DiffSeconds(b.PK.EndTime, DateTime.Now) > 0);
                //}
                //else
                //{
                //    //未结
                //    queryBonus = queryBonus.Where(b => DbFunctions.DiffSeconds(b.PK.EndTime, DateTime.Now) < 0);
                //}
                #endregion

                // 注单数量
                statistics.BetCount = queryBet.Count();

                // 下注金额
                statistics.BetAmount = statistics.BetCount > 0 ? queryBet.Sum(b => b.Amount) : 0;

                // 中奖金额+退水-本金, 奖金+退水 job生成
                if (model.IsSettlementDone)
                {
                    //今日已结在封盘时job生成, 包括奖金+退水
                    var queryBonus = db.PKBonus
                                     .Where(b => b.UserId == model.UserId && b.IsSettlementDone == model.IsSettlementDone && DbFunctions.DiffDays(b.PK.EndTime, DateTime.Now) == 0);

                    //已结
                    queryBonus = queryBonus.Where(b => DbFunctions.DiffSeconds(b.PK.EndTime, DateTime.Now) > 0);

                    statistics.BonusAmount = queryBonus.Any() ? queryBonus.Sum(b => b.Amount) - statistics.BetAmount : 0 - statistics.BetAmount;
                }
                else
                {
                    //未结(可赢金额),按一定中奖计算
                    var bets        = queryBet.ToList();
                    var pkIds       = bets.Select(b => b.Bet.PKId).ToList();
                    var pkRates     = db.PKRate.Where(r => pkIds.Contains(r.PKId)).ToList();
                    var userRebates = db.UserRebate.Include(nameof(UserRebate.User)).Where(u => u.UserId == model.UserId).ToList();
                    foreach (var betItem in bets)
                    {
                        var pkRate     = pkRates.Where(r => r.PKId == betItem.Bet.PKId && r.Num == betItem.Num && r.Rank == betItem.Rank).First();
                        var bonus      = betItem.Amount * pkRate.Rate;
                        var userRebate = userRebates.Where(u => u.UserId == betItem.Bet.UserId && u.RebateNo == betItem.Num).First();
                        var rebate     = betItem.Amount * UserRebateService.GetDefaultRebate(userRebate, userRebate.User.DefaultRebateType);
                        betItem.BonusAmount = bonus + rebate - betItem.Amount;  // 退水后奖金 = 中奖金额+退水-本金, 奖金+退水 job生成
                    }

                    statistics.BonusAmount = bets.Any() ? bets.Sum(b => b.BonusAmount) : 0;
                }


                return(statistics);
            }
        }
        /// <summary>
        /// 生成退水
        /// </summary>
        /// <param name="pk"></param>
        public void GenerateRebate(PK pk)
        {
            var userExtensionService = new UserExtensionService();

            using (var db = new RacingDbContext())
            {
                // 按下注用户生成
                var userIds = db.Bet.Where(b => b.PKId == pk.PKId).Select(b => b.UserId).Distinct().ToList();
                foreach (var userId in userIds)
                {
                    var user        = db.User.Where(u => u.UserId == userId).First();
                    var userRebates = db.UserRebate.Where(r => r.UserId == userId).ToList();

                    if (userRebates.Count > 0)
                    {
                        var bonuses             = new List <PKBonus>(); // 会员退水奖金
                        var agentBonuses        = new List <PKBonus>(); // 代理退水奖金
                        var generalAgentBonuses = new List <PKBonus>(); // 总代理退水奖金

                        var dbBets = db.Bet.Where(bi => bi.PKId == pk.PKId && bi.UserId == userId).ToList();
                        foreach (var dbBet in dbBets)
                        {
                            #region 会员退水
                            var userRebate = userRebates.Where(e => e.RebateNo == dbBet.Num).FirstOrDefault();
                            var rebate     = UserRebateService.GetDefaultRebate(userRebate, user.DefaultRebateType);
                            bonuses.Add(new PKBonus
                            {
                                BetId            = dbBet.BetId,
                                PKId             = pk.PKId,
                                UserId           = dbBet.UserId,
                                Rank             = dbBet.Rank,
                                Num              = dbBet.Num,
                                BonusType        = Data.Enums.BonusType.Rebate,
                                Amount           = Math.Round(dbBet.Amount * rebate, 4),
                                IsSettlementDone = true // 直接设置成已结算
                            });

                            #endregion

                            if (user.ParentUserId.HasValue)
                            {
                                #region 代理退水
                                var agentUser       = db.User.Where(u => u.UserId == user.ParentUserId).First();
                                var agentUserRebate = db.UserRebate
                                                      .Where(r => r.UserId == user.ParentUserId && r.RebateNo == dbBet.Num).FirstOrDefault();
                                var agentRebate = UserRebateService.GetDefaultRebate(agentUserRebate, user.DefaultRebateType);  // 使用下注用户的默认盘
                                if (agentRebate - rebate > 0)
                                {
                                    agentBonuses.Add(new PKBonus
                                    {
                                        BetId            = dbBet.BetId,
                                        PKId             = pk.PKId,
                                        UserId           = userRebate.User.ParentUserId.Value,
                                        ChildUserId      = user.UserId,
                                        Rank             = dbBet.Rank,
                                        Num              = dbBet.Num,
                                        BonusType        = Data.Enums.BonusType.Rebate,
                                        Amount           = Math.Round(dbBet.Amount * (agentRebate - rebate), 4), //代理退水 - 给会员的退水
                                        IsSettlementDone = true                                                  // 直接设置成已结算
                                    });
                                }
                                #endregion


                                if (agentUser.ParentUserId.HasValue)
                                {
                                    #region 总代理退水

                                    var generalAgentUserRebate = db.UserRebate
                                                                 .Where(r => r.UserId == agentUser.ParentUserId && r.RebateNo == dbBet.Num).FirstOrDefault();
                                    var generalAgentRebate = UserRebateService.GetDefaultRebate(generalAgentUserRebate, user.DefaultRebateType); // 使用下注用户的默认盘
                                    if (generalAgentRebate - agentRebate > 0)
                                    {
                                        generalAgentBonuses.Add(new PKBonus
                                        {
                                            BetId            = dbBet.BetId,
                                            PKId             = pk.PKId,
                                            UserId           = agentUser.ParentUserId.Value,
                                            ChildUserId      = agentUser.UserId,
                                            Rank             = dbBet.Rank,
                                            Num              = dbBet.Num,
                                            BonusType        = Data.Enums.BonusType.Rebate,
                                            Amount           = Math.Round(dbBet.Amount * (generalAgentRebate - agentRebate), 4), //总代理退水 - 给代理的退水
                                            IsSettlementDone = true                                                              // 直接设置成已结算
                                        });
                                    }

                                    #endregion
                                }
                            }
                        }
                        if (bonuses.Count > 0)
                        {
                            // 保存会员退水奖金
                            db.PKBonus.AddRange(bonuses);
                            db.SaveChanges();

                            // 奖金加到余额
                            foreach (var bonus in bonuses)
                            {
                                userExtensionService.AddAmount(bonus.UserId, bonus.Amount);
                            }
                        }
                        if (agentBonuses.Count > 0)
                        {
                            // 保存会员退水奖金
                            db.PKBonus.AddRange(agentBonuses);
                            db.SaveChanges();

                            // 奖金加到余额
                            foreach (var bonus in agentBonuses)
                            {
                                userExtensionService.AddAmount(bonus.UserId, bonus.Amount);
                            }
                        }
                        if (generalAgentBonuses.Count > 0)
                        {
                            // 保存会员退水奖金
                            db.PKBonus.AddRange(generalAgentBonuses);
                            db.SaveChanges();

                            // 奖金加到余额
                            foreach (var bonus in generalAgentBonuses)
                            {
                                userExtensionService.AddAmount(bonus.UserId, bonus.Amount);
                            }
                        }
                    }
                }
            }
        }