using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using DocumentFormat.OpenXml.Spreadsheet; using DocumentFormat.OpenXml.Wordprocessing; using Infrastructure; using Infrastructure.Extensions; using Infrastructure.Helpers; using Infrastructure.Utilities; using Microsoft.AspNetCore.Http; using NetModular.DocX.Core; using NPOI.HSSF.UserModel; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using OpenAuth.App.Base; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.Config; using OpenAuth.App.Interface; using OpenAuth.App.Request; using OpenAuth.App.Response; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SixLabors.ImageSharp; using SqlSugar; using Yitter.IdGenerator; using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData; namespace OpenAuth.App { public class UserManagerApp : SqlSugarBaseApp { private ISqlSugarClient client; #region 构造函数 public UserManagerApp( ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, ISqlSugarClient sqlSugarClient ) : base(unitWork, repository, auth) { this.client = sqlSugarClient; } #endregion #region 用户查询 public async Task>>> LoadAll(QueryUserListReq request) { RefAsync totalNumber = 0; //过滤orgid传参 List dpt = new List(); if (request.orgId != 0) { dpt = client.Queryable().ToChildList(it => it.ParentId, request.orgId)?.Select(it => it.Id).ToList(); } var aa = client.Queryable().Where(r => dpt.Contains(r.OrgId)).ToList(); var table = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(request.key), u => u.Account.Contains(request.key) || u.Name.Contains(request.key)) .LeftJoin((u, o) => u.Id == o.UserId) .WhereIF(request.orgId != 0, (u, o) => dpt.Contains(o.OrgId)) .OrderByDescending((u, o) => u.CreateTime) .Distinct() .Select((u, o) => new { id = u.Id, account = u.Account, name = u.Name, createtime = u.CreateTime, department = SqlFunc.Subqueryable().Where(a => a.UserId == u.Id).LeftJoin((a, o) => a.OrgId == o.Id).SelectStringJoin((a, o) => o.Name, ","), role = SqlFunc.Subqueryable().Where(a => a.UserId == u.Id).LeftJoin((a, o) => a.RoleId == o.Id).SelectStringJoin((a, o) => o.Name, ","), }) .ToPageListAsync(request.page, request.limit, totalNumber); return new Response>>() { Result = new PageInfo> { Items = table, Total = totalNumber } }; } 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; } public async Task>>> Load(QueryUserListReq request) { var user = _auth.GetCurrentUser().User; string sqlstr = "select \"min\"(\"Level\") from sys_userorg where \"UserId\"='" + user.Id + "' "; var level = client.Ado.GetInt(sqlstr); if (level == 0 || user.Id == -1) { RefAsync totalNumber = 0; var table = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(request.key), u => u.Account.Contains(request.key) || u.Name.Contains(request.key)) .WhereIF(request.orgId != 0, u => SqlFunc.Subqueryable().Where(uo => uo.OrgId == request.orgId && uo.UserId == u.Id).Any()) .OrderByDescending(u => u.CreateTime) .Select() .ToPageListAsync(request.page, request.limit, totalNumber); return new Response>>() { Result = new PageInfo> { Items = table, Total = totalNumber } }; } else { string sqlstr1 = "select \"OrgId\" from sys_userorg where \"Level\"=" + level + " and \"UserId\"='" + user.Id + "' "; List orgIds1 = client.Ado.SqlQuery(sqlstr1); int count11 = orgIds1.Count; for (int i = 0; i < count11; i++) { List longs = getAllChildOrgId(orgIds1[i]); orgIds1.AddRange(longs); } string keyword = ""; if (!string.IsNullOrEmpty(request.key)) { keyword = keyword + "and a.\"Name\" like '%" + request.key + "%'"; } string orgsql = ""; if (request.orgId != 0) { orgsql = " and \"OrgId\" ='" + request.orgId + "'"; } string orgIds = ""; for (int j = 0; j < orgIds1.Count; j++) { if (j == orgIds1.Count - 1) { orgIds = orgIds + orgIds1[j]; } else { orgIds = orgIds + orgIds1[j] + ","; } } string sql = "WITH t as (\r\nselect \"UserId\" from ( select * from sys_userorg where \"UserId\" not in (select \"UserId\" from sys_userorg where \"Level\"<(select \"min\"(\"Level\") from sys_userorg " + // " where \"UserId\"='"+ user.Id+ "' ))) a where a.\"OrgId\" in (select \"OrgId\" from sys_userorg where \"UserId\"='"+ user.Id+ "'"+ orgsql + " ) GROUP BY \"UserId\")"; " where \"UserId\"='" + user.Id + "' ))) a where a.\"OrgId\" =ANY(array[" + orgIds + "]) GROUP BY \"UserId\")"; string sql1 = "((SELECT a.* FROM t LEFT JOIN sys_user a on t.\"UserId\"=a.\"Id\" where 1=1 " + keyword + " ) UNION (SELECT * FROM sys_user a where a.\"CreateId\"='" + user.Id + "' " + keyword + ")) limit " + request.limit + "OFFSET " + (request.page - 1) * request.limit; string sql2 = "(SELECT COUNT(a.*) FROM t LEFT JOIN sys_user a on t.\"UserId\"=a.\"Id\" where 1=1 " + keyword + " ) "; string sql3 = "SELECT COUNT(a.*) FROM sys_user a where a.\"CreateId\"='" + user.Id + "' " + keyword; var table = client.Ado.SqlQuery(sql + sql1); int count1 = client.Ado.GetInt(sql + sql2); int count2 = client.Ado.GetInt(sql + sql3); int count = count1 + count2; /* var orgIds = base._auth.GetCurrentUser().Orgs.Select(o => o.Id); RefAsync totalNumber = 0; var table = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(request.key), u => u.Account.Contains(request.key) || u.Name.Contains(request.key)) .WhereIF(request.orgId != 0, u => SqlFunc.Subqueryable().Where(uo => uo.OrgId == request.orgId && uo.UserId == u.Id).Any()) .Where(u => SqlFunc.Subqueryable().Where(uo => orgIds.Contains(uo.OrgId) && uo.UserId == u.Id).Any()) .OrderByDescending(u => u.CreateTime) .Select() .ToPageListAsync(request.page, request.limit, totalNumber);*/ return new Response>>() { Result = new PageInfo> { Items = table, Total = count } }; } } public async Task>>> LoadUsers(QueryUserListReq request) { //获取当前用户 var user = _auth.GetCurrentUser().User; RefAsync totalNumber = 0; //该用户下包含所有部门 List deplist = new List(); if (user != null) { var departs = client.Queryable().Where(r => r.UserId == user.Id).ToList(); foreach (var item in departs) { var list = client.Queryable().ToChildList(it => it.ParentId, item.OrgId)?.Select(it => it.Id).ToList(); deplist = deplist.Union(list).ToList(); } } //过滤orgid传参 List dpt = new List(); if (request.orgId != 0) { dpt = client.Queryable().ToChildList(it => it.ParentId, request.orgId)?.Select(it => it.Id).ToList(); } //获取列表数据 var table = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(request.key), u => u.Account.Contains(request.key) || u.Name.Contains(request.key))//过滤key .LeftJoin((u, o) => u.Id == o.UserId) .Where((u, o) => deplist.Contains(o.OrgId) || u.CreateId == user.Id) //部门及创建人 .WhereIF(request.orgId != 0, (u, o) => dpt.Contains(o.OrgId)) //部门及左侧选择部门 .Distinct() .OrderByDescending((u, o) => u.CreateTime) .Select((u, o) => new { id = u.Id, account = u.Account, name = u.Name, create = u.CreateTime, department = SqlFunc.Subqueryable().Where(a => a.UserId == u.Id).LeftJoin((a, o) => a.OrgId == o.Id).SelectStringJoin((a, o) => o.Name, ","), role = SqlFunc.Subqueryable().Where(a => a.UserId == u.Id).LeftJoin((a, o) => a.RoleId == o.Id).SelectStringJoin((a, o) => o.Name, ","), }) .ToPageListAsync(request.page, request.limit, totalNumber); return new Response>>() { Result = new PageInfo> { Items = table, Total = totalNumber } }; } /// /// 获取指定角色包含的用户列表 /// /// /// public async Task>>> LoadByRole(QueryUserListByRoleReq request) { RefAsync totalCount = 0; var users = await client.Queryable() .LeftJoin((ur, u) => ur.UserId == u.Id) .Where(ur => ur.RoleId == request.roleId) .Select((ur, u) => new UserView { Id = u.Id, Account = u.Account, Name = u.Name }).ToPageListAsync(request.page, request.limit, totalCount); return new Response>> { Code = 200, Message = "success", Result = new PageInfo> { Items = users, Total = totalCount } }; } /// /// 获取指定机构包含的用户列表 /// /// /// public async Task LoadByOrg(QueryUserListByOrgReq request) { var db = base.Repository.AsSugarClient(); RefAsync totalCount = 0; var users = await db.CopyNew().Queryable() .LeftJoin((uo, u) => uo.UserId == u.Id) .Where((uo, u) => uo.OrgId == request.orgId) .ToPageListAsync(request.page, request.limit, totalCount); return new TableData { count = (int)totalCount, data = users }; } /// /// 根据 account 判断帐号是否存在 /// /// /// public bool IsExistUser(string account) { return base.Repository.IsAny(a => a.Account == account); } public SysUser Get(long id) { return Repository.GetById(id); } public SysUser GetByAccount(string account) { return Repository.GetFirst(u => u.Account == account); } #endregion #region 用户增删改 #region 添加/修改 public Response AddOrUpdate(UpdateUserReq request) { request.ValidationEntity(u => new { u.Account, u.Name }); SysUser requser = request; requser.CreateId = _auth.GetCurrentUser().User.Id; using (var uow = base.UnitWork.CreateContext()) { if (request.Id == 0) { if (uow.User.IsAny(u => u.Account == request.Account)) { throw new Exception("用户账号已存在"); } requser.Secretkey = Md5Helper.Encrypt(CommonHelper.CreateNo(), 16).ToLower(); if (string.IsNullOrEmpty(requser.Password)) { requser.Password = Md5Helper.Encrypt(DESEncrypt.Encrypt(Md5Helper.Hash(requser.Account), requser.Secretkey).ToLower(), 32).ToLower(); //如果客户端没提供密码,默认密码同账号 } else { requser.Password = Md5Helper.Encrypt(DESEncrypt.Encrypt(requser.Password, requser.Secretkey).ToLower(), 32).ToLower(); } requser.CreateTime = DateTime.Now; requser.Id = Yitter.IdGenerator.YitIdHelper.NextId(); uow.User.Insert(requser); request.Id = requser.Id; //要把保存后的ID存入view } else { uow.User.Update(u => new SysUser { Account = requser.Account, BizCode = requser.BizCode, Name = requser.Name, Sex = requser.Sex, Status = requser.Status }, u => u.Id == request.Id); if (!string.IsNullOrEmpty(requser.Password)) //密码为空的时候,不做修改 { var userInfo = uow.User.GetById(requser.Id); requser.Password = Md5Helper.Encrypt(DESEncrypt.Encrypt(requser.Password, userInfo.Secretkey).ToLower(), 32).ToLower(); uow.User.Update(u => new SysUser { Password = requser.Password }, u => u.Id == request.Id); } } var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } } #endregion #region 删除 /// /// 删除用户,包含用户与组织关系、用户与角色关系 /// /// public Response Delete(long[] ids) { using (var uow = base.UnitWork.CreateContext()) { uow.SysUserOrg.Delete(a => ids.Contains(a.UserId)); uow.SysUserRole.Delete(a => ids.Contains(a.UserId)); uow.User.Delete(u => ids.Contains(u.Id)); var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } } #endregion #region 分配角色 public async Task> UserRoles(AssignUserRoles userRoles) { using (var uow = base.UnitWork.CreateContext()) { //删除用户相关角色 await uow.SysUserRole.DeleteByIdAsync(userRoles.UserId); //重新添加本次角色 var models = userRoles.RoleIds.Select(r => new SysUserRole { UserId = userRoles.UserId, RoleId = r }).ToList(); await uow.SysUserRole.InsertRangeAsync(models); var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } } #endregion #region 分配部门 public async Task> UserOrgs(AssignUserOrgs userOrgs) { using (var uow = base.UnitWork.CreateContext()) { //删除用户相关部门 await uow.SysUserOrg.DeleteByIdAsync(userOrgs.UserId); //重新添加本次部门 var models = userOrgs.OrgPoses.Select(o => new SysUserOrg { UserId = userOrgs.UserId, OrgId = o.OrgId, PositionId = o.PosId, Level = o.Level }).ToList(); await uow.SysUserOrg.InsertRangeAsync(models); var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "success" : "error" }; } } #endregion #region 修改密码 /// /// 修改密码 /// /// public void ChangePassword(ChangePasswordReq request) { var user = base.Repository.GetFirst(a => a.Account == request.Account); if (user != null) { var pwd = Md5Helper.Encrypt(DESEncrypt.Encrypt(request.Password, user.Secretkey).ToLower(), 32).ToLower(); Repository.Update(user => new SysUser { Password = pwd }, u => u.Account == request.Account); } } #endregion #region 修改用户资料 /// /// 修改用户资料 /// /// public void ChangeProfile(ChangeProfileReq request) { if (request.Account == Define.SYSTEM_USERNAME) { throw new Exception("不能修改超级管理员信息"); } Repository.Update(user => new SysUser { Name = request.Name, Sex = request.Sex }, u => u.Account == request.Account); } #endregion #region 更新数据库实体类 /// /// 更新数据库实体类 /// /// public string AddEntity() { using (var uow = base.UnitWork.CreateContext()) { foreach (var item in uow.Db.DbMaintenance.GetTableInfoList().Where(r => r.Name.ToLower().StartsWith("lasa_annotation"))) { //string entityName = item.Name.Substring(0, 1).ToUpper() + item.Name.Substring(1, 4).ToLower() + item.Name.Substring(6, 1).ToUpper() + item.Name.Substring(7).ToLower();/*实体名大写*/ string entityName = "LasaAnnotation"; uow.Db.MappingTables.Add(entityName, item.Name); //foreach (var col in db.DbMaintenance.GetColumnInfosByTableName(item.Name)) //{ // db.MappingColumns.Add(col.DbColumnName.ToUpper() /*类的属性大写*/, col.DbColumnName, entityName); //} } uow.Db.DbFirst.Where(r => r.ToLower().StartsWith("lasa_annotation")).IsCreateAttribute().CreateClassFile("E:\\低空态势感知\\code\\OpenAuth.Repository\\Domain", "OpenAuth.Repository.Domain"); uow.Commit(); } return "更新实体成功"; } #endregion #endregion /// /// 上传用户信息 /// /// /// public Response ImportUserInfo(IFormFileCollection formFiles) { IFormFile file = formFiles[0]; //存储文件到服务器 if (file != null) { if (file.FileName.IndexOf(".xls") > 0 || file.FileName.IndexOf(".xlsx") > 0) { //数据库导入 IWorkbook workbook = null; if (file.FileName.IndexOf(".xlsx") > 0) { using (var stream = file.OpenReadStream()) { workbook = new XSSFWorkbook(stream);//excel的版本2007 } } else if (file.FileName.IndexOf(".xls") > 0) { using (var stream = file.OpenReadStream()) { workbook = new HSSFWorkbook(stream);//excel的版本2003 } } //数据处理 using (var uow = base.UnitWork.CreateContext()) { //获取sheet ISheet sheet; sheet = workbook.GetSheetAt(0); //处理sheet数据 string res = ""; if (sheet != null) { IRow firstRow = sheet.GetRow(0); //获取有效数据行数 int lastRow = sheet.LastRowNum; int rowCount = 0; //具体excel数据解析 for (int i = 1; i <= lastRow; ++i) { IRow row = sheet.GetRow(i); if (row == null || string.IsNullOrEmpty(row.GetCell(0).ToString())) continue; SysUser user = new SysUser(); user.Id = YitIdHelper.NextId(); user.CreateTime = DateTime.Now; user.Name = row.GetCell(4).ToString(); user.CreateId = _auth.GetCurrentUser().User.Id; user.Account=row.GetCell(5).ToString(); user.Password = Md5Helper.Encrypt(user.Account, 32).ToLower(); if (uow.User.IsAny(u => u.Account == user.Account)) { res += "账号" + user.Account + "已存在,"; } else { user.Secretkey = Md5Helper.Encrypt(CommonHelper.CreateNo(), 16).ToLower(); if (string.IsNullOrEmpty(user.Password)) { user.Password = Md5Helper.Encrypt(DESEncrypt.Encrypt(Md5Helper.Hash(user.Account), user.Secretkey).ToLower(), 32).ToLower(); //如果客户端没提供密码,默认密码同账号 } else { user.Password = Md5Helper.Encrypt(DESEncrypt.Encrypt(user.Password, user.Secretkey).ToLower(), 32).ToLower(); } uow.User.Insert(user); if (!string.IsNullOrEmpty(row.GetCell(7).ToString())) { //为用户分配角色 SysUserRole userrole = new SysUserRole(); userrole.UserId = user.Id; userrole.RoleId = Convert.ToInt64(row.GetCell(7).ToString()); //删除用户相关角色 uow.SysUserRole.DeleteById(user.Id); //添加 uow.SysUserRole.Insert(userrole); } if (!string.IsNullOrEmpty(row.GetCell(2).ToString())) { //为用户分配部门 SysUserOrg userorg = new SysUserOrg(); userorg.UserId = user.Id; userorg.OrgId = Convert.ToInt64(row.GetCell(2).ToString()); userorg.PositionId = 0; userorg.Level = Convert.ToInt16(row.GetCell(3).ToString()); //删除用户相关部门 uow.SysUserOrg.DeleteById(user.Id); //重新添加本次部门 uow.SysUserOrg.Insert(userorg); } } } } var flag = uow.Commit(); return new Response { Result = flag, Message = flag == true ? "更新成功 "+res : "更新失败" }; } } else { return new Response { Result = false, Message = "上传文件类型错误,请上传Excel文件" }; } } else { return new Response { Result = false, Message = "文件为空" }; } } } }