using IStation.Epanet;
|
using IStation.Epanet.Enums;
|
using System.Text;
|
|
namespace IStation
|
{
|
public class HistoryScadaValidHelper
|
{
|
public static bool Analysis()
|
{
|
var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp";
|
if (!File.Exists(file_path))
|
return false;
|
|
var day_value_list = IStation.DayValueHelper.GetDayValues();
|
if (day_value_list == null || !day_value_list.Any())
|
return false;
|
|
var service_hydraulic_model_validation = new IStation.Service.HydraulicModelValidation();
|
var service_hydraulic_model_scada = new IStation.Service.HydraulicModelScada();
|
var service_hydraulic_model_record = new IStation.Service.HydraulicModelRecord();
|
|
var pressure_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"Jjd1","SPJD1"},
|
{"Jjd2","SPJD2"},
|
{"Jjd3","SPJD3"},
|
{"Jpump11","SPPump11" },
|
{"Jpump12","SPPump12" },
|
{"Jpump13","SPPump13" },
|
{"Jpump14","SPPump14" },
|
{"Jpump15","SPPump15" },
|
{"Jpump16","SPPump16" },
|
{"Jpump17","SPPump17" },
|
{"Jpump18","SPPump18" },
|
|
{"Jdn2400","SPDN2400"},
|
{"Jdn2700","SPDN2700"},
|
{"Jpump21","SPPump21"},
|
{"Jpump22","SPPump22"},
|
{"Jpump23","SPPump23"},
|
{"Jpump24","SPPump24"},
|
{"Jpump25","SPPump25"},
|
{"Jpump26","SPPump26"},
|
{"Jpump27","SPPump27"}
|
};
|
var flow_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"Pjd1","SFJD1"},
|
{"Pjd2","SFJD2"},
|
{"Pjd3","SFJD3"},
|
|
{"Pdn2400","SFDN2400"},
|
{"Pdn2700","SFDN2700"},
|
{"Ppump21","SFPump21"},
|
{"Ppump22","SFPump22"},
|
{"Ppump23","SFPump23"},
|
{"Ppump24","SFPump24"},
|
{"Ppump25","SFPump25"},
|
{"Ppump26","SFPump26"},
|
{"Ppump27","SFPump27"}
|
};
|
var pattern_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"R3", "R3"},
|
{"R2", "R2"},
|
{"R1", "R1"},
|
{"Pump11", "Pump11"},
|
{"Pump12", "Pump12"},
|
{"Pump13", "Pump13"},
|
{"Pump14", "Pump14"},
|
{"Pump15", "Pump15"},
|
{"Pump16", "Pump16"},
|
{"Pump17", "Pump17"},
|
{"Pump18", "Pump18"},
|
{"SFJD1", "SFJD1"},
|
{"SFJD2", "SFJD2"},
|
{"SFJD3", "SFJD3"},
|
|
{"RPump21", "RPump21"},
|
{"RPump22", "RPump22"},
|
{"RPump23", "RPump23"},
|
{"RPump24", "RPump24"},
|
{"RPump25", "RPump25"},
|
{"RPump26", "RPump26"},
|
{"RPump27", "RPump27"},
|
{"Pump21", "Pump21"},
|
{"Pump22", "Pump22"},
|
{"Pump23", "Pump23"},
|
{"Pump24", "Pump24"},
|
{"Pump25", "Pump25"},
|
{"Pump26", "Pump26"},
|
{"Pump27", "Pump27"},
|
{"SFPump21", "SFPump21"},
|
{"SFPump22", "SFPump22"},
|
{"SFPump23", "SFPump23"},
|
{"SFPump24", "SFPump24"},
|
{"SFPump25", "SFPump25"},
|
{"SFPump26", "SFPump26"},
|
{"SFPump27", "SFPump27"},
|
{"SFDN2400", "SFDN2400"},
|
{"SFDN2700", "SFDN2700"},
|
};
|
|
//var hydraulic_model_validation_config = new IStation.Model.HydraulicModelValidationConfig();
|
//hydraulic_model_validation_config.FlowIdMappingDict = flow_id_mapping_dict;
|
//hydraulic_model_validation_config.PressureIdMappingDict = pressure_id_mapping_dict;
|
//hydraulic_model_validation_config.PatternIdMappingDict = pattern_id_mapping_dict;
|
//var hydraulic_model_validation_config_json = Yw.JsonHelper.Object2Json(hydraulic_model_validation_config);
|
|
|
var pattern_list = new List<IStation.Hydraulic.Pattern>();
|
foreach (var pattern_id_mapping in pattern_id_mapping_dict)
|
{
|
var pattern = new IStation.Hydraulic.Pattern
|
{
|
Id = pattern_id_mapping.Key,
|
FactorList = new List<float>()
|
};
|
pattern_list.Add(pattern);
|
}
|
|
var log_msg = string.Empty;
|
var err = EpanetMethods.ENopen(file_path, "", "");
|
if (err != 0)
|
{
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
return default;
|
}
|
|
err = EpanetMethods.ENopenH();
|
if (err != 0)
|
{
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
return default;
|
}
|
|
var model_time_step = 0;
|
var model_id_build = new StringBuilder(31);
|
foreach (var day_value in day_value_list)
|
{
|
var date = $"{day_value.Year}-{day_value.Month}-{day_value.Day}";
|
Console.WriteLine($"模型分析,{date}");
|
|
var hydraulic_model_validation_list = new List<IStation.Model.HydraulicModelValidation>();
|
var hydraulic_model_record_list = new List<Model.HydraulicModelRecord>();
|
var hydraulic_model_scada_list = new List<Model.HydraulicModelScada>();
|
|
pattern_list.ForEach(x => x.FactorList.Clear());
|
var time_value_list = day_value.TimeValueList.OrderBy(x => x.Time).ToList();
|
foreach (var time_value in time_value_list)
|
{
|
var time = time_value.Time;
|
var value_dict = time_value.Value;
|
foreach (var value_item in value_dict)
|
{
|
var scada_id = value_item.Key;
|
var scada_value = value_item.Value;
|
var pattern = pattern_list.Find(x => x.Id == scada_id);
|
if (pattern != null)
|
{
|
pattern.FactorList.Add((float)scada_value);
|
}
|
}
|
}
|
|
var pattern_init = true;
|
foreach (var pattern in pattern_list)
|
{
|
var patternId = pattern.Id;
|
var pattern_factor_array = pattern.FactorList.ToArray();
|
var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length;
|
err = EpanetMethods.ENgetpatternindex(patternId, out int pattern_index);
|
if (err != ErrorCode.Ok)
|
{
|
pattern_init = false;
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count);
|
if (err != ErrorCode.Ok)
|
{
|
pattern_init = false;
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
}
|
|
if (!pattern_init)
|
{
|
log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!";
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
|
|
EpanetMethods.ENinitH(0);
|
do
|
{
|
EpanetMethods.ENrunH(out int current_ts);
|
EpanetMethods.ENgetcount(CountType.Link, out int link_count);
|
EpanetMethods.ENgetcount(CountType.Node, out int node_count);
|
|
var current_time = TimeSpan.FromSeconds(current_ts);
|
var time_value = time_value_list.Find(x => x.Time.TimeOfDay == current_time);
|
if (time_value != null)
|
{
|
var time = time_value.Time;
|
var scada_value_dcit = time_value.Value;
|
|
var verify_id = Yw.YitIdHelper.NextId();
|
var hydraulic_model_validation = new IStation.Model.HydraulicModelValidation();
|
hydraulic_model_validation.ID = verify_id;
|
hydraulic_model_validation.Time = time;
|
hydraulic_model_validation_list.Add(hydraulic_model_validation);
|
|
foreach (var valud_item in scada_value_dcit)
|
{
|
var hydraulic_model_scada = new Model.HydraulicModelScada();
|
hydraulic_model_scada.VerificationID = verify_id;
|
hydraulic_model_scada.Time = time;
|
hydraulic_model_scada.Tag = valud_item.Key;
|
hydraulic_model_scada.Value = valud_item.Value;
|
hydraulic_model_scada_list.Add(hydraulic_model_scada);
|
}
|
|
for (int link_index = 1; link_index <= link_count; link_index++)
|
{
|
if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok)
|
continue;
|
var model_id = model_id_build.ToString();
|
if (flow_id_mapping_dict.ContainsKey(model_id))
|
{
|
var scada_id = flow_id_mapping_dict[model_id];
|
var scada_value = scada_value_dcit[scada_id];
|
EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value);
|
|
var record = new IStation.Model.HydraulicModelRecord();
|
record.VerificationID = verify_id;
|
record.Time = time;
|
record.ModelId = model_id;
|
record.ScadaId = scada_id;
|
record.ValueType = IStation.eValueType.Flow;
|
record.ModelValue = (double)model_value;
|
record.ScadaValue = scada_value;
|
if (record.ModelValue.HasValue)
|
record.ModelValue = Math.Abs(record.ModelValue.Value);
|
record.DifferenceValue = record.ScadaValue - record.ModelValue;
|
hydraulic_model_record_list.Add(record);
|
}
|
|
}
|
|
for (int node_index = 1; node_index <= node_count; node_index++)
|
{
|
if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok)
|
continue;
|
var model_id = model_id_build.ToString();
|
if (pressure_id_mapping_dict.ContainsKey(model_id))
|
{
|
var scada_id = pressure_id_mapping_dict[model_id];
|
var scada_value = scada_value_dcit[scada_id];
|
|
EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value);
|
|
var record = new IStation.Model.HydraulicModelRecord();
|
record.VerificationID = verify_id;
|
record.Time = time;
|
record.ModelId = model_id;
|
record.ScadaId = scada_id;
|
record.ValueType = IStation.eValueType.Head;
|
record.ModelValue = (double)model_value;
|
record.ScadaValue = scada_value;
|
if (record.ModelValue.HasValue)
|
record.ModelValue = Math.Abs(record.ModelValue.Value);
|
record.DifferenceValue = record.ScadaValue - record.ModelValue;
|
hydraulic_model_record_list.Add(record);
|
}
|
}
|
}
|
|
EpanetMethods.ENnextH(out model_time_step);
|
|
} while (model_time_step > 0);
|
|
|
var bol = service_hydraulic_model_validation.Inserts(hydraulic_model_validation_list);
|
if (!bol)
|
{
|
var msg = $"{date}:hydraulic_model_validation_list 插入异常";
|
Console.WriteLine(msg);
|
Yw.LogHelper.Info(msg);
|
}
|
|
bol = service_hydraulic_model_scada.Inserts(hydraulic_model_scada_list);
|
if (!bol)
|
{
|
var msg = $"{date}:hydraulic_model_scada_list 插入异常";
|
Console.WriteLine(msg);
|
Yw.LogHelper.Info(msg);
|
}
|
|
bol = service_hydraulic_model_record.Inserts(hydraulic_model_record_list);
|
if (!bol)
|
{
|
var msg = $"{date}:hydraulic_model_record_list 插入异常";
|
Console.WriteLine(msg);
|
Yw.LogHelper.Info(msg);
|
}
|
}
|
|
EpanetMethods.ENcloseH();
|
|
return true;
|
}
|
|
|
public static bool Statistics
|
(
|
int minQ,
|
int maxQ,
|
int spaceQ,
|
out List<AvgStatisticsS1ViewModel> avg_statistics_station1_vm_list,
|
out List<AvgStatisticsS2ViewModel> avg_statistics_station2_vm_list
|
)
|
{
|
avg_statistics_station1_vm_list = new List<AvgStatisticsS1ViewModel>();
|
avg_statistics_station2_vm_list = new List<AvgStatisticsS2ViewModel>();
|
|
var avg_statistics_station1_vm_list_temp = new List<AvgStatisticsS1ViewModel>();
|
var avg_statistics_station2_vm_list_temp = new List<AvgStatisticsS2ViewModel>();
|
|
var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp";
|
if (!File.Exists(file_path))
|
return false;
|
|
#region day_value_list
|
|
var day_value_list = IStation.DayValueHelper.GetDayValues();
|
if (day_value_list == null || !day_value_list.Any())
|
return false;
|
|
var pressure_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"Jjd1","SPJD1"},
|
{"Jjd2","SPJD2"},
|
{"Jjd3","SPJD3"},
|
{"Jpump11","SPPump11" },
|
{"Jpump12","SPPump12" },
|
{"Jpump13","SPPump13" },
|
{"Jpump14","SPPump14" },
|
{"Jpump15","SPPump15" },
|
{"Jpump16","SPPump16" },
|
{"Jpump17","SPPump17" },
|
{"Jpump18","SPPump18" },
|
|
{"Jdn2400","SPDN2400"},
|
{"Jdn2700","SPDN2700"},
|
{"Jpump21","SPPump21"},
|
{"Jpump22","SPPump22"},
|
{"Jpump23","SPPump23"},
|
{"Jpump24","SPPump24"},
|
{"Jpump25","SPPump25"},
|
{"Jpump26","SPPump26"},
|
{"Jpump27","SPPump27"}
|
};
|
var flow_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"Pjd1","SFJD1"},
|
{"Pjd2","SFJD2"},
|
{"Pjd3","SFJD3"},
|
|
{"Pdn2400","SFDN2400"},
|
{"Pdn2700","SFDN2700"},
|
{"Ppump21","SFPump21"},
|
{"Ppump22","SFPump22"},
|
{"Ppump23","SFPump23"},
|
{"Ppump24","SFPump24"},
|
{"Ppump25","SFPump25"},
|
{"Ppump26","SFPump26"},
|
{"Ppump27","SFPump27"}
|
};
|
var pattern_id_mapping_dict = new Dictionary<string, string>()
|
{
|
{"R3", "R3"},
|
{"R2", "R2"},
|
{"R1", "R1"},
|
{"Pump11", "Pump11"},
|
{"Pump12", "Pump12"},
|
{"Pump13", "Pump13"},
|
{"Pump14", "Pump14"},
|
{"Pump15", "Pump15"},
|
{"Pump16", "Pump16"},
|
{"Pump17", "Pump17"},
|
{"Pump18", "Pump18"},
|
{"SFJD1", "SFJD1"},
|
{"SFJD2", "SFJD2"},
|
{"SFJD3", "SFJD3"},
|
|
{"RPump21", "RPump21"},
|
{"RPump22", "RPump22"},
|
{"RPump23", "RPump23"},
|
{"RPump24", "RPump24"},
|
{"RPump25", "RPump25"},
|
{"RPump26", "RPump26"},
|
{"RPump27", "RPump27"},
|
{"Pump21", "Pump21"},
|
{"Pump22", "Pump22"},
|
{"Pump23", "Pump23"},
|
{"Pump24", "Pump24"},
|
{"Pump25", "Pump25"},
|
{"Pump26", "Pump26"},
|
{"Pump27", "Pump27"},
|
{"SFPump21", "SFPump21"},
|
{"SFPump22", "SFPump22"},
|
{"SFPump23", "SFPump23"},
|
{"SFPump24", "SFPump24"},
|
{"SFPump25", "SFPump25"},
|
{"SFPump26", "SFPump26"},
|
{"SFPump27", "SFPump27"},
|
{"SFDN2400", "SFDN2400"},
|
{"SFDN2700", "SFDN2700"},
|
};
|
|
|
var pattern_list = new List<IStation.Hydraulic.Pattern>();
|
foreach (var pattern_id_mapping in pattern_id_mapping_dict)
|
{
|
var pattern = new IStation.Hydraulic.Pattern
|
{
|
Id = pattern_id_mapping.Key,
|
FactorList = new List<float>()
|
};
|
pattern_list.Add(pattern);
|
}
|
|
#endregion
|
|
#region init
|
|
var log_msg = string.Empty;
|
var err = EpanetMethods.ENopen(file_path, "", "");
|
if (err != 0)
|
{
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
return default;
|
}
|
|
err = EpanetMethods.ENopenH();
|
if (err != 0)
|
{
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
return default;
|
}
|
#endregion
|
|
var model_time_step = 0;
|
var model_id_build = new StringBuilder(31);
|
foreach (var day_value in day_value_list)
|
{
|
var date = $"{day_value.Year}-{day_value.Month}-{day_value.Day}";
|
Console.WriteLine($"模型分析,{date}");
|
|
var model_scada_valid_vm_list = new List<ModelScadaValidViewModel>();
|
var hydraulic_model_record_dict = new Dictionary<DateTime, List<Model.HydraulicModelRecord>>();
|
|
|
pattern_list.ForEach(x => x.FactorList.Clear());
|
var time_value_list = day_value.TimeValueList.OrderBy(x => x.Time).ToList();
|
foreach (var time_value in time_value_list)
|
{
|
var time = time_value.Time;
|
var value_dict = time_value.Value;
|
foreach (var value_item in value_dict)
|
{
|
var scada_id = value_item.Key;
|
var scada_value = value_item.Value;
|
var pattern = pattern_list.Find(x => x.Id == scada_id);
|
if (pattern != null)
|
{
|
pattern.FactorList.Add((float)scada_value);
|
}
|
}
|
}
|
|
var pattern_init = true;
|
foreach (var pattern in pattern_list)
|
{
|
var patternId = pattern.Id;
|
var pattern_factor_array = pattern.FactorList.ToArray();
|
var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length;
|
err = EpanetMethods.ENgetpatternindex(patternId, out int pattern_index);
|
if (err != ErrorCode.Ok)
|
{
|
pattern_init = false;
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count);
|
if (err != ErrorCode.Ok)
|
{
|
pattern_init = false;
|
log_msg = err.GetMsg();
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
}
|
|
if (!pattern_init)
|
{
|
log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!";
|
Console.WriteLine(log_msg);
|
Yw.LogHelper.Info(log_msg);
|
continue;
|
}
|
|
EpanetMethods.ENinitH(0);
|
do
|
{
|
EpanetMethods.ENrunH(out int current_ts);
|
EpanetMethods.ENgetcount(CountType.Link, out int link_count);
|
EpanetMethods.ENgetcount(CountType.Node, out int node_count);
|
|
var current_time = TimeSpan.FromSeconds(current_ts);
|
var time_value = time_value_list.Find(x => x.Time.TimeOfDay == current_time);
|
if (time_value != null)
|
{
|
var time = time_value.Time;
|
var scada_dict = time_value.Value;
|
|
var verify_id = Yw.YitIdHelper.NextId();
|
|
var vm = new ModelScadaValidViewModel();
|
vm.Time = time;
|
vm.R1s = scada_dict["R1"];
|
vm.R2s = scada_dict["R2"];
|
vm.R3s = scada_dict["R3"];
|
vm.RPump21s = scada_dict["RPump21"];
|
vm.RPump22s = scada_dict["RPump22"];
|
vm.RPump23s = scada_dict["RPump23"];
|
vm.RPump24s = scada_dict["RPump24"];
|
vm.RPump25s = scada_dict["RPump25"];
|
vm.RPump26s = scada_dict["RPump26"];
|
vm.RPump27s = scada_dict["RPump27"];
|
|
|
vm.DN2700Ps = scada_dict["SPDN2700"];
|
vm.DN2400Ps = scada_dict["SPDN2400"];
|
vm.JD1Ps = scada_dict["SPJD1"];
|
vm.JD2Ps = scada_dict["SPJD2"];
|
vm.JD3Ps = scada_dict["SPJD3"];
|
vm.Pump11Ps = scada_dict["SPPump11"];
|
vm.Pump12Ps = scada_dict["SPPump12"];
|
vm.Pump13Ps = scada_dict["SPPump13"];
|
vm.Pump14Ps = scada_dict["SPPump14"];
|
vm.Pump15Ps = scada_dict["SPPump15"];
|
vm.Pump16Ps = scada_dict["SPPump16"];
|
vm.Pump17Ps = scada_dict["SPPump17"];
|
vm.Pump18Ps = scada_dict["SPPump18"];
|
vm.Pump21Ps = scada_dict["SPPump21"];
|
vm.Pump22Ps = scada_dict["SPPump22"];
|
vm.Pump23Ps = scada_dict["SPPump23"];
|
vm.Pump24Ps = scada_dict["SPPump24"];
|
vm.Pump25Ps = scada_dict["SPPump25"];
|
vm.Pump26Ps = scada_dict["SPPump26"];
|
vm.Pump27Ps = scada_dict["SPPump27"];
|
|
vm.DN2700Fs = scada_dict["SFDN2700"];
|
vm.DN2400Fs = scada_dict["SFDN2400"];
|
vm.JD1Fs = scada_dict["SFJD1"];
|
vm.JD2Fs = scada_dict["SFJD2"];
|
vm.JD3Fs = scada_dict["SFJD3"];
|
vm.Pump21Fs = scada_dict["SFPump21"];
|
vm.Pump22Fs = scada_dict["SFPump22"];
|
vm.Pump23Fs = scada_dict["SFPump23"];
|
vm.Pump24Fs = scada_dict["SFPump24"];
|
vm.Pump25Fs = scada_dict["SFPump25"];
|
vm.Pump26Fs = scada_dict["SFPump26"];
|
vm.Pump27Fs = scada_dict["SFPump27"];
|
|
vm.Pump11s = scada_dict["Pump11"];
|
vm.Pump11s = scada_dict["Pump11"];
|
vm.Pump12s = scada_dict["Pump12"];
|
vm.Pump13s = scada_dict["Pump13"];
|
vm.Pump14s = scada_dict["Pump14"];
|
vm.Pump15s = scada_dict["Pump15"];
|
vm.Pump16s = scada_dict["Pump16"];
|
vm.Pump17s = scada_dict["Pump17"];
|
vm.Pump18s = scada_dict["Pump18"];
|
vm.Pump21s = scada_dict["Pump21"];
|
vm.Pump22s = scada_dict["Pump22"];
|
vm.Pump23s = scada_dict["Pump23"];
|
vm.Pump24s = scada_dict["Pump24"];
|
vm.Pump25s = scada_dict["Pump25"];
|
vm.Pump26s = scada_dict["Pump26"];
|
vm.Pump27s = scada_dict["Pump27"];
|
|
vm.Diff();
|
vm.Round();
|
model_scada_valid_vm_list.Add(vm);
|
|
hydraulic_model_record_dict[time] = new List<Model.HydraulicModelRecord>();
|
|
for (int link_index = 1; link_index <= link_count; link_index++)
|
{
|
if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok)
|
continue;
|
var model_id = model_id_build.ToString();
|
if (flow_id_mapping_dict.ContainsKey(model_id))
|
{
|
var scada_id = flow_id_mapping_dict[model_id];
|
var scada_value = scada_dict[scada_id];
|
EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value);
|
|
var record = new IStation.Model.HydraulicModelRecord();
|
record.VerificationID = verify_id;
|
record.Time = time;
|
record.ModelId = model_id;
|
record.ScadaId = scada_id;
|
record.ValueType = IStation.eValueType.Flow;
|
record.ModelValue = (double)model_value;
|
record.ScadaValue = scada_value;
|
if (record.ModelValue.HasValue)
|
record.ModelValue = Math.Abs(record.ModelValue.Value);
|
record.DifferenceValue = record.ScadaValue - record.ModelValue;
|
hydraulic_model_record_dict[time].Add(record);
|
}
|
|
}
|
|
for (int node_index = 1; node_index <= node_count; node_index++)
|
{
|
if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok)
|
continue;
|
var model_id = model_id_build.ToString();
|
if (pressure_id_mapping_dict.ContainsKey(model_id))
|
{
|
var scada_id = pressure_id_mapping_dict[model_id];
|
var scada_value = scada_dict[scada_id];
|
|
EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value);
|
|
var record = new IStation.Model.HydraulicModelRecord();
|
record.VerificationID = verify_id;
|
record.Time = time;
|
record.ModelId = model_id;
|
record.ScadaId = scada_id;
|
record.ValueType = IStation.eValueType.Head;
|
record.ModelValue = (double)model_value;
|
record.ScadaValue = scada_value;
|
if (record.ModelValue.HasValue)
|
record.ModelValue = Math.Abs(record.ModelValue.Value);
|
record.DifferenceValue = record.ScadaValue - record.ModelValue;
|
hydraulic_model_record_dict[time].Add(record);
|
}
|
}
|
}
|
|
|
EpanetMethods.ENnextH(out model_time_step);
|
|
} while (model_time_step > 0);
|
|
var combineStatisticsViewModelList = new List<CombineStatisticsViewModel>();
|
foreach (var item in hydraulic_model_record_dict)
|
{
|
var time = item.Key;
|
var list = item.Value;
|
|
if (list == null || !list.Any())
|
continue;
|
|
var model_record = model_scada_valid_vm_list.Find(x => x.Time == time);
|
if (model_record == null)
|
continue;
|
|
var model_record_dict = list.ToDictionary(x => x.ModelId, x => x.ModelValue);
|
|
model_record.DN2700P = model_record_dict["Jdn2700"];
|
model_record.DN2400P = model_record_dict["Jdn2400"];
|
model_record.JD1P = model_record_dict["Jjd1"];
|
model_record.JD2P = model_record_dict["Jjd2"];
|
model_record.JD3P = model_record_dict["Jjd3"];
|
model_record.Pump11P = model_record_dict["Jpump11"];
|
model_record.Pump12P = model_record_dict["Jpump12"];
|
model_record.Pump13P = model_record_dict["Jpump13"];
|
model_record.Pump14P = model_record_dict["Jpump14"];
|
model_record.Pump15P = model_record_dict["Jpump15"];
|
model_record.Pump16P = model_record_dict["Jpump16"];
|
model_record.Pump17P = model_record_dict["Jpump17"];
|
model_record.Pump18P = model_record_dict["Jpump18"];
|
model_record.Pump21P = model_record_dict["Jpump21"];
|
model_record.Pump22P = model_record_dict["Jpump22"];
|
model_record.Pump23P = model_record_dict["Jpump23"];
|
model_record.Pump24P = model_record_dict["Jpump24"];
|
model_record.Pump25P = model_record_dict["Jpump25"];
|
model_record.Pump26P = model_record_dict["Jpump26"];
|
model_record.Pump27P = model_record_dict["Jpump27"];
|
|
|
model_record.DN2700F = model_record_dict["Pdn2700"];
|
model_record.DN2400F = model_record_dict["Pdn2400"];
|
model_record.JD1F = model_record_dict["Pjd1"];
|
model_record.JD2F = model_record_dict["Pjd2"];
|
model_record.JD3F = model_record_dict["Pjd3"];
|
model_record.Pump21F = model_record_dict["Ppump21"];
|
model_record.Pump22F = model_record_dict["Ppump22"];
|
model_record.Pump23F = model_record_dict["Ppump23"];
|
model_record.Pump24F = model_record_dict["Ppump24"];
|
model_record.Pump25F = model_record_dict["Ppump25"];
|
model_record.Pump26F = model_record_dict["Ppump26"];
|
model_record.Pump27F = model_record_dict["Ppump27"];
|
model_record.Diff();
|
|
var combine_statistics_vm = new CombineStatisticsViewModel(model_record);
|
combine_statistics_vm.Diff();
|
combine_statistics_vm.Statistics();
|
combineStatisticsViewModelList.Add(combine_statistics_vm);
|
}
|
|
if (!combineStatisticsViewModelList.Any())
|
continue;
|
for (int currentMinQ = minQ; currentMinQ <= maxQ; currentMinQ += spaceQ)
|
{
|
|
var currentMaxQ = currentMinQ + spaceQ;
|
var combineS1 = combineStatisticsViewModelList
|
.Where(x => x.TotalFlow1 >= currentMinQ && x.TotalFlow1 <= currentMaxQ)
|
.ToList();
|
if (combineS1 != null && combineS1.Any())
|
{
|
var combineS1Group = combineS1.GroupBy(x => new { x.RunFlags1, x.RunCount1 }).ToList();
|
foreach (var item in combineS1Group)
|
{
|
if (item.Key.RunCount1 < 1)
|
continue;
|
var list = FiltrationS1(item.ToList());
|
if (list == null || list.Count() < 5)
|
continue;
|
var avg1 = new AvgStatisticsS1ViewModel();
|
avg1.MinTotalFlow = currentMinQ;
|
avg1.MaxTotalFlow = currentMaxQ;
|
avg1.RunCount = item.Key.RunCount1;
|
avg1.RunFlags = item.Key.RunFlags1;
|
|
|
avg1.Pump11Pd = item.Where(x => x.Pump11Pd.HasValue).Average(x => x.Pump11Pd);
|
avg1.Pump12Pd = item.Where(x => x.Pump12Pd.HasValue).Average(x => x.Pump12Pd);
|
avg1.Pump13Pd = item.Where(x => x.Pump13Pd.HasValue).Average(x => x.Pump13Pd);
|
avg1.Pump14Pd = item.Where(x => x.Pump14Pd.HasValue).Average(x => x.Pump14Pd);
|
avg1.Pump15Pd = item.Where(x => x.Pump15Pd.HasValue).Average(x => x.Pump15Pd);
|
avg1.Pump16Pd = item.Where(x => x.Pump16Pd.HasValue).Average(x => x.Pump16Pd);
|
avg1.Pump17Pd = item.Where(x => x.Pump17Pd.HasValue).Average(x => x.Pump17Pd);
|
avg1.Pump18Pd = item.Where(x => x.Pump18Pd.HasValue).Average(x => x.Pump18Pd);
|
|
avg1.TimeCount = item.Count();
|
avg1.Round();
|
|
avg_statistics_station1_vm_list_temp.Add(avg1);
|
}
|
|
}
|
|
|
var combineS2 = combineStatisticsViewModelList
|
.Where(x => x.TotalFlow2 >= currentMinQ && x.TotalFlow2 <= currentMaxQ)
|
.ToList();
|
if (combineS2 != null && combineS2.Any())
|
{
|
var combineS2Group = combineS2.GroupBy(x => new { x.RunFlags2, x.RunCount2 }).ToList();
|
foreach (var item in combineS2Group)
|
{
|
if (item.Key.RunCount2 < 1)
|
continue;
|
var list = FiltrationS2(item.ToList());
|
if (list == null || list.Count() < 5)
|
continue;
|
var avg2 = new AvgStatisticsS2ViewModel();
|
avg2.MinTotalFlow = currentMinQ;
|
avg2.MaxTotalFlow = currentMaxQ;
|
avg2.RunCount = item.Key.RunCount2;
|
avg2.RunFlags = item.Key.RunFlags2;
|
|
|
avg2.Pump21Pd = item.Where(x => x.Pump21Pd.HasValue).Average(x => x.Pump21Pd);
|
avg2.Pump22Pd = item.Where(x => x.Pump22Pd.HasValue).Average(x => x.Pump22Pd);
|
avg2.Pump23Pd = item.Where(x => x.Pump23Pd.HasValue).Average(x => x.Pump23Pd);
|
avg2.Pump24Pd = item.Where(x => x.Pump24Pd.HasValue).Average(x => x.Pump24Pd);
|
avg2.Pump25Pd = item.Where(x => x.Pump25Pd.HasValue).Average(x => x.Pump25Pd);
|
avg2.Pump26Pd = item.Where(x => x.Pump26Pd.HasValue).Average(x => x.Pump26Pd);
|
avg2.Pump27Pd = item.Where(x => x.Pump27Pd.HasValue).Average(x => x.Pump27Pd);
|
|
|
|
avg2.TimeCount = item.Count();
|
avg2.Round();
|
|
avg_statistics_station2_vm_list_temp.Add(avg2);
|
}
|
}
|
}
|
}
|
EpanetMethods.ENcloseH();
|
|
if (avg_statistics_station1_vm_list_temp.Any())
|
{
|
var temp_group = avg_statistics_station1_vm_list_temp.GroupBy(x => new { x.MinTotalFlow, x.MaxTotalFlow, x.RunFlags,x.RunCount });
|
foreach (var group in temp_group)
|
{
|
var key = group.Key;
|
var list = group;
|
|
var avg1 = new AvgStatisticsS1ViewModel();
|
avg1.MinTotalFlow = key.MinTotalFlow;
|
avg1.MaxTotalFlow = key.MaxTotalFlow;
|
avg1.RunCount = key.RunCount;
|
avg1.RunFlags = key.RunFlags;
|
avg1.TimeCount = group.Sum(x => x.TimeCount);
|
|
avg1.Pump11Pd = list.Where(x => x.Pump11Pd.HasValue).Average(x => x.Pump11Pd);
|
avg1.Pump12Pd = list.Where(x => x.Pump12Pd.HasValue).Average(x => x.Pump12Pd);
|
avg1.Pump13Pd = list.Where(x => x.Pump13Pd.HasValue).Average(x => x.Pump13Pd);
|
avg1.Pump14Pd = list.Where(x => x.Pump14Pd.HasValue).Average(x => x.Pump14Pd);
|
avg1.Pump15Pd = list.Where(x => x.Pump15Pd.HasValue).Average(x => x.Pump15Pd);
|
avg1.Pump16Pd = list.Where(x => x.Pump16Pd.HasValue).Average(x => x.Pump16Pd);
|
avg1.Pump17Pd = list.Where(x => x.Pump17Pd.HasValue).Average(x => x.Pump17Pd);
|
avg1.Pump18Pd = list.Where(x => x.Pump18Pd.HasValue).Average(x => x.Pump18Pd);
|
avg_statistics_station1_vm_list.Add(avg1);
|
}
|
}
|
|
if (avg_statistics_station2_vm_list_temp.Any())
|
{
|
var temp_group = avg_statistics_station2_vm_list_temp.GroupBy(x => new { x.MinTotalFlow, x.MaxTotalFlow, x.RunFlags, x.RunCount });
|
foreach (var group in temp_group)
|
{
|
var key = group.Key;
|
var list = group;
|
|
var avg2 = new AvgStatisticsS2ViewModel();
|
avg2.MinTotalFlow = key.MinTotalFlow;
|
avg2.MaxTotalFlow = key.MaxTotalFlow;
|
avg2.RunCount = key.RunCount;
|
avg2.RunFlags = key.RunFlags;
|
avg2.TimeCount = group.Sum(x => x.TimeCount);
|
|
avg2.Pump21Pd = list.Where(x => x.Pump21Pd.HasValue).Average(x => x.Pump21Pd);
|
avg2.Pump22Pd = list.Where(x => x.Pump22Pd.HasValue).Average(x => x.Pump22Pd);
|
avg2.Pump23Pd = list.Where(x => x.Pump23Pd.HasValue).Average(x => x.Pump23Pd);
|
avg2.Pump24Pd = list.Where(x => x.Pump24Pd.HasValue).Average(x => x.Pump24Pd);
|
avg2.Pump25Pd = list.Where(x => x.Pump25Pd.HasValue).Average(x => x.Pump25Pd);
|
avg2.Pump26Pd = list.Where(x => x.Pump26Pd.HasValue).Average(x => x.Pump26Pd);
|
avg2.Pump27Pd = list.Where(x => x.Pump27Pd.HasValue).Average(x => x.Pump27Pd);
|
avg_statistics_station2_vm_list.Add(avg2);
|
}
|
}
|
|
|
return true;
|
}
|
|
private static double _ps_min_diff = 0.6;
|
|
private static List<CombineStatisticsViewModel> FiltrationS1(List<CombineStatisticsViewModel> vm_list)
|
{
|
if (vm_list == null || !vm_list.Any())
|
return default;
|
|
var list = new List<CombineStatisticsViewModel>();
|
foreach (var vm in vm_list)
|
{
|
var jd1 = Math.Abs(vm.JD1Pd ?? 1);
|
var jd2 = Math.Abs(vm.JD2Pd ?? 1);
|
var jd3 = Math.Abs(vm.JD3Pd ?? 1);
|
|
if (jd1 > _ps_min_diff)
|
continue;
|
if (jd2 > _ps_min_diff)
|
continue;
|
if (jd3 > _ps_min_diff)
|
continue;
|
list.Add(vm);
|
}
|
|
return list;
|
}
|
|
private static List<CombineStatisticsViewModel> FiltrationS2(List<CombineStatisticsViewModel> vm_list)
|
{
|
if (vm_list == null || !vm_list.Any())
|
return default;
|
|
var list = new List<CombineStatisticsViewModel>();
|
foreach (var vm in vm_list)
|
{
|
var dn2400 = Math.Abs(vm.DN2400Pd ?? 1);
|
var dn2700 = Math.Abs(vm.DN2700Pd ?? 1);
|
|
if (dn2400 > _ps_min_diff)
|
continue;
|
if (dn2700 > _ps_min_diff)
|
continue;
|
list.Add(vm);
|
}
|
|
return list;
|
}
|
}
|
|
}
|