using IStation.Model;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
|
namespace IStation.BLL
|
{
|
/// <summary>
|
/// 监测数据集(分析,待修改)
|
/// </summary>
|
public partial class StationSignalRecordPacket
|
{
|
#region Basic
|
|
/// <summary>
|
/// 一天秒数之和
|
/// </summary>
|
public int TotalSecondsOfDay = 86400;
|
|
/// <summary>
|
/// 计算容量
|
/// </summary>
|
public int CalcuCapacity(int days, int frequency)
|
{
|
var monthlyTotalSeconds = days * TotalSecondsOfDay;
|
var capacity = monthlyTotalSeconds / frequency + 1;
|
return capacity;
|
}
|
|
/// <summary>
|
/// 获取数据字典 (将符合当前时间的测点数据汇总到一个字典里 )
|
/// </summary>
|
public Dictionary<long, double> GetRecordDict(DateTime time, List<Model.SignalRecordPacket> signalRecordPackets, Dictionary<long, int> findIndexDict, Dictionary<long, double> recordDict, int frequency, out bool success)
|
{
|
success = false;
|
if (signalRecordPackets == null || signalRecordPackets.Count < 1)
|
return default;
|
|
foreach (var packet in signalRecordPackets)
|
{
|
var signalId = packet.SignalID;
|
var records = packet.RecordList;
|
var count = packet.RecordList.Count;
|
recordDict[signalId] = IStation.Error.Default;
|
for (int index = findIndexDict[signalId]; index < count; index++)
|
{
|
var afterRecord = records[index];
|
if (afterRecord.Time > time)
|
{
|
if (index == 0)
|
{
|
success = true;
|
recordDict[signalId] = afterRecord.Value;
|
}
|
else
|
{
|
var frontRecord = records[index - 1];
|
var diffFrontSecond = (time - frontRecord.Time).TotalSeconds;
|
var diffAfterSecond = (afterRecord.Time - time).TotalSeconds;
|
if (diffFrontSecond <= diffAfterSecond)
|
{
|
if (Math.Abs(diffFrontSecond) <= frequency)
|
{
|
success = true;
|
recordDict[signalId] = frontRecord.Value;
|
}
|
findIndexDict[signalId] = index;
|
break;
|
}
|
else
|
{
|
if (Math.Abs(diffAfterSecond) <= frequency)
|
{
|
success = true;
|
recordDict[signalId] = afterRecord.Value;
|
}
|
findIndexDict[signalId] = index;
|
break;
|
|
}
|
}
|
}
|
findIndexDict[signalId] = index;
|
|
}
|
}
|
return recordDict;
|
}
|
|
|
#endregion
|
|
/// <summary>
|
/// 获取月数据集合
|
/// </summary>
|
/// <param name="stationId">泵站标识</param>
|
/// <param name="monitorDataSourcesId">数据来源</param>
|
/// <param name="timeStep">时间步长</param>
|
/// <returns></returns>
|
public List<Model.StationSignalRecordPacket> Analysis(long monitorDataSourcesId, long stationId, int timeStep = 300)
|
{
|
var bll_summary = new BLL.MonitorDataSetSummary();
|
var year_month_list = bll_summary.GetYearMonth(monitorDataSourcesId);
|
if (year_month_list == null || !year_month_list.Any())
|
return default;
|
|
var bll_equipment = new BLL.Equipment();
|
var engine_pump_list = bll_equipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
if (engine_pump_list == null || !engine_pump_list.Any())
|
return default;
|
|
var bll_monitor_point = new BLL.MonitorPoint();
|
var bll_equipment_monitor_mapping = new BLL.EquipmentMonitorMapping();
|
var bll_monitor_data_set = new BLL.MonitorDataSet();
|
|
var pump_paras_dict = new Dictionary<int, Model.Pump>();
|
var pump_monitor_point_dict = new Dictionary<int, Tuple<List<Model.MonitorPointExSignalWithSignalType>, List<Model.MonitorPointExSignalWithSignalType>>>();
|
|
var signal_ids = new List<long>();
|
foreach (var ep in engine_pump_list)
|
{
|
var pump = bll_equipment.GetChildPumpByEnginePumpID(ep.ID);
|
if (pump == null)
|
continue;
|
var ep_monitor_mapping_list = bll_equipment_monitor_mapping.GetByEquipmentID(ep.ID);
|
if (ep_monitor_mapping_list == null || !ep_monitor_mapping_list.Any())
|
continue;
|
var ep_monitor_point_ids = ep_monitor_mapping_list.Select(x => x.MonitorPointID).ToList();
|
var ep_monitor_point_list = bll_monitor_point.GetExSignalWithSignalTypeByIds(ep_monitor_point_ids);
|
if (ep_monitor_point_list == null || !ep_monitor_point_list.Any())
|
continue;
|
var model_pump_monitor_point_list = ep_monitor_point_list
|
.Where(x => !string.IsNullOrEmpty(x.TagName) && x.SignalType != IStation.SignalType.频率 && x.Flags != null && !x.Flags.Contains(Flags.总站))
|
.ToList();
|
|
pump_paras_dict.Add(ep.SortCode, pump.RatedParas);
|
pump_monitor_point_dict.Add(ep.SortCode, new Tuple<List<MonitorPointExSignalWithSignalType>, List<MonitorPointExSignalWithSignalType>>(ep_monitor_point_list, model_pump_monitor_point_list));
|
signal_ids.AddRange(ep_monitor_point_list.Select(x => x.SignalID));
|
}
|
|
var station_monitor_point_list = bll_monitor_point.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
station_monitor_point_list = station_monitor_point_list?
|
.Where(x => !string.IsNullOrEmpty(x.TagName) && x.Flags != null && x.Flags.Contains(IStation.Flags.总站))
|
.ToList();
|
if (station_monitor_point_list != null && station_monitor_point_list.Any())
|
{
|
signal_ids.AddRange(station_monitor_point_list.Select(x => x.SignalID));
|
}
|
|
signal_ids = signal_ids.Distinct().ToList();
|
|
var month_signal_record_packet_list = new List<Model.StationSignalRecordPacket>(year_month_list.Count);
|
foreach (var year_month in year_month_list)
|
{
|
var year = year_month.Year;
|
var month = year_month.Month;
|
|
var summaries = bll_summary.GetAllByDate(monitorDataSourcesId, year, month);
|
if (summaries == null || !summaries.Any())
|
continue;
|
|
var min_time = summaries.Min(x => x.MinTime);
|
var max_time = summaries.Max(x => x.MaxTime);
|
var total_seconds = (int)(max_time - min_time).TotalSeconds;
|
|
var start_day = min_time;
|
var day_count = (max_time - min_time).Days;
|
var capacity = CalcuCapacity(day_count, timeStep);// 每个月的数据量
|
|
var month_signal_record_packet = new Model.StationSignalRecordPacket();
|
month_signal_record_packet.StationID = stationId;
|
month_signal_record_packet.Year = year;
|
month_signal_record_packet.Month = month;
|
month_signal_record_packet.StationSignalRecords = new List<Model.StationSignalRecord>(capacity);
|
|
var find_index_dict = new Dictionary<long, int>();// 查找数据下标
|
var record_dict = new Dictionary<long, double>();// 数据字典
|
signal_ids.ForEach(x =>
|
{
|
find_index_dict.Add(x, 0);
|
record_dict.Add(x, IStation.Error.Default);
|
});
|
|
var signal_record_packet_list = bll_monitor_data_set.GetSignalRecordPacket(monitorDataSourcesId, signal_ids, year, month);
|
if (signal_record_packet_list == null || !signal_record_packet_list.Any())
|
continue;
|
|
for (int i = 0; i <= day_count; i++) //按天整理数据
|
{
|
var day = start_day.AddDays(i);
|
for (int seconds = 0; seconds < TotalSecondsOfDay; seconds += timeStep) //00点的数据不要
|
{
|
var current_time = day.AddSeconds(seconds);
|
GetRecordDict(current_time, signal_record_packet_list, find_index_dict, record_dict, timeStep, out bool existRecord);
|
if (!existRecord)
|
continue;
|
double total_flow = 0;
|
List<double> pressure_list = new List<double>();
|
var station_signal_record = new Model.StationSignalRecord();
|
station_signal_record.Time = current_time;
|
station_signal_record.ModelRecordDict = new Dictionary<string, double>();
|
station_signal_record.PumpSignalRecords = new List<Model.PumpSignalRecord>();
|
|
if (station_monitor_point_list != null && station_monitor_point_list.Any())
|
{
|
foreach (var item in station_monitor_point_list)
|
{
|
var value = record_dict[item.SignalID];
|
if (item.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
pressure_list.Add(value);
|
}
|
else if (item.SignalType == IStation.SignalType.瞬时流量)
|
{
|
total_flow += value;
|
}
|
|
station_signal_record.ModelRecordDict.Add(item.TagName, value);
|
}
|
}
|
|
station_signal_record.TotalFlow = total_flow;
|
station_signal_record.TotalPressure = pressure_list.Average();
|
|
foreach (var pump_item in pump_monitor_point_dict)
|
{
|
var key = pump_item.Key;
|
var pump_paras = pump_paras_dict[key];
|
var pump_monitor_point_list = pump_item.Value.Item1;
|
var model_pump_monitor_point_list = pump_item.Value.Item2;
|
if (model_pump_monitor_point_list != null && model_pump_monitor_point_list.Any())
|
{
|
foreach (var item in model_pump_monitor_point_list)
|
{
|
var value = record_dict[item.SignalID];
|
if (item.SignalType == IStation.SignalType.转速)
|
{
|
value = value / pump_paras.Nr;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (item.SignalType == IStation.SignalType.频率)
|
{
|
value = value / 50;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (item.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
}
|
else if (item.SignalType == IStation.SignalType.瞬时流量)
|
{
|
value = value < 0 ? 0 : value;
|
}
|
station_signal_record.ModelRecordDict.Add(item.TagName, value);
|
}
|
}
|
|
var run_status = pump_monitor_point_list.Find(x => x.Identifier == IStation.SignalType.运行状态);
|
if (run_status != null && record_dict[run_status.SignalID] != IStation.Error.Default)
|
{
|
if (record_dict[run_status.SignalID] < 1)
|
{
|
continue;
|
}
|
}
|
else
|
{
|
continue;
|
}
|
|
double flow_value = 0;
|
var flow = pump_monitor_point_list.Find(x => x.Identifier == IStation.SignalType.瞬时流量 && !x.Flags.Contains(IStation.Flags.总站));
|
if (flow != null)
|
{
|
flow_value = record_dict[flow.SignalID];
|
}
|
else
|
{
|
if (total_flow < 1)
|
{
|
continue;
|
}
|
}
|
|
|
|
var rpm = pump_monitor_point_list.Find(x => x.Identifier == IStation.SignalType.转速);
|
var frequency = pump_monitor_point_list.Find(x => x.Identifier == IStation.SignalType.频率);
|
var inlet_pressure = pump_monitor_point_list.Find(x => x.Flags != null && x.Identifier == IStation.SignalType.压力 && x.Flags.Contains(IStation.LogicFlags.进口));
|
var outlet_pressure = pump_monitor_point_list.Find(x => x.Flags != null && x.Identifier == IStation.SignalType.压力 && x.Flags.Contains(IStation.LogicFlags.出口));
|
var power = pump_monitor_point_list.Find(x => x.Identifier == IStation.SignalType.有功功率);
|
|
var pump_signal_record = new Model.PumpSignalRecord();
|
pump_signal_record.FlowRate = flow_value;
|
pump_signal_record.Flag = key;
|
if (rpm != null)
|
{
|
pump_signal_record.Rpm = record_dict[rpm.SignalID];
|
}
|
if (frequency != null)
|
{
|
pump_signal_record.Frequency = record_dict[frequency.SignalID];
|
}
|
|
var inlet_wl = pump_monitor_point_list.Find(x => x.Flags != null && x.Identifier == IStation.SignalType.水位 && x.Flags.Contains(IStation.LogicFlags.进口));
|
if (inlet_wl != null)
|
{
|
pump_signal_record.WaterLevel = record_dict[inlet_wl.SignalID];
|
}
|
|
if (inlet_pressure != null)
|
{
|
pump_signal_record.InletPressure = record_dict[inlet_pressure.SignalID];
|
}
|
else if (inlet_wl != null && pump_signal_record.WaterLevel != IStation.Error.Default)
|
{
|
pump_signal_record.InletPressure = Model.CurveCalcuHelper.M2Mpa(pump_signal_record.WaterLevel);
|
}
|
|
if (outlet_pressure != null)
|
{
|
pump_signal_record.OutletPressure = record_dict[outlet_pressure.SignalID];
|
}
|
|
pump_signal_record.Head = pump_signal_record.OutletPressure;//初始化扬程
|
if (pump_signal_record.InletPressure != IStation.Error.Default && pump_signal_record.OutletPressure != IStation.Error.Default)
|
{
|
var h = Model.CurveCalcuHelper.Mpa2M(pump_signal_record.OutletPressure - pump_signal_record.InletPressure);
|
pump_signal_record.Head = h + Model.CurveCalcuHelper.CalculateOtherPress(pump_signal_record.FlowRate, pump_paras?.Ic, pump_paras?.Oc, pump_paras?.Ie, pump_paras?.Oe);//测量扬程=压差 + 表位差 + 流速
|
}
|
|
if (power != null)
|
{
|
pump_signal_record.InstantaneousPower = record_dict[power.SignalID];
|
}
|
|
pump_signal_record.Round();
|
station_signal_record.PumpSignalRecords.Add(pump_signal_record);
|
|
}
|
|
if (station_signal_record.PumpSignalRecords.Count < 1)
|
{
|
continue;
|
}
|
|
var pump_total_flow = station_signal_record.PumpSignalRecords.Sum(x => x.FlowRate);
|
|
station_signal_record.DiffFlow = total_flow - pump_total_flow;
|
station_signal_record.PumpRunCount = station_signal_record.PumpSignalRecords.Count;
|
month_signal_record_packet.StationSignalRecords.Add(station_signal_record);
|
}
|
}
|
|
month_signal_record_packet_list.Add(month_signal_record_packet);
|
}
|
return month_signal_record_packet_list;
|
}
|
|
|
/// <summary>
|
/// 分析月数据集合并保存
|
/// </summary>
|
/// <param name="stationId">泵站标识</param>
|
/// <param name="monitorDataSourcesId">数据来源</param>
|
/// <param name="timeStep">时间步长</param>
|
/// <returns></returns>
|
public List<Model.StationSignalRecordPacket> AnalysisAndSave(long monitorDataSourcesId, long stationId, int timeStep = 300)
|
{
|
var bll = new DAL.StationSignalRecordPacket();
|
bll.Clear(monitorDataSourcesId, stationId);
|
|
var monthSignalRecordPackets = Analysis(monitorDataSourcesId, stationId, timeStep);
|
bll.Save(monitorDataSourcesId, stationId, monthSignalRecordPackets);
|
return monthSignalRecordPackets;
|
}
|
|
}
|
}
|