ningshuxia
2024-04-30 b50a06a3185619c4cbbc521ab026f1bfa4d13aae
调度
已修改4个文件
已添加1个文件
474 ■■■■ 文件已修改
Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Schedule/IStation.Algorithm/Helper/IntListHelper.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Schedule/IStation.Client/Form1.Designer.cs 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Schedule/IStation.Client/Form1.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Schedule/IStation.Algorithm/DAL/ScheduleConclusion.cs
@@ -17,6 +17,8 @@
            return $"{_tableNamePrefix}{runFlag}";
        }
        #region Table
        /// <summary>
        /// èŽ·å–å…¨éƒ¨è¡¨å
        /// </summary>
@@ -50,11 +52,10 @@
            using (SqlSugarClient db = Connection)
            {
                var sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{GetTableName(runFlag)}';";
                var bol = db.Ado.ExecuteCommand(sql) > 0;
                var bol = db.Ado.GetInt(sql) > 0;
                return bol;
            }
        }
        /// <summary>
        /// æ•°æ®åº“创建表
@@ -65,13 +66,41 @@
            {
                var tableName = GetTableName(runFlag);
                var sql_exist = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}';";
                if (db.Ado.ExecuteCommand(sql_exist) > 0)
                if (db.Ado.GetInt(sql_exist) > 0)
                    return true;
                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);";
                var bol = db.Ado.ExecuteCommand(sql_create_table) > 0;
                return bol;
            }
        }
        /// <summary>
        //  åˆ é™¤æ‰€æœ‰è¡¨
        /// </summary>
        public bool DeleteAllTable()
        {
            var tables = GetAllTableName();
            if (tables == null || !tables.Any())
                return false;
            using (SqlSugarClient db = Connection)
            {
                db.BeginTran();
                foreach (var table in tables)
                {
                    var sql = $"drop table {table};";
                    db.Ado.ExecuteCommand(sql);
                }
                db.CommitTran();
            }
            return true;
        }
        #endregion
        #region BulkInserts
        /// <summary>
        /// å¤§æ‰¹é‡æ’å…¥
@@ -131,7 +160,6 @@
            }
        }
        /// <summary>
        /// å¤§æ‰¹é‡æ’å…¥
        /// </summary>
@@ -152,8 +180,6 @@
                return db.Fastest<Entity.ScheduleConclusion>().AS(tableName).BulkCopy(list) > 0;
            }
        }
        /// <summary>
        /// å¤§æ‰¹é‡æ’å…¥
@@ -193,28 +219,32 @@
            return true;
        }
        #endregion
        /// <summary>
        /// èŽ·å–å…¨éƒ¨è¡¨å
        /// å¤§æ‰¹é‡æ’å…¥
        /// </summary>
        public bool DeleteAllTable()
        public List<Entity.ScheduleConclusion> GetList(string runFlag, double targetFlow, double targetHead, int takeCount)
        {
            var tables = GetAllTableName();
            if (tables == null || !tables.Any())
                return false;
            var tableName = GetTableName(runFlag);
            using (SqlSugarClient db = Connection)
            {
                db.BeginTran();
                foreach (var table in tables)
                var sql = $"select count(*)  from sqlite_master where type = 'table' and name = '{tableName}';";
                if (db.Ado.GetInt(sql) < 1)
                {
                    var sql = $"drop table {table};";
                    db.Ado.ExecuteCommand(sql);
                    return default;
                }
                db.CommitTran();
                var list = db.Queryable<Entity.ScheduleConclusion>().AS(tableName)
                      .Where(x => x.Head >= targetHead && x.Head <= targetHead * 1.01 && x.Flow > targetFlow)
                      .OrderBy(x => x.Power)
                      .Take(takeCount)
                      .ToList();
                return list;
            }
            return true;
        }
    }
