alielie
2025-10-10 15bbd62b0b24b72c717ae91ab45348a2083ad04e
HMI.Base/PluginLoader.cs
@@ -4,7 +4,6 @@
using log4net;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using System.Threading;
@@ -31,7 +30,6 @@
        private static ILog log = LogManager.GetLogger("PluginLoader");
        private static string PluginFolder = PathHelper.PluginFolder();
        public bool Completed { get; private set; } = false;
        public SqliteHelper sqliteHelper;
        public List<PluginInfo> Menus { get; private set; }
        public List<PluginInfo> Plugins { get; private set; }
@@ -50,6 +48,7 @@
            {
                Instance = null;
            }
            GC.Collect();
        }
        public static PluginLoader GetLoader()
@@ -76,6 +75,12 @@
                    LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED });
                });
            }
            pluginContainer.DoCloseEvent += PluginContainer_DoCloseEvent;
        }
        private void PluginContainer_DoCloseEvent(object sender, EventArgs e)
        {
            Reset();
        }
        private void LoadChildrenMenu()
@@ -83,7 +88,7 @@
            foreach (var menu in Plugins)
            {
                CountdownEvent c = new CountdownEvent(1);
                Thread.Sleep(80);
                Thread.Sleep(50);
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    try
@@ -158,21 +163,39 @@
            }
        }
        private PluginInfo ConvertPermission2PluginInfo(PermissionData data)
        {
            if (data.Type == "权限") return null;
            PluginInfo info = new PluginInfo
            {
                Code = data.Code,
                Name = data.Name,
                Type = data.Type,
                ParentCode = data.ParentCode,
                DllPath = data.DllPath,
                ClassName = data.ClassName,
                IconFont = data.IconFont
                //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
            };
            if (data.Children != null && data.Children.Count > 0)
            {
                foreach (var child in data.Children)
                {
                    var childInfo = ConvertPermission2PluginInfo(child);
                    if (childInfo != null) info.Children.Add(childInfo);
                }
            }
            return info;
        }
        public List<PluginInfo> LoadTreeMenu(Dispatcher dispatcher)
        {
            //LoadMessageAppend?.Invoke(this, "开始加载菜单...");
            List<PluginInfo> data = new List<PluginInfo>();
            List<PluginInfo> menus = new List<PluginInfo>();
            Dictionary<string, PluginInfo> cache = new Dictionary<string, PluginInfo>();
            try
            {
                UserInfo user = UserInfo.User;
                string sql = $@"SELECT DISTINCT m.* FROM menu AS m INNER JOIN role_menu_rel AS rrel ON m.code = rrel.menuCode
INNER JOIN role AS r ON rrel.roleCode = r.code
INNER JOIN user_role_rel AS urel ON r.code = urel.roleCode
AND urel.username = '{user.Username}' ORDER BY m.level,m.sort, m.id;";
                DataTable dt = sqliteHelper.GetDataTable(sql);
                if (dt != null)
                List<PermissionData> allPermissions = UserInfo.User?.AllPermissions;
                if (allPermissions != null)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    {
@@ -180,28 +203,27 @@
                          new LoadMsg
                          {
                              Type = LoadMsgType.INIT,
                              NumData = dt.Rows.Count,
                              Message = this.lang("App.MenuCount", dt.Rows.Count),
                              NumData = allPermissions.Count,
                              Message = this.lang("App.MenuCount", allPermissions.Count),
                          });
                        foreach (DataRow dr in dt.Rows)
                        foreach (PermissionData data in allPermissions)
                        {
                            string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString());
                            if (data.Type == "Permission") continue;
                            var menu = new PluginInfo
                            {
                                Code = dr["code"].ToString(),
                                Name = dr["name"].ToString(),
                                Type = dr["type"].ToString(),
                                ParentCode = dr["parentCode"].ToString(),
                                DllPath = dr["dllPath"].ToString(),
                                ClassName = dr["className"].ToString(),
                                IconFont = dr["icon"].ToString()
                                //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
                                Code = data.Code,
                                Name = data.Name,
                                Type = data.Type,
                                ParentCode = data.ParentCode,
                                DllPath = data.DllPath,
                                ClassName = data.ClassName,
                                IconFont = data.IconFont
                            };
                            cache[menu.Code] = menu;
                            if (!cache.ContainsKey(menu.ParentCode))
                            {
                                data.Add(menu);
                                menus.Add(menu);
                            }
                            else
                            {
@@ -217,7 +239,7 @@
            {
                //LoadMessageAppend?.Invoke(this, ex.Message);
            }
            return data;
            return menus;
        }
    }
}