using Infrastructure; using Infrastructure.Extensions; using OpenAuth.App.Base; using OpenAuth.App.Base.Tree; using OpenAuth.App.BasicQueryService; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.Repository; using OpenAuth.Repository.Core; using OpenAuth.Repository.Domain; using SqlSugar; using SqlSugar.Extensions; using System.Collections.Generic; using System.Diagnostics; namespace OpenAuth.App { public class OrgManagerApp : LongTreeApp { UserManager userManager; private ISqlSugarClient client; public OrgManagerApp( ISugarUnitOfWork unitWork, ISimpleClient repository, ISqlSugarClient sqlSugarClient, UserManager userManager, IAuth auth) : base(unitWork, repository, auth) { this.client = sqlSugarClient; this.userManager = userManager; } #region 查询 #region 部门树 /// /// name 为空查全部 /// /// /// public async Task>> OrgsAllTree(string name) { var result = new Response>(); var user = _auth.GetCurrentUser().User; string sql = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='" + user.Id + "' "; var level = client.Ado.GetInt(sql); if (level>0) { string sql2 = "select \"OrgId\" from sys_userorg where \"Level\"="+level + " and \"UserId\"='" + user.Id + "' "; List orgIds1 = client.Ado.SqlQuery(sql2); int count = orgIds1.Count; for (int i = 0; i < count; i++) { List longs = getAllChildOrgId(orgIds1[i]); orgIds1.AddRange(longs); } var orglist = base.Repository.AsSugarClient().Queryable() .Where(a => a.UserId == user.Id).Select(a => a.OrgId) .ToList(); var query = base.Repository.AsQueryable().Where(a => orgIds1.Contains(a.Id) || a.CreateId == user.Id) .Select(); if (!string.IsNullOrEmpty(name)) { object[] orgIds = (await base.Repository.AsQueryable() .Where(a => a.Name.Contains(name)) .Select(it => it.Id).ToListAsync()).Cast().ToArray(); result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, orgIds); } else { result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, a => a.Id); } return result; } else { var query = base.Repository.AsQueryable() .Select(); if (!string.IsNullOrEmpty(name)) { object[] orgIds = (await base.Repository.AsQueryable() .Where(a => a.Name.Contains(name)) .Select(it => it.Id).ToListAsync()).Cast().ToArray(); result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, orgIds); } else { result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, a => a.Id); } return result; } } public List getAllChildOrgId( long parentId) { var query = base.Repository.AsSugarClient().Queryable() .Where(c => c.ParentId == parentId) .Select(c => new { c.Id, c.ParentId }) .ToList(); var childIds = query.Select(c => c.Id).ToList(); var grandChildIds = query.SelectMany(c => getAllChildOrgId( c.Id)).ToList(); childIds.AddRange(grandChildIds); return childIds; } /// /// name 为空查全部 /// /// /// public async Task>> OrgsTree(string name) { /* var result = new Response>(); var userId = long.Parse(_auth.GetUserId()); var query = userManager.UserOrgs(userId); var orgs = await query .WhereIF(!string.IsNullOrEmpty(name), (u, o) => o.Name.Contains(name)) .Select().ToListAsync(); //if (!string.IsNullOrEmpty(name)) //{ // object[] orgIds = (await query // .Where((u, o) => o.Name.Contains(name)) // .Select((u, o) => o.Id).ToListAsync()).Cast().ToArray(); // result.Result = await query.Select() // .ToTreeAsync(a => a.Children, a => a.ParentId, 0, orgIds); //} //else //{ // result.Result = await query.Select() // .ToTreeAsync(a => a.Children, a => a.ParentId, 0, a => a.Id); //} result.Result = orgs.BuildTree().ToList(); return result;*/ var result = new Response>(); var user = _auth.GetCurrentUser().User; string sql = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='" + user.Id + "' "; var level = client.Ado.GetInt(sql); if ( level > 0) { string sql2 = "select \"OrgId\" from sys_userorg where \"Level\"=" + level + " and \"UserId\"='" + user.Id + "' "; List orgIds1 = client.Ado.SqlQuery(sql2); int count = orgIds1.Count; for (int i = 0; i < count; i++) { List longs = getAllChildOrgId(orgIds1[i]); orgIds1.AddRange(longs); } var query = await base.Repository.AsQueryable().Where(a => orgIds1.Contains(a.Id) || a.CreateId == user.Id) .Select().ToListAsync(); if (!string.IsNullOrEmpty(name)) { object[] orgIds = (await base.Repository.AsQueryable() .Where(a => a.Name.Contains(name)) .Select(it => it.Id).ToListAsync()).Cast().ToArray(); result.Result = query.BuildTree().ToList(); } else { result.Result = query.BuildTree().ToList(); } return result; } else { var query = base.Repository.AsQueryable() .Select(); if (!string.IsNullOrEmpty(name)) { object[] orgIds = (await base.Repository.AsQueryable() .Where(a => a.Name.Contains(name)) .Select(it => it.Id).ToListAsync()).Cast().ToArray(); result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, orgIds); } else { result.Result = await query.ToTreeAsync(a => a.Children, a => a.ParentId, 0, a => a.Id); } return result; } } /// /// 部门和职级组合树 /// /// public async Task>> OrgPositonTree() { var client = base.Repository.AsSugarClient(); var orgQuery = base.Repository.AsQueryable() .Select(a => new TreeItemLong { Key = 0, Tag = "" }, true); var posQuery = client.Queryable((p, o) => new JoinQueryInfos(JoinType.Left, p.GroupId == o.PosGroupId)) .Where((p, o) => o.Id != null) .Select((p, o) => new TreeItemLong { Key = p.Id, Tag = o.Id.ToString(), Id = p.Id, Name = p.Name, ParentId = p.ParentId == 0 ? o.Id : p.ParentId, }); var poses = posQuery.ToList(); var list = await client.UnionAll(orgQuery, posQuery) .Mapper(a => { if (a.Id == a.Key) { var item = poses.Where(m => m.Id == a.Id).First(); item.Id = Yitter.IdGenerator.YitIdHelper.NextId(); a.Id = item.Id; var parent = poses.Where(m => m.Key == a.ParentId && m.Tag == a.Tag).FirstOrDefault(); if (parent != null) { a.ParentId = parent.Id; } } }) .ToTreeAsync(a => a.Children, a => a.ParentId, 0, a => a.Id); return new Response> { Result = list }; } #endregion #region 分页 /// /// 查询部门列表 /// /// /// public async Task>>> LoadAllPage(QueryOrgListReq req) { var user = _auth.GetCurrentUser().User; string sql = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='" + user.Id + "' "; var level = client.Ado.GetInt(sql); if ( level > 0) { string sql2 = "select \"OrgId\" from sys_userorg where \"Level\"=" + level + " and \"UserId\"='" + user.Id + "' "; List orgIds1 = client.Ado.SqlQuery(sql2); int count = orgIds1.Count; for (int i = 0; i < count; i++) { List longs = getAllChildOrgId(orgIds1[i]); orgIds1.AddRange(longs); } RefAsync totalCount = 0; var orgs = await base.Repository.AsQueryable() .WhereIF(req.OrgId != 0, o => o.ParentId == req.OrgId) .WhereIF(!string.IsNullOrEmpty(req.key), o => o.Name.Contains(req.key)) .Where(a => orgIds1.Contains(a.Id) || a.CreateId == user.Id) .OrderByDescending(o => o.CreateTime) .ToPageListAsync(req.page, req.limit, totalCount); return new Response>> { Result = new PageInfo> { Items = orgs, Total = totalCount } }; } else { RefAsync totalCount = 0; var orgs = await base.Repository.AsQueryable() .WhereIF(req.OrgId != 0, o => o.ParentId == req.OrgId) .WhereIF(!string.IsNullOrEmpty(req.key), o => o.Name.Contains(req.key)) .OrderByDescending(o => o.CreateTime) .ToPageListAsync(req.page, req.limit, totalCount); return new Response>> { Result = new PageInfo> { Items = orgs, Total = totalCount } }; } } public async Task>>> LoadPage(QueryOrgListReq req) { var user = _auth.GetCurrentUser().User; string sql = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='" + user.Id + "' "; var level = client.Ado.GetInt(sql); if (level > 0) { string sql2 = "select \"OrgId\" from sys_userorg where \"Level\"=" + level + " and \"UserId\"='" + user.Id + "' "; List orgIds1 = client.Ado.SqlQuery(sql2); int count = orgIds1.Count; for (int i = 0; i < count; i++) { List longs = getAllChildOrgId(orgIds1[i]); orgIds1.AddRange(longs); } RefAsync totalCount = 0; var orgs = await base.Repository.AsQueryable() .WhereIF(req.OrgId != 0, o => o.ParentId == req.OrgId) .WhereIF(!string.IsNullOrEmpty(req.key), o => o.Name.Contains(req.key)) .Where(a => orgIds1.Contains(a.Id) || a.CreateId == user.Id) .OrderByDescending(o => o.CreateTime) .ToPageListAsync(req.page, req.limit, totalCount); return new Response>> { Result = new PageInfo> { Items = orgs, Total = totalCount } }; } else { RefAsync totalCount = 0; var userId = long.Parse(_auth.GetUserId()); var orgs = await userManager.UserOrgs(userId) .WhereIF(req.OrgId != 0, (u, o) => o.ParentId == req.OrgId) .WhereIF(!string.IsNullOrEmpty(req.key), (u, o) => o.Name.Contains(req.key)) .OrderByDescending((u, o) => o.CreateTime) .Select((u, o) => o) .ToPageListAsync(req.page, req.limit, totalCount); return new Response>> { Result = new PageInfo> { Items = orgs, Total = totalCount } }; } } #endregion #region 实体 public SysOrg Get(string id) { return Repository.GetById(id); } #endregion #region 子节点 public async Task> LoadChildren(long? parentId) { SysUser user = _auth.GetCurrentUser().User; //string sql = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='"+user.Id+"' "; //var level = client.Ado.GetInt(sql); /*if (user.Id == -1||level==0) {*/ List children = new List(); if (parentId != null) { children= await base.Repository.AsQueryable().Where(r=>r.ParentId==parentId).OrderBy(r=>r.SortNo).ToListAsync(); } return children; /* } else { if (parentId == 0) { return await base.Repository.GetListAsync(a => a.ParentId == parentId); } else if(parentId== 371300) { var orglist = base.Repository.AsSugarClient().Queryable() .Where(a => a.UserId == user.Id).Select(a => a.OrgId) .ToList(); return await base.Repository.GetListAsync(a => orglist.Contains(a.Id) || a.CreateId == user.Id); } else { var orglist = base.Repository.AsSugarClient().Queryable() .Where(a => a.UserId == user.Id).Select(a => a.OrgId) .ToList(); return await base.Repository.GetListAsync(a => a.ParentId == parentId && orglist.Contains(a.Id) || a.CreateId == user.Id); } }*/ } #region 用户关联的部分和职级 public async Task> UserOrgs(long userId) { return await base.Repository.AsSugarClient().Queryable() .Where(a => a.UserId == userId) .ToListAsync(); } #endregion #endregion #region 父节点 public async Task> LoadParents(long childId) { return await client.Queryable().ToParentListAsync(it => it.ParentId, childId); } #endregion #endregion #region 增删改 #region 增加 /// /// 添加部门 /// /// The org. /// System.Int32. /// 未能找到该组织的父节点信息 public Response Add(OrgForm org) { var loginContext = _auth.GetCurrentUser(); if (loginContext == null) { throw new CommonException("登录已过期", Define.INVALID_TOKEN); } SysOrg model = org.MapTo(); //后边再看 //CalculateCascade(model); using (var uow = base.UnitWork.CreateContext()) { if (model.Id <= 0) { model.Id = Yitter.IdGenerator.YitIdHelper.NextId(); } model.ParentName = getParentName(model.ParentId); model.CreateId = loginContext.User.Id; model.CreateTime = DateTime.Now; if (model.ParentId == 0) { model.Level = 0; model.CascadeId = "0."+model.Id; }else { long parentId = model.ParentId; int Level = 0; string cascade = ""; while (true) { String sql = "select \"ParentId\" from sys_org where \"Id\"=" + parentId; long id = client.Ado.GetLong(sql); // long id = base.Repository.AsSugarClient().Queryable().Where(a => a.Id == parentId).Select(a => a.ParentId).ToLong(); if (!string.IsNullOrEmpty(cascade)) { cascade = id + "." + cascade; }else { cascade = id + cascade; } parentId = id; Level++; if (id == 0) { break; }} model.Level = Level; model.CascadeId = cascade+"."+model.ParentId+"."+model.Id; } uow.SysOrg.Insert(model); var falg = uow.Commit(); return new Response { Result = falg, Message = (falg == true ? "添加成功" : "添加失败") }; } } #endregion #region 修改 public Response Update(SysOrg sysOrg) { if (sysOrg.Id == sysOrg.ParentId) { throw new Exception("上级节点不能为自己"); } try { var user = _auth.GetCurrentUser().User; sysOrg.ParentName=getParentName(sysOrg.ParentId); sysOrg.CreateId = user.Id; UpdateSysOrg(sysOrg); return new Response { Result = true, Message = "success" }; } catch (Exception ex) { return new Response { Result = false, Message = "error:" + ex.Message.ToString() }; } } #endregion #region 删除 /// /// 删除指定ID的部门及其所有子部门 /// public Response DelOrgCascade(string[] ids) { var delOrgCascadeIds = base.Repository.GetList(u => ids.Contains(u.Id.ToString())).Select(u => u.CascadeId).ToArray(); var delOrgIds = new List(); foreach (var cascadeId in delOrgCascadeIds) { delOrgIds.AddRange(base.Repository.GetList(u => u.CascadeId.Contains(cascadeId)).Select(u => u.Id).ToArray()); } using (var uow = base.UnitWork.CreateContext()) { //得改 代码先注释 //uow.Relevance.Delete(u => u.Key == Define.USERORG && delOrgIds.Contains(u.SecondId)); uow.SysOrg.Delete(u => delOrgIds.Contains(u.Id)); var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } } #endregion #region 分配职级组 /// /// 为部门分配职级组 /// /// /// public async Task> OrgPosGroup(AssignOrgPosGroup assignOrgPos) { var flag = await base.Repository.UpdateAsync(a => new SysOrg { PosGroupId = assignOrgPos.PosGroupId }, a => a.Id == assignOrgPos.OrgId); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } #endregion #endregion public string getParentName(long parentId) { string name = base.Repository.AsSugarClient().Queryable().First(a => a.Id == parentId).Name; return name; } public void UpdateSysOrg(SysOrg obj) { if (obj.ParentId == 0) { obj.Level = 0; obj.CascadeId = "0." + obj.Id; } else { long parentId = obj.ParentId; int Level = 0; string cascade = ""; while (true) { string sql = "select \"ParentId\" from sys_org where \"Id\"=" + parentId; long id = base.Repository.AsSugarClient().Ado.GetLong(sql); //long id = base.Repository.AsSugarClient().Queryable().Where(a => a.Id == parentId).Select(a => a.ParentId).ToLong(); if (!string.IsNullOrEmpty(cascade)) { cascade = id + "." + cascade; } else { cascade = id + cascade; } parentId = id; Level++; if (id == 0) { break; } } obj.Level = Level; obj.CascadeId = cascade + "." + obj.ParentId + "." + obj.Id; } base.Repository.AsSugarClient().Updateable(obj).ExecuteCommand(); } } }