private void Renderer_AfterProcessing(object sender, XmlDocument e) { if (eventRowTemplate != null) { // select events TimeRange timeRange = new(GenerateTime.AddDays(-workbookArgs.EventDepth), GenerateTime, true); EventFilter filter = workbookArgs.View == null ? new EventFilter(workbookArgs.EventCount) : new EventFilter(workbookArgs.EventCount, workbookArgs.View); List <Event> events = scadaClient.GetEvents(archiveEntity.Bit, timeRange, filter, false, out _); CnlDataFormatter formatter = new(configDatabase, configDatabase.Enums, workbookArgs.TimeZone); // modify workbook Table eventTable = eventRowTemplate.ParentTable; eventTable.RemoveUnwantedAttrs(); eventTable.ParentWorksheet.Name = dict.WorksheetName; int rowIndex = eventTable.Rows.IndexOf(eventRowTemplate); eventTable.RemoveRow(rowIndex); foreach (Event ev in events) { currentEventF = formatter.FormatEvent(ev); Row eventRow = eventRowTemplate.Clone(); renderer.ProcessRow(eventRow); eventTable.AppendRow(eventRow); } } }
/// <summary> /// Initializes a new instance of the class. /// </summary> public EventWorkbookBuilder(ConfigDatabase configDatabase, ScadaClient scadaClient, string templateDir) { this.configDatabase = configDatabase ?? throw new ArgumentNullException(nameof(configDatabase)); this.scadaClient = scadaClient ?? throw new ArgumentNullException(nameof(scadaClient)); templateFilePath = Path.Combine(templateDir, TemplateFileName); renderer = new WorkbookRenderer(); renderer.BeforeProcessing += Renderer_BeforeProcessing; renderer.AfterProcessing += Renderer_AfterProcessing; renderer.DirectiveFound += Renderer_DirectiveFound; dict = Locale.GetDictionary("Scada.Web.Plugins.PlgMain.Code.EventWorkbookBuilder"); workbookArgs = null; archiveEntity = null; eventRowTemplate = null; currentEventF = null; GenerateTime = DateTime.MinValue; }
/// <summary> /// Formats the event according to the channel properties. /// </summary> public EventFormatted FormatEvent(Event ev) { if (ev == null) { throw new ArgumentNullException(nameof(ev)); } EventFormatted eventFormatted = new EventFormatted { Time = TimeZoneInfo.ConvertTimeFromUtc(ev.Timestamp, timeZone).ToLocalizedString() }; // object if (ev.ObjNum > 0) { eventFormatted.Obj = configDataset.ObjTable.GetItem(ev.ObjNum)?.Name ?? ""; } // device if (ev.DeviceNum > 0) { eventFormatted.Dev = configDataset.DeviceTable.GetItem(ev.DeviceNum)?.Name ?? ""; } // channel Cnl cnl = null; if (ev.CnlNum > 0) { cnl = configDataset.CnlTable.GetItem(ev.CnlNum); eventFormatted.Cnl = cnl?.Name ?? ""; } // description StringBuilder sbDescr = new StringBuilder(); CnlDataFormatted dataFormatted; if (ev.TextFormat == EventTextFormat.Command) { // Command Value, Data. Custom text sbDescr.Append(CommonPhrases.CommandDescrPrefix); dataFormatted = FormatCnlData(new CnlData(ev.CnlVal, CnlStatusID.Defined), DataTypeID.Double, cnl?.FormatID ?? 0, cnl?.UnitID ?? 0); if (ev.CnlStat > 0) { sbDescr.Append(dataFormatted.DispVal); } if (ev.Data != null && ev.Data.Length > 0) { sbDescr .Append(ev.CnlStat > 0 ? ", " : "") .Append("0x") .Append(ScadaUtils.BytesToHex(ev.Data, 0, Math.Min(DataDisplayLength, ev.Data.Length))) .Append(DataDisplayLength < ev.Data.Length ? "..." : ""); } } else { // Status, Value. Custom text dataFormatted = FormatCnlData(new CnlData(ev.CnlVal, ev.CnlStat), cnl, true); if (ev.TextFormat == EventTextFormat.Full || ev.TextFormat == EventTextFormat.AutoText) { string statusName = configDataset.CnlStatusTable.GetItem(ev.CnlStat)?.Name ?? string.Format(CommonPhrases.StatusFormat, ev.CnlStat); sbDescr.Append(statusName).Append(", ").Append(dataFormatted.DispVal); } } if (!string.IsNullOrEmpty(ev.Text) && ev.TextFormat != EventTextFormat.AutoText) { if (sbDescr.Length > 0) { sbDescr.Append(". "); } sbDescr.Append(ev.Text); } eventFormatted.Descr = sbDescr.ToString(); // severity int knownSeverity = Severity.Closest(ev.Severity); if (knownSeverity != Severity.Undefined) { switch (knownSeverity) { case Severity.Critical: eventFormatted.Sev = CommonPhrases.CriticalSeverity; break; case Severity.Major: eventFormatted.Sev = CommonPhrases.MajorSeverity; break; case Severity.Minor: eventFormatted.Sev = CommonPhrases.MinorSeverity; break; case Severity.Info: eventFormatted.Sev = CommonPhrases.InfoSeverity; break; } eventFormatted.Sev += ", " + ev.Severity; } // acknowledgement if (ev.Ack) { eventFormatted.Ack = string.Join(", ", configDataset.UserTable.GetItem(ev.AckUserID)?.Name, TimeZoneInfo.ConvertTimeFromUtc(ev.AckTimestamp, timeZone).ToLocalizedString()); } // color if (dataFormatted.Colors.Length > 0) { eventFormatted.Color = dataFormatted.Colors[0]; } // beep if (cnl != null && new EventMask(cnl.EventMask).Beep) { eventFormatted.Beep = true; } return(eventFormatted); }