Shuxia Ning
2024-08-06 1d5b344c8be498c9989f3fe2e9846b1dcc919cb8
Test/IStation.Win/View/CorrectionFactorView.cs
@@ -1,8 +1,5 @@
using DevExpress.XtraEditors;
using IStation.Epanet;
using IStation.Epanet.Enums;
using System.Data;
using System.Text;
using IStation.Test.Init;
namespace IStation.Win
{
@@ -14,20 +11,15 @@
            this.layoutControl1.SetupLayoutControl();
            this.bandedGridView1.SetNormalView();
            this.bandedGridView1.OptionsView.ColumnAutoWidth = false;
            this.gridView2.SetNormalView();
            this.bandedGridView2.SetNormalView();
            this.bandedGridView2.OptionsView.ColumnAutoWidth = false;
            this.dtDay.SetOnlyShowDate();
            this.dtDay.DateTime = new DateTime(2024, 3, 2);
            this.dtDay.DateTime = new DateTime(2024, 6, 5);
            this.colTime.Visible = true;
            this.colTotalFlow1.Visible = false;
            this.colTotalHead1.Visible = false;
            this.colRunFlags1.Visible = false;
            this.colTotalFlow2.Visible = true;
            this.colTotalHead2.Visible = true;
            this.colRunFlags2.Visible = true;
            this.gbSum.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left;
            this.gbSum1.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left;
            ShowWL(false);
            ShowFlow(false);
@@ -38,13 +30,28 @@
            ShowFlow(false);
            ShowPump(true);
            ShowPressure(true);
            ShowScada(false);
            ShowModel(false);
            this.cekStation1.Checked = true;
            this.cekStation2.Checked = false;
        }
        #region Show
        private void ShowScada(bool v)
        {
            this.gbScada.Visible = v;
            this.gbScada1.Visible = v;
        }
        private void ShowModel(bool v)
        {
            this.gbModel.Visible = v;
            this.gbModel1.Visible = v;
        }
        private void ShowWL(bool v)
        {
            this.colR1.Visible = v;
            this.colR2.Visible = v;
            this.colR3.Visible = v;
        {
            this.colRPump21.Visible = v;
            this.colRPump22.Visible = v;
            this.colRPump23.Visible = v;
@@ -52,7 +59,12 @@
            this.colRPump25.Visible = v;
            this.colRPump26.Visible = v;
            this.colRPump27.Visible = v;
            this.colR1.Visible = v;
            this.colR2.Visible = v;
            this.colR3.Visible = v;
        }
        private void ShowFlow(bool v)
        {
            this.colDN2400F.Visible = v;
@@ -86,14 +98,9 @@
            this.colPump26FDiff.Visible = v;
            this.colPump27FDiff.Visible = v;
            if (v)
            {
                return;
            }
            this.colJD1FDiff.Visible = v;
            this.colJD2FDiff.Visible = v;
            this.colJD3FDiff.Visible = v;
            this.colJD1FM.Visible = v;
            this.colJD2FM.Visible = v;
@@ -103,85 +110,80 @@
            this.colJD1F.Visible = v;
            this.colJD2F.Visible = v;
            this.colJD3F.Visible = v;
        }
        }
        private void ShowPressure(bool v)
        {
        {
            this.colDN2400P.Visible = v;
            this.colDN2700P.Visible = v;
            this.colPump21P.Visible = v;
            this.colPump22P.Visible = v;
            this.colPump23P.Visible = v;
            this.colPump24P.Visible = v;
            this.colPump25P.Visible = v;
            this.colPump26P.Visible = v;
            this.colPump27P.Visible = v;
            this.colPump21P.Visible = false;
            this.colPump22P.Visible = false;
            this.colPump23P.Visible = false;
            this.colPump24P.Visible = false;
            this.colPump25P.Visible = false;
            this.colPump26P.Visible = false;
            this.colPump27P.Visible = false;
            this.colDN2400PM.Visible = v;
            this.colDN2700PM.Visible = v;
            this.colPump21PM.Visible = v;
            this.colPump22PM.Visible = v;
            this.colPump23PM.Visible = v;
            this.colPump24PM.Visible = v;
            this.colPump25PM.Visible = v;
            this.colPump26PM.Visible = v;
            this.colPump27PM.Visible = v;
            this.colPump21PM.Visible = false;
            this.colPump22PM.Visible = false;
            this.colPump23PM.Visible = false;
            this.colPump24PM.Visible = false;
            this.colPump25PM.Visible = false;
            this.colPump26PM.Visible = false;
            this.colPump27PM.Visible = false;
            this.colDN2400PDiff.Visible = v;
            this.colDN2700PDiff.Visible = v;
            this.colPump21PDiff.Visible = v;
            this.colPump22PDiff.Visible = v;
            this.colPump23PDiff.Visible = v;
            this.colPump24PDiff.Visible = v;
            this.colPump25PDiff.Visible = v;
            this.colPump26PDiff.Visible = v;
            this.colPump27PDiff.Visible = v;
            this.colPump21PDiff.Visible = false;
            this.colPump22PDiff.Visible = false;
            this.colPump23PDiff.Visible = false;
            this.colPump24PDiff.Visible = false;
            this.colPump25PDiff.Visible = false;
            this.colPump26PDiff.Visible = false;
            this.colPump27PDiff.Visible = false;
            if (v)
            {
                return;
            }
            this.colJD1P.Visible = v;
            this.colJD2P.Visible = v;
            this.colJD3P.Visible = v;
            this.colPump11P.Visible = v;
            this.colPump12P.Visible = v;
            this.colPump13P.Visible = v;
            this.colPump14P.Visible = v;
            this.colPump15P.Visible = v;
            this.colPump16P.Visible = v;
            this.colPump17P.Visible = v;
            this.colPump18P.Visible = v;
            this.colPump11P.Visible = false;
            this.colPump12P.Visible = false;
            this.colPump13P.Visible = false;
            this.colPump14P.Visible = false;
            this.colPump15P.Visible = false;
            this.colPump16P.Visible = false;
            this.colPump17P.Visible = false;
            this.colPump18P.Visible = false;
            this.colJD1PM.Visible = v;
            this.colJD2PM.Visible = v;
            this.colJD3PM.Visible = v;
            this.colPump11PM.Visible = v;
            this.colPump12PM.Visible = v;
            this.colPump13PM.Visible = v;
            this.colPump14PM.Visible = v;
            this.colPump15PM.Visible = v;
            this.colPump16PM.Visible = v;
            this.colPump17PM.Visible = v;
            this.colPump18PM.Visible = v;
            this.colPump11PM.Visible = false;
            this.colPump12PM.Visible = false;
            this.colPump13PM.Visible = false;
            this.colPump14PM.Visible = false;
            this.colPump15PM.Visible = false;
            this.colPump16PM.Visible = false;
            this.colPump17PM.Visible = false;
            this.colPump18PM.Visible = false;
            this.colJD1PDiff.Visible = v;
            this.colJD2PDiff.Visible = v;
            this.colJD3PDiff.Visible = v;
            this.colPump11PDiff.Visible = v;
            this.colPump12PDiff.Visible = v;
            this.colPump13PDiff.Visible = v;
            this.colPump14PDiff.Visible = v;
            this.colPump15PDiff.Visible = v;
            this.colPump16PDiff.Visible = v;
            this.colPump17PDiff.Visible = v;
            this.colPump18PDiff.Visible = v;
            this.colPump11PDiff.Visible = false;
            this.colPump12PDiff.Visible = false;
            this.colPump13PDiff.Visible = false;
            this.colPump14PDiff.Visible = false;
            this.colPump15PDiff.Visible = false;
            this.colPump16PDiff.Visible = false;
            this.colPump17PDiff.Visible = false;
            this.colPump18PDiff.Visible = false;
        }
        }
        private void ShowPump(bool v)
        {
            this.colPump21.Visible = v;
@@ -191,7 +193,6 @@
            this.colPump25.Visible = v;
            this.colPump26.Visible = v;
            this.colPump27.Visible = v;
            this.colPump21M.Visible = v;
            this.colPump22M.Visible = v;
@@ -210,11 +211,6 @@
            this.colPump27Diff.Visible = v;
            if (v)
            {
                return;
            }
            this.colPump11.Visible = v;
            this.colPump12.Visible = v;
            this.colPump13.Visible = v;
@@ -243,142 +239,19 @@
            this.colPump18Diff.Visible = v;
        }
        private List<ScadaScheduleViewModel> _scada_vm_list = null;
        private List<CorrectionFactorViewModel> _correction_factor_vm_list = null;
        #endregion
        //调度
        private void btnSchedule_Click(object sender, EventArgs e)
        {
            var service_station = new Service.Station();
            var service_schedule_config = new Service.ScheduleConfig();
            var hydraulic_model_file = System.IO.Path.Combine(
                Settings.ParasHelper.LocalFile.DataFolderDirectory,
                Settings.ParasHelper.LocalFile.HydraulicModelFile);
        #region dict
            _scada_vm_list = new List<ScadaScheduleViewModel>();
            _correction_factor_vm_list = new List<CorrectionFactorViewModel>();
            var day = this.dtDay.DateTime;
            var day_value = IStation.DayValueHelper.GetDayValue(day);
            if (day_value == null)
        private Dictionary<string, string> _flow_id_mapping_dict1 = new Dictionary<string, string>()
            {
                XtraMessageBox.Show("无法加载日期数据!");
                return;
            }
            var bol = CorrectionFactorHelper.Analysis(day_value, out Dictionary<string, List<Tuple<int, double, double[]>>> correction_factor_dict);
            if (!bol)
            {
                XtraMessageBox.Show("无法加载修正系数!");
                return;
            }
            if (correction_factor_dict == null || !correction_factor_dict.Any())
            {
                XtraMessageBox.Show("无法加载修正系数!");
                return;
            }
                {"Pjd1","SFJD1"},
                {"Pjd2","SFJD2"},
                {"Pjd3","SFJD3"},
        };
            WaitHelper.ShowWaitForm();
            var time_value_list = day_value.TimeValueList;
            foreach (var time_value in time_value_list)
            {
                var time = time_value.Time;
                var scada_value_dict = time_value.Value;
                var vm = new ScadaScheduleViewModel();
                vm.Time = time;
                vm.R1 = scada_value_dict["R1"];
                vm.R2 = scada_value_dict["R2"];
                vm.R3 = scada_value_dict["R3"];
                vm.RPump21 = scada_value_dict["RPump21"];
                vm.RPump22 = scada_value_dict["RPump22"];
                vm.RPump23 = scada_value_dict["RPump23"];
                vm.RPump24 = scada_value_dict["RPump24"];
                vm.RPump25 = scada_value_dict["RPump25"];
                vm.RPump26 = scada_value_dict["RPump26"];
                vm.RPump27 = scada_value_dict["RPump27"];
                vm.JD1P = scada_value_dict["SPJD1"];
                vm.JD2P = scada_value_dict["SPJD2"];
                vm.JD3P = scada_value_dict["SPJD3"];
                vm.Pump11P = scada_value_dict["SPPump11"];
                vm.Pump12P = scada_value_dict["SPPump12"];
                vm.Pump13P = scada_value_dict["SPPump13"];
                vm.Pump14P = scada_value_dict["SPPump14"];
                vm.Pump15P = scada_value_dict["SPPump15"];
                vm.Pump16P = scada_value_dict["SPPump16"];
                vm.Pump17P = scada_value_dict["SPPump17"];
                vm.Pump18P = scada_value_dict["SPPump18"];
                vm.DN2400P = scada_value_dict["SPDN2400"];
                vm.DN2700P = scada_value_dict["SPDN2700"];
                vm.Pump21P = scada_value_dict["SPPump21"];
                vm.Pump22P = scada_value_dict["SPPump22"];
                vm.Pump23P = scada_value_dict["SPPump23"];
                vm.Pump24P = scada_value_dict["SPPump24"];
                vm.Pump25P = scada_value_dict["SPPump25"];
                vm.Pump26P = scada_value_dict["SPPump26"];
                vm.Pump27P = scada_value_dict["SPPump27"];
                vm.JD1F = scada_value_dict["SFJD1"];
                vm.JD2F = scada_value_dict["SFJD2"];
                vm.JD3F = scada_value_dict["SFJD3"];
                vm.DN2700F = scada_value_dict["SFDN2700"];
                vm.DN2400F = scada_value_dict["SFDN2400"];
                vm.Pump21F = scada_value_dict["SFPump21"];
                vm.Pump22F = scada_value_dict["SFPump22"];
                vm.Pump23F = scada_value_dict["SFPump23"];
                vm.Pump24F = scada_value_dict["SFPump24"];
                vm.Pump25F = scada_value_dict["SFPump25"];
                vm.Pump26F = scada_value_dict["SFPump26"];
                vm.Pump27F = scada_value_dict["SFPump27"];
                vm.Pump11 = scada_value_dict["Pump11"];
                vm.Pump12 = scada_value_dict["Pump12"];
                vm.Pump13 = scada_value_dict["Pump13"];
                vm.Pump14 = scada_value_dict["Pump14"];
                vm.Pump15 = scada_value_dict["Pump15"];
                vm.Pump16 = scada_value_dict["Pump16"];
                vm.Pump17 = scada_value_dict["Pump17"];
                vm.Pump18 = scada_value_dict["Pump18"];
                vm.Pump21 = scada_value_dict["Pump21"];
                vm.Pump22 = scada_value_dict["Pump22"];
                vm.Pump23 = scada_value_dict["Pump23"];
                vm.Pump24 = scada_value_dict["Pump24"];
                vm.Pump25 = scada_value_dict["Pump25"];
                vm.Pump26 = scada_value_dict["Pump26"];
                vm.Pump27 = scada_value_dict["Pump27"];
                vm.Sum();
                _scada_vm_list.Add(vm);
            }
            foreach (var correction_factor_group_item in correction_factor_dict)
            {
                var flags = correction_factor_group_item.Key;
                foreach (var item in correction_factor_group_item.Value)
                {
                    var vm = new CorrectionFactorViewModel
                    {
                        RunFlags = flags,
                        Flag = item.Item1,
                        Avg = item.Item2,
                        Mode = item.Item3,
                        ModeDisplay = Yw.Untity.DoubleListHelper.ToString(item.Item3)
                    };
                    _correction_factor_vm_list.Add(vm);
                }
            }
            this.correctionFactorViewModelBindingSource.DataSource=_correction_factor_vm_list;
            this.correctionFactorViewModelBindingSource.ResetBindings(false);
            #region init_dict
            var pressure_id_mapping_dict = new Dictionary<string, string>()
        private Dictionary<string, string> _pressure_id_mapping_dict1 = new Dictionary<string, string>()
            {
                {"Jjd1","SPJD1"},
                {"Jjd2","SPJD2"},
@@ -390,7 +263,47 @@
                {"Jpump15","SPPump15" },
                {"Jpump16","SPPump16" },
                {"Jpump17","SPPump17" },
                {"Jpump18","SPPump18" },
                {"Jpump18","SPPump18" }
            };
        private Dictionary<string, string> _pump_id_mapping_dict1 = new Dictionary<string, string>(){
                { "Pump11" , "Pump11"},
                { "Pump12" , "Pump12"},
                { "Pump13" , "Pump13"},
                { "Pump14" , "Pump14"},
                { "Pump15" , "Pump15"},
                { "Pump16" , "Pump16"},
                { "Pump17" , "Pump17"},
                { "Pump18" , "Pump18"},
            };
        private Dictionary<int, string> _flag_pattern_dict1 = new(){
                { GlobalHelper.Flag11 , "Pump11"},
                { GlobalHelper.Flag12 , "Pump12"},
                { GlobalHelper.Flag13 , "Pump13"},
                { GlobalHelper.Flag14 , "Pump14"},
                { GlobalHelper.Flag15 , "Pump15"},
                { GlobalHelper.Flag16 , "Pump16"},
                { GlobalHelper.Flag17 , "Pump17"},
                { GlobalHelper.Flag18 , "Pump18"},
        };
        private Dictionary<string, string> _flow_id_mapping_dict2 = new Dictionary<string, string>()
            {
                {"Pdn2400","SFDN2400"},
                {"Pdn2700","SFDN2700"},
                {"Ppump21","SFPump21"},
                {"Ppump22","SFPump22"},
                {"Ppump23","SFPump23"},
                {"Ppump24","SFPump24"},
                {"Ppump25","SFPump25"},
                {"Ppump26","SFPump26"},
                {"Ppump27","SFPump27"}
        };
        private Dictionary<string, string> _pressure_id_mapping_dict2 = new Dictionary<string, string>()
            {
                {"Jdn2400","SPDN2400"},
                {"Jdn2700","SPDN2700"},
                {"Jpump21","SPPump21"},
@@ -401,415 +314,211 @@
                {"Jpump26","SPPump26"},
                {"Jpump27","SPPump27"}
            };
            var flow_id_mapping_dict = new Dictionary<string, string>()
        private Dictionary<string, string> _pump_id_mapping_dict2 = new Dictionary<string, string>(){
                { "Pump21" , "Pump21"},
                { "Pump22" , "Pump22"},
                { "Pump23" , "Pump23"},
                { "Pump24" , "Pump24"},
                { "Pump25" , "Pump25"},
                { "Pump26" , "Pump26"},
                { "Pump27" , "Pump27"}
            };
        private Dictionary<int, string> _flag_pattern_dict2 = new(){
                { GlobalHelper.Flag21 ,"Pump21" },
                { GlobalHelper.Flag22 ,"Pump22" },
                { GlobalHelper.Flag23 ,"Pump23" },
                { GlobalHelper.Flag24 ,"Pump24" },
                { GlobalHelper.Flag25 ,"Pump25" },
                { GlobalHelper.Flag26 ,"Pump26" },
                { GlobalHelper.Flag27 ,"Pump27" }
        };
        #endregion
        //调度
        private void btnSchedule_Click(object sender, EventArgs e)
        {
            //var day = this.dtDay.DateTime;
            //var day_value = DayValueHelper.GetDayValue(day);
            //if (day_value == null)
            //{
            //    XtraMessageBox.Show("无法加载日期数据!");
            //    return;
            //}
            //this.memoInfo.Text = string.Empty;
            //var day_value_list = new List<DayValue>() { day_value };
            WaitHelper.ShowWaitForm();
            var msg = ScadaScheduleHelper.Schedule(
                  //day_value_list,
                  //this.cekStation1.Checked,
                  //this.cekStation2.Checked,
                  out List<Station1ScadaSchedule> all_station1_scada_schedule_list,
                  out List<Station2ScadaSchedule> all_station2_scada_schedule_list);
            this.station1ScadaScheduleBindingSource.DataSource = all_station1_scada_schedule_list;
            this.station1ScadaScheduleBindingSource.ResetBindings(false);
            this.bandedGridView2.BestFitColumns();
            this.station2ScadaScheduleBindingSource.DataSource = all_station2_scada_schedule_list;
            this.station2ScadaScheduleBindingSource.ResetBindings(false);
            this.bandedGridView1.BestFitColumns();
            this.memoInfo.Text = msg;
            WaitHelper.HideWaitForm();
        }
        #region event
        private void cekShowScada_CheckedChanged(object sender, EventArgs e)
        {
            ShowScada(this.cekShowScada.Checked);
        }
        private void cekShowModel_CheckedChanged(object sender, EventArgs e)
        {
            ShowModel(this.cekShowModel.Checked);
        }
        private void bandedGridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
        {
            if (e.CellValue != null)
            {
                {"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"},
                {"SFJD1", "SFJD1"},
                {"SFJD2", "SFJD2"},
                {"SFJD3", "SFJD3"},
                {"RPump21", "RPump21"},
                {"RPump22", "RPump22"},
                {"RPump23", "RPump23"},
                {"RPump24", "RPump24"},
                {"RPump25", "RPump25"},
                {"RPump26", "RPump26"},
                {"RPump27", "RPump27"},
                {"SFPump21", "SFPump21"},
                {"SFPump22", "SFPump22"},
                {"SFPump23", "SFPump23"},
                {"SFPump24", "SFPump24"},
                {"SFPump25", "SFPump25"},
                {"SFPump26", "SFPump26"},
                {"SFPump27", "SFPump27"},
                {"SFDN2400", "SFDN2400"},
                {"SFDN2700", "SFDN2700"},
            };
            var pump_id_mapping_dict_int = new Dictionary<string, int>(){
                { "Pump11",GlobalHelper.Flag11},
                { "Pump12",GlobalHelper.Flag12},
                { "Pump13",GlobalHelper.Flag13},
                { "Pump14",GlobalHelper.Flag14},
                { "Pump15",GlobalHelper.Flag15},
                { "Pump16",GlobalHelper.Flag16},
                { "Pump17",GlobalHelper.Flag17},
                { "Pump18",GlobalHelper.Flag18},
                { "Pump21",GlobalHelper.Flag21},
                { "Pump22",GlobalHelper.Flag22},
                { "Pump23",GlobalHelper.Flag23},
                { "Pump24",GlobalHelper.Flag24},
                { "Pump25",GlobalHelper.Flag25},
                { "Pump26",GlobalHelper.Flag26},
                { "Pump27",GlobalHelper.Flag27}
            };
            var pump_pressure_mapping_dict_int = new Dictionary<string, string>(){
                { "Pump11","Jpump11"},
                { "Pump12","Jpump12"},
                { "Pump13","Jpump13"},
                { "Pump14","Jpump14"},
                { "Pump15","Jpump15"},
                { "Pump16","Jpump16"},
                { "Pump17","Jpump17"},
                { "Pump18","Jpump18" },
                { "Pump21","Jpump21"},
                { "Pump22","Jpump22"},
                { "Pump23","Jpump23"},
                { "Pump24","Jpump24"},
                { "Pump25","Jpump25"},
                { "Pump26","Jpump26"},
                { "Pump27","Jpump27"}
            };
            #endregion
            #region init_config
            var station_info = service_station.Get();
            var station1 = station_info.Station1;
            var station2 = station_info.Station2;
            var station1_same_type_flag_group_first = GlobalHelper.Station1SameTypeFlagGroupFirst;
            var station2_same_type_flag_group_first = GlobalHelper.Station2SameTypeFlagGroupFirst;
            var station1_schedule_config = service_schedule_config.GetStation1();
            var station2_schedule_config = service_schedule_config.GetStation2();
            var station1_flag_list = GlobalHelper.Station1FlagList;
            var station2_flag_list = GlobalHelper.Station2FlagList;
            var pump_id_mapping_dict = GlobalHelper.ModelPumpIdMappingDict;
            var flag_nr_mapping_dict = GlobalHelper.GetFlagNrMappingDict();
            var pump_pattern_custom_dict = new Dictionary<string, double>();
            var pattern_dict = new Dictionary<string, float[]>();
            var scada_dict = new Dictionary<string, double>();
            var pattern_dict_temp = new Dictionary<string, float[]>();
            #endregion
            var helper = new IStation.Algorithm.ScheduleHelper();
            foreach (var time_value in time_value_list)
            {
                var time = time_value.Time;
                var scada_value_dict = time_value.Value;
                var vm = _scada_vm_list.Find(x => x.Time == time);
                pump_pattern_custom_dict.Clear();
                pattern_dict.Clear();
                scada_dict.Clear();
                foreach (var item in pump_id_mapping_dict_int)
                if (e.Column == this.colDN2400PDiff || e.Column == this.colDN2700PDiff)
                {
                    pump_pattern_custom_dict[item.Key] = 0;
                }
                foreach (var zy_scada in scada_value_dict)
                {
                    var tag = zy_scada.Key;
                    var value = zy_scada.Value;
                    foreach (var item in pattern_id_mapping_dict)
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        if (item.Key == tag)
                        if (Math.Abs(value) > 0.5)
                        {
                            var pattern_id = item.Key;
                            var factor = value;
                            pattern_dict.Add(pattern_id, new float[] { (float)factor });
                            break;
                            e.Appearance.ForeColor = Color.Red;
                        }
                    }
                    foreach (var item in flow_id_mapping_dict)
                    {
                        if (item.Value != tag)
                            continue;
                        scada_dict.Add(tag, value);
                    }
                    foreach (var item in pressure_id_mapping_dict)
                    {
                        if (item.Value != tag)
                            continue;
                        var pressure_value = value;
                        scada_dict.Add(tag, pressure_value);
                    }
                }
                var pump_model_scada_diff_dict = new Dictionary<string, double?>(){
                { "Pump11",vm.Pump11},
                { "Pump12",vm.Pump12},
                { "Pump13",vm.Pump13},
                { "Pump14",vm.Pump14},
                { "Pump15",vm.Pump15},
                { "Pump16",vm.Pump16},
                { "Pump17",vm.Pump17},
                { "Pump18",vm.Pump18},
                { "Pump21",vm.Pump21},
                { "Pump22",vm.Pump22},
                { "Pump23",vm.Pump23},
                { "Pump24",vm.Pump24},
                { "Pump25",vm.Pump25},
                { "Pump26",vm.Pump26},
                { "Pump27",vm.Pump27}
                };
                var target_flow1 = vm.TotalFlow1;
                var target_head1 = vm.TotalHead1;
                var target_flow2 = vm.TotalFlow2;
                var target_head2 = vm.TotalHead2;
                CorrectionFactorHelper.OutOpenFlagList(scada_value_dict, out List<int> station1_open_flag_list, out List<int> station2_open_flag_list);
                CorrectionFactorHelper.OutWaterLevel(scada_value_dict, out Dictionary<int, double> station1_flag_inlet_water_level_dict, out Dictionary<int, double> station2_flag_inlet_water_level_dict);
                helper.Initial(station2_open_flag_list, station2_schedule_config);
                if (_correction_factor_vm_list != null && _correction_factor_vm_list.Any())
                else if
                        (
                        e.Column == this.colPump21Diff ||
                        e.Column == this.colPump22Diff ||
                        e.Column == this.colPump23Diff ||
                        e.Column == this.colPump24Diff ||
                        e.Column == this.colPump25Diff ||
                        e.Column == this.colPump26Diff ||
                        e.Column == this.colPump27Diff
                        )
                {
                    var station2_open_flag_list_str = Yw.Untity.IntListHelper.ToString(station2_open_flag_list);
                    var correction_factor_vm_list = _correction_factor_vm_list.Where(x => x.RunFlags.Equals(station2_open_flag_list_str)).ToList();
                    if (correction_factor_vm_list != null && correction_factor_vm_list.Any())
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        if (this.cekUseMode.Checked)
                        if (value > 0)
                        {
                            var correction_factor_dict_diff2 = correction_factor_vm_list.ToDictionary(x => x.Flag, y => y.Mode.FirstOrDefault());
                            helper.InitCorrectionFactorDict(correction_factor_dict_diff2);
                            e.Appearance.ForeColor = Color.Red;
                        }
                        else
                        {
                            var correction_factor_dict_diff2 = correction_factor_vm_list.ToDictionary(x => x.Flag, y => y.Avg);
                            helper.InitCorrectionFactorDict(correction_factor_dict_diff2);
                            e.Appearance.ForeColor = Color.Green;
                        }
                    }
                }
                var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_same_type_flag_group_first, station2_flag_inlet_water_level_dict, null, target_flow2, target_head2);
                var station2_open_flag_list_bak = station2_open_flag_list.Select(x => x).ToList();
                if (optimal_combine2 != null)
                else if
                       (
                       e.Column == this.colTotalPowerDiff
                        )
                {
                    station2_open_flag_list = new List<int>();
                    foreach (var fre_pump in optimal_combine2.AnaFrePumps)
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        var flag = fre_pump.Flag;
                        var modelId = pump_id_mapping_dict[flag];
                        pump_pattern_custom_dict[modelId] = fre_pump.Frequency / 50;
                        if (fre_pump.Frequency > 0)
                        if (value > 0)
                        {
                            station2_open_flag_list.Add(flag);
                            e.Appearance.ForeColor = Color.Red;
                        }
                        else
                        {
                            e.Appearance.ForeColor = Color.Green;
                        }
                    }
                }
                pattern_dict_temp.Clear();
                foreach (var item in pattern_dict)
                    pattern_dict_temp.Add(item.Key, item.Value);
                foreach (var item in pump_pattern_custom_dict)
                    pattern_dict_temp.Add(item.Key, new float[] { (float)item.Value });
                var record_list = Verify(999, time, hydraulic_model_file, flow_id_mapping_dict, pressure_id_mapping_dict, pattern_dict_temp, scada_value_dict);
                var model_value_dict = record_list.ToDictionary(x => x.ScadaId, y => y.ModelValue);
                vm.JD1PM = model_value_dict["SPJD1"];
                vm.JD2PM = model_value_dict["SPJD2"];
                vm.JD3PM = model_value_dict["SPJD3"];
                vm.Pump11PM = model_value_dict["SPPump11"];
                vm.Pump12PM = model_value_dict["SPPump12"];
                vm.Pump13PM = model_value_dict["SPPump13"];
                vm.Pump14PM = model_value_dict["SPPump14"];
                vm.Pump15PM = model_value_dict["SPPump15"];
                vm.Pump16PM = model_value_dict["SPPump16"];
                vm.Pump17PM = model_value_dict["SPPump17"];
                vm.Pump18PM = model_value_dict["SPPump18"];
                vm.DN2400PM = model_value_dict["SPDN2400"];
                vm.DN2700PM = model_value_dict["SPDN2700"];
                vm.Pump21PM = model_value_dict["SPPump21"];
                vm.Pump22PM = model_value_dict["SPPump22"];
                vm.Pump23PM = model_value_dict["SPPump23"];
                vm.Pump24PM = model_value_dict["SPPump24"];
                vm.Pump25PM = model_value_dict["SPPump25"];
                vm.Pump26PM = model_value_dict["SPPump26"];
                vm.Pump27PM = model_value_dict["SPPump27"];
                vm.JD1FM = model_value_dict["SFJD1"];
                vm.JD2FM = model_value_dict["SFJD2"];
                vm.JD3FM = model_value_dict["SFJD3"];
                vm.DN2400FM = model_value_dict["SFDN2400"];
                vm.DN2700FM = model_value_dict["SFDN2700"];
                vm.Pump21FM = model_value_dict["SFPump21"];
                vm.Pump22FM = model_value_dict["SFPump22"];
                vm.Pump23FM = model_value_dict["SFPump23"];
                vm.Pump24FM = model_value_dict["SFPump24"];
                vm.Pump25FM = model_value_dict["SFPump25"];
                vm.Pump26FM = model_value_dict["SFPump26"];
                vm.Pump27FM = model_value_dict["SFPump27"];
                vm.Pump11M = pump_pattern_custom_dict["Pump11"];
                vm.Pump12M = pump_pattern_custom_dict["Pump12"];
                vm.Pump13M = pump_pattern_custom_dict["Pump13"];
                vm.Pump14M = pump_pattern_custom_dict["Pump14"];
                vm.Pump15M = pump_pattern_custom_dict["Pump15"];
                vm.Pump16M = pump_pattern_custom_dict["Pump16"];
                vm.Pump17M = pump_pattern_custom_dict["Pump17"];
                vm.Pump18M = pump_pattern_custom_dict["Pump18"];
                vm.Pump21M = pump_pattern_custom_dict["Pump21"];
                vm.Pump22M = pump_pattern_custom_dict["Pump22"];
                vm.Pump23M = pump_pattern_custom_dict["Pump23"];
                vm.Pump24M = pump_pattern_custom_dict["Pump24"];
                vm.Pump25M = pump_pattern_custom_dict["Pump25"];
                vm.Pump26M = pump_pattern_custom_dict["Pump26"];
                vm.Pump27M = pump_pattern_custom_dict["Pump27"];
                vm.Set();
            }
            this.scadaScheduleViewModelBindingSource.DataSource = _scada_vm_list;
            this.scadaScheduleViewModelBindingSource.ResetBindings(false);
            this.bandedGridView1.BestFitColumns();
            WaitHelper.HideWaitForm();
        }
        /// <summary>
        /// 模型验证
        /// </summary>
        public static List<Model.HydraulicModelRecord> Verify(
            long verify_id,
            DateTime verify_time,
            string verify_file_path,
            Dictionary<string, string> flow_id_mapping_dict,
            Dictionary<string, string> pressure_id_mapping_dict,
            Dictionary<string, float[]> pattern_dict,
            Dictionary<string, double> scada_dict)
        private void bandedGridView2_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
        {
            var hydraulic_record_list = new List<Model.HydraulicModelRecord>();
            var err = EpanetMethods.ENopen(verify_file_path, "", "");
            if (err != 0)
            if (e.CellValue != null)
            {
                return default;
            }
            err = EpanetMethods.ENopenH();
            if (err != 0)
            {
                return default;
            }
            var model_id_build = new StringBuilder(31);
            var pattern_init = true;
            foreach (var pattern in pattern_dict)
            {
                var pattern_id = pattern.Key;
                var pattern_factor_array = pattern.Value;
                var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length;
                err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index);
                if (err != ErrorCode.Ok)
                if (e.Column == this.colJD1PDiff || e.Column == this.colJD2PDiff || e.Column == this.colJD3PDiff)
                {
                    pattern_init = false;
                    continue;
                }
                err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count);
                if (err != ErrorCode.Ok)
                {
                    pattern_init = false;
                    continue;
                }
            }
            if (!pattern_init)
            {
                return default;
            }
            EpanetMethods.ENinitH(0);
            EpanetMethods.ENrunH(out _);
            EpanetMethods.ENgetcount(CountType.Link, out int link_count);
            EpanetMethods.ENgetcount(CountType.Node, out int node_count);
            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);
                    model_value = Math.Abs(model_value);
                    var record = new IStation.Model.HydraulicModelRecord
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        VerificationID = verify_id,
                        Time = verify_time,
                        ModelId = model_id,
                        ScadaId = scada_id,
                        ValueType = IStation.eValueType.Flow,
                        ModelValue = (double)model_value,
                        ScadaValue = scada_value
                    };
                    record.DifferenceValue = record.ModelValue - record.ScadaValue;
                    hydraulic_record_list.Add(record);
                        if (Math.Abs(value) > 0.5)
                        {
                            e.Appearance.ForeColor = Color.Red;
                        }
                    }
                }
                EpanetMethods.ENgetlinktype(link_index, out LinkType linkType);
                if (linkType == LinkType.Pump)
                else if
                    (
                    e.Column == this.colPump11Diff ||
                    e.Column == this.colPump12Diff ||
                    e.Column == this.colPump13Diff ||
                    e.Column == this.colPump14Diff ||
                    e.Column == this.colPump15Diff ||
                    e.Column == this.colPump16Diff ||
                    e.Column == this.colPump17Diff ||
                    e.Column == this.colPump18Diff
                    )
                {
                    EpanetMethods.ENgetlinkvalue(link_index, LinkValue.HeadLoss, out float val);
                }
            }
            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
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        VerificationID = verify_id,
                        Time = verify_time,
                        ModelId = model_id,
                        ScadaId = scada_id,
                        ValueType = IStation.eValueType.Head,
                        ModelValue = (double)model_value,
                        ScadaValue = scada_value
                    };
                    record.DifferenceValue = record.ModelValue - record.ScadaValue;
                    hydraulic_record_list.Add(record);
                        if (value > 0)
                        {
                            e.Appearance.ForeColor = Color.Red;
                        }
                        else
                        {
                            e.Appearance.ForeColor = Color.Green;
                        }
                    }
                }
                else if
                      (
                      e.Column == this.colTotalPowerDiff1
                       )
                {
                    var cell_value = e.CellValue.ToString() ?? string.Empty;
                    if (double.TryParse(cell_value, out double value))
                    {
                        if (value > 0)
                        {
                            e.Appearance.ForeColor = Color.Red;
                        }
                        else
                        {
                            e.Appearance.ForeColor = Color.Green;
                        }
                    }
                }
            }
            EpanetMethods.ENcloseH();
            return hydraulic_record_list;
        }
        #endregion
    }
}