using System; using System.Collections.Generic; using System.Text; using System.Data; using WeiSha.Common; using Song.Entities; using WeiSha.Data; using Song.ServiceInterfaces; using System.Data.Common; using System.Reflection; using System.Xml; namespace Song.ServiceImpls { public class ManageMenuCom : IManageMenu { #region 菜单树的管理 /// /// 添加 /// /// 业务实体 public int RootAdd(ManageMenu entity) { int id = this.Add(entity); if (id > 0) { entity = this.GetSingle(id); entity.MM_Root = id; } else { entity = Gateway.Default.From().OrderBy(ManageMenu._.MM_Id.Desc).ToFirst(); entity.MM_Root = entity.MM_Id; id = entity.MM_Id; } entity.MM_Tax = this.GetMaxTaxis(0) + 1; entity.MM_PatId = entity.MM_PatId; Gateway.Default.Save(entity); return id; } /// /// 修改 /// /// 业务实体 public int RootSave(ManageMenu entity) { int id = entity.MM_Id; using (DbTrans tran = Gateway.Default.BeginTrans()) { try { tran.Save(entity); tran.Update(new Field[] { ManageMenu._.MM_IsUse, ManageMenu._.MM_IsShow }, new object[] { entity.MM_IsUse, entity.MM_IsShow }, ManageMenu._.MM_Root == entity.MM_Id); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } return id; } /// /// 删除 /// /// 业务实体 public int RootDelete(ManageMenu entity) { return RootDelete(entity.MM_Id); } public int RootDelete(int identify) { using (DbTrans tran = Gateway.Default.BeginTrans()) { try { this._Delete(identify, tran); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } return identify; } /// /// 获取对象;即所有栏目; /// /// public ManageMenu[] GetRoot(int identify) { return Gateway.Default.From().Where(ManageMenu._.MM_Root == identify).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetRoot(string func) { return Gateway.Default.From().Where(ManageMenu._.MM_PatId == 0 && ManageMenu._.MM_Func == func).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetRoot(bool? isShow) { if (isShow == null) { return this.GetRoot("func"); } return Gateway.Default.From().Where(ManageMenu._.MM_PatId == 0 && ManageMenu._.MM_IsShow == isShow).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetRoot(string func, bool? isShow) { if (isShow == null) { return this.GetRoot(func); } return Gateway.Default.From().Where(ManageMenu._.MM_PatId == 0 && ManageMenu._.MM_IsShow == isShow && ManageMenu._.MM_Func == func).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetRoot(int identify, bool? isShow) { if (isShow == null) { return this.GetRoot(identify); } return Gateway.Default.From().Where(ManageMenu._.MM_Root == identify && ManageMenu._.MM_IsShow == isShow).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } /// /// 获取树对象,即所有栏目; /// /// /// /// public ManageMenu[] GetTree(string func, bool? isShow) { if (isShow == null) { return Gateway.Default.From().Where(ManageMenu._.MM_Func == func).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } return Gateway.Default.From().Where(ManageMenu._.MM_Func == func && ManageMenu._.MM_IsShow == isShow).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetTree(string func, bool? isShow, bool? isUse) { if (isUse == null) { return this.GetTree(func, isShow); } if (isShow == null) { return Gateway.Default.From().Where(ManageMenu._.MM_Func == func && ManageMenu._.MM_IsUse == isUse).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } return Gateway.Default.From().Where(ManageMenu._.MM_Func == func && ManageMenu._.MM_IsShow == isShow && ManageMenu._.MM_IsUse == isUse).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } #endregion /// /// 添加 /// /// 业务实体 public int Add(ManageMenu entity) { //如果没有排序号,则自动计算 if (entity.MM_Tax < 1) { object obj = Gateway.Default.Max(ManageMenu._.MM_Tax, ManageMenu._.MM_PatId == entity.MM_PatId); entity.MM_Tax = obj is int ? (int)obj + 1 : 0; } Gateway.Default.Save(entity); entity = Gateway.Default.From().OrderBy(ManageMenu._.MM_Id.Desc).ToFirst(); return entity.MM_Id; } /// /// 修改 /// /// 业务实体 public void Save(ManageMenu entity) { //entity.MM_IsShow Gateway.Default.Save(entity); } /// /// 修改排序 /// /// public void SaveOrder(string xml) { XmlDocument resXml = new XmlDocument(); resXml.XmlResolver = null; using (DbTrans tran = Gateway.Default.BeginTrans()) try { resXml.LoadXml(xml, false); XmlNodeList nodeList = resXml.SelectSingleNode("nodes").ChildNodes; //取rootid XmlNode nodes = resXml.SelectSingleNode("nodes"); XmlElement xenodes = (XmlElement)nodes; //遍历所有子节点 foreach (XmlNode xn in nodeList) { XmlElement xe = (XmlElement)xn; int id = Convert.ToInt32(xe.Attributes["id"].Value); int pid = Convert.ToInt32(xe.Attributes["pid"].Value); int tax = Convert.ToInt32(xe.Attributes["tax"].Value); bool state = Convert.ToBoolean(xe.Attributes["state"].Value); Song.Entities.ManageMenu mm = this.GetSingle(id); if (mm != null) { mm.MM_PatId = pid; mm.MM_Tax = tax; mm.MM_State = state; tran.Save(mm); } } tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } finally { tran.Close(); } } public void Move(ManageMenu entity, int rootid) { if (entity.MM_Root == rootid) { Gateway.Default.Save(entity); } if (entity.MM_Root != rootid) { entity.MM_PatId = rootid; entity.MM_Tax = 0; this._move(entity, rootid); } } private void _move(ManageMenu entity, int rootid) { entity.MM_Root = rootid; Gateway.Default.Save(entity); // ManageMenu[] mm = this.GetChilds(entity.MM_Id); foreach (ManageMenu m in mm) _move(m, rootid); } public void Copy(ManageMenu entity, int rootid) { if (entity.MM_Root == rootid) { Gateway.Default.Save(entity); } if (entity.MM_Root != rootid) { entity.MM_PatId = rootid; _copty(entity, rootid, -1); } } /// /// 复制一个新增节点 /// /// /// private ManageMenu _copySingle(ManageMenu entity) { ManageMenu mm = new ManageMenu(); Type info = mm.GetType(); //获取对象的属性列表 PropertyInfo[] properties = info.GetProperties(); for (int i = 0; i < properties.Length; i++) { PropertyInfo pi = properties[i]; string pname = pi.Name; if (pi.Name.IndexOf("_") > -1) pname = pname.Substring(pname.IndexOf("_") + 1); if (pname.Trim().ToLower() == "id") continue; //当前属性的值 object obj = info.GetProperty(pi.Name).GetValue(entity, null); info.GetProperty(pi.Name).SetValue(mm, obj, null); } return mm; } private void _copty(ManageMenu entity, int rootid, int pid) { ManageMenu tm = _copySingle(entity); tm.MM_Root = rootid; if (pid > 0) tm.MM_PatId = pid; Gateway.Default.Save(tm); // ManageMenu[] mm = this.GetChilds(entity.MM_Id); foreach (ManageMenu m in mm) _copty(m, rootid, tm.MM_Id); } /// /// 删除 /// /// 业务实体 public void Delete(ManageMenu entity) { ManageMenu dep = Gateway.Default.From().Where(ManageMenu._.MM_Id == entity.MM_Id).ToFirst(); if (dep == null) return; using (DbTrans tran = Gateway.Default.BeginTrans()) { try { this._Delete(dep.MM_Id, tran); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } } /// /// 删除,按主键ID; /// /// 实体的主键 public void Delete(int identify) { using (DbTrans tran = Gateway.Default.BeginTrans()) try { this._Delete(identify, tran); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } /// /// 删除,按栏目名称 /// /// 栏目名称 public void Delete(string name) { ManageMenu dep = Gateway.Default.From().Where(ManageMenu._.MM_Name == name).ToFirst(); if (dep == null) return; using (DbTrans tran = Gateway.Default.BeginTrans()) { try { this._Delete(dep.MM_Id, tran); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } } /// /// 获取单一实体对象,按主键ID; /// /// 实体的主键 /// public ManageMenu GetSingle(int identify) { return Gateway.Default.From().Where(ManageMenu._.MM_Id == identify).ToFirst(); } /// /// 获取单一实体对象,按栏目名称 /// /// 栏目名称 /// public ManageMenu GetSingle(string name) { return Gateway.Default.From().Where(ManageMenu._.MM_Name == name).ToFirst(); } /// /// 通过标识获取根节点 /// /// /// public ManageMenu GetRootMarker(string marker) { WhereClip wc = ManageMenu._.MM_Marker == marker && ManageMenu._.MM_PatId == 0; return Gateway.Default.From().Where(wc).OrderBy(ManageMenu._.MM_Tax.Asc).ToFirst(); } /// /// 获取同一父级下的最大排序号; /// /// 父Id /// public int GetMaxTaxis(int parentId) { //添加对象,并设置排序号 object obj = Gateway.Default.Max(ManageMenu._.MM_Tax, ManageMenu._.MM_PatId == parentId); int tax = 0; if (obj is int) { tax = (int)obj; } return tax; } /// /// 获取当前对象的父级对象; /// /// 当前实体的主键 /// public ManageMenu GetParent(int identify) { ManageMenu mm = this.GetSingle(identify); if (mm == null) { return null; } return this.GetSingle(mm.MM_Id); } /// /// 获取当前对象的父级对象; /// /// 当前栏目的名称 /// public ManageMenu GetParent(string name) { ManageMenu mm = this.GetSingle(name); if (mm == null) { return null; } return this.GetSingle(mm.MM_Id); } /// /// 获取对象;即所有栏目; /// /// public ManageMenu[] GetAll() { return Gateway.Default.From().ToArray(); } /// /// 获取对象;即所有可用栏目; /// /// public ManageMenu[] GetAll(bool? isUse, bool? isShow) { WhereClip wc = ManageMenu._.MM_Name != ""; if (isUse != null) { wc.And(ManageMenu._.MM_IsUse == isUse); } if (isShow != null) { wc.And(ManageMenu._.MM_IsShow == isShow); } return Gateway.Default.From().Where(wc).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } /// /// 获取所有对象,功能菜单或系统菜菜 /// /// /// /// /// public ManageMenu[] GetAll(bool? isUse, bool? isShow, string type) { WhereClip wc = new WhereClip(); if (isUse != null) wc.And(ManageMenu._.MM_IsUse == isUse); if (isShow != null) wc.And(ManageMenu._.MM_IsShow == isShow); if (type == "sys") { wc.And(ManageMenu._.MM_Func == type); } else { wc.And(ManageMenu._.MM_Func == "func"); } return Gateway.Default.From().Where(wc).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetAll(int rootid, bool? isUse, bool? isShow, string type) { if (rootid < 1) return GetAll(isUse, isShow, type); WhereClip wc = new WhereClip(); if (rootid > 0) wc.And(ManageMenu._.MM_Root == rootid); if (isUse != null) wc.And(ManageMenu._.MM_IsUse == isUse); if (isShow != null) wc.And(ManageMenu._.MM_IsShow == isShow); if (type == "sys") { wc.And(ManageMenu._.MM_Func == type); } else { wc.And(ManageMenu._.MM_Func == "func"); } return Gateway.Default.From().Where(wc).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } /// /// 获取当前对象的子级对象; /// /// 当前实体的主键 /// public ManageMenu[] GetChilds(int identify) { //仅取当前对象的下一级对象; return Gateway.Default.From().Where(ManageMenu._.MM_PatId == identify).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } public ManageMenu[] GetChilds(int identify, bool? isUse, bool? isShow) { WhereClip wc = ManageMenu._.MM_PatId == identify; if (isUse != null) wc.And(ManageMenu._.MM_IsUse == isUse); if (isShow != null) wc.And(ManageMenu._.MM_IsShow == isShow); return Gateway.Default.From().Where(wc).OrderBy(ManageMenu._.MM_Tax.Asc).ToArray(); } /// /// 当前对象名称是否重名 /// /// 业务实体 /// 重名返回true,否则返回false public bool IsExist(ManageMenu entity) { ManageMenu mm = null; //如果是一个新对象 if (entity.MM_Id == 0) { mm = Gateway.Default.From().Where(ManageMenu._.MM_Name == entity.MM_Name).ToFirst(); } else { //如果是一个已经存在的对象,则不匹配自己 mm = Gateway.Default.From().Where(ManageMenu._.MM_Name == entity.MM_Name && ManageMenu._.MM_Id != entity.MM_Id).ToFirst(); } return mm != null; } /// /// 在当前对象的同级(兄弟中),该对象是否重名, /// /// 业务实体 /// 是否限制在当前层的判断;true,表示仅在当前层判断,false表示在所有对象中判断 /// public bool IsExist(ManageMenu entity, bool isSibling) { //在当前兄弟中判断 if (isSibling) { ManageMenu mm = null; //如果是一个新对象 if (entity.MM_Id == 0) { mm = Gateway.Default.From().Where(ManageMenu._.MM_Name == entity.MM_Name && ManageMenu._.MM_PatId == entity.MM_PatId).ToFirst(); } else { //如果是一个已经存在的对象,则不匹配自己 mm = Gateway.Default.From().Where(ManageMenu._.MM_Name == entity.MM_Name && ManageMenu._.MM_Id != entity.MM_Id && ManageMenu._.MM_PatId == entity.MM_PatId).ToFirst(); } return mm != null; } //在所有对象有判断 return IsExist(entity); }/// /// 移动对象到其它节点下; /// /// 当前对象id /// 要移动到某个节点下的id,即父节点id,必须大于-1 /// 移动成功返回true,否则返回false public bool Remove(int currentId, int parentId) { if (parentId < 0) { return false; } ManageMenu ws = Gateway.Default.From().Where(ManageMenu._.MM_Id == currentId).ToFirst(); ws.MM_PatId = parentId; Gateway.Default.Save(ws); return true; } /// /// 将当前栏目向上移动;仅在当前对象的同层移动,即同一父节点下的对象之间移动; /// /// /// 如果已经处于顶端,则返回false;移动成功,返回true public bool RemoveUp(int id) { //当前对象 ManageMenu current = Gateway.Default.From().Where(ManageMenu._.MM_Id == id).ToFirst(); //当前对象父节点id; int parentId = (int)current.MM_PatId; //当前对象排序号 int orderValue = (int)current.MM_Tax; //上一个对象,即兄长对象; ManageMenu up = Gateway.Default.From().Where(ManageMenu._.MM_PatId == parentId && ManageMenu._.MM_Tax < orderValue).OrderBy(ManageMenu._.MM_Tax.Desc).ToFirst(); if (up == null) { //如果兄长对象不存在,则表示当前节点在兄弟中是老大;即是最顶点; return false; } //交换排序号 current.MM_Tax = up.MM_Tax; up.MM_Tax = orderValue; using (DbTrans tran = Gateway.Default.BeginTrans()) { try { tran.Save(current); tran.Save(up); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } return true; } /// /// 将当前栏目向下移动;仅在当前对象的同层移动,即同一父节点下的对象之间移动; /// /// /// 如果已经处于最底端,则返回false;移动成功,返回true public bool RemoveDown(int id) { //当前对象 ManageMenu current = Gateway.Default.From().Where(ManageMenu._.MM_Id == id).ToFirst(); //当前对象父节点id; int parentId = (int)current.MM_PatId; //当前对象排序号 int orderValue = (int)current.MM_Tax; //下一个对象,即弟弟对象; ManageMenu down = Gateway.Default.From().Where(ManageMenu._.MM_PatId == parentId && ManageMenu._.MM_Tax > orderValue).OrderBy(ManageMenu._.MM_Tax.Asc).ToFirst(); if (down == null) { //如果弟对象不存在,则表示当前节点在兄弟中是老幺;即是最底端; return false; } //交换排序号 current.MM_Tax = down.MM_Tax; down.MM_Tax = orderValue; using (DbTrans tran = Gateway.Default.BeginTrans()) { try { tran.Save(current); tran.Save(down); tran.Commit(); } catch { tran.Rollback(); throw; } finally { tran.Close(); } } return true; } public DataTable GetFuncPoint(int identify) { DataSet ds = Gateway.Default.From().ToDataSet(); //所有对象的dataTable if (ds.Tables.Count > 0) { return ds.Tables[0]; } return null; } #region 私有方法 /// /// 私有对象,用于删除对象的子级,以及相关信息 /// /// private void _Delete(int id) { _Delete(id, null); } private void _Delete(int id, DbTrans tran) { ManageMenu[] ws = tran.From().Where(ManageMenu._.MM_PatId == id).ToArray(); //删除子级 foreach (ManageMenu w in ws) { _Delete(w.MM_Id, tran); } //删除菜单与权限的关联 tran.Delete(Purview._.MM_Id == id); //删除自身 tran.Delete(ManageMenu._.MM_Id == id); } private void _Save(ManageMenu entity, int rootid) { entity.MM_Root = rootid; Gateway.Default.Save(entity); //获取下级比菜单项列表 ManageMenu[] ws = Gateway.Default.From().Where(ManageMenu._.MM_PatId == entity.MM_Id).ToArray(); foreach (ManageMenu w in ws) { _Save(w, rootid); } } #endregion } }