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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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())
{
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
/// <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 = "文件为空"
};
}
}
}
}