From c297ce1f0704a6dd927d68042df3e31fa36f8194 Mon Sep 17 00:00:00 2001
From: ningshuxia <ningshuxia0927@outlook.com>
Date: 星期一, 29 四月 2024 17:44:59 +0800
Subject: [PATCH] 基础分析差不多 准备开始调度分析

---
 Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper_v3.cs                 |  546 ++++++++++++++++++++++++++++++++
 Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml.user |   10 
 Schedule/IStation.Client/IStation.Client.csproj.user                           |    2 
 Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs                       |  137 ++++++++
 Schedule/IStation.Client/Form1.Designer.cs                                     |   10 
 Schedule/IStation.Algorithm/GlobalUsing.cs                                     |    2 
 Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml      |   13 
 Schedule/IStation.Algorithm/DAL/ScheduleCombine.cs                             |   32 +
 Schedule/IStation.Algorithm/IStation.Algorithm.csproj                          |    2 
 Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper.cs                    |  171 +++------
 Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs                          |   61 ++-
 Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile.pubxml.user  |    2 
 12 files changed, 844 insertions(+), 144 deletions(-)

diff --git a/Schedule/IStation.Algorithm/DAL/ScheduleCombine.cs b/Schedule/IStation.Algorithm/DAL/ScheduleCombine.cs
index 414b858..eb57faa 100644
--- a/Schedule/IStation.Algorithm/DAL/ScheduleCombine.cs
+++ b/Schedule/IStation.Algorithm/DAL/ScheduleCombine.cs
@@ -82,10 +82,35 @@
         }
 
 
+
         /// <summary>
         /// 澶ф壒閲忔彃鍏�
         /// </summary>
-        public bool BulkInserts_SplitTable_Create(string runFlag, List<Entity.ScheduleCombine> list)
+        public async Task<bool> BulkInserts_Create_Async(string runFlag, List<Entity.ScheduleCombine> list)
+        {
+            if (list == null || list.Count < 1)
+                return default;
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = Connection)
+            {
+                var exist_sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}' ;";
+                if (db.Ado.GetInt(exist_sql) < 1)
+                {
+                    var sql_create_table = $"CREATE TABLE {tableName} (\r\n ID   BIGINT NOT NULL\r\n    PRIMARY KEY,\r\n    RunFlag VARCHAR (255),\r\n  RunCount    INTEGER,\r\n    Pump1   REAL,\r\n   Pump2  REAL,\r\n    Pump3   REAL,\r\n   CurveQH    VARCHAR (255),\r\n    CurveQP    VARCHAR (255),\r\n   AnaStatus BIT\r\n);";
+                    if (db.Ado.ExecuteCommand(sql_create_table) < 1)
+                    {
+                        return false;
+                    }
+                }
+                return await db.Fastest<Entity.ScheduleCombine>().AS(tableName).BulkCopyAsync(list) > 0;
+            }
+        }
+
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public bool BulkInserts_Create(string runFlag, List<Entity.ScheduleCombine> list)
         {
             if (list == null || list.Count < 1)
                 return default;
@@ -96,10 +121,7 @@
                 if (db.Ado.ExecuteCommand(exist_sql) < 1)
                 {
                     var sql_create_table = $"CREATE TABLE {tableName} (\r\n ID   BIGINT NOT NULL\r\n    PRIMARY KEY,\r\n    RunFlag VARCHAR (255),\r\n  RunCount    INTEGER,\r\n    Pump1   REAL,\r\n   Pump2  REAL,\r\n    Pump3   REAL,\r\n   CurveQH    VARCHAR (255),\r\n    CurveQP    VARCHAR (255),\r\n   AnaStatus BIT\r\n);";
-                    if (db.Ado.ExecuteCommand(sql_create_table) < 1)
-                    {
-                        return false;
-                    }
+                    db.Ado.ExecuteCommand(sql_create_table);
                 }
                 //澶ф暟鎹啓鍏�
                 return db.Fastest<Entity.ScheduleCombine>().AS(tableName).BulkCopy(list) > 0;
diff --git a/Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs b/Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs
index f41ae35..c101ab8 100644
--- a/Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs
+++ b/Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs
@@ -1,7 +1,4 @@
-锘縰sing MathNet.Numerics.Distributions;
-using System.Collections.Generic;
-
-namespace IStation.DAL
+锘縩amespace IStation.DAL
 {
     /// <summary>
     ///   
@@ -76,7 +73,42 @@
             }
         }
 
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public bool BulkInserts(string runFlag, List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || list.Count < 1)
+                return default;
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = Connection)
+            {
+                return db.Fastest<Entity.ScheduleConclusion>().AS(tableName).BulkCopy(list) > 0;
+            }
+        }
 
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public async Task<bool> BulkInserts_Create_Async(string runFlag, List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || list.Count < 1)
+                return default;
+            var tableName = GetTableName(runFlag);
+            using (SqlSugarClient db = Connection)
+            {
+                var exist_sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}' ;";
+                if (db.Ado.GetInt(exist_sql) < 1)
+                {
+                    var sql_create_table = $"CREATE TABLE  {tableName}  (\r\n   ID BIGINT  NOT NULL\r\n PRIMARY KEY,\r\n    ScheduleCombineID BIGINT,\r\n   RunFlag    VARCHAR (255),\r\n   Pump1   REAL,\r\n   Pump2   REAL,\r\n   Pump3   REAL,\r\n   Head   REAL,\r\n    Flow    REAL,\r\n   Power  REAL,\r\n    WP  REAL,\r\n   UWP    REAL\r\n);";
+                    if (db.Ado.ExecuteCommand(sql_create_table) < 1)
+                    {
+                        return false;
+                    }
+                }
+                return await db.Fastest<Entity.ScheduleConclusion>().AS(tableName).BulkCopyAsync(list) > 0;
+            }
+        }
 
         /// <summary>
         /// 澶ф壒閲忔彃鍏�
@@ -99,10 +131,11 @@
             }
         }
 
+
         /// <summary>
         /// 澶ф壒閲忔彃鍏�
         /// </summary>
