From 1519533649b43337d214523f7cd075edf237b3f7 Mon Sep 17 00:00:00 2001 From: ningshuxia <ningshuxia0927@outlook.com> Date: 星期二, 22 四月 2025 13:57:42 +0800 Subject: [PATCH] 代码修改 --- 01-api/_Expand/IStation.Test/Program - 调度验证.cs | 16 01-api/IStation.Schedule.Ch.sln | 1 01-api/_Expand/IStation.Test/Properties/PublishProfiles/FolderProfile.pubxml.user | 2 02-desktop/Desktop/IStation.Test/schedule/PumpScheduleModel.cs | 113 ++ 02-desktop/Desktop/IStation.Test/Program.cs | 128 +- 01-api/Application/IStation.Application/01-open-api/01-schedule/Schedule_Controller.cs | 54 01-api/_Expand/IStation.Test/Program - 定时数据.cs | 2 02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs | 4 01-api/_Expand/IStation.Win.Schedule/Program.cs | 4 01-api/_Expand/IStation.Test/Program - 历史数据.cs | 234 ++++ 01-api/_Expand/IStation.Test/Program - 复制.cs | 197 +++ 01-api/Entry/IStation.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user | 2 01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs | 62 01-api/_Expand/IStation.Test/IStation.Test.csproj | 1 01-api/_Expand/IStation.Win.Schedule/bjMain.cs | 133 +- 01-api/Service/IStation.Service/00-core/01-helper/GlobalHelper.cs | 805 ++++++++++++++++ 02-desktop/Desktop/IStation.Test/schedule/CorrectedStationScheduleModelHelper.cs | 605 ++++++++++++ /dev/null | 27 02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs | 84 + 02-desktop/Desktop/IStation.Test/schedule/PumpRecordModel.cs | 78 + 01-api/_Expand/IStation.Test/IStation.Test.csproj.user | 2 02-desktop/Desktop/IStation.Test/schedule/StationRunRecord.cs | 49 + 02-desktop/Desktop/IStation.Test/helper/DynamicThresholdProcessorHelper.cs | 41 02-desktop/Desktop/IStation.Test/IStation.Test.csproj | 2 01-api/Service/IStation.Service/02-model/00-basic/02-config/ScheduleConfig.cs | 7 02-desktop/Desktop/IStation.Test/StationTotalFlowPressureHelper.cs | 75 + 02-desktop/Desktop/IStation.Test/StationCombineHelper.cs | 120 + 27 files changed, 2,525 insertions(+), 323 deletions(-) diff --git a/01-api/Application/IStation.Application/01-open-api/01-schedule/Schedule_Controller.cs b/01-api/Application/IStation.Application/01-open-api/01-schedule/Schedule_Controller.cs index e81e700..3e61863 100644 --- a/01-api/Application/IStation.Application/01-open-api/01-schedule/Schedule_Controller.cs +++ b/01-api/Application/IStation.Application/01-open-api/01-schedule/Schedule_Controller.cs @@ -1,4 +1,8 @@ -锘縩amespace IStation.Application +锘縰sing IStation.Curve; +using IStation.Model; +using SqlSugar; + +namespace IStation.Application { /// <summary> /// 杈撴按璋冨害 @@ -78,19 +82,23 @@ var analysis_deviation_list = _service_analysis_deviation.GetList(); GlobalHelper.GetStationOpenFlagList(monitor_record_list, out List<int> station1_open_flag_list, out List<int> station2_open_flag_list); - GlobalHelper.GetStationFlagStateList(monitor_record_list, out List<int> station1_flag_maintenance_list, out List<int> station2_maintenance_flag_list, out List<int> station1_priority_flag_list, out List<int> station2_priority_flag_list); + GlobalHelper.GetStationFlagStateList(monitor_record_list, out List<int> station1_maintenance_flag_list, out List<int> station2_maintenance_flag_list, out List<int> station1_priority_flag_list, out List<int> station2_priority_flag_list); GlobalHelper.GetFlagInletWaterLevelDict(monitor_record_list, out Dictionary<int, double> station1_flag_inlet_water_level_dict, out Dictionary<int, double> station2_flag_inlet_water_level_dict); + station1_schedule_config.MaintenanceFlagList = new List<int>(); + station2_schedule_config.MaintenanceFlagList = new List<int>(); + station1_schedule_config.PriorityOpenFlagList = new List<int>(); + station2_schedule_config.PriorityOpenFlagList = new List<int>(); log_title = "鏈烘车妫�淇�"; - if (station1_flag_maintenance_list != null && station1_flag_maintenance_list.Any()) + if (station1_maintenance_flag_list != null && station1_maintenance_flag_list.Any()) { - ScheduleLog.Info(request_id, log_title, $"1杈撴按:{Yw.Untity.IntListHelper.ToString(station1_flag_maintenance_list)}"); - station1_schedule_config.MustCloseFlagList.AddRange(station1_flag_maintenance_list); + ScheduleLog.Info(request_id, log_title, $"1杈撴按:{Yw.Untity.IntListHelper.ToString(station1_maintenance_flag_list)}"); + station1_schedule_config.MaintenanceFlagList.AddRange(station1_maintenance_flag_list); } if (station2_maintenance_flag_list != null && station2_maintenance_flag_list.Any()) { ScheduleLog.Info(request_id, log_title, $"2杈撴按:{Yw.Untity.IntListHelper.ToString(station2_maintenance_flag_list)}"); - station2_schedule_config.MustCloseFlagList.AddRange(station2_maintenance_flag_list); + station2_schedule_config.MaintenanceFlagList.AddRange(station2_maintenance_flag_list); } log_title = "鏈烘车浼樺厛"; @@ -105,9 +113,20 @@ station2_schedule_config.PriorityOpenFlagList.AddRange(station2_priority_flag_list); } + log_title = "渚涙按闄愬埗"; + var limit_info= VerifyWaterSupplyLimit(station1_schedule_config.WaterSupplyLimitList,station1_open_flag_list, target_flow1); + if (!string.IsNullOrEmpty(limit_info)) + { + ScheduleLog.Info(request_id, log_title, $"1杈撴按:{limit_info}"); + } - log_title = "娴侀噺琛ュ樊"; + limit_info = VerifyWaterSupplyLimit(station2_schedule_config.WaterSupplyLimitList, station2_open_flag_list, target_flow2); + if (!string.IsNullOrEmpty(limit_info)) + { + ScheduleLog.Info(request_id, log_title, $"2杈撴按:{limit_info}"); + } + log_title = "娴侀噺琛ュ樊"; var helper = new Service.ScheduleHelper(); helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list); var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1); @@ -487,6 +506,27 @@ } + private static string VerifyWaterSupplyLimit(List<WaterSupplyLimit> waterSupplyLimits, List<int> station_open_flag_list, double targetFlow) + { + if (waterSupplyLimits != null && waterSupplyLimits.Any()) + { + if (station_open_flag_list != null && station_open_flag_list.Any()) + { + var pumpCount = station_open_flag_list.Count; + var exist_limit = waterSupplyLimits.Find(x => x.PumpCount == pumpCount); + if (exist_limit != null) + { + if (targetFlow < exist_limit.Min || targetFlow > exist_limit.Max) + { + var flags = Yw.Untity.IntListHelper.ToString(station_open_flag_list); + return $"[{flags}]:鐩爣娴侀噺:{targetFlow},渚涙按闄愬埗:{exist_limit.Min}-{exist_limit.Max}"; + } + } + } + } + return ""; + } + } diff --git a/01-api/Entry/IStation.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user b/01-api/Entry/IStation.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user index fcf8b7f..6db891d 100644 --- a/01-api/Entry/IStation.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/01-api/Entry/IStation.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ <Project> <PropertyGroup> <_PublishTargetUrl>D:\WorkCode\Project\ChDt1\Schedule.Ch.V1.0\01-api\Entry\IStation.Entry\bin\Release\net6.0\publish\</_PublishTargetUrl> - <History>True|2025-03-06T04:22:24.3024074Z||;True|2025-02-19T13:26:43.5272277+08:00||;True|2025-02-19T13:25:05.8482250+08:00||;True|2025-02-11T12:56:06.0150407+08:00||;True|2025-02-11T12:53:25.2984928+08:00||;True|2025-02-11T12:53:07.8461804+08:00||;True|2025-02-11T12:25:40.4739526+08:00||;True|2025-02-11T12:15:43.0779684+08:00||;True|2025-02-11T11:24:38.9435901+08:00||;True|2025-02-11T10:07:09.9907346+08:00||;True|2025-02-11T10:06:24.2854311+08:00||;True|2024-12-05T13:41:38.8531031+08:00||;True|2024-11-09T09:37:13.3682027+08:00||;True|2024-11-06T17:38:55.4076801+08:00||;True|2024-11-06T17:09:19.3816798+08:00||;True|2024-11-05T13:14:01.6952365+08:00||;True|2024-10-29T17:47:24.1461492+08:00||;True|2024-10-29T17:44:54.7943890+08:00||;True|2024-10-29T14:23:21.2176559+08:00||;True|2024-10-28T13:23:34.4772009+08:00||;True|2024-10-28T09:52:02.6105686+08:00||;True|2024-10-21T13:45:41.4184337+08:00||;False|2024-10-21T13:45:28.6526687+08:00||;True|2024-10-21T13:44:32.5042437+08:00||;True|2024-10-21T13:43:41.9121028+08:00||;True|2024-10-21T12:21:54.3858141+08:00||;True|2024-10-21T12:21:49.0790357+08:00||;True|2024-10-21T12:21:38.3606377+08:00||;True|2024-10-21T10:41:49.7087919+08:00||;True|2024-10-21T10:22:56.7510287+08:00||;True|2024-10-21T10:20:14.9765083+08:00||;True|2024-09-04T12:23:06.8396065+08:00||;True|2024-09-04T12:21:53.1509115+08:00||;True|2024-09-04T12:03:26.9628398+08:00||;True|2024-09-04T11:57:24.6077432+08:00||;True|2024-09-04T10:44:08.5232129+08:00||;True|2024-09-04T10:31:08.0493769+08:00||;True|2024-08-27T10:39:49.3050134+08:00||;True|2024-08-15T10:51:00.0736675+08:00||;True|2024-08-07T10:34:56.6363692+08:00||;True|2024-08-07T10:23:23.5959249+08:00||;True|2024-08-07T10:18:55.3553323+08:00||;True|2024-08-05T10:03:03.1020499+08:00||;True|2024-08-05T10:00:42.1282571+08:00||;True|2024-08-01T17:23:11.3983389+08:00||;True|2024-08-01T17:22:31.0342192+08:00||;True|2024-08-01T17:20:38.4331763+08:00||;True|2024-07-25T13:35:25.1478492+08:00||;True|2024-07-16T17:39:33.3835168+08:00||;True|2024-07-16T17:14:00.9398568+08:00||;False|2024-07-16T17:13:27.9996953+08:00||;True|2024-07-16T13:09:16.9500768+08:00||;True|2024-07-15T12:48:47.2966278+08:00||;False|2024-07-15T12:48:32.1828646+08:00||;True|2024-07-12T16:40:50.3694799+08:00||;True|2024-07-12T10:40:34.0007726+08:00||;True|2024-07-12T10:36:32.4601011+08:00||;True|2024-07-12T10:33:14.3243625+08:00||;True|2024-07-11T14:10:11.4665289+08:00||;True|2024-07-11T14:08:13.0064903+08:00||;True|2024-07-11T14:06:32.4662645+08:00||;True|2024-07-09T09:51:25.7986637+08:00||;False|2024-07-09T09:50:56.5778877+08:00||;False|2024-07-09T09:50:23.0123211+08:00||;True|2024-06-26T16:20:21.3981649+08:00||;False|2024-06-26T16:19:59.2162840+08:00||;True|2024-06-26T15:20:17.9242271+08:00||;True|2024-06-19T15:01:43.3271769+08:00||;True|2024-06-18T09:51:50.4178295+08:00||;True|2024-06-18T09:41:19.5989782+08:00||;True|2024-06-18T09:41:10.7867036+08:00||;True|2024-06-18T09:38:57.0128861+08:00||;True|2024-06-17T15:22:17.6153518+08:00||;False|2024-06-17T15:22:01.3404718+08:00||;True|2024-06-13T11:15:55.4873247+08:00||;True|2024-06-13T11:14:52.9075916+08:00||;True|2024-06-13T10:09:13.5966875+08:00||;True|2024-06-13T09:58:26.1880685+08:00||;True|2024-06-13T09:49:29.6928004+08:00||;True|2024-06-13T09:46:16.2707476+08:00||;True|2024-05-30T14:57:39.3412922+08:00||;True|2024-05-30T11:59:44.7664433+08:00||;True|2024-05-30T11:53:59.9799057+08:00||;True|2024-05-30T11:21:35.4761141+08:00||;True|2024-05-30T11:16:55.6157765+08:00||;True|2024-05-30T11:07:45.8336241+08:00||;True|2024-05-30T10:59:58.8877118+08:00||;True|2024-05-30T10:36:09.0290592+08:00||;True|2024-05-30T10:35:17.5448779+08:00||;True|2024-05-27T17:06:29.6833574+08:00||;False|2024-05-27T17:06:07.6398727+08:00||;False|2024-05-27T17:05:20.1523960+08:00||;False|2024-05-27T17:05:04.1140399+08:00||;False|2024-05-27T17:04:44.5872009+08:00||;True|2024-05-11T15:21:00.4779174+08:00||;True|2024-04-23T10:14:25.7074885+08:00||;True|2024-04-22T16:37:12.5852855+08:00||;True|2024-04-22T16:34:52.0894541+08:00||;True|2024-04-19T10:53:01.1630050+08:00||;True|2024-04-19T10:52:02.7021209+08:00||;</History> + <History>True|2025-04-17T02:17:40.2265253Z||;True|2025-03-06T12:22:24.3024074+08:00||;True|2025-02-19T13:26:43.5272277+08:00||;True|2025-02-19T13:25:05.8482250+08:00||;True|2025-02-11T12:56:06.0150407+08:00||;True|2025-02-11T12:53:25.2984928+08:00||;True|2025-02-11T12:53:07.8461804+08:00||;True|2025-02-11T12:25:40.4739526+08:00||;True|2025-02-11T12:15:43.0779684+08:00||;True|2025-02-11T11:24:38.9435901+08:00||;True|2025-02-11T10:07:09.9907346+08:00||;True|2025-02-11T10:06:24.2854311+08:00||;True|2024-12-05T13:41:38.8531031+08:00||;True|2024-11-09T09:37:13.3682027+08:00||;True|2024-11-06T17:38:55.4076801+08:00||;True|2024-11-06T17:09:19.3816798+08:00||;True|2024-11-05T13:14:01.6952365+08:00||;True|2024-10-29T17:47:24.1461492+08:00||;True|2024-10-29T17:44:54.7943890+08:00||;True|2024-10-29T14:23:21.2176559+08:00||;True|2024-10-28T13:23:34.4772009+08:00||;True|2024-10-28T09:52:02.6105686+08:00||;True|2024-10-21T13:45:41.4184337+08:00||;False|2024-10-21T13:45:28.6526687+08:00||;True|2024-10-21T13:44:32.5042437+08:00||;True|2024-10-21T13:43:41.9121028+08:00||;True|2024-10-21T12:21:54.3858141+08:00||;True|2024-10-21T12:21:49.0790357+08:00||;True|2024-10-21T12:21:38.3606377+08:00||;True|2024-10-21T10:41:49.7087919+08:00||;True|2024-10-21T10:22:56.7510287+08:00||;True|2024-10-21T10:20:14.9765083+08:00||;True|2024-09-04T12:23:06.8396065+08:00||;True|2024-09-04T12:21:53.1509115+08:00||;True|2024-09-04T12:03:26.9628398+08:00||;True|2024-09-04T11:57:24.6077432+08:00||;True|2024-09-04T10:44:08.5232129+08:00||;True|2024-09-04T10:31:08.0493769+08:00||;True|2024-08-27T10:39:49.3050134+08:00||;True|2024-08-15T10:51:00.0736675+08:00||;True|2024-08-07T10:34:56.6363692+08:00||;True|2024-08-07T10:23:23.5959249+08:00||;True|2024-08-07T10:18:55.3553323+08:00||;True|2024-08-05T10:03:03.1020499+08:00||;True|2024-08-05T10:00:42.1282571+08:00||;True|2024-08-01T17:23:11.3983389+08:00||;True|2024-08-01T17:22:31.0342192+08:00||;True|2024-08-01T17:20:38.4331763+08:00||;True|2024-07-25T13:35:25.1478492+08:00||;True|2024-07-16T17:39:33.3835168+08:00||;True|2024-07-16T17:14:00.9398568+08:00||;False|2024-07-16T17:13:27.9996953+08:00||;True|2024-07-16T13:09:16.9500768+08:00||;True|2024-07-15T12:48:47.2966278+08:00||;False|2024-07-15T12:48:32.1828646+08:00||;True|2024-07-12T16:40:50.3694799+08:00||;True|2024-07-12T10:40:34.0007726+08:00||;True|2024-07-12T10:36:32.4601011+08:00||;True|2024-07-12T10:33:14.3243625+08:00||;True|2024-07-11T14:10:11.4665289+08:00||;True|2024-07-11T14:08:13.0064903+08:00||;True|2024-07-11T14:06:32.4662645+08:00||;True|2024-07-09T09:51:25.7986637+08:00||;False|2024-07-09T09:50:56.5778877+08:00||;False|2024-07-09T09:50:23.0123211+08:00||;True|2024-06-26T16:20:21.3981649+08:00||;False|2024-06-26T16:19:59.2162840+08:00||;True|2024-06-26T15:20:17.9242271+08:00||;True|2024-06-19T15:01:43.3271769+08:00||;True|2024-06-18T09:51:50.4178295+08:00||;True|2024-06-18T09:41:19.5989782+08:00||;True|2024-06-18T09:41:10.7867036+08:00||;True|2024-06-18T09:38:57.0128861+08:00||;True|2024-06-17T15:22:17.6153518+08:00||;False|2024-06-17T15:22:01.3404718+08:00||;True|2024-06-13T11:15:55.4873247+08:00||;True|2024-06-13T11:14:52.9075916+08:00||;True|2024-06-13T10:09:13.5966875+08:00||;True|2024-06-13T09:58:26.1880685+08:00||;True|2024-06-13T09:49:29.6928004+08:00||;True|2024-06-13T09:46:16.2707476+08:00||;True|2024-05-30T14:57:39.3412922+08:00||;True|2024-05-30T11:59:44.7664433+08:00||;True|2024-05-30T11:53:59.9799057+08:00||;True|2024-05-30T11:21:35.4761141+08:00||;True|2024-05-30T11:16:55.6157765+08:00||;True|2024-05-30T11:07:45.8336241+08:00||;True|2024-05-30T10:59:58.8877118+08:00||;True|2024-05-30T10:36:09.0290592+08:00||;True|2024-05-30T10:35:17.5448779+08:00||;True|2024-05-27T17:06:29.6833574+08:00||;False|2024-05-27T17:06:07.6398727+08:00||;False|2024-05-27T17:05:20.1523960+08:00||;False|2024-05-27T17:05:04.1140399+08:00||;False|2024-05-27T17:04:44.5872009+08:00||;True|2024-05-11T15:21:00.4779174+08:00||;True|2024-04-23T10:14:25.7074885+08:00||;True|2024-04-22T16:37:12.5852855+08:00||;True|2024-04-22T16:34:52.0894541+08:00||;True|2024-04-19T10:53:01.1630050+08:00||;</History> <LastFailureDetails /> </PropertyGroup> </Project> \ No newline at end of file diff --git a/01-api/IStation.Schedule.Ch.sln b/01-api/IStation.Schedule.Ch.sln index be938c8..06970e6 100644 --- a/01-api/IStation.Schedule.Ch.sln +++ b/01-api/IStation.Schedule.Ch.sln @@ -144,7 +144,6 @@ HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {DE85C7A6-BCE1-46D1-B8CE-7F3F4B0F1E22} = {717DE2F8-71FB-4406-BEF7-CC5716721AEF} {31D62A4A-F697-416E-A4F1-C5A42AA92010} = {F4397911-D951-4187-8DC4-EED004E38B3F} {09AAD314-5A3E-4BEC-B012-60423D3B3E3C} = {FC81BD0A-513E-4164-8444-C5AD17D31DF8} {AF3961EA-957B-40BB-82CF-A972DE0DACF6} = {DE85C7A6-BCE1-46D1-B8CE-7F3F4B0F1E22} diff --git a/01-api/Service/IStation.Service/00-core/01-helper/GlobalHelper.cs b/01-api/Service/IStation.Service/00-core/01-helper/GlobalHelper.cs index 33e0729..fcbe3ca 100644 --- a/01-api/Service/IStation.Service/00-core/01-helper/GlobalHelper.cs +++ b/01-api/Service/IStation.Service/00-core/01-helper/GlobalHelper.cs @@ -817,6 +817,810 @@ #endregion + #region 鍘嗗彶鏁版嵁鏍囩 + + /// <summary> + /// + /// </summary> + public static List<string> HistoryTagAllList = new () + { + "闀挎睙绠$綉鍥�.XTB_QCYW", + "浜屽彇姘�1鍙蜂富姘存车.鍑哄彛鍘嬪姏", + "浜屽彇姘�1鍙蜂富姘存车.鐬椂娴侀噺", + "浜屽彇姘�1鍙蜂富姘存车.绱娴侀噺", + "浜屽彇姘�1鍙蜂富姘存车.姘存车杩愯鐘舵��", + "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼", + "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜屽彇姘�2鍙蜂富姘存车.鍑哄彛鍘嬪姏", + "浜屽彇姘�2鍙蜂富姘存车.鐬椂娴侀噺", + "浜屽彇姘�2鍙蜂富姘存车.绱娴侀噺", + "浜屽彇姘�2鍙蜂富姘存车.姘存车杩愯鐘舵��", + "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鍔熺巼", + "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜屽彇姘�3鍙蜂富姘存车.鍑哄彛鍘嬪姏", + "浜屽彇姘�3鍙蜂富姘存车.鐬椂娴侀噺", + "浜屽彇姘�3鍙蜂富姘存车.绱娴侀噺", + "浜屽彇姘�3鍙蜂富姘存车.姘存车杩愯鐘舵��", + "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鍔熺巼", + "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜屽彇姘�4鍙蜂富姘存车.鍑哄彛鍘嬪姏", + "浜屽彇姘�4鍙蜂富姘存车.鐬椂娴侀噺", + "浜屽彇姘�4鍙蜂富姘存车.绱娴侀噺", + "浜屽彇姘�4鍙蜂富姘存车.姘存车杩愯鐘舵��", + "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鍔熺巼", + "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜屽彇姘�5鍙蜂富姘存车.鍑哄彛鍘嬪姏", + "浜屽彇姘�5鍙蜂富姘存车.鐬椂娴侀噺", + "浜屽彇姘�5鍙蜂富姘存车.绱娴侀噺", + "浜屽彇姘�5鍙蜂富姘存车.姘存车杩愯鐘舵��", + "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鍔熺巼", + "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�21鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "21鍙风數鍔ㄦ満.鏈夊姛鍔熺巼", + "21鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "2400鎬荤.鍑哄巶鍘嬪姏", + "2400鎬荤.鐬椂娴侀噺", + "2400鎬荤.瀹為檯绱娴侀噺", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�22鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "22鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "22鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + "22鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�23鍙锋按娉佃蒋鍚姩.杩愯", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "23鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "23鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + "23鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�24鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "24鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "24鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + "24鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "2600鎬荤.鐬椂娴侀噺", + "2600鎬荤.鐬椂娴侀噺", + "2600鎬荤.瀹為檯绱娴侀噺", //杩欎釜鏈夐棶棰� + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�25鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "25鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "25鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + "25鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�26鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "26鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "26鍙风數鍔ㄦ満鍙傛暟.鐢垫満瑙嗗湪鍔熺巼", + "26鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杩愯鐘舵��", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杈撳嚭棰戠巼", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杈撳嚭鍔熺巼", + "27鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "HF涓�杈撴按11鍙峰彉棰戞帶鍒剁敾闈�.11鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车杞��", + "11鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + "11鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.1绾垮帇鍔�", + "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�", + "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鑰佸墠姹犲崡渚ф恫浣�", + "HF涓�杈撴按12鍙峰彉棰戞帶鍒剁敾闈�.12鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杞��", + "12鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + "12鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按13鍙峰彉棰戞帶鍒剁敾闈�.13鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车杞��", + "13鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + "13鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按14鍙峰彉棰戞帶鍒跺浘.14鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车杞��", + "14鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + "14鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.2绾垮帇鍔�", + "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�", + "HF闀挎睙鍘熸按鍘侫BPLC.6KV閰嶇數涓�杈撴按.0402010201011501003涓�杈撴按15鍙锋车杩愯", + "15鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + "15鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16鍙锋车鍑哄彛鍘嬪姏", + "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16#姘存车杩愯", + "涓�杈撴按6KV_閰嶇數鏌淿M112.鎬绘湁鍔熷姛鐜�", + "涓�杈撴按6KV_閰嶇數鏌淿M112.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.3绾垮帇鍔�", + "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�", + "HF涓�杈撴按17鍙峰彉棰戞帶鍒跺浘.17鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车杞��", + "涓�杈撴按6KV_閰嶇數鏌淿M108.鎬绘湁鍔熷姛鐜�", + "涓�杈撴按6KV_閰嶇數鏌淿M108.鏈夊姛鐢靛害", + "HF涓�杈撴按18鍙峰彉棰戞帶鍒跺浘.18鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车杞��", + "涓�杈撴按6KV_閰嶇數鏌淿M111.鎬绘湁鍔熷姛鐜�", + "涓�杈撴按6KV_閰嶇數鏌淿M111.鏈夊姛鐢靛害", + "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鏂板墠姹犳恫浣�" + }; + + /// <summary> + /// + /// </summary> + public static List<string> HistoryShuShuiTagList = new() + { + //"闀挎睙绠$綉鍥�.XTB_QCYW", + //"浜屽彇姘�1鍙蜂富姘存车.鍑哄彛鍘嬪姏", + //"浜屽彇姘�1鍙蜂富姘存车.鐬椂娴侀噺", + //"浜屽彇姘�1鍙蜂富姘存车.绱娴侀噺", + //"浜屽彇姘�1鍙蜂富姘存车.姘存车杩愯鐘舵��", + //"浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼", + //"浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鐢佃兘", + //"浜屽彇姘�2鍙蜂富姘存车.鍑哄彛鍘嬪姏", + //"浜屽彇姘�2鍙蜂富姘存车.鐬椂娴侀噺", + //"浜屽彇姘�2鍙蜂富姘存车.绱娴侀噺", + //"浜屽彇姘�2鍙蜂富姘存车.姘存车杩愯鐘舵��", + //"浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鍔熺巼", + //"浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鐢佃兘", + //"浜屽彇姘�3鍙蜂富姘存车.鍑哄彛鍘嬪姏", + //"浜屽彇姘�3鍙蜂富姘存车.鐬椂娴侀噺", + //"浜屽彇姘�3鍙蜂富姘存车.绱娴侀噺", + //"浜屽彇姘�3鍙蜂富姘存车.姘存车杩愯鐘舵��", + //"浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鍔熺巼", + //"浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鐢佃兘", + //"浜屽彇姘�4鍙蜂富姘存车.鍑哄彛鍘嬪姏", + //"浜屽彇姘�4鍙蜂富姘存车.鐬椂娴侀噺", + //"浜屽彇姘�4鍙蜂富姘存车.绱娴侀噺", + //"浜屽彇姘�4鍙蜂富姘存车.姘存车杩愯鐘舵��", + //"浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鍔熺巼", + //"浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鐢佃兘", + //"浜屽彇姘�5鍙蜂富姘存车.鍑哄彛鍘嬪姏", + //"浜屽彇姘�5鍙蜂富姘存车.鐬椂娴侀噺", + //"浜屽彇姘�5鍙蜂富姘存车.绱娴侀噺", + //"浜屽彇姘�5鍙蜂富姘存车.姘存车杩愯鐘舵��", + //"浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鍔熺巼", + //"浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鐢佃兘", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�21鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "21鍙风數鍔ㄦ満.鏈夊姛鍔熺巼", + //"21鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "2400鎬荤.鍑哄巶鍘嬪姏", + "2400鎬荤.鐬椂娴侀噺", + //"2400鎬荤.瀹為檯绱娴侀噺", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�22鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "22鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "22鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + //"22鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�23鍙锋按娉佃蒋鍚姩.杩愯", + "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "23鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "23鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + //"23鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�24鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "24鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "24鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + //"24鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "2600鎬荤.鐬椂娴侀噺", + "2600鎬荤.鐬椂娴侀噺", + //"2600鎬荤.瀹為檯绱娴侀噺", //杩欎釜鏈夐棶棰� + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�25鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "25鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "25鍙风數鍔ㄦ満鍙傛暟.鏈夊姛鍔熺巼", + //"25鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�26鍙锋按娉佃鍥�.娉佃繍琛�", + "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "26鍙风數鍔ㄦ満鍙傛暟.瀹為檯棰戠巼", + "26鍙风數鍔ㄦ満鍙傛暟.鐢垫満瑙嗗湪鍔熺巼", + //"26鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺", + //"浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杩愯鐘舵��", + "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐢垫満杞��", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杈撳嚭棰戠巼", + "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杈撳嚭鍔熺巼", + //"27鍙风數鍔ㄦ満.鏈夊姛鐢佃兘", + "HF涓�杈撴按11鍙峰彉棰戞帶鍒剁敾闈�.11鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车杞��", + "11鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + //"11鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.1绾垮帇鍔�", + "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�", + "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鑰佸墠姹犲崡渚ф恫浣�", + "HF涓�杈撴按12鍙峰彉棰戞帶鍒剁敾闈�.12鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杞��", + "12鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + //"12鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按13鍙峰彉棰戞帶鍒剁敾闈�.13鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车杞��", + "13鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + //"13鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按14鍙峰彉棰戞帶鍒跺浘.14鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车杞��", + "14鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + //"14鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.2绾垮帇鍔�", + "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�", + "HF闀挎睙鍘熸按鍘侫BPLC.6KV閰嶇數涓�杈撴按.0402010201011501003涓�杈撴按15鍙锋车杩愯", + "15鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�", + //"15鍙�6KV閰嶇數鍙傛暟.鏈夊姛鐢靛害", + "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16鍙锋车鍑哄彛鍘嬪姏", + "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16#姘存车杩愯", + "涓�杈撴按6KV_閰嶇數鏌淿M112.鎬绘湁鍔熷姛鐜�", + //"涓�杈撴按6KV_閰嶇數鏌淿M112.鏈夊姛鐢靛害", + "鍢夊畾鏁版嵁.3绾垮帇鍔�", + "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�", + "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�", + "HF涓�杈撴按17鍙峰彉棰戞帶鍒跺浘.17鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车杞��", + "涓�杈撴按6KV_閰嶇數鏌淿M108.鎬绘湁鍔熷姛鐜�", + //"涓�杈撴按6KV_閰嶇數鏌淿M108.鏈夊姛鐢靛害", + "HF涓�杈撴按18鍙峰彉棰戞帶鍒跺浘.18鍙锋车鍑哄彛鍘嬪姏", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�", + "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车杞��", + "涓�杈撴按6KV_閰嶇數鏌淿M111.鎬绘湁鍔熷姛鐜�", + //"涓�杈撴按6KV_閰嶇數鏌淿M111.鏈夊姛鐢靛害", + "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鏂板墠姹犳恫浣�" + }; + + /// <summary> + /// HistoryShuShuiTagCodeMapping + /// </summary> + public static readonly Dictionary<string, string> HistoryShuShuiCodeTagMappingDict = new Dictionary<string, string>() { + // 浜屽彇鐩稿叧 + { 闀挎睙姘翠綅, "闀挎睙绠$綉鍥�.XTB_QCYW" }, + { 浜屽彇鍓嶆睜娑蹭綅, "浜屽彇姘�1鍙蜂富姘存车.鍓嶆睜娑蹭綅" }, + { 闄堣姘村簱姘翠綅, "闄堣姘村簱娑蹭綅" }, + { 浜屽彇1娉礯鏈夊姛鍔熺巼, "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼" }, + { 浜屽彇2娉礯鏈夊姛鍔熺巼, "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鍔熺巼" }, + { 浜屽彇3娉礯鏈夊姛鍔熺巼, "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鍔熺巼" }, + { 浜屽彇4娉礯鏈夊姛鍔熺巼, "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鍔熺巼" }, + { 浜屽彇5娉礯鏈夊姛鍔熺巼, "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鍔熺巼" }, + { 浜屽彇1娉礯鍑哄彛鍘嬪姏, "浜屽彇姘�1鍙蜂富姘存车.鍑哄彛鍘嬪姏" }, + { 浜屽彇2娉礯鍑哄彛鍘嬪姏, "浜屽彇姘�2鍙蜂富姘存车.鍑哄彛鍘嬪姏" }, + { 浜屽彇3娉礯鍑哄彛鍘嬪姏, "浜屽彇姘�3鍙蜂富姘存车.鍑哄彛鍘嬪姏" }, + { 浜屽彇4娉礯鍑哄彛鍘嬪姏, "浜屽彇姘�4鍙蜂富姘存车.鍑哄彛鍘嬪姏" }, + { 浜屽彇5娉礯鍑哄彛鍘嬪姏, "浜屽彇姘�5鍙蜂富姘存车.鍑哄彛鍘嬪姏" }, + { 浜屽彇1娉礯姘存车_杩愯鐘舵��, "浜屽彇姘�1鍙蜂富姘存车.姘存车杩愯鐘舵��" }, + { 浜屽彇2娉礯姘存车_杩愯鐘舵��, "浜屽彇姘�2鍙蜂富姘存车.姘存车杩愯鐘舵��" }, + { 浜屽彇3娉礯姘存车_杩愯鐘舵��, "浜屽彇姘�3鍙蜂富姘存车.姘存车杩愯鐘舵��" }, + { 浜屽彇4娉礯姘存车_杩愯鐘舵��, "浜屽彇姘�4鍙蜂富姘存车.姘存车杩愯鐘舵��" }, + { 浜屽彇5娉礯姘存车_杩愯鐘舵��, "浜屽彇姘�5鍙蜂富姘存车.姘存车杩愯鐘舵��" }, + { 浜屽彇1娉礯鏈夊姛鐢佃兘, "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鐢佃兘" }, + { 浜屽彇2娉礯鏈夊姛鐢佃兘, "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鐢佃兘" }, + { 浜屽彇3娉礯鏈夊姛鐢佃兘, "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鐢佃兘" }, + { 浜屽彇4娉礯鏈夊姛鐢佃兘, "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鐢佃兘" }, + { 浜屽彇5娉礯鏈夊姛鐢佃兘, "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鐢佃兘" }, + { 浜屽彇1娉礯绱娴侀噺, "浜屽彇姘�1鍙蜂富姘存车.绱娴侀噺" }, + { 浜屽彇2娉礯绱娴侀噺, "浜屽彇姘�2鍙蜂富姘存车.绱娴侀噺" }, + { 浜屽彇3娉礯绱娴侀噺, "浜屽彇姘�3鍙蜂富姘存车.绱娴侀噺" }, + { 浜屽彇4娉礯绱娴侀噺, "浜屽彇姘�4鍙蜂富姘存车.绱娴侀噺" }, + { 浜屽彇5娉礯绱娴侀噺, "浜屽彇姘�5鍙蜂富姘存车.绱娴侀噺" }, + { 浜屽彇1娉礯鐬椂娴侀噺, "浜屽彇姘�1鍙蜂富姘存车.鐬椂娴侀噺" }, + { 浜屽彇2娉礯鐬椂娴侀噺, "浜屽彇姘�2鍙蜂富姘存车.鐬椂娴侀噺" }, + { 浜屽彇3娉礯鐬椂娴侀噺, "浜屽彇姘�3鍙蜂富姘存车.鐬椂娴侀噺" }, + { 浜屽彇4娉礯鐬椂娴侀噺, "浜屽彇姘�4鍙蜂富姘存车.鐬椂娴侀噺" }, + { 浜屽彇5娉礯鐬椂娴侀噺, "浜屽彇姘�5鍙蜂富姘存车.鐬椂娴侀噺" }, + //{ 浜屽彇1娉礯绱杩愯鏃堕棿, "浜屽彇姘�1鍙蜂富姘存车.绱杩愯鏃堕棿" }, + //{ 浜屽彇2娉礯绱杩愯鏃堕棿, "浜屽彇姘�2鍙蜂富姘存车.绱杩愯鏃堕棿" }, + //{ 浜屽彇3娉礯绱杩愯鏃堕棿, "浜屽彇姘�3鍙蜂富姘存车.绱杩愯鏃堕棿" }, + //{ 浜屽彇4娉礯绱杩愯鏃堕棿, "浜屽彇姘�4鍙蜂富姘存车.绱杩愯鏃堕棿" }, + //{ 浜屽彇5娉礯绱杩愯鏃堕棿, "浜屽彇姘�5鍙蜂富姘存车.绱杩愯鏃堕棿" }, + { 浜屽彇1娉礯妫�淇姸鎬�, "浜屽彇姘�1鍙蜂富姘存车.妫�淇姸鎬�" }, + { 浜屽彇2娉礯妫�淇姸鎬�, "浜屽彇姘�2鍙蜂富姘存车.妫�淇姸鎬�" }, + { 浜屽彇3娉礯妫�淇姸鎬�, "浜屽彇姘�3鍙蜂富姘存车.妫�淇姸鎬�" }, + { 浜屽彇4娉礯妫�淇姸鎬�, "浜屽彇姘�4鍙蜂富姘存车.妫�淇姸鎬�" }, + { 浜屽彇5娉礯妫�淇姸鎬�, "浜屽彇姘�5鍙蜂富姘存车.妫�淇姸鎬�" }, + { 浜屽彇1娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜屽彇姘�1鍙蜂富姘存车.绱杩愯鏃堕棿" }, + { 浜屽彇2娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜屽彇姘�2鍙蜂富姘存车.绱杩愯鏃堕棿" }, + { 浜屽彇3娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜屽彇姘�3鍙蜂富姘存车.绱杩愯鏃堕棿" }, + { 浜屽彇4娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜屽彇姘�4鍙蜂富姘存车.绱杩愯鏃堕棿" }, + { 浜屽彇5娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜屽彇姘�5鍙蜂富姘存车.绱杩愯鏃堕棿" }, + + // 涓�杈撶浉鍏� + { 鍢夊畾1绾縚鐬椂娴侀噺, "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�" }, + { 鍢夊畾2绾縚鐬椂娴侀噺, "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�" }, + { 鍢夊畾3绾縚鐬椂娴侀噺, "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�" }, + { 鍢夊畾1绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�" }, + { 鍢夊畾2绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�" }, + { 鍢夊畾3绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�" }, + { 鍢夊畾1绾縚琛ㄥご绱, "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�" }, + { 鍢夊畾2绾縚琛ㄥご绱, "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�" }, + { 鍢夊畾3绾縚琛ㄥご绱, "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�" }, + { 鍢夊畾1绾縚绱娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�" }, + { 鍢夊畾2绾縚绱娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�" }, + { 鍢夊畾3绾縚绱娴侀噺_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�" }, + { 鍢夊畾1绾縚鍘嬪姏, "鍢夊畾鏁版嵁.1绾垮帇鍔�" }, + { 鍢夊畾2绾縚鍘嬪姏, "鍢夊畾鏁版嵁.2绾垮帇鍔�" }, + { 鍢夊畾3绾縚鍘嬪姏, "鍢夊畾鏁版嵁.3绾垮帇鍔�" }, + { 鍢夊畾1绾縚鍘嬪姏_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.1绾垮帇鍔�" }, + { 鍢夊畾2绾縚鍘嬪姏_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.2绾垮帇鍔�" }, + { 鍢夊畾3绾縚鍘嬪姏_闀挎睙绠$綉鍥�, "鍢夊畾鏁版嵁.3绾垮帇鍔�" }, + { 涓�杈揰鑰佸墠姹犲崡渚ф恫浣�, "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鑰佸墠姹犲崡渚ф恫浣�" }, + { 涓�杈揰鑰佸墠姹犲寳渚ф恫浣�, "涓�杈撴按14鍙峰彉棰戝崟娉�.鍓嶆睜娑蹭綅" }, + { 涓�杈揰鏂板墠姹犳恫浣�, "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鏂板墠姹犳恫浣�" }, + { 涓�杈�11娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按11鍙峰彉棰戞帶鍒剁敾闈�.11鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�12娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按12鍙峰彉棰戞帶鍒剁敾闈�.12鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�13娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按13鍙峰彉棰戞帶鍒剁敾闈�.13鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�14娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按14鍙峰彉棰戞帶鍒跺浘.14鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�15娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.15鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�16娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�17娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按17鍙峰彉棰戞帶鍒跺浘.17鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�18娉礯鍑哄彛鍘嬪姏, "HF涓�杈撴按18鍙峰彉棰戞帶鍒跺浘.18鍙锋车鍑哄彛鍘嬪姏" }, + { 涓�杈�11娉礯杞��, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车杞��" }, + { 涓�杈�12娉礯杞��, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杞��" }, + { 涓�杈�13娉礯杞��, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车杞��" }, + { 涓�杈�14娉礯杞��, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车杞��" }, + { 涓�杈�17娉礯杞��, "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车杞��" }, + { 涓�杈�18娉礯杞��, "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车杞��" }, + { 涓�杈�11娉礯棰戠巼, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�12娉礯棰戠巼, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�13娉礯棰戠巼, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�14娉礯棰戠巼, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�17娉礯棰戠巼, "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�18娉礯棰戠巼, "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�" }, + { 涓�杈�11娉礯杩愯鐘舵��, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�12娉礯杩愯鐘舵��, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�13娉礯杩愯鐘舵��, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�14娉礯杩愯鐘舵��, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�15娉礯杩愯鐘舵��, "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.15#姘存车杩愯" }, + { 涓�杈�16娉礯杩愯鐘舵��, "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16#姘存车杩愯" }, + { 涓�杈�17娉礯杩愯鐘舵��, "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�18娉礯杩愯鐘舵��, "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�" }, + { 涓�杈�11娉礯杩愯鏃堕棿, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.杩愯鏃堕棿" }, + { 涓�杈�12娉礯杩愯鏃堕棿, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.杩愯鏃堕棿" }, + { 涓�杈�13娉礯杩愯鏃堕棿, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.杩愯鏃堕棿" }, + { 涓�杈�14娉礯杩愯鏃堕棿, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.杩愯鏃堕棿" }, + { 涓�杈�11娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�12娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杩愯鏃堕棿" }, + { 涓�杈�13娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�14娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�15娉礯绱杩愯鏃堕棿, "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�16娉礯绱杩愯鏃堕棿, "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�17娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�18娉礯绱杩愯鏃堕棿, "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�11娉礯鏈夊姛鍔熺巼, "11鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�12娉礯鏈夊姛鍔熺巼, "12鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�13娉礯鏈夊姛鍔熺巼, "13鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�14娉礯鏈夊姛鍔熺巼, "14鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�15娉礯鏈夊姛鍔熺巼, "15鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�16娉礯鏈夊姛鍔熺巼, "涓�杈撴按6KV_閰嶇數鏌淿M112.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�17娉礯鏈夊姛鍔熺巼, "涓�杈撴按6KV_閰嶇數鏌淿M108.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�18娉礯鏈夊姛鍔熺巼, "涓�杈撴按6KV_閰嶇數鏌淿M111.鎬绘湁鍔熷姛鐜�" }, + { 涓�杈�11娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�12娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杩愯鏃堕棿" }, + { 涓�杈�13娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�14娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�15娉礯绱杩愯鏃堕棿_鍘嗗彶, "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�16娉礯绱杩愯鏃堕棿_鍘嗗彶, "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�17娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�18娉礯绱杩愯鏃堕棿_鍘嗗彶, "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿" }, + { 涓�杈�11娉礯鐘舵��, "涓�杈撴按11鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + { 涓�杈�12娉礯鐘舵��, "涓�杈撴按12鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + { 涓�杈�13娉礯鐘舵��, "涓�杈撴按13鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + { 涓�杈�14娉礯鐘舵��, "涓�杈撴按14鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + { 涓�杈�15娉礯鐘舵��, "涓�杈撴按15鍙疯緟鍔╄澶囧浘.涓夋。浣嶅垏鎹�" }, + { 涓�杈�16娉礯鐘舵��, "涓�杈撴按16鍙疯緟鍔╄澶囧浘.涓夋。浣嶅垏鎹�" }, + { 涓�杈�17娉礯鐘舵��, "涓�杈撴按17鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + { 涓�杈�18娉礯鐘舵��, "涓�杈撴按18鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�" }, + + // 浜岃緭鐩稿叧 + { DN2400_鍑哄巶鍘嬪姏, "2400鎬荤.鍑哄巶鍘嬪姏" }, + { DN2700_鍑哄巶鍘嬪姏, "2700鎬荤.鍑哄巶鍘嬪姏" }, + { DN2400_鍑哄巶鍘嬪姏_闀挎睙绠$綉鍥�, "2400鎬荤.鍑哄巶鍘嬪姏" }, + { DN2700_鍑哄巶鍘嬪姏_闀挎睙绠$綉鍥�, "2700鎬荤.鍑哄巶鍘嬪姏" }, + { DN2400鎬荤_鐬椂娴侀噺, "2400鎬荤.鐬椂娴侀噺" }, + { DN2700鎬荤_鐬椂娴侀噺, "2700鎬荤.鐬椂娴侀噺" }, + { DN2400鎬荤_鐬椂娴侀噺_闀挎睙绠$綉鍥�, "2400鎬荤.鐬椂娴侀噺" }, + { DN2700鎬荤_鐬椂娴侀噺_闀挎睙绠$綉鍥�, "2700鎬荤.鐬椂娴侀噺" }, + { DN2400鎬荤_瀹為檯绱娴侀噺, "2400鎬荤.瀹為檯绱娴侀噺" }, + { DN2700鎬荤_瀹為檯绱娴侀噺, "2700鎬荤.瀹為檯绱娴侀噺" }, + { DN2400鎬荤_绱娴侀噺_闀挎睙绠$綉鍥�, "2400鎬荤.瀹為檯绱娴侀噺" }, + { DN2700鎬荤_绱娴侀噺_闀挎睙绠$綉鍥�, "2700鎬荤.瀹為檯绱娴侀噺" }, + { 浜岃緭21娉礯娉典簳娑蹭綅, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭22娉礯娉典簳娑蹭綅, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭23娉礯娉典簳娑蹭綅, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭24娉礯娉典簳娑蹭綅, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭25娉礯娉典簳娑蹭綅, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭26娉礯娉典簳娑蹭綅, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭27娉礯娉典簳娑蹭綅, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅" }, + { 浜岃緭21娉礯鍑烘按鍘嬪姏, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭22娉礯鍑烘按鍘嬪姏, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭23娉礯鍑烘按鍘嬪姏, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭24娉礯鍑烘按鍘嬪姏, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭25娉礯鍑烘按鍘嬪姏, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭26娉礯鍑烘按鍘嬪姏, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭27娉礯鍑烘按鍘嬪姏, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏" }, + { 浜岃緭21娉礯鐬椂娴侀噺, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭22娉礯鐬椂娴侀噺, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭23娉礯鐬椂娴侀噺, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭24娉礯鐬椂娴侀噺, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭25娉礯鐬椂娴侀噺, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭26娉礯鐬椂娴侀噺, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭27娉礯鐬椂娴侀噺, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺" }, + { 浜岃緭21娉礯绱娴侀噺, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭22娉礯绱娴侀噺, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭23娉礯绱娴侀噺, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭24娉礯绱娴侀噺, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭25娉礯绱娴侀噺, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭26娉礯绱娴侀噺, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭27娉礯绱娴侀噺, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺" }, + { 浜岃緭21娉礯鏈夊姛鐢佃兘, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭22娉礯鏈夊姛鐢佃兘, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭23娉礯鏈夊姛鐢佃兘, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭24娉礯鏈夊姛鐢佃兘, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭25娉礯鏈夊姛鐢佃兘, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭26娉礯鏈夊姛鐢佃兘, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭27娉礯鏈夊姛鐢佃兘, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘" }, + { 浜岃緭22娉礯棰戠巼, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭23娉礯棰戠巼, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭24娉礯棰戠巼, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭25娉礯棰戠巼, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭26娉礯棰戠巼, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭27娉礯棰戠巼, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.棰戠巼" }, + { 浜岃緭21娉礯杞��, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭22娉礯杞��, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭23娉礯杞��, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭24娉礯杞��, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭25娉礯杞��, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭26娉礯杞��, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭27娉礯杞��, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杞��" }, + { 浜岃緭21娉礯鏈夊姛鍔熺巼, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭22娉礯鏈夊姛鍔熺巼, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭23娉礯鏈夊姛鍔熺巼, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭24娉礯鏈夊姛鍔熺巼, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭25娉礯鏈夊姛鍔熺巼, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭26娉礯鏈夊姛鍔熺巼, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭27娉礯鏈夊姛鍔熺巼, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼" }, + { 浜岃緭21娉礯杩愯鐘舵��, "浜岃緭姘�21鍙锋按娉佃鍥�.娉佃繍琛�" }, + { 浜岃緭22娉礯杩愯鐘舵��, "浜岃緭姘�22鍙锋按娉佃鍥�.娉佃繍琛�" }, + { 浜岃緭23娉礯杩愯鐘舵��, "浜岃緭姘�23鍙锋按娉佃蒋鍚姩.杩愯" }, + { 浜岃緭24娉礯杩愯鐘舵��, "浜岃緭姘�24鍙锋按娉佃鍥�.娉佃繍琛�" }, + { 浜岃緭25娉礯杩愯鐘舵��, "浜岃緭姘�25鍙锋按娉佃鍥�.娉佃繍琛�" }, + { 浜岃緭26娉礯杩愯鐘舵��, "浜岃緭姘�26鍙锋按娉佃鍥�.娉佃繍琛�" }, + { 浜岃緭27娉礯杩愯鐘舵��, "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杩愯鐘舵��" }, + { 浜岃緭21娉礯杩愯鏃堕棿, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭22娉礯杩愯鏃堕棿, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭23娉礯杩愯鏃堕棿, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭24娉礯杩愯鏃堕棿, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭25娉礯杩愯鏃堕棿, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭26娉礯杩愯鏃堕棿, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭27娉礯杩愯鏃堕棿, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭21娉礯鐘舵��, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭22娉礯鐘舵��, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭23娉礯鐘舵��, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭24娉礯鐘舵��, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭25娉礯鐘舵��, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭26娉礯鐘舵��, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭27娉礯鐘舵��, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐘舵��" }, + { 浜岃緭21娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭22娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭23娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭24娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭25娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭26娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" }, + { 浜岃緭27娉礯绱杩愯鏃堕棿_鍘嗗彶, "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿" } + }.GroupBy(kvp => kvp.Key) // 鎸塊ey鍒嗙粍 + .ToDictionary(g => g.Key, g => g.Last().Value); // 鍙栨渶鍚庝竴涓猇alue;; + + /// <summary> + /// HistoryShuShuiTagCodeMapping + /// </summary> + public static readonly Dictionary<string, string> HistoryShuShuiTagCodeMappingDict = new Dictionary<string, string>() + { + // 浜屽彇鐩稿叧 + { "闀挎睙绠$綉鍥�.XTB_QCYW",闀挎睙姘翠綅 }, + { "浜屽彇姘�1鍙蜂富姘存车.鍓嶆睜娑蹭綅",浜屽彇鍓嶆睜娑蹭綅 }, + { "闄堣姘村簱娑蹭綅",闄堣姘村簱姘翠綅 }, + { "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼",浜屽彇1娉礯鏈夊姛鍔熺巼 }, + { "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鍔熺巼",浜屽彇2娉礯鏈夊姛鍔熺巼 }, + { "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鍔熺巼",浜屽彇3娉礯鏈夊姛鍔熺巼 }, + { "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鍔熺巼",浜屽彇4娉礯鏈夊姛鍔熺巼 }, + { "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鍔熺巼",浜屽彇5娉礯鏈夊姛鍔熺巼 }, + { "浜屽彇姘�1鍙蜂富姘存车.鍑哄彛鍘嬪姏",浜屽彇1娉礯鍑哄彛鍘嬪姏 }, + { "浜屽彇姘�2鍙蜂富姘存车.鍑哄彛鍘嬪姏",浜屽彇2娉礯鍑哄彛鍘嬪姏 }, + { "浜屽彇姘�3鍙蜂富姘存车.鍑哄彛鍘嬪姏",浜屽彇3娉礯鍑哄彛鍘嬪姏 }, + { "浜屽彇姘�4鍙蜂富姘存车.鍑哄彛鍘嬪姏",浜屽彇4娉礯鍑哄彛鍘嬪姏 }, + { "浜屽彇姘�5鍙蜂富姘存车.鍑哄彛鍘嬪姏",浜屽彇5娉礯鍑哄彛鍘嬪姏 }, + { "浜屽彇姘�1鍙蜂富姘存车.姘存车杩愯鐘舵��",浜屽彇1娉礯姘存车_杩愯鐘舵�� }, + { "浜屽彇姘�2鍙蜂富姘存车.姘存车杩愯鐘舵��",浜屽彇2娉礯姘存车_杩愯鐘舵�� }, + { "浜屽彇姘�3鍙蜂富姘存车.姘存车杩愯鐘舵��",浜屽彇3娉礯姘存车_杩愯鐘舵�� }, + { "浜屽彇姘�4鍙蜂富姘存车.姘存车杩愯鐘舵��",浜屽彇4娉礯姘存车_杩愯鐘舵�� }, + { "浜屽彇姘�5鍙蜂富姘存车.姘存车杩愯鐘舵��",浜屽彇5娉礯姘存车_杩愯鐘舵�� }, + { "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鐢佃兘",浜屽彇1娉礯鏈夊姛鐢佃兘 }, + { "浜屽彇姘撮珮鍘�2鍙蜂富姘存车.鏈夊姛鐢佃兘",浜屽彇2娉礯鏈夊姛鐢佃兘 }, + { "浜屽彇姘撮珮鍘�3鍙蜂富姘存车.鏈夊姛鐢佃兘",浜屽彇3娉礯鏈夊姛鐢佃兘 }, + { "浜屽彇姘撮珮鍘�4鍙蜂富姘存车.鏈夊姛鐢佃兘",浜屽彇4娉礯鏈夊姛鐢佃兘 }, + { "浜屽彇姘撮珮鍘�5鍙蜂富姘存车.鏈夊姛鐢佃兘",浜屽彇5娉礯鏈夊姛鐢佃兘 }, + { "浜屽彇姘�1鍙蜂富姘存车.绱娴侀噺",浜屽彇1娉礯绱娴侀噺 }, + { "浜屽彇姘�2鍙蜂富姘存车.绱娴侀噺",浜屽彇2娉礯绱娴侀噺 }, + { "浜屽彇姘�3鍙蜂富姘存车.绱娴侀噺",浜屽彇3娉礯绱娴侀噺 }, + { "浜屽彇姘�4鍙蜂富姘存车.绱娴侀噺",浜屽彇4娉礯绱娴侀噺 }, + { "浜屽彇姘�5鍙蜂富姘存车.绱娴侀噺",浜屽彇5娉礯绱娴侀噺 }, + { "浜屽彇姘�1鍙蜂富姘存车.鐬椂娴侀噺",浜屽彇1娉礯鐬椂娴侀噺 }, + { "浜屽彇姘�2鍙蜂富姘存车.鐬椂娴侀噺",浜屽彇2娉礯鐬椂娴侀噺 }, + { "浜屽彇姘�3鍙蜂富姘存车.鐬椂娴侀噺",浜屽彇3娉礯鐬椂娴侀噺 }, + { "浜屽彇姘�4鍙蜂富姘存车.鐬椂娴侀噺",浜屽彇4娉礯鐬椂娴侀噺 }, + { "浜屽彇姘�5鍙蜂富姘存车.鐬椂娴侀噺",浜屽彇5娉礯鐬椂娴侀噺 }, + //{ "浜屽彇姘�1鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇1娉礯绱杩愯鏃堕棿 }, + //{ "浜屽彇姘�2鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇2娉礯绱杩愯鏃堕棿 }, + //{ "浜屽彇姘�3鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇3娉礯绱杩愯鏃堕棿 }, + //{ "浜屽彇姘�4鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇4娉礯绱杩愯鏃堕棿 }, + //{ "浜屽彇姘�5鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇5娉礯绱杩愯鏃堕棿 }, + { "浜屽彇姘�1鍙蜂富姘存车.妫�淇姸鎬�",浜屽彇1娉礯妫�淇姸鎬� }, + { "浜屽彇姘�2鍙蜂富姘存车.妫�淇姸鎬�",浜屽彇2娉礯妫�淇姸鎬� }, + { "浜屽彇姘�3鍙蜂富姘存车.妫�淇姸鎬�",浜屽彇3娉礯妫�淇姸鎬� }, + { "浜屽彇姘�4鍙蜂富姘存车.妫�淇姸鎬�",浜屽彇4娉礯妫�淇姸鎬� }, + { "浜屽彇姘�5鍙蜂富姘存车.妫�淇姸鎬�",浜屽彇5娉礯妫�淇姸鎬� }, + { "浜屽彇姘�1鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇1娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜屽彇姘�2鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇2娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜屽彇姘�3鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇3娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜屽彇姘�4鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇4娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜屽彇姘�5鍙蜂富姘存车.绱杩愯鏃堕棿",浜屽彇5娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + + // 涓�杈撶浉鍏� + //{ "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�",鍢夊畾1绾縚鐬椂娴侀噺 }, + //{ "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�",鍢夊畾2绾縚鐬椂娴侀噺 }, + //{ "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�",鍢夊畾3绾縚鐬椂娴侀噺 }, + { "鍢夊畾鏁版嵁.1绾跨灛鏃舵祦閲�",鍢夊畾1绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.2绾跨灛鏃舵祦閲�",鍢夊畾2绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.3绾跨灛鏃舵祦閲�",鍢夊畾3绾縚鐬椂娴侀噺_闀挎睙绠$綉鍥� }, + //{ "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�",鍢夊畾1绾縚琛ㄥご绱 }, + //{ "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�",鍢夊畾2绾縚琛ㄥご绱 }, + //{ "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�",鍢夊畾3绾縚琛ㄥご绱 }, + { "鍢夊畾鏁版嵁.1绾胯〃澶寸疮璁�",鍢夊畾1绾縚绱娴侀噺_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.2绾胯〃澶寸疮璁�",鍢夊畾2绾縚绱娴侀噺_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.3绾胯〃澶寸疮璁�",鍢夊畾3绾縚绱娴侀噺_闀挎睙绠$綉鍥� }, + //{ "鍢夊畾鏁版嵁.1绾垮帇鍔�",鍢夊畾1绾縚鍘嬪姏 }, + //{ "鍢夊畾鏁版嵁.2绾垮帇鍔�",鍢夊畾2绾縚鍘嬪姏 }, + //{ "鍢夊畾鏁版嵁.3绾垮帇鍔�",鍢夊畾3绾縚鍘嬪姏 }, + { "鍢夊畾鏁版嵁.1绾垮帇鍔�",鍢夊畾1绾縚鍘嬪姏_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.2绾垮帇鍔�",鍢夊畾2绾縚鍘嬪姏_闀挎睙绠$綉鍥� }, + { "鍢夊畾鏁版嵁.3绾垮帇鍔�",鍢夊畾3绾縚鍘嬪姏_闀挎睙绠$綉鍥� }, + { "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鑰佸墠姹犲崡渚ф恫浣�",涓�杈揰鑰佸墠姹犲崡渚ф恫浣� }, + { "涓�杈撴按14鍙峰彉棰戝崟娉�.鍓嶆睜娑蹭綅",涓�杈揰鑰佸墠姹犲寳渚ф恫浣� }, + { "HF涓�杈撴按娉垫埧鎬诲浘.涓�杈撴按鏂板墠姹犳恫浣�",涓�杈揰鏂板墠姹犳恫浣� }, + { "HF涓�杈撴按11鍙峰彉棰戞帶鍒剁敾闈�.11鍙锋车鍑哄彛鍘嬪姏",涓�杈�11娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按12鍙峰彉棰戞帶鍒剁敾闈�.12鍙锋车鍑哄彛鍘嬪姏",涓�杈�12娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按13鍙峰彉棰戞帶鍒剁敾闈�.13鍙锋车鍑哄彛鍘嬪姏",涓�杈�13娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按14鍙峰彉棰戞帶鍒跺浘.14鍙锋车鍑哄彛鍘嬪姏",涓�杈�14娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.15鍙锋车鍑哄彛鍘嬪姏",涓�杈�15娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16鍙锋车鍑哄彛鍘嬪姏",涓�杈�16娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按17鍙峰彉棰戞帶鍒跺浘.17鍙锋车鍑哄彛鍘嬪姏",涓�杈�17娉礯鍑哄彛鍘嬪姏 }, + { "HF涓�杈撴按18鍙峰彉棰戞帶鍒跺浘.18鍙锋车鍑哄彛鍘嬪姏",涓�杈�18娉礯鍑哄彛鍘嬪姏 }, + { "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车杞��",涓�杈�11娉礯杞�� }, + { "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杞��",涓�杈�12娉礯杞�� }, + { "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车杞��",涓�杈�13娉礯杞�� }, + { "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车杞��",涓�杈�14娉礯杞�� }, + { "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车杞��",涓�杈�17娉礯杞�� }, + { "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车杞��",涓�杈�18娉礯杞�� }, + { "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�",涓�杈�11娉礯棰戠巼 }, + { "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄩ鐜�",涓�杈�12娉礯棰戠巼 }, + { "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�",涓�杈�13娉礯棰戠巼 }, + { "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�",涓�杈�14娉礯棰戠巼 }, + { "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�",涓�杈�17娉礯棰戠巼 }, + { "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄩ鐜�",涓�杈�18娉礯棰戠巼 }, + { "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�",涓�杈�11娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.鍙橀鍣ㄨ繍琛�",涓�杈�12娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�",涓�杈�13娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�",涓�杈�14娉礯杩愯鐘舵�� }, + { "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.15#姘存车杩愯",涓�杈�15娉礯杩愯鐘舵�� }, + { "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.16#姘存车杩愯",涓�杈�16娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�",涓�杈�17娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.鍙橀鍣ㄨ繍琛�",涓�杈�18娉礯杩愯鐘舵�� }, + { "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.杩愯鏃堕棿",涓�杈�11娉礯杩愯鏃堕棿 }, + { "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.杩愯鏃堕棿",涓�杈�12娉礯杩愯鏃堕棿 }, + { "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.杩愯鏃堕棿",涓�杈�13娉礯杩愯鏃堕棿 }, + { "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.杩愯鏃堕棿",涓�杈�14娉礯杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�11娉礯绱杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杩愯鏃堕棿",涓�杈�12娉礯绱杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�13娉礯绱杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�14娉礯绱杩愯鏃堕棿 }, + //{ "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿",涓�杈�15娉礯绱杩愯鏃堕棿 }, + //{ "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿",涓�杈�16娉礯绱杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�17娉礯绱杩愯鏃堕棿 }, + //{ "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�18娉礯绱杩愯鏃堕棿 }, + { "11鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�",涓�杈�11娉礯鏈夊姛鍔熺巼 }, + { "12鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�",涓�杈�12娉礯鏈夊姛鍔熺巼 }, + { "13鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�",涓�杈�13娉礯鏈夊姛鍔熺巼 }, + { "14鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�",涓�杈�14娉礯鏈夊姛鍔熺巼 }, + { "15鍙�6KV閰嶇數鍙傛暟.鎬绘湁鍔熷姛鐜�",涓�杈�15娉礯鏈夊姛鍔熺巼 }, + { "涓�杈撴按6KV_閰嶇數鏌淿M112.鎬绘湁鍔熷姛鐜�",涓�杈�16娉礯鏈夊姛鍔熺巼 }, + { "涓�杈撴按6KV_閰嶇數鏌淿M108.鎬绘湁鍔熷姛鐜�",涓�杈�17娉礯鏈夊姛鍔熺巼 }, + { "涓�杈撴按6KV_閰嶇數鏌淿M111.鎬绘湁鍔熷姛鐜�",涓�杈�18娉礯鏈夊姛鍔熺巼 }, + { "涓�杈撴按娉�11鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�11娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按娉�12鍙峰彉棰戝崟娉�1.姘存车杩愯鏃堕棿",涓�杈�12娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按娉�13鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�13娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按娉�14鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�14娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "HF涓�杈撴按15鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿",涓�杈�15娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "HF涓�杈撴按16鍙峰伐棰戞帶鍒跺浘.姘存车绱杩愯鏃堕棿",涓�杈�16娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按娉�17鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�17娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按娉�18鍙峰彉棰戝崟娉�.姘存车绱杩愯鏃堕棿",涓�杈�18娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "涓�杈撴按11鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�11娉礯鐘舵�� }, + { "涓�杈撴按12鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�12娉礯鐘舵�� }, + { "涓�杈撴按13鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�13娉礯鐘舵�� }, + { "涓�杈撴按14鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�14娉礯鐘舵�� }, + { "涓�杈撴按15鍙疯緟鍔╄澶囧浘.涓夋。浣嶅垏鎹�",涓�杈�15娉礯鐘舵�� }, + { "涓�杈撴按16鍙疯緟鍔╄澶囧浘.涓夋。浣嶅垏鎹�",涓�杈�16娉礯鐘舵�� }, + { "涓�杈撴按17鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�17娉礯鐘舵�� }, + { "涓�杈撴按18鍙疯緟鍔╄澶�.涓夋。浣嶅垏鎹�",涓�杈�18娉礯鐘舵�� }, + + // 浜岃緭鐩稿叧 + //{ "2400鎬荤.鍑哄巶鍘嬪姏",DN2400_鍑哄巶鍘嬪姏 }, + //{ "2700鎬荤.鍑哄巶鍘嬪姏",DN2700_鍑哄巶鍘嬪姏 }, + { "2400鎬荤.鍑哄巶鍘嬪姏",DN2400_鍑哄巶鍘嬪姏_闀挎睙绠$綉鍥� }, + { "2700鎬荤.鍑哄巶鍘嬪姏",DN2700_鍑哄巶鍘嬪姏_闀挎睙绠$綉鍥� }, + //{ "2400鎬荤.鐬椂娴侀噺",DN2400鎬荤_鐬椂娴侀噺 }, + //{ "2700鎬荤.鐬椂娴侀噺",DN2700鎬荤_鐬椂娴侀噺 }, + { "2400鎬荤.鐬椂娴侀噺",DN2400鎬荤_鐬椂娴侀噺_闀挎睙绠$綉鍥� }, + { "2700鎬荤.鐬椂娴侀噺",DN2700鎬荤_鐬椂娴侀噺_闀挎睙绠$綉鍥� }, + //{ "2400鎬荤.瀹為檯绱娴侀噺",DN2400鎬荤_瀹為檯绱娴侀噺 }, + //{ "2700鎬荤.瀹為檯绱娴侀噺",DN2700鎬荤_瀹為檯绱娴侀噺 }, + { "2400鎬荤.瀹為檯绱娴侀噺",DN2400鎬荤_绱娴侀噺_闀挎睙绠$綉鍥� }, + { "2700鎬荤.瀹為檯绱娴侀噺",DN2700鎬荤_绱娴侀噺_闀挎睙绠$綉鍥� }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭21娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭22娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭23娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭24娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭25娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭26娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.娉典簳娑蹭綅",浜岃緭27娉礯娉典簳娑蹭綅 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭21娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭22娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭23娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭24娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭25娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭26娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鍑烘按鍘嬪姏",浜岃緭27娉礯鍑烘按鍘嬪姏 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭21娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭22娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭23娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭24娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭25娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭26娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐬椂娴侀噺",浜岃緭27娉礯鐬椂娴侀噺 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭21娉礯绱娴侀噺 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭22娉礯绱娴侀噺 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭23娉礯绱娴侀噺 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭24娉礯绱娴侀噺 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭25娉礯绱娴侀噺 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭26娉礯绱娴侀噺 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.绱娴侀噺",浜岃緭27娉礯绱娴侀噺 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭21娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭22娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭23娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭24娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭25娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭26娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鐢佃兘",浜岃緭27娉礯鏈夊姛鐢佃兘 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭22娉礯棰戠巼 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭23娉礯棰戠巼 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭24娉礯棰戠巼 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭25娉礯棰戠巼 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭26娉礯棰戠巼 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.棰戠巼",浜岃緭27娉礯棰戠巼 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭21娉礯杞�� }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭22娉礯杞�� }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭23娉礯杞�� }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭24娉礯杞�� }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭25娉礯杞�� }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭26娉礯杞�� }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杞��",浜岃緭27娉礯杞�� }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭21娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭22娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭23娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭24娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭25娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭26娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鏈夊姛鍔熺巼",浜岃緭27娉礯鏈夊姛鍔熺巼 }, + { "浜岃緭姘�21鍙锋按娉佃鍥�.娉佃繍琛�",浜岃緭21娉礯杩愯鐘舵�� }, + { "浜岃緭姘�22鍙锋按娉佃鍥�.娉佃繍琛�",浜岃緭22娉礯杩愯鐘舵�� }, + { "浜岃緭姘�23鍙锋按娉佃蒋鍚姩.杩愯",浜岃緭23娉礯杩愯鐘舵�� }, + { "浜岃緭姘�24鍙锋按娉佃鍥�.娉佃繍琛�",浜岃緭24娉礯杩愯鐘舵�� }, + { "浜岃緭姘�25鍙锋按娉佃鍥�.娉佃繍琛�",浜岃緭25娉礯杩愯鐘舵�� }, + { "浜岃緭姘�26鍙锋按娉佃鍥�.娉佃繍琛�",浜岃緭26娉礯杩愯鐘舵�� }, + { "浜岃緭姘�27鍙锋按娉靛彉棰戝櫒.杩愯鐘舵��",浜岃緭27娉礯杩愯鐘舵�� }, + //{ "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭21娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭22娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭23娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭24娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭25娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭26娉礯杩愯鏃堕棿 }, + //{ "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭27娉礯杩愯鏃堕棿 }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭21娉礯鐘舵�� }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭22娉礯鐘舵�� }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭23娉礯鐘舵�� }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭24娉礯鐘舵�� }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭25娉礯鐘舵�� }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭26娉礯鐘舵�� }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.鐘舵��",浜岃緭27娉礯鐘舵�� }, + { "浜岃緭姘�21鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭21娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�22鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭22娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�23鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭23娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�24鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭24娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�25鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭25娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�26鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭26娉礯绱杩愯鏃堕棿_鍘嗗彶 }, + { "浜岃緭姘�27鍙锋按娉佃繍琛屽弬鏁�.杩愯鏃堕棿",浜岃緭27娉礯绱杩愯鏃堕棿_鍘嗗彶 } + }.GroupBy(kvp => kvp.Key) // 鎸塊ey鍒嗙粍 + .ToDictionary(g => g.Key, g => g.Last().Value); // 鍙栨渶鍚庝竴涓猇alue; + + #endregion #region 鑾峰彇 閰嶇疆瀛楀吀 /// <summary> @@ -1158,6 +1962,7 @@ return log_str_builder.ToString(); } + #endregion #region 鑾峰彇璋冨害绠楁硶鍏ュ弬 diff --git a/01-api/Service/IStation.Service/02-model/00-basic/02-config/ScheduleConfig.cs b/01-api/Service/IStation.Service/02-model/00-basic/02-config/ScheduleConfig.cs index 8fded96..d4799fb 100644 --- a/01-api/Service/IStation.Service/02-model/00-basic/02-config/ScheduleConfig.cs +++ b/01-api/Service/IStation.Service/02-model/00-basic/02-config/ScheduleConfig.cs @@ -29,6 +29,7 @@ this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); this.FlagCumulativeRuntimeDict = new Dictionary<int, double>(); this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList(); + this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList(); } /// <summary> @@ -48,6 +49,7 @@ this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); this.FlagCumulativeRuntimeDict = new Dictionary<int, double>(); this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList(); + this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList(); } @@ -107,6 +109,11 @@ public List<int> PriorityOpenFlagList { get; set; } /// <summary> + /// 妫�淇垪琛� + /// </summary> + public List<int> MaintenanceFlagList { get; set; } + + /// <summary> /// /// </summary> /// <returns></returns> diff --git a/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs b/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs index 5f6c9cc..4f59fc4 100644 --- a/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs +++ b/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs @@ -32,10 +32,10 @@ private double _station_target_flow_diff = 0; // 绔欑偣鐩爣娴侀噺宸�� - private readonly double _sel_opt_flow_deviation_ratio = 0.05;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣� + private readonly double _sel_opt_flow_deviation_ratio = 0.08;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣� private readonly double _sel_opt_reasonable_flow_deviation_ratio = 0.005;//鍚堢悊鐨勬柟妗堢殑娴侀噺鍋忓樊姣� - private readonly Service.AnalysisParameter _service_analysis_parameter = new(); + private readonly Service.AnalysisParameter _service_analysis_parameter = new(); private int _min_open_count;//鏈�灏忓紑娉垫暟閲� private int _max_open_count;//鏈�澶у紑娉垫暟閲� @@ -49,6 +49,7 @@ private List<Model.FrequencyLimit> _frequency_limit_list = null; // 棰戠巼闄愬埗鍒楄〃 private Dictionary<int, double> _flag_cumulative_runtime_dict = null; // 娉电疮璁¤繍琛屾椂闀垮瓧鍏� private List<int> _priority_open_flag_list = null; // 浼樺厛寮�娉靛垪琛� + private List<int> _maintenance_flag_list = null; // 妫�淇垪琛� private List<Model.AnalysisDeviation> _analysis_deviation_list = null;//鍒嗘瀽鍋忓樊 @@ -74,6 +75,7 @@ _frequency_limit_list = null; _flag_cumulative_runtime_dict = null; _priority_open_flag_list = null; + _maintenance_flag_list = null; _station_target_flow_diff = 0; if (schedule_config != null) { @@ -88,6 +90,7 @@ _frequency_limit_list = schedule_config.FrequencyLimitList; _flag_cumulative_runtime_dict = schedule_config.FlagCumulativeRuntimeDict; _priority_open_flag_list = schedule_config.PriorityOpenFlagList; + _maintenance_flag_list = schedule_config.MaintenanceFlagList; } _analysis_deviation_list = analysis_deviation_list; @@ -113,8 +116,8 @@ double target_pressure ) { - - target_flow+=_station_target_flow_diff; + //鑾峰彇鏂规鏃剁敤琛ュ樊鐨勬祦閲忥紝渚涙按闄愬埗鐢ㄧ洰鏍囨祦閲忓垽鏂� + var target_flow_compensation = target_flow + _station_target_flow_diff; #region 鍒濆鍖栧弬鏁� if (pump_list == null || !pump_list.Any()) { @@ -133,6 +136,7 @@ var frequency_limit_list = _frequency_limit_list; var flag_cumulative_runtime_dict = _flag_cumulative_runtime_dict; var priority_open_flag_list = _priority_open_flag_list; + var maintenance_flag_list = _maintenance_flag_list; var pump_bp_dict = pump_list.ToDictionary(x => x.Flag, x => x.IsBp); var pump_nr_dict = pump_list.ToDictionary(x => x.Flag, x => x.Nr); @@ -141,6 +145,7 @@ var combine_merit_ratio = 1d;//缁勫悎鎷╀紭鐜� target_flow = Math.Round(target_flow, 1); + target_flow_compensation = Math.Round(target_flow_compensation,1); target_pressure = Math.Round(target_pressure, 1); #endregion @@ -240,6 +245,12 @@ #endregion + #region 瀛樺湪-妫�淇垪琛� + + var exist_maintenance_flag_list = maintenance_flag_list != null && maintenance_flag_list.Count > 0; + + #endregion + #region 瀛樺湪-褰撳墠寮�娉靛垪琛� (鏄惁鍒囨车) var exist_current_open_flag_list = current_open_flag_list != null && current_open_flag_list.Count > 0; @@ -254,7 +265,7 @@ { if (target_flow < limit.Min || target_flow > limit.Max) { - exist_limit = true; + exist_limit = true; } } } @@ -269,7 +280,7 @@ pump_bp_dict, exist_frequency_limit_list, frequency_limit_flag_dict, - target_flow, + target_flow_compensation, target_pressure ); if (opt_ana_combine != null) @@ -338,7 +349,6 @@ if (exist_intersected) continue; } - //绂佺敤缁勫悎 if (exist_forbidden_flag_combine_list) @@ -427,19 +437,20 @@ //浼樺厛寮�娉靛垪琛� if (exist_priority_open_flag_list) { - //foreach (var flag in priority_open_flag_list) - //{ - // if (combine.Contains(flag)) - // { - // combine_merit_ratio *= 1.05; - // } - //} - //鐩墠閫昏緫 浼樺厛寮�娉�==蹇呭紑鏂规 var combine_remark = IntListHelper.ToString(combine.OrderBy(x => x)); if (!combine_remark.Contains(priority_open_flag_list_remark)) continue; } + + //妫�淇垪琛� + if (exist_maintenance_flag_list) + { + var exist_intersected = combine.Intersect(maintenance_flag_list).Count() > 0; + if (exist_intersected) + continue; + } + #endregion @@ -455,7 +466,7 @@ pump_bp_dict, exist_frequency_limit_list, frequency_limit_flag_dict, - target_flow, + target_flow_compensation, target_pressure ); if (opt_ana_combine == null) @@ -463,11 +474,12 @@ opt_ana_combine_list.Add(opt_ana_combine); } + // 20250422 娉ㄩ噴鍘熷洜锛氫緵姘磋寖鍥翠細鏈夐噸鍙狅紝鑰冭檻鍒囨车鎿嶄綔 //濡傛灉褰撳墠寰幆宸茬粡婊¤冻锛屼笉闇�瑕佸啀鍔犳车 - if (opt_ana_combine_list.Any()) - { - break; - } + //if (opt_ana_combine_list.Any()) + //{ + // break; + //} } if (opt_ana_combine_list.Count < 1) @@ -527,7 +539,7 @@ //缁勫悎鍋忓樊绯绘暟 var combine_deviation_factor = combine_deviation_factor_dict[flag]; var current_pressure_diff = target_pressure - inlet_water_level - combine_deviation_factor + _sel_opt_pump_pressure_excess; - + current_pressure_diff = Math.Round(current_pressure_diff, 1); //棰戠巼闄愬埗 @@ -556,7 +568,7 @@ else { var list = _service_analysis_parameter.GetList(run_flag); - conclusion_list = _service_analysis_parameter.GetList(run_flag, current_pressure_diff); + conclusion_list = _service_analysis_parameter.GetList(run_flag, current_pressure_diff); } } } @@ -722,7 +734,7 @@ } if (!ana_combine_list.Any()) return default; - var opt_ana_combine = ana_combine_list.OrderBy(x=>x.TotalFlow).OrderBy(x => x.TotalPower).First(); + var opt_ana_combine = ana_combine_list.OrderBy(x => x.TotalFlow).OrderBy(x => x.TotalPower).First(); return opt_ana_combine; } @@ -1067,8 +1079,8 @@ return ana_fre_pump_list; } - - #endregion + + #endregion } } diff --git a/01-api/_Expand/IStation.Test/IStation.Test.csproj b/01-api/_Expand/IStation.Test/IStation.Test.csproj index 3f42877..ab774ed 100644 --- a/01-api/_Expand/IStation.Test/IStation.Test.csproj +++ b/01-api/_Expand/IStation.Test/IStation.Test.csproj @@ -13,6 +13,7 @@ <Compile Remove="Program - 澶嶅埗%283%29.cs" /> <Compile Remove="Program - 澶嶅埗.cs" /> <Compile Remove="Program - 瀹氭椂鏁版嵁.cs" /> + <Compile Remove="Program - 璋冨害楠岃瘉.cs" /> </ItemGroup> <ItemGroup> diff --git a/01-api/_Expand/IStation.Test/IStation.Test.csproj.user b/01-api/_Expand/IStation.Test/IStation.Test.csproj.user index 06e09a8..0f5ea79 100644 --- a/01-api/_Expand/IStation.Test/IStation.Test.csproj.user +++ b/01-api/_Expand/IStation.Test/IStation.Test.csproj.user @@ -1,6 +1,6 @@ 锘�<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> - <_LastSelectedProfileId>D:\WorkCode\IStation\Schedule.Ch.V1.0\01-api\_Expand\IStation.Test\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId> + <_LastSelectedProfileId>D:\WorkCode\Project\ChDt1\Schedule.Ch.V1.0\01-api\_Expand\IStation.Test\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId> </PropertyGroup> </Project> \ No newline at end of file diff --git "a/01-api/_Expand/IStation.Test/Program - \345\216\206\345\217\262\346\225\260\346\215\256.cs" "b/01-api/_Expand/IStation.Test/Program - \345\216\206\345\217\262\346\225\260\346\215\256.cs" new file mode 100644 index 0000000..97dc7f6 --- /dev/null +++ "b/01-api/_Expand/IStation.Test/Program - \345\216\206\345\217\262\346\225\260\346\215\256.cs" @@ -0,0 +1,234 @@ +锘縰sing IStation; +using Newtonsoft.Json; +using SixLabors.Fonts.Tables.AdvancedTypographic; + +public class InfluxDBHistoryDataFetcher +{ + private readonly HttpClient _httpClient; + private readonly string _baseUri; + + public InfluxDBHistoryDataFetcher(string baseUri) + { + _baseUri = baseUri; + _httpClient = new HttpClient(); + } + + public async Task<List<ResponseData>> FetchDataAsync( + List<string> measurements, + DateTime startTime, + DateTime endTime, + string frequency, + string type = "first") + { + // 姣忔鏈�澶氫紶閫� 5 涓� measurements + const int batchSize = 1; + var allData = new List<ResponseData>(); + + // 鍒嗗壊 measurements 涓哄涓壒娆� + for (int i = 0; i < measurements.Count; i += batchSize) + { + var batchMeasurements = measurements.Skip(i).Take(batchSize).ToList(); + var batchData = await FetchBatchAsync(batchMeasurements, startTime, endTime, frequency, type); + allData.AddRange(batchData); + } + + return allData; + } + + private async Task<List<ResponseData>> FetchBatchAsync( + List<string> measurements, + DateTime startTime, + DateTime endTime, + string frequency, + string type) + { + // 鏋勯�� URL 鍙傛暟 + var queryParams = new Dictionary<string, string> + { + { "startTime", startTime.ToString("yyyy-MM-dd") }, + { "endTime", endTime.ToString("yyyy-MM-dd") }, + { "type", type }, + { "frequency", frequency }, + { "measurements", string.Join(",", measurements) } + }; + + // 鏋勯�犲畬鏁寸殑 URL + var url = ConstructUrl(queryParams); + + try + { + // 鍙戣捣 HTTP GET 璇锋眰 + var response = await _httpClient.GetAsync(url); + response.EnsureSuccessStatusCode(); // 妫�鏌� HTTP 閿欒 + + // 瑙f瀽杩斿洖鐨� JSON 鏁版嵁 + var content = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject<ApiResponse>(content); + + if (result != null && result.Status == "200") + { + return result.Data; + } + else + { + Console.WriteLine($"Error fetching data: {result?.Msg} tag:{string.Join(",", measurements)}"); + return new List<ResponseData>(); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request failed: {ex.Message}"); + return new List<ResponseData>(); + } + } + + private string ConstructUrl(Dictionary<string, string> queryParams) + { + var queryStrings = queryParams + .Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}") + .ToList(); + + return $"{_baseUri}?{string.Join("&", queryStrings)}"; + } + + public List<ResponseData> GetDataByMeasurement(List<ResponseData> allData, string measurementName) + { + return allData.Where(data => data.TagName == measurementName).ToList(); + } +} + +// 鎺ュ彛杩斿洖鐨勬暟鎹ā鍨� +public class ApiResponse +{ + public string Msg { get; set; } + public List<ResponseData> Data { get; set; } + public string Status { get; set; } +} + +public class ResponseData +{ + public string DataMsg { get; set; } + public List<List<string>> Vals { get; set; } + public string TagName { get; set; } +} + +// 浣跨敤绀轰緥 +public class Program +{ + public static async Task Main(string[] args) + { + try + { + // 鍒濆鍖栬緟鍔╃被 + var fetcher = new InfluxDBHistoryDataFetcher( + "http://192.168.201.235:8009/dataController/getCommHistoryDataOfInfluxDB"); + + // 绀轰緥 measurements + var measurements = GlobalHelper.HistoryShuShuiTagList; + + // 鑾峰彇鏁版嵁 + var startTime = new DateTime(2024, 3, 1); + var endTime = new DateTime(2024, 5, 1); + var frequency = "10m";//"12h"; + var type = "first"; + + var allData = await fetcher.FetchDataAsync( + measurements: measurements, + startTime: startTime, + endTime: endTime, + frequency: frequency, + type: type); + + Console.WriteLine("Insert"); + Insert(allData); + + //// 鎵撳嵃缁撴灉 + //Console.WriteLine("鎵�鏈夋暟鎹�:"); + //foreach (var data in allData) + //{ + // Console.WriteLine($"TagName: {data.TagName}"); + // foreach (var val in data.Vals) + // { + // Console.WriteLine($" {val[0]}: {val[1]}"); + // } + //} + + //// 鎻愬彇鐗瑰畾 measurement 鐨勬暟鎹� + //var specificData = fetcher.GetDataByMeasurement(allData, "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼"); + //Console.WriteLine("\n鐗瑰畾娴嬮噺椤规暟鎹�:"); + //foreach (var data in specificData) + //{ + // Console.WriteLine($"TagName: {data.TagName}"); + // foreach (var val in data.Vals) + // { + // Console.WriteLine($" {val[0]}: {val[1]}"); + // } + //} + + } + catch (Exception ex) + { + + Console.WriteLine(ex.Message); + } + Console.WriteLine("缁撴潫"); + Console.ReadKey(); + } + + + private static void Insert(List<ResponseData> list) + { + var db_full_path = IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\monitor.db"; + if (File.Exists(db_full_path)) + { + File.Delete(db_full_path); + } + IStation.Service.MonitorRecord _service_monitor_record = new(); + IStation.Settings.ParasHelper.DataBase.SQLite.MonitorConnectString = "DataSource=" + db_full_path; + IStation.Settings.ParasHelper.Save(); + IStation.InitialHelper.InitMonitorDB(); + + var monitor_record_list = new List<IStation.Model.MonitorRecord>(); + var travel_time_format = new System.Globalization.DateTimeFormatInfo() + { + ShortDatePattern = "yyyy-MM-dd'T'HH:mm:ss.SSS Z" + }; + + + var receiptTime = DateTime.Now; + var mapping_dict = IStation.GlobalHelper.HistoryShuShuiTagCodeMappingDict; + foreach (var item in list) + { + var vals = item.Vals; + foreach (var vlu in vals) + { + var time_str = vlu[0]; + var value_str = vlu[1]; + if (!double.TryParse(value_str, out double value)) + continue; + var time = Convert.ToDateTime(time_str, travel_time_format).AddHours(-8); + var monitor_record = new IStation.Model.MonitorRecord(); + monitor_record.DataTime = time; + monitor_record.DataCode = mapping_dict[item.TagName]; + monitor_record.DataValue = value; + monitor_record.ReceiptTime = receiptTime; + monitor_record_list.Add(monitor_record); + } + } + + + var bol = _service_monitor_record.Inserts(monitor_record_list); + if (bol) + { + Console.WriteLine($"淇濆瓨鎴愬姛锛亄monitor_record_list.Count}鏉�"); + } + else + { + Console.WriteLine($"淇濆瓨澶辫触锛亄monitor_record_list.Count}鏉�"); + } + + + } + + +} \ No newline at end of file diff --git "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0502\051.cs" "b/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0502\051.cs" deleted file mode 100644 index 64048a2..0000000 --- "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0502\051.cs" +++ /dev/null @@ -1,89 +0,0 @@ -锘�// See https://aka.ms/new-console-template for more information - - -using IStation; -using NPOI.HSSF.UserModel; -using NPOI.SS.Formula.Functions; -using NPOI.SS.UserModel; - -//var dt_now = DateTime.Now; -//var dt_next = new DateTime(dt_now.Year, dt_now.Month, dt_now.Day, dt_now.Hour, dt_now.Minute + 1, 0); -//var dt_space = dt_next - dt_now; -//Console.WriteLine($"鍒濆鍖�({dt_space.TotalSeconds})..."); -//Thread.Sleep(dt_space); -//IStation.Service.MonitorRecord _service_monitor_record = new(); -//IStation.Settings.ParasHelper.DataBase.SQLite.AnalysisConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\analysis.db"; -IStation.Settings.ParasHelper.DataBase.SQLite.ScheduleConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\schedule.db"; -//IStation.Settings.ParasHelper.DataBase.SQLite.HydraulicConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\hydraulic.db"; -//IStation.Settings.ParasHelper.DataBase.SQLite.MonitorConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\monitor.db"; -IStation.Settings.ParasHelper.Save(); - -//Console.WriteLine("鍚姩瀹炴椂鏁版嵁閲囬泦..."); -//var timer = new System.Timers.Timer(); -//timer.Interval = 10 * 1000; -//timer.Elapsed += (s, e) => -//{ -// dt_now = DateTime.Now; -// var dt_now_str = dt_now.ToString("G"); -// var get_msg = GlobalHelper.GetMonitorRecordList(dt_now, out List<IStation.Model.MonitorRecord> monitor_record_list, false); -// if (!string.IsNullOrEmpty(get_msg)) -// { -// Console.WriteLine($"{dt_now_str}:{get_msg}"); -// } -// else -// { -// var bol = _service_monitor_record.Inserts(monitor_record_list); -// if (bol) -// { -// Console.WriteLine($"{dt_now_str}:閲囬泦鎴愬姛!"); -// } -// else -// { -// Console.WriteLine($"{dt_now_str}:閲囬泦澶辫触!"); -// } -// } -//}; -//timer.AutoReset = true; -//timer.Start(); - -var list = new IStation.Service.ScheduleRequest().GetAll(); - -Export2Excel(list); -bool Export2Excel(List<IStation.Model.ScheduleRequest> list) -{ - - HSSFWorkbook theBook = new HSSFWorkbook(); - var theSheet1 = theBook.CreateSheet("Sheet1"); - - IRow rowTile = theSheet1.CreateRow(0); - - rowTile.CreateCell(0).SetCellValue("鏃堕棿"); - rowTile.CreateCell(1).SetCellValue("鐩爣娴侀噺"); - rowTile.CreateCell(2).SetCellValue("鐩爣鍘嬪姏"); - - - var count = list.Count(); - for (int i = 1; i < count; i++) - { - var x = list[i]; - var row = theSheet1.CreateRow(i); - row.CreateCell(0).SetCellValue(x.ReceptionTime.ToString("G")); - row.CreateCell(1).SetCellValue(x.TargetFlow2); - row.CreateCell(2).SetCellValue(x.TargetPressure2); - } - - var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "闂鎺掓煡"); - if (!Directory.Exists(root_folder)) - { - Directory.CreateDirectory(root_folder); - } - var file_name = root_folder + "\\" + $"璋冨害鏁版嵁.xls"; - theSheet1.ForceFormulaRecalculation = true; - using (FileStream fs = File.OpenWrite(file_name)) - { - theBook.Write(fs); - } - - return true; -} -Console.ReadKey(); \ No newline at end of file diff --git "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0503\051.cs" "b/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0503\051.cs" deleted file mode 100644 index aa8cba7..0000000 --- "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266\0503\051.cs" +++ /dev/null @@ -1,27 +0,0 @@ -锘�// See https://aka.ms/new-console-template for more information - - -using IStation; -using IStation.Epanet; -using Microsoft.IdentityModel.Logging; -using System.Text; -using Yw; - - var model_file = Path.Combine( - AppDomain.CurrentDomain.BaseDirectory, "easy.inp"); - -var temp_id_build = new StringBuilder(31); -var err = EpanetMethods.ENopen(model_file, "", ""); -if ((int)err > 6) -{ - throw new Exception($"ENopen锛歿err}"); -} - -err = EpanetMethods.ENopenH(); -if ((int)err > 6) -{ - throw new Exception($"ENopenH锛歿err}"); -} - - -Console.ReadKey(); \ No newline at end of file diff --git "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266.cs" "b/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266.cs" index 9d14657..56be8a2 100644 --- "a/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266.cs" +++ "b/01-api/_Expand/IStation.Test/Program - \345\244\215\345\210\266.cs" @@ -1,51 +1,164 @@ -锘�// See https://aka.ms/new-console-template for more information +锘縰sing IStation; +using Newtonsoft.Json; +public class InfluxDBHistoryDataFetcher +{ + private readonly HttpClient _httpClient; + private readonly string _baseUri; -using IStation; + public InfluxDBHistoryDataFetcher(string baseUri) + { + _baseUri = baseUri; + _httpClient = new HttpClient(); + } -//var dt_now = DateTime.Now; -//var dt_next = new DateTime(dt_now.Year, dt_now.Month, dt_now.Day, dt_now.Hour, dt_now.Minute + 1, 0); -//var dt_space = dt_next - dt_now; -//Console.WriteLine($"鍒濆鍖�({dt_space.TotalSeconds})..."); -//Thread.Sleep(dt_space); -//IStation.Service.MonitorRecord _service_monitor_record = new(); -//IStation.Settings.ParasHelper.DataBase.SQLite.AnalysisConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\analysis.db"; -//IStation.Settings.ParasHelper.DataBase.SQLite.ScheduleConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\schedule.db"; -//IStation.Settings.ParasHelper.DataBase.SQLite.HydraulicConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\hydraulic.db"; -//IStation.Settings.ParasHelper.DataBase.SQLite.MonitorConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\monitor.db"; -//IStation.Settings.ParasHelper.Save(); + public async Task<List<ResponseData>> FetchDataAsync( + List<string> measurements, + DateTime startTime, + DateTime endTime, + string frequency, + string type = "first") + { + // 姣忔鏈�澶氫紶閫� 5 涓� measurements + const int batchSize = 5; + var allData = new List<ResponseData>(); -//Console.WriteLine("鍚姩瀹炴椂鏁版嵁閲囬泦..."); -//var timer = new System.Timers.Timer(); -//timer.Interval = 10 * 1000; -//timer.Elapsed += (s, e) => -//{ -// dt_now = DateTime.Now; -// var dt_now_str = dt_now.ToString("G"); -// var get_msg = GlobalHelper.GetMonitorRecordList(dt_now, out List<IStation.Model.MonitorRecord> monitor_record_list, false); -// if (!string.IsNullOrEmpty(get_msg)) -// { -// Console.WriteLine($"{dt_now_str}:{get_msg}"); -// } -// else -// { -// var bol = _service_monitor_record.Inserts(monitor_record_list); -// if (bol) -// { -// Console.WriteLine($"{dt_now_str}:閲囬泦鎴愬姛!"); -// } -// else -// { -// Console.WriteLine($"{dt_now_str}:閲囬泦澶辫触!"); -// } -// } -//}; -//timer.AutoReset = true; -//timer.Start(); + // 鍒嗗壊 measurements 涓哄涓壒娆� + for (int i = 0; i < measurements.Count; i += batchSize) + { + var batchMeasurements = measurements.Skip(i).Take(batchSize).ToList(); + var batchData = await FetchBatchAsync(batchMeasurements, startTime, endTime, frequency, type); + allData.AddRange(batchData); + } + return allData; + } + private async Task<List<ResponseData>> FetchBatchAsync( + List<string> measurements, + DateTime startTime, + DateTime endTime, + string frequency, + string type) + { + // 鏋勯�� URL 鍙傛暟 + var queryParams = new Dictionary<string, string> + { + { "startTime", startTime.ToString("yyyy-MM-dd") }, + { "endTime", endTime.ToString("yyyy-MM-dd") }, + { "type", type }, + { "frequency", frequency }, + { "measurements", string.Join(",", measurements) } + }; -var request_list= + // 鏋勯�犲畬鏁寸殑 URL + var url = ConstructUrl(queryParams); + try + { + // 鍙戣捣 HTTP GET 璇锋眰 + var response = await _httpClient.GetAsync(url); + response.EnsureSuccessStatusCode(); // 妫�鏌� HTTP 閿欒 -Console.ReadKey(); \ No newline at end of file + // 瑙f瀽杩斿洖鐨� JSON 鏁版嵁 + var content = await response.Content.ReadAsStringAsync(); + var result = JsonConvert.DeserializeObject<ApiResponse>(content); + + if (result != null && result.Status == "200") + { + return result.Data; + } + else + { + Console.WriteLine($"Error fetching data: {result?.Msg}"); + return new List<ResponseData>(); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request failed: {ex.Message}"); + return new List<ResponseData>(); + } + } + + private string ConstructUrl(Dictionary<string, string> queryParams) + { + var queryStrings = queryParams + .Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}") + .ToList(); + + return $"{_baseUri}?{string.Join("&", queryStrings)}"; + } + + public List<ResponseData> GetDataByMeasurement(List<ResponseData> allData, string measurementName) + { + return allData.Where(data => data.TagName == measurementName).ToList(); + } +} + +// 鎺ュ彛杩斿洖鐨勬暟鎹ā鍨� +public class ApiResponse +{ + public string Msg { get; set; } + public List<ResponseData> Data { get; set; } + public string Status { get; set; } +} + +public class ResponseData +{ + public string DataMsg { get; set; } + public List<List<string>> Vals { get; set; } + public string TagName { get; set; } +} + +// 浣跨敤绀轰緥 +public class Program +{ + public static async Task Main(string[] args) + { + // 鍒濆鍖栬緟鍔╃被 + var fetcher = new InfluxDBHistoryDataFetcher( + "http://192.168.201.235:8009/dataController/getCommHistoryDataOfInfluxDB"); + + // 绀轰緥 measurements + var measurements = GlobalHelper.HistoryTagList; + + // 鑾峰彇鏁版嵁 + var startTime = new DateTime(2024, 5, 12); + var endTime = new DateTime(2024, 5, 13); + var frequency = "12h"; + var type = "first"; + + var allData = await fetcher.FetchDataAsync( + measurements: measurements, + startTime: startTime, + endTime: endTime, + frequency: frequency, + type: type); + + // 鎵撳嵃缁撴灉 + Console.WriteLine("鎵�鏈夋暟鎹�:"); + foreach (var data in allData) + { + Console.WriteLine($"TagName: {data.TagName}"); + foreach (var val in data.Vals) + { + Console.WriteLine($" {val[0]}: {val[1]}"); + } + } + + // 鎻愬彇鐗瑰畾 measurement 鐨勬暟鎹� + var specificData = fetcher.GetDataByMeasurement(allData, "浜屽彇姘撮珮鍘�1鍙蜂富姘存车.鏈夊姛鍔熺巼"); + Console.WriteLine("\n鐗瑰畾娴嬮噺椤规暟鎹�:"); + foreach (var data in specificData) + { + Console.WriteLine($"TagName: {data.TagName}"); + foreach (var val in data.Vals) + { + Console.WriteLine($" {val[0]}: {val[1]}"); + } + } + Console.WriteLine("缁撴潫"); + Console.ReadKey(); + } +} \ No newline at end of file diff --git "a/01-api/_Expand/IStation.Test/Program - \345\256\232\346\227\266\346\225\260\346\215\256.cs" "b/01-api/_Expand/IStation.Test/Program - \345\256\232\346\227\266\346\225\260\346\215\256.cs" index 4c366a4..1750fbb 100644 --- "a/01-api/_Expand/IStation.Test/Program - \345\256\232\346\227\266\346\225\260\346\215\256.cs" +++ "b/01-api/_Expand/IStation.Test/Program - \345\256\232\346\227\266\346\225\260\346\215\256.cs" @@ -20,7 +20,7 @@ Console.WriteLine("鍚姩瀹炴椂鏁版嵁閲囬泦..."); var timer = new System.Timers.Timer(); -timer.Interval = 50 * 1000; +timer.Interval = 60 * 1000; timer.Elapsed += (s, e) => { dt_now = DateTime.Now; diff --git a/01-api/_Expand/IStation.Test/Program.cs "b/01-api/_Expand/IStation.Test/Program - \350\260\203\345\272\246\351\252\214\350\257\201.cs" similarity index 89% rename from 01-api/_Expand/IStation.Test/Program.cs rename to "01-api/_Expand/IStation.Test/Program - \350\260\203\345\272\246\351\252\214\350\257\201.cs" index c58348a..bee492f 100644 --- a/01-api/_Expand/IStation.Test/Program.cs +++ "b/01-api/_Expand/IStation.Test/Program - \350\260\203\345\272\246\351\252\214\350\257\201.cs" @@ -64,16 +64,18 @@ log_title = "璋冨害杩斿洖"; var helper = new IStation.Service.ScheduleHelper(); -var target_flow1 = 21459.379000000004; -var target_mpa_pressure1 = 0.2615; -var target_flow2 = 31602.6; -var target_mpa_pressure2 = 0.174; - -//helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list); -//var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1); +var target_flow1 = 20722.197; +var target_mpa_pressure1 = 0.2556; +var target_flow2 = 34628.6; +var target_mpa_pressure2 = 0.1595; var target_pressure1 = IStation.Curve.PumpCalculateHelper.Mpa2M(target_mpa_pressure1); var target_pressure2 = IStation.Curve.PumpCalculateHelper.Mpa2M(target_mpa_pressure2); + +helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list); +var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1); + + helper.Initial(station2_open_flag_list, station2_schedule_config, analysis_deviation_list); var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_flag_inlet_water_level_dict, target_flow2, target_pressure2); diff --git a/01-api/_Expand/IStation.Test/Properties/PublishProfiles/FolderProfile.pubxml.user b/01-api/_Expand/IStation.Test/Properties/PublishProfiles/FolderProfile.pubxml.user index 898c9ca..1022ba7 100644 --- a/01-api/_Expand/IStation.Test/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/01-api/_Expand/IStation.Test/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -4,7 +4,7 @@ --> <Project> <PropertyGroup> - <History>True|2024-09-24T11:31:12.5290103Z||;True|2024-09-24T19:29:31.9699321+08:00||;True|2024-09-24T19:28:08.2990298+08:00||;True|2024-09-24T19:27:30.4502121+08:00||;True|2024-09-24T19:22:54.9042937+08:00||;True|2024-09-24T19:19:56.7479278+08:00||;True|2024-09-24T19:19:09.7539146+08:00||;True|2024-09-24T19:13:14.7061740+08:00||;False|2024-09-24T19:12:56.0055786+08:00||;False|2024-09-24T19:12:53.2614604+08:00||;False|2024-09-24T19:12:48.7493833+08:00||;False|2024-09-24T19:12:44.3720182+08:00||;True|2024-09-24T19:07:58.3465782+08:00||;True|2024-09-24T19:05:30.9998266+08:00||;True|2024-09-24T18:54:38.2183342+08:00||;True|2024-09-24T18:48:06.9234761+08:00||;</History> + <History>True|2025-04-17T05:28:40.3924081Z||;True|2025-04-17T13:20:49.2038819+08:00||;True|2025-04-17T13:15:26.4172317+08:00||;True|2025-04-17T12:51:35.9533762+08:00||;True|2025-04-17T12:50:30.6355723+08:00||;True|2025-04-17T12:49:19.3429590+08:00||;True|2025-04-17T12:12:38.2829789+08:00||;True|2025-04-17T12:08:19.7557855+08:00||;True|2025-04-17T12:07:18.2474142+08:00||;True|2025-04-17T12:04:57.6742146+08:00||;True|2025-04-17T11:56:53.1884453+08:00||;True|2025-04-17T11:52:34.7185498+08:00||;True|2025-04-17T11:48:31.4924507+08:00||;False|2025-04-17T11:48:13.1663227+08:00||;True|2025-04-17T10:50:07.6019230+08:00||;True|2025-04-17T10:36:34.9745430+08:00||;True|2024-09-24T19:31:12.5290103+08:00||;True|2024-09-24T19:29:31.9699321+08:00||;True|2024-09-24T19:28:08.2990298+08:00||;True|2024-09-24T19:27:30.4502121+08:00||;True|2024-09-24T19:22:54.9042937+08:00||;True|2024-09-24T19:19:56.7479278+08:00||;True|2024-09-24T19:19:09.7539146+08:00||;True|2024-09-24T19:13:14.7061740+08:00||;False|2024-09-24T19:12:56.0055786+08:00||;False|2024-09-24T19:12:53.2614604+08:00||;False|2024-09-24T19:12:48.7493833+08:00||;False|2024-09-24T19:12:44.3720182+08:00||;True|2024-09-24T19:07:58.3465782+08:00||;True|2024-09-24T19:05:30.9998266+08:00||;True|2024-09-24T18:54:38.2183342+08:00||;True|2024-09-24T18:48:06.9234761+08:00||;</History> <LastFailureDetails /> </PropertyGroup> </Project> \ No newline at end of file diff --git a/01-api/_Expand/IStation.Win.Schedule/Program.cs b/01-api/_Expand/IStation.Win.Schedule/Program.cs index 1b295c8..ff72aa5 100644 --- a/01-api/_Expand/IStation.Win.Schedule/Program.cs +++ b/01-api/_Expand/IStation.Win.Schedule/Program.cs @@ -12,7 +12,7 @@ [STAThread] static void Main() { - //处理未捕获的异常 + //处理未捕获的异常 System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //处理UI线程异常 @@ -58,7 +58,7 @@ if ((DiagramControlStringId)e.StringID == DiagramControlStringId.PrintPreview_BestFit) e.Value = "适应页面"; }; - ////zh-Hans界面翻译 + ////zh-Hans 界面翻译 //System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-Hans"); //System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-Hans"); diff --git a/01-api/_Expand/IStation.Win.Schedule/bjMain.cs b/01-api/_Expand/IStation.Win.Schedule/bjMain.cs index 3fda114..9c170ba 100644 --- a/01-api/_Expand/IStation.Win.Schedule/bjMain.cs +++ b/01-api/_Expand/IStation.Win.Schedule/bjMain.cs @@ -1,9 +1,12 @@ -锘縰sing IStation.Curve; +锘縰sing IStation.Application; +using IStation.Curve; +using IStation.Model; using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Double; using System.IO; using System.Text; using Yw.Untity; +using static IStation.Service.ScheduleHelper; namespace IStation.Win.Schedule { @@ -40,6 +43,7 @@ private static readonly IStation.Service.MonitorRecord _service_monitor_record = new(); private static readonly Service.AnalysisDeviation _service_analysis_deviation = new(); + private static readonly Service.FlowDeviation _service_flow_deviation = new(); private long _last_request_id = 0; private bool _use_debug_scada = true; @@ -83,14 +87,14 @@ { return; } - var deline = new DateTime(2025,2,12); - var deline2 = new DateTime(2025,5,1); - var time_list = _schedule_request_list.Where(x=>x.ReceptionTime>=deline&&x.ReceptionTime<= deline2).Select(x => x.ReceptionTime).OrderBy(x => x).ToList(); - + var deline = new DateTime(2025, 4, 18); + var deline2 = new DateTime(2025, 5, 1); + var time_list = _schedule_request_list.Where(x => x.ReceptionTime >= deline && x.ReceptionTime <= deline2).Select(x => x.ReceptionTime).OrderBy(x => x).ToList(); + foreach (var item in time_list) { this.repImgDate.Items.Add(item.ToString("G"), item, -1); - } + } var monitor_record_list = _service_monitor_record.GetByReceiptTimeRange(deline, deline2); if (monitor_record_list == null || !monitor_record_list.Any()) { @@ -145,15 +149,15 @@ if (_monitor_record_dict != null && _monitor_record_dict.ContainsKey(time)) { var valid_record_list = _monitor_record_dict[time]; - var station_scada_dict = GetStationScadaDict(monitor_record_list); + var station_scada_dict = GetStationScadaDict(monitor_record_list); - var validRealTimePressure = station_scada_dict[IStation.eDockingStation.Ch1s][0].Item2 ; + var validRealTimePressure = station_scada_dict[IStation.eDockingStation.Ch1s][0].Item2; if (validRealTimePressure.HasValue) { var validRealTimePressureDiff = validRealTimePressure.Value - target_pressure1; target_pressure1 += validRealTimePressureDiff; AlertTool.ShowInfo(this, "濉ˉ鍘嬪姏缂哄け", $"{validRealTimePressureDiff:N3}"); - } + } } } @@ -162,56 +166,6 @@ { station2_target_flow_diff = new Service.FlowDeviation().GetFlowDiff(target_pressure2); AlertTool.ShowInfo(this, "棰勬祴娴侀噺缂哄け", $"{station2_target_flow_diff:N1}"); - //var ptList = new List<CurvePoint>(); - //try - //{ - // var filePath = @"D:\WorkCode\Project\ChDt1\Schedule.Ch.V1.0\02-desktop\Desktop\IStation.Test\bin\Debug\net6.0-windows\stationcsv\characteristic_curve.csv"; - // using (StreamReader reader = new StreamReader(filePath)) - // { - // reader.ReadLine(); - // string line; - // while ((line = reader.ReadLine()) != null) - // { - // // 鎸夐�楀彿鍒嗛殧姣忎竴琛� - // string[] values = line.Split(','); - // var xStr = values[0]; - // var yStr = values[1]; - - // var pX = double.Parse(xStr); - // var pY = double.Parse(yStr); - - // pY = Math.Abs(pY); - // ptList.Add(new CurvePoint(pX, pY)); - - // } - // } - //} - //catch (Exception ex) - //{ - // Console.WriteLine("璇诲彇鏂囦欢鏃跺嚭閿�: " + ex.Message); - //} - - //var x = ptList.Select(x => x.X).ToArray(); - //var y = ptList.Select(x => x.Y).ToArray(); - - //// 澶氶」寮忓洖褰掔殑闃舵暟锛堜緥濡傦紝浜屾澶氶」寮忥級 - //int degree = 3; - - //// 鎷熷悎澶氶」寮忓洖褰掓ā鍨� - //double[] coefficients = NonlinearRegressionHelper.FitPolynomial(x, y, degree); - - //// 浣跨敤妯″瀷杩涜棰勬祴 - //double xNew = target_pressure2; - //double yPredicted = NonlinearRegressionHelper.PredictPolynomial(xNew, coefficients); - - //station2_target_flow_diff = yPredicted; - //AlertTool.ShowInfo(this, "棰勬祴娴侀噺缂哄け", $"{yPredicted:N1}"); - - - //// 璁$畻 R虏 鍜� MSE - //double rSquared = NonlinearRegressionHelper.CalculateRSquared(x, y, coefficients); - //double mse = NonlinearRegressionHelper.CalculateMSE(x, y, coefficients); - } @@ -220,9 +174,47 @@ GlobalHelper.GetStationFlagStateList(monitor_record_list, out List<int> station1_maintenance_flag_list, out List<int> station2_maintenance_flag_list, out List<int> station1_priority_flag_list, out List<int> station2_priority_flag_list); GlobalHelper.GetFlagInletWaterLevelDict(monitor_record_list, out Dictionary<int, double> station1_flag_inlet_water_level_dict, out Dictionary<int, double> station2_flag_inlet_water_level_dict); + station1_schedule_config.MaintenanceFlagList = new List<int>(); + station2_schedule_config.MaintenanceFlagList = new List<int>(); + station1_schedule_config.PriorityOpenFlagList = new List<int>(); + station2_schedule_config.PriorityOpenFlagList = new List<int>(); + if (station1_maintenance_flag_list != null && station1_maintenance_flag_list.Any()) + { + station1_schedule_config.MaintenanceFlagList.AddRange(station1_maintenance_flag_list); + } + if (station2_maintenance_flag_list != null && station2_maintenance_flag_list.Any()) + { + station2_schedule_config.MaintenanceFlagList.AddRange(station2_maintenance_flag_list); + } + + if (station1_priority_flag_list != null && station1_priority_flag_list.Any()) + { + station1_schedule_config.PriorityOpenFlagList.AddRange(station1_priority_flag_list); + } + if (station2_priority_flag_list != null && station2_priority_flag_list.Any()) + { + station2_schedule_config.PriorityOpenFlagList.AddRange(station2_priority_flag_list); + } + + + var helper = new Service.ScheduleHelper(); helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list); - var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1); + //var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1); + AnaCombine optimal_combine1 = null; + + + var limit_info = VerifyWaterSupplyLimit(station1_schedule_config.WaterSupplyLimitList, station1_open_flag_list, target_flow1); + if (!string.IsNullOrEmpty(limit_info)) + { + AlertTool.ShowInfo(this,"渚涙按闄愬埗",limit_info); + } + + limit_info = VerifyWaterSupplyLimit(station2_schedule_config.WaterSupplyLimitList, station2_open_flag_list, target_flow2); + if (!string.IsNullOrEmpty(limit_info)) + { + AlertTool.ShowInfo(this, "渚涙按闄愬埗", limit_info); + } helper.Initial(station2_open_flag_list, station2_schedule_config, analysis_deviation_list, station2_target_flow_diff); var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_flag_inlet_water_level_dict, target_flow2, target_pressure2); @@ -631,6 +623,27 @@ this.pumpScheduleVmBindingSource1.ResetBindings(false); } + private string VerifyWaterSupplyLimit(List<WaterSupplyLimit> waterSupplyLimits, List<int> station_open_flag_list, double targetFlow) + { + if (waterSupplyLimits != null && waterSupplyLimits.Any()) + { + if (station_open_flag_list != null && station_open_flag_list.Any()) + { + var pumpCount = station_open_flag_list.Count; + var exist_limit = waterSupplyLimits.Find(x => x.PumpCount == pumpCount); + if (exist_limit != null) + { + if (targetFlow < exist_limit.Min || targetFlow > exist_limit.Max) + { + var flags = Yw.Untity.IntListHelper.ToString(station_open_flag_list); + return $"[{flags}]:鐩爣娴侀噺:{targetFlow},渚涙按闄愬埗:{exist_limit.Min}-{exist_limit.Max}"; + } + } + } + } + return ""; + } + private void Reset() { diff --git a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs index 9314434..8b08327 100644 --- a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs +++ b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs @@ -3,6 +3,54 @@ namespace IStation { + ///// <summary> + ///// json杈呭姪绫� + ///// </summary> + //public class JsonHelper + //{ + // /// <summary> + // /// 瀵硅薄杞负json + // /// </summary> + // public static string Object2Json<T>(T t) + // { + // if (t == null) + // return default; + // return JsonConvert.SerializeObject(t); + // } + + // /// <summary> + // /// 瀵硅薄杞负鏍煎紡 json + // /// </summary> + // public static string Object2FormatJson<T>(T t) + // { + // if (t == null) + // return default; + // return JsonConvert.SerializeObject(t, Formatting.Indented); + // } + + // /// <summary> + // /// json杞负瀵硅薄 + // /// </summary> + // public static T Json2Object<T>(string json) + // { + // if (string.IsNullOrEmpty(json)) + // return default; + // try + // { + // return JsonConvert.DeserializeObject<T>(json); + // } + // catch (Exception ex) + // { + // var a = ex.Message; + // return default; + // } + + // } + + + //} + + /// <summary> /// json杈呭姪绫� /// </summary> @@ -15,7 +63,10 @@ { if (t == null) return default; - return JsonConvert.SerializeObject(t); + return JsonConvert.SerializeObject(t, new JsonSerializerSettings + { + Converters = new[] { new CustomFloatConverter() } + }); } /// <summary> @@ -25,7 +76,10 @@ { if (t == null) return default; - return JsonConvert.SerializeObject(t, Formatting.Indented); + return JsonConvert.SerializeObject(t, Formatting.Indented, new JsonSerializerSettings + { + Converters = new[] { new CustomFloatConverter() } + }); } /// <summary> @@ -44,9 +98,35 @@ var a = ex.Message; return default; } + } + } + public class CustomFloatConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return objectType == typeof(double) || objectType == typeof(float); } + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.String) + { + return Convert.ToDouble(reader.Value.ToString()); + } + return reader.Value; + } + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value is double) + { + writer.WriteValue($"{value:N5}"); // 淇濈暀4浣嶅皬鏁� + } + else if (value is float) + { + writer.WriteValue($"{value:N5}"); // 淇濈暀4浣嶅皬鏁� + } + } } } diff --git a/02-desktop/Desktop/IStation.Test/IStation.Test.csproj b/02-desktop/Desktop/IStation.Test/IStation.Test.csproj index d04eb47..8786b77 100644 --- a/02-desktop/Desktop/IStation.Test/IStation.Test.csproj +++ b/02-desktop/Desktop/IStation.Test/IStation.Test.csproj @@ -41,6 +41,7 @@ <Compile Remove="Program -DataFusionCorrector.cs" /> <Compile Remove="Program -deepseek - 澶嶅埗.cs" /> <Compile Remove="Program -doubao.cs" /> + <Compile Remove="schedule\CorrectedStationScheduleModelHelper.cs" /> <Compile Remove="Station1CombineHelper - 澶嶅埗.cs" /> <Compile Remove="Station2Helper - 澶嶅埗.cs" /> <Compile Remove="TotalFlowDiffHelper - 澶嶅埗.cs" /> @@ -53,6 +54,7 @@ <PackageReference Include="Dbscan" Version="3.0.0" /> <PackageReference Include="Dbscan.RBush" Version="3.0.0" /> <PackageReference Include="NumSharp" Version="0.30.0" /> + <PackageReference Include="Yw.Epanet.Calcu.Core" Version="1.0.8" /> </ItemGroup> <ItemGroup> diff --git a/02-desktop/Desktop/IStation.Test/Program.cs b/02-desktop/Desktop/IStation.Test/Program.cs index f707e4e..fa0a2cc 100644 --- a/02-desktop/Desktop/IStation.Test/Program.cs +++ b/02-desktop/Desktop/IStation.Test/Program.cs @@ -12,6 +12,7 @@ // 淇缁勫悎鍋忓樊 static void Main(string[] args) { + Console.WriteLine("start"); //Station1Helper.Start(); //1 鏁版嵁淇 //Station2Helper.Start(); //2 妯″瀷淇 // 3 python淇 ,鐩墠鏈変簺鏁版嵁闂杩橀渶瑕佽В鍐� @@ -20,16 +21,70 @@ //StationCombineHelper.Start(1);// 5 缁勫悎鍋忓樊淇 //StationCombineHelper.Start(2);// 5 缁勫悎鍋忓樊淇 - // 6 鍒嗘瀽娉甸璋辩郴鏁� - // 7 - // Station2TotalFlowDiffHelper.Start();// 8 琛ュ叏娴侀噺鍋忓樊 + python + // AnalysisDeviation(); // 6 鍒嗘瀽娉甸璋辩郴鏁� + // 7 + // Station2TotalFlowDiffHelper.Start();// 8 C# 瀵煎嚭鏁版嵁 琛ュ叏娴侀噺鍋忓樊 + python + + + //test + + StationTotalFlowPressureHelper.Start(); Console.WriteLine(); Console.WriteLine("ok"); Console.ReadKey(); } + public static void AnalysisDeviation() + { + var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcombine"); + var fileNameList = Directory.GetFiles(fullPath).Select(x => x).ToList(); + if (fileNameList == null || fileNameList.Count < 1) + return; + + var stationDict = new Dictionary<int, long> + { + { 1, 462958406303813 }, + { 2, 462958422204485 } + }; + + var bllEquipment = new IStation.BLL.Equipment(); + var bllCurve = new IStation.BLL.PumpCurve(); + var combineList = new List<ModelCombineViewModel>(); + + var minFlow = 0; + var maxFlow = 100000; + var spaceFlow = 100; + foreach (var fileName in fileNameList) + { + Console.WriteLine(Path.GetFileNameWithoutExtension(fileName) + ":Start"); + var indexStr = Path.GetFileNameWithoutExtension(fileName).Substring(0, 1); + var index = int.Parse(indexStr); + var stationId = stationDict[index]; + var pumpList = bllEquipment.GetPumpModelListByBelongTypeAndBelongID(IStation.ObjectType.Station, stationId); + var flagList = pumpList.Select(x => x.SortCode).OrderBy(x => x).ToList(); + var flagPumpDict = pumpList.ToDictionary(x => x.SortCode, x => x.RatedParas); + + + var json = File.ReadAllText(fileName); + var templist = JsonHelper.Json2Object<List<ModelCombineViewModel>>(json); + var run_flags_flow_pressure_diff_dict = templist + .Select(x => (x.RunFlags, x.ScadaTotalFlow, x.ModelDeviation)) + .ToList(); + var ana_dev_list = StationCombineHelper.GetAnalysisDeviationDtoList(flagPumpDict, run_flags_flow_pressure_diff_dict, minFlow, maxFlow, spaceFlow); + ana_dev_list.ForEach(x => x.Station = index); + var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcombineana"); + if (!Directory.Exists(root_folder)) + { + Directory.CreateDirectory(root_folder); + } + var fileNameDev = Path.Combine(root_folder, $"AnalysisDeviation{spaceFlow}.json"); + StationCombineHelper.SaveAnalysisDeviationDtoList(index, ana_dev_list, fileNameDev); + Console.WriteLine(Path.GetFileNameWithoutExtension(fileName) + ":Save"); + } + + } public static void Completion() { @@ -137,72 +192,9 @@ } } + - - //static void Main(string[] args) - //{ - // var splineList = new List<CurvePoint>(); - // var measuredList = new List<CurvePoint>(); - - // var path = AppDomain.CurrentDomain.BaseDirectory; - // var lienPaht = path + @"\pumpcsv\23_44_old_curve.csv"; - // var measuredPath = path + @"\pumpcsv\23_44.csv"; - - // using (var fs = new FileStream(lienPaht, FileMode.Open, FileAccess.Read)) - // using (var sr = new StreamReader(fs, Encoding.UTF8)) - // { - // var strLine = string.Empty; - // sr.ReadLine(); - // while (!string.IsNullOrEmpty(strLine = sr.ReadLine())) - // { - // var strList = strLine.Split(','); - // var x = double.Parse(strList[0]); - // var y = double.Parse(strList[1]); - // splineList.Add(new CurvePoint(x, y)); - // } - // } - - // using (var fs = new FileStream(measuredPath, FileMode.Open, FileAccess.Read)) - // using (var sr = new StreamReader(fs, Encoding.UTF8)) - // { - // var strLine = string.Empty; - // sr.ReadLine(); - // while (!string.IsNullOrEmpty(strLine = sr.ReadLine())) - // { - // var strList = strLine.Split(','); - // var x = double.Parse(strList[4]); - // var y = double.Parse(strList[5]); - // measuredList.Add(new CurvePoint(x, y)); - // } - // } - - - // // 鏍锋潯鏇茬嚎澶勭悊 - // double[] splineX = splineList.Select(x => x.X).ToArray(); - // double[] splineY = splineList.Select(x => x.Y).ToArray(); - - // // 瀹炴祴鏁版嵁澶勭悊 - // double[] measuredXAll = measuredList.Select(x => x.X).ToArray(); - // double[] measuredYAll = measuredList.Select(x => x.Y).ToArray(); - - - - // var helper = new PumpCurveDataFusionCorrectorHelper(); - // (double[] mergedX, double[] mergedY, double[] optimizedX, double[] optimizedY) = helper.Corrent(splineX, splineY, measuredXAll, measuredYAll); - - // var pt_list = new List<CurvePoint>(); - // for (int i = 0; i < optimizedX.Length; i++) - // { - // var x = optimizedX[i]; - // var y = optimizedY[i]; - // pt_list.Add(new CurvePoint(x, y)); - // } - // var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcsv"); - // CsvHelper.ExportToCsv(pt_list, Path.Combine(fullPath, $"23_44_update_curve.csv")); - - // Console.WriteLine("ok"); - // Console.ReadKey(); - //} + private static Dictionary<int, IStation.Model.CurveExpress> GetFlagCurveDict() { diff --git a/02-desktop/Desktop/IStation.Test/StationCombineHelper.cs b/02-desktop/Desktop/IStation.Test/StationCombineHelper.cs index b486f55..8443856 100644 --- a/02-desktop/Desktop/IStation.Test/StationCombineHelper.cs +++ b/02-desktop/Desktop/IStation.Test/StationCombineHelper.cs @@ -106,15 +106,24 @@ Directory.CreateDirectory(folder); } - CsvHelper.ExportToCsv(vm_combine_list, Path.Combine(folder, $"{stationIndex}_combine.csv")); + vm_combine_list.ForEach(x => x.Round()); + var file_path = Path.Combine(folder, $"{stationIndex}_combine.json"); + var json= JsonHelper.Object2Json(vm_combine_list); + File.WriteAllText(file_path, json); var run_flags_flow_pressure_diff_dict = vm_combine_list .Select(x => (x.RunFlags, x.ScadaTotalFlow, x.ModelDeviation)) .ToList(); var ana_dev_list = GetAnalysisDeviationDtoList(flagPumpDict, run_flags_flow_pressure_diff_dict, _min_flow, _max_flow, _space_flow); - ana_dev_list.ForEach(x => x.Station = stationIndex); - SaveAnalysisDeviationDtoList(stationIndex, ana_dev_list); + ana_dev_list.ForEach(x => x.Station = stationIndex); + var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcombineana"); + if (!Directory.Exists(root_folder)) + { + Directory.CreateDirectory(root_folder); + } + var fileName = Path.Combine(root_folder, "AnalysisDeviation.json"); + SaveAnalysisDeviationDtoList(stationIndex, ana_dev_list, fileName); } private static void InitializePumpModelMapping(List<IStation.WinFrmUI.AnalysisHelper.PumpMapping> pump_model_mapping_list, @@ -349,7 +358,7 @@ { Time = time, RunFlags = IStation.Untity.IntListHelper.ToString(flags), - ModelDeviation = new List<(int, double, double)>() + ModelDeviation = new () }; vm_combine_list.Add(vm_combine); @@ -530,7 +539,7 @@ vm_combine.ScadaTotalFlow += flow < 1 ? model_flow : flow; vm_combine.ModelTotalFlow += model_flow; - vm_combine.ModelDeviation.Add((flag, calc_flow, pressure_diff_dev)); + vm_combine.ModelDeviation.Add(new (flag, calc_flow, pressure_diff_dev)); } } @@ -610,7 +619,7 @@ } } - public static List<AnalysisHelper.AnalysisDeviationDto> GetAnalysisDeviationDtoList(Dictionary<int, IStation.Model.PumpModel> flag_pump_dict, List<(string, double, List<(int, double, double)>)> run_flags_flow_pressure_diff_dict, double minQ = 0, double maxQ = 100000, double spaceQ = 1000) + public static List<AnalysisHelper.AnalysisDeviationDto> GetAnalysisDeviationDtoList(Dictionary<int, IStation.Model.PumpModel> flag_pump_dict, List<(string, double, List<ModelCombineDiff>)> run_flags_flow_pressure_diff_dict, double minQ = 0, double maxQ = 100000, double spaceQ = 1000) { if (flag_pump_dict == null || !flag_pump_dict.Any() || run_flags_flow_pressure_diff_dict == null || !run_flags_flow_pressure_diff_dict.Any()) { @@ -653,12 +662,13 @@ return resultList; } - private static AnalysisHelper.AnalysisDeviationDto CreateAnalysisDeviationDto(IGrouping<string, (string, double, List<(int, double, double)>)> runFlagsGroup, double currentMinQ, double currentMaxQ) + private static AnalysisHelper.AnalysisDeviationDto CreateAnalysisDeviationDto(IGrouping<string, (string, double, List<ModelCombineDiff>)> runFlagsGroup, double currentMinQ, double currentMaxQ) { + var meanDict = new Dictionary<int, double>(); var devDict = new Dictionary<int, double>(); var allTuples = runFlagsGroup.SelectMany(x => x.Item3).ToList(); - var groupedByFlag = allTuples.GroupBy(x => x.Item1); + var groupedByFlag = allTuples.GroupBy(x => x.Flag); var isError = false; @@ -666,15 +676,16 @@ { // 杩囨护寮傚父鍊� var list = flagGroup.ToList(); - var filterList = DynamicThresholdProcessorHelper.Filter(list); + var filterList = Filter(list); if (filterList.Count < 1) { isError = true; break; } // 璁$畻鏍囧噯宸� - var (mean, stdDev) = DynamicThresholdProcessorHelper.CalculateStats(filterList.Select(x => x.Item3).ToList()); - devDict.Add(flagGroup.Key, Math.Round(mean, 3)); + var (mean, stdDev) = DynamicThresholdProcessorHelper.CalculateStats(filterList.Select(x => x.PressureDiff).ToList()); + meanDict.Add(flagGroup.Key, Math.Round(mean, 3 )); + devDict.Add(flagGroup.Key, Math.Round(stdDev, 4 )); } if (isError) @@ -687,12 +698,31 @@ MinFlow = currentMinQ, MaxFlow = currentMaxQ, Count = runFlagsGroup.Count(), - PressureDiff = devDict, + PressureDiff = meanDict, + StdDev= devDict }; vm.Count = runFlagsGroup.Count(); - vm.PressureDiff = devDict; + vm.PressureDiff = meanDict; return vm; + } + + public static List<ModelCombineDiff> Filter(List<ModelCombineDiff> ptList) + { + var pressures = ptList.Select(p => p.PressureDiff).ToList(); + + // 璁$畻缁熻閲� + var (mean, stdDev) = DynamicThresholdProcessorHelper.CalculateStats(pressures); + double skewness = DynamicThresholdProcessorHelper.CalculateSkewness(pressures); + // 鍔ㄦ�佽皟鏁聪冨�嶆暟 + //double sigmaMultiplier = DynamicThresholdProcessorHelper.CalculateSigmaMultiplier(skewness); + var sigmaMultiplier = 3;//鐩墠榛樿 鏍囧噯宸� + + // 璁$畻杈圭晫 + double lower = mean - sigmaMultiplier * stdDev; + double upper = mean + sigmaMultiplier * stdDev; + + return ptList.Where(p => p.PressureDiff >= lower && p.PressureDiff <= upper).ToList(); } private static bool IsValidDeviation(Dictionary<int, double> devDict) @@ -707,16 +737,10 @@ return true; } - public static bool SaveAnalysisDeviationDtoList(int stationIndex, List<AnalysisHelper.AnalysisDeviationDto> all_list) + public static bool SaveAnalysisDeviationDtoList(int stationIndex, List<AnalysisHelper.AnalysisDeviationDto> all_list,string fileName) { - var root_folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcombineana"); - if (!Directory.Exists(root_folder)) - { - Directory.CreateDirectory(root_folder); - } - - List<AnalysisHelper.AnalysisDeviationDto>? exist_list = null; - var fileName = Path.Combine(root_folder, "AnalysisDeviation.json"); + + List<AnalysisHelper.AnalysisDeviationDto>? exist_list = null; if (File.Exists(fileName)) { var exist_json = File.ReadAllText(fileName); @@ -735,7 +759,6 @@ File.WriteAllText(fileName, json); return true; } - private static Dictionary<int, IStation.Model.CurveExpress> GetFlagCurveDict() { @@ -849,7 +872,7 @@ } public static (float[] NewX, float[] newY) Create(List<double> x, List<double> y) - { + { // 浣跨敤PCHIP鎻掑�硷紙淇濆舰鍒嗘涓夋鎻掑�硷級 IInterpolation interpolator = CubicSpline.InterpolatePchipSorted( x.ToArray(), @@ -857,18 +880,15 @@ ); // 鐢熸垚鎻掑�肩偣锛堜緥濡傚湪0鍒�5涔嬮棿鐢熸垚100涓偣锛� - List<double> xNew = new List<double>(); - List<double> yNew = new List<double>(); - for (double xi = x[0]; xi <= x[x.Count - 1]; xi += 1) + List<double> xNew = new(); + List<double> yNew = new(); + for (double xi = x[0]; xi <= x[^1]; xi += 1) { xNew.Add(xi); yNew.Add(interpolator.Interpolate(xi)); } - - - return (xNew.Select(x=>((float)x)).ToArray(), yNew.Select(x => ((float)x)).ToArray()); - + return (xNew.Select(x => ((float)x)).ToArray(), yNew.Select(x => ((float)x)).ToArray()); } @@ -876,12 +896,7 @@ /// <summary> /// 璁$畻鐩镐技娴侀噺鎵▼鏇茬嚎 - /// </summary> - /// <param name="express">琛ㄨ揪寮�</param> - /// <param name="originHz">鍘熷棰戠巼</param> - /// <param name="changeHz">鎹㈢畻棰戠巼</param> - /// <param name="pointNumber">鎷熷悎鐐规暟閲�</param> - /// <returns></returns> + /// </summary> public static List<CurvePoint> CalculateSimilarQH(List<CurvePoint> ptList, double originHz, double changeHz, int pointNumber = 12) { if (ptList == null || !ptList.Any()) @@ -909,5 +924,34 @@ public string RunFlags { get; set; } public double ScadaTotalFlow { get; set; } public double ModelTotalFlow { get; set; } - public List<(int, double, double)> ModelDeviation { get; set; } + public List<ModelCombineDiff> ModelDeviation { get; set; } + + public void Round() + { + this.ScadaTotalFlow = Math.Round(ScadaTotalFlow, 1); + this.ModelTotalFlow = Math.Round(ModelTotalFlow, 1); + this.ModelDeviation?.ForEach(x => x.Round()); + } +} + +public class ModelCombineDiff +{ + public ModelCombineDiff() { } + public ModelCombineDiff(int flag, double calcFlow, double pressureDiff) + { + Flag = flag; + CalcFlow = calcFlow; + PressureDiff = pressureDiff; + } + + public int Flag { get; set; } + public double CalcFlow { get; set; } + public double PressureDiff { get; set; } + + public void Round() + { + this.CalcFlow = Math.Round(CalcFlow, 1); + this.PressureDiff = Math.Round(PressureDiff, 4); + } + } \ No newline at end of file diff --git a/02-desktop/Desktop/IStation.Test/StationTotalFlowPressureHelper.cs b/02-desktop/Desktop/IStation.Test/StationTotalFlowPressureHelper.cs new file mode 100644 index 0000000..c3e1475 --- /dev/null +++ b/02-desktop/Desktop/IStation.Test/StationTotalFlowPressureHelper.cs @@ -0,0 +1,75 @@ +锘縰sing IStation.Model; + +namespace IStation.Test +{ + public class StationTotalFlowPressureHelper + { + /// <summary> + /// 缁戝畾鏁版嵁 + /// </summary> + public static void Start(int stationIndex = 1) + { + + var projectId = 661070185922629; + IStation.SettingsD.Project.ID = projectId; + var monitorDataSourcesId = 663976941449285; // 2024 - 202504 + var stationId = 462958406303813; + + if (stationIndex > 1) + { + stationIndex = 2; + stationId = 462958422204485; + } + var bll = new BLL.StationSignalRecordPacket(); + var ptFilterList = new List<CurvePtViewModel>(); + + var packets = bll.Get(monitorDataSourcesId, stationId); + var ptList = new List<CurvePtViewModel>(); + + var records = packets.SelectMany(x => x.StationSignalRecords).ToList(); + foreach (var x in records) + { + if (x.TotalPressure > 0 && x.TotalFlow > 0) + { + ptList.Add(new CurvePtViewModel(x.TotalFlow, x.TotalPressure)); + } + } + ptFilterList = Filter(ptList); + var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stationcsv"); + if (!Directory.Exists(fullPath)) + { + Directory.CreateDirectory(fullPath); + } + + string filePath = Path.Combine(fullPath, $"{stationIndex}_flow_pressure.csv"); + CsvHelper.ExportToCsv(ptFilterList, filePath); + + Console.WriteLine("ok"); + Console.ReadKey(); + + } + + + public static List<CurvePtViewModel> Filter(List<CurvePtViewModel> ptList) + { + var pressures = ptList.Select(p => p.Y).ToList(); + + // 璁$畻缁熻閲� + var (mean, stdDev) = DynamicThresholdProcessorHelper.CalculateStats(pressures); + double skewness = DynamicThresholdProcessorHelper.CalculateSkewness(pressures); + // 鍔ㄦ�佽皟鏁聪冨�嶆暟 + double sigmaMultiplier = DynamicThresholdProcessorHelper.CalculateSigmaMultiplier(skewness); + sigmaMultiplier = 3;//鐩墠榛樿 鏍囧噯宸� + + // 璁$畻杈圭晫 + double lower = mean - sigmaMultiplier * stdDev; + double upper = mean + sigmaMultiplier * stdDev; + + return ptList.Where(p => p.Y >= lower && p.Y <= upper).ToList(); + } + + + + } +} + diff --git a/02-desktop/Desktop/IStation.Test/helper/DynamicThresholdProcessorHelper.cs b/02-desktop/Desktop/IStation.Test/helper/DynamicThresholdProcessorHelper.cs index b0082fd..f145c76 100644 --- a/02-desktop/Desktop/IStation.Test/helper/DynamicThresholdProcessorHelper.cs +++ b/02-desktop/Desktop/IStation.Test/helper/DynamicThresholdProcessorHelper.cs @@ -4,44 +4,7 @@ public class DynamicThresholdProcessorHelper { - public static List<(int, double, double)> Filter(List<(int, double, double)> ptList) - { - var pressures = ptList.Select(p => p.Item3).ToList(); - - // 璁$畻缁熻閲� - var (mean, stdDev) = CalculateStats(pressures); - double skewness = CalculateSkewness(pressures); - // 鍔ㄦ�佽皟鏁聪冨�嶆暟 - double sigmaMultiplier = CalculateSigmaMultiplier(skewness); - sigmaMultiplier = 3;//鐩墠榛樿 鏍囧噯宸� - - // 璁$畻杈圭晫 - double lower = mean - sigmaMultiplier * stdDev; - double upper = mean + sigmaMultiplier * stdDev; - - return ptList.Where(p => p.Item3 >= lower && p.Item3 <= upper).ToList(); - } - - - - - public static List<PointViewModel> Filter(List<PointViewModel> ptList) - { - var pressures = ptList.Select(p => p.Y).ToList(); - - // 璁$畻缁熻閲� - var (mean, stdDev) = CalculateStats(pressures); - double skewness = CalculateSkewness(pressures); - // 鍔ㄦ�佽皟鏁聪冨�嶆暟 - double sigmaMultiplier = CalculateSigmaMultiplier(skewness); - sigmaMultiplier = 3;//鐩墠榛樿 鏍囧噯宸� - - // 璁$畻杈圭晫 - double lower = mean - sigmaMultiplier * stdDev; - double upper = mean + sigmaMultiplier * stdDev; - - return ptList.Where(p => p.Y >= lower && p.Y <= upper).ToList(); - } + public static List<PumpViewModel> Filter(List<PumpViewModel> ptList) { @@ -119,7 +82,7 @@ } // 鍔ㄦ�佅冨�嶆暟璁$畻瑙勫垯 - private static double CalculateSigmaMultiplier(double skewness) + public static double CalculateSigmaMultiplier(double skewness) { return skewness switch diff --git a/02-desktop/Desktop/IStation.Test/schedule/CorrectedStationScheduleModelHelper.cs b/02-desktop/Desktop/IStation.Test/schedule/CorrectedStationScheduleModelHelper.cs new file mode 100644 index 0000000..d889463 --- /dev/null +++ b/02-desktop/Desktop/IStation.Test/schedule/CorrectedStationScheduleModelHelper.cs @@ -0,0 +1,605 @@ +锘縰sing DevExpress.XtraRichEdit.Model; +using IStation.Epanet.Enums; +using IStation.Epanet; +using IStation.Model; +using IStation.WinFrmUI; +using System.Runtime; +using System.Text; +using IStation.Untity; + +namespace IStation.Test +{ + public class CorrectedStationScheduleModelHelper + { + private static int _ratedFrequency = 50; + + /// <summary> + /// 鏁版嵁棰勫鐞� + /// </summary> + public static void StationDataPreproc( + Dictionary<int, PumpScheduleModel> pumpScheduleDict, + List<StationRunRecord> allStationRunRecordList, + List<StationModelMapping> stationModelMappingList, + List<PumpModelMapping> pumpModelMappingList, + string modelFile + ) + { + // 鍏堣繃婊や竴娉㈡暟鎹啀浼犺繘鏉� + if (VerifyNull(pumpScheduleDict)) + { + return; + } + if (VerifyNull(allStationRunRecordList)) + { + return; + } + + + var temp_id_build = new StringBuilder(31); + var code = EpanetMethods.ENopen(modelFile, "", ""); + CheckCode(code); + + code = EpanetMethods.ENopenH(); + if ((int)code > 6) + { + throw new Exception($"ENopenH锛歿code}"); + } + + var curvePointCount = 100; + foreach (var mapping in pumpModelMappingList) + { + var flag = mapping.Flag; + var pumpSchedule = pumpScheduleDict[flag]; + code = EpanetMethods.ENgetlinkindex(mapping.PumpId, out int pumpIndex); + CheckCode(code); + + if (!string.IsNullOrEmpty(mapping.FlowId)) + { + code = EpanetMethods.ENgetlinkindex(mapping.FlowId, out int flowIndex); + CheckCode(code); + mapping.FlowIndex = flowIndex; + } + code = EpanetMethods.ENgetnodeindex(mapping.PressureId, out int pressureIndex); + CheckCode(code); + + code = EpanetMethods.ENgetcurveindex(mapping.CurveId, out int curveIndex); + CheckCode(code); + + mapping.PumpIndex = pumpIndex; + mapping.PressureIndex = pressureIndex; + mapping.CurveIndex = curveIndex; + + + var curveQH = pumpSchedule.CurveQH; + var fitPtList = curveQH.GetFitPoints(curvePointCount); + var xList = fitPtList.Select(x => (float)x.X).ToArray(); + var yList = fitPtList.Select(x => (float)x.Y).ToArray(); + + if (!CheckFitPointList(xList, yList)) + { + throw new Exception($"CheckFitPointList: false"); + } + code = EpanetMethods.ENsetcurve(mapping.CurveIndex, xList, yList, xList.Length); + CheckCode(code); + } + + foreach (var mapping in stationModelMappingList) + { + code = EpanetMethods.ENgetlinkindex(mapping.FlowId, out int flowIndex); + CheckCode(code); + code = EpanetMethods.ENgetnodeindex(mapping.PressureId, out int pressureIndex); + CheckCode(code); + + mapping.PressureIndex = pressureIndex; + mapping.FlowIndex = flowIndex; + } + + var pumpModelMappingDict = pumpModelMappingList.ToDictionary(x => x.Flag, y => y); + var pattern_id_list = AnalysisHelper.GetPatternIdList(); + var pattern_id_dict = new Dictionary<string, int>(); + foreach (var id in pattern_id_list) + { + if (EpanetMethods.ENgetpatternindex(id, out int index) != ErrorCode.Ok) + continue; + pattern_id_dict.Add(id, index); + } + + var vm_list = new List<PumpViewModel>(); + var vm_diff_list = new List<ModelDiffViewModel>(); + foreach (var station_record in allStationRecordList) + { + var model_record_dict = station_record.ModelRecordDict; + var pipe_flow_err = true; + var pipe_pressure_err = true; + foreach (var id in pipeFlowIdList) + { + if (model_record_dict[id] < 1) + { + pipe_flow_err = false; + break; + } + } + foreach (var id in pipePressureIdList) + { + var value = model_record_dict[id]; + if (value < 1 || value > 40) + { + pipe_pressure_err = false; + break; + } + } + if (!pipe_flow_err || !pipe_pressure_err) + { + continue; + } + var time = station_record.Time.ToString("G"); + var pump_allStationRecordList = station_record.PumpSignalRecords; + var total_flow = station_record.TotalFlow; + var total_pressure = station_record.TotalPressure; + var pump_total_flow = pump_allStationRecordList.Sum(x => x.FlowRate); + var diff_flow = station_record.DiffFlow; + if (total_pressure < 0) + { + continue; + } + if (total_flow <= 0 && pump_total_flow <= 0) + { + continue; + } + if (pump_total_flow > 0 && Math.Abs(diff_flow) > 2000) + { + continue; + } + if (pump_allStationRecordList.Exists(x => x.Flag != 15 && x.Flag != 16 && x.Rpm < 1)) + { + continue; + } + if (pump_allStationRecordList.Exists(x => x.OutletPressure > 50)) + { + continue; + } + + foreach (var pattern in pattern_id_dict) + { + var pattern_id = pattern.Key; + var pattern_index = pattern.Value; + var pattern_value = 0f; + if (model_record_dict.ContainsKey(pattern_id)) + { + pattern_value = (float)model_record_dict[pattern_id]; + } + code = EpanetMethods.ENsetpattern(pattern_index, new float[] { pattern_value }, 1); + if ((int)code > 6) + { + throw new Exception($"ENsetpattern锛歿code}"); + } + } + + code = EpanetMethods.ENinitH(0); + if ((int)code > 6) + { + throw new Exception($"ENinitH锛歿code}"); + } + + code = EpanetMethods.ENrunH(out _); + if ((int)code > 6) + { + throw new Exception($"ENrunH锛歿code}"); + } + + + foreach (var pump_record in pump_allStationRecordList) + { + var flag = pump_record.Flag; + var pump = flagPumpDict[flag]; + var qh = flagQhCurveDict[flag]; + var mapping = pumpModelMappingDict[flag]; + var rpm = pump_record.Rpm; + if (!pump.IsBp) + rpm = pump.Nr; + if (rpm == 0) + break; + + + var hz = Math.Round(rpm / pump.Nr * 50, 2); + var hz0 = Math.Round(hz, 0); + var wl = pump_record.WaterLevel; + var inlet_pressure = Model.CurveCalcuHelper.Mpa2M(pump_record.InletPressure); + var outlet_pressure = Model.CurveCalcuHelper.Mpa2M(pump_record.OutletPressure); + var pressure_diff = outlet_pressure - inlet_pressure; + var flow = pump_record.FlowRate; + var curve_head = pump_record.Head; + + + code = EpanetMethods.ENgetlinkvalue(mapping.PumpIndex, LinkValue.Flow, out float model_flow); + if ((int)code > 6) + { + throw new Exception($"ENgetnodevalue锛歿code}"); + } + if (Math.Abs(model_flow) < 1) + { + break; + } + + code = EpanetMethods.ENgetnodevalue(mapping.PressureIndex, NodeValue.Pressure, out float model_outlet_pressure); + if ((int)code > 6) + { + throw new Exception($"ENgetnodevalue锛歿code}"); + } + + if (Math.Abs(model_outlet_pressure) > 45) + { + break; + } + + model_flow = Math.Abs(model_flow); + model_outlet_pressure = Math.Abs(model_outlet_pressure); + var model_pressure_diff = model_outlet_pressure - inlet_pressure; + + var flow_diff = flow - model_flow; + + var vm = new PumpViewModel(); + vm.Time = time; + vm.Rpm = rpm; + vm.Flag = flag; + vm.Hz = hz; + vm.Hz0 = hz0; + vm.WaterLevel = wl; + vm.InletPressure = Math.Round(inlet_pressure, 2); + vm.OutletPressure = Math.Round(outlet_pressure, 2); + vm.PressureDiff = Math.Round(pressure_diff, 2); + + vm.Flow = Math.Round(flow, 1); + vm.ModelFlow = Math.Round(model_flow, 1); + vm.ModelOutletPressure = Math.Round(model_outlet_pressure, 2); + vm.CurvePressureDiff = Math.Round(model_pressure_diff, 2); + vm.PressureDiffDev = Math.Round(pressure_diff - model_pressure_diff, 3); + vm.FlowDiff = Math.Round(flow_diff, 1); + + var other_press = 0d; + if (pump.IsBp) + { + other_press = Model.CurveCalcuHelper.CalculateOtherPress(model_flow, pump.Ic, pump.Oc, null, null); + } + + var other_outlet = other_press + pressure_diff; + var mdoel_other_outlet = other_press + model_pressure_diff; + var diff = pressure_diff - model_pressure_diff; + + if (diff > 0.1) + { + + } + var calcHead = other_outlet + vm.PressureDiffDev; + vm.CalcHead = Math.Round(mdoel_other_outlet, 2); + + vm_list.Add(vm); + + } + + foreach (var mapping in model_mapping_list) + { + if (!model_record_dict.ContainsKey(mapping.ScadaPressureId)) + { + continue; + } + if (!model_record_dict.ContainsKey(mapping.ScadaFlowId)) + { + continue; + } + var flow = model_record_dict[mapping.ScadaFlowId]; + var outlet_pressure = model_record_dict[mapping.ScadaPressureId]; + + code = EpanetMethods.ENgetlinkvalue(mapping.FlowIndex, LinkValue.Flow, out float model_flow); + if ((int)code > 6) + { + throw new Exception($"ENgetnodevalue锛歿code}"); + } + + code = EpanetMethods.ENgetnodevalue(mapping.PressureIndex, NodeValue.Pressure, out float model_outlet_pressure); + if ((int)code > 6) + { + throw new Exception($"ENgetnodevalue锛歿code}"); + } + + var flow_diff = flow - model_flow; + var pressure_diff = outlet_pressure - model_outlet_pressure; + + var vm = new ModelDiffViewModel(); + vm.Date = station_record.Time; + vm.Time = time; + vm.Name = mapping.Name; + vm.ScadaFlow = Math.Round(flow, 1); + vm.ScadaPressure = Math.Round(outlet_pressure, 3); + vm.MonitorFlow = Math.Round(model_flow, 1); + vm.MonitorPressure = Math.Round(model_outlet_pressure, 3); + vm.FlowDiff = Math.Round(flow_diff, 1); + vm.PressureDiff = Math.Round(pressure_diff, 3); + vm_diff_list.Add(vm); + } + } + + code = EpanetMethods.ENcloseH(); + if ((int)code > 6) + { + throw new Exception($"ENcloseH锛歿code}"); + } + code = EpanetMethods.ENclose(); + if ((int)code > 6) + { + throw new Exception($"ENclose锛歿code}"); + } + + if (!vm_list.Any()) + { + return; + } + var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "pumpcsv"); + var allPumpRecordList2 = vm_list.Where(x => + { + if (x.Rpm == IStation.Error.Default) + { + return false; + } + + return true; + }).ToList(); + var pumpFlagRecordGroup = allPumpRecordList2.OrderBy(x => x.Flag).GroupBy(x => x.Flag); + var pumpFlagHzRecordGroup = new Dictionary<(int Flag, int Hz), List<PumpViewModel>>(); + foreach (var pumpFlag in pumpFlagRecordGroup) + { + var flag = pumpFlag.Key; + var pump = flagPumpDict[flag]; + var pumpQh = flagQhCurveDict[flag]; + if (!pump.IsBp) + { + var allFlagHzRecordList = pumpFlag.ToList(); + if (allFlagHzRecordList.Count < 30) + { + Console.WriteLine($"{flag}娉�-{50}hz 鎬绘暟:{allFlagHzRecordList.Count},<5 璺宠繃"); + } + var flagHzRecordList = DynamicThresholdProcessorHelper.Filter(allFlagHzRecordList); + Console.WriteLine($"{flag}娉�-{50}hz 鎬绘暟:{allFlagHzRecordList.Count},杩囨护:{allFlagHzRecordList.Count - flagHzRecordList.Count}"); + pumpFlagHzRecordGroup.Add((flag, 50), flagHzRecordList); + if (flagHzRecordList.Any()) + { + var curvePtList = pumpQh.GetFitPoints(200).Select(x => new CurvePtViewModel(x)).ToList(); + CsvHelper.ExportToCsv(curvePtList, Path.Combine(fullPath, $"{flag}_{50}_old_curve.csv")); + CsvHelper.ExportToCsv(flagHzRecordList.Select(x => new CurvePtViewModel(x.ModelFlow, x.CalcHead)).ToList(), Path.Combine(fullPath, $"{flag}_{50}.csv")); + } + } + else + { + var hzGroup = pumpFlag.OrderBy(x => x.Rpm).GroupBy(x => + { + var hz = Math.Round(x.Rpm / pump.Nr * 50, 0); + return hz; + }); + hzGroup = hzGroup.Where(x => x.Key > 10).ToList(); + foreach (var pumpFlagHz in hzGroup) + { + var hz = pumpFlagHz.Key; + if (hz > 50) + { + continue; + } + var allFlagHzRecordList = pumpFlagHz.ToList(); + if (allFlagHzRecordList.Count < 30) + { + Console.WriteLine($"{flag}娉�-{hz}hz 鎬绘暟:{allFlagHzRecordList.Count},<5 璺宠繃"); + } + var flagHzRecordList = DynamicThresholdProcessorHelper.Filter(allFlagHzRecordList); + if (allFlagHzRecordList.Count < 30) + { + Console.WriteLine($"{flag}娉�-{hz}hz 杩囨护鍚庢�绘暟:{allFlagHzRecordList.Count},<5 璺宠繃"); + } + Console.WriteLine($"{flag}娉�-{hz}hz 鎬绘暟:{allFlagHzRecordList.Count},杩囨护:{allFlagHzRecordList.Count - flagHzRecordList.Count}"); + pumpFlagHzRecordGroup.Add((flag, (int)hz), flagHzRecordList); + if (flagHzRecordList.Any()) + { + var curvePtList = SimilarCalculateHelper.CalculateQH(pumpQh, 50, hz).GetFitPoints(100); + CsvHelper.ExportToCsv(curvePtList.Select(x => new CurvePtViewModel(x)).ToList(), Path.Combine(fullPath, $"{flag}_{hz}_old_curve.csv")); + CsvHelper.ExportToCsv(flagHzRecordList.Select(x => new CurvePtViewModel(x.ModelFlow, x.CalcHead)).ToList(), Path.Combine(fullPath, $"{flag}_{hz}.csv")); + } + } + + } + + } + + + + + GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; + GC.Collect(2, GCCollectionMode.Forced); + GC.WaitForFullGCComplete(); + + } + + /// <summary> + /// 鏁版嵁棰勫鐞� + /// </summary> + public static void PumpDataPreproc( + Dictionary<int, PumpScheduleModel> pumpScheduleDict, + List<PumpRunRecord> allPumpRunRecordList + ) + { + // 鍏堣繃婊や竴娉㈡暟鎹啀浼犺繘鏉� + if (VerifyNull(pumpScheduleDict)) + { + return; + } + if (VerifyNull(allPumpRunRecordList)) + { + return; + } + + var pumpRunRecordGroupByFlag = allPumpRunRecordList.GroupBy(x => x.Flag); + foreach (var flagGroup in pumpRunRecordGroupByFlag) + { + var flag = flagGroup.Key; + var pump = pumpScheduleDict[flag]; + var pumpRunRecordGroupByHz = new Dictionary<int, List<PumpRunRecord>>(); + + var tempPumpRunRecordList = flagGroup.ToList(); + if (pump.IsVariableFrequency) + { + var validList = FilterHead(tempPumpRunRecordList); + pumpRunRecordGroupByHz.Add(50, validList); + } + else + { + var tempHzGroup = tempPumpRunRecordList.OrderBy(x => x.Rpm).GroupBy(x => + { + return (int)Math.Round(x.Rpm / pump.RatedSpeed * _ratedFrequency, 0); + }); + + foreach (var hzGroup in tempHzGroup) + { + var hz = hzGroup.Key; + var tempFilterList = FilterHead(hzGroup); + pumpRunRecordGroupByHz.Add(hz, tempFilterList); + } + } + + foreach (var hzGroup in pumpRunRecordGroupByHz) + { + var hz = hzGroup.Key; + var similarCurveQH = SimilarCalculateHelper.CalculateQH(pump.CurveQH, _ratedFrequency, hz); + var curveQHPtList = similarCurveQH.GetFitPoints(100); + + //CsvHelper.ExportToCsv(curvePtList.Select(x => new CurvePtViewModel(x)).ToList(), Path.Combine(fullPath, $"{flag}_{hz}_old_curve.csv")); + //CsvHelper.ExportToCsv(flagHzRecordList.Select(x => new CurvePtViewModel(x.FlowRate, x.Head)), Path.Combine(fullPath, $"{flag}_{hz}.csv")); + + } + + } + + + + } + + public static List<PumpRunRecord> FilterHead(IEnumerable<PumpRunRecord> list) + { + var pressures = list.Select(p => p.Head).ToList(); + + // 璁$畻缁熻閲� + var (mean, stdDev) = DynamicThresholdProcessorHelper.CalculateStats(pressures); + double skewness = DynamicThresholdProcessorHelper.CalculateSkewness(pressures); + // 鍔ㄦ�佽皟鏁聪冨�嶆暟 + double sigmaMultiplier = DynamicThresholdProcessorHelper.CalculateSigmaMultiplier(skewness); + // var sigmaMultiplier = 3;//鐩墠榛樿 鏍囧噯宸� + + // 璁$畻杈圭晫 + double lower = mean - sigmaMultiplier * stdDev; + double upper = mean + sigmaMultiplier * stdDev; + + return list.Where(p => p.Head >= lower && p.Head <= upper).ToList(); + } + + static bool CheckFitPointList(float[] x, float[] y) + { + + bool is_x_increasing = CheckIncreasing(x); + bool is_y_decreasing = CheckDecreasing(y); + if (!is_x_increasing) + { + Console.WriteLine("x涓嶆弧瓒抽�掑瓒嬪娍"); + return false; + } + if (!is_y_decreasing) + { + Console.WriteLine("y涓嶆弧瓒抽�掑噺瓒嬪娍"); + return false; + } + + return true; + } + 銆� + + static bool CheckIncreasing(float[] values) + { + for (int i = 1; i < values.Length; i++) + { + if (values[i] < values[i - 1]) + { + return false; + } + } + return true; + } + + static bool CheckDecreasing(float[] values) + { + for (int i = 1; i < values.Length; i++) + { + if (values[i] > values[i - 1]) + { + return false; + } + } + return true; + } + + + private static bool VerifyNull(IEnumerable<object> objs) + { + if (objs == null || !objs.Any()) + { + return true; + } + + return false; + + } + + private static bool VerifyNull<TKey, TValue>(Dictionary<TKey, TValue> objs) + { + if (objs == null || !objs.Any()) + { + return true; + } + + return false; + } + + private static void CheckCode(ErrorCode code) + { + if (code != ErrorCode.Ok) + { + if ((int)code > 100) + { + var msg = code.GetDisplayText(); + throw new Exception(msg); + } + + } + } + + public class PumpModelMapping + { + public int Flag { get; set; } + public string PumpId { get; set; } + public string FlowId { get; set; } + public string PressureId { get; set; } + public string CurveId { get; set; } + public int PumpIndex { get; set; } + public int FlowIndex { get; set; } + public int PressureIndex { get; set; } + public int CurveIndex { get; set; } + + } + + public class StationModelMapping + { + public string ScadaFlowId { get; set; } + public string ScadaPressureId { get; set; } + public string FlowId { get; set; } + public string PressureId { get; set; } + + public int FlowIndex { get; set; } + public int PressureIndex { get; set; } + + } + } +} diff --git a/02-desktop/Desktop/IStation.Test/schedule/PumpRecordModel.cs b/02-desktop/Desktop/IStation.Test/schedule/PumpRecordModel.cs new file mode 100644 index 0000000..27e817f --- /dev/null +++ b/02-desktop/Desktop/IStation.Test/schedule/PumpRecordModel.cs @@ -0,0 +1,78 @@ +锘縩amespace IStation.Test +{ + public class PumpRunRecord + { + + public PumpRunRecord() { } + public PumpRunRecord(Model.PumpSignalRecord rhs) + { + this.Flag = rhs.Flag; + this.Rpm = rhs.Rpm; + this.InletWaterLevel = rhs.WaterLevel; + this.Frequency = rhs.Frequency; + this.Flow = rhs.FlowRate; + this.InletPressure = rhs.InletPressure; + this.OutletPressure = rhs.OutletPressure; + this.Head = rhs.Head; + this.Power = rhs.InstantaneousPower; + } + + public void Round() + { + this.Rpm = Math.Round(Rpm); + this.InletWaterLevel = Math.Round(InletWaterLevel, 3); + this.Frequency = Math.Round(Frequency, 2); + this.Flow = Math.Round(Flow, 2); + this.InletPressure = Math.Round(InletPressure, 5); + this.OutletPressure = Math.Round(OutletPressure, 5); + this.Head = Math.Round(Head, 2); + this.Power = Math.Round(Power, 2); + } + + /// <summary> + /// 鏈烘车鏍囪瘑 + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// 姘翠綅 + /// </summary> + public double InletWaterLevel { get; set; } + + /// <summary> + /// 杩涘彛鍘嬪姏 + /// </summary> + public double InletPressure { get; set; } + + /// <summary> + /// 鍑哄彛鍘嬪姏 + /// </summary> + public double OutletPressure { get; set; } + + /// <summary> + /// 鐬椂娴侀噺 + /// </summary> + public double Flow { get; set; } + + /// <summary> + /// 鎵▼ + /// </summary> + public double Head { get; set; } + + /// <summary> + /// 鐬椂鍔熺巼 + /// </summary> + public double Power { get; set; } + + /// <summary> + /// 杞�� + /// </summary> + public double Rpm { get; set; } + + /// <summary> + /// 棰戠巼 + /// </summary> + public double Frequency { get; set; } + + } +} diff --git a/02-desktop/Desktop/IStation.Test/schedule/PumpScheduleModel.cs b/02-desktop/Desktop/IStation.Test/schedule/PumpScheduleModel.cs new file mode 100644 index 0000000..53f2d7c --- /dev/null +++ b/02-desktop/Desktop/IStation.Test/schedule/PumpScheduleModel.cs @@ -0,0 +1,113 @@ +锘縰sing IStation.Model; + +namespace IStation.Test +{ + public class PumpScheduleModel + { + /// <summary> + /// + /// </summary> + public PumpScheduleModel() { } + + /// <summary> + /// + /// </summary> + public PumpScheduleModel(PumpModel rhs) + { + this.Flag = rhs.Flag; + this.RatedFlow = rhs.Qr; + this.RatedHead = rhs.Hr; + this.RatedSpeed = rhs.Nr; + this.RatedPower = rhs.Pr; + this.RatedEfficiency = rhs.Er; + this.Erosion = rhs.NPSHr; + this.InletDiameter = rhs.Ic; + this.OutletDiameter = rhs.Oc; + this.InletElevation = rhs.Ie; + this.OutletElevation = rhs.Oe; + this.IsVariableFrequency = rhs.IsBp; + this.IsDoubleSuction = rhs.IsSxp; + } + + + /// <summary> + /// 杩愯鏍囧織 + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// 娴侀噺(m鲁/h) + /// </summary> + public double RatedFlow { get; set; } + + /// <summary> + /// 鎵▼(m) + /// </summary> + public double RatedHead { get; set; } + + /// <summary> + /// 杞��(r/min) + /// </summary> + public double RatedSpeed { get; set; } + + /// <summary> + /// 鍔熺巼(kw) + /// </summary> + public double RatedPower { get; set; } + + /// <summary> + /// 鏁堢巼(%) + /// </summary> + public double RatedEfficiency { get; set; } + + /// <summary> + /// 姹借殌(m) + /// </summary> + public double Erosion { get; set; } + + /// <summary> + /// 杩涘彛鍙e緞(mm) + /// </summary> + public double? InletDiameter { get; set; } + + /// <summary> + /// 鍑哄彛鍙e緞(mm) + /// </summary> + public double? OutletDiameter { get; set; } + + /// <summary> + /// 杩涘彛鏍囬珮(m) + /// </summary> + public double? InletElevation { get; set; } + + /// <summary> + /// 鍑哄彛鏍囬珮(m) + /// </summary> + public double? OutletElevation { get; set; } + + /// <summary> + /// 鏄彉棰戞车 + /// </summary> + public bool IsVariableFrequency { get; set; } + + /// <summary> + /// 鏄弻鍚告车 + /// </summary> + public bool IsDoubleSuction { get; set; } + + /// <summary> + /// 娴侀噺-鎵▼鏇茬嚎 + /// </summary> + public CurveExpress CurveQH { get; set; } + + /// <summary> + /// 娴侀噺-鍔熺巼鏇茬嚎 + /// </summary> + public CurveExpress CurveQP { get; set; } + + } + +} + + + \ No newline at end of file diff --git a/02-desktop/Desktop/IStation.Test/schedule/StationRunRecord.cs b/02-desktop/Desktop/IStation.Test/schedule/StationRunRecord.cs new file mode 100644 index 0000000..30464f8 --- /dev/null +++ b/02-desktop/Desktop/IStation.Test/schedule/StationRunRecord.cs @@ -0,0 +1,49 @@ +锘縩amespace IStation.Test +{ + public class StationRunRecord + { + public StationRunRecord() { } + public StationRunRecord(Model.StationSignalRecord rhs) + { + Time = rhs.Time; + PumpRunCount = rhs.PumpRunCount; + PumpRunRecords = rhs.PumpSignalRecords?.Select(x => new PumpRunRecord(x)).ToList(); + } + + + /// <summary> + /// 鏃堕棿 + /// </summary> + public DateTime Time { get; set; } + + /// <summary> + /// 鎬绘祦閲� + /// </summary> + public double TotalFlow { get; set; } + + /// <summary> + /// 鎬诲帇鍔� + /// </summary> + public double TotalPressure { get; set; } + + /// <summary> + /// 鎬荤鍋忓樊娴侀噺 + /// </summary> + public double PipeDiffFlow { get; set; } + + /// <summary> + /// 娉佃繍琛屾暟閲� + /// </summary> + public int PumpRunCount { get; set; } + + /// <summary> + /// 娉电珯淇″彿瀛楀吀 + /// </summary> + public Dictionary<string, double> ModelRecordDict { get; set; } + + /// <summary> + /// 娉典俊鍙疯褰曞垪琛� + /// </summary> + public List<PumpRunRecord> PumpRunRecords { get; set; } + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs index d313daa..a817889 100644 --- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Monitor/03-WorkingConditionAnalysis/00-helper/AnalysisHelper.cs @@ -96,7 +96,9 @@ public double MaxFlow { get; set; } public Dictionary<int, double> PressureDiff { get; set; } - + + public Dictionary<int,double > StdDev { get; set; } + public int Count { get; set; } } -- Gitblit v1.9.3