Schedule/IStation.Algorithm/Helper/IntListHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
namespace IStation
{
    /// <summary>
    /// æ•´æ•°åˆ—表辅助类
    /// </summary>
    public class IntListHelper
    {
        //分割字符
        private const string _split = ",";
        /// <summary>
        /// è½¬åŒ–为字符串
        /// </summary>
        public static string ToString(IEnumerable<int> list)
        {
            if (list == null || list.Count() < 1)
                return string.Empty;
            return string.Join(_split, list);
        }
        /// <summary>
        /// è½¬åŒ–为列表
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static List<int> ToList(string str)
        {
            if (string.IsNullOrEmpty(str))
                return new List<int>();
            try
            {
                var list = str.Split(new string[] { _split }, StringSplitOptions.RemoveEmptyEntries);
                if (list.Count() < 1)
                    return new List<int>();
                return list.Select(x => Convert.ToInt32(x)).ToList();
            }
            catch
            {
                return new List<int>();
            }
        }
    }
}
Schedule/IStation.Algorithm/Schedule/SchedulingHelper.cs
@@ -1,4 +1,6 @@
namespace IStation.Algorithm
using System;
namespace IStation.Algorithm
{
    #region ViewModel
@@ -61,11 +63,13 @@
        string GetRunFlag(Dictionary<int, bool> dic)
        {
            var tableName = string.Empty;
            var count = dic.Count;
            for (int i = 0; i < count; i++)
            var index = 0;
            var count = dic.Count;
            foreach (var item in dic)
            {
                tableName += GetRunFlag(dic);
                if ((i + 1) != count)
                tableName += GetRunFlag(item.Key, item.Value);
                index++;
                if (index != count)
                {
                    tableName += _falgSpaceMark;
                }
@@ -78,12 +82,49 @@
            return (isBp ? _falgFrePumpTag : _falgFixPumpTag) + id;
        }
        string GetRunFlag(List<string> flags)
        {
            var tableName = string.Empty;
            var count = flags.Count;
            var index = 0;
            foreach (var flag in flags)
            {
                tableName += flag;
                index++;
                if (index != count)
                {
                    tableName += _falgSpaceMark;
                }
            }
            return tableName;
        }
        #endregion
        DAL.ScheduleCombine _dal = new DAL.ScheduleCombine();
        DAL.ScheduleConclusion _dalScheduleConclusion = new DAL.ScheduleConclusion();
        DAL.ScheduleAnaLog _dalAnaLog = new DAL.ScheduleAnaLog();
        public class CurrentViewModel : Entity.ScheduleConclusion
        {
            public CurrentViewModel(Entity.ScheduleConclusion rhs) : base(rhs)
            {
                this.Flags = new List<int>();
                var flags = rhs.RunFlag.Split('_');
                foreach (var item in flags)
                {
                    if (int.TryParse(item.Substring(1), out int flag))
                    {
                        this.Flags.Add(flag);
                    }
                }
            }
            public List<int> Flags { get; set; }
        }
        public void Ana(List<Pump> pumps, double tagetFlow, double tagetHead, List<int> openPumpCombine)
@@ -93,27 +134,76 @@
            if (openPumpCombine != null && openPumpCombine.Any())
            {
                var allCombineList = PermutationAndCombination<int>.GetCombination(pumpIds.ToArray(), 2);
                var combineList = new List<int[]>();
                var combineList = new List<List<int>>();
                foreach (var combine in allCombineList)
                {
                    foreach (var pump in combine)
                    {
                        if (openPumpCombine.Contains(pump))
                        {
                            combineList.Add(combine);
                            break;
                        }
                    }
                    var pump1 = combine[0];
                    var pump2 = combine[1];
                    if (!openPumpCombine.Contains(pump1))
                        continue;
                    if (!openPumpCombine.Contains(pump2))
                        continue;
                    combineList.Add(combine.ToList());
                }
                if (combineList.Count < 1)
                    return;
                var avgFlow = tagetFlow / 2;
                var optimalConclusionList = new List<CurrentViewModel>();
                foreach (var combine in combineList)
                {
                  //  var runFlag = getal
                    var dic = new Dictionary<int, bool>();
                    foreach (var pump in combine)
                    {
                        if (dic_pump.ContainsKey(pump))
                        {
                            dic.Add(pump, dic_pump[pump]);
                        }
                    }
                    var runFalg = GetRunFlag(dic);
                    var list = _dalScheduleConclusion.GetList(runFalg, avgFlow, tagetHead, 1);
                    if (list != null && list.Any())
                    {
                        var vmList = list.Select(x => new CurrentViewModel(x)).ToList();
                        optimalConclusionList.AddRange(vmList);
                    }
                }
                if (optimalConclusionList == null || !optimalConclusionList.Any())
                {
                    return;
                }
                var optimalConclusionCombineList = PermutationAndCombination<CurrentViewModel>.GetCombination(optimalConclusionList.ToArray(), 2);
                var combines = new List<Combine>();
                foreach (var arr in optimalConclusionCombineList)
                {
                    var falgs = arr.SelectMany(x => x.Flags).ToList();
                    if (falgs.GroupBy(x => x).Where(x => x.Count() > 1).Count() > 0)
                    {
                        continue;
                    }
                    var combine = new Combine();
                    combine.Power = arr.Sum(x => x.Power);
                    combine.Head = arr.Average(x => x.Head);
                    combine.Flow = arr.Sum(x => x.Flow);
                    combine.RunFlagList = falgs;
                    combines.Add(combine);
                }
                var a = combines;
            }
        }
        private class Combine
        {
            public double Flow { get; set; }
            public double Head { get; set; }
            public double Power { get; set; }
            public List<int> RunFlagList { get; set; }
        }
        /// <summary>
        /// æ’入分析日志
Schedule/IStation.Client/Form1.Designer.cs
@@ -28,60 +28,161 @@
        /// </summary>
        private void InitializeComponent()
        {
            btnAnaCombine = new Button();
            btnAnaCh1Combine = new Button();
            richTextBox1 = new RichTextBox();
            btnAnaConclusion = new Button();
            btnAnaChConclusion = new Button();
            tableLayoutPanel1 = new TableLayoutPanel();
            btnAnaCh2Combine = new Button();
            tableLayoutPanel2 = new TableLayoutPanel();
            txtFlow = new TextBox();
            txtHead = new TextBox();
            btnAna = new Button();
            txtOpenCombineList = new RichTextBox();
            tableLayoutPanel1.SuspendLayout();
            tableLayoutPanel2.SuspendLayout();
            SuspendLayout();
            // 
            // btnAnaCombine
            // btnAnaCh1Combine
            // 
            btnAnaCombine.Dock = DockStyle.Top;
            btnAnaCombine.Location = new Point(0, 0);
            btnAnaCombine.Name = "btnAnaCombine";
            btnAnaCombine.Size = new Size(1036, 46);
            btnAnaCombine.TabIndex = 0;
            btnAnaCombine.Text = "分析泵组合";
            btnAnaCombine.UseVisualStyleBackColor = true;
            btnAnaCombine.Click += btnAnaCombine_Click;
            btnAnaCh1Combine.Dock = DockStyle.Fill;
            btnAnaCh1Combine.Location = new Point(3, 3);
            btnAnaCh1Combine.Name = "btnAnaCh1Combine";
            btnAnaCh1Combine.Size = new Size(512, 104);
            btnAnaCh1Combine.TabIndex = 0;
            btnAnaCh1Combine.Text = "分析1输水泵组合";
            btnAnaCh1Combine.UseVisualStyleBackColor = true;
            btnAnaCh1Combine.Click += btnAnaCh1Combine_Click;
            // 
            // richTextBox1
            // 
            richTextBox1.Dock = DockStyle.Bottom;
            richTextBox1.Location = new Point(0, 410);
            richTextBox1.Location = new Point(0, 221);
            richTextBox1.Name = "richTextBox1";
            richTextBox1.Size = new Size(1036, 227);
            richTextBox1.Size = new Size(1036, 416);
            richTextBox1.TabIndex = 1;
            richTextBox1.Text = "";
            // 
            // btnAnaConclusion
            // btnAnaChConclusion
            // 
            btnAnaConclusion.Dock = DockStyle.Fill;
            btnAnaConclusion.Location = new Point(0, 46);
            btnAnaConclusion.Name = "btnAnaConclusion";
            btnAnaConclusion.Size = new Size(1036, 364);
            btnAnaConclusion.TabIndex = 2;
            btnAnaConclusion.Text = "分析泵组合结论";
            btnAnaConclusion.UseVisualStyleBackColor = true;
            btnAnaConclusion.Click += btnAnaConclusion_Click;
            btnAnaChConclusion.Location = new Point(3, 113);
            btnAnaChConclusion.Name = "btnAnaChConclusion";
            btnAnaChConclusion.Size = new Size(512, 104);
            btnAnaChConclusion.TabIndex = 2;
            btnAnaChConclusion.Text = "分析全部泵组合结论";
            btnAnaChConclusion.UseVisualStyleBackColor = true;
            btnAnaChConclusion.Click += btnAnaChConclusion_Click;
            //
            // tableLayoutPanel1
            //
            tableLayoutPanel1.ColumnCount = 2;
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel1.Controls.Add(btnAnaCh1Combine, 0, 0);
            tableLayoutPanel1.Controls.Add(btnAnaChConclusion, 0, 1);
            tableLayoutPanel1.Controls.Add(btnAnaCh2Combine, 1, 0);
            tableLayoutPanel1.Controls.Add(tableLayoutPanel2, 1, 1);
            tableLayoutPanel1.Dock = DockStyle.Fill;
            tableLayoutPanel1.Location = new Point(0, 0);
            tableLayoutPanel1.Name = "tableLayoutPanel1";
            tableLayoutPanel1.RowCount = 2;
            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
            tableLayoutPanel1.Size = new Size(1036, 221);
            tableLayoutPanel1.TabIndex = 3;
            //
            // btnAnaCh2Combine
            //
            btnAnaCh2Combine.Location = new Point(521, 3);
            btnAnaCh2Combine.Name = "btnAnaCh2Combine";
            btnAnaCh2Combine.Size = new Size(512, 104);
            btnAnaCh2Combine.TabIndex = 3;
            btnAnaCh2Combine.Text = "分析2输水泵组合";
            btnAnaCh2Combine.UseVisualStyleBackColor = true;
            btnAnaCh2Combine.Click += btnAnaCh2Combine_Click;
            //
            // tableLayoutPanel2
            //
            tableLayoutPanel2.ColumnCount = 2;
            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            tableLayoutPanel2.Controls.Add(txtFlow, 0, 0);
            tableLayoutPanel2.Controls.Add(txtHead, 1, 0);
            tableLayoutPanel2.Controls.Add(btnAna, 1, 1);
            tableLayoutPanel2.Controls.Add(txtOpenCombineList, 0, 1);
            tableLayoutPanel2.Dock = DockStyle.Fill;
            tableLayoutPanel2.Location = new Point(521, 113);
            tableLayoutPanel2.Name = "tableLayoutPanel2";
            tableLayoutPanel2.RowCount = 2;
            tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 34.2857132F));
            tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 65.71429F));
            tableLayoutPanel2.Size = new Size(512, 105);
            tableLayoutPanel2.TabIndex = 4;
            //
            // txtFlow
            //
            txtFlow.Dock = DockStyle.Fill;
            txtFlow.Location = new Point(3, 3);
            txtFlow.Name = "txtFlow";
            txtFlow.Size = new Size(250, 30);
            txtFlow.TabIndex = 0;
            txtFlow.Text = "16406";
            //
            // txtHead
            //
            txtHead.Dock = DockStyle.Fill;
            txtHead.Location = new Point(259, 3);
            txtHead.Name = "txtHead";
            txtHead.Size = new Size(250, 30);
            txtHead.TabIndex = 1;
            txtHead.Text = "15.92";
            //
            // btnAna
            //
            btnAna.Dock = DockStyle.Fill;
            btnAna.Location = new Point(259, 39);
            btnAna.Name = "btnAna";
            btnAna.Size = new Size(250, 63);
            btnAna.TabIndex = 3;
            btnAna.Text = "分析";
            btnAna.UseVisualStyleBackColor = true;
            btnAna.Click += btnAna_Click;
            //
            // txtOpenCombineList
            //
            txtOpenCombineList.Dock = DockStyle.Fill;
            txtOpenCombineList.Location = new Point(3, 39);
            txtOpenCombineList.Name = "txtOpenCombineList";
            txtOpenCombineList.Size = new Size(250, 63);
            txtOpenCombineList.TabIndex = 4;
            txtOpenCombineList.Text = "11,12,13,17";
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(11F, 24F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(1036, 637);
            Controls.Add(btnAnaConclusion);
            Controls.Add(tableLayoutPanel1);
            Controls.Add(richTextBox1);
            Controls.Add(btnAnaCombine);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Form1";
            tableLayoutPanel1.ResumeLayout(false);
            tableLayoutPanel2.ResumeLayout(false);
            tableLayoutPanel2.PerformLayout();
            ResumeLayout(false);
        }
        #endregion
        private Button btnAnaCombine;
        private Button btnAnaCh1Combine;
        private RichTextBox richTextBox1;
        private Button btnAnaConclusion;
        private Button btnAnaChConclusion;
        private TableLayoutPanel tableLayoutPanel1;
        private Button btnAnaCh2Combine;
        private TableLayoutPanel tableLayoutPanel2;
        private TextBox txtFlow;
        private TextBox txtHead;
        private Button btnAna;
        private RichTextBox txtOpenCombineList;
    }
}
Schedule/IStation.Client/Form1.cs
@@ -12,15 +12,16 @@
            };
        }
        string _floder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data");
        private void btnAnaCombine_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text += "正在分析泵组合";
            var folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data");
            var ch1 = folder + "\\" + "陈行一输.json";
            this.richTextBox1.Text += "\r\n正在分析泵组合";
            var ch1 = _floder + "\\" + "陈行一输.json";
            var ch1_json = File.ReadAllText(ch1);
            var ch1Pumps = JsonHelper.Json2Object<List<Model.Pump>>(ch1_json);
            var ch2 = folder + "\\" + "陈行二输.json";
            var ch2 = _floder + "\\" + "陈行二输.json";
            var ch2_json = File.ReadAllText(ch2);
            var ch2Pumps = JsonHelper.Json2Object<List<Model.Pump>>(ch2_json);
