ReportForm.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using System;
  2. using System.Data;
  3. using System.IO;
  4. using System.Windows.Forms;
  5. using System.Windows.Forms.DataVisualization.Charting;
  6. using OfficeOpenXml;
  7. namespace WindowsFormsApp4
  8. {
  9. public partial class ReportForm : Form
  10. {
  11. private DataTable currentDataTable;
  12. private string currentReportType = "";
  13. public ReportForm()
  14. {
  15. InitializeComponent();
  16. AttachEventHandlers();
  17. ConfigureChart();
  18. }
  19. private void AttachEventHandlers()
  20. {
  21. btnStatistics.Click += BtnStatistics_Click;
  22. btnPerformance.Click += BtnPerformance_Click;
  23. btnExportExcel.Click += BtnExportExcel_Click;
  24. btnChart.Click += BtnChart_Click;
  25. btnBack.Click += BtnBack_Click;
  26. }
  27. private void ConfigureChart()
  28. {
  29. chartReport.BackColor = System.Drawing.Color.FromArgb(50, 56, 67);
  30. chartReport.ChartAreas[0].BackColor = System.Drawing.Color.FromArgb(50, 56, 67);
  31. chartReport.ChartAreas[0].AxisX.LabelStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  32. chartReport.ChartAreas[0].AxisY.LabelStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  33. chartReport.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.FromArgb(198, 141, 255);
  34. chartReport.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.FromArgb(198, 141, 255);
  35. chartReport.Legends[0].ForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  36. }
  37. private void ConfigureGrid()
  38. {
  39. if (dgvReport.Columns.Count == 0) return;
  40. dgvReport.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(50, 56, 67);
  41. dgvReport.DefaultCellStyle.ForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  42. dgvReport.DefaultCellStyle.SelectionBackColor = System.Drawing.Color.FromArgb(198, 141, 255);
  43. dgvReport.DefaultCellStyle.SelectionForeColor = System.Drawing.Color.FromArgb(50, 56, 67);
  44. dgvReport.ColumnHeadersDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(198, 141, 255);
  45. dgvReport.ColumnHeadersDefaultCellStyle.ForeColor = System.Drawing.Color.FromArgb(50, 56, 67);
  46. dgvReport.EnableHeadersVisualStyles = false;
  47. dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
  48. }
  49. private void BtnStatistics_Click(object sender, EventArgs e)
  50. {
  51. try
  52. {
  53. currentDataTable = DatabaseHelper.GetManagerStatistics();
  54. dgvReport.DataSource = currentDataTable;
  55. ConfigureGrid();
  56. currentReportType = "statistics";
  57. tabControl1.SelectedTab = tabPageTable;
  58. MessageBox.Show($"Загружено {currentDataTable.Rows.Count} записей", "Информация",
  59. MessageBoxButtons.OK, MessageBoxIcon.Information);
  60. }
  61. catch (Exception ex)
  62. {
  63. MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка",
  64. MessageBoxButtons.OK, MessageBoxIcon.Error);
  65. }
  66. }
  67. private void BtnPerformance_Click(object sender, EventArgs e)
  68. {
  69. try
  70. {
  71. DateTime startDate = dtpStartDate.Value;
  72. DateTime endDate = dtpEndDate.Value;
  73. if (startDate > endDate)
  74. {
  75. MessageBox.Show("Начальная дата не может быть позже конечной",
  76. "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  77. return;
  78. }
  79. currentDataTable = DatabaseHelper.GetManagerPerformance(startDate, endDate);
  80. dgvReport.DataSource = currentDataTable;
  81. ConfigureGrid();
  82. currentReportType = "performance";
  83. tabControl1.SelectedTab = tabPageTable;
  84. MessageBox.Show($"Отчёт за период {startDate:dd.MM.yyyy} - {endDate:dd.MM.yyyy}\nЗагружено {currentDataTable.Rows.Count} записей",
  85. "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
  86. }
  87. catch (Exception ex)
  88. {
  89. MessageBox.Show($"Ошибка: {ex.Message}", "Ошибка",
  90. MessageBoxButtons.OK, MessageBoxIcon.Error);
  91. }
  92. }
  93. private void BtnChart_Click(object sender, EventArgs e)
  94. {
  95. if (currentDataTable == null || currentDataTable.Rows.Count == 0)
  96. {
  97. MessageBox.Show("Сначала загрузите данные (Статистика или Эффективность)",
  98. "Нет данных", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  99. return;
  100. }
  101. DrawChart();
  102. tabControl1.SelectedTab = tabPageChart;
  103. }
  104. private void DrawChart()
  105. {
  106. chartReport.Series.Clear();
  107. Series series = new Series();
  108. series.ChartType = SeriesChartType.Column;
  109. series.Color = System.Drawing.Color.FromArgb(198, 141, 255);
  110. series.BorderWidth = 2;
  111. series.ShadowOffset = 2;
  112. if (currentReportType == "statistics")
  113. {
  114. series.Name = "Выполненные заявки";
  115. foreach (DataRow row in currentDataTable.Rows)
  116. {
  117. string managerName = $"{row["last_name"]} {row["first_name"]}";
  118. int completed = Convert.ToInt32(row["completed_requests"]);
  119. series.Points.AddXY(managerName, completed);
  120. }
  121. chartReport.Titles.Clear();
  122. chartReport.Titles.Add("Статистика выполнения заявок по менеджерам");
  123. }
  124. else if (currentReportType == "performance")
  125. {
  126. series.Name = "Выполнено заявок";
  127. foreach (DataRow row in currentDataTable.Rows)
  128. {
  129. string managerName = $"{row["last_name"]} {row["first_name"]}";
  130. int completed = Convert.ToInt32(row["completed_count"]);
  131. series.Points.AddXY(managerName, completed);
  132. }
  133. chartReport.Titles.Clear();
  134. chartReport.Titles.Add($"Эффективность менеджеров за период");
  135. }
  136. chartReport.Series.Add(series);
  137. // Настройка внешнего вида графика
  138. chartReport.ChartAreas[0].AxisX.LabelStyle.Angle = -45;
  139. chartReport.ChartAreas[0].AxisX.Interval = 1;
  140. chartReport.ChartAreas[0].AxisX.Title = "Менеджеры";
  141. chartReport.ChartAreas[0].AxisY.Title = "Количество заявок";
  142. chartReport.ChartAreas[0].AxisX.TitleForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  143. chartReport.ChartAreas[0].AxisY.TitleForeColor = System.Drawing.Color.FromArgb(203, 232, 87);
  144. }
  145. private void BtnExportExcel_Click(object sender, EventArgs e)
  146. {
  147. if (currentDataTable == null || currentDataTable.Rows.Count == 0)
  148. {
  149. MessageBox.Show("Нет данных для экспорта", "Ошибка",
  150. MessageBoxButtons.OK, MessageBoxIcon.Warning);
  151. return;
  152. }
  153. try
  154. {
  155. SaveFileDialog saveDialog = new SaveFileDialog();
  156. saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx";
  157. saveDialog.FileName = $"Отчёт_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
  158. if (saveDialog.ShowDialog() == DialogResult.OK)
  159. {
  160. using (var package = new ExcelPackage())
  161. {
  162. var worksheet = package.Workbook.Worksheets.Add("Отчёт");
  163. // Заголовки
  164. for (int i = 0; i < dgvReport.Columns.Count; i++)
  165. {
  166. worksheet.Cells[1, i + 1].Value = dgvReport.Columns[i].HeaderText;
  167. worksheet.Cells[1, i + 1].Style.Font.Bold = true;
  168. worksheet.Cells[1, i + 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
  169. worksheet.Cells[1, i + 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(198, 141, 255));
  170. }
  171. // Данные
  172. for (int i = 0; i < dgvReport.Rows.Count; i++)
  173. {
  174. for (int j = 0; j < dgvReport.Columns.Count; j++)
  175. {
  176. worksheet.Cells[i + 2, j + 1].Value = dgvReport.Rows[i].Cells[j].Value?.ToString();
  177. }
  178. }
  179. worksheet.Cells.AutoFitColumns();
  180. package.SaveAs(new FileInfo(saveDialog.FileName));
  181. }
  182. MessageBox.Show("Отчёт успешно сохранён!", "Успешно",
  183. MessageBoxButtons.OK, MessageBoxIcon.Information);
  184. }
  185. }
  186. catch (Exception ex)
  187. {
  188. MessageBox.Show($"Ошибка при экспорте: {ex.Message}", "Ошибка",
  189. MessageBoxButtons.OK, MessageBoxIcon.Error);
  190. }
  191. }
  192. private void BtnBack_Click(object sender, EventArgs e)
  193. {
  194. this.Close();
  195. }
  196. }
  197. }