-        public bool BulkInserts_SplitTable_Create(string runFlag, List<Entity.ScheduleConclusion> list)
+        public bool BulkInserts_Create(string runFlag, List<Entity.ScheduleConclusion> list)
         {
             if (list == null || list.Count < 1)
                 return default;
@@ -113,29 +146,13 @@
                 if (db.Ado.GetInt(exist_sql) < 1)
                 {
                     var sql_create_table = $"CREATE TABLE  {tableName}  (\r\n   ID BIGINT  NOT NULL\r\n PRIMARY KEY,\r\n    ScheduleCombineID BIGINT,\r\n   RunFlag    VARCHAR (255),\r\n   Pump1   REAL,\r\n   Pump2   REAL,\r\n   Pump3   REAL,\r\n   Head   REAL,\r\n    Flow    REAL,\r\n   Power  REAL,\r\n    WP  REAL,\r\n   UWP    REAL\r\n);";
-                    if (db.Ado.ExecuteCommand(sql_create_table) < 1)
-                    {
-                        return false;
-                    }
+                    db.Ado.ExecuteCommand(sql_create_table);
                 }
                 //澶ф暟鎹啓鍏�
                 return db.Fastest<Entity.ScheduleConclusion>().AS(tableName).BulkCopy(list) > 0;
             }
         }
 
-        /// <summary>
-        /// 澶ф壒閲忔彃鍏�
-        /// </summary>
-        public bool BulkInserts(string runFlag, List<Entity.ScheduleConclusion> list)
-        {
-            if (list == null || list.Count < 1)
-                return default;
-            var tableName = GetTableName(runFlag);
-            using (SqlSugarClient db = Connection)
-            {
-                return db.Fastest<Entity.ScheduleConclusion>().AS(tableName).BulkCopy(list) > 0;
-            }
-        }
 
 
         /// <summary>
diff --git a/Schedule/IStation.Algorithm/GlobalUsing.cs b/Schedule/IStation.Algorithm/GlobalUsing.cs
index 646da18..c2d12f6 100644
--- a/Schedule/IStation.Algorithm/GlobalUsing.cs
+++ b/Schedule/IStation.Algorithm/GlobalUsing.cs
@@ -5,7 +5,7 @@
 global using SqlSugar;
 global using System.ComponentModel;
 global using System.Data.SQLite;
+global using System.Diagnostics;
 global using System.Reflection;
 global using System.Text;
 global using Yitter.IdGenerator;
-
diff --git a/Schedule/IStation.Algorithm/IStation.Algorithm.csproj b/Schedule/IStation.Algorithm/IStation.Algorithm.csproj
index be066c3..36d7d7a 100644
--- a/Schedule/IStation.Algorithm/IStation.Algorithm.csproj
+++ b/Schedule/IStation.Algorithm/IStation.Algorithm.csproj
@@ -32,8 +32,8 @@
 	  <Compile Remove="Model\Schedule\ScheduleCombine - 澶嶅埗.cs" />
 	  <Compile Remove="Schedule\ScheduleCalc - 澶嶅埗.cs" />
 	  <Compile Remove="Schedule\ScheduleCalc1.cs" />
-	  <Compile Remove="Schedule\SchedulingAnaHelper - 澶嶅埗.cs" />
 	  <Compile Remove="Schedule\SchedulingAnaHelper_v1.cs" />
+	  <Compile Remove="Schedule\SchedulingAnaHelper_v3.cs" />
 	  <Compile Remove="Schedule\SchedulingCombineAnaHelper - 澶嶅埗.cs" />
 	</ItemGroup>
 
diff --git a/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper.cs b/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper.cs
index e2b3553..38a5f47 100644
--- a/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper.cs
+++ b/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper.cs
@@ -124,13 +124,14 @@
         /// </summary>
         /// <param name="pumps">娉靛垪琛�</param>
         /// <returns></returns>
-        public bool AnaCombine(List<Pump> pumps)
+        public void AnaCombine(List<Pump> pumps)
         {
+
             InsertAnaLog("寮�濮嬪垎鏋愭车缁勫悎");
             if (pumps == null || pumps.Count < 1)
             {
                 InsertAnaLog("鍒嗘瀽澶辫触:pumps == null || pumps.Count < 1");
-                return false;
+                return;
             }
             var fre_def = _frequency_def;
             var anaPumpItems = new List<AnaPumpItem>();
@@ -155,7 +156,7 @@
             if (anaPumpItems.Count < 1)
             {
                 InsertAnaLog("鍒嗘瀽澶辫触:anaPumpItems.Count < 1");
-                return false;
+                return;
             }
 
 
@@ -173,7 +174,6 @@
                 {
                     case 1:
                         {
-
                             for (int i = 0; i < pumpCombineCount; i++)
                             {
 
@@ -198,15 +198,8 @@
                                     scheduleCombine.AnaStatus = false;
                                     list.Add(scheduleCombine);
                                 }
-                                var bol = BulkInsertScheduleCombineList(runFlag, list);
-                                if (bol)
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
-                                }
-                                else
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
-                                }
+
+                                InsertCombine(i + 1, runFlag, list);
                             }
                             InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
                         }
@@ -252,15 +245,7 @@
                                         list.Add(scheduleCombine);
                                     }
                                 }
-                                var bol = BulkInsertScheduleCombineList(runFlag, list);
-                                if (bol)
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
-                                }
-                                else
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
-                                }
+                                InsertCombine(i + 1, runFlag, list);
                             }
                             InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
                         }
@@ -312,15 +297,7 @@
                                         }
                                     }
                                 }
-                                var bol = BulkInsertScheduleCombineList(runFlag, list);
-                                if (bol)
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
-                                }
-                                else
-                                {
-                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
-                                }
+                                InsertCombine(i + 1, runFlag, list);
                             }
                             InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
                         }
@@ -328,42 +305,38 @@
                     default: break;
                 }
             }
-            InsertAnaLog("鍒嗘瀽娉电粍鍚堝畬鎴�");
-            return true;
         }
+
+
 
         /// <summary>
         /// 鍒嗘瀽缁撹
         /// </summary>
         public void AnaConclusion()
         {
-            //_dalScheduleConclusion.DeleteAllTable();
-            //return;
-            InsertAnaLog("寮�濮嬪垎鏋愭车缁勫悎缁撹");
+            InsertAnaLog($"寮�濮嬪垎鏋愭车缁勫悎缁撹!");
+            _dalScheduleConclusion.DeleteAllTable();
             var scheduleCombineTableNames = _dal.GetAllTableName();
             if (scheduleCombineTableNames == null || !scheduleCombineTableNames.Any())
             {
-                InsertAnaLog("鍒嗘瀽澶辫触:scheduleCombineTableNames == null || !scheduleCombineTableNames.Any()");
+                InsertAnaLog($"鏃犳车缁勫悎琛�!");
                 return;
             }
             var tableCount = scheduleCombineTableNames.Count();
-            InsertAnaLog($"鍒嗘瀽杩涘害:{tableCount}涓粍鍚�");
+            InsertAnaLog($"鍒嗘瀽{tableCount}涓粍鍚�!");
             for (int tableIndex = 0; tableIndex < tableCount; tableIndex++)
             {
                 var tableName = scheduleCombineTableNames[tableIndex];
-                var runFlag = tableName.Split('_').Last();
-                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},绗瑊tableIndex + 1}涓�");
                 var scheduleCombineList = _dal.GetAllUnanalyzedAnaByTableName(tableName);
                 if (scheduleCombineList == null || !scheduleCombineList.Any())
                 {
-                    InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},鍒嗘瀽瀹屾瘯");
+                    InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},绗瑊tableIndex + 1}涓�,鍒嗘瀽瀹屾瘯");
                     continue;
                 }
                 var scheduleCombineListCount = scheduleCombineList.Count();
