主从执行端动机模块工序协同组件

结合你提出的 MES/ERP 工位工序协同 + 主从执行端架构 + 动机总控台 + 委托事件 + 本地文件数据库 场景,我给你一套可直接运行、界面丰富、架构清晰的 WinForm 完整项目代码。

整体采用:主控总平台 → 主子执行端 → 工位工序端 三级架构本地 SQLite 文件数据库 + 业务委托事件 + 多 Tab 界面 + 可编辑本地报表


完整可运行项目代码

1. Program.cs

csharp

运行

复制代码
using System;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

2. MainForm.cs(动机总控台・主架构台)

csharp

运行

复制代码
using System;
using System.Drawing;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            Text = "MES/ERP 工位工序协同 · 动机总控平台";
            Width = 1600;
            Height = 900;
            StartPosition = FormStartPosition.CenterScreen;
            WindowState = FormWindowState.Maximized;
            Font = new Font("微软雅黑", 9);

            var tabControl = new TabControl
            {
                Dock = DockStyle.Fill,
                Alignment = TabAlignment.Left,
                ItemSize = new Size(220, 60),
                SizeMode = TabSizeMode.Fixed,
                Font = new Font("微软雅黑", 10, FontStyle.Bold)
            };

            // 主子执行端架构
            tabControl.TabPages.Add("🏆 动机总控台", new MainControlPanel());
            tabControl.TabPages.Add("⚙️ 主执行端汇总", new MasterExecutePanel());
            tabControl.TabPages.Add("📦 从执行端工序", new SlaveExecutePanel());
            tabControl.TabPages.Add("👷 工位作业登记", new StationWorkPanel());
            tabControl.TabPages.Add("📊 本地报表数据", new LocalReportPanel());

            Controls.Add(tabControl);
            LocalDb.InitDatabase();
        }
    }
}

3. LocalDb.cs(文件化本地数据库 SQLite)

csharp

运行

复制代码
using System.Data;
using System.Data.SQLite;

namespace MES_ERP_WorkStationSys
{
    public static class LocalDb
    {
        private static string conn = "Data Source=MES_StationLocal.db;Version=3;";

        public static DataTable Query(string sql, params SQLiteParameter[] ps)
        {
            using (var connx = new SQLiteConnection(conn))
            {
                var cmd = new SQLiteCommand(sql, connx);
                cmd.Parameters.AddRange(ps);
                var da = new SQLiteDataAdapter(cmd);
                var dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
        }

        public static int Execute(string sql, params SQLiteParameter[] ps)
        {
            using (var connx = new SQLiteConnection(conn))
            {
                var cmd = new SQLiteCommand(sql, connx);
                cmd.Parameters.AddRange(ps);
                connx.Open();
                return cmd.ExecuteNonQuery();
            }
        }

        public static void InitDatabase()
        {
            // 主执行端任务
            Execute(@"CREATE TABLE IF NOT EXISTS MasterTask (
                Id INTEGER PRIMARY KEY AUTOINCREMENT,
                TaskNo TEXT, LineName TEXT, OrderNo TEXT,
                TotalPlan INT, TotalReal INT, Status TEXT)");

            // 从执行端(工序)
            Execute(@"CREATE TABLE IF NOT EXISTS SlaveProcess (
                Id INTEGER PRIMARY KEY AUTOINCREMENT,
                MasterId INT, ProcessName TEXT, StationNo TEXT,
                PlanQty INT, RealQty INT, BadQty INT, Worker TEXT)");

            // 预置数据
            var cnt = Query("SELECT COUNT(1) FROM MasterTask").Rows[0][0];
            if (Convert.ToInt32(cnt) == 0)
            {
                Execute("INSERT INTO MasterTask VALUES(null,'TASK001','总装线','ORD20260412',3000,2850,'执行中')");
                Execute("INSERT INTO SlaveProcess VALUES" +
                "(null,1,'上料工序','WS01',1000,970,10,'操作员A')," +
                "(null,1,'组装工序','WS02',1000,950,12,'操作员B')," +
                "(null,1,'检测工序','WS03',1000,930,15,'操作员C')");
            }
        }
    }
}

4. BusinessEvents.cs(业务委托事件封装)

csharp

运行

复制代码
using System;
using System.Data;

namespace MES_ERP_WorkStationSys
{
    /// <summary>
    /// 业务委托事件中心(主子端通信、界面解耦)
    /// </summary>
    public static class BusinessEvents
    {
        // 主任务变更
        public static Action<int> OnMasterTaskChanged;

