namespace BaseOUDAL { public class DepartmentBLL { //static ErpBaseContext db = new ErpBaseContext(); static public List Departments; static public List SaoDepartments; public static List DepartmentUsers; public static DepartmentTree Root; static DepartmentBLL() { UpdateDepartments(); } public static string[] Sao1SaoProject = new string[] { "上海", "北京", "深圳" }; /// /// erp和一扫projectid对应部门信息Sao1SaoProject /// /// /// public static int GetEsaoProjectId(int xxProjectId) { Department xxDep = Departments.FirstOrDefault(d => d.Id == xxProjectId); if (xxDep == null) { return 0; } foreach (string pname in Sao1SaoProject) { if (xxDep.Name.IndexOf(pname) < 0) { continue; } Department saoDep = SaoDepartments.FirstOrDefault(s => s.Name.IndexOf(pname) >= 0); if (saoDep != null) { return saoDep.Id; } } //默认上海站 return 2; } static void addDepartmentUser(ref List userList, int did) { List subDeUsers = DepartmentUsers.Where(sub => sub.DepartmentId == did).ToList(); foreach (var td in subDeUsers) { if (userList.All(s => s != td.UserId)) { userList.Add(td.UserId); } } } /// /// 当前输入部门下所有子部门员工id获取 /// /// /// static void addSubDepartmentUser(ref List userList, int did) { List departments = Departments.Where(dp => dp.PId == did).ToList(); addDepartmentUser(ref userList, did); foreach (var dp in departments) { addSubDepartmentUser(ref userList, dp.Id); } } /// /// 获取当前用户的所有附属用户(包括自己) /// /// /// public static List GetSubSystemUsers(int userId) { List retDepartmentUsers = new List(); List departmentUsers = DepartmentUsers.Where(d => d.UserId == userId).ToList(); departmentUsers.ForEach(d => { if (!retDepartmentUsers.Any(s => s == d.UserId)) { retDepartmentUsers.Add(d.UserId); } }); departmentUsers.ForEach(d => { if (d.IsManager == 1) { //是经理 //db.SystemUsers 当前部门下用户 //addDepartmentUser(ref retDepartmentUsers, d.DepartmentId); //子部门下用户 addSubDepartmentUser(ref retDepartmentUsers, d.DepartmentId); } }); return retDepartmentUsers; } //public static List GetManagerByDepName(string dep /// /// 根据部门名获取部门经理,用缓存数据 /// /// /// public static List GetManagerByDepName(string depName) { Department dep = Departments.FirstOrDefault(d => d.Name == depName); if (dep == null) { return null; } List ret = new List(); DepartmentUsers.ForEach(d => { if (d.DepartmentId == dep.Id) { if (d.IsManager == 1) { SystemUser su = UserBLL.GetById(d.UserId); if (su != null) { ret.Add(su); } } } }); return ret; } public static void UpdateDepartments() { using (ErpBaseContext db = new ErpBaseContext()) { Departments = (from o in db.Departments.AsNoTracking() select o).ToList(); DepartmentUsers = (from o in db.DepartmentUsers.AsNoTracking() select o).ToList(); foreach (var department in Departments) { if (department.PId == 0) { Root = new DepartmentTree { Node = department }; AddChildren(Root); break; } } } } static void AddChildren(DepartmentTree node) { if (node.Children == null) { node.Children = new List(); } foreach (var department in Departments) { if (department.PId == node.Node.Id) { var child = new DepartmentTree { Node = department }; node.Children.Add(child); AddChildren(child); } } } public static Department GetById(int id) { return Departments.Find(o => o.Id == id); } public static Department GetByName(string dename) { return Departments.Find(o => o.Name == dename); } public static string GetNameById(int id) { Department d = GetById(id); if (d == null) { return ""; } return d.Name; } static List GetUserNames(int id) { using (ErpBaseContext db = new ErpBaseContext()) { var query = from o in db.SystemUsers.AsNoTracking() join p in db.DepartmentUsers on o.Id equals p.UserId where p.DepartmentId == id select o; return (from o in query select new UserName { Department = GetNameById(id), id = o.Id, Name = o.Name }).ToList(); } } /// /// 当前节点下,不含子节点 /// /// /// public static List GetUsers(int id) { using (ErpBaseContext db = new ErpBaseContext()) { var query = from o in db.SystemUsers.AsNoTracking() join p in db.DepartmentUsers on o.Id equals p.UserId where p.DepartmentId == id select o; return (from o in query select new IdName() { Id = o.Id, Name = o.Name }).ToList(); } } static void GetManager(List managers, int departmentId, int userid, string departmenttype) { var q1 = from o in DepartmentUsers where o.DepartmentId == departmentId && o.UserId == userid && o.IsManager == 1 select o; if (q1.Count() > 0)//在本部门是经理 { Department d = GetById(departmentId); if (d.PId == 0) { return; } GetManager(managers, d.PId, userid, departmenttype); } else { var query = from o in DepartmentUsers where o.DepartmentId == departmentId select o; bool found = false; foreach (var du in query) { if (du.IsManager == 1) { managers.Add(new UserName { Department = GetNameById(du.DepartmentId), id = du.UserId, Name = UserBLL.GetNameById(du.UserId) }); found = true; } } if (found == false) { Department d = GetById(departmentId); if (d.PId == 0) { return; } GetManager(managers, d.PId, userid, ""); } } } static public List GetManagers(int userid) { List managers = new List(); var query = from o in DepartmentUsers where o.UserId == userid select o; foreach (var departmentUser in query) { GetManager(managers, departmentUser.DepartmentId, userid, ""); } return managers; } static public List GetManagers(int userid, string departmenttype) { List managers = new List(); var query = from o in DepartmentUsers where o.UserId == userid select o; foreach (var departmentUser in query) { GetManager(managers, departmentUser.DepartmentId, userid, departmenttype); } return managers; } static public List GetUserDepartments(int userid) { List list = new List(); DepartmentUsers.ForEach(o => { if (o.UserId == userid) { list.Add(GetNameById(o.DepartmentId)); } }); return list; } static public List GetUserDepartments(int userid, string departmenttype) { List list = new List(); DepartmentUsers.ForEach(o => { if (o.UserId == userid) { Department dept = GetById(o.DepartmentId); if (departmenttype == "" || dept.DepartmentType.Contains(departmenttype)) { list.Add((dept.Name)); } } }); return list; } public static string GetUserDepartmentString(int userid) { string s = ""; GetUserDepartments(userid).ForEach(o => s += ("" + o)); return s; } static void _GetDeptString(List list, int id) { Departments.ForEach(o => { if (o.PId == id) { list.Add(o.Id); _GetDeptString(list, o.Id); } }); } /// /// 获取部门及子部门,用,分开 /// /// /// static public string GetDeptString(int i) { List list = new List(); _GetDeptString(list, i); System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(i); list.ForEach(o => { sb.Append(","); sb.Append(o); }); return sb.ToString(); } static public bool IsParnet(int idp, int idc) { Department d = GetById(idc); if (d.PId == idp) { return true; } if (d.PId == 0) { return false; } return IsParnet(idp, d.PId); } static public List GetUserManageDepartment(int userid) { List departments = new List(); List result = new List(); DepartmentUsers.ForEach(o => { if (o.UserId == userid && o.IsManager == 1) { departments.Add(o.DepartmentId); } }); foreach (int id in departments) { bool canadd = true; for (int i = 0; i < result.Count; i++) { if (IsParnet(id, result[i]))//如果是父级节点则替换 { result[i] = id; canadd = false; } else { if (IsParnet(result[i], id))//有上下级关系 { canadd = false; } } } if (canadd) { result.Add(id); } } return result; } static void list_findchildren(List list, Department parent) { list.Add(parent); Departments.ForEach(o => { if (o.PId == parent.Id) { list_findchildren(list, o); } }); } static public List GetDepartmentByParent(int deptid) { List list = new List(); if (deptid == 0) { deptid = 1; } Department root = (from o in Departments where o.Id == deptid select o).First(); list_findchildren(list, root); return list; } static public List GetDepartments(string type) { List list = new List(); list = Departments.Where(d => d.DepartmentType == type).ToList(); return list; } static public List GetGroupsByPid(int deptid) { using (ErpBaseContext db = new ErpBaseContext()) { List list = (from o in db.Departments where o.PId == deptid && o.DepartmentType == "小组" select o).ToList(); return list; } } static DepartmentTree FindNode(int deptid, DepartmentTree parent) { if (parent.Node.Id == deptid) { return parent; } foreach (var node in parent.Children) { var found = FindNode(deptid, node); if (found != null) { return found; } } return null; } static void InsertUsers(List returnValue, DepartmentTree node) { foreach (var user in DepartmentUsers) { if (node.Node.Id == user.DepartmentId) { bool found = false; foreach (var idName in returnValue) { if (idName.Id == user.UserId) { found = true; } } if (!found) { returnValue.Add(new IdName { Id = user.UserId, Name = UserBLL.GetNameById(user.UserId) }); } } foreach (var subNode in node.Children) { InsertUsers(returnValue, subNode); } } } static public List GetDepartmentUsersIdNames(int deptid) { List list = new List(); DepartmentTree node = FindNode(deptid, Root); if (node != null) { InsertUsers(list, node); } return list; } public SearchListResult SearchList(DepartmentReq req) { using (ErpBaseContext db = new ErpBaseContext()) { var query = from source in db.Departments select source; query = req.DepartmentType != null ? query.Where(n => n.DepartmentType == req.DepartmentType) : query.Where(n => n.DepartmentType == "部门" || n.DepartmentType == "项目"); if (!string.IsNullOrEmpty(req.Name)) { query = query.Where(d => d.Name.Contains(req.Name)); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } SearchListResult retListResult = query.ToSearchList(req); return retListResult; } } } public class DepartmentTree { public Department Node { get; set; } public List Children { get; set; } } }