/// <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); } }
/// <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); } } } } } }