using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace IStation.WinFrmUI
{
///
/// 导出 Epanet 所需数据
///
public partial class ExportEpanetHelper
{
public class TimeValue
{
public DateTime Time { get; set; }
public Dictionary Value { get; set; }
}
public class DayValue
{
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
public List TimeValueList { get; set; }
}
public class DataColumn
{
public string Title { get; set; }
public int Index { get; set; }
public List TimeValueList { get; set; }
}
static BLL.StationSignalRecordPacket _packet = new BLL.StationSignalRecordPacket();
///
/// 按天导出
///
///
///
///
///
///
///
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();
var pumpMonitorPointDict = new Dictionary>();
var stationMonitorPointList = new List();
var signalIds = new List();
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();// 查找数据下标
var recordDict = new Dictionary();// 数据字典
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();
//按天整理数据
for (int i = 0; i <= days; i++)
{
var day = startDay.AddDays(i);
var mode_excel_day_data_column_list = new List();
var dayValue = new DayValue();
dayValue.Year = day.Year;
dayValue.Month = day.Month;
dayValue.Day = day.Day;
dayValue.TimeValueList = new List();
//分割步长
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()
};
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;
}
///
///
///
///
///
///
///
///
///
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();
var pumpMonitorPointDict = new Dictionary>();
var stationMonitorPointList = new List();
var signalIds = new List();
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();// 查找数据下标
var recordDict = new Dictionary();// 数据字典
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();
//按天整理数据
for (int i = 0; i <= days; i++)
{
var day = startDay.AddDays(i);
var mode_excel_day_data_column_list = new List();
var dayValue = new DayValue();
dayValue.Year = day.Year;
dayValue.Month = day.Month;
dayValue.Day = day.Day;
dayValue.TimeValueList = new List();
//分割步长
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()
};
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;
}
}
}