ChartForm.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. using DevExpress.XtraCharts;
  2. using DevExpress.XtraEditors;
  3. using GCAS.Code;
  4. using GCAS.Dto;
  5. using GCAS.Localization;
  6. using GCAS.Model;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace GCAS.Reports
  14. {
  15. public partial class ChartForm : XtraForm
  16. {
  17. private List<NameValue> L;
  18. private readonly RecordRepository recordRepository;
  19. private readonly DeviceRepository deviceRepository;
  20. private readonly TeamRepository teamRepository;
  21. private readonly EntranceRepository entranceRepository;
  22. private List<TeamModel> teams;
  23. public ChartForm()
  24. {
  25. InitializeComponent();
  26. L = LocalizationHelper.GetSource(Thread.CurrentThread.CurrentUICulture);
  27. recordRepository = new RecordRepository();
  28. deviceRepository = new DeviceRepository();
  29. teamRepository = new TeamRepository();
  30. entranceRepository = new EntranceRepository();
  31. }
  32. private void ReportForm_Load(object sender, EventArgs e)
  33. {
  34. teams = teamRepository.GetList();
  35. teams.Add(new TeamModel { Id = 0, Name = L.GetString("leisure") });
  36. date_start.EditValue = DateTime.Today;
  37. date_end.EditValue = DateTime.Today.AddDays(1).AddSeconds(-1);
  38. cbe_today.Checked = true;
  39. }
  40. private async void cbe_today_CheckedChanged(object sender, EventArgs e)
  41. {
  42. if ((sender as CheckEdit).Checked)
  43. {
  44. await Day();
  45. }
  46. }
  47. private async void cbe_week_CheckedChanged(object sender, EventArgs e)
  48. {
  49. if ((sender as CheckEdit).Checked)
  50. {
  51. await Week();
  52. }
  53. }
  54. private async void cbe_month_CheckedChanged(object sender, EventArgs e)
  55. {
  56. if ((sender as CheckEdit).Checked)
  57. {
  58. await Month();
  59. }
  60. }
  61. private async void cbe_year_CheckedChanged(object sender, EventArgs e)
  62. {
  63. if ((sender as CheckEdit).Checked)
  64. {
  65. await Year();
  66. }
  67. }
  68. private async Task Day()
  69. {
  70. DateTime today = DateTime.Today;
  71. var chartSource = await recordRepository.GetChartSource(today, today.AddDays(1));
  72. var barQuery = chartSource.GroupBy(c => c.Time.Hour)
  73. .Select(c => new
  74. {
  75. Hour = c.Key,
  76. Teams = c.GroupBy(e => e.Team)
  77. .Select(s => new { Id = s.Key, Weight = s.Sum(f => f.NetWeight) / 1000f })
  78. });
  79. chartControl1.Series.Clear();
  80. foreach (var team in teams)
  81. {
  82. var seriesBar = new Series(team.Name, ViewType.StackedBar)
  83. {
  84. ArgumentScaleType = ScaleType.Qualitative,
  85. CrosshairLabelPattern = "{S}:{V:0.00}T",
  86. };
  87. for (int i = 0; i <= 23; i++)
  88. {
  89. var first = barQuery.FirstOrDefault(c => c.Hour == i);
  90. if (first != null)
  91. {
  92. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("hour"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0));
  93. }
  94. else
  95. {
  96. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("hour"), 0));
  97. }
  98. }
  99. chartControl1.Series.Add(seriesBar);
  100. }
  101. var seriesPie = chartControl2.Series[0];
  102. seriesPie.Points.Clear();
  103. var pieQuery = (from t in chartSource
  104. group t by t.Team into g
  105. orderby g.Key ascending
  106. select new SeriesPoint
  107. {
  108. Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name,
  109. Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) }
  110. }).ToArray();
  111. seriesPie.Points.AddRange(pieQuery);
  112. }
  113. private async Task Week()
  114. {
  115. DateTime today = DateTime.Today;
  116. var startDate = Tools.GetTimeStartByType("Week", today);
  117. var endDate = startDate.Value.AddDays(7).AddSeconds(-1);
  118. var chartSource = await recordRepository.GetChartSource(startDate, endDate);
  119. 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 }) });
  120. chartControl1.Series.Clear();
  121. foreach (var team in teams)
  122. {
  123. var seriesBar = new Series(team.Name, ViewType.StackedBar)
  124. {
  125. ArgumentScaleType = ScaleType.Qualitative,
  126. CrosshairLabelPattern = "{S}:{V:0.00}T"
  127. };
  128. for (int i = 1; i <= 6; i++)
  129. {
  130. var week = Tools.GetWeek(i);
  131. var first = barQuery.FirstOrDefault(c => (int)c.Week == i);
  132. if (first != null)
  133. {
  134. seriesBar.Points.Add(new SeriesPoint(week, first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0));
  135. }
  136. else
  137. {
  138. seriesBar.Points.Add(new SeriesPoint(week, 0));
  139. }
  140. }
  141. seriesBar.Points.Add(new SeriesPoint(L.GetString("sunday"), barQuery.FirstOrDefault(c => c.Week == DayOfWeek.Sunday)?.Teams.FirstOrDefault(e => e.Id == team.Id).Weight ?? 0));
  142. chartControl1.Series.Add(seriesBar);
  143. }
  144. var seriesPie = chartControl2.Series[0];
  145. seriesPie.Points.Clear();
  146. var pieQuery = (from t in chartSource
  147. group t by t.Team into g
  148. orderby g.Key ascending
  149. select new SeriesPoint
  150. {
  151. Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name,
  152. Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) }
  153. }).ToArray();
  154. seriesPie.Points.AddRange(pieQuery);
  155. }
  156. private async Task Month()
  157. {
  158. DateTime today = DateTime.Today;
  159. var startDate = Tools.GetTimeStartByType("Month", today);
  160. var endDate = Tools.GetTimeEndByType("Month", today).Value.AddDays(1).AddSeconds(-1);
  161. var chartSource = await recordRepository.GetChartSource(startDate, endDate);
  162. 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 }) });
  163. chartControl1.Series.Clear();
  164. foreach (var team in teams)
  165. {
  166. var seriesBar = new Series(team.Name, ViewType.StackedBar)
  167. {
  168. ArgumentScaleType = ScaleType.Qualitative,
  169. CrosshairLabelPattern = "{S}:{V:0.00}T",
  170. };
  171. int countDay = Tools.GetTimeEndByType("Month", today).Value.Day;
  172. for (int i = 0; i <= countDay; i++)
  173. {
  174. var first = barQuery.FirstOrDefault(c => c.Day == i);
  175. if (first != null)
  176. {
  177. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("day"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0));
  178. }
  179. else
  180. {
  181. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("day"), 0));
  182. }
  183. }
  184. chartControl1.Series.Add(seriesBar);
  185. }
  186. var seriesPie = chartControl2.Series[0];
  187. seriesPie.Points.Clear();
  188. var pieQuery = (from t in chartSource
  189. group t by t.Team into g
  190. orderby g.Key ascending
  191. select new SeriesPoint
  192. {
  193. Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name,
  194. Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) }
  195. }).ToArray();
  196. seriesPie.Points.AddRange(pieQuery);
  197. }
  198. private async Task Year()
  199. {
  200. DateTime today = DateTime.Today;
  201. var startDate = Tools.GetTimeStartByType("Year", DateTime.Now);
  202. var endDate = Tools.GetTimeEndByType("Year", DateTime.Now).Value.AddDays(1).AddSeconds(-1);
  203. var chartSource = await recordRepository.GetChartSource(startDate, endDate);
  204. 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 }) });
  205. chartControl1.Series.Clear();
  206. foreach (var team in teams)
  207. {
  208. var seriesBar = new Series(team.Name, ViewType.StackedBar)
  209. {
  210. ArgumentScaleType = ScaleType.Qualitative,
  211. CrosshairLabelPattern = "{S}:{V:0.00}T",
  212. };
  213. for (int i = 0; i <= 12; i++)
  214. {
  215. var first = barQuery.FirstOrDefault(c => c.Month == i);
  216. if (first != null)
  217. {
  218. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("month"), first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0));
  219. }
  220. else
  221. {
  222. seriesBar.Points.Add(new SeriesPoint(i + L.GetString("month"), 0));
  223. }
  224. }
  225. chartControl1.Series.Add(seriesBar);
  226. }
  227. var seriesPie = chartControl2.Series[0];
  228. seriesPie.Points.Clear();
  229. var pieQuery = (from t in chartSource
  230. group t by t.Team into g
  231. orderby g.Key ascending
  232. select new SeriesPoint
  233. {
  234. Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name,
  235. Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) }
  236. }).ToArray();
  237. seriesPie.Points.AddRange(pieQuery);
  238. }
  239. private async void btn_search_Click(object sender, EventArgs e)
  240. {
  241. if (date_start.EditValue == null || date_end.EditValue == null)
  242. {
  243. XtraMessageBox.Show(L.GetString("startTimeOrEndTimeNotNull"), L.GetString("error"), MessageBoxButtons.OK, MessageBoxIcon.Error);
  244. return;
  245. }
  246. var startTime = (DateTime)date_start.EditValue;
  247. var endTime = ((DateTime)date_end.EditValue).AddDays(1).AddSeconds(-1);
  248. bool isMoreYear = startTime.Year != endTime.Year;
  249. var chartSource = await recordRepository.GetChartSource(startTime, endTime);
  250. var barQuery = chartSource
  251. .GroupBy(c => isMoreYear ? c.Time.Year + "/" + c.Time.Month + "/" + c.Time.Day : c.Time.Month + "/" + c.Time.Day)
  252. .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 }) });
  253. chartControl1.Series.Clear();
  254. foreach (var team in teams)
  255. {
  256. var seriesBar = new Series(team.Name, ViewType.StackedBar)
  257. {
  258. ArgumentScaleType = ScaleType.Qualitative,
  259. CrosshairLabelPattern = "{S}:{V:0.00}T",
  260. };
  261. var format = string.Empty;
  262. while (startTime <= endTime)
  263. {
  264. format = isMoreYear ? startTime.Year + "/" + startTime.Month + "/" + startTime.Day : startTime.Month + "/" + startTime.Day;
  265. var first = barQuery.FirstOrDefault(c => c.Day == format);
  266. if (first != null)
  267. {
  268. seriesBar.Points.Add(new SeriesPoint(format, first.Teams.FirstOrDefault(c => c.Id == team.Id)?.Weight ?? 0));
  269. }
  270. else
  271. {
  272. seriesBar.Points.Add(new SeriesPoint(format, 0));
  273. }
  274. startTime = startTime.AddDays(1);
  275. }
  276. chartControl1.Series.Add(seriesBar);
  277. }
  278. var seriesPie = chartControl2.Series[0];
  279. seriesPie.Points.Clear();
  280. var pieQuery = (from t in chartSource
  281. group t by t.Team into g
  282. orderby g.Key ascending
  283. select new SeriesPoint
  284. {
  285. Argument = teams.FirstOrDefault(c => c.Id == g.Key)?.Name,
  286. Values = new double[] { g.Sum(c => c.NetWeight) / (double)chartSource.Sum(c => c.NetWeight) }
  287. }).ToArray();
  288. seriesPie.Points.AddRange(pieQuery);
  289. }
  290. }
  291. }