using DevExpress.XtraCharts; using DevExpress.XtraEditors; using GCAS.Code; using GCAS.Dto; using GCAS.Localization; using GCAS.Model; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace GCAS.Reports { public partial class ChartForm : XtraForm { private List L; private readonly RecordRepository recordRepository; private readonly DeviceRepository deviceRepository; private readonly TeamRepository teamRepository; private readonly EntranceRepository entranceRepository; private List teams; public ChartForm() { InitializeComponent(); L = LocalizationHelper.GetSource(Thread.CurrentThread.CurrentUICulture); recordRepository = new RecordRepository(); deviceRepository = new DeviceRepository(); teamRepository = new TeamRepository(); entranceRepository = new EntranceRepository(); } private void ReportForm_Load(object sender, EventArgs e) { teams = teamRepository.GetList(); teams.Add(new TeamModel { Id = 0, Name = L.GetString("leisure") }); date_start.EditValue = DateTime.Today; date_end.EditValue = DateTime.Today.AddDays(1).AddSeconds(-1); cbe_today.Checked = true; } private async void cbe_today_CheckedChanged(object sender, EventArgs e) { if ((sender as CheckEdit).Checked) { await Day(); } } private async void cbe_week_CheckedChanged(object sender, EventArgs e) { if ((sender as CheckEdit).Checked) { await Week(); } } private async void cbe_month_CheckedChanged(object sender, EventArgs e) { if ((sender as CheckEdit).Checked) { await Month(); } } private async void cbe_year_CheckedChanged(object sender, EventArgs e) { if ((sender as CheckEdit).Checked) { await Year(); } } private async Task Day() { DateTime today = DateTime.Today; var chartSource = await recordRepository.GetChartSource(today, today.AddDays(1)); var barQuery = chartSource.GroupBy(c => c.Time.Hour) .Select(c => new { Hour = c.Key, Teams = c.GroupBy(e => e.Team) .Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f }) }); chartControl1.Series.Clear(); foreach (var team in teams) { var seriesBar = new Series(team.Name, ViewType.StackedBar) { ArgumentScaleType = ScaleType.Qualitative, CrosshairLabelPattern = "{S}:{V:0.00}T", }; for (int i = 0; i <= 23; i++) { var first = barQuery.FirstOrDefault(c => c.Hour == i); if (first != null) { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("hour"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0)); } else { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("hour"), 0)); } } chartControl1.Series.Add(seriesBar); } var seriesPie = chartControl2.Series[0]; seriesPie.Points.Clear(); var pieQuery = (from t in chartSource group t by t.Team into g orderby g.Key ascending select new SeriesPoint { Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name, Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) } }).ToArray(); seriesPie.Points.AddRange(pieQuery); } private async Task Week() { DateTime today = DateTime.Today; var startDate = Tools.GetTimeStartByType("Week", today); var endDate = startDate.Value.AddDays(7).AddSeconds(-1); var chartSource = await recordRepository.GetChartSource(startDate, endDate); var barQuery = chartSource.GroupBy(c => c.Time.DayOfWeek).Select(c => new { Week = c.Key, Teams = c.GroupBy(e => e.Team).Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f }) }); chartControl1.Series.Clear(); foreach (var team in teams) { var seriesBar = new Series(team.Name, ViewType.StackedBar) { ArgumentScaleType = ScaleType.Qualitative, CrosshairLabelPattern = "{S}:{V:0.00}T" }; for (int i = 1; i <= 6; i++) { var week = Tools.GetWeek(i); var first = barQuery.FirstOrDefault(c => (int)c.Week == i); if (first != null) { seriesBar.Points.Add(new SeriesPoint(week, first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0)); } else { seriesBar.Points.Add(new SeriesPoint(week, 0)); } } seriesBar.Points.Add(new SeriesPoint(L.GetString("sunday"), barQuery.FirstOrDefault(c => c.Week == DayOfWeek.Sunday)?.Teams.FirstOrDefault(e => e.Id == team.Id).Weight ?? 0)); chartControl1.Series.Add(seriesBar); } var seriesPie = chartControl2.Series[0]; seriesPie.Points.Clear(); var pieQuery = (from t in chartSource group t by t.Team into g orderby g.Key ascending select new SeriesPoint { Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name, Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) } }).ToArray(); seriesPie.Points.AddRange(pieQuery); } private async Task Month() { DateTime today = DateTime.Today; var startDate = Tools.GetTimeStartByType("Month", today); var endDate = Tools.GetTimeEndByType("Month", today).Value.AddDays(1).AddSeconds(-1); var chartSource = await recordRepository.GetChartSource(startDate, endDate); var barQuery = chartSource.GroupBy(c => c.Time.Day).Select(c => new { Day = c.Key, Teams = c.GroupBy(e => e.Team).Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f }) }); chartControl1.Series.Clear(); foreach (var team in teams) { var seriesBar = new Series(team.Name, ViewType.StackedBar) { ArgumentScaleType = ScaleType.Qualitative, CrosshairLabelPattern = "{S}:{V:0.00}T", }; int countDay = Tools.GetTimeEndByType("Month", today).Value.Day; for (int i = 0; i <= countDay; i++) { var first = barQuery.FirstOrDefault(c => c.Day == i); if (first != null) { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("day"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0)); } else { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("day"), 0)); } } chartControl1.Series.Add(seriesBar); } var seriesPie = chartControl2.Series[0]; seriesPie.Points.Clear(); var pieQuery = (from t in chartSource group t by t.Team into g orderby g.Key ascending select new SeriesPoint { Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name, Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) } }).ToArray(); seriesPie.Points.AddRange(pieQuery); } private async Task Year() { DateTime today = DateTime.Today; var startDate = Tools.GetTimeStartByType("Year", DateTime.Now); var endDate = Tools.GetTimeEndByType("Year", DateTime.Now).Value.AddDays(1).AddSeconds(-1); var chartSource = await recordRepository.GetChartSource(startDate, endDate); var barQuery = chartSource.GroupBy(c => c.Time.Month).Select(c => new { Month = c.Key, Teams = c.GroupBy(e => e.Team).Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f }) }); chartControl1.Series.Clear(); foreach (var team in teams) { var seriesBar = new Series(team.Name, ViewType.StackedBar) { ArgumentScaleType = ScaleType.Qualitative, CrosshairLabelPattern = "{S}:{V:0.00}T", }; for (int i = 0; i <= 12; i++) { var first = barQuery.FirstOrDefault(c => c.Month == i); if (first != null) { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("month"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0)); } else { seriesBar.Points.Add(new SeriesPoint(i + L.GetString("month"), 0)); } } chartControl1.Series.Add(seriesBar); } var seriesPie = chartControl2.Series[0]; seriesPie.Points.Clear(); var pieQuery = (from t in chartSource group t by t.Team into g orderby g.Key ascending select new SeriesPoint { Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name, Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) } }).ToArray(); seriesPie.Points.AddRange(pieQuery); } private async void btn_search_Click(object sender, EventArgs e) { if (date_start.EditValue == null || date_end.EditValue == null) { XtraMessageBox.Show(L.GetString("startTimeOrEndTimeNotNull"), L.GetString("error"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var startTime = (DateTime)date_start.EditValue; var endTime = ((DateTime)date_end.EditValue).AddDays(1).AddSeconds(-1); bool isMoreYear = startTime.Year != endTime.Year; var chartSource = await recordRepository.GetChartSource(startTime, endTime); var barQuery = chartSource .GroupBy(c => isMoreYear ? c.Time.Year + "/" + c.Time.Month + "/" + c.Time.Day : c.Time.Month + "/" + c.Time.Day) .Select(c => new { Day = c.Key, Teams = c.GroupBy(f => f.Team).Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f }) }); chartControl1.Series.Clear(); foreach (var team in teams) { var seriesBar = new Series(team.Name, ViewType.StackedBar) { ArgumentScaleType = ScaleType.Qualitative, CrosshairLabelPattern = "{S}:{V:0.00}T", }; var format = string.Empty; while (startTime <= endTime) { format = isMoreYear ? startTime.Year + "/" + startTime.Month + "/" + startTime.Day : startTime.Month + "/" + startTime.Day; var first = barQuery.FirstOrDefault(c => c.Day == format); if (first != null) { seriesBar.Points.Add(new SeriesPoint(format, first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0)); } else { seriesBar.Points.Add(new SeriesPoint(format, 0)); } startTime = startTime.AddDays(1); } chartControl1.Series.Add(seriesBar); } var seriesPie = chartControl2.Series[0]; seriesPie.Points.Clear(); var pieQuery = (from t in chartSource group t by t.Team into g orderby g.Key ascending select new SeriesPoint { Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name, Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) } }).ToArray(); seriesPie.Points.AddRange(pieQuery); } } }