using Tiger.Model; using SqlSugar; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Rhea.Common; using System.Net; using System.Linq; using Newtonsoft.Json; namespace Tiger.Business { public partial class Biz { /// /// 获取菜单列表 /// /// /// public async Task getMenuList(string userid, string rootCode) { var data = new List(); var query = Biz.Db.Queryable((t, p, g, r, m, f) => new JoinQueryInfos( JoinType.Inner, t.ID == p.USER_ID, JoinType.Inner, p.USERGROUP_CODE == g.ID, JoinType.Inner, p.USERGROUP_CODE == r.USERGROUP_CODE, JoinType.Inner, r.ROLE_CODE == m.ROLE_CODE, JoinType.Inner, m.FUNC_CODE == f.ID)) .WhereIF(!string.IsNullOrEmpty(userid), (t, p, g, r, m, f) => t.USER_ID == userid && f.IS_USE == "1" && f.FUNC_TYPE != "2") .Select((t, p, g, r, m, f) => new SYS_MENU { ID = f.ID, FUNC_CODE = f.FUNC_CODE, FUNC_NAME = f.FUNC_NAME, FUNC_DESC = f.FUNC_DESC, FUNC_GROUP = f.FUNC_GROUP, FUNC_TYPE = f.FUNC_TYPE, PFUNC_CODE = f.PFUNC_CODE, FUNC_CLASS = f.FUNC_CLASS, PATH = f.PATH, ICON_URL = f.ICON_URL, SEQ_NO = f.SEQ_NO, OPEN_MODE = f.OPEN_MODE, IS_USE = f.IS_USE, OPER_CODE = f.OPER_CODE, CREATE_USER = f.CREATE_USER, CREATE_TIME = f.CREATE_TIME, UPDATE_USER = f.UPDATE_USER, UPDATE_TIME = f.UPDATE_TIME, SYMBOLIC_NAME = f.SYMBOLIC_NAME, COMPONENT = f.COMPONENT, CURRENTACTIVEMENU = f.CURRENTACTIVEMENU, SHOW = f.SHOW, IGNOREKEEPALIVE = f.IGNOREKEEPALIVE, IGNOREAUTH = f.IGNOREAUTH, BUTTON_TYPE = f.BUTTON_TYPE, DO_METHOD = f.DO_METHOD, }); var items = await query.Distinct().ToListAsync(); List entities = items.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == rootCode); //"23858079-7241-4e64-b0cf-eb5dbe84a9d6" foreach (var item in entities) { MenuItem menuItem = new(); menuItem.id = item.ID; menuItem.func_code = item.FUNC_CODE; menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}"; menuItem.name = item.FUNC_NAME; menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT; if (item.FUNC_CLASS == "PDA") { menuItem.pages = menuItem.component; menuItem.url = item.ICON_URL; } menuItem.meta = new(); menuItem.meta.icon = item.ICON_URL; // item.ICON_URL; menuItem.meta.orderNo = item.SEQ_NO; menuItem.meta.title = item.FUNC_NAME; menuItem.meta.menuId = item.ID; menuItem.meta.menuCode = item.FUNC_CODE; menuItem.btnType = item.BUTTON_TYPE; menuItem.meta.btnType = item.BUTTON_TYPE; menuItem.meta.doMethod = item.DO_METHOD; if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE)) { menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false; } if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU)) { menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU; } if (!string.IsNullOrEmpty(item.SHOW)) { menuItem.meta.hideMenu = item.SHOW == "1" ? true : false; menuItem.meta.showMenu = item.SHOW == "0" ? true : false; } if (!string.IsNullOrEmpty(item.IGNOREAUTH)) { menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y"; } menuItem.keepalive = item.IGNOREKEEPALIVE; menuItem.show = item.SHOW; menuItem.menuName = item.FUNC_NAME; menuItem.status = item.IS_USE; menuItem.btnType = item.BUTTON_TYPE; menuItem.func_group = item.FUNC_GROUP; menuItem.children = new(); GetMenuItem(items.ToList(), item.FUNC_CODE, ref menuItem); data.Add(menuItem); } //转换Json时,去除值为null的属性 var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting); return json; } /// /// 获取所有菜单列表 /// /// public async Task getMenuListAll(string menuName, string status) { var data = new List(); SYS_MENU func = null; if (!string.IsNullOrEmpty(menuName)) { string name = menuName.StartsWith("BS")?"BS": menuName; func = Biz.Db.Queryable().Where(x => x.FUNC_NAME == name).First(); } if (func != null) { var items = await Biz.Db.Queryable() .WhereIF(!string.IsNullOrEmpty(status), q => q.IS_USE == status) .OrderBy(x => x.SEQ_NO) .Distinct().ToListAsync(); List entities = items.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == func.FUNC_CODE); foreach (var item in entities) { MenuItem menuItem = new(); menuItem.id = item.ID; menuItem.func_code = item.FUNC_CODE; menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}"; menuItem.name = item.FUNC_NAME; menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT; if (item.FUNC_CLASS == "PDA") { menuItem.pages = menuItem.component; menuItem.url = item.ICON_URL; } menuItem.meta = new(); menuItem.meta.icon = item.ICON_URL; // item.ICON_URL; menuItem.meta.orderNo = item.SEQ_NO; menuItem.meta.title = item.FUNC_NAME; menuItem.meta.menuId = item.ID; menuItem.meta.menuCode = item.FUNC_CODE; menuItem.meta.btnType = item.BUTTON_TYPE; menuItem.meta.doMethod = item.DO_METHOD; if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE)) { menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false; } if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU)) { menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU; } if (!string.IsNullOrEmpty(item.SHOW)) { menuItem.meta.hideMenu = item.SHOW == "1" ? true : false; menuItem.meta.showMenu = item.SHOW == "0" ? true : false; } if (!string.IsNullOrEmpty(item.IGNOREAUTH)) { menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y"; } menuItem.keepalive = item.IGNOREKEEPALIVE; menuItem.show = item.SHOW; menuItem.menuName = item.FUNC_NAME; menuItem.createTime = item.CREATE_TIME; menuItem.status = item.IS_USE; menuItem.icon = menuItem.meta.icon; menuItem.func_type = item.FUNC_TYPE; menuItem.func_group = item.FUNC_GROUP; menuItem.btnType = item.BUTTON_TYPE; menuItem.parentMenu = item.PFUNC_CODE; menuItem.orderNo = item.SEQ_NO; menuItem.children = null; GetMenuItem(items, item.FUNC_CODE, ref menuItem); data.Add(menuItem); } }; //转换Json时,去除值为null的属性 var jsonSetting = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting); return json; } /// /// 保存菜单 /// /// /// /// public async Task SaveMenu(ApiAction action, bool Async = true) { var apiAction = new ApiAction(); try { SaveMenuParams data = action.Data; //保存到数据库 var db = Business.Biz.Db; var dbTran = db.UseTran(() => { SYS_MENU func = Biz.Db.Queryable().Where(x => x.ID == data.id).First(); if (func != null) { func.FUNC_NAME = data.menuName; func.IS_USE = data.status; func.PFUNC_CODE = data.parentMenu; func.PATH = data.path; func.ICON_URL = data.icon; func.SEQ_NO = (int)data.orderNo; func.FUNC_TYPE = data.func_type; func.BUTTON_TYPE = data.btnType; func.DO_METHOD = data.doMethod; func.COMPONENT = string.IsNullOrEmpty(data.component) && data.func_type == "0" ? "LAYOUT" : data.component; func.IGNOREKEEPALIVE = data.keepalive; func.SHOW = data.show; func.FUNC_GROUP = data.func_group; //func.CURRENTACTIVEMENU = data.keepalive } else { func = new() { ID = data.id ?? Guid.NewGuid().ToString("N"), FUNC_CODE = Guid.NewGuid().ToString("N"), FUNC_NAME = data.menuName, FUNC_DESC = data.menuName, FUNC_GROUP = data.func_group, FUNC_TYPE = data.func_type, BUTTON_TYPE = data.btnType, DO_METHOD = data.doMethod, PFUNC_CODE = data.parentMenu, FUNC_CLASS = data.func_class?? "BS", PATH = data.path, ICON_URL = data.icon, SEQ_NO = (int)data.orderNo, IS_USE = data.status, COMPONENT = string.IsNullOrEmpty(data.component) && data.func_type == "0" ? "LAYOUT" : data.component, IGNOREKEEPALIVE = data.keepalive, SHOW = data.show }; } //更新 if (data != null && data.isUpdate) { db.Updateable(func, "system").ExecuteCommand(); } //新增 else { db.Insertable(func, "system").ExecuteCommand(); //如果是新增的菜单,查出所有父级更新为半选 List menus = new(); GetRootMenu(func, ref menus); var roles = menus.Select(x => x.ID).ToList(); db.Updateable().SetColumns(t => t.HALF_CHECK == "Y").Where(x => roles.Contains(x.FUNC_CODE) || x.FUNC_CODE == "system").ExecuteCommand(); } }); if (!dbTran.IsSuccess) { apiAction.Data = null; apiAction.IsSuccessed = false; apiAction.Message += $"保存数据失败:{dbTran.ErrorMessage}"; return apiAction; } } catch (System.Exception ex) { } return apiAction; } /// /// 递归返回菜单 /// /// /// /// private static void GetMenuItem(List data, string parent, ref MenuItem pMenuItem) { List entities = data.OrderBy(x => x.SEQ_NO).ToList().FindAll(t => t.PFUNC_CODE == parent).Distinct().ToList(); if (entities.Count > 0) { foreach (var item in entities) { MenuItem menuItem = new(); menuItem.id = item.ID; menuItem.func_code = item.FUNC_CODE; menuItem.path = (item.PATH ?? "").StartsWith("/dashboard") ? "/dashboard" : $"{item.PATH}"; menuItem.name = item.FUNC_NAME; menuItem.component = (item.PATH == null || item.PATH == "#") ? "LAYOUT" : item.COMPONENT; if (item.FUNC_CLASS == "PDA") { menuItem.pages = menuItem.component; menuItem.url = item.ICON_URL; } menuItem.meta = new(); menuItem.meta.icon = item.ICON_URL; //item.ICON_URL; menuItem.meta.orderNo = item.SEQ_NO; menuItem.meta.title = item.FUNC_NAME; menuItem.meta.menuId = item.ID; menuItem.meta.menuCode = item.FUNC_CODE; menuItem.meta.btnType = item.BUTTON_TYPE; menuItem.meta.doMethod = item.DO_METHOD; if (!string.IsNullOrEmpty(item.IGNOREKEEPALIVE)) { menuItem.meta.ignoreKeepAlive = item.IGNOREKEEPALIVE == "0" ? true : false; } if (!string.IsNullOrEmpty(item.CURRENTACTIVEMENU)) { menuItem.meta.currentActiveMenu = item.CURRENTACTIVEMENU; } if (!string.IsNullOrEmpty(item.SHOW)) { menuItem.meta.hideMenu = item.SHOW == "1" ? true : false; menuItem.meta.showMenu = item.SHOW == "0" ? true : false; } if (!string.IsNullOrEmpty(item.IGNOREAUTH)) { menuItem.meta.ignoreAuth = item.IGNOREAUTH == "Y"; } menuItem.keepalive = item.IGNOREKEEPALIVE; menuItem.show = item.SHOW; menuItem.menuName = item.FUNC_NAME; menuItem.createTime = item.CREATE_TIME; menuItem.icon = menuItem.meta.icon; menuItem.func_type = item.FUNC_TYPE; menuItem.btnType = item.BUTTON_TYPE; menuItem.doMethod = item.DO_METHOD; menuItem.parentMenu = item.PFUNC_CODE; menuItem.func_group = item.FUNC_GROUP; menuItem.orderNo = item.SEQ_NO; menuItem.status = item.IS_USE; menuItem.children = null; GetMenuItem(data, item.FUNC_CODE, ref menuItem); if (pMenuItem.children == null) { pMenuItem.children = new(); } pMenuItem.children.Add(menuItem); } } } private static void GetRootMenu(SYS_MENU menu, ref List items) { SYS_MENU menuRet = null; try { menuRet = Biz.Db.Queryable().Where(q => q.FUNC_CODE == menu.PFUNC_CODE && q.FUNC_CODE != "system01").Single(); //23858079-7241-4e64-b0cf-eb5dbe84a9d6 if (menuRet != null) { if (!items.Where(x => x.FUNC_CODE == menuRet.FUNC_CODE).Any()) { items.Add(menuRet); } GetRootMenu(menuRet, ref items); } } catch (System.Exception ex) { Logger.Default.Fatal($"获取菜单[{menu.FUNC_CODE}]的root菜单异常: {ex.Message}"); } } } }