From f9cd59a3907909dae4809f79611bca78c61e07ec Mon Sep 17 00:00:00 2001 From: ningshuxia <ningshuxia0927@outlook.com> Date: 星期三, 30 四月 2025 22:08:05 +0800 Subject: [PATCH] 代码修改 --- 02-desktop/Desktop/IStation.Test/Station1Helper.cs | 3 02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs | 15 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/扩展类/TreeListExtend.cs | 6 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs | 57 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs | 276 ++ 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs | 98 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs | 42 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs | 53 01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs | 3 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurvePoint_Extensions.cs | 427 +++ 02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj | 1 02-desktop/Model/IStation.Model.Curve/相似换算/CutSimuCalculer.cs | 5 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs | 70 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs | 212 + 02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs | 19 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs | 133 + 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj | 46 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs | 125 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs | 291 ++ 02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs | 19 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs | 69 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs | 32 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs | 61 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs | 68 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs | 69 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs | 81 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurveExpress_Extensions.cs | 527 +++ 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg | 18 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx | 123 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs | 51 02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs | 11 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs | 35 02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs | 73 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs | 584 ++++ 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs | 85 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs | 73 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs | 290 ++ 02-desktop/IStation.Desktop.Ch.sln | 18 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx | 124 02-desktop/Desktop/IStation.Test/Program.cs | 4 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs | 71 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs | 918 ++++++ 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx | 209 + 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs | 53 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs | 184 + 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs | 93 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs | 90 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx | 123 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/右下弹窗/AlertTool.cs | 1 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs | 65 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs | 27 02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs | 5 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs | 208 + 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs | 25 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user | 6 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs | 20 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs | 8 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs | 73 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj | 10 02-desktop/Model/IStation.Model.Curve/曲线表达式/CurveExpress.cs | 2 02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs | 30 /dev/null | 837 ------ 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs | 103 02-desktop/Model/IStation.Model.Curve/曲线计算/CurveCalcuHelper.cs | 18 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/扩展类/GridViewExtend.cs | 27 02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs | 26 02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs | 167 + 02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx | 177 + 68 files changed, 6,947 insertions(+), 926 deletions(-) diff --git a/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs b/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs index fdbd9fa..3b2b451 100644 --- a/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs +++ b/01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs @@ -158,8 +158,7 @@ /// <summary> /// 鍒嗘瀽娉� /// </summary> - /// <param name="pumps"></param> - /// <param name="analysis_factor_list"></param> + /// <param name="pumps"></param> /// <exception cref="Exception"></exception> public void AnalysisNew(List<Model.Pump> pumps, Dictionary<int, Dictionary<int, List<CurvePoint>>> flagHzCurveDict) { diff --git a/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs b/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs index af50225..9d7a202 100644 --- a/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs +++ b/02-desktop/BLL/IStation.BLL.Basic/Equipment/Equipment/Equipment.cs @@ -261,11 +261,26 @@ public List<Model.Equipment<Model.PumpModel>> GetPumpModelListByBelongTypeAndBelongID(string belongType, long belongId) { var all = GetByBelongTypeAndBelongID(belongType, belongId); - var engine_pump_list = all?.Where(x => x.Catalog == IStation.Equipment.Pump).OrderBy(x => x.SortCode).ToList(); + var engine_pump_list = all?.Where(x => x.Catalog == IStation.Equipment.EnginePump).OrderBy(x => x.SortCode).ToList(); if (engine_pump_list == null || engine_pump_list.Count < 1) return default; - return engine_pump_list.Select(x => new Model.Equipment<Model.PumpModel>(x)).ToList(); + var pump_list = all?.Where(x => x.Catalog == IStation.Equipment.Pump).OrderBy(x => x.SortCode).ToList(); + if (pump_list == null || pump_list.Count < 1) + return default; + var list = new List<Model.Equipment<Model.PumpModel>>(); + foreach (var engine_pump in engine_pump_list) + { + var pump = pump_list.Find(x => x.ParentIds.Contains(engine_pump.ID)); + if (pump != null) + { + var pumpModel = new Model.Equipment<Model.PumpModel>(pump); + pumpModel.SortCode = engine_pump.SortCode; + list.Add(pumpModel); + } + } + return list; } + #endregion #region Insert diff --git a/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs b/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs index 27a7dd0..e11d8ba 100644 --- a/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs +++ b/02-desktop/Calculation/IStation.Dispatch/Model/AnaScheme.cs @@ -1,4 +1,5 @@ -锘縰sing System.Collections.Generic; +锘縰sing System; +using System.Collections.Generic; using System.Linq; namespace IStation.Dispatch.Model @@ -91,6 +92,8 @@ /// /// </summary> public string ItemsParas { get; set; } + + } diff --git a/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs b/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs index efe6553..63e5941 100644 --- a/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs +++ b/02-desktop/Calculation/IStation.Dispatch/Model/AnaSchemeItem.cs @@ -1,4 +1,6 @@ -锘縩amespace IStation.Dispatch.Model +锘縰sing System; + +namespace IStation.Dispatch.Model { /// <summary> /// @@ -121,5 +123,16 @@ public long PumpCurveID { get; set; } + + + + public void Round() + { + this.WorkPointQ = Math.Round(this.WorkPointQ, 1); + this.WorkPointH = Math.Round(this.WorkPointH, 1); + this.WorkPointE = Math.Round(this.WorkPointE, 1); + this.WorkPointP = Math.Round(this.WorkPointP, 1); + this.Speed = Math.Round(this.Speed, 1); + } } } diff --git a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs index 8b08327..e69e043 100644 --- a/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs +++ b/02-desktop/Component/IStation.Newtonsoft/JsonHelper.cs @@ -59,11 +59,34 @@ /// <summary> /// 瀵硅薄杞负json /// </summary> - public static string Object2Json<T>(T t) + public static string Object2JsonCustom<T>(T t) { if (t == null) return default; return JsonConvert.SerializeObject(t, new JsonSerializerSettings + { + Converters = new[] { new CustomFloatConverter() } + }); + } + + /// <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 Object2FormatJsonCustom<T>(T t) + { + if (t == null) + return default; + return JsonConvert.SerializeObject(t, Formatting.Indented, new JsonSerializerSettings { Converters = new[] { new CustomFloatConverter() } }); @@ -76,10 +99,7 @@ { if (t == null) return default; - return JsonConvert.SerializeObject(t, Formatting.Indented, new JsonSerializerSettings - { - Converters = new[] { new CustomFloatConverter() } - }); + return JsonConvert.SerializeObject(t, Formatting.Indented); } /// <summary> diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs b/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs index c15579d..7650bc8 100644 --- a/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs +++ b/02-desktop/Desktop/IStation.Desktop.Ch2/Func/FuncCreater.cs @@ -16,10 +16,12 @@ var station = new FuncElement("娉电珯", dll, "IStation.WinFrmUI.Basic.StationMgrPage", modular, Resources.Station); var equipment = new FuncElement("璁惧", dll, "IStation.WinFrmUI.Basic.EquipmentMgrPage", modular, Resources.EnginePump); var pumpCurveMgr = new FuncElement("娉垫洸绾�", dll, "IStation.WinFrmUI.Basic.PumpCurveMgrPage", modular, Resources.PumpCurve); - var monitorPoint = new FuncElement("鐩戞祴鐐�", dll, "IStation.WinFrmUI.Basic.MonitorPointMgrPage", modular, Resources.MonitorPoint); - var equipmentMonitorMapping = new FuncElement("娴嬬偣鍏宠仈", dll, "IStation.WinFrmUI.Basic.EquipmentMonitorMappingMgrPage", modular, Resources.Mapping); - return new List<FuncElement>() { station, equipment, pumpCurveMgr, monitorPoint, equipmentMonitorMapping }; + //var monitorPoint = new FuncElement("鐩戞祴鐐�", dll, "IStation.WinFrmUI.Basic.MonitorPointMgrPage", modular, Resources.MonitorPoint); + //var equipmentMonitorMapping = new FuncElement("娴嬬偣鍏宠仈", dll, "IStation.WinFrmUI.Basic.EquipmentMonitorMappingMgrPage", modular, Resources.Mapping); + return new List<FuncElement>() { station, equipment, pumpCurveMgr}; + // return new List<FuncElement>() { station, equipment, pumpCurveMgr, monitorPoint, equipmentMonitorMapping }; } + public static List<FuncElement> CurveAnaly() { var modular = WinFrmUI.eModular.Analy; @@ -29,7 +31,9 @@ var multiSpeedCurvePage = new FuncElement("鏇茬嚎鍙橀��", dataDLL, $"{nameSpace}.MultiSpeedCurvePage", modular, Resources.MultiSpeed); var compareCurvePage = new FuncElement("鏇茬嚎瀵规瘮", dataDLL, $"{nameSpace}.CompareCurvePage", modular, Resources.Compare); var parallelCurvePage = new FuncElement("鏇茬嚎骞惰仈", dataDLL, $"{nameSpace}.ParallelCurvePage", modular, Resources.Parallel); - return new List<FuncElement>() { multiSpeedCurvePage, compareCurvePage, parallelCurvePage }; + var dispatchPage = new FuncElement("浼樺寲璋冨害", dataDLL, $"{nameSpace}.DispatchAnalyPage", modular, Resources.Dispatch); + var scheduleAnalyPage = new FuncElement("浼樺寲璋冨害2", "IStation.WinFrmUI.Schedule.dll", $"IStation.WinFrmUI.Schedule.ScheduleAnalyPage", modular, Resources.Dispatch); + return new List<FuncElement>() { multiSpeedCurvePage, compareCurvePage, parallelCurvePage, dispatchPage, scheduleAnalyPage }; } public static List<FuncElement> Monitor() @@ -75,9 +79,10 @@ { var basic = new FuncElement("鍩虹鏁版嵁", Basic(), Resources.Menu); var analy = new FuncElement("鏇茬嚎鍒嗘瀽", CurveAnaly(), Resources.Menu); - var monitor = new FuncElement("鐩戞祴鏁版嵁", Monitor(), Resources.Menu); - var monitor_analysis = new FuncElement("宸ュ喌鍒嗘瀽", WorkingConditionAnalysis(), Resources.Menu); - return new List<FuncElement>() { basic, analy, monitor, monitor_analysis }; + return new List<FuncElement>() { basic, analy}; + //var monitor = new FuncElement("鐩戞祴鏁版嵁", Monitor(), Resources.Menu); + //var monitor_analysis = new FuncElement("宸ュ喌鍒嗘瀽", WorkingConditionAnalysis(), Resources.Menu); + //return new List<FuncElement>() { basic, analy, monitor, monitor_analysis }; } } diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj index ccc7c37..34edbfc 100644 --- a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj +++ b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj @@ -43,6 +43,7 @@ <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj" /> <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Hydro\IStation.WinFrmUI.Hydro.csproj" /> <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Monitor\IStation.WinFrmUI.Monitor.csproj" /> + <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Schedule\IStation.WinFrmUI.Schedule.csproj" /> </ItemGroup> <ItemGroup> <Content Include="App.ico" /> diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak b/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak deleted file mode 100644 index 8211d87..0000000 --- a/02-desktop/Desktop/IStation.Desktop.Ch2/IStation.Desktop.Ch2.csproj.bak +++ /dev/null @@ -1,176 +0,0 @@ -锘�<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> - <PropertyGroup> - <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProjectGuid>{97F1B9B2-7E24-47A3-B0F5-494C25F31F5F}</ProjectGuid> - <OutputType>WinExe</OutputType> - <RootNamespace>IStation.Desktop.Ch2</RootNamespace> - <AssemblyName>IStation.Desktop.Ch2</AssemblyName> - <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion> - <FileAlignment>512</FileAlignment> - <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> - <Deterministic>true</Deterministic> - <PublishUrl>publish\</PublishUrl> - <Install>true</Install> - <InstallFrom>Disk</InstallFrom> - <UpdateEnabled>false</UpdateEnabled> - <UpdateMode>Foreground</UpdateMode> - <UpdateInterval>7</UpdateInterval> - <UpdateIntervalUnits>Days</UpdateIntervalUnits> - <UpdatePeriodically>false</UpdatePeriodically> - <UpdateRequired>false</UpdateRequired> - <MapFileExtensions>true</MapFileExtensions> - <ApplicationRevision>0</ApplicationRevision> - <ApplicationVersion>1.0.0.%2a</ApplicationVersion> - <IsWebBootstrapper>false</IsWebBootstrapper> - <UseApplicationTrust>false</UseApplicationTrust> - <BootstrapperEnabled>true</BootstrapperEnabled> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugSymbols>true</DebugSymbols> - <DebugType>full</DebugType> - <Optimize>false</Optimize> - <OutputPath>bin\Debug\</OutputPath> - <DefineConstants>DEBUG;TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> - <PlatformTarget>AnyCPU</PlatformTarget> - <DebugType>pdbonly</DebugType> - <Optimize>true</Optimize> - <OutputPath>bin\Release\</OutputPath> - <DefineConstants>TRACE</DefineConstants> - <ErrorReport>prompt</ErrorReport> - <WarningLevel>4</WarningLevel> - </PropertyGroup> - <PropertyGroup> - <ApplicationManifest>app.manifest</ApplicationManifest> - </PropertyGroup> - <PropertyGroup> - <ApplicationIcon>App.ico</ApplicationIcon> - </PropertyGroup> - <ItemGroup> - <Reference Include="DevExpress.Data.Desktop.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <Reference Include="DevExpress.Data.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <Reference Include="DevExpress.Drawing.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <Reference Include="DevExpress.Printing.v22.2.Core, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" /> - <Reference Include="DevExpress.Utils.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <Reference Include="DevExpress.XtraBars.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" /> - <Reference Include="DevExpress.XtraEditors.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <Reference Include="DevExpress.XtraLayout.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" /> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="System.Xml.Linq" /> - <Reference Include="System.Data.DataSetExtensions" /> - <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Data" /> - <Reference Include="System.Deployment" /> - <Reference Include="System.Drawing" /> - <Reference Include="System.Net.Http" /> - <Reference Include="System.Windows.Forms" /> - <Reference Include="System.Xml" /> - </ItemGroup> - <ItemGroup> - <Compile Include="Func\FuncCreater.cs" /> - <Compile Include="Func\FuncElement.cs" /> - <Compile Include="frmMain.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Include="frmMain.Designer.cs"> - <DependentUpon>frmMain.cs</DependentUpon> - </Compile> - <Compile Include="Program.cs" /> - <Compile Include="Properties\AssemblyInfo.cs" /> - <EmbeddedResource Include="frmMain.resx"> - <DependentUpon>frmMain.cs</DependentUpon> - </EmbeddedResource> - <EmbeddedResource Include="Properties\Resources.resx"> - <Generator>ResXFileCodeGenerator</Generator> - <LastGenOutput>Resources.Designer.cs</LastGenOutput> - <SubType>Designer</SubType> - </EmbeddedResource> - <Compile Include="Properties\Resources.Designer.cs"> - <AutoGen>True</AutoGen> - <DependentUpon>Resources.resx</DependentUpon> - <DesignTime>True</DesignTime> - </Compile> - <None Include="app.config" /> - <None Include="app.manifest" /> - <None Include="Properties\Settings.settings"> - <Generator>SettingsSingleFileGenerator</Generator> - <LastGenOutput>Settings.Designer.cs</LastGenOutput> - </None> - <Compile Include="Properties\Settings.Designer.cs"> - <AutoGen>True</AutoGen> - <DependentUpon>Settings.settings</DependentUpon> - <DesignTimeSharedInput>True</DesignTimeSharedInput> - </Compile> - <None Include="test.json" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\..\BLL\IStation.BLL.Basic\IStation.BLL.Basic.csproj"> - <Project>{3b7b39da-835b-4975-bd88-977e1870fe32}</Project> - <Name>IStation.BLL.Basic</Name> - </ProjectReference> - <ProjectReference Include="..\..\Component\IStation.SnowflakeId\IStation.SnowflakeId.csproj"> - <Project>{7cb8c9a8-a6de-4742-b7c7-1f8bcc6c3eea}</Project> - <Name>IStation.SnowflakeId</Name> - </ProjectReference> - <ProjectReference Include="..\..\Model\IStation.Model.Basic\IStation.Model.Basic.csproj"> - <Project>{768DFBA7-383A-4780-BB29-D3F73997EE6B}</Project> - <Name>IStation.Model.Basic</Name> - </ProjectReference> - <ProjectReference Include="..\..\Model\IStation.Model.Core\IStation.Model.Core.csproj"> - <Project>{BA30A79A-7D4E-4063-A2A3-D7C30DD4A752}</Project> - <Name>IStation.Model.Core</Name> - </ProjectReference> - <ProjectReference Include="..\..\Settings\IStation.Settings\IStation.Settings.csproj"> - <Project>{37082337-850e-4dc9-9df5-da0218da6db8}</Project> - <Name>IStation.Settings</Name> - </ProjectReference> - <ProjectReference Include="..\..\Utils\IStation.Untity\IStation.Untity.csproj"> - <Project>{a8c1bb64-0119-48b3-aa8e-0bd346f9467d}</Project> - <Name>IStation.Untity</Name> - </ProjectReference> - <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Analy\IStation.WinFrmUI.Analy.csproj"> - <Project>{c79733bb-7fa3-43a8-aacf-097ea697973c}</Project> - <Name>IStation.WinFrmUI.Analy</Name> - </ProjectReference> - <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Basic\IStation.WinFrmUI.Basic.csproj"> - <Project>{3810ADB6-0D50-4E85-AA92-DF639B48871A}</Project> - <Name>IStation.WinFrmUI.Basic</Name> - </ProjectReference> - <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj"> - <Project>{ae19abb8-6f6a-4598-b3eb-5ef40d11dc46}</Project> - <Name>IStation.WinFrmUI.Core</Name> - </ProjectReference> - <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Hydro\IStation.WinFrmUI.Hydro.csproj"> - <Project>{e7d9741f-c312-473c-a84b-f905eba7eb0c}</Project> - <Name>IStation.WinFrmUI.Hydro</Name> - </ProjectReference> - <ProjectReference Include="..\..\WinFrmUI\IStation.WinFrmUI.Monitor\IStation.WinFrmUI.Monitor.csproj"> - <Project>{e36da053-8441-442d-b482-c2c4e021fb49}</Project> - <Name>IStation.WinFrmUI.Monitor</Name> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <Content Include="App.ico" /> - </ItemGroup> - <ItemGroup> - <BootstrapperPackage Include=".NETFramework,Version=v4.6.2"> - <Visible>False</Visible> - <ProductName>Microsoft .NET Framework 4.6.2 %28x86 鍜� x64%29</ProductName> - <Install>true</Install> - </BootstrapperPackage> - <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> - <Visible>False</Visible> - <ProductName>.NET Framework 3.5 SP1</ProductName> - <Install>false</Install> - </BootstrapperPackage> - </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> -</Project> \ No newline at end of file diff --git a/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak b/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak deleted file mode 100644 index 6e75ecf..0000000 --- a/02-desktop/Desktop/IStation.Desktop.Ch2/frmMain.resx.bak +++ /dev/null @@ -1,837 +0,0 @@ -锘�<?xml version="1.0" encoding="utf-8"?> -<root> - <!-- - Microsoft ResX Schema - - Version 2.0 - - The primary goals of this format is to allow a simple XML format - that is mostly human readable. The generation and parsing of the - various data types are done through the TypeConverter classes - associated with the data types. - - Example: - - ... ado.net/XML headers & schema ... - <resheader name="resmimetype">text/microsoft-resx</resheader> - <resheader name="version">2.0</resheader> - <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> - <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> - <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> - <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> - <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> - <value>[base64 mime encoded serialized .NET Framework object]</value> - </data> - <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> - <comment>This is a comment</comment> - </data> - - There are any number of "resheader" rows that contain simple - name/value pairs. - - Each data row contains a name, and value. The row also contains a - type or mimetype. Type corresponds to a .NET class that support - text/value conversion through the TypeConverter architecture. - Classes that don't support this are serialized and stored with the - mimetype set. - - The mimetype is used for serialized objects, and tells the - ResXResourceReader how to depersist the object. This is currently not - extensible. For a given mimetype the value must be set accordingly: - - Note - application/x-microsoft.net.object.binary.base64 is the format - that the ResXResourceWriter will generate, however the reader can - read any of the formats listed below. - - mimetype: application/x-microsoft.net.object.binary.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.soap.base64 - value : The object must be serialized with - : System.Runtime.Serialization.Formatters.Soap.SoapFormatter - : and then encoded with base64 encoding. - - mimetype: application/x-microsoft.net.object.bytearray.base64 - value : The object must be serialized into a byte array - : using a System.ComponentModel.TypeConverter - : and then encoded with base64 encoding. - --> - <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> - <xsd:element name="root" msdata:IsDataSet="true"> - <xsd:complexType> - <xsd:choice maxOccurs="unbounded"> - <xsd:element name="metadata"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" /> - </xsd:sequence> - <xsd:attribute name="name" use="required" type="xsd:string" /> - <xsd:attribute name="type" type="xsd:string" /> - <xsd:attribute name="mimetype" type="xsd:string" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="assembly"> - <xsd:complexType> - <xsd:attribute name="alias" type="xsd:string" /> - <xsd:attribute name="name" type="xsd:string" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="data"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> - <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> - <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> - <xsd:attribute ref="xml:space" /> - </xsd:complexType> - </xsd:element> - <xsd:element name="resheader"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> - </xsd:sequence> - <xsd:attribute name="name" type="xsd:string" use="required" /> - </xsd:complexType> - </xsd:element> - </xsd:choice> - </xsd:complexType> - </xsd:element> - </xsd:schema> - <resheader name="resmimetype"> - <value>text/microsoft-resx</value> - </resheader> - <resheader name="version"> - <value>2.0</value> - </resheader> - <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> - </resheader> - <metadata name="documentManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> - <value>17, 17</value> - </metadata> - <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> - <value>259, 17</value> - </metadata> - <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> - <value>442, 17</value> - </metadata> - <assembly alias="DevExpress.Data.v22.2" name="DevExpress.Data.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> - <data name="barBtnPorject.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value> - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40 - LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl - dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAFsDAAAC77u/ - PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi - IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv - MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh - Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg - MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H - cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy - NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh - Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkJyaWVmY2FzZSI+DQogICAgPHJlY3QgeD0iMTQi - IHk9IjE0IiB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0i - TTIwLDE5YzAsMC41LTAuNSwxLTEsMWgtNmMtMC41LDAtMS0wLjUtMS0xdi0zSDJ2MTFjMCwwLjUsMC41 - LDEsMSwxaDI2YzAuNSwwLDEtMC41LDEtMVYxNkgyMFYxOXoiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8 - cGF0aCBkPSJNMjksOGgtN1Y1YzAtMC41LTAuNS0xLTEtMUgxMWMtMC41LDAtMSwwLjUtMSwxdjNIM0My - LjUsOCwyLDguNSwyLDl2NWgxMHYtMWMwLTAuNSwwLjUtMSwxLTFoNiAgIGMwLjUsMCwxLDAuNSwxLDF2 - MWgxMFY5QzMwLDguNSwyOS41LDgsMjksOHogTTIwLDhoLThWNmg4Vjh6IiBjbGFzcz0iQmxhY2siIC8+ - DQogIDwvZz4NCjwvc3ZnPgs= -</value> - </data> - <data name="barBtnProjectName.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value> - AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40 - LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl - dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPACAAAC77u/ - PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi - IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv - MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh - Y2U9InByZXNlcnZlIiBpZD0iRGVmaW5lX05hbWUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcg - MCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5CbGFja3tmaWxsOiM3MjcyNzI7 - fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8cGF0aCBkPSJNMjIsMTZoLTh2LTJo - OFYxNnogTTE0LDIwaDh2LTJoLThWMjB6IE0yNy42LDE1LjRMMjcsMTQuOGwtMC42LDAuNkwyNiwxNS44 - VjI0SDhsLTYtNnYtMmw2LTZoMTIuMmwwLjQtMC40ICBMMjEuMiw5bC0wLjYtMC42TDIwLjIsOEg3bC03 - LDd2NGw3LDdsMjAsMGMwLjYsMCwxLTAuNCwxLTF2LTkuMkwyNy42LDE1LjR6IE02LDE3YzAsMS4xLDAu - OSwyLDIsMmMxLjEsMCwyLTAuOSwyLTJzLTAuOS0yLTItMiAgQzYuOSwxNSw2LDE1LjksNiwxN3oiIGNs - YXNzPSJCbGFjayIgLz4NCiAgPHBvbHlnb24gcG9pbnRzPSIyNyw2IDI5LDQgMjksNyAzMiw3IDMwLDkg - MzIsMTEgMjksMTEgMjksMTQgMjcsMTIgMjUsMTQgMjUsMTEgMjIsMTEgMjQsOSAyMiw3IDI1LDcgMjUs - NCAiIGNsYXNzPSJZZWxsb3ciIC8+DQo8L3N2Zz4L -</value> - </data> - <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> - <data name="tabbedView1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> - <value> - 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 -</value> - </data> -</root> \ No newline at end of file diff --git a/02-desktop/Desktop/IStation.Test/Program.cs b/02-desktop/Desktop/IStation.Test/Program.cs index fa0a2cc..1ca80d8 100644 --- a/02-desktop/Desktop/IStation.Test/Program.cs +++ b/02-desktop/Desktop/IStation.Test/Program.cs @@ -23,13 +23,13 @@ // AnalysisDeviation(); // 6 鍒嗘瀽娉甸璋辩郴鏁� - // 7 + // 7 AnalysisHelper // Station2TotalFlowDiffHelper.Start();// 8 C# 瀵煎嚭鏁版嵁 琛ュ叏娴侀噺鍋忓樊 + python //test - StationTotalFlowPressureHelper.Start(); + //StationTotalFlowPressureHelper.Start(); Console.WriteLine(); Console.WriteLine("ok"); Console.ReadKey(); diff --git a/02-desktop/Desktop/IStation.Test/Station1Helper.cs b/02-desktop/Desktop/IStation.Test/Station1Helper.cs index 87100bc..153b6a2 100644 --- a/02-desktop/Desktop/IStation.Test/Station1Helper.cs +++ b/02-desktop/Desktop/IStation.Test/Station1Helper.cs @@ -27,7 +27,6 @@ /// </summary> public static void Start() { - var projectId = 661070185922629; IStation.SettingsD.Project.ID = projectId; var monitorDataSourcesId = 663976941449285;//2024-202504 @@ -73,8 +72,6 @@ foreach (var item in pump_model_mapping_list) { var flag = item.Flag; - - if (EpanetMethods.ENgetlinkindex(item.PumpId, out int pump_index) != ErrorCode.Ok) throw new Exception($"ENgetlinkindex锛歿err}"); diff --git a/02-desktop/IStation.Desktop.Ch.sln b/02-desktop/IStation.Desktop.Ch.sln index 284ad88..ca9b9f1 100644 --- a/02-desktop/IStation.Desktop.Ch.sln +++ b/02-desktop/IStation.Desktop.Ch.sln @@ -101,12 +101,11 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.Desktop.Ch2", "Desktop\IStation.Desktop.Ch2\IStation.Desktop.Ch2.csproj", "{97F1B9B2-7E24-47A3-B0F5-494C25F31F5F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F2BEBFF5-AAA3-49B4-81CF-E07416F93365}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.Test", "Desktop\IStation.Test\IStation.Test.csproj", "{C075AE87-67FC-4006-8DB7-5D512BA3142E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IStation.WinFrmUI.Schedule", "WinFrmUI\IStation.WinFrmUI.Schedule\IStation.WinFrmUI.Schedule.csproj", "{E996E89E-BA4C-46BF-AA08-8DFD2314045C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinFrmUI2", "WinFrmUI2", "{87BFA0F8-AE12-4E42-8DFD-65D26336F248}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -420,6 +419,14 @@ {C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|Any CPU.Build.0 = Release|Any CPU {C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|x86.ActiveCfg = Release|Any CPU {C075AE87-67FC-4006-8DB7-5D512BA3142E}.Release|x86.Build.0 = Release|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|x86.ActiveCfg = Debug|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Debug|x86.Build.0 = Debug|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|Any CPU.Build.0 = Release|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|x86.ActiveCfg = Release|Any CPU + {E996E89E-BA4C-46BF-AA08-8DFD2314045C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -462,6 +469,7 @@ {E7D9741F-C312-473C-A84B-F905EBA7EB0C} = {6ABBE52D-1E54-4C3D-8C49-56C3F7A7013E} {27109AE7-B1D4-4EB5-9101-4470404D1861} = {0BE62CB9-1E6E-4E63-A782-7252D085A664} {ADE71241-23D9-4F31-B6A0-3B11A8DD9E3C} = {47F45E59-D66B-4B5A-B705-64F9C1715548} + {E996E89E-BA4C-46BF-AA08-8DFD2314045C} = {87BFA0F8-AE12-4E42-8DFD-65D26336F248} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {04D92980-B7F3-4AC8-B744-D6A674322C27} diff --git a/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs b/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs index 97ab62c..5948138 100644 --- a/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs +++ b/02-desktop/Model/IStation.Model.Basic/Equipment/paras/3-beng/Pump.cs @@ -1,4 +1,6 @@ -锘縰sing System; +锘縰sing Microsoft.AspNetCore.Components; +using System; +using System.ComponentModel.DataAnnotations; namespace IStation.Model { @@ -146,7 +148,34 @@ /// /// </summary> public PumpModel() { } - + public PumpModel(Model.Equipment<Model.PumpModel> pump, Model.PumpCurve pumpCurve) + { + Flag = pump.SortCode; + Name = pump.Name; + if (pump.RatedParas != null) + { + Qr = pump.RatedParas.Qr; + Hr = pump.RatedParas.Hr; + Nr = pump.RatedParas.Nr; + Pr = pump.RatedParas.Pr; + Er = pump.RatedParas.Er; + NPSHr = pump.RatedParas.NPSHr; + StNumr = pump.RatedParas.StNumr; + Ic = pump.RatedParas.Ic; + Oc = pump.RatedParas.Oc; + IOd = pump.RatedParas.IOd; + IsBp = pump.RatedParas.IsBp; + IsSxp = pump.RatedParas.IsSxp; + Oc = pump.RatedParas.Oc; + Ic = pump.RatedParas.Ic; + } + if (pumpCurve != null) + { + CurveQH = pumpCurve.CurveInfo?.CurveQH; + CurveQP = pumpCurve.CurveInfo?.CurveQP; + CurveQE = pumpCurve.CurveInfo?.CurveQE; + } + } /// <summary> /// /// </summary> @@ -166,6 +195,9 @@ IOd = rhs.IOd; IsBp = rhs.IsBp; IsSxp = rhs.IsSxp; + this.CurveQH = rhs.CurveQH; + this.CurveQP = rhs.CurveQP; + this.CurveQE = rhs.CurveQE; } /// <summary> @@ -187,12 +219,23 @@ IOd = rhs.IOd; IsBp = rhs.IsBp; IsSxp = rhs.IsSxp; + this.CurveQH = rhs.CurveQH; + this.CurveQP = rhs.CurveQP; + this.CurveQE = rhs.CurveQE; + this.Percentage = rhs.Percentage; + this.MachineRunStatus = rhs.MachineRunStatus; } - public int Flag { get; set; } + /// <summary> + /// 娴侀噺(m鲁/h) + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// 娴侀噺(m鲁/h) + /// </summary> public string Name { get; set; } - - + /// <summary> /// 娴侀噺(m鲁/h) @@ -263,9 +306,13 @@ /// 鏄惁鏄弻鍚告车 /// </summary> public bool IsSxp { get; set; } + + public Model.CurveExpress CurveQH { get; set; } + public Model.CurveExpress CurveQP { get; set; } + public Model.CurveExpress CurveQE { get; set; } + public double Percentage { get; set; } = 125;//寤堕暱鐧惧垎姣� + public eMachineRunStatus MachineRunStatus { get; set; } = eMachineRunStatus.Open;// 鏈烘车杩愯鐘舵�� - - /// <summary> /// /// </summary> @@ -278,5 +325,17 @@ { return Clone(); } + + /// <summary> + /// + /// </summary> + public enum eMachineRunStatus + { + [Display(Name = "鍏抽棴")] + Close = 0, + + [Display(Name = "寮�鍚�")] + Open = 1 + } } } \ No newline at end of file diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs" index 7b8dce5..8a1d6da 100644 --- "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs" +++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress.cs" @@ -12,7 +12,7 @@ /// 鏇茬嚎琛ㄨ揪寮� /// </summary> [DataContract] - public class CurveExpress : ICloneable + public class CurveExpress :JsonModel<CurveExpress> ,ICloneable { #region 鏋勯�犲嚱鏁� diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs" new file mode 100644 index 0000000..7c6b9c2 --- /dev/null +++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurveExpress_Extensions.cs" @@ -0,0 +1,527 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace IStation.Model +{ + public static class CurveExpress_Extensions + { + #region List<CurvePoint> Extend + + /// <summary> + /// 鑾峰彇鎷熷悎鐐� + /// </summary> + public static List<CurvePoint> GetFitPointsByExtend(this CurveExpress express, double ratioExtend, int pointNumber) + { + if (express == null) + return default; + return express.GetFitPointsByRange(express.Min, express.Max * ratioExtend, pointNumber); + } + + /// <summary> + /// 鑾峰彇鎷熷悎鐐� + /// </summary> + public static List<CurvePoint> GetFitPointsByExtend(this CurveExpress express, double ratioExtendmin, double ratioExtendmax, int pointNumber) + { + if (express == null) + return default; + return express.GetFitPointsByRange(express.Min * ratioExtendmin, express.Max * ratioExtendmax, pointNumber); + } + + #endregion + + #region CurveFunction + + /// <summary> + /// 鑾峰彇鏇茬嚎鏂圭▼ + /// </summary> + public static string GetCurveFunction(this CurveExpress express, string xName = "Q") + { + + StringBuilder sb = new StringBuilder(); + sb.Append(Math.Abs(express.Index0).ToString("0.00")); + + if (express.Index1 > 0) + sb.Append(" + "); + else + sb.Append(" - "); + sb.Append(Math.Abs(express.Index1).ToString("0.0000")); + sb.Append(" * "); + sb.Append(xName); + + if (express.Index2 > 0) + sb.Append(" + "); + else + sb.Append(" - "); + sb.Append(Math.Abs(express.Index2).ToString("0.000000000")); + sb.Append(" * "); + sb.Append(xName); + sb.Append("^2 "); + + + if (express.Index3 > 0) + sb.Append(" + "); + else + sb.Append(" - "); + sb.Append(Math.Abs(express.Index3).ToString("0.000000000000")); + sb.Append(" * "); + sb.Append(xName); + sb.Append("^3 "); + + return sb.ToString(); + } + + /// <summary> + /// 鑾峰彇 + /// </summary> + /// <param name="functionIndex"></param> + /// <param name="functionCoeff"></param> + /// <param name="signValue"></param> + /// <param name="IndexValue"></param> + private static void GetFuncScientificValue(int functionIndex, double functionCoeff, ref double signValue, ref int IndexValue) + { + string strList = ""; + if (functionIndex == 0) + { + strList = functionCoeff.ToString("0.000e+000"); + } + else if (functionIndex == 1) + { + strList = functionCoeff.ToString("0.000000e+000"); + } + else if (functionIndex == 2) + { + strList = functionCoeff.ToString("#.#########e+000"); + } + else if (functionIndex == 3) + { + strList = functionCoeff.ToString("#.############e+000"); + } + string[] st1 = null; + st1 = strList.Split('e'); + signValue = Convert.ToDouble(st1[0]); + IndexValue = Convert.ToInt32(st1[1]); + } + + #endregion + + + #region 鑾峰緱X鍊� + + /// <summary> + /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,澶氫釜鐐归噷鍙栨渶鍚庝竴涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + /// <param name="curve"></param> + /// <param name="y"></param> + /// <param name="interPointNum"></param> + /// <returns></returns> + public static double? GetInterPointLastX(this CurveExpress curve, double y, int interPointNum = 20) + { + if (curve == null) + return null; + var points = curve.GetFitPoints( interPointNum); + if (points == null) + return null; + + //鍦ㄨ寖鍥村唴 + double maxY = (from yyy in points select yyy.Y).Max(); + double minY = (from yyy in points select yyy.Y).Min(); + + if (double.IsNaN(maxY) || double.IsNaN(minY)) + return null; + if (y < minY || y > maxY) + return null; + + var list = points.GetPointsByInterPointX(y); + if (list == null || list.Count < 1) + return null; + + return list.Last().X; + } + + + + + + /// <summary> + /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�):浼氳绠楀欢闀块儴鍒�:鑰屼笖瑕佹眰points鐐规寜鐓т粠灏忓埌澶ф帓搴� + /// </summary> + /// <param name="curve"></param> + /// <param name="y"></param> + /// <param name="interPointNum"></param> + /// <param name="extendRatio"></param> + /// <returns></returns> + public static List<CurvePoint> GetInterPointExX(this CurveExpress curve, double y, int interPointNum, double extendRatio) + { + if (curve == null) + return null; + var points = GetFitPointsByExtend(curve, extendRatio, interPointNum); + if (points == null) + return null; + + //鍦ㄨ寖鍥村唴 + double maxY = (from yyy in points select yyy.Y).Max(); + double minY = (from yyy in points select yyy.Y).Min(); + if (y > minY && y < maxY) + { + return points.GetPointsByInterPointX(y); + } + + List<CurvePoint> ptList = new List<CurvePoint>(); + //鍒ゆ柇鏄惁鍦ㄥ墠闈㈢殑寤堕暱閮ㄥ垎 + double x_start = CurveLineHelper.GetXbyY(points[0].X, points[0].Y, points[1].X, points[1].Y, y); + if (x_start <= points[0].X) + { + if (x_start > 0 && x_start > points[0].X * 0.9)//鏀句竴鐐逛綑閲� + ptList.Add(new CurvePoint(x_start, y)); + } + + //鍒ゆ柇鏄惁鍦ㄥ悗闈㈢殑寤堕暱閮ㄥ垎:U鍨嬫洸绾� 鏄墠鍚庨兘鏈� + double x_end = CurveLineHelper.GetXbyY(points[points.Count - 2].X, points[points.Count - 2].Y, points[points.Count - 1].X, points[points.Count - 1].Y, y); + if (x_end >= points[points.Count - 1].X && x_end < points[points.Count - 1].X * extendRatio)//鏀句竴鐐逛綑閲� + { + ptList.Add(new CurvePoint(x_end, y)); + } + + if (ptList.Count == 0) + return null; + return ptList; + } + + #endregion 鑾峰緱X鍊� + + #region 鑾峰緱Y鍊� + + /// <summary> + /// 鑾峰彇Y鍊兼渶澶у�肩殑鐐� + /// </summary> + public static CurvePoint GetMaxPoint(this CurveExpress express, int pointNumber = 200) + { + if (express == null) + return null; + if (express.FitType <= 0 && express.DefinePoints != null) + { + return express.DefinePoints.GetPointByMaxY(); + } + else if (express.FitType == eCurveFitType.LinearCurve) + { + return express.DefinePoints.GetPointByMaxY(); + } + else + { + var points = express.GetFitPoints(pointNumber); + return points.GetPointByMaxY(); + } + } + + /// <summary> + /// 鑾峰彇Y鍊兼渶澶у�肩殑鐐� + /// </summary> + public static CurvePoint GetMaxPointByRange(this CurveExpress express, double rangeMin, double rangeMax, int pointNumber = 200) + { + if (express == null) + return null; + var points = express.GetFitPointsByRange(rangeMin, rangeMax, pointNumber); + return points.GetPointByMaxY(); + } + + + /// <summary> + /// 鑾峰彇鏈�澶ф渶灏廦 + /// </summary> + /// <param name=""></param> + public static bool GetMinMaxPointY(this CurveExpress express, out double maxY, out double minY) + { + if (express == null) + { + maxY = minY = 0; + return false; + } + var fitPoints = express.GetFitPoints(50); + if (fitPoints == null) + { + maxY = minY = 0; + return false; + } + maxY = fitPoints.Max(x => x.Y); + minY = fitPoints.Min(x => x.Y); + + if (express.DefinePoints != null && express.DefinePoints.Any()) + { + var defMaxY = express.DefinePoints.Max(x => x.Y); + var defMinY = express.DefinePoints.Min(x => x.Y); + maxY = Math.Max(maxY,defMaxY); + minY = Math.Min(minY, defMinY); + } + return true; + } + + #endregion 鍙朰鐨勬渶澶ф渶灏忓�� + + #region SimuValue + + /// <summary> + /// 鐭ラ亾鍘熷閫熷害,浠ュ強鍘熷鐨勬潹绋婬浠ュ強瀵瑰簲鐨勫彉閫熷悗鐨勬潹绋�,姹傚彉閫熷悗鐨勯�熷害 + /// </summary> + /// <param name="originSpeend"></param> + /// <param name="originH"></param> + /// <param name="changeH"></param> + /// <returns></returns> + public static double CalculateSimuByH(double originSpeend, double originH, double changeH) + { + double ratio = Math.Pow(originH / changeH, 1.0 / 2.0); + return originSpeend / ratio; + } + + /// <summary> + /// 鏍规嵁鐩镐技鐐硅缃浉浼兼洸绾�,鐩镐技鐐�(閫夋嫨鐐�)鐨剎:娴侀噺y:鏉ㄧ▼ + /// </summary> + public static double GetSimuValue(this CurveExpress express, CurvePoint simularPoint, double originValue, double extendRatio = 1) + { + if (express == null) + return -3; + if (simularPoint.X < 0.1 || simularPoint.Y < 0.1) + return -2; + if (simularPoint.X > express.Max * extendRatio * 1.5) + return -4; + + CurvePoint sectPoint = GetSectPoint(express, simularPoint, extendRatio); + if (sectPoint == null || sectPoint.IsZeroPoint()) + return -5; + + //璁$畻鐩镐技鐐圭殑杞��/鐩村緞 + return CalculateSimuByH(originValue, sectPoint.Y, simularPoint.Y); + } + + //ratioIgnore:浣滅敤 褰搒imularPoint瓒呭嚭鏇茬嚎鑼冨洿鏃�,鏇茬嚎鎵╁ぇ鐨勫�嶆暟 + public static CurvePoint GetSectPoint(this CurveExpress CurveExpress, CurvePoint simularPoint, double ratioIgnore) + { + return GetSectPointGeneral(CurveExpress, simularPoint, 2, ratioIgnore); + } + + #endregion + + #region 鏇茬嚎涓嶩=K*Q^i鐨勪氦鐐� + + + //閫氳繃鐐箂imularPoint鍜岀偣(0,0)鐨勭洿绾�,涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0)) + public static CurvePoint GetSectPointLine(List<CurvePoint> CurvePoints, CurvePoint simularPoint) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (CurvePoints == null || CurvePoints.Count < 2) + return sectPoint; + + //璁$畻鐩寸嚎鐨凨 + if (simularPoint.X < 1) + return sectPoint; + double a = simularPoint.Y / simularPoint.X; + if (a < 0.0001) + return sectPoint; + + //涓�2鐐硅繛鎴愮洿绾跨殑浜ょ偣,鍒ゆ柇浜ょ偣鏄惁鍦�2鐐逛箣闂�,鍗冲彲鏄洸绾跨殑浜ょ偣 + double b, c; + double x; + for (int i = 0; i < CurvePoints.Count - 1; i++) + { + CurveLineHelper.GetKandB(CurvePoints[i], CurvePoints[i + 1], out b, out c); + + /*瑙f柟绋� + * y=ax + * y=bx+c + */ + if (Math.Abs(a - b) < 0.001) + continue; + + x = c / (a - b); + if ( IsMiddle(CurvePoints[i].X, CurvePoints[i + 1].X, x)) + { + sectPoint.X = x; + sectPoint.Y = a * x; + return sectPoint; + } + } + + return sectPoint; + } + + /// <summary> + /// 鏄惁涓轰腑闂存暟 + /// </summary> + public static bool IsMiddle(this double x, double x1, double x2) + { + return (x >= x1 && x <= x2) || (x <= x1 && x >= x2); + } + + //閫氳繃鐐箂imularPoint鍜岀偣(0,0)鐨勬姏鐗╃嚎,涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0)) + //鏇茬嚎鍏紡:H=K*Q^2 + public static CurvePoint GetSectPointParabola(List<CurvePoint> CurvePoints, CurvePoint simularPoint) + { + return ParabolaCurveHelper_H.GetSectPoint(CurvePoints, simularPoint, 0); + } + + public static CurvePoint GetSectPointParabola(CurveExpress CurveExpress, CurvePoint simularPoint) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (CurveExpress == null) + return sectPoint; + + return GetSectPointParabola(CurveExpress.GetFitPointsByExtend(1.2, 50), simularPoint); + } + + public static CurvePoint GetSectPointLine(this CurveExpress CurveExpress, CurvePoint simularPoint) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (CurveExpress == null) + return sectPoint; + + //璁$畻鐩寸嚎鐨凨 + if (simularPoint.X < 1) + return sectPoint; + double a = simularPoint.Y / simularPoint.X; + if (a < 0.0001) + return sectPoint; + + //鐐硅秺澶氳秺绮剧‘ + return GetSectPointLine(CurveExpress.GetFitPoints(100), simularPoint); + } + + //鏇茬嚎H=K*Q^i 涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0)) + public static CurvePoint GetSectPointGeneral(List<CurvePoint> CurvePoints, CurvePoint simularPoint, double index) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (CurvePoints == null || CurvePoints.Count < 2) + return sectPoint; + + if (simularPoint.X < 0.1) + return sectPoint; + + if (Math.Abs(index - 1) < 0.01) + return GetSectPointLine(CurvePoints, simularPoint); + if (Math.Abs(index - 2) < 0.01) + return GetSectPointParabola(CurvePoints, simularPoint); + + //璁$畻绯绘暟K + double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index); + if (fixK < 0.000001) + return sectPoint; + + //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK + double space = (CurvePoints.Last().X - simularPoint.X) / 1200; + double x = simularPoint.X; + double y, k; + do + { + x = x + space; + y = 0; + if (!CurvePoints.GetInterPointY(x, out y)) + { + break; + } + + k = y / Math.Pow(x, index); + } while (k > fixK); + + sectPoint.X = x; + sectPoint.Y = y; + return sectPoint; + } + + //鏇茬嚎H=K*Q^i 涓庢洸绾緾urve鐨勪氦鐐�(娌℃湁,杩斿洖Point(0,0)) + public static CurvePoint GetSectPointGeneral(this CurveExpress express, CurvePoint simularPoint, double index) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (express == null) + return sectPoint; + + if (simularPoint.X < 1) + return sectPoint; + + //妫�鏌ユ槸鍚﹀湪鏇茬嚎鐨勫尯鍩熻寖鍥村唴 + double maxQ = express.Max; + double maxH = express.GetFitPointY(maxQ); + double k1 = maxH / Math.Pow(maxQ, index); + double k2 = simularPoint.Y / Math.Pow(simularPoint.X, index); + if (k1 > k2) + { + return sectPoint; + } + + if (Math.Abs(index - 1) < 0.01) + return GetSectPointLine(express, simularPoint); + if (Math.Abs(index - 2) < 0.01) + return GetSectPointParabola(express, simularPoint); + + //璁$畻绯绘暟K + double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index); + if (fixK < 0.000001) + return sectPoint; + + //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK + double space = (express.Max - simularPoint.X) / 1000; + double x = simularPoint.X; + double y, k; + do + { + x = x + space; + y = express.GetFitPointY(x); + k = y / Math.Pow(x, index); + } while (k > fixK); + + sectPoint.X = x; + sectPoint.Y = y; + return sectPoint; + } + + //ratioIgnore:浣滅敤 褰搒imularPoint瓒呭嚭鑼冨洿鏃�,鎵╁ぇ鐨勫�嶆暟 + public static CurvePoint GetSectPointGeneral(this CurveExpress curveExpress, CurvePoint simularPoint, double index, double ratioIgnore) + { + CurvePoint sectPoint = new CurvePoint(0, 0); + if (curveExpress == null) + return sectPoint; + + if (simularPoint.X < 1) + return sectPoint; + var CurveExpressEx = curveExpress.Clone(); + //妫�鏌ユ槸鍚﹀湪鏇茬嚎鐨勫尯鍩熻寖鍥村唴 + double maxQ = CurveExpressEx.Max; + double maxH = CurveExpressEx.GetFitPointY(maxQ); + double k1 = maxH / Math.Pow(maxQ, index); + double k2 = simularPoint.Y / Math.Pow(simularPoint.X, index); + if (k1 > k2) + { + CurveExpressEx.Max = CurveExpressEx.Max * ratioIgnore;//鏀惧ぇ1.2鍊� + } + + if (Math.Abs(index - 1) < 0.01) + return GetSectPointLine(CurveExpressEx, simularPoint); + if (Math.Abs(index - 2) < 0.01) + return GetSectPointParabola(CurveExpressEx, simularPoint); + + //璁$畻绯绘暟K + double fixK = simularPoint.Y / Math.Pow(simularPoint.X, index); + if (fixK < 0.000001) + return sectPoint; + + //鎬濊矾鏄粠simularPoint寮�濮嬮�愪釜澧炲姞0.1,鐩村埌k鍊兼渶鎺ヨ繎fixK + double space = (CurveExpressEx.Max - simularPoint.X) / 1000; + double x = simularPoint.X; + double y, k; + do + { + x = x + space; + y = CurveExpressEx.GetFitPointY(x); + k = y / Math.Pow(x, index); + } while (k > fixK); + + sectPoint.X = x; + sectPoint.Y = y; + return sectPoint; + } + + #endregion 鏇茬嚎涓嶩=K*Q^i鐨勪氦鐐� protect绫诲瀷,缁欏瓙绫昏皟鐢�,鎬庝箞瑕嗙洊GetSectPoint + } + + + +} diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs" new file mode 100644 index 0000000..9702ba1 --- /dev/null +++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\241\250\350\276\276\345\274\217/CurvePoint_Extensions.cs" @@ -0,0 +1,427 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; + +namespace IStation.Model +{ + public static class CurvePoint_Extensions + { + + #region Point + + /// <summary> + /// 鍒ゆ柇鏄惁鏄�0鐐�,鐢ㄤ簬鍒ゆ柇鍑芥暟鏄惁鎴愬姛杩斿洖 + /// </summary> + public static bool IsZeroPoint(this CurvePoint pt) + { + if (pt.X < 0.01 && pt.Y < 0.01) + return true; + else + return false; + } + + /// <summary> + /// 鐐瑰埌绾跨殑璺濈 + /// </summary> + public static double GetDistance(this CurvePoint pt1, List<CurvePoint> CurvePoints) + { + if (CurvePoints == null) + return 10000; + + double min_dis = double.MaxValue; + double dis = 0; + foreach (CurvePoint pt in CurvePoints) + { + dis = GetDistance(pt1, pt); + if (dis < min_dis) + min_dis = dis; + } + + return min_dis; + } + + /// <summary> + /// 涓ょ偣涔嬮棿鐨勮窛绂� + /// </summary> + public static double GetDistance(CurvePoint pt1, CurvePoint pt2) + { + return Math.Sqrt((pt1.X - pt2.X) * (pt1.X - pt2.X) + (pt1.Y - pt2.Y) * (pt1.Y - pt2.Y)); + } + + + /// <summary> + /// 璁$畻鎬婚暱搴� + /// </summary> + public static double CalcuTotalLength(this List<CurvePoint> ptList) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + double length = 0; + for (int i = 1; i < ptList.Count; i++) + { + length += ptList[i].Distance(ptList[i - 1]); + } + return length; + } + + #endregion + + #region List<CurvePoint> + + /// <summary> + /// 鑾峰彇Y鏈�灏忕殑鐐� + /// </summary> + public static CurvePoint GetPointByMinY(this List<CurvePoint> ptList) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + return ptList.OrderBy(x => x.Y).FirstOrDefault(); + } + + /// <summary> + /// 鑾峰彇Y鏈�澶х殑鐐� + /// </summary> + public static CurvePoint GetPointByMaxY(this List<CurvePoint> ptList) + { + if (ptList == null || !ptList.Any()) + { + return default; + } + return ptList.OrderBy(x => x.Y).LastOrDefault(); + } + + /// <summary> + /// 鑾峰彇Y鏈�灏忕殑鐐圭储寮� + /// </summary> + public static int GetPointIndexByMinY(this List<CurvePoint> ptList) + { + var pt = GetPointByMinY(ptList); + return ptList.IndexOf(pt); + } + + /// <summary> + /// 鑾峰彇Y鏈�澶х殑鐐圭储寮� + /// </summary> + public static int GetPointIndexByMaxY(this List<CurvePoint> ptList) + { + var pt = GetPointByMaxY(ptList); + return ptList.IndexOf(pt); + } + + /// <summary> + /// 鏍规嵁X 鑾峰彇鐐圭储寮� + /// </summary> + public static int GetPointIndexByX(this List<CurvePoint> ptList, double x) + { + if (ptList == null || !ptList.Any()) + { + return -1; + } + int index = 0; + foreach (var pt in ptList) + { + if (Math.Abs(pt.X - x) < 0.0001) + { + return index; + } + index++; + } + return -1; + } + + /// <summary> + /// 鑾峰彇X鏂瑰悜璺濈鏈�灏忕殑鐐� + /// </summary> + public static CurvePoint GetClosestPointByX(this List<CurvePoint> ptList, double x) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + var pt = ptList.OrderBy(t => Math.Abs(t.X - x)).FirstOrDefault(); + return pt; + } + + /// <summary> + /// 鑾峰彇X鏂瑰悜璺濈鏈�灏忕殑鐐圭储寮� + /// </summary> + public static int GetClosestPointIndexByX(this List<CurvePoint> ptList, double x) + { + var pt = GetClosestPointByX(ptList, x); + return ptList.IndexOf(pt); + } + + + /// <summary> + /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + public static List<double> GetInterPointX(this List<CurvePoint> ptList, double y) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + var list = ptList.ToList(); + var equalPoints = new List<double>(); + int num = list.Count(); + for (int i = 0; i < num - 1; i++)//灏戜竴涓偣 + { + if ((y >= list[i].Y && y <= list[i + 1].Y) || (y <= list[i].Y && y >= list[i + 1].Y)) + {//鐩寸嚎鎻掑�� + double x; + if (Math.Abs(list[i].Y - list[i + 1].Y) < 0.01) + x = (list[i].X + list[i + 1].X) * 0.5; + else + x = list[i].X + (list[i + 1].X - list[i].X) * (y - list[i].Y) / (list[i + 1].Y - list[i].Y); + + equalPoints.Add(x); + } + } + return equalPoints; + } + + /// <summary> + /// 鑾峰緱Y鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + public static List<CurvePoint> GetPointsByInterPointX(this List<CurvePoint> ptList, double y) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + var list = ptList.ToList(); + var equalPoints = new List<CurvePoint>(); + int num = list.Count(); + for (int i = 0; i < num - 1; i++)//灏戜竴涓偣 + { + if ((y >= list[i].Y && y <= list[i + 1].Y) || (y <= list[i].Y && y >= list[i + 1].Y)) + {//鐩寸嚎鎻掑�� + double x; + if (Math.Abs(list[i].Y - list[i + 1].Y) < 0.01) + x = (list[i].X + list[i + 1].X) * 0.5; + else + x = list[i].X + (list[i + 1].X - list[i].X) * (y - list[i].Y) / (list[i + 1].Y - list[i].Y); + + equalPoints.Add(new CurvePoint(x, y)); + } + } + return equalPoints; + } + + /// <summary> + /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + public static List<double> GetInterPointY(this List<CurvePoint> ptList, double x) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + var list = ptList.ToList(); + var equalPoints = new List<double>(); + int num = ptList.Count; + for (int i = 0; i < num - 1; i++)//灏戜竴涓偣 + { + if ((x >= list[i].X && x <= list[i + 1].X) || (x <= list[i].X && x >= list[i + 1].X)) + {//鐩寸嚎鎻掑�� + double y; + if (Math.Abs(list[i].X - list[i + 1].X) < 0.01) + y = (list[i].Y + list[i + 1].Y) * 0.5; + else + y = list[i].Y + (list[i + 1].Y - list[i].Y) * (x - list[i].X) / (list[i + 1].X - list[i].X); + + equalPoints.Add(y); + } + } + return equalPoints; + } + + /// <summary> + /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + public static List<CurvePoint> GetPointsByInterPointY(this List<CurvePoint> ptList, double x) + { + if (ptList == null || ptList.Count < 1) + { + return default; + } + var list = ptList.ToList(); + var equalPoints = new List<CurvePoint>(); + int num = ptList.Count; + for (int i = 0; i < num - 1; i++)//灏戜竴涓偣 + { + if ((x >= list[i].X && x <= list[i + 1].X) || (x <= list[i].X && x >= list[i + 1].X)) + {//鐩寸嚎鎻掑�� + double y; + if (Math.Abs(list[i].X - list[i + 1].X) < 0.01) + y = (list[i].Y + list[i + 1].Y) * 0.5; + else + y = list[i].Y + (list[i + 1].Y - list[i].Y) * (x - list[i].X) / (list[i + 1].X - list[i].X); + + equalPoints.Add(new CurvePoint(x, y)); + } + } + return equalPoints; + } + + + + /// <summary> + /// 鑾峰緱X鍊肩殑鍧愭爣浣嶇疆,鍙兘鏈夊涓偣,鍙栫涓�涓偣(鏄嚎褰㈡彃鍊�,涓嶆槸鏇茬嚎涓婄殑鐐�) + /// </summary> + public static bool GetInterPointY(this List<CurvePoint> points, double x, out double y) + { + y = 0; + if (points == null) + return false; + + int num = points.Count(); + for (int i = 0; i < num - 1; i++)//灏戜竴涓偣 + { + if ((x >= points[i].X && x <= points[i + 1].X) || (x <= points[i].X && x >= points[i + 1].X)) + {//鐩寸嚎鎻掑�� + if (Math.Abs(points[i].X - points[i + 1].X) < 0.01) + y = (points[i].Y + points[i + 1].Y) * 0.5; + else + y = points[i].Y + (points[i + 1].Y - points[i].Y) * (x - points[i].X) / (points[i + 1].X - points[i].X); + + return true; + } + } + return false; + } + + /// <summary> + /// ptList 鏄竴涓杈瑰舰,鍒ゆ柇鐐规槸鍚﹀湪澶氳竟褰㈤噷 + /// 鍘熺悊鏄� 閫氳繃p鍋氫竴涓�+X鏂瑰悜鐨勫皠绾�, 鍋舵暟涓氦鐐� 灏辨槸鍦ㄥ閮�,濂囨暟涓氨鏄湪鍐呴儴 + /// </summary> + public static bool IsInPolygon(this IEnumerable<CurvePoint> ptList, CurvePoint p, bool isClosed = true) + { + if (ptList == null || ptList.Count() < 1) + return default; + var list = ptList.ToList(); + int crossNum = 0; + + for (int i = 0; i < list.Count() - 1; i++) + { + if (p.IsIntersectLineLeft(list[i], list[i + 1])) + { + crossNum++; + } + } + + if (isClosed) + { + if (p.IsIntersectLineLeft(list[list.Count - 1], list[0])) + { + crossNum++; + } + } + + if ((crossNum % 2) == 0) + return false; + else + return true; + } + + /// <summary> + /// 鏄惁瀹屽叏鐩稿悓 + /// </summary> + public static bool IsEqualValueX(this List<CurvePoint> ptList, List<CurvePoint> comparerPtList) + { + if (ptList == null || ptList.Count() == 0) + { + if (comparerPtList == null || comparerPtList.Count() == 0) + { + return true; + } + + return false; + } + + if (comparerPtList == null || comparerPtList.Count() == 0) + { + if (ptList == null || ptList.Count() == 0) + { + return true; + } + + return false; + } + + if (ptList.Count != comparerPtList.Count) + { + return false; + } + + for (int i = 0; i < ptList.Count; i++) + { + if (Math.Abs(ptList[i].X - comparerPtList[i].X) > 0.001) + { + return false; + } + } + + return true; + } + + + #region 鑾峰彇鎷熷悎鐐� + + /// <summary> + /// 鑾峰彇鎷熷悎鐐筜 + /// </summary> + public static double GetFitPointY(this List<CurvePoint> ptList, double x) + { + if (ptList == null) + return default; + var express = new CurveExpress(ptList); + if (express == null) + return default; + return express.GetFitPointY(x); + } + + + #endregion + + #region 鍙朰鐨勬渶澶ф渶灏忓�� + + + /// <summary> + /// 鍙朰鐨勬渶澶ф渶灏忓�� + /// </summary> + public static bool GetMinMaxPointY(this List<CurvePoint> ptList, out double maxY, out double minY) + { + if (ptList == null || !ptList.Any()) + { + maxY = minY = 0; + return false; + } + var fitPoints = ptList.ToList(); + maxY = fitPoints.Max(x => x.Y); + minY = fitPoints.Min(x => x.Y); ; + return true; + } + + /// <summary> + /// 鍙杙oints涓璝鐨勬渶澶у��(涓�瀹氬湪points涓�) + /// </summary> + public static CurvePoint GetMaxPointY(this List<CurvePoint> ptList) + { + if (ptList == null || !ptList.Any()) + { + return new CurvePoint(0, 0); + } + return ptList.OrderByDescending(x => x.Y).First(); + } + + #endregion 鍙朰鐨勬渶澶ф渶灏忓�� + + + #endregion + } +} diff --git "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs" "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs" index 2543634..ea702d7 100644 --- "a/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs" +++ "b/02-desktop/Model/IStation.Model.Curve/\346\233\262\347\272\277\350\256\241\347\256\227/CurveCalcuHelper.cs" @@ -307,9 +307,9 @@ if (changeHz < 1) return null; List<CurvePoint> fitPoints = null; - if (express.DefinePoints != null && express.DefinePoints.Any()) - fitPoints = express.DefinePoints; - else + //if (express.DefinePoints != null && express.DefinePoints.Any()) + // fitPoints = express.DefinePoints; + //else fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber); var ratio = changeHz / originHz; @@ -339,9 +339,9 @@ if (changeHz < 1) return null; List<CurvePoint> fitPoints = null; - if (express.DefinePoints != null && express.DefinePoints.Any()) - fitPoints = express.DefinePoints; - else + //if (express.DefinePoints != null && express.DefinePoints.Any()) + // fitPoints = express.DefinePoints; + //else fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber); var ratio = changeHz / originHz; @@ -371,9 +371,9 @@ if (changeHz < 1) return null; List<CurvePoint> fitPoints = null; - if (express.DefinePoints != null && express.DefinePoints.Any()) - fitPoints = express.DefinePoints; - else + //if (express.DefinePoints != null && express.DefinePoints.Any()) + // fitPoints = express.DefinePoints; + //else fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber); var ratio = changeHz / originHz; diff --git "a/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs" "b/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs" index 99ecf7c..5862c25 100644 --- "a/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs" +++ "b/02-desktop/Model/IStation.Model.Curve/\347\233\270\344\274\274\346\215\242\347\256\227/CutSimuCalculer.cs" @@ -31,8 +31,9 @@ return null; var ratio = change / origin; - List<IStation.Model.CurvePoint> simularPoints = new List<IStation.Model.CurvePoint>(); - foreach (IStation.Model.CurvePoint pt in IStation.Model.FitCurveHelper.GetFitPoints(OriginExpress, pointNum)) + List<IStation.Model.CurvePoint> simularPoints = new(); + var ptList = IStation.Model.FitCurveHelper.GetFitPoints(OriginExpress, pointNum); + foreach (IStation.Model.CurvePoint pt in ptList) { simularPoints.Add(new IStation.Model.CurvePoint( pt.X * ratio, diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs index 1ca1fce..6a54333 100644 --- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Analy/Dispatch/DispatchAnalyPage.cs @@ -30,13 +30,15 @@ public CurrentViewModel() { } public CurrentViewModel(IStation.Dispatch.Model.AnaScheme rhs) { + rhs.Items.ForEach(x => x.Round()); + ID = rhs.ID; - TotalWrkQ = rhs.TotalWrkQ; - TotalWrkH = rhs.TotalWrkH; - TotalWrkE = rhs.TotalWrkE; - TotalWrkP = rhs.TotalWrkP; - UWP = rhs.UWP; - WP = rhs.WP; + TotalWrkQ = Math.Round(rhs.TotalWrkQ,1); + TotalWrkH =Math.Round(rhs.TotalWrkH, 1); + TotalWrkE =Math.Round(rhs.TotalWrkE, 1); + TotalWrkP = Math.Round(rhs.TotalWrkP, 1); + UWP = Math.Round(rhs.UWP, 1); + WP = Math.Round(rhs.WP, 1); RunNumber = rhs.RunNumber; SpanQ = rhs.SpanQ; Items = rhs.Items.ToList(); @@ -172,7 +174,6 @@ IStation.Dispatch.IOptAnaCalc calcHelper = IStation.Dispatch.DispatchAnalyCalculatorFactory.CreateOptAnaCalculator(); //鏋勫缓鍙傛暟 - string errorInfo = null; var complexRequestPras = new IStation.Dispatch.Model.RequestParasComplex() { StationID = _station.ID, @@ -189,12 +190,9 @@ { var pipe_model = new IStation.Dispatch.Model.OutletPipePara(); pipe_model.TargetFlow = _targetQ; - pipe_model.TargetPress = _targetH; - if (range != null) - { - pipe_model.TargetFlowRangeMin = $"{range.Minimum}%"; - pipe_model.TargetFlowRangeMax = $"{range.Maximum}%"; - } + pipe_model.TargetPress = _targetH; + pipe_model.TargetFlowRangeMin = $"{range.Minimum}%"; + pipe_model.TargetFlowRangeMax = $"{range.Maximum}%"; complexRequestPras.OutletPipePara.Add(pipe_model); } } @@ -210,7 +208,7 @@ }).ToList(); //璁$畻 - var anaSchemes = calcHelper.CalcSchemes(complexRequestPras, null, machineRunStatus, out errorInfo); + var anaSchemes = calcHelper.CalcSchemes(complexRequestPras, null, machineRunStatus, out string errorInfo); if (anaSchemes == null || anaSchemes.Count() == 0) { if (string.IsNullOrEmpty(errorInfo)) diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs new file mode 100644 index 0000000..d5dc20e --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/GlobalUsings.cs @@ -0,0 +1,25 @@ +锘縢lobal using DevExpress.Utils; +global using DevExpress.Utils.Animation; +global using DevExpress.XtraBars.Alerter; +global using DevExpress.XtraEditors; +global using DevExpress.XtraGrid; +global using DevExpress.XtraGrid.Columns; +global using DevExpress.XtraGrid.Views.BandedGrid; +global using DevExpress.XtraGrid.Views.Grid; +global using DevExpress.XtraLayout; +global using DevExpress.XtraSplashScreen; +global using DevExpress.XtraTreeList; +global using DevExpress.XtraTreeList.Columns; +global using DevExpress.XtraTreeList.Nodes; +global using System; +global using System.Collections; +global using System.Collections.Generic; +global using System.ComponentModel; +global using System.ComponentModel.DataAnnotations; +global using System.Drawing; +global using System.Reflection; +global using System.Runtime.InteropServices; + +global using DevExpress.XtraGrid.Views.Grid.ViewInfo; +global using System.Linq; +global using System.Windows.Forms; diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj index d2f0d48..54500af 100644 --- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj @@ -60,5 +60,15 @@ <ItemGroup> <Compile Remove="UICore\UserControl\VerifySliderPanel.cs" /> <Compile Remove="UICore\UserControl\VerifySliderPanel.Designer.cs" /> + <Compile Remove="UICore\鎻愮ず妗哱eTipStatus.cs" /> + <Compile Remove="UICore\鎻愮ず妗哱NormalTipFrm.cs" /> + <Compile Remove="UICore\鎻愮ず妗哱NormalTipFrm.Designer.cs" /> + <Compile Remove="UICore\鎻愮ず妗哱TipFrmHelper.cs" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Remove="UICore\鎻愮ず妗哱NormalTipFrm.resx" /> + </ItemGroup> + <ItemGroup> + <Folder Include="UICore\鎻愮ず妗哱" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user index a868fc4..afef5fb 100644 --- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/IStation.WinFrmUI.Core.csproj.user @@ -4,6 +4,9 @@ <ProjectView>ProjectFiles</ProjectView> </PropertyGroup> <ItemGroup> + <Compile Update="UICore\01-tip\TipForm.cs"> + <SubType>Form</SubType> + </Compile> <Compile Update="Basic\DocumentPage\MainForm.cs"> <SubType>Form</SubType> </Compile> @@ -59,9 +62,6 @@ <SubType>Form</SubType> </Compile> <Compile Update="UICore\InputDialog\SetRefLineValue2Dlg.cs"> - <SubType>Form</SubType> - </Compile> - <Compile Update="UICore\鎻愮ず妗哱NormalTipFrm.cs"> <SubType>Form</SubType> </Compile> <Compile Update="UICore\绛夊緟妗哱WaitFormStyle1.cs"> diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs new file mode 100644 index 0000000..c32da59 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.Designer.cs @@ -0,0 +1,98 @@ +锘� +using System.Drawing; +using System.Windows.Forms; +namespace IStation.WinFrmUI +{ + partial class TipForm + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + components = new Container(); + ComponentResourceManager resources = new ComponentResourceManager(typeof(TipForm)); + labText = new LabelControl(); + img32 = new ImageCollection(components); + timer1 = new System.Windows.Forms.Timer(components); + ((ISupportInitialize)img32).BeginInit(); + SuspendLayout(); + // + // labText + // + labText.AllowHtmlString = true; + labText.Appearance.BackColor = Color.White; + labText.Appearance.FontSizeDelta = 1; + labText.Appearance.Options.UseBackColor = true; + labText.Appearance.Options.UseFont = true; + labText.Appearance.Options.UseTextOptions = true; + labText.Appearance.TextOptions.HAlignment = HorzAlignment.Center; + labText.Appearance.TextOptions.VAlignment = VertAlignment.Center; + labText.AutoSizeMode = LabelAutoSizeMode.None; + labText.Dock = DockStyle.Fill; + labText.ImageAlignToText = ImageAlignToText.LeftCenter; + labText.ImageOptions.ImageIndex = 0; + labText.ImageOptions.Images = img32; + labText.ImageOptions.SvgImageSize = new Size(24, 24); + labText.Location = new Point(1, 1); + labText.Name = "labText"; + labText.Size = new Size(298, 78); + labText.TabIndex = 0; + // + // img32 + // + img32.ImageSize = new Size(32, 32); + img32.ImageStream = (ImageCollectionStreamer)resources.GetObject("img32.ImageStream"); + img32.Images.SetKeyName(0, "info32.png"); + img32.Images.SetKeyName(1, "success32.png"); + img32.Images.SetKeyName(2, "warning32.png"); + img32.Images.SetKeyName(3, "error32.png"); + // + // timer1 + // + timer1.Interval = 2000; + timer1.Tick += timer_Tick; + // + // TipForm + // + AutoScaleDimensions = new SizeF(7F, 14F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(300, 80); + Controls.Add(labText); + FormBorderStyle = FormBorderStyle.None; + Name = "TipForm"; + Padding = new Padding(1); + StartPosition = FormStartPosition.CenterScreen; + TopMost = true; + ((ISupportInitialize)img32).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DevExpress.XtraEditors.LabelControl labText; + private System.Windows.Forms.Timer timer1; + private DevExpress.Utils.ImageCollection img32; + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs new file mode 100644 index 0000000..72eaae3 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.cs @@ -0,0 +1,70 @@ +锘縰sing System; +using System.Drawing; +using System.Windows.Forms; + +namespace IStation.WinFrmUI +{ + /// <summary> + /// 鎻愮ず绐椾綋 + /// </summary> + public partial class TipForm : DevExpress.XtraEditors.XtraForm + { + /// <summary> + /// + /// </summary> + public TipForm() + { + InitializeComponent(); + } + + /// <summary> + /// 璁剧疆 + /// </summary> + public void Set(eTipStatus status, string caption, int interval) + { + this.timer1.Enabled = false; + this.labText.ImageOptions.ImageIndex = (int)status; + this.labText.Text = caption; + this.timer1.Interval = interval; + this.timer1.Enabled = true; + AdaptSize(); + } + + //鑷�傚簲灏哄 + private void AdaptSize() + { + int width = 300; + int height = 80; + var bestSize = this.labText.CalcBestSize(); + if (width < bestSize.Width + 20) + { + width = bestSize.Width + 20; + } + if (height < bestSize.Height + 20) + { + height = bestSize.Height + 20; + } + this.Size = new Size(width, height); + } + + /// <summary> + /// 缁樺埗杈规 + /// </summary> + /// <param name="e"></param> + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + this.DrawBorder(e, Color.Gray, 1); + } + + //浜嬩欢 + private void timer_Tick(object sender, EventArgs e) + { + this.timer1.Enabled = false; + this.Close(); + } + + + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx new file mode 100644 index 0000000..c4353b7 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipForm.resx @@ -0,0 +1,177 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="img32.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>107, 17</value> + </metadata> + <assembly alias="DevExpress.Utils.v23.2" name="DevExpress.Utils.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> + <data name="img32.ImageStream" type="DevExpress.Utils.ImageCollectionStreamer, DevExpress.Utils.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMy4yLCBWZXJzaW9uPTIzLjIu + NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFFT + eXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv + a2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAChEZXZFeHByZXNzLlV0aWxzLkltYWdlQ29sbGVjdGlvblN0 + cmVhbWVyAgAAAAlJbWFnZVNpemUERGF0YQQHE1N5c3RlbS5EcmF3aW5nLlNpemUDAAAAAgIAAAAF/P// + /xNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAwAAACAAAAAgAAAACQUAAAAP + BQAAADsJAAACogEAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAARnQU1BAACxjwv8 + YQUAAAFZSURBVFhH7VfLDcIwDO0o7RTcWYAjQ3BkFQoswIkJWAEG4N4zF1ohJC7FDo5K0Wv+gIR40pOi + xvaz6sRJsj98kK/rSbFqymJZ74tlcyK2QhrTN5pjGzFPh6Ks5yRSPQnaWLGPuIcjX5xHFOgABNxIvhxD + wvkhL5spDBpAjiVh3ZBSXNM5CfXbQYAUdCpHVM1tpNgig8ErFzoCjjeXdnu8KfIY2UCadgcZOG81Ftbg + MbIZYCVyfagmgx0gIxJoYbN6dDjsgBhcAiZpiWwHaa/YITnrvch2oInn3m7lbHftEdkYeBLZDsDISBbV + CEigFdkOyMjEdyTgXQKNgARQCfwWYVwCaBF6bsOoBNA29G1EMQkM3ppo0rkVRySAWzHD5zAKpu2qxkcm + dExB23HM+PqFhPHVK5lGyiS8xTVUOWLWBPk6/3YTeOVSwM8/TF6hmpXqmB9+mv0wsuwO9tDFc6Lhhy0A + AAAASUVORK5CYILfAgAAiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGP + C/xhBQAAApZJREFUWEftl09o01Acx3vyICYdYxcFvXrSkwxEFPUwLyKCeBW9jCQ6rKjoQXEoTkShF5WN + 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 +</value> + </data> + <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs new file mode 100644 index 0000000..5f2ecb6 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/TipFormHelper.cs @@ -0,0 +1,85 @@ +锘縩amespace IStation.WinFrmUI +{ + /// <summary> + /// 鎻愮ず妗嗚緟鍔╃被 + /// </summary> + public class TipFormHelper + { + //鑾峰彇鎻愮ず绐椾綋 + private static TipForm GetTipForm() + { + if (_tipForm == null || _tipForm.IsDisposed) + { + lock (_locker) + { + if (_tipForm == null || _tipForm.IsDisposed) + { + _tipForm = new TipForm(); + } + } + } + return _tipForm; + } + private static TipForm _tipForm = null; + private static object _locker = new();//閿佸璞� + + /// <summary> + /// 鏄剧ず鎻愮ず绐椾綋 + /// </summary> + /// <param name="status">鎻愮ず鐘舵��</param> + /// <param name="caption">鎻愮ず淇℃伅</param> + /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param> + public static void Show(eTipStatus status, string caption, int interval = 2000) + { + var frm = GetTipForm(); + frm.Set(status, caption, interval); + frm.Show(); + } + + /// <summary> + /// 鏄剧ず淇℃伅鎻愮ず绐椾綋 + /// </summary> + /// <param name="caption">鎻愮ず淇℃伅</param> + /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param> + public static void ShowInfo(string caption, int interval = 2000) + { + Show(eTipStatus.Info, caption, interval); + } + + /// <summary> + /// 鏄剧ず鎴愬姛鎻愮ず绐椾綋 + /// </summary> + /// <param name="caption">鎻愮ず淇℃伅</param> + /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param> + public static void ShowSucceed(string caption, int interval = 2000) + { + Show(eTipStatus.Succeed, caption, interval); + } + + /// <summary> + /// 鏄剧ず璀﹀憡鎻愮ず绐椾綋 + /// </summary> + /// <param name="caption">鎻愮ず淇℃伅</param> + /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param> + public static void ShowWarn(string caption, int interval = 2000) + { + Show(eTipStatus.Warn, caption, interval); + } + + /// <summary> + /// 鏄剧ず閿欒鎻愮ず绐椾綋 + /// </summary> + /// <param name="caption">鎻愮ず淇℃伅</param> + /// <param name="interval">鎸佺画鏃堕棿锛堟绉掞級</param> + public static void ShowError(string caption, int interval = 2000) + { + Show(eTipStatus.Error, caption, interval); + } + + + + + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs new file mode 100644 index 0000000..bfb5a9f --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/01-tip/eTipStatus.cs @@ -0,0 +1,32 @@ +锘縩amespace IStation.WinFrmUI +{ + /// <summary> + /// 鎻愮ず鐘舵�� + /// </summary> + public enum eTipStatus + { + + /// <summary> + /// 淇℃伅 + /// </summary> + Info = 0, + + /// <summary> + /// 鎴愬姛 + /// </summary> + Succeed = 1, + + /// <summary> + /// 璀﹀憡 + /// </summary> + Warn = 2, + + /// <summary> + /// 閿欒 + /// </summary> + Error = 3, + + + + } +} diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs" index b6e10b6..df0c636 100644 --- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs" +++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\345\217\263\344\270\213\345\274\271\347\252\227/AlertTool.cs" @@ -34,6 +34,7 @@ AlertTool.Alert.Show(owner, info); } + } } diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" index 226b834..d7993eb 100644 --- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" +++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" @@ -1,15 +1,4 @@ -锘縰sing DevExpress.Utils; -using DevExpress.XtraEditors; -using DevExpress.XtraGrid.Columns; -using DevExpress.XtraGrid.Views.Grid; -using DevExpress.XtraGrid.Views.Grid.ViewInfo; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Linq; -using System.Windows.Forms; - +锘� namespace IStation.WinFrmUI { /// <summary> @@ -32,7 +21,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = false; grid.OptionsCustomization.AllowSort = true; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -72,7 +61,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = false; grid.OptionsCustomization.AllowSort = false; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -110,7 +99,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = true; grid.OptionsCustomization.AllowSort = true; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -155,7 +144,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = false; grid.OptionsCustomization.AllowSort = false; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -193,7 +182,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = true; grid.OptionsCustomization.AllowSort = true; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -224,7 +213,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = false; grid.OptionsCustomization.AllowSort = false; grid.OptionsCustomization.AllowQuickHideColumns = false; @@ -496,7 +485,7 @@ grid.OptionsSelection.EnableAppearanceFocusedCell = false; grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; - grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus; + grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus; grid.OptionsCustomization.AllowFilter = true; grid.OptionsCustomization.AllowSort = true; grid.OptionsCustomization.AllowQuickHideColumns = false; diff --git "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" index a9afb76..462a449 100644 --- "a/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" +++ "b/02-desktop/WinFrmUI/IStation.WinFrmUI.Core/UICore/\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" @@ -39,7 +39,7 @@ rhs.OptionsBehavior.ReadOnly = true; rhs.OptionsSelection.EnableAppearanceFocusedCell = false; rhs.OptionsMenu.EnableNodeMenu = false; - rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None; + rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None; rhs.OptionsSelection.SelectNodesOnRightClick = true; rhs.ViewStyle = TreeListViewStyle.TreeView; rhs.RowHeight = height; @@ -69,7 +69,7 @@ { rhs.OptionsSelection.EnableAppearanceFocusedCell = false; rhs.OptionsMenu.EnableNodeMenu = false; - rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None; + rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None; rhs.OptionsSelection.SelectNodesOnRightClick = true; rhs.OptionsMenu.EnableColumnMenu = false; rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; @@ -88,7 +88,7 @@ rhs.OptionsBehavior.ReadOnly = true; rhs.OptionsSelection.EnableAppearanceFocusedCell = false; rhs.OptionsMenu.EnableNodeMenu = false; - rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None; + rhs.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None; rhs.OptionsSelection.SelectNodesOnRightClick = true; rhs.OptionsMenu.EnableColumnMenu = false; rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs index cd82b44..e8d5d33 100644 --- a/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Curve/Import/Excel/ImportCurveByExcelCtrl.cs @@ -1,4 +1,5 @@ -锘縰sing DevExpress.Utils; +锘縰sing DevExpress.CodeParser; +using DevExpress.Utils; using DevExpress.XtraEditors; using DevExpress.XtraGrid.Views.Grid; using NPOI.HSSF.UserModel; @@ -304,14 +305,18 @@ else power = -1; - if (eta > 0) + if (eta > 0&& power<0.1) { power = Model.CurveCalcuHelper.CalculateP(q, h, eta); } - else + else if (eta<1&&power>0.1) { eta = Model.CurveCalcuHelper.CalculateE(q, h, power); } + //else + //{ + // eta = Model.CurveCalcuHelper.CalculateE(q, h, power); + //} if (eta > 99) { diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs new file mode 100644 index 0000000..9650e18 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisParameter.cs @@ -0,0 +1,90 @@ +锘縩amespace IStation.Entity +{ + /// <summary> + /// 鍒嗘瀽鍙傛暟 + /// </summary> + public class AnalysisParameter : BaseEntity, System.ICloneable + { + /// <summary> + /// + /// </summary> + public AnalysisParameter() { } + + /// <summary> + /// + /// </summary> + public AnalysisParameter(AnalysisParameter rhs) + { + this.ID = rhs.ID; + this.PumpID = rhs.PumpID; + this.Hz = rhs.Hz; + this.Head = rhs.Head; + this.PressureDiff = rhs.PressureDiff; + this.Flow = rhs.Flow; + this.Power = rhs.Power; + this.Eff = rhs.Eff; + this.WP = rhs.WP; + this.UWP = rhs.UWP; + } + + /// <summary> + /// 娉垫爣璇� + /// </summary> + public long PumpID { get; set; } + + /// <summary> + /// 棰戠巼 + /// </summary> + public double Hz { get; set; } + + /// <summary> + /// 鎵▼ + /// </summary> + public double Head { get; set; } + + /// <summary> + /// 鍘嬪樊 + /// </summary> + public double PressureDiff { get; set; } + + /// <summary> + /// 鎬绘祦閲� + /// </summary> + public double Flow { get; set; } + + /// <summary> + /// 鎬诲姛鐜� + /// </summary> + public double Power { get; set; } + + /// <summary> + /// 鎬诲姛鐜� + /// </summary> + public double Eff { get; set; } + + /// <summary> + /// 鍗冨惃姘磋兘鑰� + /// </summary> + public double WP { get; set; } + + /// <summary> + /// 鍗曚綅鑳借�� + /// </summary> + public double UWP { get; set; } + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public AnalysisParameter Clone() + { + return (AnalysisParameter)this.MemberwiseClone(); + } + + object ICloneable.Clone() + { + return this.MemberwiseClone(); + } + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs new file mode 100644 index 0000000..d48d7b2 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/01-entity/01-analysis/AnalysisPump.cs @@ -0,0 +1,93 @@ +锘縩amespace IStation.Entity +{ + /// <summary> + /// 鍒嗘瀽娉� + /// </summary> + public class AnalysisPump : BaseEntity, System.ICloneable + { + /// <summary> + /// + /// </summary> + public AnalysisPump() + { + + } + + /// <summary> + /// + /// </summary> + public AnalysisPump(AnalysisPump rhs) + { + this.ID = rhs.ID; + this.Flag = rhs.Flag; + this.Hz = rhs.Hz; + this.CurveQH = rhs.CurveQH; + this.CurveQP = rhs.CurveQP; + this.CurveQE = rhs.CurveQE; + this.MinFlow = rhs.MinFlow; + this.MaxFlow = rhs.MaxFlow; + this.MaxHead = rhs.MaxHead; + this.MinHead = rhs.MinHead; + } + + /// <summary> + /// 鏍囧織 + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// 棰戠巼 + /// </summary> + public double Hz { get; set; } + + /// <summary> + /// 娴侀噺鎵▼绾� + /// </summary> + public string CurveQH { get; set; } + + /// <summary> + /// 娴侀噺鍔熺巼绾� + /// </summary> + public string CurveQP { get; set; } + + /// <summary> + /// 娴侀噺鏁堢巼绾� + /// </summary> + public string CurveQE { get; set; } + + /// <summary> + /// 鏈�澶ф祦閲� + /// </summary> + public double MaxFlow { get; set; } + + /// <summary> + /// 鏈�灏忔祦閲� + /// </summary> + public double MinFlow { get; set; } + + /// <summary> + /// 鏈�澶ф壃绋� + /// </summary> + public double MaxHead { get; set; } + + /// <summary> + /// 鏈�灏忔壃绋� + /// </summary> + public double MinHead { get; set; } + + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public AnalysisPump Clone() + { + return (AnalysisPump)this.MemberwiseClone(); + } + + object ICloneable.Clone() + { + return this.MemberwiseClone(); + } + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs new file mode 100644 index 0000000..46e0db7 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/FrequencyLimit.cs @@ -0,0 +1,69 @@ +锘縩amespace IStation.Model +{ + /// <summary> + /// 棰戠巼闄愬埗 + /// </summary> + public class FrequencyLimit : System.ICloneable + { + /// <summary> + /// + /// </summary> + public FrequencyLimit() { } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public FrequencyLimit(FrequencyLimit rhs) + { + this.Flag = rhs.Flag; + this.Min = rhs.Min; + this.Max = rhs.Max; + } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public void Reset(FrequencyLimit rhs) + { + this.Flag = rhs.Flag; + this.Min = rhs.Min; + this.Max = rhs.Max; + } + + + /// <summary> + /// 杩愯鏍囧織 + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// 鏈�灏� + /// </summary> + public double Min { get; set; } + + /// <summary> + /// 鏈�澶� + /// </summary> + public double Max { get; set; } + + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public FrequencyLimit Clone() + { + return (FrequencyLimit)this.MemberwiseClone(); + } + + object ICloneable.Clone() + { + return this.MemberwiseClone(); + } + } + + + +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs new file mode 100644 index 0000000..f5c98f3 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/ScheduleConfig.cs @@ -0,0 +1,125 @@ +锘縰sing System.Dynamic; + +namespace IStation.Model +{ + /// <summary> + /// 璋冨害閰嶇疆 + /// </summary> + public class ScheduleConfig : System.ICloneable + { + /// <summary> + /// + /// </summary> + public ScheduleConfig() { } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public ScheduleConfig(ScheduleConfig rhs) + { + this.MinOpenCount = rhs.MinOpenCount; + this.MaxOpenCount = rhs.MaxOpenCount; + this.MustOpenFlagList = rhs.MustOpenFlagList?.ToList(); + this.MustCloseFlagList = rhs.MustCloseFlagList?.ToList(); + this.ForbiddenFlagCombineList = rhs.ForbiddenFlagCombineList?.ToList(); + this.AssociativeFlagCombineList = rhs.AssociativeFlagCombineList?.ToList(); + this.SameSectionFlagCombineList = rhs.SameSectionFlagCombineList?.ToList(); + this.WaterSupplyLimitList = rhs.WaterSupplyLimitList?.ToList(); + this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); + this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList(); + this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList(); + } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public void Reset(ScheduleConfig rhs) + { + this.MinOpenCount = rhs.MinOpenCount; + this.MaxOpenCount = rhs.MaxOpenCount; + this.MustOpenFlagList = rhs.MustOpenFlagList?.ToList(); + this.MustCloseFlagList = rhs.MustCloseFlagList?.ToList(); + this.ForbiddenFlagCombineList = rhs.ForbiddenFlagCombineList?.ToList(); + this.AssociativeFlagCombineList = rhs.AssociativeFlagCombineList?.ToList(); + this.SameSectionFlagCombineList = rhs.SameSectionFlagCombineList?.ToList(); + this.WaterSupplyLimitList = rhs.WaterSupplyLimitList?.ToList(); + this.FrequencyLimitList = rhs.FrequencyLimitList?.ToList(); + this.PriorityOpenFlagList = rhs.PriorityOpenFlagList?.ToList(); + this.MaintenanceFlagList=rhs.MaintenanceFlagList?.ToList(); + } + + + /// <summary> + /// 鏈�灏忓紑娉垫暟閲� + /// </summary> + public int MinOpenCount { get; set; } + + /// <summary> + /// 鏈�澶у紑娉垫暟閲� + /// </summary> + public int MaxOpenCount { get; set; } + + /// <summary> + /// 蹇呭紑娉靛垪琛� + /// </summary> + public List<int> MustOpenFlagList { get; set; } + + /// <summary> + /// 蹇呭叧娉靛垪琛� + /// </summary> + public List<int> MustCloseFlagList { get; set; } + + /// <summary> + /// 绂佺敤娉电粍鍚堝垪琛� + /// </summary> + public List<List<int>> ForbiddenFlagCombineList { get; set; } + + /// <summary> + /// 鍏宠仈娉电粍鍚堝垪琛� + /// </summary> + public List<List<int>> AssociativeFlagCombineList { get; set; } + + /// <summary> + /// 鍚屾娉电粍鍚堝垪琛� + /// </summary> + public List<List<int>> SameSectionFlagCombineList { get; set; } + + /// <summary> + /// 渚涙按闄愬埗鍒楄〃 + /// </summary> + public List<WaterSupplyLimit> WaterSupplyLimitList { get; set; } + + /// <summary> + /// 棰戠巼闄愬埗鍒楄〃 + /// </summary> + public List<FrequencyLimit> FrequencyLimitList { get; set; } + + + /// <summary> + /// 浼樺厛寮�娉靛垪琛� + /// </summary> + public List<int> PriorityOpenFlagList { get; set; } + + /// <summary> + /// 妫�淇垪琛� + /// </summary> + public List<int> MaintenanceFlagList { get; set; } + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public ScheduleConfig Clone() + { + return (ScheduleConfig)this.MemberwiseClone(); + } + + object ICloneable.Clone() + { + return this.MemberwiseClone(); + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs new file mode 100644 index 0000000..3f4f386 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/02-model/00-basic/02-config/WaterSupplyLimit.cs @@ -0,0 +1,69 @@ +锘縩amespace IStation.Model +{ + /// <summary> + /// 渚涙按闄愬埗 + /// </summary> + public class WaterSupplyLimit : System.ICloneable + { + /// <summary> + /// + /// </summary> + public WaterSupplyLimit() { } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public WaterSupplyLimit(WaterSupplyLimit rhs) + { + this.PumpCount = rhs.PumpCount; + this.Min = rhs.Min; + this.Max = rhs.Max; + } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public void Reset(WaterSupplyLimit rhs) + { + this.PumpCount = rhs.PumpCount; + this.Min = rhs.Min; + this.Max = rhs.Max; + } + + + /// <summary> + /// 娉垫暟閲� + /// </summary> + public int PumpCount { get; set; } + + /// <summary> + /// 鏈�灏� + /// </summary> + public double Min { get; set; } + + /// <summary> + /// 鏈�澶� + /// </summary> + public double Max { get; set; } + + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public WaterSupplyLimit Clone() + { + return (WaterSupplyLimit)this.MemberwiseClone(); + } + + object ICloneable.Clone() + { + return this.MemberwiseClone(); + } + } + + + +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs new file mode 100644 index 0000000..aa85856 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisParameter.cs @@ -0,0 +1,184 @@ +锘縰sing SqlSugar; + +namespace IStation.DAL.SQLite +{ + /// <summary> + /// + /// </summary> + public partial class AnalysisParameter : DAL.BaseDAL<Entity.AnalysisParameter> + { + /// <summary> + /// + /// </summary> + public override ConnectionConfig ConnectionConfig + { + get { return ConfigHelper.AnalysisConnectionConfig; } + + } + + /// <summary> + /// + /// </summary> + private string TableNamePrefix + { + get { return "AnalysisParameter_"; } + } + + /// <summary> + /// + /// </summary> + /// <param name="runFlag"></param> + /// <returns></returns> + public string GetTableName(string runFlag) + { + return $"{this.TableNamePrefix}{runFlag}"; + } + + /// <summary> + /// + /// </summary> + /// <param name="tableName"></param> + /// <returns></returns> + private string GetCreateTableSql(string tableName) + { + var sql = $"CREATE TABLE {tableName} (ID BIGINT NOT NULL\r\n PRIMARY KEY,\r\n PumpID BIGINT,\r\n Hz REAL,\r\n Head REAL,\r\n PressureDiff REAL,\r\n Flow REAL,\r\n Power REAL,\r\n Eff REAL,\r\n WP REAL,\r\n UWP REAL\r\n);"; + return sql; + } + + /// <summary> + /// + /// </summary> + /// <param name="tableName"></param> + /// <returns></returns> + private string GetExistTableSql(string tableName) + { + var sql = $"select count(*) from sqlite_master where type = 'table' and name = '{tableName}';"; + return sql; + } + + + /// <summary> + /// 鑾峰彇鍏ㄩ儴琛ㄥ悕 + /// </summary> + public List<string> GetAllTableName() + { + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var list = new List<string>(); + var sql = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';"; + using (var reader = db.Ado.GetDataReader(sql)) + { + while (reader.Read()) + { + var tableName = reader["name"].ToString(); + list.Add(tableName); + } + } + return list; + } + } + + /// <summary> + /// 鑾峰彇鍏ㄩ儴琛� + /// </summary> + public Dictionary<string, List<Entity.AnalysisParameter>> GetAllTable() + { + var tableNames = GetAllTableName(); + if (tableNames == null || !tableNames.Any()) + return default; + + var dict = new Dictionary<string, List<Entity.AnalysisParameter>>(); + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + foreach (var tableName in tableNames) + { + var sql = $"select * from {tableName}"; + var list = db.Queryable<Entity.AnalysisParameter>().AS(tableName).ToList(); + if (list == null || !list.Any()) + continue; + dict.Add(tableName, list); + } + return dict; + } + } + + + /// <summary> + /// 澶ф壒閲忔彃鍏�(琛ㄤ笉瀛樺湪灏辨柊寤�) + /// </summary> + public bool BulkInsertsEx(string runFlag, List<Entity.AnalysisParameter> list) + { + if (list == null || list.Count < 1) + return default; + var tableName = GetTableName(runFlag); + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var exist_sql = GetExistTableSql(tableName); + if (db.Ado.GetInt(exist_sql) < 1) + { + var sql_create_table = GetCreateTableSql(tableName); + db.Ado.ExecuteCommand(sql_create_table); + } + //澶ф暟鎹啓鍏� + return db.Fastest<Entity.AnalysisParameter>().AS(tableName).BulkCopy(list) > 0; + } + } + + /// <summary> + /// 鍒ゆ柇鏁版嵁搴撴槸鍚﹀瓨鍦ㄨ〃 + /// </summary> + public bool ExistTable(string runFlag) + { + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var tableName = GetTableName(runFlag); + var sql = GetExistTableSql(tableName); + var bol = db.Ado.ExecuteCommand(sql) > 0; + return bol; + } + } + + /// <summary> + /// 鍒犻櫎鎵�鏈夎〃 + /// </summary> + public bool DeleteAllTable() + { + var tables = GetAllTableName(); + if (tables == null || !tables.Any()) + return false; + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + db.BeginTran(); + foreach (var table in tables) + { + var sql = $"drop table {table};"; + db.Ado.ExecuteCommand(sql); + } + db.CommitTran(); + } + return true; + } + + + /// <summary> + /// 鏌ヨ + /// </summary> + public List<Entity.AnalysisParameter> GetList(string runFlag, double targetHead) + { + var tableName = GetTableName(runFlag); + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var sql = GetExistTableSql(tableName); + if (db.Ado.GetInt(sql) < 1) + { + return default; + } + var list = db.Queryable<Entity.AnalysisParameter>().AS(tableName) + .Where(x => x.Head == targetHead) + .OrderBy(x => x.Power) + .ToList(); + return list; + } + } + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs new file mode 100644 index 0000000..77e7500 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/01-analysis/AnalysisPump.cs @@ -0,0 +1,212 @@ +锘縰sing SqlSugar; + +namespace IStation.DAL.SQLite +{ + /// <summary> + /// + /// </summary> + public partial class AnalysisPump : DAL.BaseDAL<Entity.AnalysisPump> + { + /// <summary> + /// + /// </summary> + public override ConnectionConfig ConnectionConfig + { + get { return ConfigHelper.AnalysisConnectionConfig; } + } + + /// <summary> + /// + /// </summary> + private string TableNamePrefix + { + get { return "AnalysisPump_"; } + } + + /// <summary> + /// + /// </summary> + /// <param name="runFlag"></param> + /// <returns></returns> + public string GetTableName(string runFlag) + { + return $"{this.TableNamePrefix}{runFlag}"; + } + + /// <summary> + /// + /// </summary> + /// <param name="tableName"></param> + /// <returns></returns> + private string GetCreateTableSql(string tableName) + { + var sql = $"CREATE TABLE {tableName} (ID BIGINT NOT NULL\r\n PRIMARY KEY,\r\n Flag INTEGER,\r\n Hz REAL,\r\n CurveQH VARCHAR (255),\r\n CurveQP VARCHAR (255),\r\n CurveQE VARCHAR (255),\r\n MaxFlow REAL,\r\n MinFlow REAL,\r\n MaxHead REAL,\r\n MinHead REAL\r\n);"; + return sql; + } + + /// <summary> + /// + /// </summary> + /// <param name="tableName"></param> + /// <returns></returns> + private string GetExistTableSql(string tableName) + { + var sql = $"select count(*) from sqlite_master where type = 'table' and name = '{tableName}';"; + return sql; + } + + /// <summary> + /// + /// </summary> + /// <param name="tableName"></param> + /// <returns></returns> + public string GetRunFlag(string tableName) + { + return tableName.Replace(this.TableNamePrefix, null); + } + + /// <summary> + /// 鑾峰彇鍏ㄩ儴琛ㄥ悕 + /// </summary> + public List<string> GetAllTableName() + { + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var list = new List<string>(); + var sql = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';"; + using (var reader = db.Ado.GetDataReader(sql)) + { + while (reader.Read()) + { + var tableName = reader["name"].ToString(); + list.Add(tableName); + } + } + return list; + } + } + + + + /// <summary> + /// 鑾峰彇鍏ㄩ儴琛� + /// </summary> + public Dictionary<string, List<Entity.AnalysisPump>> GetAllTable() + { + //using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + //{ + // var tableNames = new List<string>(); + // var sql_sel_table = $"select name from sqlite_master where type='table' and name like '%{this.TableNamePrefix}%';"; + // var reader = db.Ado.GetDataReader(sql_sel_table); + // while (reader.Read()) + // { + // var tableName = reader["name"].ToString(); + // tableNames.Add(tableName); + // } + // if (tableNames == null || !tableNames.Any()) + // return default; + + // var dict = new Dictionary<string, List<Entity.AnalysisPump>>(); + // foreach (var tableName in tableNames) + // { + // var sql = $"select * from {tableName}"; + // var list = db.Ado.SqlQuery<Entity.AnalysisPump>(sql); + // if (list == null || !list.Any()) + // continue; + // dict.Add(tableName, list); + // } + // return dict; + //} + + var tableNames = GetAllTableName(); + if (tableNames == null || !tableNames.Any()) + return default; + + var dict = new Dictionary<string, List<Entity.AnalysisPump>>(); + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + foreach (var tableName in tableNames) + { + var sql = $"select * from {tableName}"; + var list = db.Queryable<Entity.AnalysisPump>().AS(tableName).ToList(); + if (list == null || !list.Any()) + continue; + dict.Add(tableName, list); + } + return dict; + } + } + + /// <summary> + /// 閫氳繃琛ㄥ悕鑾峰彇鍏ㄩ儴 + /// </summary> + public List<Entity.AnalysisPump> GetAllByTableName(string tableName) + { + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var sql = $"select * from {tableName}"; + var list = db.Ado.SqlQuery<Entity.AnalysisPump>(sql); + return list; + } + } + + /// <summary> + /// 澶ф壒閲忔彃鍏�(琛ㄤ笉瀛樺湪灏辨柊寤�) + /// </summary> + public bool BulkInsertsEx(string runFlag, List<Entity.AnalysisPump> list) + { + if (list == null || list.Count < 1) + return default; + var tableName = GetTableName(runFlag); + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var exist_sql = GetExistTableSql(tableName); + if (db.Ado.GetInt(exist_sql) < 1) + { + var sql_create_table = GetCreateTableSql(tableName); + db.Ado.ExecuteCommand(sql_create_table); + } + //澶ф暟鎹啓鍏� + return db.Fastest<Entity.AnalysisPump>().AS(tableName).BulkCopy(list) > 0; + } + } + + + + /// <summary> + /// 鍒ゆ柇鏁版嵁搴撴槸鍚﹀瓨鍦ㄨ〃 + /// </summary> + public bool ExistTable(string runFlag) + { + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + var tableName = GetTableName(runFlag); + var sql = GetExistTableSql(tableName); + var bol = db.Ado.ExecuteCommand(sql) > 0; + return bol; + } + } + + /// <summary> + /// 鍒犻櫎鎵�鏈夎〃 + /// </summary> + public bool DeleteAllTable() + { + var tables = GetAllTableName(); + if (tables == null || !tables.Any()) + return false; + using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig)) + { + db.BeginTran(); + foreach (var table in tables) + { + var sql = $"drop table {table};"; + db.Ado.ExecuteCommand(sql); + } + db.CommitTran(); + } + return true; + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs new file mode 100644 index 0000000..e0483a7 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/04-dal/ConfigHelper.cs @@ -0,0 +1,71 @@ +锘縰sing System.Data.SQLite; + +namespace IStation +{ + /// <summary> + /// + /// </summary> + public class ConfigHelper + { + public static string AnalysisDbFilePath { get => $"{IStation.DAL.FileHelper.GetProjectFolder(SettingsD.Project.ID)}\\analysis.db"; } + + private static ConnectionConfig GetConnectionConfig(string filePath) + { + + if (!System.IO.File.Exists(filePath)) + { + try + { + SQLiteConnection.CreateFile(filePath); + } + catch (Exception ex) + { + var errMsg = $" 鏂囦欢涓嶅瓨鍦�!Path:{filePath}\r\n{ex.Message}"; + //LogHelper.Debug(errMsg); + throw new Exception(errMsg); + } + } + + var config = new ConnectionConfig(); + config.ConnectionString = $"DataSource={filePath}"; + config.IsAutoCloseConnection = true; + config.DbType = SqlSugar.DbType.Sqlite; + config.ConfigureExternalServices = new ConfigureExternalServices() + { + EntityService = (property, column) => + { + //闄や富閿閮藉彲绌� + if (!column.IsPrimarykey) + { + column.IsNullable = true; + } + } + }; + + return config; + } + + + #region SQLite-ConnectionConfig + + + /// <summary> + /// Analysis SQLite杩炴帴閰嶇疆 + /// </summary> + internal static ConnectionConfig AnalysisConnectionConfig + { + get + { + return GetConnectionConfig(AnalysisDbFilePath); + } + } + + + + + #endregion + + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs new file mode 100644 index 0000000..b5003af --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheHelper.cs @@ -0,0 +1,57 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 缂撳瓨杈呭姪绫� + /// </summary> + public class CacheHelper<T> + { + #region Default + + // 鏌ヨ缂撳瓨閿� + private static string GetCacheKey() + { + var t = typeof(T); + return CacheKeyHelper.GetCacheKey(t.Name); + } + + /// <summary> + /// 璁剧疆缂撳瓨 + /// </summary> + public static void Set(List<T> list, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 鏌ヨ缂撳瓨 + /// </summary> + public static List<T> Get() + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.Get<List<T>>(cacheKey); + } + + /// <summary> + /// 鏌ヨ璁剧疆缂撳瓨 + /// </summary> + public static List<T> GetSet(Func<List<T>> func, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 绉婚櫎缂撳瓨 + /// </summary> + public static void Remove() + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Remove(cacheKey); + } + + + + #endregion + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs new file mode 100644 index 0000000..45ba3b2 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/CacheKeyHelper.cs @@ -0,0 +1,27 @@ +锘縩amespace IStation.Service +{ + internal class CacheKeyHelper + { + private const string _cacheKeyPrefix = "*Default_Basic_Prefix*";//缂撳瓨閿墠缂� + + /// <summary> + /// 鏌ヨ缂撳瓨閿� + /// </summary> + public static string GetCacheKey(string keyContent) + { + return string.Format("{0}_{1}", _cacheKeyPrefix, keyContent); + } + + /// <summary> + /// 娓呴櫎鍏ㄩ儴 + /// </summary> + public static void Clear() + { + MemoryCacheHelper.Remove((key) => + { + return key.StartsWith(_cacheKeyPrefix); + }); + } + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs new file mode 100644 index 0000000..725ecbb --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/00-core/ConfigHelper.cs @@ -0,0 +1,42 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 閰嶇疆杈呭姪绫� + /// </summary> + public class ConfigHelper + { + /// <summary> + /// 缂撳瓨淇濇寔鏃堕棿 锛堝垎閽燂級 + /// </summary> + public static int CacheKeepTime + { + get + { + return 30; + } + } + + /// <summary> + /// 缂撳瓨闅忔満鏃堕棿 锛堢锛� + /// </summary> + public static int CacheRandomTime + { + get + { + return Random(0, 60); + } + } + + + /// <summary> + /// 闅忔満鐢熸垚鏁存暟 + /// </summary> + public static int Random(int Min, int Max) + { + if (Min > Max) + return Min; + var rad = new Random(); + return rad.Next(Min, Max + 1); + } + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs new file mode 100644 index 0000000..7bf54ef --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter.cs @@ -0,0 +1,208 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// + /// </summary> + public partial class AnalysisParameter + { + /// <summary> + /// + /// </summary> + /// <returns></returns> + public static Dictionary<string, List<Entity.AnalysisParameter>> GetDictCache() + { + return AnalysisParameterCacheHelper.GetSet(() => + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var entity_dict = dal.GetAllTable(); + if (entity_dict == null || !entity_dict.Any()) + { + return new Dictionary<string, List<Entity.AnalysisParameter>>(); + } + + var model_dict = new Dictionary<string, List<Entity.AnalysisParameter>>(); + for (int i = 0; i < entity_dict.Count; i++) + { + var entity_item = entity_dict.ElementAt(i); + model_dict[entity_item.Key] = Entity2Models(entity_item.Value); + } + return model_dict; + }, ConfigHelper.CacheKeepTime, ConfigHelper.CacheRandomTime); + } + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public static void RemoveDictCache() + { + AnalysisParameterCacheHelper.Remove(); + } + + + + /// <summary> + /// 鏌ヨ + /// </summary> + public List<Entity.AnalysisParameter> GetList(string run_flag) + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var tableName = dal.GetTableName(run_flag); + var dict = GetDictCache(); + if (!dict.ContainsKey(tableName)) + return default; + + return dict[tableName]?.OrderBy(x => x.Power).ToList(); + } + + ///// <summary> + ///// 鏌ヨ + ///// </summary> + //public List<Entity.AnalysisParameter> GetPressureDiffList(string run_flag, double pressure_diff) + //{ + // var dal = new IStation.DAL.SQLite.AnalysisParameter(); + // var tableName = dal.GetTableName(run_flag); + // var dict = GetDictCache(); + // if (!dict.ContainsKey(tableName)) + // return default; + + // for (int i = 0; i < 3; i++) + // { + // pressure_diff += i * 0.1; + // var list = dict[tableName]? + // .Where(x => x.PressureDiff == pressure_diff) + // .OrderBy(x => x.Power) + // .ToList(); + // if (list != null && list.Any()) + // { + // return list; + // } + // } + + // return null; + //} + + /// <summary> + /// 鏌ヨ + /// </summary> + public List<Entity.AnalysisParameter> GetHeadList(string run_flag, double head) + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var tableName = dal.GetTableName(run_flag); + var dict = GetDictCache(); + if (!dict.ContainsKey(tableName)) + return default; + + for (int i = 0; i < 3; i++) + { + head += i * 0.1; + var list = dict[tableName]? + .Where(x => x.Head == head) + .OrderBy(x => x.Power) + .ToList(); + if (list != null && list.Any()) + { + return list; + } + } + + return null; + } + + ///// <summary> + ///// 鏌ヨ + ///// </summary> + //public List<Entity.AnalysisParameter> GetPressureDiffList(string run_flag, double min_hz, double max_hz, double pressure_diff) + //{ + // var dal = new IStation.DAL.SQLite.AnalysisParameter(); + // var tableName = dal.GetTableName(run_flag); + // var dict = GetDictCache(); + // if (!dict.ContainsKey(tableName)) + // return default; + + + // for (int i = 0; i < 3; i++) + // { + // pressure_diff += i * 0.1; + // var list = dict[tableName]? + // .Where(x => x.Hz >= min_hz && x.Hz <= max_hz && x.PressureDiff == pressure_diff) + // .OrderBy(x => x.Power) + // .ToList(); + // if (list == null || !list.Any()) + // { + + // } + // if (list != null && list.Any()) + // { + // return list; + // } + // } + + + // return null; + //} + + + + /// <summary> + /// 鏌ヨ + /// </summary> + public List<Entity.AnalysisParameter> GetHeadList(string run_flag, double min_hz, double max_hz, double head) + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var tableName = dal.GetTableName(run_flag); + var dict = GetDictCache(); + if (!dict.ContainsKey(tableName)) + return default; + + + for (int i = 0; i < 3; i++) + { + head += i * 0.1; + var list = dict[tableName]? + .Where(x => x.Hz >= min_hz && x.Hz <= max_hz && x.Head == head) + .OrderBy(x => x.Power) + .ToList(); + if (list == null || !list.Any()) + { + + } + if (list != null && list.Any()) + { + return list; + } + } + + + return null; + } + + + /// <summary> + /// 鏌ヨ + /// </summary> + public Entity.AnalysisParameter GetMinPressureDiff(string run_flag) + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var tableName = dal.GetTableName(run_flag); + var dict = GetDictCache(); + if (!dict.ContainsKey(tableName)) + return default; + return dict[tableName]?.OrderBy(x => x.PressureDiff).FirstOrDefault(); + } + + /// <summary> + /// 鏌ヨ + /// </summary> + public Entity.AnalysisParameter GetMinHead(string run_flag) + { + var dal = new IStation.DAL.SQLite.AnalysisParameter(); + var tableName = dal.GetTableName(run_flag); + var dict = GetDictCache(); + if (!dict.ContainsKey(tableName)) + return default; + return dict[tableName]?.OrderBy(x => x.Head).FirstOrDefault(); + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs new file mode 100644 index 0000000..d2c7a73 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameterCacheHelper.cs @@ -0,0 +1,53 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 缂撳瓨杈呭姪绫� + /// </summary> + public class AnalysisParameterCacheHelper + { + private const string _contentKey = "AnalysisParameterDictKey"; + + // 鏌ヨ缂撳瓨閿� + private static string GetCacheKey() + { + return CacheKeyHelper.GetCacheKey(_contentKey); + } + + /// <summary> + /// 璁剧疆缂撳瓨 + /// </summary> + public static void Set(Dictionary<string, List<Entity.AnalysisParameter>> list, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 鏌ヨ缂撳瓨 + /// </summary> + public static Dictionary<string, List<Entity.AnalysisParameter>> Get() + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.Get<Dictionary<string, List<Entity.AnalysisParameter>>>(cacheKey); + } + + /// <summary> + /// 鏌ヨ璁剧疆缂撳瓨 + /// </summary> + public static Dictionary<string, List<Entity.AnalysisParameter>> GetSet(Func<Dictionary<string, List<Entity.AnalysisParameter>>> func, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 绉婚櫎缂撳瓨 + /// </summary> + public static void Remove() + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Remove(cacheKey); + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs new file mode 100644 index 0000000..adc7c20 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisParameter_Instance.cs @@ -0,0 +1,65 @@ +锘縰sing AutoMapper; + +namespace IStation.Service +{ + public partial class AnalysisParameter + { + + //Entity to GetModel + private static Entity.AnalysisParameter Entity2Model(Entity.AnalysisParameter entity) + { + if (entity == null) + return default; + var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>()) + .CreateMapper(); + var model = mapper.Map<Entity.AnalysisParameter, Entity.AnalysisParameter>(entity); + return model; + } + + //Entities to GetModels + private static List<Entity.AnalysisParameter> Entity2Models(List<Entity.AnalysisParameter> entities) + { + if (entities == null || entities.Count() < 1) + return default; + var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>()) + .CreateMapper(); + var models = mapper.Map<List<Entity.AnalysisParameter>, List<Entity.AnalysisParameter>>(entities); + return models; + } + + //Model to Entity + private static Entity.AnalysisParameter Model2Entity(Entity.AnalysisParameter model) + { + if (model == null) + return default; + var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>() + ).CreateMapper(); + var entity = mapper.Map<Entity.AnalysisParameter, Entity.AnalysisParameter>(model); + return entity; + } + + //Models to Entities + private static List<Entity.AnalysisParameter> Model2Entities(List<Entity.AnalysisParameter> models) + { + if (models == null || models.Count < 1) + return default; + var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>() + ).CreateMapper(); + var entities = mapper.Map<List<Entity.AnalysisParameter>, List<Entity.AnalysisParameter>>(models); + return entities; + } + + //Model to Entity + private static void Model2Entity(Entity.AnalysisParameter model, Entity.AnalysisParameter entity) + { + if (model == null || entity == null) + return; + var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.AnalysisParameter, Entity.AnalysisParameter>() + ).CreateMapper(); + mapper.Map(model, entity); + } + + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs new file mode 100644 index 0000000..9b894ca --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPump.cs @@ -0,0 +1,35 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// + /// </summary> + public partial class AnalysisPump + { + + /// <summary> + /// + /// </summary> + /// <returns></returns> + public static Dictionary<string, List<Entity.AnalysisPump>> GetDictCache() + { + return AnalysisPumpCacheHelper.GetSet(() => + { + var dal = new IStation.DAL.SQLite. AnalysisPump(); + var entity_dict = dal.GetAllTable(); + if (entity_dict == null || !entity_dict.Any()) + { + return new Dictionary<string, List<Entity.AnalysisPump>>(); + } + + var model_dict = new Dictionary<string, List<Entity.AnalysisPump>>(); + for (int i = 0; i < entity_dict.Count; i++) + { + var entity_item = entity_dict.ElementAt(i); + model_dict[entity_item.Key] = entity_item.Value; + } + return model_dict; + }, ConfigHelper.CacheKeepTime, ConfigHelper.CacheRandomTime); + } + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs new file mode 100644 index 0000000..2dadcd4 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/01-analysis/AnalysisPumpCacheHelper.cs @@ -0,0 +1,53 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 缂撳瓨杈呭姪绫� + /// </summary> + public class AnalysisPumpCacheHelper + { + private const string _contentKey = "AnalysisPumpDictKey"; + + // 鏌ヨ缂撳瓨閿� + private static string GetCacheKey() + { + return CacheKeyHelper.GetCacheKey(_contentKey); + } + + /// <summary> + /// 璁剧疆缂撳瓨 + /// </summary> + public static void Set(Dictionary<string, List<Entity.AnalysisPump>> list, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Set(cacheKey, list, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 鏌ヨ缂撳瓨 + /// </summary> + public static Dictionary<string, List<Entity.AnalysisPump>> Get() + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.Get<Dictionary<string, List<Entity.AnalysisPump>>>(cacheKey); + } + + /// <summary> + /// 鏌ヨ璁剧疆缂撳瓨 + /// </summary> + public static Dictionary<string, List<Entity.AnalysisPump>> GetSet(Func<Dictionary<string, List<Entity.AnalysisPump>>> func, int minutes = 30, int randomSeconds = 0) + { + var cacheKey = GetCacheKey(); + return MemoryCacheHelper.GetSet(cacheKey, func, minutes * 60 + randomSeconds); + } + + /// <summary> + /// 绉婚櫎缂撳瓨 + /// </summary> + public static void Remove() + { + var cacheKey = GetCacheKey(); + MemoryCacheHelper.Remove(cacheKey); + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs new file mode 100644 index 0000000..3fa9375 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/05-service/RunFlagHelper.cs @@ -0,0 +1,20 @@ +锘縩amespace IStation +{ + /// <summary> + /// 杩愯鏍囪瘑杈呭姪绫� + /// </summary> + public class RunFlagHelper + { + /// <summary> + /// 鑾峰彇 + /// </summary> + /// <param name="flag">鏍囧織</param> + /// <param name="is_bp">鏄惁鍙橀</param> + /// <returns></returns> + public static string Get(int flag, bool is_bp) + { + return (is_bp ? "B" : "G") + flag; + } + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs new file mode 100644 index 0000000..00331a9 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper.cs @@ -0,0 +1,291 @@ +锘縰sing IStation.Model; +using System.Diagnostics; + +namespace IStation.Service +{ + /// <summary> + /// 璋冨害鍒嗘瀽杈呭姪绫� + /// </summary> + public partial class AnalysisHelper + { + private readonly decimal _frequency_def = 50m; + private readonly decimal _frequency_min = 25m; + private readonly decimal _frequency_max = 50m; + private readonly decimal _frequency_space = 0.1m;//棰戠巼闂撮殧 + private readonly decimal _head_space = 0.1m;//鎵▼闂撮殧 + + private readonly DAL.SQLite.AnalysisPump _dal_analysis_pump = new(); + private readonly DAL.SQLite.AnalysisParameter _dal_analysis_conclusion = new(); + + #region AnalysisPump + + /// <summary> + /// 鍒嗘瀽娉� + /// </summary> + /// <param name="pumps"></param> + /// <param name="analysis_factor_list"></param> + /// <exception cref="Exception"></exception> + public void AnalysisPump(List<Model.PumpModel> pumps) + { + if (pumps == null || pumps.Count < 1) + { + return; + } + var ana_pump_list = new List<AnaPump>(); + foreach (var pump in pumps) + { + var ana_pump = new AnaPump(pump); + if (!ana_pump.AllowCalc) + { + throw new Exception("鏇茬嚎鏁版嵁寮傚父!"); + } + var ana_pump_fre_item_list = new List<AnaPumpFreItem>(); + if (!pump.IsBp) + { + ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump); + } + else + { + ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump); + } + + ana_pump.AnaPumpFreItems = ana_pump_fre_item_list; + ana_pump_list.Add(ana_pump); + } + + if (!ana_pump_list.Any()) + { + return; + } + for (int i = 0; i < ana_pump_list.Count; i++) + { + var pump = ana_pump_list[i]; + var ana_pump_fre_items = pump.AnaPumpFreItems; + if (ana_pump_fre_items == null || !ana_pump_fre_items.Any()) + continue; + + var run_flag = Get(pump.Flag, pump.IsBp); + + var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count); + foreach (var freItem in ana_pump_fre_items) + { + if (freItem.Frequency==47.6) + { + + } + var analysis_pump = new Entity.AnalysisPump(); + analysis_pump.ID = SnowflakeIdHelper.NextId(); + analysis_pump.Flag = pump.Flag; + analysis_pump.Hz = freItem.Frequency; + analysis_pump.CurveQH = freItem.CurveQH.ToJson(); + analysis_pump.CurveQP = freItem.CurveQP.ToJson(); + analysis_pump.CurveQE = freItem.CurveQE.ToJson(); + + freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead); + analysis_pump.MinFlow = Math.Round(freItem.CurveQH.Min, 4); + analysis_pump.MaxFlow = Math.Round(freItem.CurveQH.Max, 4); + analysis_pump.MaxHead = Math.Round(maxHead, 4); + analysis_pump.MinHead = Math.Round(minHead, 4); + list.Add(analysis_pump); + } + Inserts(i + 1, run_flag, list); + } + + } + + + /// <summary> + /// 鑾峰彇鍒嗘瀽娉靛彉棰戦」 + /// </summary> + /// <param name="fre_def"></param> + /// <param name="fre_min"></param> + /// <param name="fre_max"></param> + /// <param name="fre_space"></param> + /// <param name="pump"></param> + /// <param name="hz_head_dev_dict"></param> + /// <returns></returns> + private static List<AnaPumpFreItem> GetAnaPumpFreItems( + decimal fre_def, + decimal fre_min, + decimal fre_max, + decimal fre_space, + Model.PumpModel pump) + { + if (pump == null) + { + return default; + } + if (pump.CurveQH == null || pump.CurveQP == null) + { + return default; + } + var list = new List<AnaPumpFreItem>(); + for (decimal fre = fre_max; fre >= fre_min; fre -= fre_space) + { + Model.CurveExpress qh = pump.CurveQH, qp = pump.CurveQP, qe = pump.CurveQE; + var freItem = new AnaPumpFreItem(); + freItem.Frequency = (double)fre; + freItem.CurveQH = CurveCalcuHelper.CalculateSimilarQH(qh, (double)fre_def, (double)fre); + freItem.CurveQP = CurveCalcuHelper.CalculateSimilarQP(qp, (double)fre_def, (double)fre); + freItem.CurveQE = CurveCalcuHelper.CalculateSimilarQE(qe, (double)fre_def, (double)fre); + list.Add(freItem); + } + + return list; + + } + + + + + #endregion + + #region AnalysisParameter + + /// <summary> + /// 鍒嗘瀽鍙傛暟 + /// </summary> + public void AnalysisParameter(List<Model.PumpModel> pumps) + { + if (pumps == null || pumps.Count < 1) + { + return; + } + + _dal_analysis_conclusion.DeleteAllTable(); + for (int pump_index = 0; pump_index < pumps.Count; pump_index++) + { + var pump = pumps[pump_index]; + var flag = pump.Flag; + var run_flag = Get(flag, pump.IsBp); + var table_name = _dal_analysis_pump.GetTableName(run_flag); + var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name); + if (analysis_pump_list == null || !analysis_pump_list.Any()) + { + continue; + } + + var analysis_pump_list_count = analysis_pump_list.Count(); + var analysis_conclusion_list = new List<List<Entity.AnalysisParameter>>(analysis_pump_list_count); + for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++) + { + var analysis_pump = analysis_pump_list[analysis_pump_index]; + var curveQH = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQH); + var curveQP = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQP); + var curveQE = JsonHelper.Json2Object<Model.CurveExpress>(analysis_pump.CurveQE); + var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY); + if (!bol) + throw new Exception("鏇茬嚎寮傚父"); + + decimal max_head = (decimal)Math.Ceiling(maxY); + decimal min_head = (decimal)Math.Floor(minY); + + var current_list_count = (int)((max_head - min_head) / _head_space) + 1; + var current_analysis_conclusion_list = new List<Entity.AnalysisParameter>(current_list_count); + for (decimal head = min_head; head <= max_head; head += _head_space) + { + if (head==20) + { + + } + var flow = curveQH.GetInterPointLastX((double)head) ?? 0; + if (flow < 1) + { + continue; + } + + double differV = 0; + if (pump.Oc != null) + { + //1杈撳拰2杈撻兘鏄敤鐨勮繘鍙f恫浣嶏紝涓嶈�冭檻杩涘彛鍙e緞 + differV = CurveCalcuHelper.CalculateOtherPress(flow, null, pump.Oc, null, null); + } + + var analysis_conclusion = new Entity.AnalysisParameter(); + analysis_conclusion.ID = SnowflakeIdHelper.NextId(); + analysis_conclusion.PumpID = analysis_pump.ID; + analysis_conclusion.Hz = analysis_pump.Hz; + analysis_conclusion.Head = (double)head; + analysis_conclusion.PressureDiff = (double)head - differV; + analysis_conclusion.Flow = flow; + analysis_conclusion.Power = curveQP.GetFitPointY(flow); + analysis_conclusion.Eff = curveQE.GetFitPointY(flow); + analysis_conclusion.UWP = CurveCalcuHelper.CalculateUWP(analysis_conclusion.Power, analysis_conclusion.Flow, analysis_conclusion.Head); + analysis_conclusion.WP = CurveCalcuHelper.CalculateWP(analysis_conclusion.Power, analysis_conclusion.Flow); + + + + int digits = 1; + analysis_conclusion.Hz = Math.Round(analysis_conclusion.Hz, digits); + analysis_conclusion.Head = Math.Round(analysis_conclusion.Head, digits); + analysis_conclusion.PressureDiff = Math.Round(analysis_conclusion.PressureDiff, digits); + analysis_conclusion.Flow = Math.Round(analysis_conclusion.Flow, digits); + analysis_conclusion.Power = Math.Round(analysis_conclusion.Power, digits); + analysis_conclusion.Eff = Math.Round(analysis_conclusion.Eff, digits); + analysis_conclusion.WP = Math.Round(analysis_conclusion.WP, digits); + analysis_conclusion.UWP = Math.Round(analysis_conclusion.UWP, digits); + current_analysis_conclusion_list.Add(analysis_conclusion); + } + analysis_conclusion_list.Add(current_analysis_conclusion_list); + } + var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList(); + Inserts(pump_index + 1, run_flag, list); + } + } + + + #endregion + + #region Insert + + + /// <summary> + /// 鎵归噺鎻掑叆 + /// </summary> + public void Inserts(int index, string runFlag, List<Entity.AnalysisPump> list) + { + string log; + if (list == null || !list.Any()) + { + log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�"; + return; + } + + var sw = Stopwatch.StartNew(); + _dal_analysis_pump.BulkInsertsEx(runFlag, list); + log = $"{runFlag}:涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m"; + } + + /// <summary> + /// 鎵归噺鎻掑叆 + /// </summary> + public void Inserts(int index, string runFlag, List<Entity.AnalysisParameter> list) + { + string log; + if (list == null || !list.Any()) + { + log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�"; + return; + } + + var sw = Stopwatch.StartNew(); + _dal_analysis_conclusion.BulkInsertsEx(runFlag, list); + log = $"鍒嗘瀽杩涘害:{runFlag},涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m"; + + } + + #endregion + + /// <summary> + /// 鑾峰彇 + /// </summary> + /// <param name="flag">鏍囧織</param> + /// <param name="is_bp">鏄惁鍙橀</param> + /// <returns></returns> + public static string Get(int flag, bool is_bp) + { + return (is_bp ? "B" : "G") + flag; + } + } +} + diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs new file mode 100644 index 0000000..b0e4924 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/01-analysis/AnalysisHelper_Model.cs @@ -0,0 +1,133 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 璋冨害鍒嗘瀽杈呭姪绫� Model + /// </summary> + public partial class AnalysisHelper + { + /// <summary> + /// 鍒嗘瀽娉� + /// </summary> + public class AnaPump + { + /// <summary> + /// + /// </summary> + public AnaPump() { } + + /// <summary> + /// + /// </summary> + /// <param name="rhs"></param> + public AnaPump(Model.PumpModel rhs) + { + this.Flag = rhs.Flag; + this.Name = rhs.Name; + this.IsBp = rhs.IsBp; + this.Qr = rhs.Qr; + this.Hr = rhs.Hr; + this.Nr = rhs.Nr; + this.Pr = rhs.Pr; + this.Er = rhs.Er; + if (rhs.CurveQH != null && rhs.CurveQP != null) + { + this.CurveQH = rhs.CurveQH.Clone(); + this.CurveQP = rhs.CurveQP.Clone(); + this.AllowCalc = true; + } + } + + + /// <summary> + /// + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// + /// </summary> + public string Code { get; set; } + + /// <summary> + /// + /// </summary> + public string Name { get; set; } + + /// <summary> + /// + /// </summary> + public double Qr { get; set; } + + /// <summary> + /// + /// </summary> + public double Hr { get; set; } + + /// <summary> + /// + /// </summary> + public double Nr { get; set; } + + /// <summary> + /// + /// </summary> + public double Pr { get; set; } + + /// <summary> + /// + /// </summary> + public double Er { get; set; } + + /// <summary> + /// + /// </summary> + public bool IsBp { get; set; } + + /// <summary> + /// + /// </summary> + public Model.CurveExpress CurveQH { get; set; } + + /// <summary> + /// + /// </summary> + public Model.CurveExpress CurveQP { get; set; } + + /// <summary> + /// + /// </summary> + public List<AnaPumpFreItem> AnaPumpFreItems { get; set; } + + /// <summary> + /// + /// </summary> + public bool AllowCalc { get; set; } + + } + + /// <summary> + /// 鍒嗘瀽娉靛彉棰戦」 + /// </summary> + public class AnaPumpFreItem + { + /// <summary> + /// + /// </summary> + public double Frequency { get; set; } + /// <summary> + /// + /// </summary> + public Model.CurveExpress CurveQH { get; set; } + /// <summary> + /// + /// </summary> + public Model.CurveExpress CurveQP { get; set; } + + /// <summary> + /// + /// </summary> + public Model.CurveExpress CurveQE { get; set; } + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs new file mode 100644 index 0000000..793240a --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper.cs @@ -0,0 +1,918 @@ +锘縰sing IStation.Untity; + +namespace IStation.Service +{ + /// <summary> + /// 璋冨害鍒嗘瀽杈呭姪绫� + /// </summary> + public partial class ScheduleHelper + { + + #region ViewModel + private class AnalysisConclusionViewModel : Entity.AnalysisParameter + { + public AnalysisConclusionViewModel() { } + public AnalysisConclusionViewModel(Entity.AnalysisParameter rhs) : base(rhs) { } + public AnalysisConclusionViewModel(Entity.AnalysisParameter rhs, int flag) : base(rhs) + { + this.Flag = flag; + } + public int Flag { get; set; } + } + #endregion + + #region Private Variable + + private readonly decimal _frequency_min = 25; + private readonly decimal _frequency_max = 50; + private readonly decimal _frequency_space = 1;//棰戠巼闂撮殧 + + private readonly double _start_stop_loss_coefficient = 0.9;//娉靛惎鍋滄崯澶辩郴鏁� + + private double _sel_opt_flow_excess = 1;//鍙�夋柟妗堢殑娴侀噺浣欓噺 + private readonly double _sel_opt_pump_pressure_excess = 0;//鍙�夋柟妗堢殑鍗曟车鎵▼榛樿鎶崌浣欓噺 + private double _station_target_flow_diff = 0; // 绔欑偣鐩爣娴侀噺宸�� + + + private readonly double _sel_opt_flow_deviation_ratio = 0.05;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣� + private readonly double _sel_opt_reasonable_flow_deviation_ratio = 0.005;//鍚堢悊鐨勬柟妗堢殑娴侀噺鍋忓樊姣� + + private readonly Service.AnalysisParameter _service_analysis_parameter = new(); + + private int _min_open_count;//鏈�灏忓紑娉垫暟閲� + private int _max_open_count;//鏈�澶у紑娉垫暟閲� + private List<int> _current_open_flag_list = null;// 褰撳墠寮�娉靛垪琛� + private List<int> _must_open_flag_list = null; // 蹇呭紑娉靛垪琛� + private List<int> _must_close_flag_list = null; // 蹇呭叧娉靛垪琛� + private List<List<int>> _forbidden_flag_combine_list = null; // 绂佺敤娉电粍鍚� + private List<List<int>> _associative_flag_combine_list = null; // 鍏宠仈娉电粍鍚� + private List<List<int>> _same_section_flag_combine_list = null; // 鍚屾娉电粍鍚� + private List<Model.WaterSupplyLimit> _water_supply_limit_list = null; //渚涙按闄愬埗鍒楄〃 + private List<Model.FrequencyLimit> _frequency_limit_list = null; // 棰戠巼闄愬埗鍒楄〃 + private List<int> _priority_open_flag_list = null; // 浼樺厛寮�娉靛垪琛� + private List<int> _maintenance_flag_list = null; // 妫�淇垪琛� + + + + + + #endregion + + /// <summary> + /// 鍒濆鍖� + /// </summary> + public void Initial(List<int> current_open_flag_list, Model.ScheduleConfig schedule_config) + { + _current_open_flag_list = current_open_flag_list; + _min_open_count = 1; + _max_open_count = 0; + _must_open_flag_list = null; + _must_close_flag_list = null; + _forbidden_flag_combine_list = null; + _associative_flag_combine_list = null; + _same_section_flag_combine_list = null; + _water_supply_limit_list = null; + _frequency_limit_list = null; + _priority_open_flag_list = null; + _maintenance_flag_list = null; + _station_target_flow_diff = 0; + if (schedule_config != null) + { + _min_open_count = schedule_config.MinOpenCount; + _max_open_count = schedule_config.MaxOpenCount; + _must_open_flag_list = schedule_config.MustOpenFlagList; + _must_close_flag_list = schedule_config.MustCloseFlagList; + _forbidden_flag_combine_list = schedule_config.ForbiddenFlagCombineList; + _associative_flag_combine_list = schedule_config.AssociativeFlagCombineList; + _same_section_flag_combine_list = schedule_config.SameSectionFlagCombineList; + _water_supply_limit_list = schedule_config.WaterSupplyLimitList; + _frequency_limit_list = schedule_config.FrequencyLimitList; + _priority_open_flag_list = schedule_config.PriorityOpenFlagList; + _maintenance_flag_list = schedule_config.MaintenanceFlagList; + } + } + + + #region OptAnaCombine + + /// <summary> + /// 鑾峰彇鏈�浼樼粍鍚� + /// </summary> + /// <param name="pump_list"></param> + /// <param name="flag_inlet_water_level_dict"></param> + /// <param name="target_flow"></param> + /// <param name="target_head"></param> + /// <returns></returns> + public List<AnaCombine> GetAnaCombineList + ( + List<Model.PumpModel> pump_list, + double target_flow, + double target_head + ) + { + //鑾峰彇鏂规鏃剁敤琛ュ樊鐨勬祦閲忥紝渚涙按闄愬埗鐢ㄧ洰鏍囨祦閲忓垽鏂� + var target_flow_compensation = target_flow + _station_target_flow_diff; + #region 鍒濆鍖栧弬鏁� + if (pump_list == null || !pump_list.Any()) + { + return default; + } + + var current_open_flag_list = _current_open_flag_list; + var min_open_count = _min_open_count; + var max_open_count = _max_open_count < 1 ? pump_list.Count : _max_open_count; + var must_open_flag_list = _must_open_flag_list; + var must_close_flag_list = _must_close_flag_list; + var forbidden_flag_combine_list = _forbidden_flag_combine_list; + var associative_flag_combine_list = _associative_flag_combine_list; + var same_section_flag_combine_list = _same_section_flag_combine_list; + var water_supply_limit_list = _water_supply_limit_list; + var frequency_limit_list = _frequency_limit_list; + 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); + var pump_flag_list = pump_list.Select(x => x.Flag).ToList(); + + var combine_merit_ratio = 1d;//缁勫悎鎷╀紭鐜� + + target_flow = Math.Round(target_flow, 1); + target_flow_compensation = Math.Round(target_flow_compensation,1); + target_head = Math.Round(target_head, 1); + + #endregion + + #region 鍒濆鍖栬鍒� + + #region 瀛樺湪-蹇呭紑娉靛垪琛� + + var must_open_flag_list_remark = string.Empty; + var exist_must_open_flag_list = must_open_flag_list != null && must_open_flag_list.Count > 0; + if (exist_must_open_flag_list) + { + must_open_flag_list = must_open_flag_list.OrderBy(x => x).ToList(); + must_open_flag_list_remark = IntListHelper.ToString(must_open_flag_list); + } + + #endregion + + #region 瀛樺湪-蹇呭叧娉靛垪琛� + + var exist_must_close_flag_list = must_close_flag_list != null && must_close_flag_list.Count > 0; + + #endregion + + #region 瀛樺湪-绂佺敤缁勫悎 + + var exist_forbidden_flag_combine_list = forbidden_flag_combine_list != null && forbidden_flag_combine_list.Count > 0; + + #endregion + + #region 瀛樺湪-鍏宠仈缁勫悎 + + var exist_associative_flag_combine_list = associative_flag_combine_list != null && associative_flag_combine_list.Count > 0; + + #endregion + + #region 瀛樺湪-鍚屾娉电粍鍚� + + Dictionary<int, List<int[]>> same_section_combine_dict = new(); + var exist_same_section_flag_combine_list = same_section_flag_combine_list != null && same_section_flag_combine_list.Count > 0; + if (exist_same_section_flag_combine_list) + { + same_section_combine_dict = GetSameSectionCombineDict(same_section_flag_combine_list, pump_list.Count); + } + + #endregion + + #region 瀛樺湪-渚涙按闄愬埗 + + var exist_water_supply_limit_list = water_supply_limit_list != null && water_supply_limit_list.Count > 0; + if (exist_water_supply_limit_list) + { + var water_supply_min = water_supply_limit_list.Min(x => x.Min); + var water_supply_max = water_supply_limit_list.Max(x => x.Max); + +#if DEBUG + water_supply_min = 0; +#endif + if (target_flow < water_supply_min || target_flow > water_supply_max) + { + return default; + } + } + + #endregion + + #region 瀛樺湪-棰戠巼闄愬埗 + + var frequency_limit_flag_dict = new Dictionary<int, Model.FrequencyLimit>(); + var exist_frequency_limit_list = frequency_limit_list != null && frequency_limit_list.Count > 0; + if (exist_frequency_limit_list) + { + frequency_limit_flag_dict = frequency_limit_list.ToDictionary(x => x.Flag, x => x); + } + + #endregion + + + #region 瀛樺湪-浼樺厛寮�娉靛垪琛� + + var priority_open_flag_list_remark = string.Empty; + var exist_priority_open_flag_list = priority_open_flag_list != null && priority_open_flag_list.Count > 0; + if (exist_priority_open_flag_list) + { + priority_open_flag_list = priority_open_flag_list.OrderBy(x => x).ToList(); + priority_open_flag_list_remark = IntListHelper.ToString(priority_open_flag_list); + } + + #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; + if (exist_current_open_flag_list) + { + //渚涙按闄愬埗 + var exist_limit = false; + if (exist_water_supply_limit_list) + { + var limit = water_supply_limit_list.Find(x => x.PumpCount == current_open_flag_list.Count); + if (limit != null) + { + if (target_flow < limit.Min || target_flow > limit.Max) + { + exist_limit = true; + } + } + } + if (!exist_limit) + { + var current_ana_combine_list = GetOptAnaCombine + ( + current_open_flag_list, + combine_merit_ratio, + pump_nr_dict, + pump_bp_dict, + exist_frequency_limit_list, + frequency_limit_flag_dict, + target_flow_compensation, + target_head + ); + if (current_ana_combine_list != null) + return current_ana_combine_list; + } + } + + #endregion + + + #endregion + + #region 璋冨害鍒嗘瀽 + + var ana_combine_list = new List<AnaCombine>(); + for (int pump_count = min_open_count; pump_count <= max_open_count; pump_count++) + { + if (pump_count == 1) + { + var max_total_flow = pump_list.Max(x => x.Qr); + if (max_total_flow < target_flow) + continue; + } + + #region 渚涙按闄愬埗 + + //渚涙按闄愬埗 + if (exist_water_supply_limit_list) + { + var exist_limit = false; + foreach (var limit in water_supply_limit_list) + { + if (limit.PumpCount == pump_count) + { + if (target_flow < limit.Min || target_flow > limit.Max) + { + exist_limit = true; + break; + } + } + } + if (exist_limit) + continue; + } + + #endregion + + var combine_list = GetCombineList(pump_flag_list, pump_count);//鎺掑垪缁勫悎 + foreach (var combine in combine_list) + { + combine_merit_ratio = 1; + + #region 瑙勫垯杩囨护 + //蹇呭紑 + if (exist_must_open_flag_list) + { + var combine_remark = IntListHelper.ToString(combine.OrderBy(x => x)); + if (!combine_remark.Contains(must_open_flag_list_remark)) + continue; + } + + //蹇呭叧 + if (exist_must_close_flag_list) + { + var exist_intersected = combine.Intersect(must_close_flag_list).Count() > 0; + if (exist_intersected) + continue; + } + + //绂佺敤缁勫悎 + if (exist_forbidden_flag_combine_list) + { + var exist_equal = false; + foreach (var flag_list in forbidden_flag_combine_list) + { + if (combine.SequenceEqual(flag_list)) + { + exist_equal = true; + break; + } + } + if (exist_equal) + continue; + } + + //鍚屾娉电粍鍚� + if (exist_same_section_flag_combine_list) + { + var exist_equal = false; + foreach (var flag_list in same_section_combine_dict[pump_count]) + { + //鐩稿悓 + if (combine.SequenceEqual(flag_list)) + { + exist_equal = true; + break; + } + + //鍖呭惈 + if (flag_list.Intersect(combine).Count() == flag_list.Length) + { + exist_equal = true; + break; + } + } + if (exist_equal) + continue; + } + + //鍏宠仈缁勫悎 + if (exist_associative_flag_combine_list) + { + var exist_intersected = false; + foreach (var flag_list in associative_flag_combine_list) + { + var except_count = combine.Except(flag_list).Count(); + if (except_count != flag_list.Count && except_count > 0) + { + exist_intersected = true; + } + } + if (exist_intersected) + continue; + } + + //褰撳墠寮�娉靛垪琛� + int start_stop_count = 0;//鍚仠鏁伴噺 + if (exist_current_open_flag_list) + { + var start_pump_count = combine.Except(current_open_flag_list).Count(); + var close_pump_count = current_open_flag_list.Except(combine).Count(); + start_stop_count = start_pump_count + close_pump_count;//鍚仠鏁伴噺 + } + else + { + start_stop_count = combine.Count(); + if (exist_must_open_flag_list) + { + start_stop_count = combine.Except(must_open_flag_list).Count(); + } + } + + //浼樺厛寮�娉靛垪琛� + if (exist_priority_open_flag_list) + { + //鐩墠閫昏緫 浼樺厛寮�娉�==蹇呭紑鏂规 + 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 + + var total_loss_ratio = Math.Pow(_start_stop_loss_coefficient, start_stop_count);//鍚仠涓�娆℃崯澶变簺鑳借�� + combine_merit_ratio *= total_loss_ratio; + + var current_ana_combine_list = GetOptAnaCombine + ( + combine, + combine_merit_ratio, + pump_nr_dict, + pump_bp_dict, + exist_frequency_limit_list, + frequency_limit_flag_dict, + target_flow_compensation, + target_head + ); + if (current_ana_combine_list == null) + continue; + ana_combine_list.AddRange(current_ana_combine_list); + } + + // 20250422 娉ㄩ噴鍘熷洜锛氫緵姘磋寖鍥翠細鏈夐噸鍙狅紝鑰冭檻鍒囨车鎿嶄綔 + //濡傛灉褰撳墠寰幆宸茬粡婊¤冻锛屼笉闇�瑕佸啀鍔犳车 + //if (opt_ana_combine_list.Any()) + //{ + // break; + //} + } + + if (ana_combine_list.Count < 1) + return default; + + ana_combine_list = ana_combine_list.OrderBy(x => x.TotalPower).OrderByDescending(x => x.MeritRatio).ToList(); + return ana_combine_list; + + #endregion + + } + + + /// <summary> + /// 鑾峰彇鏈�浼樼粍鍚� + /// </summary> + /// <param name="combine"></param> + /// <param name="combine_merit_ratio"></param> + /// <param name="flag_inlet_water_level_dict"></param> + /// <param name="pump_nr_dict"></param> + /// <param name="pump_bp_dict"></param> + /// <param name="exist_frequency_limit_list"></param> + /// <param name="frequency_limit_flag_dict"></param> + /// <param name="target_flow"></param> + /// <param name="target_head"></param> + /// <returns></returns> + private List<AnaCombine> GetOptAnaCombine + ( + IEnumerable<int> combine, + double combine_merit_ratio, + Dictionary<int, double> pump_nr_dict, + Dictionary<int, bool> pump_bp_dict, + bool exist_frequency_limit_list, + Dictionary<int, Model.FrequencyLimit> frequency_limit_flag_dict, + double target_flow, + double target_head + ) + { + if (combine == null || !combine.Any()) + return default; + + //鍏堜慨姝g粍鍚堟洸绾垮拰妯″瀷鐨勫亸宸壃绋� + + var conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>(); + var conclusion_ex_list_dict = new Dictionary<int, List<AnalysisConclusionViewModel>>(); + double max_supply_flow = 0; + foreach (var flag in combine) + { + var run_flag = RunFlagHelper.Get(flag, pump_bp_dict[flag]); + + //杩涘彛姘翠綅 + var inlet_water_level = 0; + + //缁勫悎鍋忓樊绯绘暟 + var current_head = target_head - inlet_water_level + _sel_opt_pump_pressure_excess; + + current_head = Math.Round(current_head, 1); + + //棰戠巼闄愬埗 + var conclusion_list = new List<Entity.AnalysisParameter>(); + if (exist_frequency_limit_list && frequency_limit_flag_dict.ContainsKey(flag)) + { + var limit = frequency_limit_flag_dict[flag]; + conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, limit.Min, limit.Max, current_head); + } + else + { + + //瀹氶娉� 鍙兘鏈�灏忓帇宸秴杩囩洰鏍囧帇宸� + var min_head_conclusion = _service_analysis_parameter.GetMinHead(run_flag); + if (min_head_conclusion != null && min_head_conclusion.Head > current_head) + { + conclusion_list = new List<Entity.AnalysisParameter>() { min_head_conclusion }; + } + else + { + var is_bp = pump_bp_dict[flag]; + if (is_bp) + { + conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, current_head); + } + else + { + var list = _service_analysis_parameter.GetList(run_flag); + conclusion_list = _service_analysis_parameter.GetHeadList(run_flag, current_head); + } + } + } + if (conclusion_list == null || !conclusion_list.Any()) + { + break; + } + max_supply_flow += conclusion_list.Max(x => x.Flow); + var conclusion_ex_list = conclusion_list.Select(x => new AnalysisConclusionViewModel(x, flag)).ToList(); + conclusion_ex_list_list.Add(conclusion_ex_list); + conclusion_ex_list_dict[flag] = conclusion_ex_list; + } + + if (conclusion_ex_list_list.Count != combine.Count()) + return default; + + if (max_supply_flow < target_flow * _sel_opt_flow_excess) + { + var flow_excess = target_flow * _sel_opt_flow_excess; + if (max_supply_flow < flow_excess) + return default; + } + + var temp_ana_combine_list = GetOptAnaCombine(conclusion_ex_list_dict, pump_nr_dict, pump_bp_dict, target_flow); + if (temp_ana_combine_list == null || !temp_ana_combine_list.Any()) + return default; + temp_ana_combine_list = temp_ana_combine_list.OrderBy(x => x.TotalFlow).ToList(); + + var ana_combine_list = new List<AnaCombine>(); + foreach (var ana_combine in temp_ana_combine_list) + { + var total_flow = ana_combine.TotalFlow; + var total_power = ana_combine.TotalPower; + if (total_flow < target_flow * _sel_opt_flow_excess) + return default; + + + var total_flow_deviation_ratio = Math.Abs(1 - Math.Abs(total_flow / target_flow)); + if (total_flow_deviation_ratio > _sel_opt_flow_deviation_ratio) + continue; + if (total_flow_deviation_ratio > _sel_opt_reasonable_flow_deviation_ratio) + { + combine_merit_ratio -= total_flow_deviation_ratio; + } + + double eff = 0, wp = 0, uwp = 0; + wp = Model.CurveCalcuHelper.CalculateWP(total_power, total_flow); + foreach (var ana_pump in ana_combine.AnaFrePumps) + { + var pump_flow = ana_pump.Flow; + var pump_eff = ana_pump.Eff; + var pump_uwp = ana_pump.UWP; + + eff += pump_eff * pump_flow / total_flow; + uwp += pump_uwp * pump_flow / total_flow; + } + + ana_combine.TotalFlow = total_flow; + ana_combine.TotalHead = target_head; + ana_combine.TotalPower = total_power; + ana_combine.TotalEfficiency = eff; + ana_combine.WP = wp; + ana_combine.UWP = uwp; + ana_combine.MeritRatio = combine_merit_ratio; + ana_combine_list.Add(ana_combine); + } + return ana_combine_list; + + } + + + /// <summary> + /// 鑾峰彇鏈�浼樼粍鍚� + /// </summary> + /// <param name="conclusion_ex_list_dict"></param> + /// <param name="pump_nr_dict"></param> + /// <param name="pump_bp_dict"></param> + /// <param name="target_flow"></param> + /// <returns></returns> + private List<AnaCombine> GetOptAnaCombine( + Dictionary<int, List<AnalysisConclusionViewModel>> conclusion_ex_list_dict, + Dictionary<int, double> pump_nr_dict, + Dictionary<int, bool> pump_bp_dict, + double target_flow + ) + { + if (conclusion_ex_list_dict == null || !conclusion_ex_list_dict.Any()) + return default; + var frequency_min = (double)_frequency_min; + var frequency_max = (double)_frequency_max; + var frequency_space = (double)_frequency_space; + + var all_fre_conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>(); + var all_fix_conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>(); + foreach (var item in conclusion_ex_list_dict) + { + var flag = item.Key; + var cl_list = item.Value; + if (pump_bp_dict[flag]) + { + all_fre_conclusion_ex_list_list.Add(cl_list); + } + else + { + all_fix_conclusion_ex_list_list.Add(cl_list); + } + } + var cl_ex_list_list_list = new List<List<List<AnalysisConclusionViewModel>>>(); + + + //榛樿1hz鍐呰兘姹傚嚭婊¤冻鐩爣闇�姹傜殑鎺掑垪缁勫悎锛屼笉婊¤冻缁х画杩唬 + var frequency_iteration_count = 5;//棰戠巼杩唬娆℃暟 + var frequency_iteration_space = 1d;//棰戠巼杩唬闂撮殧 + for (int i = 0; i < frequency_iteration_count; i++) + { + var current_frequency_space = frequency_space + (i * frequency_iteration_space); + cl_ex_list_list_list = FrequencyFilters(target_flow, frequency_min, frequency_max, current_frequency_space, all_fre_conclusion_ex_list_list, all_fix_conclusion_ex_list_list); + if (cl_ex_list_list_list.Any()) + { + break; + } + } + + if (!cl_ex_list_list_list.Any()) + { + return default; + } + + //鍒嗙粍鎺掑垪缁勫悎姹傛渶浼� + var ana_combine_list = new List<AnaCombine>(); + foreach (var item_cl_ex_list_list in cl_ex_list_list_list) + { + var cl_ex_list_list = CartesianProduct(item_cl_ex_list_list, target_flow); + var opt_cl_ex_list = cl_ex_list_list.OrderBy(x => x.Sum(x => x.Power)).FirstOrDefault(); + if (opt_cl_ex_list != null && opt_cl_ex_list.Any()) + { + var ana_combine = new AnaCombine(); + ana_combine.Flags = new List<int>(); + ana_combine.AnaFrePumps = new List<AnaFrePump>(); + foreach (var opt_cl_ex in opt_cl_ex_list) + { + var flag = opt_cl_ex.Flag; + ana_combine.Flags.Add(flag); + ana_combine.TotalFlow += opt_cl_ex.Flow; + ana_combine.TotalPower += opt_cl_ex.Power; + + var ana_fre_pump = new AnaFrePump(); + ana_fre_pump.Flag = flag; + ana_fre_pump.Flow = opt_cl_ex.Flow; + ana_fre_pump.Head = opt_cl_ex.Head; + ana_fre_pump.Power = opt_cl_ex.Power; + ana_fre_pump.Eff = opt_cl_ex.Eff; + ana_fre_pump.WP = Model.CurveCalcuHelper.CalculateWP(ana_fre_pump.Power, ana_fre_pump.Flow); + ana_fre_pump.UWP = Model.CurveCalcuHelper.CalculateUWP(ana_fre_pump.Power, ana_fre_pump.Flow, ana_fre_pump.Head); + ana_fre_pump.Frequency = opt_cl_ex.Hz; + ana_fre_pump.Speed = opt_cl_ex.Hz / 50 * pump_nr_dict[flag]; + ana_combine.AnaFrePumps.Add(ana_fre_pump); + } + + ana_combine.FlagCount = opt_cl_ex_list.Count; + ana_combine.Remark = IntListHelper.ToString(ana_combine.Flags); + ana_combine_list.Add(ana_combine); + } + } + if (!ana_combine_list.Any()) + return default; + ana_combine_list = ana_combine_list.ToList(); + return ana_combine_list; + //var opt_ana_combine = ana_combine_list.OrderBy(x => x.TotalFlow).OrderBy(x => x.TotalPower).First(); + //return opt_ana_combine; + } + + + /// <summary> + /// 鑾峰彇鍚屾娉电粍鍚� + /// </summary> + /// <param name="same_section_flag_combine_list"></param> + /// <param name="pump_list_count"></param> + /// <returns></returns> + public Dictionary<int, List<int[]>> GetSameSectionCombineDict(List<List<int>> same_section_flag_combine_list, int pump_list_count) + { + Dictionary<int, List<int[]>> same_section_combine_dict = new(); + for (int pump_count = 1; pump_count <= pump_list_count; pump_count++) + { + same_section_combine_dict[pump_count] = new List<int[]>(); + switch (pump_count) + { + case 2: + { + foreach (var same_section_flag_combine in same_section_flag_combine_list) + { + var combine_list = GetCombineList(same_section_flag_combine, 2); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + break; + case 3: + { + foreach (var same_section in same_section_flag_combine_list) + { + var combine_list = GetCombineList(same_section, 3); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + break; + case 4: + { + foreach (var same_section in same_section_flag_combine_list) + { + var combine_list3 = GetCombineList(same_section, 3); + same_section_combine_dict[pump_count].AddRange(combine_list3); + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + case 5: + { + foreach (var same_section in same_section_flag_combine_list) + { + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + case 6: + { + foreach (var same_section in same_section_flag_combine_list) + { + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + default: + break; + } + } + + return same_section_combine_dict; + } + + /// <summary> + /// 鑾峰彇娉电疮璁¤繍琛屾椂闀挎崯澶辩郴鏁板瓧鍏� + /// </summary> + /// <param name="flag_cumulative_runtime_dict"></param> + /// <returns></returns> + public Dictionary<int, double> GetFlagCumulativeRuntimeLossRatioDict(Dictionary<int, double> flag_cumulative_runtime_dict) + { + var rating_value = 24 * 5; + var flag_cumulative_runtime_loss_ratio_dict = new Dictionary<int, double>(); + foreach (var item in flag_cumulative_runtime_dict) + { + var flag = item.Key; + var cumulative_runtime = item.Value; + var level = cumulative_runtime / rating_value / 100; + var loss_ratio = 1 - level; + flag_cumulative_runtime_loss_ratio_dict.Add(flag, loss_ratio); + } + return flag_cumulative_runtime_loss_ratio_dict; + } + + /// <summary> + /// 杩囨护棰戠巼鍒嗙粍 + /// </summary> + /// <param name="target_flow"></param> + /// <param name="frequency_min"></param> + /// <param name="frequency_max"></param> + /// <param name="frequency_space"></param> + /// <param name="all_fre_conclusion_ex_list_list"></param> + /// <param name="all_fix_conclusion_ex_list_list"></param> + /// <returns></returns> + private List<List<List<AnalysisConclusionViewModel>>> FrequencyFilters( + double target_flow, + double frequency_min, + double frequency_max, + double frequency_space, + List<List<AnalysisConclusionViewModel>> all_fre_conclusion_ex_list_list, + List<List<AnalysisConclusionViewModel>> all_fix_conclusion_ex_list_list) + { + double fix_total_flow = 0; + var exist_all_fix_conclusion_ex_list_list = all_fix_conclusion_ex_list_list.Any(); + if (exist_all_fix_conclusion_ex_list_list) + { + fix_total_flow = all_fix_conclusion_ex_list_list.Sum(x => x.Sum(x => x.Flow)); + } + + //棰戠巼鎸夐棿闅斿垎缁� + var cl_ex_list_list_list = new List<List<List<AnalysisConclusionViewModel>>>(); + for (double fre_current_min = frequency_min; fre_current_min <= frequency_max; fre_current_min++) + { + var fre_current_max = fre_current_min + frequency_space; + var skip_current = false; + var total_flow_current = 0d; + var cl_ex_list_list = new List<List<AnalysisConclusionViewModel>>(); + foreach (var conclusion_ex_list in all_fre_conclusion_ex_list_list) + { + var cl_ex_list = conclusion_ex_list.Where(x => x.Hz <= fre_current_max && x.Hz >= fre_current_min).ToList(); + if (cl_ex_list == null || !cl_ex_list.Any()) + { + skip_current = true; + break; + } + total_flow_current += cl_ex_list.Max(x => x.Flow); + cl_ex_list_list.Add(cl_ex_list); + } + if (skip_current) + continue; + if (exist_all_fix_conclusion_ex_list_list) + { + total_flow_current += fix_total_flow; + cl_ex_list_list.AddRange(all_fix_conclusion_ex_list_list); + } + if (total_flow_current < target_flow * _sel_opt_flow_excess) + continue; + cl_ex_list_list_list.Add(cl_ex_list_list); + } + return cl_ex_list_list_list; + } + + + /// <summary> + /// 鑾峰彇鎺掑垪缁勫悎鍒楄〃(绗涘崱灏斾箻绉�) + /// </summary> + private List<List<AnalysisConclusionViewModel>> CartesianProduct(List<List<AnalysisConclusionViewModel>> lstSplit, double target_flow) + { + long count = 1; + lstSplit.ForEach(item => count *= item.Count); + var lstResult = new List<List<AnalysisConclusionViewModel>>(); + for (long i = 0; i < count; ++i) + { + var lstTemp = new List<AnalysisConclusionViewModel>(); + long j = 1; + var lstFre = new List<double>(); + double totalFlow = 0; + lstSplit.ForEach(item => + { + j *= item.Count; + var index = (i / (count / j)) % item.Count; + var index_int = (int)index; + var obj = item[index_int]; + totalFlow += obj.Flow; + lstTemp.Add(obj); + }); + if (totalFlow < target_flow * _sel_opt_flow_excess) + continue; + lstResult.Add(lstTemp); + } + return lstResult; + } + + + /// <summary> + /// 鑾峰彇鎺掑垪缁勫悎 + /// </summary> + /// <param name="flags"></param> + /// <param name="count"></param> + /// <returns></returns> + private List<int[]> GetCombineList(List<int> flags, int count) + { + var combine = Model.PermutationAndCombination<int>.GetCombination(flags.ToArray(), count); + return combine; + } + + + + #endregion + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs new file mode 100644 index 0000000..bb540d7 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/07-helper/02-schedule/ScheduleHelper_Model.cs @@ -0,0 +1,167 @@ +锘縩amespace IStation.Service +{ + /// <summary> + /// 璋冨害鍒嗘瀽杈呭姪绫� Model + /// </summary> + public partial class ScheduleHelper + { + /// <summary> + /// 鍒嗘瀽鍙橀娉� + /// </summary> + public class AnaFrePump + { + /// <summary> + /// + /// </summary> + public int Flag { get; set; } + + /// <summary> + /// + /// </summary> + public double Flow { get; set; } + + /// <summary> + /// + /// </summary> + public double Head { get; set; } + + /// <summary> + /// + /// </summary> + public double PressureDiff { get; set; } + + /// <summary> + /// + /// </summary> + public double Power { get; set; } + + /// <summary> + /// + /// </summary> + public double Eff { get; set; } + + /// <summary> + /// + /// </summary> + public double WP { get; set; } + + /// <summary> + /// + /// </summary> + public double UWP { get; set; } + + /// <summary> + /// + /// </summary> + public double Frequency { get; set; } + + /// <summary> + /// + /// </summary> + public double Speed { get; set; } + + + /// <summary> + /// + /// </summary> + public void Round() + { + this.Flow = Math.Round(this.Flow, 1); + this.Head = Math.Round(this.Head, 3); + this.Power = Math.Round(this.Power, 1); + this.Eff = Math.Round(this.Eff, 1); + this.Frequency = Math.Round(this.Frequency, 1); + this.Speed = Math.Round(this.Speed, 1); + } + + } + + /// <summary> + /// 鍒嗘瀽缁勫悎 + /// </summary> + public class AnaCombine + { + /// <summary> + /// + /// </summary> + public double TotalFlow { get; set; } + + /// <summary> + /// + /// </summary> + public double TotalHead { get; set; } + + /// <summary> + /// + /// </summary> + public double TotalPower { get; set; } + + /// <summary> + /// + /// </summary> + public double TotalEfficiency { get; set; } + + /// <summary> + /// + /// </summary> + public double WP { get; set; } + + /// <summary> + /// + /// </summary> + public double UWP { get; set; } + + /// <summary> + /// + /// </summary> + public List<AnaFrePump> AnaFrePumps { get; set; } + + /// <summary> + /// + /// </summary> + public List<int> Flags { get; set; } + + /// <summary> + /// + /// </summary> + public int FlagCount { get; set; } + + /// <summary> + /// + /// </summary> + public string Remark { get; set; } + + /// <summary> + /// + /// </summary> + public double MeritRatio { get; set; } + + + /// <summary> + /// + /// </summary> + public void Round() + { + this.TotalFlow = Math.Round(this.TotalFlow, 1); + this.TotalHead = Math.Round(this.TotalHead, 3); + this.TotalPower = Math.Round(this.TotalPower, 1); + this.TotalEfficiency = Math.Round(this.TotalEfficiency, 1); + this.WP = Math.Round(this.WP, 2); + this.UWP = Math.Round(this.UWP, 2); + + if (this.AnaFrePumps != null && this.AnaFrePumps.Any()) + { + foreach (var anaFrePump in AnaFrePumps) + { + anaFrePump.Round(); + + } + } + } + + + } + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs new file mode 100644 index 0000000..a0d5aaa --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/GlobalUsing.cs @@ -0,0 +1,8 @@ +锘縢lobal using SqlSugar; + + + + +global using System; +global using System.Collections.Generic; +global using System.Drawing; \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj new file mode 100644 index 0000000..c6d6531 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/IStation.WinFrmUI.Schedule.csproj @@ -0,0 +1,46 @@ +锘�<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net6.0-windows</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <Compile Remove="Schedule\000\AnaScheme.cs" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\IStation.WinFrmUI.Basic\IStation.WinFrmUI.Basic.csproj" /> + <ProjectReference Include="..\IStation.WinFrmUI.Core\IStation.WinFrmUI.Core.csproj" /> + </ItemGroup> + + <ItemGroup> + <Compile Update="Properties\Resources.Designer.cs"> + <DesignTime>True</DesignTime> + <AutoGen>True</AutoGen> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Update="Schedule\ScheduleAnalyPage.cs"> + <SubType>UserControl</SubType> + </Compile> + <Compile Update="Schedule\ParallelCurveViewDlg.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Update="Schedule\SetPumpRunConfigDlg.cs"> + <SubType>Form</SubType> + </Compile> + </ItemGroup> + + <ItemGroup> + <EmbeddedResource Update="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + </ItemGroup> + + <ItemGroup> + <Folder Include="05-service\00-basic\" /> + </ItemGroup> + +</Project> diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs new file mode 100644 index 0000000..94ee139 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +锘�//------------------------------------------------------------------------------ +// <auto-generated> +// 姝や唬鐮佺敱宸ュ叿鐢熸垚銆� +// 杩愯鏃剁増鏈�:4.0.30319.42000 +// +// 瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋� +// 閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便�� +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace IStation.WinFrmUI.Schedule.Properties { + using System; + + + /// <summary> + /// 涓�涓己绫诲瀷鐨勮祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲鐨勫瓧绗︿覆绛夈�� + /// </summary> + // 姝ょ被鏄敱 StronglyTypedResourceBuilder + // 绫婚�氳繃绫讳技浜� ResGen 鎴� Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆� + // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈� .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛� ResGen + // (浠� /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆� + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// 杩斿洖姝ょ被浣跨敤鐨勭紦瀛樼殑 ResourceManager 瀹炰緥銆� + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IStation.WinFrmUI.Schedule.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// 閲嶅啓褰撳墠绾跨▼鐨� CurrentUICulture 灞炴�э紝瀵� + /// 浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵�鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍�� + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// <summary> + /// 鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆� + /// </summary> + internal static DevExpress.Utils.Svg.SvgImage datasource { + get { + object obj = ResourceManager.GetObject("datasource", resourceCulture); + return ((DevExpress.Utils.Svg.SvgImage)(obj)); + } + } + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx new file mode 100644 index 0000000..4c89dde --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Properties/Resources.resx @@ -0,0 +1,124 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> + <data name="datasource" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Resources\datasource.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> + </data> +</root> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg new file mode 100644 index 0000000..7f70648 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Resources/datasource.svg @@ -0,0 +1,18 @@ +锘�<?xml version='1.0' encoding='UTF-8'?> +<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32"> + <style type="text/css"> + .Black{fill:#727272;} + .Yellow{fill:#FFB115;} + .Blue{fill:#1177D7;} + .Green{fill:#039C23;} + .Red{fill:#D11C1C;} + .White{fill:#FFFFFF;} + .st0{opacity:0.75;} + .st1{opacity:0.5;} + .st2{opacity:0.25;} +</style> + <g id="Datasource"> + <path d="M6,6h12v2H6V6z M14,24H4V2h16v10.2c0.6-0.1,1.3-0.2,2-0.2V1c0-0.5-0.5-1-1-1H3C2.5,0,2,0.5,2,1v24 c0,0.5,0.5,1,1,1h11V24z M6,20h8v-2H6V20z M6,16h8.2c0.2-0.8,0.7-1.4,1.5-2H6V16z" class="Black" /> + <path d="M18,12H6v-2h12V12z M23,14c-3.9,0-7,1.3-7,3v12c0,1.7,3.1,3,7,3s7-1.3,7-3V17C30,15.3,26.9,14,23,14z" class="Yellow" /> + </g> +</svg> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs new file mode 100644 index 0000000..8c3f47c --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaCurveItem.cs @@ -0,0 +1,68 @@ +锘縩amespace IStation.WinFrmUI.Schedule +{ + /// <summary> + /// 鍙橀娉靛崟棰戠巼鏁版嵁 + /// </summary> + public class AnaCurveItem + { + public AnaCurveItem() { } + + /// <summary> + /// + /// </summary> + public IStation.Model.CurveExpress CurveInfoQH; + /// <summary> + /// + /// </summary> + public IStation.Model.CurveExpress CurveInfoQP; + /// <summary> + /// + /// </summary> + public double Frequence = 50; + /// <summary> + /// + /// </summary> + public double Speed { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointQ { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointH { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointP { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointE { get; set; } + /// <summary> + /// 宸茶秴杩囨渶澶ф壃绋� + /// </summary> + public bool IsOverMaxH = false;// + + /// <summary> + /// 鏄惁寤堕暱绾夸笂 + /// </summary> + public bool IsExtendCurve = false;// + + /// <summary> + /// 寤堕暱姣斾緥 + /// </summary> + public double RatioExtend { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string Note { get; set; } + + /// <summary> + /// 1 姝e父 2 瓒呰繃鎵�闇�鎵▼ + /// </summary> + public int Status { get; set; } = 1; + } + +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs new file mode 100644 index 0000000..aa523c3 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaScheme.cs @@ -0,0 +1,103 @@ +锘縰sing System.Collections.Generic; +using System.Linq; + +namespace IStation.WinFrmUI.Schedule +{ + + /// <summary> + /// + /// </summary> + public class AnaScheme + { + /// <summary> + /// + /// </summary> + public int ID { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkQ { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkH { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkE { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkP { get; set; } + + /// <summary> + /// 鍗冨惃姘磋兘鑰� + /// </summary> + public double UWP { get; set; } + + /// <summary> + /// 鑳借�� + /// </summary> + public double WP { get; set; } + + /// <summary> + /// 寮�娉垫暟閲� + /// </summary> + public int RunNumber + { + get + { + if (Items == null) + return 0; + + return Items.Count(); + } + set => value = RunNumber; + } + + /// <summary> + /// + /// </summary> + public double SpanQ { get; set; } + /// <summary> + /// + /// </summary> + public List<AnaSchemeItem> Items { get; set; } + + /// <summary> + /// 缁撹鍙俊搴� 1 姝e父 2 鎻愰珮浜嗘壃绋� 3 涓嶇敤寮�娉� + /// </summary> + public int ResultStatus { get; set; } = 1; + + /// <summary> + /// 缁撹鍙俊搴︿俊鎭� + /// </summary> + public string ResultStatusInfo { get; set; } + /// <summary> + /// + /// </summary> + public void CalcItemParas() + { + if (Items == null || Items.Count() == 0) + return; + List<string> sss = new List<string>(); + foreach (var item in Items) + { + sss.Add(string.Format("M{0}P{1}F{2}", item.MachineID, item.PumpID, item.Frequence)); + } + ItemsParas = string.Join(",", sss); + } + /// <summary> + /// + /// </summary> + public string ItemsParas { get; set; } + } + + + + + + + + +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs new file mode 100644 index 0000000..5ecbc58 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/000/AnaSchemeItem.cs @@ -0,0 +1,73 @@ +锘縩amespace IStation.WinFrmUI.Schedule +{ + /// <summary> + /// + /// </summary> + public class AnaSchemeItem + { + 銆� + /// <summary> + /// + /// </summary> + public long PumpID { get; set; } + /// <summary> + /// + /// </summary> + public long MachineID { get; set; } + /// <summary> + /// + /// </summary> + public string MachineName { get; set; } + /// <summary> + /// 鏄惁鏄彉棰戞车 + /// </summary> + public bool IsFrequency { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointQ { get; set; } + /// <summary> + /// / + /// </summary> + public double WorkPointH { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointE { get; set; } + /// <summary> + /// + /// </summary> + public double WorkPointP { get; set; } + /// <summary> + /// 鏄惁寤堕暱绾夸笂 + /// </summary> + public bool IsCurveExtend { get; set; }// + + /// <summary> + /// 寤堕暱姣斾緥 + /// </summary> + public double RatioExtend { get; set; } + + /// <summary> + /// + /// </summary> + public double Frequence { get; set; } + /// <summary> + /// + /// </summary> + public double Speed { get; set; } + + /// <summary> + /// + /// </summary> + public IStation.Model.CurveExpress CurveInfoQH { get; set; } + + /// <summary> + /// + /// </summary> + public IStation.Model.CurveExpress CurveInfoQP { get; set; } + + public long PumpCurveID { get; set; } + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs new file mode 100644 index 0000000..9f9e1ad --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.Designer.cs @@ -0,0 +1,61 @@ +锘縰sing IStation.WinFrmUI.Curve; + +namespace IStation.WinFrmUI.Schedule +{ + partial class ParallelCurveViewDlg + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.chartMultiCurveParallelCtrl1 = new IStation.WinFrmUI.Curve.MultiCurveExpressChart(); + this.SuspendLayout(); + // + // chartMultiCurveParallelCtrl1 + // + this.chartMultiCurveParallelCtrl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.chartMultiCurveParallelCtrl1.Location = new System.Drawing.Point(0, 0); + this.chartMultiCurveParallelCtrl1.Name = "chartMultiCurveParallelCtrl1"; + this.chartMultiCurveParallelCtrl1.Size = new System.Drawing.Size(732, 547); + this.chartMultiCurveParallelCtrl1.TabIndex = 0; + // + // ParallelCurveViewDlg + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(732, 547); + this.Controls.Add(this.chartMultiCurveParallelCtrl1); + this.Name = "ParallelCurveViewDlg"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "骞惰仈鏇茬嚎"; + this.ResumeLayout(false); + + } + + #endregion + + private MultiCurveExpressChart chartMultiCurveParallelCtrl1; + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs new file mode 100644 index 0000000..4f137a2 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.cs @@ -0,0 +1,81 @@ +锘縰sing System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace IStation.WinFrmUI.Schedule +{ + public partial class ParallelCurveViewDlg : DevExpress.XtraEditors.XtraForm + { + public ParallelCurveViewDlg() + { + InitializeComponent(); + IconOptions.Icon = WinFrmUI.Properties.Resources.App; + } + + private List<Color> ColorArray = new List<Color>() + { Color.Red, + Color.Blue, Color.Green, Color.DodgerBlue, + Color.Fuchsia,Color.MidnightBlue,Color.Maroon, + Color.Aquamarine, Color.Bisque ,Color.BurlyWood }; + + + public void SetBindingData(double workQ, List<AnaSchemeItem> anaSchemes) + { + if (anaSchemes == null || !anaSchemes.Any()) + return; + if (anaSchemes.Count > 10) + return; + + if (anaSchemes.Count == 1) + { + var scheme = anaSchemes[0]; + Model.CurveExpress QH = scheme.CurveInfoQH, QP = scheme.CurveInfoQP; + + var QE = Common.LxpFeatCurveHelper.CalculateE(Model.eCurveFitType.FourM, QH, QP); + chartMultiCurveParallelCtrl1.AddCurve(-1, scheme.MachineName, QH, QE, QP, System.Drawing.Color.Black); + + chartMultiCurveParallelCtrl1.LineVisible = true; + chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ); + return; + } + + var theConnectCurve = new Model.ConnectCurveHelper(); + for (int i = 0; i < anaSchemes.Count; i++) + { + var anaScheme = anaSchemes[i]; + var QH = anaScheme.CurveInfoQH; + var QP = anaScheme.CurveInfoQP; + var QE = Common.LxpFeatCurveHelper.CalculateE(Model.eCurveFitType.CubicCurve, QH, QP); + + + theConnectCurve.AddSinglePumpCurve(QH, QP); + chartMultiCurveParallelCtrl1.AddCurve(anaScheme.PumpCurveID, + anaScheme.MachineName, + QH, + QE, + QP, + ColorArray[i]); + } + + + if (!theConnectCurve.CalculateParallel(out List<IStation.Model.CurvePoint> ConnectCurveQH, + out List<IStation.Model.CurvePoint> ConnectCurveQE, + out List<IStation.Model.CurvePoint> ConnectCurveQP)) + + { + chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ); + MessageBox.Show("杩欎簺娉典笉閫傚悎骞惰仈"); + return; + } + + var curveExpressQH = new Model.CurveExpress(ConnectCurveQH); + var curveExpressQE = new Model.CurveExpress(ConnectCurveQE); + var curveExpressQP = new Model.CurveExpress(ConnectCurveQP); + chartMultiCurveParallelCtrl1.AddCurve(-1, "骞惰仈鏇茬嚎", curveExpressQH, curveExpressQE, curveExpressQP, System.Drawing.Color.Black); + chartMultiCurveParallelCtrl1.LineVisible = true; + chartMultiCurveParallelCtrl1.CalcWorkPointByQ(workQ); + } + + } +} \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx new file mode 100644 index 0000000..61bc649 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ParallelCurveViewDlg.resx @@ -0,0 +1,123 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <value>True</value> + </metadata> +</root> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs new file mode 100644 index 0000000..06fa17b --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.Designer.cs @@ -0,0 +1,584 @@ +锘縩amespace IStation.WinFrmUI.Schedule +{ + partial class ScheduleAnalyPage + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions1 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ScheduleAnalyPage)); + DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject1 = new DevExpress.Utils.SerializableAppearanceObject(); + DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject2 = new DevExpress.Utils.SerializableAppearanceObject(); + DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject3 = new DevExpress.Utils.SerializableAppearanceObject(); + DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject4 = new DevExpress.Utils.SerializableAppearanceObject(); + DevExpress.XtraGrid.GridLevelNode gridLevelNode1 = new DevExpress.XtraGrid.GridLevelNode(); + gridView2 = new DevExpress.XtraGrid.Views.Grid.GridView(); + colPumpID = new DevExpress.XtraGrid.Columns.GridColumn(); + colMachineID = new DevExpress.XtraGrid.Columns.GridColumn(); + colMachineName = new DevExpress.XtraGrid.Columns.GridColumn(); + colIsFrequency = new DevExpress.XtraGrid.Columns.GridColumn(); + colWorkPointQ = new DevExpress.XtraGrid.Columns.GridColumn(); + colWorkPointH = new DevExpress.XtraGrid.Columns.GridColumn(); + colWorkPointE = new DevExpress.XtraGrid.Columns.GridColumn(); + colWorkPointP = new DevExpress.XtraGrid.Columns.GridColumn(); + colIsCurveExtend = new DevExpress.XtraGrid.Columns.GridColumn(); + colFrequence = new DevExpress.XtraGrid.Columns.GridColumn(); + colSpeed = new DevExpress.XtraGrid.Columns.GridColumn(); + colPumpCurve = new DevExpress.XtraGrid.Columns.GridColumn(); + repositoryItemButtonEditCurve = new DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit(); + gridControl1 = new DevExpress.XtraGrid.GridControl(); + currentViewModelBindingSource = new System.Windows.Forms.BindingSource(components); + gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView(); + colCaptain = new DevExpress.XtraGrid.Columns.GridColumn(); + colID = new DevExpress.XtraGrid.Columns.GridColumn(); + colTotalWrkQ = new DevExpress.XtraGrid.Columns.GridColumn(); + colTotalWrkH = new DevExpress.XtraGrid.Columns.GridColumn(); + colTotalWrkE = new DevExpress.XtraGrid.Columns.GridColumn(); + colTotalWrkP = new DevExpress.XtraGrid.Columns.GridColumn(); + colUWP = new DevExpress.XtraGrid.Columns.GridColumn(); + colWP = new DevExpress.XtraGrid.Columns.GridColumn(); + colRunNumber = new DevExpress.XtraGrid.Columns.GridColumn(); + colSpanQ = new DevExpress.XtraGrid.Columns.GridColumn(); + colResultStatus = new DevExpress.XtraGrid.Columns.GridColumn(); + colResultStatusInfo = new DevExpress.XtraGrid.Columns.GridColumn(); + colItemsParas = new DevExpress.XtraGrid.Columns.GridColumn(); + colParallelCurve = new DevExpress.XtraGrid.Columns.GridColumn(); + ribbonControl1 = new DevExpress.XtraBars.Ribbon.RibbonControl(); + barBtnTargetH = new DevExpress.XtraBars.BarEditItem(); + repositoryItemSpinEditH = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit(); + barBtnSetPumpRunConfig = new DevExpress.XtraBars.BarButtonItem(); + barBtnDispatchAnaly = new DevExpress.XtraBars.BarButtonItem(); + barBtnTargetQ = new DevExpress.XtraBars.BarEditItem(); + repositoryItemSpinEditQ = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit(); + ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage(); + ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup(); + ribbonPageGroup3 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup(); + dockManager1 = new DevExpress.XtraBars.Docking.DockManager(components); + dockLeftPanel = new DevExpress.XtraBars.Docking.DockPanel(); + dockPanel1_Container = new DevExpress.XtraBars.Docking.ControlContainer(); + stationListCtrl1 = new Basic.StationListCtrl(); + barStaticItem1 = new DevExpress.XtraBars.BarStaticItem(); + ((System.ComponentModel.ISupportInitialize)gridView2).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemButtonEditCurve).BeginInit(); + ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).BeginInit(); + ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)ribbonControl1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditH).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditQ).BeginInit(); + ((System.ComponentModel.ISupportInitialize)dockManager1).BeginInit(); + dockLeftPanel.SuspendLayout(); + dockPanel1_Container.SuspendLayout(); + SuspendLayout(); + // + // gridView2 + // + gridView2.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colPumpID, colMachineID, colMachineName, colIsFrequency, colWorkPointQ, colWorkPointH, colWorkPointE, colWorkPointP, colIsCurveExtend, colFrequence, colSpeed, colPumpCurve }); + gridView2.DetailHeight = 450; + gridView2.GridControl = gridControl1; + gridView2.Name = "gridView2"; + gridView2.OptionsEditForm.PopupEditFormWidth = 640; + // + // colPumpID + // + colPumpID.FieldName = "PumpID"; + colPumpID.MinWidth = 23; + colPumpID.Name = "colPumpID"; + colPumpID.Width = 86; + // + // colMachineID + // + colMachineID.FieldName = "MachineID"; + colMachineID.MinWidth = 23; + colMachineID.Name = "colMachineID"; + colMachineID.Width = 86; + // + // colMachineName + // + colMachineName.Caption = "鏈烘车"; + colMachineName.FieldName = "MachineName"; + colMachineName.MinWidth = 23; + colMachineName.Name = "colMachineName"; + colMachineName.Visible = true; + colMachineName.VisibleIndex = 0; + colMachineName.Width = 86; + // + // colIsFrequency + // + colIsFrequency.Caption = "鏄惁鍙橀"; + colIsFrequency.FieldName = "IsFrequency"; + colIsFrequency.MinWidth = 23; + colIsFrequency.Name = "colIsFrequency"; + colIsFrequency.Visible = true; + colIsFrequency.VisibleIndex = 1; + colIsFrequency.Width = 86; + // + // colWorkPointQ + // + colWorkPointQ.Caption = "娴侀噺"; + colWorkPointQ.FieldName = "WorkPointQ"; + colWorkPointQ.MinWidth = 23; + colWorkPointQ.Name = "colWorkPointQ"; + colWorkPointQ.Visible = true; + colWorkPointQ.VisibleIndex = 2; + colWorkPointQ.Width = 86; + // + // colWorkPointH + // + colWorkPointH.Caption = "鎵▼"; + colWorkPointH.FieldName = "WorkPointH"; + colWorkPointH.MinWidth = 23; + colWorkPointH.Name = "colWorkPointH"; + colWorkPointH.Visible = true; + colWorkPointH.VisibleIndex = 3; + colWorkPointH.Width = 86; + // + // colWorkPointE + // + colWorkPointE.Caption = "鏁堢巼"; + colWorkPointE.FieldName = "WorkPointE"; + colWorkPointE.MinWidth = 23; + colWorkPointE.Name = "colWorkPointE"; + colWorkPointE.Visible = true; + colWorkPointE.VisibleIndex = 4; + colWorkPointE.Width = 86; + // + // colWorkPointP + // + colWorkPointP.Caption = "鍔熺巼"; + colWorkPointP.FieldName = "WorkPointP"; + colWorkPointP.MinWidth = 23; + colWorkPointP.Name = "colWorkPointP"; + colWorkPointP.Visible = true; + colWorkPointP.VisibleIndex = 5; + colWorkPointP.Width = 86; + // + // colIsCurveExtend + // + colIsCurveExtend.Caption = "鏄惁寤堕暱鏇茬嚎"; + colIsCurveExtend.FieldName = "IsCurveExtend"; + colIsCurveExtend.MinWidth = 23; + colIsCurveExtend.Name = "colIsCurveExtend"; + colIsCurveExtend.Visible = true; + colIsCurveExtend.VisibleIndex = 6; + colIsCurveExtend.Width = 86; + // + // colFrequence + // + colFrequence.Caption = "棰戠巼"; + colFrequence.FieldName = "Frequence"; + colFrequence.MinWidth = 23; + colFrequence.Name = "colFrequence"; + colFrequence.Visible = true; + colFrequence.VisibleIndex = 7; + colFrequence.Width = 86; + // + // colSpeed + // + colSpeed.Caption = "杞��"; + colSpeed.FieldName = "Speed"; + colSpeed.MinWidth = 23; + colSpeed.Name = "colSpeed"; + colSpeed.Visible = true; + colSpeed.VisibleIndex = 8; + colSpeed.Width = 86; + // + // colPumpCurve + // + colPumpCurve.Caption = "鏇茬嚎"; + colPumpCurve.ColumnEdit = repositoryItemButtonEditCurve; + colPumpCurve.MaxWidth = 46; + colPumpCurve.MinWidth = 46; + colPumpCurve.Name = "colPumpCurve"; + colPumpCurve.Width = 46; + // + // repositoryItemButtonEditCurve + // + repositoryItemButtonEditCurve.AutoHeight = false; + editorButtonImageOptions1.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("editorButtonImageOptions1.SvgImage"); + editorButtonImageOptions1.SvgImageSize = new Size(20, 20); + repositoryItemButtonEditCurve.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "", -1, true, true, false, editorButtonImageOptions1, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject1, serializableAppearanceObject2, serializableAppearanceObject3, serializableAppearanceObject4, "鏇茬嚎", null, null, DevExpress.Utils.ToolTipAnchor.Default) }); + repositoryItemButtonEditCurve.Name = "repositoryItemButtonEditCurve"; + repositoryItemButtonEditCurve.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor; + // + // gridControl1 + // + gridControl1.DataSource = currentViewModelBindingSource; + gridControl1.Dock = System.Windows.Forms.DockStyle.Fill; + gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + gridLevelNode1.LevelTemplate = gridView2; + gridLevelNode1.RelationName = "Items"; + gridControl1.LevelTree.Nodes.AddRange(new DevExpress.XtraGrid.GridLevelNode[] { gridLevelNode1 }); + gridControl1.Location = new Point(250, 128); + gridControl1.MainView = gridView1; + gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + gridControl1.MenuManager = ribbonControl1; + gridControl1.Name = "gridControl1"; + gridControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemButtonEditCurve }); + gridControl1.Size = new Size(630, 601); + gridControl1.TabIndex = 5; + gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1, gridView2 }); + // + // gridView1 + // + gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colCaptain, colID, colTotalWrkQ, colTotalWrkH, colTotalWrkE, colTotalWrkP, colUWP, colWP, colRunNumber, colSpanQ, colResultStatus, colResultStatusInfo, colItemsParas, colParallelCurve }); + gridView1.DetailHeight = 450; + gridView1.GridControl = gridControl1; + gridView1.Name = "gridView1"; + gridView1.OptionsEditForm.PopupEditFormWidth = 640; + gridView1.ViewCaption = "娉佃繍琛岃缁�"; + gridView1.RowCellClick += gridView1_RowCellClick; + // + // colCaptain + // + colCaptain.Caption = "寮�娉垫儏鍐�"; + colCaptain.FieldName = "Captain"; + colCaptain.MinWidth = 23; + colCaptain.Name = "colCaptain"; + colCaptain.Visible = true; + colCaptain.VisibleIndex = 0; + colCaptain.Width = 86; + // + // colID + // + colID.FieldName = "ID"; + colID.MinWidth = 23; + colID.Name = "colID"; + colID.Width = 86; + // + // colTotalWrkQ + // + colTotalWrkQ.Caption = "娴侀噺"; + colTotalWrkQ.FieldName = "TotalWrkQ"; + colTotalWrkQ.MinWidth = 23; + colTotalWrkQ.Name = "colTotalWrkQ"; + colTotalWrkQ.Visible = true; + colTotalWrkQ.VisibleIndex = 1; + colTotalWrkQ.Width = 86; + // + // colTotalWrkH + // + colTotalWrkH.Caption = "鎵▼"; + colTotalWrkH.FieldName = "TotalWrkH"; + colTotalWrkH.MinWidth = 23; + colTotalWrkH.Name = "colTotalWrkH"; + colTotalWrkH.Visible = true; + colTotalWrkH.VisibleIndex = 2; + colTotalWrkH.Width = 86; + // + // colTotalWrkE + // + colTotalWrkE.Caption = "鏁堢巼"; + colTotalWrkE.FieldName = "TotalWrkE"; + colTotalWrkE.MinWidth = 23; + colTotalWrkE.Name = "colTotalWrkE"; + colTotalWrkE.Visible = true; + colTotalWrkE.VisibleIndex = 3; + colTotalWrkE.Width = 86; + // + // colTotalWrkP + // + colTotalWrkP.Caption = "鍔熺巼"; + colTotalWrkP.FieldName = "TotalWrkP"; + colTotalWrkP.MinWidth = 23; + colTotalWrkP.Name = "colTotalWrkP"; + colTotalWrkP.Visible = true; + colTotalWrkP.VisibleIndex = 4; + colTotalWrkP.Width = 86; + // + // colUWP + // + colUWP.Caption = "鍗冨惃姘磋兘鑰�"; + colUWP.FieldName = "UWP"; + colUWP.MinWidth = 23; + colUWP.Name = "colUWP"; + colUWP.Visible = true; + colUWP.VisibleIndex = 5; + colUWP.Width = 86; + // + // colWP + // + colWP.Caption = "鑳借��"; + colWP.FieldName = "WP"; + colWP.MinWidth = 23; + colWP.Name = "colWP"; + colWP.Visible = true; + colWP.VisibleIndex = 6; + colWP.Width = 86; + // + // colRunNumber + // + colRunNumber.FieldName = "RunNumber"; + colRunNumber.MinWidth = 23; + colRunNumber.Name = "colRunNumber"; + colRunNumber.Width = 86; + // + // colSpanQ + // + colSpanQ.FieldName = "SpanQ"; + colSpanQ.MinWidth = 23; + colSpanQ.Name = "colSpanQ"; + colSpanQ.Width = 86; + // + // colResultStatus + // + colResultStatus.FieldName = "ResultStatus"; + colResultStatus.MinWidth = 23; + colResultStatus.Name = "colResultStatus"; + colResultStatus.Width = 86; + // + // colResultStatusInfo + // + colResultStatusInfo.FieldName = "ResultStatusInfo"; + colResultStatusInfo.MinWidth = 23; + colResultStatusInfo.Name = "colResultStatusInfo"; + colResultStatusInfo.Width = 86; + // + // colItemsParas + // + colItemsParas.FieldName = "ItemsParas"; + colItemsParas.MinWidth = 23; + colItemsParas.Name = "colItemsParas"; + colItemsParas.Width = 86; + // + // colParallelCurve + // + colParallelCurve.Caption = "鏇茬嚎"; + colParallelCurve.ColumnEdit = repositoryItemButtonEditCurve; + colParallelCurve.ImageOptions.SvgImageSize = new Size(20, 20); + colParallelCurve.MaxWidth = 46; + colParallelCurve.MinWidth = 46; + colParallelCurve.Name = "colParallelCurve"; + colParallelCurve.Visible = true; + colParallelCurve.VisibleIndex = 7; + colParallelCurve.Width = 46; + // + // ribbonControl1 + // + ribbonControl1.DrawGroupsBorderMode = DevExpress.Utils.DefaultBoolean.False; + ribbonControl1.EmptyAreaImageOptions.ImagePadding = new System.Windows.Forms.Padding(34, 38, 34, 38); + ribbonControl1.ExpandCollapseItem.Id = 0; + ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic; + ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnTargetH, barBtnSetPumpRunConfig, barBtnDispatchAnaly, barBtnTargetQ }); + ribbonControl1.Location = new Point(0, 0); + ribbonControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + ribbonControl1.MaxItemId = 26; + ribbonControl1.Name = "ribbonControl1"; + ribbonControl1.OptionsMenuMinWidth = 377; + ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 }); + ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemSpinEditQ, repositoryItemSpinEditH }); + ribbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False; + ribbonControl1.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.False; + ribbonControl1.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide; + ribbonControl1.Size = new Size(880, 128); + ribbonControl1.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden; + // + // barBtnTargetH + // + barBtnTargetH.Caption = "鐩爣鎵▼:"; + barBtnTargetH.Edit = repositoryItemSpinEditH; + barBtnTargetH.EditWidth = 100; + barBtnTargetH.Id = 15; + barBtnTargetH.Name = "barBtnTargetH"; + // + // repositoryItemSpinEditH + // + repositoryItemSpinEditH.AutoHeight = false; + repositoryItemSpinEditH.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) }); + repositoryItemSpinEditH.Name = "repositoryItemSpinEditH"; + // + // barBtnSetPumpRunConfig + // + barBtnSetPumpRunConfig.Caption = "璋冨害閰嶇疆"; + barBtnSetPumpRunConfig.Id = 16; + barBtnSetPumpRunConfig.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetPumpRunConfig.ImageOptions.SvgImage"); + barBtnSetPumpRunConfig.Name = "barBtnSetPumpRunConfig"; + barBtnSetPumpRunConfig.ItemClick += barBtnSetPumpRunConfig_ItemClick; + // + // barBtnDispatchAnaly + // + barBtnDispatchAnaly.Caption = "璋冨害鍒嗘瀽"; + barBtnDispatchAnaly.Id = 17; + barBtnDispatchAnaly.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnDispatchAnaly.ImageOptions.SvgImage"); + barBtnDispatchAnaly.Name = "barBtnDispatchAnaly"; + barBtnDispatchAnaly.ItemClick += barBtnDispatchAnaly_ItemClick; + // + // barBtnTargetQ + // + barBtnTargetQ.Caption = "鐩爣娴侀噺:"; + barBtnTargetQ.Edit = repositoryItemSpinEditQ; + barBtnTargetQ.EditWidth = 100; + barBtnTargetQ.Id = 18; + barBtnTargetQ.Name = "barBtnTargetQ"; + // + // repositoryItemSpinEditQ + // + repositoryItemSpinEditQ.AutoHeight = false; + repositoryItemSpinEditQ.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) }); + repositoryItemSpinEditQ.Name = "repositoryItemSpinEditQ"; + // + // ribbonPage1 + // + ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1, ribbonPageGroup3 }); + ribbonPage1.Name = "ribbonPage1"; + ribbonPage1.Text = "鍩虹鎿嶄綔"; + // + // ribbonPageGroup1 + // + ribbonPageGroup1.ItemLinks.Add(barBtnTargetQ); + ribbonPageGroup1.ItemLinks.Add(barBtnTargetH); + ribbonPageGroup1.Name = "ribbonPageGroup1"; + ribbonPageGroup1.Text = "閰嶇疆"; + // + // ribbonPageGroup3 + // + ribbonPageGroup3.ItemLinks.Add(barBtnSetPumpRunConfig, true); + ribbonPageGroup3.ItemLinks.Add(barBtnDispatchAnaly); + ribbonPageGroup3.Name = "ribbonPageGroup3"; + ribbonPageGroup3.Text = "ribbonPageGroup3"; + // + // dockManager1 + // + dockManager1.Form = this; + dockManager1.RootPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { dockLeftPanel }); + dockManager1.Style = DevExpress.XtraBars.Docking2010.Views.DockingViewStyle.Light; + dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "System.Windows.Forms.StatusBar", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl", "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl", "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl" }); + // + // dockLeftPanel + // + dockLeftPanel.Controls.Add(dockPanel1_Container); + dockLeftPanel.Dock = DevExpress.XtraBars.Docking.DockingStyle.Left; + dockLeftPanel.ID = new Guid("fb87a574-0a5b-48af-8cc2-555feb8cde7a"); + dockLeftPanel.Location = new Point(0, 128); + dockLeftPanel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + dockLeftPanel.Name = "dockLeftPanel"; + dockLeftPanel.Options.ShowCloseButton = false; + dockLeftPanel.OriginalSize = new Size(250, 200); + dockLeftPanel.Size = new Size(250, 601); + dockLeftPanel.Text = "娉电珯鍒楄〃"; + // + // dockPanel1_Container + // + dockPanel1_Container.Controls.Add(stationListCtrl1); + dockPanel1_Container.Location = new Point(0, 28); + dockPanel1_Container.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + dockPanel1_Container.Name = "dockPanel1_Container"; + dockPanel1_Container.Size = new Size(249, 573); + dockPanel1_Container.TabIndex = 0; + // + // stationListCtrl1 + // + stationListCtrl1.Appearance.BackColor = SystemColors.Control; + stationListCtrl1.Appearance.Options.UseBackColor = true; + stationListCtrl1.Dock = System.Windows.Forms.DockStyle.Fill; + stationListCtrl1.Location = new Point(0, 0); + stationListCtrl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + stationListCtrl1.Name = "stationListCtrl1"; + stationListCtrl1.Size = new Size(249, 573); + stationListCtrl1.TabIndex = 0; + // + // barStaticItem1 + // + barStaticItem1.Caption = "barStaticItem1"; + barStaticItem1.Id = 12; + barStaticItem1.Name = "barStaticItem1"; + // + // ScheduleAnalyPage + // + AutoScaleDimensions = new SizeF(8F, 18F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(gridControl1); + Controls.Add(dockLeftPanel); + Controls.Add(ribbonControl1); + Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + Name = "ScheduleAnalyPage"; + Size = new Size(880, 729); + ((System.ComponentModel.ISupportInitialize)gridView2).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemButtonEditCurve).EndInit(); + ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit(); + ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).EndInit(); + ((System.ComponentModel.ISupportInitialize)gridView1).EndInit(); + ((System.ComponentModel.ISupportInitialize)ribbonControl1).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditH).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditQ).EndInit(); + ((System.ComponentModel.ISupportInitialize)dockManager1).EndInit(); + dockLeftPanel.ResumeLayout(false); + dockPanel1_Container.ResumeLayout(false); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DevExpress.XtraBars.Ribbon.RibbonControl ribbonControl1; + private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1; + private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1; + private DevExpress.XtraBars.Docking.DockManager dockManager1; + private DevExpress.XtraBars.Docking.DockPanel dockLeftPanel; + private DevExpress.XtraBars.Docking.ControlContainer dockPanel1_Container; + private DevExpress.XtraBars.BarEditItem barBtnTargetH; + private DevExpress.XtraBars.BarStaticItem barStaticItem1; + private DevExpress.XtraBars.BarButtonItem barBtnSetPumpRunConfig; + private DevExpress.XtraBars.BarButtonItem barBtnDispatchAnaly; + private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup3; + private DevExpress.XtraBars.BarEditItem barBtnTargetQ; + private System.Windows.Forms.BindingSource currentViewModelBindingSource; + private DevExpress.XtraGrid.GridControl gridControl1; + private DevExpress.XtraGrid.Views.Grid.GridView gridView1; + private DevExpress.XtraGrid.Columns.GridColumn colCaptain; + private DevExpress.XtraGrid.Columns.GridColumn colID; + private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkQ; + private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkH; + private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkE; + private DevExpress.XtraGrid.Columns.GridColumn colTotalWrkP; + private DevExpress.XtraGrid.Columns.GridColumn colUWP; + private DevExpress.XtraGrid.Columns.GridColumn colWP; + private DevExpress.XtraGrid.Columns.GridColumn colRunNumber; + private DevExpress.XtraGrid.Columns.GridColumn colSpanQ; + private DevExpress.XtraGrid.Columns.GridColumn colResultStatus; + private DevExpress.XtraGrid.Columns.GridColumn colResultStatusInfo; + private DevExpress.XtraGrid.Columns.GridColumn colItemsParas; + private DevExpress.XtraGrid.Views.Grid.GridView gridView2; + private DevExpress.XtraGrid.Columns.GridColumn colPumpID; + private DevExpress.XtraGrid.Columns.GridColumn colMachineID; + private DevExpress.XtraGrid.Columns.GridColumn colMachineName; + private DevExpress.XtraGrid.Columns.GridColumn colIsFrequency; + private DevExpress.XtraGrid.Columns.GridColumn colWorkPointQ; + private DevExpress.XtraGrid.Columns.GridColumn colWorkPointH; + private DevExpress.XtraGrid.Columns.GridColumn colWorkPointE; + private DevExpress.XtraGrid.Columns.GridColumn colWorkPointP; + private DevExpress.XtraGrid.Columns.GridColumn colIsCurveExtend; + private DevExpress.XtraGrid.Columns.GridColumn colFrequence; + private DevExpress.XtraGrid.Columns.GridColumn colSpeed; + private DevExpress.XtraGrid.Columns.GridColumn colParallelCurve; + private DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit repositoryItemButtonEditCurve; + private DevExpress.XtraGrid.Columns.GridColumn colPumpCurve; + private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditH; + private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditQ; + private Basic.StationListCtrl stationListCtrl1; + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs new file mode 100644 index 0000000..144009b --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.cs @@ -0,0 +1,290 @@ +锘縰sing DevExpress.XtraEditors; +using System.Windows.Forms; + +namespace IStation.WinFrmUI.Schedule +{ + public partial class ScheduleAnalyPage : DocumentPage + { + public ScheduleAnalyPage() + { + InitializeComponent(); + PageTitle.Caption = "浼樺寲璋冨害2"; + gridView1.SetNormalView(); + gridView1.RegistCustomDrawRowIndicator(40); + gridView1.OptionsView.ShowDetailButtons = true; + gridView1.OptionsDetail.ShowDetailTabs = false; + gridView2.SetNormalView(); + + stationListCtrl1.FocusedChangedEvent += StationListCtrl1_FocusedChangedEvent; + } + + + + public class CurrentViewModel + { + + + /// <summary> + /// + /// </summary> + public int ID { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkQ { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkH { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkE { get; set; } + /// <summary> + /// + /// </summary> + public double TotalWrkP { get; set; } + + /// <summary> + /// 鍗冨惃姘磋兘鑰� + /// </summary> + public double UWP { get; set; } + + /// <summary> + /// 鑳借�� + /// </summary> + public double WP { get; set; } + + /// <summary> + /// 寮�娉垫暟閲� + /// </summary> + public int RunNumber + { + get + { + if (Items == null) + return 0; + + return Items.Count(); + } + set => value = RunNumber; + } + + /// <summary> + /// + /// </summary> + public List<AnaSchemeItem> Items { get; set; } + + public string Captain { get; set; } + } + + + + private Model.Station _station = null; + private List<Model.PumpModel> _dispatchPumps = null; + private List<Model.PumpCurve> _allPumpCurves = null; + private List<CurrentViewModel> _allBindingList = null; + + private double _targetQ, _targetH; + private Service.AnalysisParameter _serviceAnalysisParameter = new Service.AnalysisParameter(); + + /// <summary> + /// 鍒濆鍖栨暟鎹� + /// </summary> + public override void InitialDataSource() + { + _station = null; + _dispatchPumps = new List<Model.PumpModel>(); + _allPumpCurves = new BLL.PumpCurve().GetAll(); + _allPumpCurves = new BLL.PumpCurve().GetAll(); + stationListCtrl1.SetBindingData(); + } + + + //娉电珯鍒楄〃鍙樻崲 + private void StationListCtrl1_FocusedChangedEvent(Model.Station obj) + { + _station = obj; + _dispatchPumps = new List<Model.PumpModel>(); + if (_station != null) + { + var pumps = new BLL.Equipment().GetPumpModelListByBelongTypeAndBelongID(IStation.ObjectType.Station, _station.ID); + if (pumps != null && pumps.Any()) + { + var bll = new BLL.PumpCurveMapping(); + foreach (var pump in pumps) + { + Model.PumpModel dispatchPump = null; + var mapping = bll.GetWorkCurveByPumpID(pump.ID); + if (mapping != null) + { + var pumpCurve = _allPumpCurves?.Find(x => x.ID == mapping?.CurveID); + if (pumpCurve==null) + { + TipFormHelper.ShowError($"{pump.Name}:娌℃湁鏇茬嚎锛�"); + } + dispatchPump = new Model.PumpModel(pump, pumpCurve); + } + else + { + dispatchPump = new Model.PumpModel(pump, null); + } + _dispatchPumps.Add(dispatchPump); + } + } + } + } + + //娉佃繍琛岄厤缃� + private void barBtnSetPumpRunConfig_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + if (_station == null) + return; + var dlg = new SetPumpRunStatusDlg(); + dlg.SetBindingData(_dispatchPumps); + if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) + return; + } + + + //璋冨害鍒嗘瀽 + private void barBtnDispatchAnaly_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) + { + _allBindingList = new List<CurrentViewModel>(); + currentViewModelBindingSource.DataSource = _allBindingList; + try + { + + ScheduleAnaly(); + WaitFrmHelper.HideWaitForm(); + } + catch (Exception ex) + { + + throw ex; + } + finally + { + WaitFrmHelper.HideWaitForm(); + } + + } + + /// <summary> + /// 璋冨害鍒嗘瀽 + /// </summary> + private void ScheduleAnaly() + { + _allBindingList = new List<CurrentViewModel>(); + currentViewModelBindingSource.DataSource = _allBindingList; + if (_station == null) return; + if (_dispatchPumps == null || !_dispatchPumps.Any()) return; + + WaitFrmHelper.ShowWaitForm("璁$畻涓�..."); + if (File.Exists(ConfigHelper.AnalysisDbFilePath)) + { + File.Delete(ConfigHelper.AnalysisDbFilePath); + } + + var all_pump_list = _dispatchPumps; + var flags = all_pump_list.Select(x => x.Flag); + if (flags.Distinct().Count() != flags.Count()) + { + TipFormHelper.ShowError("璇风‘瀹氭満缁勭殑鎺掑簭鐮佹槸鍞竴鐨�"); + return; + } + IStation.Service.AnalysisParameter.RemoveDictCache(); + var helperAnalysis = new IStation.Service.AnalysisHelper(); + helperAnalysis.AnalysisPump(all_pump_list); + helperAnalysis.AnalysisParameter(all_pump_list); + + + _targetQ = Convert.ToDouble(barBtnTargetQ.EditValue); + _targetH = Convert.ToDouble(barBtnTargetH.EditValue); + + var config = new Model.ScheduleConfig(); + config.MinOpenCount = 1; + config.MaxOpenCount = all_pump_list.Count; + config.MustCloseFlagList = all_pump_list.Where(x => x.MachineRunStatus == Model.PumpModel.eMachineRunStatus.Close) + .Select(x => x.Flag).ToList(); + + var helper = new Service.ScheduleHelper(); + helper.Initial(null, config); + var ana_combine_list = helper.GetAnaCombineList(all_pump_list, _targetQ, _targetH); + if (ana_combine_list == null || ana_combine_list.Count() == 0) + { + TipFormHelper.ShowError("鏃犺绠楁柟妗�"); + return; + } + + var dict = _dispatchPumps.ToDictionary(x => x.Flag, y => y); + var bllPump = new BLL.Equipment(); + foreach (var rhs in ana_combine_list) + { + + var vm = new CurrentViewModel(); + vm.TotalWrkQ = Math.Round(rhs.TotalFlow, 1); + vm.TotalWrkH = Math.Round(rhs.TotalHead, 1); + vm.TotalWrkE = Math.Round(rhs.TotalEfficiency, 1); + vm.TotalWrkP = Math.Round(rhs.TotalPower, 1); + vm.UWP = Math.Round(rhs.UWP, 1); + vm.WP = Math.Round(rhs.WP, 1); + vm.RunNumber = rhs.AnaFrePumps.Count; + vm.Items = new List<AnaSchemeItem>(); + + foreach (var item in rhs.AnaFrePumps) + { + var pump = dict[item.Flag]; + var qh = pump.CurveQH; + var qp = pump.CurveQP; + var qe = pump.CurveQE; + var sItem = new AnaSchemeItem(); + sItem.PumpCurveID = pump.Flag; + sItem.WorkPointQ = Math.Round(item.Flow, 1); + sItem.WorkPointH = Math.Round(item.Head, 1); + sItem.WorkPointE = Math.Round(item.Eff, 1); + sItem.WorkPointP = Math.Round(item.Power, 1); + + sItem.Frequence = item.Frequency; + sItem.Speed = Math.Round(item.Speed, 1); + sItem.MachineName = dict[item.Flag].Name; + sItem.CurveInfoQH = Model.CurveCalcuHelper.CalculateSimilarQH(qh, 50, item.Frequency); + sItem.CurveInfoQP = Model.CurveCalcuHelper.CalculateSimilarQP(qp, 50, item.Frequency); + var similarQe = Model.CurveCalcuHelper.CalculateSimilarQP(qe, 50, item.Frequency); + var eff = similarQe.GetFitPointY(item.Flow); + vm.Items.Add(sItem); + } + var names = vm.Items.Select(x => x.MachineName); + + vm.Captain = string.Join(",", names); + _allBindingList.Add(vm); + } + this.currentViewModelBindingSource.ResetBindings(false); + } + + + + + //鍗曞厓鏍肩偣鍑讳簨浠� + private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) + { + if (_allPumpCurves == null || !_allPumpCurves.Any()) + return; + + if (e.Column == colParallelCurve) + { + var row = gridView1.GetCurrentViewModel(_allBindingList); + if (row == null) + return; + + var dlg = new ParallelCurveViewDlg(); + dlg.SetBindingData(row.TotalWrkQ, row.Items); + dlg.ShowDialog(); + } + } + + + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx new file mode 100644 index 0000000..b8cad7a --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/ScheduleAnalyPage.resx @@ -0,0 +1,209 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> + <data name="editorButtonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAHoGAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iQ3JlYXRlX1NjYXR0ZXJfQ2hhcnRfU21vb3RoX0xpbmVzIiBzdHlsZT0i + ZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+ + CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8 + cGF0aCBkPSJNMywyNGMwLTMuNSwyLjQtNS42LDQuNi02LjZsMCwwYzIuMi0xLjEsNC4zLTEuMyw0LjQt + MS40bDAsMGMwLDAsMC45LTAuMSwyLjQtMC4zbDAsMCAgYzEuNS0wLjIsMy40LTAuNyw1LjMtMS40bDAs + MEMyMy41LDEyLjgsMjcsMTAuNCwyNyw2bDAsMGgyYzAsNS42LTQuNSw4LjctOC42LDEwLjJsMCwwYy00 + LjIsMS42LTguMiwxLjgtOC4yLDEuOGwwLDAgIGMwLDAtMC40LDAuMS0xLjEsMC4ybDAsMGMtMC43LDAu + Mi0xLjYsMC41LTIuNSwwLjlsMCwwQzYuNiwyMC4xLDUsMjEuNSw1LDI0bDAsMEgzTDMsMjR6IiBjbGFz + cz0iQmx1ZSIgLz4NCiAgPHBhdGggZD0iTTE5LjksMjhMMTkuOSwyOGMwLjEsMCwwLjEsMCwwLjEsMGww + LDBoMGMwLDAsMC4xLDAsMC4xLDBsMCwwYzAsMC0wLjEsMC0wLjEsMGwwLDBDMjAsMjgsMTkuOSwyOCwx + OS45LDI4ICBMMTkuOSwyOHogTTIwLDI4QzE5LjksMjgsMTkuOSwyOCwyMCwyOEwyMCwyOEMxOS45LDI4 + LDE5LjksMjgsMjAsMjhMMjAsMjhoLTAuM2wwLDBjLTIuMi0wLjEtMy45LTEuMi01LjEtMi43bDAsMCAg + Yy0xLjMtMS42LTItMy42LTIuNi01LjVsMCwwYy0xLTMuOS0xLTcuNy0xLTcuOGwwLDBjMCwwLDAtMC45 + LTAuMi0ybDAsMGMtMC4yLTEuMS0wLjYtMi41LTEuMi0zLjJsMCwwQzkuMSw2LjMsOC43LDYsOCw2bDAs + MCAgQzcuMyw2LDYuOSw2LjMsNi40LDYuN2wwLDBDNiw3LjIsNS43LDgsNS41LDguOGwwLDBDNSwxMC40 + LDUsMTIsNSwxMmwwLDBIM2MwLTAuMS0wLjEtNC4xLDEuOS02LjZsMCwwQzUuNiw0LjYsNi43LDQsOCw0 + bDAsMCAgYzEuMywwLDIuNCwwLjYsMy4xLDEuNGwwLDBjMC43LDAuOCwxLjEsMS44LDEuNCwyLjhsMCww + QzEzLDEwLjEsMTMsMTEuOSwxMywxMmwwLDBjMCwwLDAsMiwwLjQsNC42bDAsMGMwLjQsMi42LDEuMyw1 + LjYsMi43LDcuNCAgbDAsMGMxLDEuMiwyLjIsMiwzLjgsMmwwLDB2MGwwLDBsMCwwdjBjMi42LDAsNC4x + LTEuMyw1LjItM2wwLDBjMS4xLTEuNywxLjUtMy45LDEuNy01LjRsMCwwQzI3LDE2LjYsMjcsMTYsMjcs + MTZsMCwwaDIgIGMwLDAuMSwwLDIuOS0xLjEsNS44bDAsMGMtMSwyLjktMy40LDYuMS03LjgsNi4ybDAs + MGMwLDAsMC4xLDAsMC4xLDBsMCwwQzIwLjEsMjgsMjAuMSwyOCwyMCwyOEwyMCwyOEwyMCwyOEwyMCwy + OHogTTIwLjcsMjcuNyAgQzIwLjcsMjcuNywyMC43LDI3LjcsMjAuNywyNy43TDIwLjcsMjcuN2MwLjEt + MC4xLDAuMi0wLjIsMC4yLTAuM2wwLDBsMCwwQzIwLjksMjcuNSwyMC44LDI3LjYsMjAuNywyNy43TDIw + LjcsMjcuN3oiIGNsYXNzPSJZZWxsb3ciIC8+DQo8L3N2Zz4L +</value> + </data> + <metadata name="currentViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>187, 17</value> + </metadata> + <data name="barBtnSetPumpRunConfig.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPsDAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iX3gzM19fVHJhZmZpY19MaWdodHNfUmltbWVkIiBzdHlsZT0iZW5hYmxl + LWJhY2tncm91bmQ6bmV3IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuWWVs + bG93e2ZpbGw6I0ZGQjExNTt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuR3JlZW57ZmlsbDojMDM5QzIz + O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIg + cj0iMyIgY2xhc3M9IkdyZWVuIiAvPg0KICA8Y2lyY2xlIGN4PSIyNSIgY3k9IjkiIHI9IjMiIGNsYXNz + PSJZZWxsb3ciIC8+DQogIDxjaXJjbGUgY3g9IjkiIGN5PSIyNSIgcj0iMyIgY2xhc3M9IlJlZCIgLz4N + CiAgPHBhdGggZD0iTTE1LDJIM0MyLjQsMiwyLDIuNCwyLDN2MTJjMCwwLjYsMC40LDEsMSwxaDEyYzAu + NiwwLDEtMC40LDEtMVYzQzE2LDIuNCwxNS42LDIsMTUsMnogTTksMTQgIGMtMi44LDAtNS0yLjItNS01 + czIuMi01LDUtNXM1LDIuMiw1LDVTMTEuOCwxNCw5LDE0eiBNMzEsMkgxOWMtMC41LDAtMSwwLjUtMSwx + djEyYzAsMC41LDAuNSwxLDEsMWgxMmMwLjUsMCwxLTAuNSwxLTFWMyAgQzMyLDIuNSwzMS41LDIsMzEs + MnogTTI1LDE0Yy0yLjgsMC01LTIuMi01LTVzMi4yLTUsNS01czUsMi4yLDUsNVMyNy44LDE0LDI1LDE0 + eiBNMTUsMThIM2MtMC41LDAtMSwwLjUtMSwxdjEyYzAsMC41LDAuNSwxLDEsMWgxMiAgYzAuNSwwLDEt + MC41LDEtMVYxOUMxNiwxOC41LDE1LjUsMTgsMTUsMTh6IE05LDMwYy0yLjgsMC01LTIuMi01LTVzMi4y + LTUsNS01czUsMi4yLDUsNVMxMS44LDMwLDksMzB6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L +</value> + </data> + <data name="barBtnDispatchAnaly.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40 + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALMDAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H + cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy + NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh + Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkNhbGN1bGF0b3IiPg0KICAgIDxwYXRoIGQ9Ik0y + OSwwSDE2djE0aDE0VjFDMzAsMC41LDI5LjUsMCwyOSwweiBNMjgsOEgxOFY2aDEwVjh6IiBjbGFzcz0i + QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTAsMjljMCwwLjUsMC41LDEsMSwxaDEzVjE2SDBWMjl6IE0y + LjgsMjAuMmwxLjQtMS40TDcsMjEuNmwyLjgtMi44bDEuNCwxLjRMOC40LDIzbDIuOCwyLjhsLTEuNCwx + LjQgICBMNywyNC40bC0yLjgsMi44bC0xLjQtMS40TDUuNiwyM0wyLjgsMjAuMnoiIGNsYXNzPSJCbGFj + ayIgLz4NCiAgICA8cGF0aCBkPSJNMCwxdjEzaDE0VjBIMUMwLjUsMCwwLDAuNSwwLDF6IE0yLDZoNFYy + aDJ2NGg0djJIOHY0SDZWOEgyVjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE2LDE2 + djE0aDEzYzAuNSwwLDEtMC41LDEtMVYxNkgxNnogTTI4LDI2SDE4di0yaDEwVjI2eiBNMjgsMjJIMTh2 + LTJoMTBWMjJ6IiBjbGFzcz0iWWVsbG93IiAvPg0KICA8L2c+DQo8L3N2Zz4L +</value> + </data> + <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs new file mode 100644 index 0000000..82ee133 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.Designer.cs @@ -0,0 +1,276 @@ +锘縩amespace IStation.WinFrmUI.Schedule +{ + partial class SetPumpRunStatusDlg + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + gridControl1 = new DevExpress.XtraGrid.GridControl(); + currentViewModelBindingSource = new System.Windows.Forms.BindingSource(components); + gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView(); + colIsBP = new DevExpress.XtraGrid.Columns.GridColumn(); + colQr = new DevExpress.XtraGrid.Columns.GridColumn(); + colHr = new DevExpress.XtraGrid.Columns.GridColumn(); + colNr = new DevExpress.XtraGrid.Columns.GridColumn(); + colOc = new DevExpress.XtraGrid.Columns.GridColumn(); + colIc = new DevExpress.XtraGrid.Columns.GridColumn(); + colMachineRunStatus = new DevExpress.XtraGrid.Columns.GridColumn(); + colName = new DevExpress.XtraGrid.Columns.GridColumn(); + repositoryItemSpinEditPipeNO = new DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit(); + repositoryItemImageComboBox1 = new DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox(); + repositoryItemTextEditPercentage = new DevExpress.XtraEditors.Repository.RepositoryItemTextEdit(); + layoutControl2 = new DevExpress.XtraLayout.LayoutControl(); + layoutControlGroup3 = new DevExpress.XtraLayout.LayoutControlGroup(); + layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem(); + ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).BeginInit(); + ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditPipeNO).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemImageComboBox1).BeginInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemTextEditPercentage).BeginInit(); + ((System.ComponentModel.ISupportInitialize)layoutControl2).BeginInit(); + layoutControl2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)layoutControlGroup3).BeginInit(); + ((System.ComponentModel.ISupportInitialize)layoutControlItem1).BeginInit(); + SuspendLayout(); + // + // gridControl1 + // + gridControl1.DataSource = currentViewModelBindingSource; + gridControl1.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 5, 3, 5); + gridControl1.Location = new Point(13, 2); + gridControl1.MainView = gridView1; + gridControl1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + gridControl1.Name = "gridControl1"; + gridControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemSpinEditPipeNO, repositoryItemImageComboBox1, repositoryItemTextEditPercentage }); + gridControl1.Size = new Size(997, 470); + gridControl1.TabIndex = 4; + gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 }); + // + // gridView1 + // + gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colIsBP, colQr, colHr, colNr, colOc, colIc, colMachineRunStatus, colName }); + gridView1.DetailHeight = 450; + gridView1.GridControl = gridControl1; + gridView1.Name = "gridView1"; + gridView1.OptionsDetail.EnableMasterViewMode = false; + gridView1.OptionsEditForm.PopupEditFormWidth = 914; + gridView1.SortInfo.AddRange(new DevExpress.XtraGrid.Columns.GridColumnSortInfo[] { new DevExpress.XtraGrid.Columns.GridColumnSortInfo(colIsBP, DevExpress.Data.ColumnSortOrder.Ascending) }); + // + // colIsBP + // + colIsBP.Caption = "鏄惁鍙橀"; + colIsBP.FieldName = "IsBp"; + colIsBP.MinWidth = 23; + colIsBP.Name = "colIsBP"; + colIsBP.Visible = true; + colIsBP.VisibleIndex = 6; + colIsBP.Width = 95; + // + // colQr + // + colQr.Caption = "棰濆畾娴侀噺"; + colQr.FieldName = "Qr"; + colQr.MinWidth = 23; + colQr.Name = "colQr"; + colQr.OptionsColumn.AllowEdit = false; + colQr.OptionsColumn.ReadOnly = true; + colQr.Visible = true; + colQr.VisibleIndex = 1; + colQr.Width = 95; + // + // colHr + // + colHr.Caption = "棰濆畾鎵▼"; + colHr.FieldName = "Hr"; + colHr.MinWidth = 23; + colHr.Name = "colHr"; + colHr.OptionsColumn.AllowEdit = false; + colHr.OptionsColumn.ReadOnly = true; + colHr.Visible = true; + colHr.VisibleIndex = 2; + colHr.Width = 95; + // + // colNr + // + colNr.Caption = "棰濆畾杞��"; + colNr.FieldName = "Nr"; + colNr.MinWidth = 23; + colNr.Name = "colNr"; + colNr.OptionsColumn.AllowEdit = false; + colNr.OptionsColumn.ReadOnly = true; + colNr.Visible = true; + colNr.VisibleIndex = 3; + colNr.Width = 95; + // + // colOc + // + colOc.Caption = "鍑哄彛鍙e緞"; + colOc.FieldName = "Oc"; + colOc.MinWidth = 23; + colOc.Name = "colOc"; + colOc.OptionsColumn.AllowEdit = false; + colOc.OptionsColumn.ReadOnly = true; + colOc.Visible = true; + colOc.VisibleIndex = 4; + colOc.Width = 95; + // + // colIc + // + colIc.Caption = "杩涘彛鍙e緞"; + colIc.FieldName = "Ic"; + colIc.MinWidth = 23; + colIc.Name = "colIc"; + colIc.OptionsColumn.AllowEdit = false; + colIc.OptionsColumn.ReadOnly = true; + colIc.Visible = true; + colIc.VisibleIndex = 5; + colIc.Width = 109; + // + // colMachineRunStatus + // + colMachineRunStatus.Caption = "杩愯鐘舵��"; + colMachineRunStatus.FieldName = "MachineRunStatus"; + colMachineRunStatus.MinWidth = 23; + colMachineRunStatus.Name = "colMachineRunStatus"; + colMachineRunStatus.Visible = true; + colMachineRunStatus.VisibleIndex = 7; + colMachineRunStatus.Width = 96; + // + // colName + // + colName.Caption = "鍚嶇О"; + colName.FieldName = "Name"; + colName.MinWidth = 23; + colName.Name = "colName"; + colName.OptionsColumn.AllowEdit = false; + colName.OptionsColumn.ReadOnly = true; + colName.Visible = true; + colName.VisibleIndex = 0; + colName.Width = 96; + // + // repositoryItemSpinEditPipeNO + // + repositoryItemSpinEditPipeNO.AllowNullInput = DevExpress.Utils.DefaultBoolean.False; + repositoryItemSpinEditPipeNO.AutoHeight = false; + repositoryItemSpinEditPipeNO.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) }); + repositoryItemSpinEditPipeNO.MaskSettings.Set("mask", "d"); + repositoryItemSpinEditPipeNO.MaxValue = new decimal(new int[] { 10, 0, 0, 0 }); + repositoryItemSpinEditPipeNO.MinValue = new decimal(new int[] { 1, 0, 0, 0 }); + repositoryItemSpinEditPipeNO.Name = "repositoryItemSpinEditPipeNO"; + repositoryItemSpinEditPipeNO.NullText = "1"; + repositoryItemSpinEditPipeNO.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; + // + // repositoryItemImageComboBox1 + // + repositoryItemImageComboBox1.AutoHeight = false; + repositoryItemImageComboBox1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo) }); + repositoryItemImageComboBox1.Name = "repositoryItemImageComboBox1"; + // + // repositoryItemTextEditPercentage + // + repositoryItemTextEditPercentage.AutoHeight = false; + repositoryItemTextEditPercentage.MaskSettings.Set("MaskManagerType", typeof(DevExpress.Data.Mask.NumericMaskManager)); + repositoryItemTextEditPercentage.MaskSettings.Set("MaskManagerSignature", "allowNull=False"); + repositoryItemTextEditPercentage.MaskSettings.Set("mask", "P0"); + repositoryItemTextEditPercentage.Name = "repositoryItemTextEditPercentage"; + // + // layoutControl2 + // + layoutControl2.Controls.Add(gridControl1); + layoutControl2.Dock = System.Windows.Forms.DockStyle.Fill; + layoutControl2.Location = new Point(0, 0); + layoutControl2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + layoutControl2.Name = "layoutControl2"; + layoutControl2.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(489, 405, 650, 400); + layoutControl2.Root = layoutControlGroup3; + layoutControl2.Size = new Size(1023, 487); + layoutControl2.TabIndex = 0; + layoutControl2.Text = "layoutControl2"; + // + // layoutControlGroup3 + // + layoutControlGroup3.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True; + layoutControlGroup3.GroupBordersVisible = false; + layoutControlGroup3.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 }); + layoutControlGroup3.Name = "Root"; + layoutControlGroup3.Padding = new DevExpress.XtraLayout.Utils.Padding(11, 11, 0, 13); + layoutControlGroup3.Size = new Size(1023, 487); + layoutControlGroup3.TextVisible = false; + // + // layoutControlItem1 + // + layoutControlItem1.Control = gridControl1; + layoutControlItem1.Location = new Point(0, 0); + layoutControlItem1.Name = "layoutControlItem1"; + layoutControlItem1.Size = new Size(1001, 474); + layoutControlItem1.TextSize = new Size(0, 0); + layoutControlItem1.TextVisible = false; + // + // SetPumpRunStatusDlg + // + AutoScaleDimensions = new SizeF(8F, 18F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new Size(1023, 487); + Controls.Add(layoutControl2); + Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + Name = "SetPumpRunStatusDlg"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + Text = "璋冨害閰嶇疆"; + ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit(); + ((System.ComponentModel.ISupportInitialize)currentViewModelBindingSource).EndInit(); + ((System.ComponentModel.ISupportInitialize)gridView1).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemSpinEditPipeNO).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemImageComboBox1).EndInit(); + ((System.ComponentModel.ISupportInitialize)repositoryItemTextEditPercentage).EndInit(); + ((System.ComponentModel.ISupportInitialize)layoutControl2).EndInit(); + layoutControl2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)layoutControlGroup3).EndInit(); + ((System.ComponentModel.ISupportInitialize)layoutControlItem1).EndInit(); + ResumeLayout(false); + } + + #endregion + private DevExpress.XtraGrid.GridControl gridControl1; + private DevExpress.XtraGrid.Views.Grid.GridView gridView1; + private DevExpress.XtraGrid.Columns.GridColumn colIsBP; + private DevExpress.XtraGrid.Columns.GridColumn colQr; + private DevExpress.XtraGrid.Columns.GridColumn colHr; + private DevExpress.XtraGrid.Columns.GridColumn colNr; + private DevExpress.XtraGrid.Columns.GridColumn colOc; + private DevExpress.XtraGrid.Columns.GridColumn colIc; + private DevExpress.XtraGrid.Columns.GridColumn colMachineRunStatus; + private DevExpress.XtraGrid.Columns.GridColumn colName; + private DevExpress.XtraEditors.Repository.RepositoryItemSpinEdit repositoryItemSpinEditPipeNO; + private DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox repositoryItemImageComboBox1; + private DevExpress.XtraLayout.LayoutControl layoutControl2; + private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup3; + private DevExpress.XtraEditors.Repository.RepositoryItemTextEdit repositoryItemTextEditPercentage; + private System.Windows.Forms.BindingSource currentViewModelBindingSource; + private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1; + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs new file mode 100644 index 0000000..fc2bde2 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.cs @@ -0,0 +1,51 @@ +锘縰sing DevExpress.XtraEditors; +using DevExpress.XtraEditors.Controls; +using System.ComponentModel; + +namespace IStation.WinFrmUI.Schedule +{ + public partial class SetPumpRunStatusDlg : XtraForm + { + public SetPumpRunStatusDlg() + { + InitializeComponent(); + IconOptions.Icon = WinFrmUI.Properties.Resources.App; + gridView1.SetNormalEditView(); + gridView1.ClearSorting(); + gridView1.BorderStyle = BorderStyles.NoBorder; + } + + private BindingList<Model.PumpModel> _allBindingList = null; + public void SetBindingData(List<Model.PumpModel> list) + { + _allBindingList = new BindingList<Model.PumpModel>(); + + if (list != null && list.Any()) + { + list = list.OrderBy(x => x.Name).ToList(); + _allBindingList = new BindingList<Model.PumpModel>(list); + } + + currentViewModelBindingSource.DataSource = _allBindingList; + } + + public List<Model.PumpModel> GetDispatchPumps() + { + return _allBindingList.ToList(); + } + + + + private void btnOk_Click(object sender, System.EventArgs e) + { + gridView1.UpdateCurrentRow(); + gridView1.CloseEditor(); + DialogResult = System.Windows.Forms.DialogResult.OK; + Close(); + } + + + + + } +} diff --git a/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx new file mode 100644 index 0000000..c28dce1 --- /dev/null +++ b/02-desktop/WinFrmUI/IStation.WinFrmUI.Schedule/Schedule/SetPumpRunConfigDlg.resx @@ -0,0 +1,123 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="currentViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root> \ No newline at end of file -- Gitblit v1.9.3