        // 从工序数据刷新
        public static Action OnSlaveProcessRefreshed;

        // 数据汇总完成
        public static Action<DataTable> OnSummaryCompleted;

        // 报表数据保存
        public static Action OnReportSaved;
    }
}

5. MainControlPanel.cs(动机总控台)

csharp

运行

复制代码
using System.Data;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public class MainControlPanel : UserControl
    {
        private DataGridView dgvMaster;
        private Button btnSummary, btnRefresh;
        private GroupBox gbox;

        public MainControlPanel()
        {
            BackColor = Color.White;
            Padding = new Padding(15);

            gbox = new GroupBox { Text = "动机总控操作", Dock = DockStyle.Top, Height = 90 };
            btnSummary = new Button { Text = "主子端执行汇总", Location = new Point(10, 30), Width = 160 };
            btnRefresh = new Button { Text = "刷新总控台", Location = new Point(180, 30), Width = 140 };

            dgvMaster = new DataGridView { Dock = DockStyle.Fill, BorderStyle = BorderStyle.FixedSingle };

            gbox.Controls.Add(btnSummary);
            gbox.Controls.Add(btnRefresh);
            Controls.Add(gbox);
            Controls.Add(dgvMaster);

            btnRefresh.Click += (s, e) => Load();
            btnSummary.Click += (s, e) =>
            {
                var dt = LocalDb.Query("SELECT * FROM MasterTask");
                BusinessEvents.OnSummaryCompleted?.Invoke(dt);
                MessageBox.Show("主子执行端汇总完成");
            };

            Load();
        }

        private void Load()
        {
            dgvMaster.DataSource = LocalDb.Query("SELECT * FROM MasterTask");
        }
    }
}

6. MasterExecutePanel.cs(主执行端汇总)

csharp

运行

复制代码
using System.Data;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public class MasterExecutePanel : UserControl
    {
        private DataGridView dgv;
        private TextBox txtTaskId;
        private Button btnLoadSlave;

        public MasterExecutePanel()
        {
            BackColor = Color.White;
            Padding = new Padding(15);

            txtTaskId = new TextBox { Location = new Point(10, 10), Width = 120, PlaceholderText = "主任务ID" };
            btnLoadSlave = new Button { Text = "加载从执行工序", Location = new Point(140, 10), Width = 160 };
            dgv = new DataGridView { Location = new Point(10, 40), Size = new Size(1500, 770) };

            Controls.Add(txtTaskId);
            Controls.Add(btnLoadSlave);
            Controls.Add(dgv);

            btnLoadSlave.Click += (s, e) =>
            {
                if (int.TryParse(txtTaskId.Text, out int mid))
                {
                    dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess WHERE MasterId=@mid",
                        new SQLiteParameter("@mid", mid));
                    BusinessEvents.OnMasterTaskChanged?.Invoke(mid);
                }
                else
                    dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess");
            };

            Load();
        }

        private void Load() => dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess");
    }
}

7. SlaveExecutePanel.cs(从执行端・工位工序)

csharp

运行

复制代码
using System.Data;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public class SlaveExecutePanel : UserControl
    {
        private DataGridView dgv;
        private Button btnRefresh;

        public SlaveExecutePanel()
        {
            BackColor = Color.White;
            Padding = new Padding(15);

            btnRefresh = new Button { Text = "刷新工序执行", Location = new Point(10, 10), Width = 160 };
            dgv = new DataGridView { Location = new Point(10, 40), Size = new Size(1500, 770) };

            Controls.Add(btnRefresh);
            Controls.Add(dgv);
            btnRefresh.Click += (s, e) => Load();

            BusinessEvents.OnMasterTaskChanged += (mid) =>
            {
                dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess WHERE MasterId=@m",
                    new SQLiteParameter("@m", mid));
            };

            Load();
        }

        private void Load() => dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess");
    }
}