@@ -35,18 +36,90 @@
            });
        }
        private void btnAnaConclusion_Click(object sender, EventArgs e)
        private void btnAnaCh1Combine_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text += "正在分析泵组合结论";
            var ch1 = _floder + "\\" + "陈行一输.json";
            var ch1_json = File.ReadAllText(ch1);
            var ch1Pumps = JsonHelper.Json2Object<List<Model.Pump>>(ch1_json);
            this.richTextBox1.Text += "\r\n正在分析1输水泵组合";
            Task.Run(() =>
            {
                var helper = new Algorithm.SchedulingAnaHelper();
                helper.AnaCombine(ch1Pumps);
                this.Invoke(() =>
                {
                    this.richTextBox1.Text += "\r\n分析1输水泵组合完毕";
                });
            });
        }
        private void btnAnaCh2Combine_Click(object sender, EventArgs e)
        {
            var ch2 = _floder + "\\" + "陈行二输.json";
            var ch2_json = File.ReadAllText(ch2);
            var ch2Pumps = JsonHelper.Json2Object<List<Model.Pump>>(ch2_json);
            this.richTextBox1.Text += "\r\n正在分析2输水泵组合";
            Task.Run(() =>
            {
                var helper = new Algorithm.SchedulingAnaHelper();
                helper.AnaCombine(ch2Pumps);
                this.Invoke(() =>
                {
                    this.richTextBox1.Text += "\r\n分析2输水泵组合完毕";
                });
            });
        }
        private void btnAnaChConclusion_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text += "\r\n正在分析全部泵组合结论";
            Task.Run(() =>
            {
                var helper = new Algorithm.SchedulingAnaHelper();
                helper.AnaConclusion();
                this.Invoke(() =>
                {
                    this.richTextBox1.Text += "\r\n泵组合分析完毕";
                    this.richTextBox1.Text += "\r\n全部泵组合分析完毕";
                });
            });
        }
        private void btnAna_Click(object sender, EventArgs e)
        {
            if (!double.TryParse(this.txtFlow.Text, out double targetFlow))
            {
                MessageBox.Show("请输入流量!");
                return;
            }
            if (!double.TryParse(this.txtHead.Text, out double targetHead))
            {
                MessageBox.Show("请输入压力!");
                return;
            }
            var combine = this.txtOpenCombineList.Text.Trim();
            if (string.IsNullOrEmpty(combine))
            {
                MessageBox.Show("请输入泵组合!");
                return;
            }
            var combineList = IntListHelper.ToList(combine);
            if (combineList == null || combineList.Count < 1)
            {
                MessageBox.Show("请输入有效泵组合!\r\n','号间隔!");
                return;
            }
            var ch1 = _floder + "\\" + "陈行一输.json";
            var ch1_json = File.ReadAllText(ch1);
            var ch1Pumps = JsonHelper.Json2Object<List<Model.Pump>>(ch1_json);
            var helper = new Algorithm.SchedulingHelper();
            helper.Ana(ch1Pumps, targetFlow, targetHead, combineList);
        }
    }
}