-                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},{scheduleCombineListCount}鏉℃湭鍒嗘瀽鏁版嵁");
-
                 var scheduleConclusionList = new List<List<Entity.ScheduleConclusion>>(scheduleCombineListCount);
                 var scheduleCombineIds = new List<long>(scheduleCombineListCount);
+
                 for (int combineIndex = 0; combineIndex < scheduleCombineListCount; combineIndex++)
                 {
                     var scheduleCombine = scheduleCombineList[combineIndex];
@@ -373,9 +346,7 @@
                     var curveQP = JsonHelper.Json2Object<Curve.CurveExpress>(scheduleCombine.CurveQP);
                     var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
                     if (!bol)
-                    {
-                        continue;
-                    }
+                        return;
                     var maxHead = Math.Ceiling(maxY);
                     var minHead = Math.Floor(minY);
 
@@ -388,7 +359,6 @@
                         {
                             continue;
                         }
-
                         var scheduleConclusion = new Entity.ScheduleConclusion();
                         scheduleConclusion.ScheduleCombineID = scheduleCombineID;
                         scheduleConclusion.RunFlag = scheduleCombine.RunFlag;
@@ -407,10 +377,9 @@
                 }
                 SetAnaStatus(tableName, scheduleCombineIds);
                 var list = scheduleConclusionList.SelectMany(x => x.ToList()).ToList();
-                BulkInsertScheduleConclusionList(runFlag, list);
-                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},{scheduleCombineIds.Count}鏉�,鍒嗘瀽瀹屾瘯");
+                var runFlag = list[0].RunFlag;
+                InsertConclusion(tableIndex + 1, runFlag, list);
             }
-            InsertAnaLog("娉电粍鍚堝垎鏋愬畬姣�");
         }
 
 
@@ -444,75 +413,61 @@
             return _dal.ExistTable(runFlag);
         }
 
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
-        /// </summary> 
-        private bool BulkInsertScheduleCombineList(List<Entity.ScheduleCombine> list)
-        {
-            if (list == null || !list.Any())
-                return false;
-            var bol = _dal.BulkInserts_SplitTable(list);
-            return bol;
-        }
 
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
-        /// </summary> 
-        private bool BulkInsertScheduleCombineList(string runFlag, List<Entity.ScheduleCombine> list)
+        public void InsertCombine(int index, string runFlag, List<Entity.ScheduleCombine> list)
         {
             if (list == null || !list.Any())
-                return false;
-            var bol = _dal.BulkInserts_SplitTable_Create(runFlag, list);
-            return bol;
-        }
-
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
-        /// </summary> 
-        private bool BulkInsert_NativeSql_ScheduleCombineList(string runFlag, List<Entity.ScheduleCombine> list)
-        {
-            if (list == null || !list.Any())
-                return false;
-            var bol = _dal.BulkInserts_NativeSql(runFlag, list);
-            return bol;
+            {
+                var log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�";
+                InsertAnaLog(log);
+                return;
+            }
+            Task.Run(() =>
+            {
+                var sw = Stopwatch.StartNew();
+                var db = new DAL.ScheduleCombine();
+                db.BulkInserts_Create(runFlag, list);
+                var log = $"{runFlag}:涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m";
+                InsertAnaLog(log);
+            });
         }
 
 
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
-        /// </summary> 
-        private bool BulkInsertScheduleConclusionList(List<Entity.ScheduleConclusion> list)
+        public void InsertConclusion(int index, string runFlag, List<Entity.ScheduleConclusion> list)
         {
             if (list == null || !list.Any())
-                return false;
-            var bol = _dalScheduleConclusion.BulkInserts_SplitTable(list);
-            return bol;
+            {
+                var log = $"{runFlag}:涓嬫爣:{index},鏃犳暟鎹�";
+                InsertAnaLog(log);
+                return;
+            }
+            Task.Run(() =>
+            {
+                var sw = Stopwatch.StartNew();
+                var db = new DAL.ScheduleConclusion();
+                db.BulkInserts_Create(runFlag, list);
+                var log = $"鍒嗘瀽杩涘害:{runFlag},涓嬫爣:{index},鏁伴噺:{list.Count},鎻掑叆鑰楁椂:{sw.ElapsedMilliseconds / 1000}m";
+                InsertAnaLog(log);
+            });
         }
-
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
-        /// </summary> 
-        private bool BulkInsertScheduleConclusionList(string runFlag, List<Entity.ScheduleConclusion> list)
-        {
-            if (list == null || !list.Any())
-                return false;
-            var bol = _dalScheduleConclusion.BulkInserts_SplitTable_Create(runFlag, list);
-            return bol;
-        }
-
-        /// <summary>
-        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
-        /// </summary> 
-        private bool BulkInsert_NativeSql_ScheduleConclusionList(string runFalg, List<Entity.ScheduleConclusion> list)
-        {
-            if (list == null || !list.Any())
-                return false;
-            var bol = _dalScheduleConclusion.BulkInserts_NativeSql(runFalg, list);
-            return bol;
-        }
-
     }
 
 
 }
 
