public static IMatrixHeader CreateEmptyHeader(int row, int column, int rowSpan = 1, int columnSpan = 1) { MatrixHeaderCell cell = new MatrixHeaderCell(MatrixCellType.Empty); cell.SetGridProperties(row, column, rowSpan, columnSpan); return(cell); }
public static IMatrixHeader CreateColumnSummaryHeader(string header, int row, int column, int rowSpan = 1, int columnSpan = 1) { MatrixHeaderCell cell = new MatrixHeaderCell(MatrixCellType.ColumnSummaryHeader, header); cell.SetGridProperties(row, column, rowSpan, columnSpan); return(cell); }
public static IMatrixHeader CreateRowsGroupHeader(string header, int row, int column, int rowSpan = 1, int columnSpan = 1, System.Collections.Generic.IList <IMatrixHeader> children = null) { MatrixHeaderCell cell = new MatrixHeaderCell(MatrixCellType.RowsGroupHeader, header) { Children = children }; cell.SetGridProperties(row, column, rowSpan, columnSpan); return(cell); }
public static IEnumerable <IMatrix> GetPaymentsAndPofiderAnalizPivots(DateOnly period, IList <FiderAnalizMeter> fiderAnalizMeters = null) { if (fiderAnalizMeters == null) { return(new List <IMatrix>()); } List <IMatrix> pivots = new(); long total = fiderAnalizMeters.Select(meter => meter.Consumption).Sum(i => i ?? 0); IEnumerable <IMatrixHeader> headerCells2 = new IMatrixHeader[] { MatrixHeaderCell.CreateColumnHeader("Значение, кВт∙ч"), MatrixHeaderCell.CreateColumnHeader("Доля, %"), }; string notDefinedString = "(не указана)"; List <KeyValuePair <string, int> > substationsPowerSuppy = fiderAnalizMeters .GroupBy(i => i.Substation) .Select(i => new KeyValuePair <string, int>(string.IsNullOrWhiteSpace(i.Key) ? notDefinedString : i.Key, (int)i.Select(meter => meter.Consumption).Sum(i => i ?? 0))) .OrderByDescending(i => i.Value) .ToList(); List <string> substationsNames = substationsPowerSuppy .Select(i => i.Key) .ToList(); pivots.Add(new Matrix() { Header = $"Полезный отпуск электроэнергии бытовым абонентам по подстанциям (за {period:MMMM yyyy} г.)", Description = " ", GetRowHeaderValuesFunc = () => substationsNames.Select(i => MatrixHeaderCell.CreateRowHeader(i)), ShowColumnsTotal = true, GetColumnHeaderValuesFunc = () => headerCells2, GetDataCellFunc = (row, column) => { int value = substationsPowerSuppy .Where(i => i.Key == row.Header) .Select(i => i.Value) .FirstOrDefault(); if (column.Header == "Доля, %") { return(new MatrixDataCell(100d * value / total, "N1")); } else { return(new MatrixDataCell(value)); } }, }); string otherString = "(остальное)"; List <KeyValuePair <string, int> > data1 = fiderAnalizMeters .GroupBy(i => i.Town) .Select(i => new KeyValuePair <string, int>(i.Key, (int)i.Select(meter => meter.Consumption).Sum(i => i ?? 0))) .OrderByDescending(i => i.Value) .ToList(); List <KeyValuePair <string, int> > energyPowerSupplyByStateList = new(); List <string> stateNames = new(); if (data1.Count > 15) { int lastCount = data1 .Skip(15) .Count(); otherString += $" {lastCount} шт."; int summOfLast = data1 .Skip(15) .Sum(o => o.Value); List <KeyValuePair <string, int> > first = data1 .Take(15) .ToList(); energyPowerSupplyByStateList.AddRange(first); energyPowerSupplyByStateList.Add(new KeyValuePair <string, int>(otherString, summOfLast)); List <string> firstStateNames = data1 .Take(15) .Select(i => i.Key) .ToList(); stateNames.AddRange(firstStateNames); stateNames.Add(otherString); } else { energyPowerSupplyByStateList = data1; stateNames = data1 .Select(i => i.Key) .ToList(); } pivots.Add(new Matrix() { Header = $"Полезный отпуск электроэнергии бытовым абонентам по населенным пунктам (за {period:MMMM yyyy} г.)", Description = "показаны 15 наиболее крупных", GetRowHeaderValuesFunc = () => stateNames.Select(i => MatrixHeaderCell.CreateRowHeader(i)), ShowColumnsTotal = true, GetColumnHeaderValuesFunc = () => headerCells2, GetDataCellFunc = (row, column) => { int value = energyPowerSupplyByStateList .Where(i => i.Key == row.Header) .Select(i => i.Value) .FirstOrDefault(); if (column.Header == "Доля, %") { return(new MatrixDataCell(100d * value / total, "N1")); } else { return(new MatrixDataCell(value)); } }, }); List <FiderAnalizMeter> data2 = fiderAnalizMeters .Where(i => i.Consumption.HasValue && i.Consumption > 0) .ToList(); List <IGrouping <string, FiderAnalizMeter> > data3 = data2 .GroupBy(i => i.TownType) .ToList(); Dictionary <string, int> data4 = data3 .ToDictionary(i => i.Key, k => k.Count()); Dictionary <string, Dictionary <string, int> > keyValuePairs = new() { { "до 5 кВт∙ч", data3.ToDictionary(i => i.Key, k => k.Count(l => l.Consumption < 5)) }, { "от 5 до 50 кВт∙ч", data3.ToDictionary(i => i.Key, k => k.Count(l => l.Consumption is >= 5 and < 50)) },