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;
        }
Exemple #3
0
        /// <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);
        }