using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using Aitex.Core.RT.Log; using MECF.Framework.Common.Account.Extends; using MECF.Framework.Common.DataCenter; using MECF.Framework.UI.Client.CenterViews.Editors; using MECF.Framework.UI.Client.ClientBase; using MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel; namespace MECF.Framework.UI.Client.CenterViews.Configs.Roles { public class RoleManager { public RoleManager() { } private readonly RecipeFormatBuilder _recipeBuilder = new RecipeFormatBuilder(); public ObservableCollection ChamberType { get; set; } public ObservableCollection ProcessTypeFileList { get; set; } public bool Initialize() { _RoleContainer.Clear(); List roles = RoleAccountProvider.Instance.GetRoles(); if (roles == null) { LOG.Error("GetRoles method failed,in RoleManager"); return false; } List menus = BaseApp.Instance.MenuLoader.MenuList; this._listMenuItems = menus; if (menus == null) { LOG.Error("GetMenus method failed,in RoleManager"); return false; } //每个Role下再挂一个Recipe权限 //Recipe名称从RecipeFormat文件中获取 var chamberType = QueryDataClient.Instance.Service.GetConfig("System.Recipe.SupportedChamberType"); if (chamberType == null) { ChamberType = new ObservableCollection() { "Default" }; } else { ChamberType = new ObservableCollection(((string)(chamberType)).Split(',')); } var processType = QueryDataClient.Instance.Service.GetConfig("System.Recipe.SupportedProcessType"); if (processType == null) { processType = "Process,Routine"; } ProcessTypeFileList = new ObservableCollection(); string[] recipeProcessType = ((string)processType).Split(','); _recipeInfos = _recipeBuilder.GetRecipeColumnName($"{ChamberType[0]}\\{recipeProcessType[0]}", "PM1"); _stepInfos = _recipeBuilder.GetRecipeStepNo(); _permissionInfos = _recipeBuilder.GetContentName($"{ChamberType[0]}\\Content", "PM1"); foreach (Common.Account.Extends.Role r in roles) { RoleItem role = new RoleItem(r); role.DisplayRoleName = role.RoleName; role.DisplayAutoLogoutTime = role.AutoLogoutTime; role.DisplayIsAutoLogout = role.IsAutoLogout; role.DisplayDescription = role.Description; //Parse menu permission MenuPermission menuPermissionParse = new MenuPermission(); menuPermissionParse.ParsePermission(r.MenuPermission); MenuInfo mp = new MenuInfo() { ID = "Header" }; mp.Name = "Header"; mp.EnumPermission = menuPermissionParse.GetPermissionByPageID("Header"); role.AddMenuInfo(mp); //Get Menu information foreach (AppMenu topMenuItem in menus) { foreach (AppMenu subMenuItem in topMenuItem.MenuItems) { mp = new MenuInfo() { ID = subMenuItem.MenuID }; mp.Name = topMenuItem.ResKey + "." + subMenuItem.ResKey; //Application.Current.FindResource(subMenuItem.ResKey) as string; mp.EnumPermission = menuPermissionParse.GetPermissionByPageID(subMenuItem.MenuID); role.AddMenuInfo(mp); } } RecipeInfo recipe; foreach (RecipeInfo recipeInfo in _recipeInfos) { //需要去掉空格 recipe = new RecipeInfo(); recipe.Name = recipeInfo.Name; recipeInfo.Name = recipeInfo.Name.Replace(" ", ""); recipe.EnumPermission = menuPermissionParse.GetPermissionByPageID(recipeInfo.Name); role.AddRecipeInfo(recipe); } StepInfo step; foreach (StepInfo stepInfo in _stepInfos) { //需要去掉空格 step = new StepInfo(); step.Name = stepInfo.Name; stepInfo.Name = stepInfo.Name.Replace(" ", ""); step.EnumPermission = menuPermissionParse.GetPermissionByPageID(stepInfo.Name); role.AddStepInfo(step); } ContentInfo content; foreach (ContentInfo contentInfo in _permissionInfos) { content = new ContentInfo(); content.Name = contentInfo.Name; content.EnumPermission = menuPermissionParse.GetPermissionByPageID(contentInfo.Name); role.AddContentInfo(content); } _RoleContainer.Add(role); } return true; } public List GetAllRoles() { return _RoleContainer.ToList(); } public bool AddRole(RoleItem r) { RoleItem existRole = GetRoleByName(r.RoleName); if (existRole != null) { LOG.Info("the role already exists, in RoleManager"); return false; } existRole = GetRoleByID(r.RoleID); if (existRole != null) { LOG.Info("the role already exists, in RoleManager"); return false; } _RoleContainer.Add(r); return true; } public string GenerateRoleID() { RoleItem r = GetRoleByID(_RoleNum.ToString()); while (r != null) { _RoleNum++; r = GetRoleByID(_RoleNum.ToString()); } return _RoleNum.ToString(); } public RoleItem GetRoleByID(string ID) { return _RoleContainer.FirstOrDefault(t => t.RoleID == ID); } public RoleItem GetRoleByName(string name) { return _RoleContainer.FirstOrDefault(t => t.RoleName == name); } public RoleItem CreateRole() { RoleItem r = new RoleItem(GenerateRoleID()); r.DisplayRoleName = r.RoleName = string.Empty; r.DisplayAutoLogoutTime = r.AutoLogoutTime = 10; r.DisplayIsAutoLogout = r.IsAutoLogout = false; r.DisplayDescription = r.Description = string.Empty; r.MenuCollection.Add(new MenuInfo() { ID = "Header", Name = "Header", EnumPermission = MenuPermissionEnum.MP_NONE }); foreach (AppMenu topMenuItem in _listMenuItems) { foreach (AppMenu subMenuItem in topMenuItem.MenuItems) { MenuInfo mp = new MenuInfo() { ID = subMenuItem.MenuID, Name = topMenuItem.ResKey + "." + subMenuItem.ResKey, //Application.Current.FindResource(subMenuItem.ResKey) as string, EnumPermission = MenuPermissionEnum.MP_NONE }; r.MenuCollection.Add(mp); } } foreach (RecipeInfo recipeInfo in _recipeInfos) { RecipeInfo recipe = new RecipeInfo() { Name = recipeInfo.Name, EnumPermission = MenuPermissionEnum.MP_NONE }; r.AddRecipeInfo(recipe); } foreach (StepInfo sInfo in _stepInfos) { StepInfo step = new StepInfo() { Name = sInfo.Name, EnumPermission = MenuPermissionEnum.MP_NONE }; r.AddStepInfo(step); } foreach (ContentInfo permissionInfo in _permissionInfos) { ContentInfo permission = new ContentInfo() { Name = permissionInfo.Name, EnumPermission = MenuPermissionEnum.MP_NONE }; r.AddContentInfo(permission); } return r; } public RoleItem CreateRole(RoleItem role) { RoleItem newRole = new RoleItem(GenerateRoleID()) { RoleName = role.RoleName, AutoLogoutTime = role.AutoLogoutTime, IsAutoLogout = role.IsAutoLogout, Description = role.Description, DisplayRoleName = role.DisplayRoleName, DisplayAutoLogoutTime = role.DisplayAutoLogoutTime, DisplayIsAutoLogout = role.DisplayIsAutoLogout, DisplayDescription = role.DisplayDescription }; foreach (MenuInfo mInfo in role.MenuCollection) { newRole.AddMenuInfo(mInfo.Clone()); } foreach (RecipeInfo rInfo in role.RecipeCollection) { newRole.AddRecipeInfo(rInfo.Clone()); } foreach (StepInfo sInfo in role.RecipeStepCollection) { newRole.AddStepInfo(sInfo.Clone()); } foreach (ContentInfo pInfo in role.ContentCollection) { newRole.AddContentInfo(pInfo.Clone()); } return newRole; } public RoleItem CloneRole(RoleItem role) { RoleItem newRole = new RoleItem(role.RoleID) { RoleName = role.RoleName, AutoLogoutTime = role.AutoLogoutTime, IsAutoLogout = role.IsAutoLogout, Description = role.Description, DisplayRoleName = role.DisplayRoleName, DisplayAutoLogoutTime = role.DisplayAutoLogoutTime, DisplayIsAutoLogout = role.DisplayIsAutoLogout, DisplayDescription = role.DisplayDescription }; foreach (MenuInfo mInfo in role.MenuCollection) { newRole.AddMenuInfo(mInfo.Clone()); } foreach (RecipeInfo rInfo in role.RecipeCollection) { newRole.AddRecipeInfo(rInfo.Clone()); } foreach (StepInfo sInfo in role.RecipeStepCollection) { newRole.AddStepInfo(sInfo.Clone()); } foreach (ContentInfo pInfo in role.ContentCollection) { newRole.AddContentInfo(pInfo.Clone()); } return newRole; } public RoleItem CloneRole(string strRoleID) { RoleItem orignalRole = GetRoleByID(strRoleID); if (null == orignalRole) return null; RoleItem newRole = new RoleItem(strRoleID) { AutoLogoutTime = orignalRole.AutoLogoutTime, IsAutoLogout = orignalRole.IsAutoLogout, RoleName = orignalRole.RoleName, Description = orignalRole.Description, DisplayRoleName = orignalRole.DisplayRoleName, DisplayAutoLogoutTime = orignalRole.DisplayAutoLogoutTime, DisplayIsAutoLogout = orignalRole.DisplayIsAutoLogout, DisplayDescription = orignalRole.DisplayDescription }; foreach (MenuInfo mInfo in orignalRole.MenuCollection) { newRole.AddMenuInfo(mInfo.Clone()); } foreach (RecipeInfo rInfo in orignalRole.RecipeCollection) { newRole.AddRecipeInfo(rInfo.Clone()); } foreach (ContentInfo pInfo in orignalRole.ContentCollection) { newRole.AddContentInfo(pInfo.Clone()); } foreach (StepInfo sInfo in orignalRole.RecipeStepCollection) { newRole.AddStepInfo(sInfo.Clone()); } return newRole; } public bool CheckAvailable(RoleItem role) { if (role == null) return false; foreach (RoleItem r in _RoleContainer) { if (role.RoleName == r.RoleName && role.RoleID != r.RoleID) { LOG.Info("Check account available fail because the name already exists, in RoleManager"); return false; } } return true; } public bool SaveRole(RoleItem pRoletoSave) { if (!CheckAvailable(pRoletoSave)) return false; Common.Account.Extends.Role r = new Common.Account.Extends.Role( pRoletoSave.RoleID, pRoletoSave.RoleName, pRoletoSave.IsAutoLogout, pRoletoSave.AutoLogoutTime, MenuPermission.PermissionToString(pRoletoSave.MenuCollection, pRoletoSave.RecipeCollection, pRoletoSave.ContentCollection,pRoletoSave.RecipeStepCollection), pRoletoSave.Description ); if (RoleAccountProvider.Instance.UpdateRole(r)) { RoleItem orignalRole = GetRoleByID(pRoletoSave.RoleID); if (null == orignalRole) { RoleItem NewRole = CloneRole(pRoletoSave); AddRole(NewRole); return true; } orignalRole.RoleName = pRoletoSave.RoleName; orignalRole.IsAutoLogout = pRoletoSave.IsAutoLogout; orignalRole.AutoLogoutTime = pRoletoSave.AutoLogoutTime; orignalRole.Description = pRoletoSave.Description; orignalRole.MenuCollection.Clear(); foreach (MenuInfo mInfo in pRoletoSave.MenuCollection) { orignalRole.AddMenuInfo(mInfo.Clone()); mInfo.ComboBoxSaved = true; } foreach (RecipeInfo rInfo in pRoletoSave.RecipeCollection) { orignalRole.AddRecipeInfo(rInfo.Clone()); rInfo.ComboBoxSaved = true; } foreach (ContentInfo pInfo in pRoletoSave.ContentCollection) { orignalRole.AddContentInfo(pInfo.Clone()); pInfo.ComboBoxSaved = true; } foreach (StepInfo sInfo in pRoletoSave.RecipeStepCollection) { orignalRole.AddStepInfo(sInfo.Clone()); sInfo.ComboBoxSaved = true; } } else { LOG.Error("UpdateRoles method failed, in RoleManager"); return false; } return true; } public bool DeleteRole(string strRoleID) { RoleItem r = GetRoleByID(strRoleID); if (r != null) { if (RoleAccountProvider.Instance.DeleteRole(strRoleID)) { _RoleContainer.Remove(r); return true; } else { LOG.Error("DeleteRole method failed, in RoleManager"); } } else { LOG.Warning("Can not find the role to delete, in RoleManager"); } return false; } private static RoleManager _Instance = null; public static RoleManager Instance { get { if (_Instance == null) { _Instance = new RoleManager(); } return _Instance; } } private ObservableCollection _RoleContainer = new ObservableCollection(); public ObservableCollection RoleContainer { get { return _RoleContainer; } } private static int _RoleNum = 0; private List _listMenuItems = null; private ObservableCollection _recipeInfos = null; private ObservableCollection _stepInfos = null; private ObservableCollection _permissionInfos = null; } public class MenuPermission { public void ParsePermission(string strPermission) { try { strPermission = strPermission.Replace("\n", "").Replace(" ", ""); int groupIndex = strPermission.IndexOf(';'); if (groupIndex == -1) { AddToDictionary(strPermission); return; } string strGroup = strPermission.Substring(0, groupIndex); AddToDictionary(strGroup); ParsePermission(strPermission.Substring(groupIndex + 1)); } catch (System.Exception ex) { LOG.Write(ex); } } public MenuPermissionEnum GetPermissionByPageID(string strPageID) { if (MenuPermissionDictionary.ContainsKey(strPageID)) { return MenuPermissionDictionary[strPageID]; } return MenuPermissionEnum.MP_NONE; } public static string PermissionToString(ObservableCollection listPermission, ObservableCollection recipeListPermission, ObservableCollection permissionListPermission, ObservableCollection recipeStepPermission) { string strResult = ""; if (listPermission == null) return strResult; foreach (MenuInfo info in listPermission) { strResult += info.ID; strResult += ","; strResult += info.IndexPermission; strResult += ";"; } foreach (RecipeInfo info in recipeListPermission) { strResult += info.Name; strResult += ","; strResult += info.IndexPermission; strResult += ";"; } foreach (ContentInfo info in permissionListPermission) { strResult += info.Name; strResult += ","; strResult += info.IndexPermission; strResult += ";"; } foreach (StepInfo info in recipeStepPermission) { strResult += info.Name; strResult += ","; strResult += info.IndexPermission; strResult += ";"; } return strResult; } private void AddToDictionary(string strGroupName) { int Index = strGroupName.IndexOf(','); if (Index == -1) return; string strMenuID = strGroupName.Substring(0, Index); string strMenuPermision = strGroupName.Substring(Index + 1); MenuPermissionDictionary.Add(strMenuID, (MenuPermissionEnum)Convert.ToInt32(strMenuPermision)); } public MenuPermissionEnum this[string strPageID] { get { return GetPermissionByPageID(strPageID); } } private Dictionary _dicPermission = new Dictionary(); public Dictionary MenuPermissionDictionary { get { return _dicPermission; } } } }