Пример #1
0
        private double?CalcI2t(DataAnalysis.FaultGroup faultGroup, DataSeries waveform)
        {
            if (waveform == null)
            {
                return(null);
            }

            double samplingInterval = 1.0D / waveform.SampleRate;

            return(faultGroup.Faults
                   .Where(fault => !fault.IsSuppressed)
                   .Where(fault => fault.Summaries.Any(summary => summary.IsValid))
                   .Select(fault => waveform.ToSubSeries(fault.StartSample, fault.EndSample))
                   .SelectMany(faultSamples => faultSamples.DataPoints)
                   .Select(dataPoint => (double?)(dataPoint.Value * dataPoint.Value * samplingInterval))
                   .DefaultIfEmpty(null)
                   .Sum());
        }
        public override void Execute(MeterDataSet meterDataSet)
        {
            FaultDataResource faultDataResource = meterDataSet.GetResource <FaultDataResource>();
            string            stationKey        = meterDataSet.Meter.MeterLocation.AssetKey;

            foreach (var kvp in faultDataResource.FaultLookup)
            {
                DataGroup dataGroup = kvp.Key;
                DataAnalysis.FaultGroup faultGroup = kvp.Value;
                string lineKey = dataGroup.Line.AssetKey;

                for (int i = 0; i < faultGroup.Faults.Count; i++)
                {
                    int faultNumber          = i + 1;
                    DataAnalysis.Fault fault = faultGroup.Faults[i];

                    if (fault.IsSuppressed)
                    {
                        continue;
                    }

                    string distance = fault.Summaries
                                      .Where(summary => summary.IsValid)
                                      .Where(summary => summary.IsSelectedAlgorithm)
                                      .Select(summary => summary.Distance.ToString("0.###"))
                                      .FirstOrDefault();

                    if (distance == null)
                    {
                        return;
                    }

                    string    url           = string.Format(Settings.URLFormat, stationKey, lineKey, distance);
                    string    structureInfo = GetStructureInfo(url);
                    DataTable structureData = ToDataTable(structureInfo);

                    if (structureData.Rows.Count == 0)
                    {
                        return;
                    }

                    Func <string, string> fieldMappingLookup = FieldMappingLookup;
                    string assetKeyField     = fieldMappingLookup("AssetKey");
                    string latitudeKeyField  = fieldMappingLookup("Latitude");
                    string longitudeKeyField = fieldMappingLookup("Longitude");

                    if (!structureData.Columns.Contains(assetKeyField))
                    {
                        return;
                    }

                    using (AdoDataConnection connection = meterDataSet.CreateDbConnection())
                    {
                        TableOperations <Event> eventTable = new TableOperations <Event>(connection);
                        Event evt            = eventTable.GetEvent(meterDataSet.FileGroup, dataGroup);
                        int   faultSummaryID = connection.ExecuteScalar <int>(FaultSummaryQuery, evt.ID, faultNumber);

                        TableOperations <Structure> structureTable = new TableOperations <Structure>(connection);

                        foreach (DataRow row in structureData.Rows)
                        {
                            string assetKey  = row.Field <string>(assetKeyField);
                            string latitude  = null;
                            string longitude = null;

                            if (structureData.Columns.Contains(latitudeKeyField))
                            {
                                latitude = row.Field <string>(latitudeKeyField);
                            }

                            if (structureData.Columns.Contains(longitudeKeyField))
                            {
                                longitude = row.Field <string>(longitudeKeyField);
                            }

                            Structure structure = structureTable.QueryRecordWhere("AssetKey = {0}", assetKey)
                                                  ?? new Structure()
                            {
                                AssetKey = assetKey
                            };

                            structure.LineID = dataGroup.Line.ID;

                            if (double.TryParse(latitude, out double lat))
                            {
                                structure.Latitude = lat;
                            }

                            if (double.TryParse(longitude, out double lon))
                            {
                                structure.Longitude = lon;
                            }

                            structureTable.AddNewOrUpdateRecord(structure);

                            if (structure.ID == 0)
                            {
                                structure.ID = connection.ExecuteScalar <int>("SELECT @@IDENTITY");
                            }

                            if (faultSummaryID != 0)
                            {
                                connection.ExecuteNonQuery("INSERT INTO NearestStructure(FaultSummaryID, StructureID) VALUES({0}, {1})", faultSummaryID, structure.ID);
                            }
                        }
                    }
                }
            }
        }