private IEnumerable <IGrouping <long, IChallengeObject> > GetPersonalDictionary(GranularityModel granularity, out string titlePrefix) { switch (granularity.GranularityType) { case GranularityType.SingleDate: case GranularityType.MultiDate: { if (granularity.SelectedDate is null) { granularity.SelectedDate = YobotApiSource.DateList.LastOrDefault(); } if (granularity.StartDate is null) { granularity.StartDate = YobotApiSource.DateList.FirstOrDefault(); } if (granularity.EndDate is null) { granularity.EndDate = YobotApiSource.DateList.LastOrDefault(); } var grouped = Challenges .GroupBy(k => k.ChallengeTime.AddHours(-5).Date); List <IChallengeObject> challengeModels; if (granularity.GranularityType == GranularityType.SingleDate && granularity.SelectedDate != null) { var selectedDay = granularity.SelectedDate.Value; var singleDateData = grouped.First(k => k.Key == selectedDay.Date); challengeModels = singleDateData.ToList(); titlePrefix = selectedDay.ToString("M月d日"); } else if (granularity.GranularityType == GranularityType.MultiDate && granularity.StartDate != null && granularity.EndDate != null) { var startDate = granularity.StartDate.Value; var endDate = granularity.EndDate.Value; var multiDateData = grouped .Where(k => k.Key >= startDate && k.Key <= endDate); challengeModels = multiDateData.SelectMany(k => k).ToList(); titlePrefix = $"{startDate:M月d日} - {endDate:M月d日}"; } else { throw new ArgumentOutOfRangeException(); } var personsDic = challengeModels.GroupBy(k => k.QQId); return(personsDic); } case GranularityType.Total: break; case GranularityType.SingleRound: case GranularityType.MultiRound: { if (granularity.SelectedRound is null) { granularity.SelectedRound = YobotApiSource.RoundList.LastOrDefault(); } if (granularity.StartRound is null) { granularity.StartRound = YobotApiSource.RoundList.FirstOrDefault(); } if (granularity.EndRound is null) { granularity.EndRound = YobotApiSource.RoundList.LastOrDefault(); } var grouped = Challenges .GroupBy(k => k.Cycle); List <IChallengeObject> challengeModels; if (granularity.GranularityType == GranularityType.SingleRound && granularity.SelectedRound != null) { var selectedRound = granularity.SelectedRound.Value; var singleDateData = grouped.First(k => k.Key == selectedRound); challengeModels = singleDateData.ToList(); titlePrefix = selectedRound + "周目"; } else if (granularity.GranularityType == GranularityType.MultiRound && granularity.StartRound != null && granularity.EndRound != null) { var startRound = granularity.StartRound.Value; var endRound = granularity.EndRound.Value; var multiDateData = grouped .Where(k => k.Key >= startRound && k.Key <= endRound); challengeModels = multiDateData.SelectMany(k => k).ToList(); titlePrefix = $"{startRound}周目 - {endRound}周目"; } else { throw new ArgumentOutOfRangeException(); } var personsDic = challengeModels.GroupBy(k => k.QQId); return(personsDic); } default: throw new ArgumentOutOfRangeException(); } throw new ArgumentOutOfRangeException(); }
public async Task <CartesianChartConfigModel> PersonalDivideByChallengeTimesDayComparision( GranularityModel granularity) { var personsGrouping = GetPersonalDictionary(granularity, out var titlePrefix); var list = new List <PersonalDamageModel>(); foreach (var kvp in personsGrouping) { var qqId = kvp.Key; var byDate = kvp.GroupBy(k => k.ChallengeTime.AddHours(-5).Date); // multi date support var damageModel = new PersonalDamageModel { Name = $"{await QQService.GetQqNickNameAsync(qqId)} ({qqId})", Damages = new List <int> { 0, 0, 0, 0, 0, 0 } }; foreach (var grouping in byDate) { int i = 0; foreach (var challengeModel in grouping) { if (challengeModel.IsContinue) { if (i % 2 == 0) { i++; } damageModel.Damages[i] += challengeModel.Damage; } else { if (i % 2 != 0) { i++; } damageModel.Damages[i] += challengeModel.Damage; } i++; } } list.Add(damageModel); } list = list.OrderBy(k => k.Damages.Sum()).ToList(); var configModel = GetSharedConfigModel(titlePrefix, list); for (int i = 0; i < 6; i++) { var challengeIndex = i / 2 + 1; configModel.SeriesCollection.Add(new StackedRowSeries { Title = i % 2 == 0 ? $"第{challengeIndex}刀" : $"第{challengeIndex}刀(补偿刀)", Values = new ChartValues <int>(list.Select(k => k.Damages[i]).ToList()), DataLabels = true }); } ConfigAxises(configModel); return(configModel); }
public async Task <CartesianChartConfigModel> PersonalDivideByBossRoundComparision(GranularityModel granularity) { var personsGrouping = GetPersonalDictionary(granularity, out var titlePrefix); var personBossDic = personsGrouping.ToDictionary(k => k.Key, k => { var dic = new Dictionary <int, int>(); foreach (var challengeModel in k) { if (dic.ContainsKey(challengeModel.BossNum)) { dic[challengeModel.BossNum] += challengeModel.Damage; } else { dic.Add(challengeModel.BossNum, challengeModel.Damage); } } return(dic); }); var list = new List <PersonalDamageModel>(); foreach (var kvp in personBossDic) { var cycleModel = new PersonalDamageModel { Name = $"{await QQService.GetQqNickNameAsync(kvp.Key)} ({kvp.Key})" }; for (int i = 0; i < 5; i++) { var bossNum = cycleModel.Damages.Count + 1; var bossDamage = kvp.Value.ContainsKey(bossNum) ? kvp.Value[bossNum] : 0L; cycleModel.Damages.Add((int)bossDamage); } list.Add(cycleModel); } list = list.OrderBy(k => k.Damages.Sum()).ToList(); var configModel = GetSharedConfigModel(titlePrefix, list); for (int i = 0; i < 5; i++) { configModel.SeriesCollection.Add(new StackedRowSeries { Title = $"BOSS {i + 1}", Values = new ChartValues <int>(list.Select(k => k.Damages[i]).ToList()), DataLabels = true }); } ConfigAxises(configModel); return(configModel); }