CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/10/20 11:46:25

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

CSFrameworkV6 - MES项目过站插件开发教程

一、MES过站总体设计方案

  • 过站模块逻辑独立
  • 单个Project模块生成DLL库,作为框架插件
  • 每个过站功能对应一个菜单,如SFC6040, 对应menu_SFC6040
  • 过站菜单从EEP服务器读取,自动组装成过站大模块的主菜单
  • 每个过站功能可自动升级(点击菜单触发自动升级)
  • 过站模块整体弱依赖性,仅依赖CSFrameworkV6.Core.dll
  • 支持多语言、权限、DevExpress皮肤

二、SFCLib.dll(Project介绍)

frmBaseClient界面

  • 作为所有过站主窗体的基类窗体。
  • 支持DevExpress皮肤、多语言、权限。

FormArg.cs

过站窗体构造器的参数类。默认定义数据库名称、线体名2个属性,使用参数类方便扩展。

C# 全选
    /// <summary>
    /// 主窗体构造器参数实体
    /// </summary>
    public class FormArg
    {
        /// <summary>
        /// 数据库名称
        /// </summary>
        public string dbName { get; set; }
        
        /// <summary>
        /// 线体名称
        /// </summary>
        public string lineName { get; set; }

    }

点击菜单打开过站窗体

代码位置:CSFrameworkV6.MESProduction.frmModuleMain.cs

C# 全选
        private void OnMenuClick(Object sender, EventArgs e)
        {
            AssertLineName(); //是否选择线体

            var menuItem = sender as ToolStripMenuItem;
            var menuId = menuItem.AccessibleName;//取站点编码,如:SFC6040
            var menuData = _mesLoader.GetMenuData(menuId);
            if (menuData != null)
            {
                //检查或下载dll文件
                _mesLoader.CheckAndDownloadFile(menuData);
                
                //构造器参数                
                FormArg arg = new FormArg { dbName = _dbName, lineName = Globals.LineName };
                Form form = this.OpenForm(menuData.FormNamespace, menuData.MenuName, arg);
            }
        }

主要接口介绍

  • IStationForm:过站主窗体接口。暂没有定义具体的方法。
  • IMdiChildForm:CSFramework开发框架所有子窗体的接口。
  • IPurviewControllable:支持权限控制。
  • ILanguageSupport:支持多语言。

三、过站大模块设计 CSFrameworkV6.MESProduction(Demo模块)

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

主要特征

  • 每个过站大模块作为CSFramework开发框架的插件模块(DLL库)。
  • 大模块的菜单从EEP服务器动态加载。
  • 大模块的Project名称根据MES系统需求定义,MESProduction作为一个大模块Demo。
  • MESProduction可作为大模块的原型,若开发新的大模块,复制Project改名即可。

重要提示:复制Project后,打开Assembly.cs文件修改里面的ModuleID,ModuleNames 值,模块编号不可重复。

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

frmModuleMain 大模块主窗体

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

大模块主窗体继承 frmBaseModule 基类窗体。若开发了多个大模块,可以将通用代码封装并可移植到 frmBaseModule基类。

四、MesLoader 类介绍

过站数据加载器,工具类,EEP服务器或其他应用服务器交互通用接口封装类。

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

主要功能

  • EEP服务器数据交互
  • 获取线体清单,方法:GetLines
  • 动态加载模块菜单,方法:LoadMenu
  • 打开Mes站点的操作窗体,方法:OpenFormAsChild
  • 检查及下载新的DLL文件,方法:CheckAndDownloadFile
  • 其他接口

LoadMenu方法:递归加载菜单

C# 全选
        /// <summary>
        /// 从EEP服务器读取菜单数据
        /// </summary>
        private void LoadMenuFromServer()
        {
            const string rootMenuId = "HFSMTDEV"; 
            const int ModuleID= 11;

            //模拟的菜单数据
            List<MesMenuData> list = new List<MesMenuData>
            {
                new MesMenuData{ MenuId="SFC0000", MenuName="SFC0000", MenuParentId="HFSMTDEV", FormNamespace="SFC0000.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC0001", MenuName="SFC0001", MenuParentId="HFSMTDEV", FormNamespace="SFC0001.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC000101", MenuName="SFC000101", MenuParentId="SFC0001", FormNamespace="SFC000101.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC000102", MenuName="SFC000102", MenuParentId="SFC0001", FormNamespace="SFC000102.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC0002", MenuName="SFC0002", MenuParentId="HFSMTDEV", FormNamespace="SFC0002.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC000201", MenuName="SFC000201", MenuParentId="SFC0002", FormNamespace="SFC000201.frmMain", DefaultAuths=15 },
                new MesMenuData{ MenuId="SFC0003", MenuName="SFC0003", MenuParentId="HFSMTDEV", FormNamespace="SFC0003.frmMain", DefaultAuths=15 },
            };

            //取当前模块的菜单根节点(HFSMTDEV)加载
            _mesLoader.LoadMenu(rootMenuId, this.menuMainMESProduction, list, OnMenuClick, ModuleID);
        }

C# 全选
        /// <summary>
        /// 递归加载模块主窗体的菜单
        /// </summary>
        /// <param name="rootMenuId">菜单根节点编码</param>
        /// <param name="rootMenu">模块主菜单</param>
        /// <param name="allMenus">菜单数据</param>
        /// <param name="clickEvent">菜单click事件</param>
        /// <param name="moduleId">当前大模块的ID</param>
        public void LoadMenu(string rootMenuId, ToolStripMenuItem rootMenu, List<MesMenuData> allMenus, 
            EventHandler? clickEvent, int moduleId)
        {
            _listMenus = allMenus;
            var rootNodes = allMenus.Where(w => w.MenuParentId == rootMenuId).ToList();
            LoadSubMenu(rootNodes, rootMenu);

            //递归加载菜单
            void LoadSubMenu(List<MesMenuData> nodes, ToolStripMenuItem parentMenu)
            {
                foreach (var node in nodes)
                {
                    var menu = CreateMenu(node);
                    parentMenu.DropDownItems.Add(menu);
                    var childs = allMenus.Where(w => w.MenuParentId == node.MenuId).ToList();
                    if (childs.Count > 0)
                    {
                        LoadSubMenu(childs, menu);
                    }
                    else
                    {
                        menu.Click += clickEvent;
                    }
                }
            }

            //创建菜单组件
            ToolStripMenuItem CreateMenu(MesMenuData item)
            {
                var subMenu = new ToolStripMenuItem
                {
                    Name = "menu_" + item.MenuId.Replace(" ", ""),
                    Text = item.MenuName,
                    Tag = new MenuItemTag(MenuType.ItemOwner, moduleId, item.DefaultAuths),
                    AccessibleName = item.MenuId, //作为缓存变量,缓存菜单ID
                };                
                return subMenu;
            }
        }

菜单效果

CSFrameworkV6 | MES项目过站插件开发教程|C/S开发框架

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