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; } } }