You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

669 lines
28 KiB
C#

5 months ago
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<SysUser, SugarDbContext>
{
private ISqlSugarClient client;
#region 构造函数
public UserManagerApp(
ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<SysUser> repository,
IAuth auth,
ISqlSugarClient sqlSugarClient
) : base(unitWork, repository, auth)
{
this.client = sqlSugarClient;
}
#endregion
#region 用户查询
public async Task<Response<PageInfo<List<dynamic>>>> LoadAll(QueryUserListReq request)
{
RefAsync<int> totalNumber = 0;
//过滤orgid传参
List<long> dpt = new List<long>();
if (request.orgId != 0)
{
dpt = client.Queryable<SysOrg>().ToChildList(it => it.ParentId, request.orgId)?.Select(it => it.Id).ToList();
}
var aa = client.Queryable<SysUserOrg>().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<SysUserOrg>((u, o) => u.Id == o.UserId)
.WhereIF(request.orgId != 0, (u, o) => dpt.Contains(o.OrgId))
.OrderByDescending((u, o) => u.CreateTime)
.Distinct()
.Select<dynamic>((u, o) => new
{
id = u.Id,
account = u.Account,
name = u.Name,
createtime = u.CreateTime,
department = SqlFunc.Subqueryable<SysUserOrg>().Where(a => a.UserId == u.Id).LeftJoin<SysOrg>((a, o) => a.OrgId == o.Id).SelectStringJoin((a, o) => o.Name, ","),
role = SqlFunc.Subqueryable<SysUserRole>().Where(a => a.UserId == u.Id).LeftJoin<SysRole>((a, o) => a.RoleId == o.Id).SelectStringJoin((a, o) => o.Name, ","),
})
.ToPageListAsync(request.page, request.limit, totalNumber);
return new Response<PageInfo<List<dynamic>>>()
{
Result = new PageInfo<List<dynamic>>
{
Items = table,
Total = totalNumber
}
};
}
public List<long> getAllChildOrgId(long parentId)
{
var query = base.Repository.AsSugarClient().Queryable<SysOrg>()
.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<Response<PageInfo<List<UserView>>>> 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<int> 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<SysUserOrg>().Where(uo => uo.OrgId == request.orgId && uo.UserId == u.Id).Any())
.OrderByDescending(u => u.CreateTime)
.Select<UserView>()
.ToPageListAsync(request.page, request.limit, totalNumber);
return new Response<PageInfo<List<UserView>>>()
{
Result = new PageInfo<List<UserView>>
{
Items = table,
Total = totalNumber
}
};
}
else
{
string sqlstr1 = "select \"OrgId\" from sys_userorg where \"Level\"=" + level + " and \"UserId\"='" + user.Id + "' ";
List<long> orgIds1 = client.Ado.SqlQuery<long>(sqlstr1);
int count11 = orgIds1.Count;
for (int i = 0; i < count11; i++)
{
List<long> 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<UserView>(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<int> 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<SysUserOrg>().Where(uo => uo.OrgId == request.orgId && uo.UserId == u.Id).Any())
.Where(u => SqlFunc.Subqueryable<SysUserOrg>().Where(uo => orgIds.Contains(uo.OrgId) && uo.UserId == u.Id).Any())
.OrderByDescending(u => u.CreateTime)
.Select<UserView>()
.ToPageListAsync(request.page, request.limit, totalNumber);*/
return new Response<PageInfo<List<UserView>>>()
{
Result = new PageInfo<List<UserView>>
{
Items = table,
Total = count
}
};
}
}
public async Task<Response<PageInfo<List<dynamic>>>> LoadUsers(QueryUserListReq request)
{
//获取当前用户
var user = _auth.GetCurrentUser().User;
RefAsync<int> totalNumber = 0;
//该用户下包含所有部门
List<long> deplist = new List<long>();
if (user != null)
{
var departs = client.Queryable<SysUserOrg>().Where(r => r.UserId == user.Id).ToList();
foreach (var item in departs)
{
var list = client.Queryable<SysOrg>().ToChildList(it => it.ParentId, item.OrgId)?.Select(it => it.Id).ToList();
deplist = deplist.Union(list).ToList();
}
}
//过滤orgid传参
List<long> dpt = new List<long>();
if (request.orgId != 0)
{
dpt = client.Queryable<SysOrg>().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<SysUserOrg>((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<dynamic>((u, o) => new
{
id = u.Id,
account = u.Account,
name = u.Name,
create = u.CreateTime,
department = SqlFunc.Subqueryable<SysUserOrg>().Where(a => a.UserId == u.Id).LeftJoin<SysOrg>((a, o) => a.OrgId == o.Id).SelectStringJoin((a, o) => o.Name, ","),
role = SqlFunc.Subqueryable<SysUserRole>().Where(a => a.UserId == u.Id).LeftJoin<SysRole>((a, o) => a.RoleId == o.Id).SelectStringJoin((a, o) => o.Name, ","),
})
.ToPageListAsync(request.page, request.limit, totalNumber);
return new Response<PageInfo<List<dynamic>>>()
{
Result = new PageInfo<List<dynamic>>
{
Items = table,
Total = totalNumber
}
};
}
/// <summary>
/// 获取指定角色包含的用户列表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<UserView>>>> LoadByRole(QueryUserListByRoleReq request)
{
RefAsync<int> totalCount = 0;
var users = await client.Queryable<SysUserRole>()
.LeftJoin<SysUser>((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<PageInfo<List<UserView>>>
{
Code = 200,
Message = "success",
Result = new PageInfo<List<UserView>>
{
Items = users,
Total = totalCount
}
};
}
/// <summary>
/// 获取指定机构包含的用户列表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<TableData> LoadByOrg(QueryUserListByOrgReq request)
{
var db = base.Repository.AsSugarClient();
RefAsync<int> totalCount = 0;
var users = await db.CopyNew().Queryable<SysUserOrg>()
.LeftJoin<SysUser>((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
};
}
/// <summary>
/// 根据 account 判断帐号是否存在
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
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<bool> 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<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
}
#endregion
#region 删除
/// <summary>
/// 删除用户,包含用户与组织关系、用户与角色关系
/// </summary>
/// <param name="ids"></param>
public Response<bool> 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<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
}
#endregion
#region 分配角色
public async Task<Response<bool>> 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<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
}
#endregion
#region 分配部门
public async Task<Response<bool>> 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<bool>
{
Result = flag,
Message = flag == true ? "success" : "error"
};
}
}
#endregion
#region 修改密码
/// <summary>
/// 修改密码
/// </summary>
/// <param name="request"></param>
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 修改用户资料
/// <summary>
/// 修改用户资料
/// </summary>
/// <param name="request"></param>
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 更新数据库实体类
/// <summary>
/// 更新数据库实体类
/// </summary>
/// <returns></returns>
public string AddEntity()
{
using (var uow = base.UnitWork.CreateContext())
{
2 months ago
foreach (var item in uow.Db.DbMaintenance.GetTableInfoList().Where(r => r.Name.ToLower().StartsWith("lasa_annotation")))
5 months ago
{
2 months ago
//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";
5 months ago
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);
//}
}
2 months ago
uow.Db.DbFirst.Where(r => r.ToLower().StartsWith("lasa_annotation")).IsCreateAttribute().CreateClassFile("E:\\低空态势感知\\code\\OpenAuth.Repository\\Domain", "OpenAuth.Repository.Domain");
5 months ago
uow.Commit();
}
return "更新实体成功";
}
#endregion
#endregion
/// <summary>
/// 上传用户信息
/// </summary>
/// <param name="formFiles"></param>
/// <returns></returns>
public Response<bool> 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<bool>
{
Result = flag,
Message = flag == true ? "更新成功 "+res : "更新失败"
};
}
}
else
{
return new Response<bool>
{
Result = false,
Message = "上传文件类型错误请上传Excel文件"
};
}
}
else
{
return new Response<bool>
{
Result = false,
Message = "文件为空"
};
}
}
}
}