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个属性,使用参数类方便扩展。
/// <summary>
/// 主窗体构造器参数实体
/// </summary>
public class FormArg
{
/// <summary>
/// 数据库名称
/// </summary>
public string dbName { get; set; }
/// <summary>
/// 线体名称
/// </summary>
public string lineName { get; set; }
}
点击菜单打开过站窗体
代码位置:CSFrameworkV6.MESProduction.frmModuleMain.cs
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模块)
主要特征
- 每个过站大模块作为CSFramework开发框架的插件模块(DLL库)。
- 大模块的菜单从EEP服务器动态加载。
- 大模块的Project名称根据MES系统需求定义,MESProduction作为一个大模块Demo。
- MESProduction可作为大模块的原型,若开发新的大模块,复制Project改名即可。
重要提示:复制Project后,打开Assembly.cs文件修改里面的ModuleID,ModuleNames 值,模块编号不可重复。
frmModuleMain 大模块主窗体
大模块主窗体继承 frmBaseModule 基类窗体。若开发了多个大模块,可以将通用代码封装并可移植到 frmBaseModule基类。
四、MesLoader 类介绍
过站数据加载器,工具类,EEP服务器或其他应用服务器交互通用接口封装类。
主要功能
- EEP服务器数据交互
- 获取线体清单,方法:GetLines
- 动态加载模块菜单,方法:LoadMenu
- 打开Mes站点的操作窗体,方法:OpenFormAsChild
- 检查及下载新的DLL文件,方法:CheckAndDownloadFile
- 其他接口
LoadMenu方法:递归加载菜单
/// <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);
}
/// <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;
}
}
菜单效果
扫一扫加作者微信