123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- 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<NameValue> L;
- private readonly RecordRepository recordRepository;
- private readonly DeviceRepository deviceRepository;
- private readonly TeamRepository teamRepository;
- private readonly EntranceRepository entranceRepository;
- private List<TeamModel> 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);
- }
- }
- }
|