/// <summary> /// Получить расширенные текущие данные входных каналов /// </summary> private CnlDataExtDTO[] GetCnlDataExtDTOs(IList <int> cnlList) { int cnlCnt = cnlList.Count; CnlDataExtDTO[] cnlDataDTOs = new CnlDataExtDTO[cnlCnt]; DataAccess dataAccess = AppData.DataAccess; DateTime dataAge; SrezTableLight.Srez snapshot = dataAccess.DataCache.GetCurSnapshot(out dataAge); string emptyVal = ""; bool dataVisible = snapshot != null && DataFormatter.CurDataVisible(dataAge, DateTime.Now, out emptyVal); for (int i = 0; i < cnlCnt; i++) { int cnlNum = cnlList[i]; CnlDataExtDTO cnlDataDTO = new CnlDataExtDTO(cnlNum); cnlDataDTOs[i] = cnlDataDTO; SrezTableLight.CnlData cnlData; snapshot.GetCnlData(cnlNum, out cnlData); cnlDataDTO.Val = cnlData.Val; cnlDataDTO.Stat = cnlData.Stat; if (dataVisible) { InCnlProps cnlProps = dataAccess.GetCnlProps(cnlNum); string text; string textWithUnit; DataFormatter.FormatCnlVal(cnlData.Val, cnlData.Stat, cnlProps, out text, out textWithUnit); cnlDataDTO.Text = text; cnlDataDTO.TextWithUnit = textWithUnit; cnlDataDTO.Color = DataFormatter.GetCnlValColor(cnlData.Val, cnlData.Stat, cnlProps, dataAccess.GetColorByStat); } else { cnlDataDTO.Text = cnlDataDTO.TextWithUnit = emptyVal; } } return(cnlDataDTOs); }
/// <summary> /// Создать и заполнить массив расширенных данных входных каналов /// </summary> private CnlDataExt[] CreateCnlDataExtArr(IList <int> cnlList, SrezTableLight.Srez snapshot, bool dataVisible, string emptyVal) { DataAccess dataAccess = AppData.DataAccess; int cnlCnt = cnlList == null ? 0 : cnlList.Count; CnlDataExt[] cnlDataExtArr = new CnlDataExt[cnlCnt]; for (int i = 0; i < cnlCnt; i++) { int cnlNum = cnlList[i]; CnlDataExt cnlDataExt = new CnlDataExt(cnlNum); cnlDataExtArr[i] = cnlDataExt; if (dataVisible) { double val; int stat; snapshot.GetCnlData(cnlNum, out val, out stat); if (!double.IsNaN(val)) { cnlDataExt.Val = val; cnlDataExt.Stat = stat; } InCnlProps cnlProps = dataAccess.GetCnlProps(cnlNum); string text; string textWithUnit; DataFormatter.FormatCnlVal(val, stat, cnlProps, out text, out textWithUnit); cnlDataExt.Text = text; cnlDataExt.TextWithUnit = textWithUnit; CnlStatProps cnlStatProps = dataAccess.GetCnlStatProps(stat); cnlDataExt.Color = DataFormatter.GetCnlValColor(val, stat, cnlProps, cnlStatProps); } else { cnlDataExt.Text = cnlDataExt.TextWithUnit = emptyVal; } } return(cnlDataExtArr); }
/// <summary> /// Преобразовать точку тренда в запись JavaScript /// </summary> protected string TrendPointToJs(double val, int stat, InCnlProps cnlProps) { string text; string textWithUnit; dataFormatter.FormatCnlVal(val, stat, cnlProps, out text, out textWithUnit); CnlStatProps cnlStatProps = dataAccess.GetCnlStatProps(stat); string color = dataFormatter.GetCnlValColor(val, stat, cnlProps, cnlStatProps); // для text и textWithUnit было бы корректно использовать метод HttpUtility.JavaScriptStringEncode(), // но он опускается для повышения скорости double chartVal = stat > 0 ? val : double.NaN; return((new StringBuilder("[") .Append(double.IsNaN(chartVal) ? "NaN" : chartVal.ToString(CultureInfo.InvariantCulture)) .Append(", \"") .Append(text) .Append("\", \"") .Append(textWithUnit) .Append("\", \"") .Append(color) .Append("\"]")).ToString()); }
/// <summary> /// Обработать директиву, связанную со значением ячейки /// </summary> protected override void ProcVal(Cell cell, string valName) { string nodeText = null; if (valName == "Title") { nodeText = string.Format(TablePhrases.HourDataTitle, tableView.Title, date.ToLocalizedDateString(), WFrmTable.GetLocalizedHour(startHour) + " - " + WFrmTable.GetLocalizedHour(endHour)); } else if (valName == "Gen") { nodeText = TablePhrases.HourDataGen + genDT.ToLocalizedString(); } else if (valName == "ItemCol") { nodeText = TablePhrases.ItemCol; } else if (valName.StartsWith("H")) { // заголовок таблицы часовых данных if (int.TryParse(valName.Substring(1), out int hour)) { nodeText = WFrmTable.GetLocalizedHour(hour); } } else if (viewItem != null) { if (valName == "Name") { nodeText = viewItem.Caption; } else if (valName.StartsWith("h")) { // часовые данные if (int.TryParse(valName.Substring(1), out int hour)) { if (viewItem.CnlNum > 0 && startHour <= hour && hour <= endHour) { DateTime colDT = date.AddHours(hour); SrezTableLight hourTable = hour >= 0 ? reqDateHourTable : prevDateHourTable; hourTable.SrezList.TryGetValue(colDT, out SrezTableLight.Srez snapshot); if (dataFormatter.HourDataVisible(colDT, genDT, snapshot != null, out string emptyVal)) { // получение данных snapshot.GetCnlData(viewItem.CnlNum, out double val, out int stat); // форматирование данных dataFormatter.FormatCnlVal(val, stat, viewItem.CnlProps, ".", "", out string text, out string textWithUnit, out bool textIsNumber); string color = dataFormatter.GetCnlValColor(val, stat, viewItem.CnlProps, dataAccess.GetCnlStatProps(stat)); // вывод данных nodeText = text; workbook.SetColor(cell.Node, null, color); if (textIsNumber) { cell.SetNumberType(); } } else { nodeText = emptyVal; } } else { nodeText = ""; } } } } if (nodeText != null) { cell.DataNode.InnerText = nodeText; } }
/// <summary> /// Вывести в отчёт минутные данные /// </summary> private void WriteMinData(Table table) { // получение трендов int cnlCnt = cnlNums.Length; Trend[] trends = new Trend[cnlCnt]; Trend trend; for (int i = 0; i < cnlCnt; i++) { int cnlNum = cnlNums[i]; if (period == 1) { trend = dataAccess.DataCache.GetMinTrend(startDate, cnlNum); } else { trend = new Trend(cnlNum); for (int d = 0; d < period; d++) { Trend dailyTrend = dataAccess.DataCache.GetMinTrend(startDate.AddDays(d), cnlNum); trend.Points.AddRange(dailyTrend.Points); } } trends[i] = trend; } // создание связки трендов TrendBundle trendBundle = new TrendBundle(); trendBundle.Init(trends); // вывод в отчёт DataFormatter dataFormatter = new DataFormatter(); DateTime prevDate = period > 1 ? DateTime.MinValue : DateTime.MaxValue /*не выводить даты*/; foreach (TrendBundle.Point point in trendBundle.Series) { DateTime pointDT = point.DateTime; // вывод строки с новой датой if (prevDate < pointDT.Date) { prevDate = pointDT.Date; Row dateRow = dateRowTemplate.Clone(); dateRow.Cells[0].DataNode.InnerText = pointDT.ToLocalizedDateString(); table.AppendRow(dateRow); } // вывод строки с минутными данными Row dataRow = dataRowTemplate.Clone(); dataRow.Cells[0].DataNode.InnerText = pointDT.ToLocalizedTimeString(); for (int i = 0; i < cnlCnt; i++) { SrezTableLight.CnlData cnlData = point.CnlData[i]; string text; string textWithUnit; bool textIsNumber; dataFormatter.FormatCnlVal(cnlData.Val, cnlData.Stat, cnlPropsArr[i], ".", "", out text, out textWithUnit, out textIsNumber); Cell cell = dataRow.Cells[i + 1]; cell.DataNode.InnerText = text; if (textIsNumber) { cell.SetNumberType(); } } table.AppendRow(dataRow); } }