using AsbCloudApp.Data; using AsbCloudApp.Data.DailyReport; using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Linq; namespace AsbCloudInfrastructure.Services.DailyReport.DailyReportBlocks { /// <summary> /// Построение баланса времени /// </summary> class TimeBalanceBlock : BlockAbstract { /// <summary> /// Начальная ячейка /// </summary> public override CellAddress AddressBlockBegin { get; } /// <summary> /// Конечная ячейка /// </summary> public override CellAddress AddressBlockEnd { get; } /// <summary> /// Ячейка с заголовком /// </summary> private CellAddress Title { get { return AddressBlockBegin + (1, 3); } } /// <summary> /// Статистика по операциям /// </summary> private Dictionary<int, double> OperationsStatistics { get; } /// <summary> /// Категории операций /// </summary> private IEnumerable<WellOperationCategoryDto> OperationCategories { get; } /// <summary> /// количество столбцов в таблице /// </summary> private const int countColumns = 3; /// <summary> /// количество категорий операций /// </summary> private int OperationCategoriesCount { get { return OperationCategories.Count(); } } public TimeBalanceBlock(CellAddress addressBlockBegin, TimeBalanceDto blockDto, IEnumerable<WellOperationCategoryDto> operationCategories) { AddressBlockBegin = addressBlockBegin.Copy(); OperationsStatistics = blockDto.OperationsStat; OperationCategories = operationCategories; var rowsCount = (int)Math.Ceiling( 1d * OperationCategoriesCount / countColumns); var colsCount = (1 + 1) * countColumns; AddressBlockEnd = Title + (rowsCount, colsCount); } public override void Draw(IXLWorksheet sheet) { sheet.Range(Title.RowNumber, Title.ColumnNumber, Title.RowNumber, Title.ColumnNumber + 1) .Merge() .SetValue("БАЛАНС ВРЕМЕНИ"); var i = 0; foreach (var operationCategory in OperationCategories) { var row = 2 + (int)Math.Floor(1d * i / countColumns); var col = 1 + 2 *(i % countColumns); i++; sheet.Cell(AddressBlockBegin + (row, col)) ._SetValue(operationCategory.Name, true); sheet.Cell(AddressBlockBegin + (row, col + 1)) ._SetValue(GetValue(operationCategory.Id), true); } } private string GetValue(int categoryId) { if (OperationsStatistics.TryGetValue(categoryId, out double duration)) return $"{duration}"; return "0"; } } }