|
@@ -0,0 +1,287 @@
|
|
|
+using esoft.Class;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows;
|
|
|
+using System.Windows.Controls;
|
|
|
+using System.Windows.Data;
|
|
|
+using System.Windows.Documents;
|
|
|
+using System.Windows.Forms.DataVisualization.Charting;
|
|
|
+using System.Windows.Input;
|
|
|
+using System.Windows.Media;
|
|
|
+using System.Windows.Media.Imaging;
|
|
|
+using System.Windows.Navigation;
|
|
|
+using System.Windows.Shapes;
|
|
|
+using Excel = Microsoft.Office.Interop.Excel;
|
|
|
+using Word = Microsoft.Office.Interop.Word;
|
|
|
+
|
|
|
+namespace esoft.Pages
|
|
|
+{
|
|
|
+ public partial class Diagram : Page
|
|
|
+ {
|
|
|
+ // Список уровней исполнителей
|
|
|
+ List<string> listLvl = new List<string>
|
|
|
+ {
|
|
|
+ "junior",
|
|
|
+ "middle",
|
|
|
+ "senior"
|
|
|
+ };
|
|
|
+
|
|
|
+ public Diagram()
|
|
|
+ {
|
|
|
+ InitializeComponent();
|
|
|
+ chartDiagram.ChartAreas.Add(new ChartArea("Основная Область"));
|
|
|
+
|
|
|
+ // Инициализация серии для диаграммы
|
|
|
+ var currentSeries = new Series("Исполнители")
|
|
|
+ {
|
|
|
+ IsValueShownAsLabel = true
|
|
|
+ };
|
|
|
+ chartDiagram.Series.Add(currentSeries);
|
|
|
+
|
|
|
+ // Установка источника данных для комбо-боксов
|
|
|
+ cmbExecuter.ItemsSource = listLvl;
|
|
|
+ cmbType.ItemsSource = Enum.GetValues(typeof(SeriesChartType));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void BtnClear_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ cmbExecuter.SelectedIndex = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void btnExportToExcel_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ // Получение списка всех задач и списка исполнителей
|
|
|
+ var allTask = TaskFill.TaskFills();
|
|
|
+ var executer = ExecuterFill.Fill();
|
|
|
+
|
|
|
+ // Создание экземпляра приложения Excel
|
|
|
+ var application = new Excel.Application();
|
|
|
+ application.SheetsInNewWorkbook = executer.Count();
|
|
|
+
|
|
|
+ Excel.Workbook wb = application.Workbooks.Add(Type.Missing);
|
|
|
+
|
|
|
+ // Создание листов Excel для каждого исполнителя
|
|
|
+ for (int i = 0; i < executer.Count; i++)
|
|
|
+ {
|
|
|
+ int startRowIndex = 1;
|
|
|
+
|
|
|
+ Excel.Worksheet worksheet = application.Worksheets.Item[i + 1];
|
|
|
+ worksheet.Name = executer[i].FioUser;
|
|
|
+
|
|
|
+ // Заполнение заголовков таблицы
|
|
|
+ worksheet.Cells[1][startRowIndex] = "Дата создания";
|
|
|
+ worksheet.Cells[2][startRowIndex] = "Менеджер";
|
|
|
+ worksheet.Cells[3][startRowIndex] = "Статус задачи";
|
|
|
+ worksheet.Cells[4][startRowIndex] = "Тип работы";
|
|
|
+ worksheet.Cells[5][startRowIndex] = "Срок даты окончания";
|
|
|
+ worksheet.Cells[6][startRowIndex] = "Время на выполнение";
|
|
|
+ worksheet.Cells[7][startRowIndex] = "Время на выполнение в часах";
|
|
|
+ worksheet.Cells[8][startRowIndex] = "Сложность";
|
|
|
+
|
|
|
+ startRowIndex++;
|
|
|
+
|
|
|
+ // Заполнение данными каждой задачи
|
|
|
+ foreach (var titleTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
|
|
|
+ {
|
|
|
+ // Заполнение заголовка задачи
|
|
|
+ Excel.Range headerRange = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[8][startRowIndex]];
|
|
|
+ headerRange.Merge();
|
|
|
+ headerRange.Value = titleTask.Title;
|
|
|
+ headerRange.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
|
|
|
+ headerRange.Font.Italic = true;
|
|
|
+
|
|
|
+ startRowIndex++;
|
|
|
+
|
|
|
+ // Заполнение основных данных задачи
|
|
|
+ foreach (var mainDateTask in allTask.Where(x => x.FioUser == executer[i].FioUser))
|
|
|
+ {
|
|
|
+ worksheet.Cells[1][startRowIndex] = mainDateTask.CreateDateTime.ToString("dd.MM.yyyy HH:mm");
|
|
|
+ worksheet.Cells[2][startRowIndex] = mainDateTask.FioManager;
|
|
|
+ worksheet.Cells[3][startRowIndex] = mainDateTask.Status;
|
|
|
+ worksheet.Cells[4][startRowIndex] = mainDateTask.WorkType;
|
|
|
+ worksheet.Cells[5][startRowIndex] = mainDateTask.Deadline.ToString("dd.MM.yyyy HH:mm");
|
|
|
+ worksheet.Cells[6][startRowIndex] = mainDateTask.Time;
|
|
|
+
|
|
|
+ worksheet.Cells[7][startRowIndex].Formula = $"=F{startRowIndex}/60";
|
|
|
+
|
|
|
+ worksheet.Cells[8][startRowIndex] = mainDateTask.Difficulty;
|
|
|
+ worksheet.Cells[8][startRowIndex].NumberFormat = "0";
|
|
|
+
|
|
|
+ startRowIndex++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Вычисление итогового количества задач
|
|
|
+ Excel.Range cauntTask = worksheet.Range[worksheet.Cells[1][startRowIndex], worksheet.Cells[7][startRowIndex]];
|
|
|
+ cauntTask.Merge();
|
|
|
+ cauntTask.Value = "Итоговое количество задач:";
|
|
|
+ cauntTask.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
|
|
|
+
|
|
|
+ worksheet.Cells[8][startRowIndex] = allTask.Where(x => x.ExecutorID == executer[i].ID).ToList().Count();
|
|
|
+
|
|
|
+ startRowIndex++;
|
|
|
+
|
|
|
+ // Установка границ таблицы
|
|
|
+ Excel.Range rangBorder = worksheet.Range[worksheet.Cells[1][1], worksheet.Cells[8][startRowIndex - 1]];
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle =
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle =
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle =
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle =
|
|
|
+ rangBorder.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
|
|
|
+
|
|
|
+ worksheet.Columns.AutoFit();
|
|
|
+ }
|
|
|
+ application.Visible = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void btnExportToWord_Click(object sender, RoutedEventArgs e)
|
|
|
+ {
|
|
|
+ // Получение списка всех задач и списка исполнителей
|
|
|
+ var allTask = TaskFill.TaskFills();
|
|
|
+ var allExecuters = ExecuterFill.Fill();
|
|
|
+
|
|
|
+ // Создание экземпляра приложения Word
|
|
|
+ var application = new Word.Application();
|
|
|
+ Word.Document document = application.Documents.Add();
|
|
|
+
|
|
|
+ // Для каждого исполнителя создается свой раздел в документе Word
|
|
|
+ foreach (var ex in allExecuters)
|
|
|
+ {
|
|
|
+ // Добавление заголовка раздела с именем исполнителя
|
|
|
+ Word.Paragraph executerParagraph = document.Paragraphs.Add();
|
|
|
+ Word.Range executerRange = executerParagraph.Range;
|
|
|
+ executerRange.Text = ex.FioUser;
|
|
|
+ executerParagraph.set_Style("Заголовок");
|
|
|
+ executerRange.InsertParagraphAfter();
|
|
|
+
|
|
|
+ // Получение списка задач для текущего исполнителя
|
|
|
+ List<TaskFill> executerTasks = allTask.Where(x => x.ExecutorID == ex.ID).ToList();
|
|
|
+ if (executerTasks.Count == 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ // Создание таблицы для отображения задач текущего исполнителя
|
|
|
+ Word.Paragraph tableParagraph = document.Paragraphs.Add();
|
|
|
+ Word.Range tableRange = tableParagraph.Range;
|
|
|
+ Word.Table tasksTable = document.Tables.Add(tableRange,
|
|
|
+ executerTasks.Count(), 3);
|
|
|
+ tasksTable.Borders.InsideLineStyle = tasksTable.Borders.OutsideLineStyle
|
|
|
+ = Word.WdLineStyle.wdLineStyleSingle;
|
|
|
+ tasksTable.Range.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
|
|
|
+
|
|
|
+ Word.Range cellRange;
|
|
|
+
|
|
|
+ // Добавление заголовков столбцов таблицы
|
|
|
+ cellRange = tasksTable.Cell(1, 1).Range;
|
|
|
+ cellRange.Text = "Название задачи";
|
|
|
+ cellRange = tasksTable.Cell(1, 2).Range;
|
|
|
+ cellRange.Text = "Крайняя дата задачи";
|
|
|
+ cellRange = tasksTable.Cell(1, 3).Range;
|
|
|
+ cellRange.Text = "Статус";
|
|
|
+
|
|
|
+ tasksTable.Rows[1].Range.Bold = 1;
|
|
|
+ tasksTable.Rows[1].Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
|
|
+
|
|
|
+ // Заполнение таблицы данными о задачах
|
|
|
+ for (int i = 1; i < executerTasks.Count(); i++)
|
|
|
+ {
|
|
|
+ cellRange = tasksTable.Cell(i + 2, 1).Range;
|
|
|
+ cellRange.Text = executerTasks[i].Title;
|
|
|
+
|
|
|
+ cellRange = tasksTable.Cell(i + 2, 2).Range;
|
|
|
+ cellRange.Text = executerTasks[i].Deadline.ToString();
|
|
|
+
|
|
|
+ cellRange = tasksTable.Cell(i + 2, 3).Range;
|
|
|
+ cellRange.Text = executerTasks[i].Status;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Проверка просроченных и оставшихся задач
|
|
|
+ List<TaskFill> timeOutTask = executerTasks.Where(x => x.Deadline < DateTime.Now).ToList();
|
|
|
+ if (timeOutTask.Count > 0)
|
|
|
+ {
|
|
|
+ // Добавление информации о просроченных задачах
|
|
|
+ foreach (TaskFill task in timeOutTask)
|
|
|
+ {
|
|
|
+ Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
|
|
|
+ Word.Range timeOutRange = timeOutParagraph.Range;
|
|
|
+ timeOutRange.Text = $"Задача {task.Title} просрочена на {(DateTime.Now - task.Deadline).TotalDays} дней";
|
|
|
+ timeOutParagraph.set_Style("Подзаголовок");
|
|
|
+ timeOutRange.Font.Color = Word.WdColor.wdColorRed;
|
|
|
+ timeOutRange.InsertParagraphAfter();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Проверка непросроченных задач
|
|
|
+ List<TaskFill> noTimeOutTask = executerTasks.Where(x => x.Deadline >= DateTime.Now).ToList();
|
|
|
+ if (noTimeOutTask.Count > 0)
|
|
|
+ {
|
|
|
+ // Добавление информации о непросроченных задачах
|
|
|
+ foreach (TaskFill task in noTimeOutTask)
|
|
|
+ {
|
|
|
+ Word.Paragraph timeOutParagraph = document.Paragraphs.Add();
|
|
|
+ Word.Range timeOutRange = timeOutParagraph.Range;
|
|
|
+ timeOutRange.Text = $"На выполнение задачи {task.Title} осталось {(task.Deadline - DateTime.Now).TotalHours} часов";
|
|
|
+ timeOutParagraph.set_Style("Intense Quote");
|
|
|
+ timeOutRange.Font.Color = Word.WdColor.wdColorGreen;
|
|
|
+ timeOutRange.InsertParagraphAfter();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Добавление разрыва страницы между разделами для каждого исполнителя
|
|
|
+ if (ex != allExecuters.LastOrDefault())
|
|
|
+ document.Words.Last.InsertBreak(Word.WdBreakType.wdPageBreak);
|
|
|
+ }
|
|
|
+ // Отображение приложения Word
|
|
|
+ application.Visible = true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void UpdateChar(object sender, SelectionChangedEventArgs e)
|
|
|
+ {
|
|
|
+ // Проверка выбранного элемента в комбо-боксах cmbExecuter и cmbType
|
|
|
+ if (cmbExecuter.SelectedItem is string grade && cmbType.SelectedItem is SeriesChartType chartType)
|
|
|
+ {
|
|
|
+ // Получение текущей серии диаграммы
|
|
|
+ Series currentSeries = chartDiagram.Series.FirstOrDefault();
|
|
|
+
|
|
|
+ // Установка типа диаграммы
|
|
|
+ currentSeries.ChartType = chartType;
|
|
|
+
|
|
|
+ // Очистка точек текущей серии
|
|
|
+ currentSeries.Points.Clear();
|
|
|
+
|
|
|
+ // Получение списка исполнителей
|
|
|
+ var categoryList = ExecuterFill.Fill();
|
|
|
+
|
|
|
+ // Добавление точки на диаграмму для выбранного уровня исполнителя
|
|
|
+ currentSeries.Points.AddXY(grade, categoryList.Where(x => x.Grade == grade).Count());
|
|
|
+ }
|
|
|
+
|
|
|
+ // Если выбран только тип диаграммы
|
|
|
+ else if (cmbType.SelectedItem is SeriesChartType chartTypeTwo)
|
|
|
+ {
|
|
|
+ // Получение текущей серии диаграммы
|
|
|
+ Series currentSeries = chartDiagram.Series.FirstOrDefault();
|
|
|
+
|
|
|
+ // Установка типа диаграммы
|
|
|
+ currentSeries.ChartType = chartTypeTwo;
|
|
|
+
|
|
|
+ // Очистка точек текущей серии
|
|
|
+ currentSeries.Points.Clear();
|
|
|
+
|
|
|
+ // Получение списка исполнителей
|
|
|
+ var categoryList = ExecuterFill.Fill();
|
|
|
+
|
|
|
+ // Добавление точек на диаграмму для всех уровней исполнителей
|
|
|
+ foreach (var category in listLvl)
|
|
|
+ {
|
|
|
+ currentSeries.Points.AddXY(category, categoryList.Where(x => x.Grade == category).Count());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|