public MatrixHeaderCell(IMatrixHeader header, MatrixCellType newCellType, System.Collections.Generic.IList <IMatrixHeader> children = null) { this.CellType = newCellType; this.Children = children; this.Header = header.Header; this.ToolTip = header.ToolTip; this.Tag = header.Tag; }
protected override IMatrixDataCell GetDataCell(IMatrixHeader rowHeaderValue, IMatrixHeader columnHeaderValue) { var func = this.GetDataCellFunc; if (func == null) { throw new ArgumentNullException("GetCellValueFunc is null!"); } else { return(func(rowHeaderValue, columnHeaderValue)); } }
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)) },
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { IMatrixCell cell = values[0] as IMatrixCell; if (cell == null) { return(DependencyProperty.UnsetValue); } IMatrix matrix = null; if (values.Length > 1) { matrix = values[1] as IMatrix; } if (cell.CellType == MatrixCellType.DataCell) { if (matrix != null) { if (matrix.Size.Width - 1 == cell.GridColumn) { return(new Thickness(0d, 0d, 2d, 1d)); } } return(new Thickness(0d, 0d, 1d, 1d)); } IMatrixHeader header = cell as IMatrixHeader; IMatrixSummaryCell summaryCell = cell as IMatrixSummaryCell; if (header != null) { if (header.CellType == MatrixCellType.Empty) { return(new Thickness(0d, 0d, 2d, 2d)); } if (header.CellType == MatrixCellType.ColumnHeader || header.CellType == MatrixCellType.ColumnsGroupHeader) { if (header.GridRow == 0) { if (header.ChildrenCount == 0) { return(new Thickness(0d, 2d, 1d, 2d)); } else { return(new Thickness(0d, 2d, 1d, 1d)); } } else { if (header.ChildrenCount == 0) { return(new Thickness(0d, 0d, 1d, 2d)); } else { return(new Thickness(0d, 0d, 1d, 1d)); } } } if (header.CellType == MatrixCellType.RowHeader || header.CellType == MatrixCellType.RowsGroupHeader) { if (header.GridColumn == 0) { if (header.ChildrenCount == 0) { return(new Thickness(2d, 0d, 2d, 1d)); } else { return(new Thickness(2d, 0d, 1d, 1d)); } } else { if (header.ChildrenCount == 0) { return(new Thickness(0d, 0d, 2d, 1d)); } else { return(new Thickness(0d, 0d, 1d, 1d)); } } } if (header.CellType == MatrixCellType.ColumnSummaryHeader) { if (header.GridRow == 0) { return(new Thickness(1d, 2d, 2d, 2d)); } return(new Thickness(0d, 1d, 1d, 1d)); } if (header.CellType == MatrixCellType.RowSummaryHeader) { if (header.GridColumn == 0) { return(new Thickness(2d, 1d, 2d, 2d)); } return(new Thickness(0d, 1d, 1d, 1d)); } } if (summaryCell != null) { if (summaryCell.SummaryType == MatrixSummaryType.RowSummary || summaryCell.SummaryType == MatrixSummaryType.RowsGroupSummary) { return(new Thickness(2d, 0d, 2d, 2d)); } if (summaryCell.SummaryType == MatrixSummaryType.ColumnSummary || summaryCell.SummaryType == MatrixSummaryType.ColumnsGroupSummary) { return(new Thickness(0d, 2d, 2d, 2d)); } if (summaryCell.SummaryType == MatrixSummaryType.TotalGroupSummary) { return(new Thickness(0d, 0d, 1d, 1d)); } if (summaryCell.SummaryType == MatrixSummaryType.TotalSummary) { return(new Thickness(0d, 0d, 2d, 2d)); } } return(DependencyProperty.UnsetValue); }
/// <summary> /// Наследуемые классы должны переопределить этот метод для возврата /// каждой ячейки данных в матрице, где ячейка определяется пересечением /// строки и столбцы /// </summary> /// <param name="rowHeaderValue">Строка</param> /// <param name="columnHeaderValue">Столбец</param> protected abstract IMatrixDataCell GetDataCell(IMatrixHeader rowHeaderValue, IMatrixHeader columnHeaderValue);