+//public void Run(Action action, string description)
+//{
+//    Stopwatch sw = Stopwatch.StartNew();
+//    action();
+//    var log = $"--> {description}:{sw.ElapsedMilliseconds / 1000}m";
+//    InsertAnaLog(log);
+//}
+
+//public T Run<T>(Func<T> func, string description)
+//{
+//    var sw = Stopwatch.StartNew();
+//    T result = func();
+//    var log = $"--> {description}:{sw.ElapsedMilliseconds / 1000}m";
+//    InsertAnaLog(log);
+//    return result;
+//}
\ No newline at end of file
diff --git a/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper_v3.cs b/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper_v3.cs
new file mode 100644
index 0000000..db09632
--- /dev/null
+++ b/Schedule/IStation.Algorithm/Schedule/SchedulingAnaHelper_v3.cs
@@ -0,0 +1,546 @@
+锘縩amespace IStation.Algorithm.V3
+{
+    #region ViewModel
+
+    /// <summary>
+    /// 鍒嗘瀽娉甸」
+    /// </summary>
+    public class AnaPumpItem
+    {
+        public AnaPumpItem() { }
+        public AnaPumpItem(Pump rhs)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            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;
+            }
+        }
+        public AnaPumpItem(Pump rhs, double freDef, double freMin, double freMax, double freSpace) : this(rhs)
+        {
+            this.CalcFrequencyItems(freDef, freMin, freMax, freSpace);
+        }
+
+        public int ID { get; set; }
+        public string Code { get; set; }
+        public string Name { get; set; }
+        public double Qr { get; set; }
+        public double Hr { get; set; }
+        public double Nr { get; set; }
+        public double Pr { get; set; }
+        public double Er { get; set; }
+        public bool IsBp { get; set; }
+        public Curve.CurveExpress CurveQH { get; set; }
+        public Curve.CurveExpress CurveQP { get; set; }
+        public List<AnaPumpFreItem> AnaFrequencyItems { get; set; }
+        public bool AllowCalc { get; set; }
+
+        void CalcFrequencyItems(double freDef, double freMin, double freMax, double freSpace)
+        {
+            if (!this.AllowCalc)
+                return;
+            this.AnaFrequencyItems = new List<AnaPumpFreItem>();
+            for (double fre = freMax; fre >= freMin; fre -= freSpace)
+            {
+                var freItem = new AnaPumpFreItem();
+                freItem.Frequency = Math.Round(fre, 1);
+                freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(this.CurveQH, freDef, fre);
+                freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(this.CurveQP, freDef, fre);
+                this.AnaFrequencyItems.Add(freItem);
+            }
+        }
+    }
+
+    /// <summary>
+    /// 鍒嗘瀽娉靛彉棰戦」
+    /// </summary>
+    public class AnaPumpFreItem
+    {
+        public double Frequency { get; set; }
+        public Curve.CurveExpress CurveQH { get; set; }
+        public Curve.CurveExpress CurveQP { get; set; }
+    }
+
+    #endregion
+
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫�
+    /// </summary>
+    public class SchedulingAnaHelper_v3
+    {
+        double _frequency_def = 50;
+        double _frequency_min = 25;
+        double _frequency_max = 50;
+        double _frequency_space = 0.1;//棰戠巼闂撮殧  
+
+        double _head_space = 0.1;//鎵▼闂撮殧
+
+        #region RunFlag
+        string _falgFrePumpTag = "B";
+        string _falgFixPumpTag = "G";
+        string _falgSpaceMark = "_";
+
+        string GetRunFlag(List<AnaPumpItem> pumpItems)
+        {
+            var tableName = string.Empty;
+            var count = pumpItems.Count;
+            pumpItems = pumpItems.OrderBy(p => p.ID).ToList();
+            for (int i = 0; i < count; i++)
+            {
+                var pumpItem = pumpItems[i];
+                tableName += GetRunFlag(pumpItem);
+                if ((i + 1) != count)
+                {
+                    tableName += _falgSpaceMark;
+                }
+            }
+            return tableName;
+        }
+
+        string GetRunFlag(AnaPumpItem pumpItem)
+        {
+            return (pumpItem.IsBp ? _falgFrePumpTag : _falgFixPumpTag) + pumpItem.ID;
+        }
+
+        #endregion
+
+        DAL.ScheduleCombine _dal = new DAL.ScheduleCombine();
+        DAL.ScheduleConclusion _dalScheduleConclusion = new DAL.ScheduleConclusion();
+        DAL.ScheduleAnaLog _dalAnaLog = new DAL.ScheduleAnaLog();
+
+
+        /// <summary>
+        /// 鍒嗘瀽娉电粍鍚�
+        /// </summary>
+        /// <param name="pumps">娉靛垪琛�</param>
+        /// <returns></returns>
+        public bool AnaCombine(List<Pump> pumps)
+        {
+            InsertAnaLog("寮�濮嬪垎鏋愭车缁勫悎");
+            if (pumps == null || pumps.Count < 1)
+            {
+                InsertAnaLog("鍒嗘瀽澶辫触:pumps == null || pumps.Count < 1");
+                return false;
+            }
+            var fre_def = _frequency_def;
+            var anaPumpItems = new List<AnaPumpItem>();
+            foreach (var pump in pumps)
+            {
+                if (pump.IsBp)
+                {
+                    //鍙橀娉�
+                    var anaPump = new AnaPumpItem(pump, fre_def, _frequency_min, _frequency_max, _frequency_space);
+                    if (anaPump.AllowCalc)
+                        anaPumpItems.Add(anaPump);
+                }
+                else
+                {
+                    //鍥洪娉�
+                    var anaPump = new AnaPumpItem(pump);
+                    if (anaPump.AllowCalc)
+                        anaPumpItems.Add(anaPump);
+                }
+            }
+
+            if (anaPumpItems.Count < 1)
+            {
+                InsertAnaLog("鍒嗘瀽澶辫触:anaPumpItems.Count < 1");
+                return false;
+            }
+
+
+            string runFlag;
+            List<AnaPumpFreItem> pump1, pump2, pump3;
+            var maxPumpCount = 2;
+            var anaPumpItemsArray = anaPumpItems.ToArray();
+            var parallelHelper = new ParallelConnectionHelper();
+            for (int pumpCount = 1; pumpCount <= maxPumpCount; pumpCount++)
+            {
+                var pumpCombineList = PermutationAndCombination<AnaPumpItem>.GetCombination(anaPumpItemsArray, pumpCount);
+                var pumpCombineCount = pumpCombineList.Count;
+                InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{pumpCombineCount}涓粍鍚�");
+                switch (pumpCount)
+                {
+                    case 1:
+                        {
+                            for (int i = 0; i < pumpCombineCount; i++)
+                            {
+
+                                var pumpCombine = pumpCombineList[i].ToList();
+                                pump1 = pumpCombine[0].AnaFrequencyItems;
+                                runFlag = GetRunFlag(pumpCombine);
+                                InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag},绗瑊i + 1}涓粍鍚�");
+                                if (ExistTable(runFlag))
+                                {
+                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}宸插瓨鍦�");
+                                    continue;
+                                }
+                                var list = new List<Entity.ScheduleCombine>(pump1.Count);
+                                foreach (var freItem in pump1)
+                                {
+                                    var scheduleCombine = new Entity.ScheduleCombine();
+                                    scheduleCombine.RunFlag = runFlag;
+                                    scheduleCombine.RunCount = pumpCount;
+                                    scheduleCombine.Pump1 = freItem.Frequency;
+                                    scheduleCombine.CurveQH = freItem.CurveQH.ToJson();
+                                    scheduleCombine.CurveQP = freItem.CurveQP.ToJson();
+                                    scheduleCombine.AnaStatus = false;
+                                    list.Add(scheduleCombine);
+                                }
+
+                                BulkInsert_Async_ScheduleCombineList(runFlag, list);
+
+                                //var bol = BulkInsert_Async_ScheduleCombineList(runFlag, list);
+                                //if (bol)
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
+                                //}
+                                //else
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
+                                //}
+                            }
+                            InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
+                        }
+                        break;
+                    case 2:
+                        {
+
+                            for (int i = 0; i < pumpCombineCount; i++)
+                            {
+                                var pumpCombine = pumpCombineList[i].ToList();
+                                pump1 = pumpCombine[0].AnaFrequencyItems;
+                                pump2 = pumpCombine[1].AnaFrequencyItems;
+                                runFlag = GetRunFlag(pumpCombine);
+                                InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag},绗瑊i + 1}涓粍鍚�");
+                                if (ExistTable(runFlag))
+                                {
+                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}宸插瓨鍦�");
+                                    continue;
+                                }
+                                var list = new List<Entity.ScheduleCombine>(pump1.Count * pump2.Count);
+                                for (int pump1Index = 0; pump1Index < pump1.Count; pump1Index++)
+                                {
+                                    for (int pump2Index = 0; pump2Index < pump2.Count; pump2Index++)
+                                    {
+                                        var freItem1 = pump1[pump1Index];
+                                        var freItem2 = pump2[pump2Index];
+
+                                        parallelHelper.ClearCurve();
+                                        parallelHelper.AddCurve(freItem1.CurveQH, freItem1.CurveQP);
+                                        parallelHelper.AddCurve(freItem2.CurveQH, freItem2.CurveQP);
+                                        var allowParallel = parallelHelper.CalculateParallel(out List<CurvePoint> pointQH, out List<CurvePoint> pointQE, out List<CurvePoint> pointQP);
+                                        if (!allowParallel)
+                                            continue;
+
+                                        var scheduleCombine = new Entity.ScheduleCombine();
+                                        scheduleCombine.RunFlag = runFlag;
+                                        scheduleCombine.RunCount = pumpCount;
+                                        scheduleCombine.Pump1 = freItem1.Frequency;
+                                        scheduleCombine.Pump2 = freItem2.Frequency;
+                                        scheduleCombine.CurveQH = FitHelper.BuildCurveExpress(pointQH).ToJson();
+                                        scheduleCombine.CurveQP = FitHelper.BuildCurveExpress(pointQP).ToJson();
+                                        scheduleCombine.AnaStatus = false;
+                                        list.Add(scheduleCombine);
+                                    }
+                                }
+                                BulkInsert_Async_ScheduleCombineList(runFlag, list);
+                                //var bol = BulkInsert_Async_ScheduleCombineList(runFlag, list);
+                                //if (bol)
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
+                                //}
+                                //else
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
+                                //}
+                            }
+                            InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
+                        }
+                        break;
+                    case 3:
+                        {
+
+                            for (int i = 0; i < pumpCombineCount; i++)
+                            {
+                                var pumpCombine = pumpCombineList[i].ToList();
+                                pump1 = pumpCombine[0].AnaFrequencyItems;
+                                pump2 = pumpCombine[1].AnaFrequencyItems;
+                                pump3 = pumpCombine[2].AnaFrequencyItems;
+                                runFlag = GetRunFlag(pumpCombine);
+                                InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag},绗瑊i + 1}涓粍鍚�");
+                                if (ExistTable(runFlag))
+                                {
+                                    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}宸插瓨鍦�");
+                                    continue;
+                                }
+                                var list = new List<Entity.ScheduleCombine>(pump1.Count * pump2.Count * pump3.Count);
+                                for (int pump1Index = 0; pump1Index < pump1.Count; pump1Index++)
+                                {
+                                    for (int pump2Index = 0; pump2Index < pump2.Count; pump2Index++)
+                                    {
+                                        for (int pump3Index = 0; pump3Index < pump3.Count; pump3Index++)
+                                        {
+                                            var freItem1 = pump1[pump1Index];
+                                            var freItem2 = pump2[pump2Index];
+                                            var freItem3 = pump3[pump3Index];
+
+                                            parallelHelper.ClearCurve();
+                                            parallelHelper.AddCurve(freItem1.CurveQH, freItem1.CurveQP);
+                                            parallelHelper.AddCurve(freItem2.CurveQH, freItem2.CurveQP);
+                                            parallelHelper.AddCurve(freItem3.CurveQH, freItem3.CurveQP);
+                                            var allowParallel = parallelHelper.CalculateParallel(out List<CurvePoint> pointQH, out List<CurvePoint> pointQE, out List<CurvePoint> pointQP);
+                                            if (!allowParallel)
+                                                continue;
+                                            var scheduleCombine = new Entity.ScheduleCombine();
+                                            scheduleCombine.RunFlag = runFlag;
+                                            scheduleCombine.RunCount = pumpCount;
+                                            scheduleCombine.Pump1 = freItem1.Frequency;
+                                            scheduleCombine.Pump2 = freItem2.Frequency;
+                                            scheduleCombine.Pump3 = freItem3.Frequency;
+                                            scheduleCombine.CurveQH = FitHelper.BuildCurveExpress(pointQH).ToJson();
+                                            scheduleCombine.CurveQP = FitHelper.BuildCurveExpress(pointQP).ToJson();
+                                            scheduleCombine.AnaStatus = false;
+                                            list.Add(scheduleCombine);
+                                        }
+                                    }
+                                }
+                                BulkInsert_Async_ScheduleCombineList(runFlag, list);
+                                //var bol = BulkInsertScheduleCombineList(runFlag, list);
+                                //if (bol)
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆鎴愬姛!");
+                                //}
+                                //else
+                                //{
+                                //    InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,{runFlag}-{list.Count},鎻掑叆澶辫触!");
+                                //}
+                            }
+                            InsertAnaLog($"鍒嗘瀽杩涘害:{pumpCount}鍙版车,鍒嗘瀽瀹屾瘯!");
+                        }
+                        break;
+                    default: break;
+                }
+            }
+            InsertAnaLog("鍒嗘瀽娉电粍鍚堝畬鎴�");
+            return true;
+        }
+
+
+
+        /// <summary>
+        /// 鍒嗘瀽缁撹
+        /// </summary>
+        public void AnaConclusion()
+        {
+            //_dalScheduleConclusion.DeleteAllTable();
+            //return;
+            InsertAnaLog("寮�濮嬪垎鏋愭车缁勫悎缁撹");
+            var scheduleCombineTableNames = _dal.GetAllTableName();
+            if (scheduleCombineTableNames == null || !scheduleCombineTableNames.Any())
+            {
+                InsertAnaLog("鍒嗘瀽澶辫触:scheduleCombineTableNames == null || !scheduleCombineTableNames.Any()");
+                return;
+            }
+            var tableCount = scheduleCombineTableNames.Count();
+            InsertAnaLog($"鍒嗘瀽杩涘害:{tableCount}涓粍鍚�");
+            for (int tableIndex = 0; tableIndex < tableCount; tableIndex++)
+            {
+                var tableName = scheduleCombineTableNames[tableIndex];
+                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},绗瑊tableIndex + 1}涓�");
+                var scheduleCombineList = _dal.GetAllUnanalyzedAnaByTableName(tableName);
+                if (scheduleCombineList == null || !scheduleCombineList.Any())
+                {
+                    InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},鍒嗘瀽瀹屾瘯");
+                    continue;
+                }
+                var scheduleCombineListCount = scheduleCombineList.Count();
+                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},{scheduleCombineListCount}鏉℃湭鍒嗘瀽鏁版嵁");
+
+                var scheduleConclusionList = new List<List<Entity.ScheduleConclusion>>(scheduleCombineListCount);
+                var scheduleCombineIds = new List<long>(scheduleCombineListCount);
+                for (int combineIndex = 0; combineIndex < scheduleCombineListCount; combineIndex++)
+                {
+                    var scheduleCombine = scheduleCombineList[combineIndex];
+                    var scheduleCombineID = scheduleCombine.ID;
+                    scheduleCombineIds.Add(scheduleCombineID);
+                    var curveQH = JsonHelper.Json2Object<Curve.CurveExpress>(scheduleCombine.CurveQH);
+                    var curveQP = JsonHelper.Json2Object<Curve.CurveExpress>(scheduleCombine.CurveQP);
+                    var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
+                    if (!bol)
+                    {
+                        continue;
+                    }
+                    var maxHead = Math.Ceiling(maxY);
+                    var minHead = Math.Floor(minY);
+
+                    var currentListCount = (int)((maxHead - minHead) / _head_space) + 1;
+                    var currentScheduleConclusionList = new List<Entity.ScheduleConclusion>(currentListCount);
+                    for (double head = minHead; head <= maxHead; head += _head_space)
+                    {
+                        var flow = curveQH.GetInterPointLastX(head);
+                        if (!flow.HasValue)
+                        {
+                            continue;
+                        }
+
+                        var scheduleConclusion = new Entity.ScheduleConclusion();
+                        scheduleConclusion.ScheduleCombineID = scheduleCombineID;
+                        scheduleConclusion.RunFlag = scheduleCombine.RunFlag;
+                        scheduleConclusion.Pump1 = scheduleCombine.Pump1;
+                        scheduleConclusion.Pump2 = scheduleCombine.Pump2;
+                        scheduleConclusion.Pump3 = scheduleCombine.Pump3;
+                        scheduleConclusion.Head = head;
+                        scheduleConclusion.Flow = flow.Value;
+                        scheduleConclusion.Power = curveQP.GetFitPointY(flow.Value);
+                        scheduleConclusion.UWP = PumpCalculateHelper.CalculateUWP(scheduleConclusion.Power, scheduleConclusion.Flow, scheduleConclusion.Head);
+                        scheduleConclusion.WP = PumpCalculateHelper.CalculateWP(scheduleConclusion.Power, scheduleConclusion.Flow);
+                        scheduleConclusion.Round();
+                        currentScheduleConclusionList.Add(scheduleConclusion);
+                    }
+                    scheduleConclusionList.Add(currentScheduleConclusionList);
+                }
+                SetAnaStatus(tableName, scheduleCombineIds);
+                var list = scheduleConclusionList.SelectMany(x => x.ToList()).ToList();
+                var runFlag = list[0].RunFlag;
+                BulkInserts_Create_Async_ScheduleConclusionList(runFlag, list);
+                InsertAnaLog($"鍒嗘瀽杩涘害:{tableName},{scheduleCombineIds.Count}鏉�,鍒嗘瀽瀹屾瘯");
+            }
+            InsertAnaLog("娉电粍鍚堝垎鏋愬畬姣�");
+        }
+
+
+
+        /// <summary>
+        /// 鎻掑叆鍒嗘瀽鏃ュ織
+        /// </summary> 
+        private void InsertAnaLog(string info)
+        {
+            var entity = new Entity.ScheduleAnaLog(info);
+            _dalAnaLog.Insert(entity);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
+        /// </summary>
+        public bool SetAnaStatus(string tableName, List<long> ids)
+        {
+            if (ids == null || !ids.Any())
+            {
+                return false;
+            }
+            return _dal.SetAnaStatus(tableName, ids);
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
+        /// </summary>
+        public bool ExistTable(string runFlag)
+        {
+            return _dal.ExistTable(runFlag);
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
+        /// </summary> 
+        private bool BulkInsertScheduleCombineList(List<Entity.ScheduleCombine> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dal.BulkInserts_SplitTable(list);
+            return bol;
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
+        /// </summary> 
+        private bool BulkInsertScheduleCombineList(string runFlag, List<Entity.ScheduleCombine> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dal.BulkInserts_Create(runFlag, list);
+            return bol;
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
+        /// </summary> 
+        private async void BulkInsert_Async_ScheduleCombineList(string runFlag, List<Entity.ScheduleCombine> list)
+        {
+            if (list == null || !list.Any())
+                return;
+            _dal.BulkInserts_Create_Async(runFlag, list);
+        }
+
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粍鍚堝垪琛�
+        /// </summary> 
+        private bool BulkInsert_NativeSql_ScheduleCombineList(string runFlag, List<Entity.ScheduleCombine> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dal.BulkInserts_NativeSql(runFlag, list);
+            return bol;
+        }
+
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
+        /// </summary> 
+        private bool BulkInsertScheduleConclusionList(List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dalScheduleConclusion.BulkInserts_SplitTable(list);
+            return bol;
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
+        /// </summary> 
+        private void BulkInserts_Create_Async_ScheduleConclusionList(string runFlag, List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || !list.Any())
+                return;
+            _dalScheduleConclusion.BulkInserts_Create_Async(runFlag, list);
+
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
+        /// </summary> 
+        private bool BulkInserts_Create_ScheduleConclusionList(string runFlag, List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dalScheduleConclusion.BulkInserts_Create(runFlag, list);
+            return bol;
+        }
+
+        /// <summary>
+        /// 鑴忔彃鍏ヨ皟搴︾粨璁哄垪琛�
+        /// </summary> 
+        private bool BulkInsert_NativeSql_ScheduleConclusionList(string runFalg, List<Entity.ScheduleConclusion> list)
+        {
+            if (list == null || !list.Any())
+                return false;
+            var bol = _dalScheduleConclusion.BulkInserts_NativeSql(runFalg, list);
+            return bol;
+        }
+
+    }
+
+
+}
+
diff --git a/Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs b/Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs
new file mode 100644
index 0000000..d94b38f
--- /dev/null
+++ b/Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs
@@ -0,0 +1,137 @@
+锘縩amespace IStation.Algorithm
+{
+
+    #region ViewModel
+
+    /// <summary>
+    /// 鍒嗘瀽娉甸」
+    /// </summary>
+    public class AnaItem
+    {
+        public AnaItem() { }
+        public string RunFlag { get; set; }
+        public int RunCount { get; set; }
+        public List<long> PumpIds { get; set; }
+        public double Flow { get; set; }
+        public double Head { get; set; }
+    }
+
+    #endregion
+
+    /// <summary>
+    /// 璋冨害鍒嗘瀽杈呭姪绫�
+    /// </summary>
+    public class SchedulingHelper
+    {
+        double _frequency_def = 50;
+        double _frequency_min = 25;
+        double _frequency_max = 50;
+        double _frequency_space = 0.1;//棰戠巼闂撮殧  
+
+        double _head_space = 0.1;//鎵▼闂撮殧
+
+        #region RunFlag
+        string _falgFrePumpTag = "B";
+        string _falgFixPumpTag = "G";
+        string _falgSpaceMark = "_";
+
+        string GetRunFlag(List<AnaPumpItem> pumpItems)
+        {
+            var tableName = string.Empty;
+            var count = pumpItems.Count;
+            pumpItems = pumpItems.OrderBy(p => p.ID).ToList();
+            for (int i = 0; i < count; i++)
+            {
+                var pumpItem = pumpItems[i];
+                tableName += GetRunFlag(pumpItem);
+                if ((i + 1) != count)
+                {
+                    tableName += _falgSpaceMark;
+                }
+            }
+            return tableName;
+        }
+
+        string GetRunFlag(AnaPumpItem pumpItem)
+        {
+            return (pumpItem.IsBp ? _falgFrePumpTag : _falgFixPumpTag) + pumpItem.ID;
+        }
+
+
+        string GetRunFlag(Dictionary<int, bool> dic)
+        {
+            var tableName = string.Empty;
+            var count = dic.Count; 
+            for (int i = 0; i < count; i++)
+            {
+                tableName += GetRunFlag(dic);
+                if ((i + 1) != count)
+                {
+                    tableName += _falgSpaceMark;
+                }
+            }
+            return tableName;
+        }
+
+        string GetRunFlag(long id, bool isBp)
+        {
+            return (isBp ? _falgFrePumpTag : _falgFixPumpTag) + id;
+        }
+
+
+        #endregion
+
+        DAL.ScheduleCombine _dal = new DAL.ScheduleCombine();
+        DAL.ScheduleConclusion _dalScheduleConclusion = new DAL.ScheduleConclusion();
+        DAL.ScheduleAnaLog _dalAnaLog = new DAL.ScheduleAnaLog();
+
+
+        public void Ana(List<Pump> pumps, double tagetFlow, double tagetHead, List<int> openPumpCombine)
+        {
+            var pumpIds = pumps.Select(x => x.ID);
+            var dic_pump = pumps.ToDictionary(x => x.ID, x => x.IsBp);
+            if (openPumpCombine != null && openPumpCombine.Any())
+            {
+                var allCombineList = PermutationAndCombination<int>.GetCombination(pumpIds.ToArray(), 2);
+                var combineList = new List<int[]>();
+                foreach (var combine in allCombineList)
+                {
+                    foreach (var pump in combine)
+                    {
+                        if (openPumpCombine.Contains(pump))
+                        {
+                            combineList.Add(combine);
+                            break;
+                        }
+                    }
+                }
+                if (combineList.Count < 1)
+                    return;
+                foreach (var combine in combineList)
+                {
+                  //  var runFlag = getal
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// 鎻掑叆鍒嗘瀽鏃ュ織
+        /// </summary> 
+        private void InsertAnaLog(string info)
+        {
+            var entity = new Entity.ScheduleAnaLog(info);
+            _dalAnaLog.Insert(entity);
+        }
+
+
+        /// <summary>
+        /// 鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
+        /// </summary>
+        public bool ExistTable(string runFlag)
+        {
+            return _dal.ExistTable(runFlag);
+        }
+
+    }
+}
diff --git a/Schedule/IStation.Client/Form1.Designer.cs b/Schedule/IStation.Client/Form1.Designer.cs
index 717b317..2c458bb 100644
--- a/Schedule/IStation.Client/Form1.Designer.cs
+++ b/Schedule/IStation.Client/Form1.Designer.cs
@@ -38,7 +38,7 @@
             btnAnaCombine.Dock = DockStyle.Top;
             btnAnaCombine.Location = new Point(0, 0);
             btnAnaCombine.Name = "btnAnaCombine";
-            btnAnaCombine.Size = new Size(684, 46);
+            btnAnaCombine.Size = new Size(1036, 46);
             btnAnaCombine.TabIndex = 0;
             btnAnaCombine.Text = "鍒嗘瀽娉电粍鍚�";
             btnAnaCombine.UseVisualStyleBackColor = true;
@@ -47,9 +47,9 @@
             // richTextBox1
             // 
             richTextBox1.Dock = DockStyle.Bottom;
-            richTextBox1.Location = new Point(0, 89);
+            richTextBox1.Location = new Point(0, 410);
             richTextBox1.Name = "richTextBox1";
-            richTextBox1.Size = new Size(684, 227);
+            richTextBox1.Size = new Size(1036, 227);
             richTextBox1.TabIndex = 1;
             richTextBox1.Text = "";
             // 
@@ -58,7 +58,7 @@
             btnAnaConclusion.Dock = DockStyle.Fill;
             btnAnaConclusion.Location = new Point(0, 46);
             btnAnaConclusion.Name = "btnAnaConclusion";
-            btnAnaConclusion.Size = new Size(684, 43);
+            btnAnaConclusion.Size = new Size(1036, 364);
             btnAnaConclusion.TabIndex = 2;
             btnAnaConclusion.Text = "鍒嗘瀽娉电粍鍚堢粨璁�";
             btnAnaConclusion.UseVisualStyleBackColor = true;
@@ -68,7 +68,7 @@
             // 
             AutoScaleDimensions = new SizeF(11F, 24F);
             AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(684, 316);
+            ClientSize = new Size(1036, 637);
             Controls.Add(btnAnaConclusion);
             Controls.Add(richTextBox1);
             Controls.Add(btnAnaCombine);
diff --git a/Schedule/IStation.Client/IStation.Client.csproj.user b/Schedule/IStation.Client/IStation.Client.csproj.user
index adaaf23..d37a6d2 100644
--- a/Schedule/IStation.Client/IStation.Client.csproj.user
+++ b/Schedule/IStation.Client/IStation.Client.csproj.user
@@ -1,7 +1,7 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <_LastSelectedProfileId>D:\WorkCode\IStation\Code\Service.Ch.V1.0\Schedule\IStation.Client\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
+    <_LastSelectedProfileId>D:\WorkCode\IStation\Code\Service.Ch.V1.0\Schedule\IStation.Client\Properties\PublishProfiles\FolderProfile1.pubxml</_LastSelectedProfileId>
   </PropertyGroup>
   <ItemGroup>
     <Compile Update="Form1.cs">
diff --git a/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile.pubxml.user b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile.pubxml.user
index 188c960..fa12149 100644
--- a/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@
 -->
 <Project>
   <PropertyGroup>
-    <History>True|2024-04-29T06:10:13.9117424Z;True|2024-04-29T14:09:09.4137798+08:00;True|2024-04-29T13:16:32.2282303+08:00;True|2024-04-29T11:47:57.4367230+08:00;True|2024-04-29T11:47:09.8955815+08:00;True|2024-04-29T11:33:32.3137788+08:00;True|2024-04-29T11:25:34.8701443+08:00;True|2024-04-29T11:14:09.2155623+08:00;True|2024-04-29T11:01:11.2894390+08:00;False|2024-04-29T11:00:53.6332448+08:00;True|2024-04-28T16:24:05.5076307+08:00;True|2024-04-28T15:58:58.9653989+08:00;True|2024-04-28T15:55:49.7244417+08:00;True|2024-04-28T15:46:51.6035165+08:00;True|2024-04-28T15:43:39.7397122+08:00;True|2024-04-28T15:39:49.3419176+08:00;True|2024-04-28T15:37:55.9061189+08:00;True|2024-04-28T15:33:57.3641855+08:00;True|2024-04-28T15:33:43.1615318+08:00;False|2024-04-28T15:32:40.1742895+08:00;True|2024-04-28T14:14:36.5581181+08:00;True|2024-04-28T14:14:32.2693146+08:00;True|2024-04-28T14:11:44.7928792+08:00;True|2024-04-28T14:10:32.8620163+08:00;True|2024-04-28T14:06:16.9371444+08:00;True|2024-04-28T14:03:42.6442782+08:00;True|2024-04-28T14:00:05.1848553+08:00;True|2024-04-28T11:20:48.2122533+08:00;True|2024-04-28T11:16:18.0658604+08:00;True|2024-04-28T11:09:37.8710424+08:00;</History>
+    <History>True|2024-04-29T06:57:34.4301536Z;True|2024-04-29T14:54:01.3130833+08:00;True|2024-04-29T14:10:13.9117424+08:00;True|2024-04-29T14:09:09.4137798+08:00;True|2024-04-29T13:16:32.2282303+08:00;True|2024-04-29T11:47:57.4367230+08:00;True|2024-04-29T11:47:09.8955815+08:00;True|2024-04-29T11:33:32.3137788+08:00;True|2024-04-29T11:25:34.8701443+08:00;True|2024-04-29T11:14:09.2155623+08:00;True|2024-04-29T11:01:11.2894390+08:00;False|2024-04-29T11:00:53.6332448+08:00;True|2024-04-28T16:24:05.5076307+08:00;True|2024-04-28T15:58:58.9653989+08:00;True|2024-04-28T15:55:49.7244417+08:00;True|2024-04-28T15:46:51.6035165+08:00;True|2024-04-28T15:43:39.7397122+08:00;True|2024-04-28T15:39:49.3419176+08:00;True|2024-04-28T15:37:55.9061189+08:00;True|2024-04-28T15:33:57.3641855+08:00;True|2024-04-28T15:33:43.1615318+08:00;False|2024-04-28T15:32:40.1742895+08:00;True|2024-04-28T14:14:36.5581181+08:00;True|2024-04-28T14:14:32.2693146+08:00;True|2024-04-28T14:11:44.7928792+08:00;True|2024-04-28T14:10:32.8620163+08:00;True|2024-04-28T14:06:16.9371444+08:00;True|2024-04-28T14:03:42.6442782+08:00;True|2024-04-28T14:00:05.1848553+08:00;True|2024-04-28T11:20:48.2122533+08:00;True|2024-04-28T11:16:18.0658604+08:00;True|2024-04-28T11:09:37.8710424+08:00;</History>
     <LastFailureDetails />
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml
new file mode 100644
index 0000000..87dc354
--- /dev/null
+++ b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml
@@ -0,0 +1,13 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <Configuration>Release</Configuration>
+    <Platform>Any CPU</Platform>
+    <PublishDir>bin\Release\net6.0-windows\publishAsync\</PublishDir>
+    <PublishProtocol>FileSystem</PublishProtocol>
+    <_TargetId>Folder</_TargetId>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml.user b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml.user
new file mode 100644
index 0000000..631863a
--- /dev/null
+++ b/Schedule/IStation.Client/Properties/PublishProfiles/FolderProfile1.pubxml.user
@@ -0,0 +1,10 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <History>True|2024-04-29T09:06:08.1513682Z;True|2024-04-29T16:37:21.5467926+08:00;True|2024-04-29T16:31:00.7994472+08:00;True|2024-04-29T16:21:01.1062945+08:00;True|2024-04-29T16:20:39.0991070+08:00;True|2024-04-29T16:20:31.1074303+08:00;True|2024-04-29T16:15:14.5019765+08:00;True|2024-04-29T15:21:56.5279860+08:00;True|2024-04-29T15:18:47.9623987+08:00;</History>
+    <LastFailureDetails />
+  </PropertyGroup>
+</Project>
\ No newline at end of file

--
Gitblit v1.9.3