using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
|
namespace IStation.WinFrmUI
|
{
|
/// <summary>
|
/// 导出 Epanet 所需数据
|
/// </summary>
|
public partial class ExportEpanetHelper
|
{
|
|
public class TimeValue
|
{
|
public DateTime Time { get; set; }
|
public Dictionary<string, double> Value { get; set; }
|
}
|
|
public class DayValue
|
{
|
public int Year { get; set; }
|
public int Month { get; set; }
|
public int Day { get; set; }
|
public List<TimeValue> TimeValueList { get; set; }
|
}
|
|
public class DataColumn
|
{
|
public string Title { get; set; }
|
public int Index { get; set; }
|
public List<TimeValue> TimeValueList { get; set; }
|
}
|
|
static BLL.StationSignalRecordPacket _packet = new BLL.StationSignalRecordPacket();
|
|
/// <summary>
|
/// 按天导出
|
/// </summary>
|
/// <param name="monitorDataSourcesId"></param>
|
/// <param name="stationId"></param>
|
/// <param name="year"></param>
|
/// <param name="month"></param>
|
/// <param name="timeStep"></param>
|
/// <returns></returns>
|
public static bool ExportByDay(long monitorDataSourcesId, long stationId, int year, int month, int timeStep = 300)
|
{
|
var station = new BLL.Station().GetByID(stationId);
|
if (station == null)
|
return default;
|
var bllSummary = new BLL.MonitorDataSetSummary();
|
|
|
var bllEquipment = new BLL.Equipment();
|
var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
if (enginePumps == null || !enginePumps.Any())
|
return default;
|
|
var bllMonitorPoint = new BLL.MonitorPoint();
|
var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping();
|
var bllMonitorDataSet = new BLL.MonitorDataSet();
|
|
|
var pumpParasDict = new Dictionary<int, Model.Pump>();
|
var pumpMonitorPointDict = new Dictionary<int, List<Model.MonitorPointExSignalWithSignalType>>();
|
var stationMonitorPointList = new List<Model.MonitorPointExSignalWithSignalType>();
|
var signalIds = new List<long>();
|
foreach (var enginePump in enginePumps)
|
{
|
var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID);
|
if (pump == null)
|
continue;
|
var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID);
|
if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any())
|
continue;
|
var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList();
|
var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds);
|
monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
|
monitorPoints = monitorPoints?.Where(x => x.SignalType != IStation.SignalType.频率).ToList();
|
monitorPoints = monitorPoints?.Where(x => x.Flags != null && !x.Flags.Contains(Flags.总站)).ToList();
|
if (monitorPoints == null || !monitorPoints.Any())
|
continue;
|
pumpParasDict.Add(enginePump.SortCode, pump.RatedParas);
|
pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints);
|
signalIds.AddRange(monitorPoints.Select(x => x.SignalID));
|
}
|
|
var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
|
stationMonitorPointList = monitorPoints_station?
|
.Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList();
|
if (stationMonitorPointList != null && stationMonitorPointList.Any())
|
{
|
signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID));
|
}
|
|
signalIds = signalIds.Distinct().ToList();
|
|
var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month);
|
if (summaries == null || !summaries.Any())
|
return default;
|
|
var minTime = summaries.Min(x => x.MinTime);
|
var maxTime = summaries.Max(x => x.MaxTime);
|
var totalSeconds = (int)(maxTime - minTime).TotalSeconds;
|
|
var startDay = minTime;//.AddDays(1);
|
var days = (maxTime - minTime).Days;
|
var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量
|
|
|
var findIndexDict = new Dictionary<long, int>();// 查找数据下标
|
var recordDict = new Dictionary<long, double>();// 数据字典
|
signalIds.ForEach(x =>
|
{
|
findIndexDict.Add(x, 0);
|
recordDict.Add(x, IStation.Error.Default);
|
});
|
|
var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month);
|
if (signalRecordPackets == null || !signalRecordPackets.Any())
|
return default;
|
|
|
|
var stationName = station.Name;
|
var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList();
|
var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList();
|
|
var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Eapnet验证数据", stationName);
|
if (!Directory.Exists(root_folder))
|
{
|
Directory.CreateDirectory(root_folder);
|
}
|
|
var dayValueList = new List<DayValue>();
|
//按天整理数据
|
for (int i = 0; i <= days; i++)
|
{
|
var day = startDay.AddDays(i);
|
var mode_excel_day_data_column_list = new List<DataColumn>();
|
|
var dayValue = new DayValue();
|
dayValue.Year = day.Year;
|
dayValue.Month = day.Month;
|
dayValue.Day = day.Day;
|
dayValue.TimeValueList = new List<TimeValue>();
|
|
//分割步长
|
for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要
|
{
|
var realTime = day.AddSeconds(seconds);
|
_packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord);
|
if (!existRecord)
|
continue;
|
|
var timeValue = new TimeValue
|
{
|
Time = realTime,
|
Value = new Dictionary<string, double>()
|
};
|
|
if (stationMonitorPointList != null && stationMonitorPointList.Any())
|
{
|
foreach (var stationMonitorPoint in stationMonitorPointList)
|
{
|
var time = realTime;
|
var value = recordDict[stationMonitorPoint.SignalID];
|
if (stationMonitorPoint.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
}
|
else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
|
{
|
value = value < 0 ? 0 : value;
|
}
|
timeValue.Value.Add(stationMonitorPoint.TagName, value);
|
}
|
}
|
|
foreach (var pumpMonitorPointItem in pumpMonitorPointDict)
|
{
|
var key = pumpMonitorPointItem.Key;
|
var pumpParas = pumpParasDict[key];
|
var pumpMonitorPointList = pumpMonitorPointItem.Value;
|
foreach (var pumpMonitorPoint in pumpMonitorPointList)
|
{
|
var time = realTime;
|
var value = recordDict[pumpMonitorPoint.SignalID];
|
if (pumpMonitorPoint.SignalType == IStation.SignalType.转速)
|
{
|
value = value / pumpParas.Nr;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率)
|
{
|
value = value / 50;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
|
{
|
value = value < 0 ? 0 : value;
|
}
|
timeValue.Value.Add(pumpMonitorPoint.TagName, value);
|
}
|
}
|
|
dayValue.TimeValueList.Add(timeValue);
|
}
|
dayValueList.Add(dayValue);
|
}
|
|
if (dayValueList == null || !dayValueList.Any())
|
return false;
|
foreach (var dayValue in dayValueList)
|
{
|
var day = dayValue.Day;
|
var fileName = root_folder + "\\" + new DateTime(year, month, day).ToString("D") + ".json";
|
var json = JsonHelper.Object2Json(dayValue.TimeValueList);
|
File.WriteAllText(fileName, json);
|
}
|
|
return true;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="monitorDataSourcesId"></param>
|
/// <param name="stationId"></param>
|
/// <param name="year"></param>
|
/// <param name="month"></param>
|
/// <param name="timeStep"></param>
|
/// <returns></returns>
|
public static bool Export(long monitorDataSourcesId, long stationId, int timeStep = 300)
|
{
|
var station = new BLL.Station().GetByID(stationId);
|
if (station == null)
|
return default;
|
var bllSummary = new BLL.MonitorDataSetSummary();
|
var yearMonths = bllSummary.GetYearMonth(monitorDataSourcesId);
|
|
var bllEquipment = new BLL.Equipment();
|
var enginePumps = bllEquipment.GetEnginePumpListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
if (enginePumps == null || !enginePumps.Any())
|
return default;
|
|
var bllMonitorPoint = new BLL.MonitorPoint();
|
var bllEquipmentMonitorMapping = new BLL.EquipmentMonitorMapping();
|
var bllMonitorDataSet = new BLL.MonitorDataSet();
|
|
|
var pumpParasDict = new Dictionary<int, Model.Pump>();
|
var pumpMonitorPointDict = new Dictionary<int, List<Model.MonitorPointExSignalWithSignalType>>();
|
var stationMonitorPointList = new List<Model.MonitorPointExSignalWithSignalType>();
|
var signalIds = new List<long>();
|
foreach (var enginePump in enginePumps)
|
{
|
var pump = bllEquipment.GetChildPumpByEnginePumpID(enginePump.ID);
|
if (pump == null)
|
continue;
|
var equipmentMonitorMappings = bllEquipmentMonitorMapping.GetByEquipmentID(enginePump.ID);
|
if (equipmentMonitorMappings == null || !equipmentMonitorMappings.Any())
|
continue;
|
var monitorPointIds = equipmentMonitorMappings.Select(x => x.MonitorPointID).ToList();
|
var monitorPoints = bllMonitorPoint.GetExSignalWithSignalTypeByIds(monitorPointIds);
|
monitorPoints = monitorPoints?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
|
monitorPoints = monitorPoints?.Where(x => x.SignalType != IStation.SignalType.频率).ToList();
|
monitorPoints = monitorPoints?.Where(x => x.Flags != null && !x.Flags.Contains(Flags.总站)).ToList();
|
if (monitorPoints == null || !monitorPoints.Any())
|
continue;
|
pumpParasDict.Add(enginePump.SortCode, pump.RatedParas);
|
pumpMonitorPointDict.Add(enginePump.SortCode, monitorPoints);
|
signalIds.AddRange(monitorPoints.Select(x => x.SignalID));
|
}
|
|
var monitorPoints_station = bllMonitorPoint.GetExSignalWithSignalTypeByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId);
|
monitorPoints_station = monitorPoints_station?.Where(x => !string.IsNullOrEmpty(x.TagName)).ToList();
|
stationMonitorPointList = monitorPoints_station?
|
.Where(x => x.Flags != null && x.Flags.Contains(IStation.Flags.总站)).ToList();
|
if (stationMonitorPointList != null && stationMonitorPointList.Any())
|
{
|
signalIds.AddRange(stationMonitorPointList.Select(x => x.SignalID));
|
}
|
|
signalIds = signalIds.Distinct().ToList();
|
|
|
var stationName = station.Name;
|
var pressure_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.压力).ToList();
|
var flow_monitor_points = monitorPoints_station.Where(x => x.SignalType == IStation.SignalType.瞬时流量).ToList();
|
|
var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Eapnet验证数据", stationName);
|
if (!Directory.Exists(root_folder))
|
{
|
Directory.CreateDirectory(root_folder);
|
}
|
|
foreach (var yearMonth in yearMonths)
|
{
|
var year = yearMonth.Year;
|
var month = yearMonth.Month;
|
|
var summaries = bllSummary.GetAllByDate(monitorDataSourcesId, year, month);
|
if (summaries == null || !summaries.Any())
|
return default;
|
|
var minTime = summaries.Min(x => x.MinTime);
|
var maxTime = summaries.Max(x => x.MaxTime);
|
var totalSeconds = (int)(maxTime - minTime).TotalSeconds;
|
|
var startDay = minTime;//.AddDays(1);
|
var days = (maxTime - minTime).Days;
|
var capacity = _packet.CalcuCapacity(days, timeStep);// 每个月的数据量
|
|
|
var findIndexDict = new Dictionary<long, int>();// 查找数据下标
|
var recordDict = new Dictionary<long, double>();// 数据字典
|
signalIds.ForEach(x =>
|
{
|
findIndexDict.Add(x, 0);
|
recordDict.Add(x, IStation.Error.Default);
|
});
|
|
var signalRecordPackets = bllMonitorDataSet.GetSignalRecordPacket(monitorDataSourcesId, signalIds, year, month);
|
if (signalRecordPackets == null || !signalRecordPackets.Any())
|
return default;
|
|
|
var dayValueList = new List<DayValue>();
|
//按天整理数据
|
for (int i = 0; i <= days; i++)
|
{
|
var day = startDay.AddDays(i);
|
var mode_excel_day_data_column_list = new List<DataColumn>();
|
|
var dayValue = new DayValue();
|
dayValue.Year = day.Year;
|
dayValue.Month = day.Month;
|
dayValue.Day = day.Day;
|
dayValue.TimeValueList = new List<TimeValue>();
|
|
//分割步长
|
for (int seconds = 0; seconds < _packet.TotalSecondsOfDay; seconds += timeStep) //00点的数据不要
|
{
|
var realTime = day.AddSeconds(seconds);
|
_packet.GetRecordDict(realTime, signalRecordPackets, findIndexDict, recordDict, timeStep, out bool existRecord);
|
if (!existRecord)
|
continue;
|
|
var timeValue = new TimeValue
|
{
|
Time = realTime,
|
Value = new Dictionary<string, double>()
|
};
|
|
if (stationMonitorPointList != null && stationMonitorPointList.Any())
|
{
|
foreach (var stationMonitorPoint in stationMonitorPointList)
|
{
|
var time = realTime;
|
var value = recordDict[stationMonitorPoint.SignalID];
|
if (stationMonitorPoint.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
}
|
else if (stationMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
|
{
|
value = value < 0 ? 0 : value;
|
}
|
timeValue.Value.Add(stationMonitorPoint.TagName, value);
|
}
|
}
|
|
foreach (var pumpMonitorPointItem in pumpMonitorPointDict)
|
{
|
var key = pumpMonitorPointItem.Key;
|
var pumpParas = pumpParasDict[key];
|
var pumpMonitorPointList = pumpMonitorPointItem.Value;
|
foreach (var pumpMonitorPoint in pumpMonitorPointList)
|
{
|
var time = realTime;
|
var value = recordDict[pumpMonitorPoint.SignalID];
|
if (pumpMonitorPoint.SignalType == IStation.SignalType.转速)
|
{
|
value = value / pumpParas.Nr;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.频率)
|
{
|
value = value / 50;
|
value = value < 0 ? 0 : value;
|
value = value > 1 ? 1 : value;
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.压力)
|
{
|
value = Model.CurveCalcuHelper.Mpa2M(value);
|
}
|
else if (pumpMonitorPoint.SignalType == IStation.SignalType.瞬时流量)
|
{
|
value = value < 0 ? 0 : value;
|
}
|
timeValue.Value.Add(pumpMonitorPoint.TagName, value);
|
}
|
}
|
|
dayValue.TimeValueList.Add(timeValue);
|
}
|
dayValueList.Add(dayValue);
|
}
|
|
if (dayValueList == null || !dayValueList.Any())
|
continue;
|
foreach (var dayValue in dayValueList)
|
{
|
var day = dayValue.Day;
|
var fileName = root_folder + "\\" + new DateTime(dayValue.Year, dayValue.Month, day).ToString("D") + ".json";
|
var json = JsonHelper.Object2Json(dayValue.TimeValueList);
|
File.WriteAllText(fileName, json);
|
}
|
}
|
|
return true;
|
}
|
|
|
|
|
}
|
}
|