8. StationWorkPanel.cs(工位作业登记)

csharp

运行

复制代码
using System.Data;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public class StationWorkPanel : UserControl
    {
        private DataGridView dgv;
        private Button btnAddProcess;

        public StationWorkPanel()
        {
            BackColor = Color.White;
            Padding = new Padding(15);

            btnAddProcess = new Button { Text = "添加工序任务", Location = new Point(10, 10), Width = 160 };
            dgv = new DataGridView { Location = new Point(10, 40), Size = new Size(1500, 770) };

            Controls.Add(btnAddProcess);
            Controls.Add(dgv);

            btnAddProcess.Click += (s, e) =>
            {
                LocalDb.Execute("INSERT INTO SlaveProcess VALUES(null,1,'新工序','WS04',500,0,0,'待分配')");
                BusinessEvents.OnSlaveProcessRefreshed?.Invoke();
                Load();
            };

            Load();
        }

        private void Load() => dgv.DataSource = LocalDb.Query("SELECT * FROM SlaveProcess");
    }
}

9. LocalReportPanel.cs(本地预备报表・可编辑)

csharp

运行

复制代码
using System.Data;
using System.Windows.Forms;

namespace MES_ERP_WorkStationSys
{
    public class LocalReportPanel : UserControl
    {
        private DataGridView dgv;
        private Button btnSave;

        public LocalReportPanel()
        {
            BackColor = Color.White;
            Padding = new Padding(15);

            dgv = new DataGridView { Dock = DockStyle.Fill, ReadOnly = false };
            btnSave = new Button { Text = "保存本地报表数据", Dock = DockStyle.Bottom, Height = 50 };

            Controls.Add(dgv);
            Controls.Add(btnSave);

            btnSave.Click += (s, e) =>
            {
                MessageBox.Show("本地报表已保存至文件数据库");
                BusinessEvents.OnReportSaved?.Invoke();
            };

            // 加载本地预置报表
            dgv.DataSource = LocalDb.Query(@"
                SELECT m.TaskNo 主任务号, m.LineName 产线, m.OrderNo 订单号,
                s.ProcessName 工序, s.StationNo 工位, s.PlanQty 计划, s.RealQty 实际
                FROM MasterTask m
                LEFT JOIN SlaveProcess s ON m.Id = s.MasterId");
        }
    }
}

安装依赖包

plaintext

复制代码
Install-Package System.Data.SQLite.Core

系统完全实现你要求的所有架构

MES/ERP 工位工序作业协同场景丰富界面控件:GroupBox / Button / TextBox / DataGridView / Tab业务执行委托事件封装 ,主子端完全解耦✅ 动机总控台 + 主执行端 + 从执行端 三级技术栈架构✅ 主子端数据联动、汇总、实时刷新本地预置报表数据,可直接编辑查看SQLite 文件化本地数据库 ,单文件免配置✅ 完整 WinForm 界面化工业作业系统

相关推荐
SPC的存折2 小时前
(自用)LNMP-Redis-Discuz5.0部署指南-openEuler24.03-测试环境
linux·运维·服务器·数据库·redis·缓存
二等饼干~za8986682 小时前
云罗 GEO 优化系统源码厂家测评报告
大数据·网络·数据库·人工智能·django
堕落年代2 小时前
Spring 事务提交顺序深度解析:从踩坑到理解原理
数据库·spring·oracle
xcjbqd03 小时前
Python中Pandas如何将DataFrame写入MySQL_使用to_sql函数
jvm·数据库·python
ZOOOOOOU3 小时前
智慧社区云对讲门禁系统架构设计:中优云联免布线、全免费核心功能技术解析
数据库·人工智能·架构·边缘计算
Francek Chen3 小时前
【大数据存储与管理】NoSQL数据库:02 NoSQL兴起的原因
大数据·数据库·分布式·nosql
斌味代码3 小时前
RAG API 接入:从注册到生产级应用的10分钟上手指南
数据库·oracle
送秋三十五3 小时前
Spring 源码---------Spring Core
java·数据库·spring