namespace Admin.NET.Core.Service;
///
/// 租户管理服务
///
[ApiDescriptionSettings(Name = "租户管理", Order = 140)]
public class SysTenantService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _tenantRep;
private readonly SqlSugarRepository _orgRep;
private readonly SqlSugarRepository _roleRep;
private readonly SqlSugarRepository _posRep;
private readonly SqlSugarRepository _userRep;
private readonly SqlSugarRepository _sysUserExtOrgPosRep;
private readonly SqlSugarRepository _sysRoleMenuRep;
private readonly SqlSugarRepository _userRoleRep;
private readonly SysUserRoleService _sysUserRoleService;
private readonly SysRoleMenuService _sysRoleMenuService;
public SysTenantService(SqlSugarRepository tenantRep,
SqlSugarRepository orgRep,
SqlSugarRepository roleRep,
SqlSugarRepository posRep,
SqlSugarRepository userRep,
SqlSugarRepository sysUserExtOrgPosRep,
SqlSugarRepository sysRoleMenuRep,
SqlSugarRepository userRoleRep,
SysUserRoleService sysUserRoleService,
SysRoleMenuService sysRoleMenuService)
{
_tenantRep = tenantRep;
_orgRep = orgRep;
_roleRep = roleRep;
_posRep = posRep;
_userRep = userRep;
_sysUserExtOrgPosRep = sysUserExtOrgPosRep;
_sysRoleMenuRep = sysRoleMenuRep;
_userRoleRep = userRoleRep;
_sysUserRoleService = sysUserRoleService;
_sysRoleMenuService = sysRoleMenuService;
}
///
/// 获取租户分页列表
///
///
///
[HttpGet("/sysTenant/page")]
public async Task GetTenantPage([FromQuery] TenantInput input)
{
return await _tenantRep.Context.Queryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone.Trim()))
.ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 增加租户
///
///
///
[HttpPost("/sysTenant/add")]
public async Task AddTenant(AddTenantInput input)
{
var isExist = await _tenantRep.IsAnyAsync(u => u.Name == input.Name || u.AdminName == input.AdminName);
if (isExist) throw Oops.Oh(ErrorCodeEnum.D1300);
var entity = input.Adapt();
await _tenantRep.InsertAsync(entity);
await InitNewTenant(entity);
}
///
/// 初始化新增租户数据
///
///
private async Task InitNewTenant(SysTenant newTenant)
{
long tenantId = newTenant.Id;
string admin = newTenant.AdminName;
string companyName = newTenant.Name;
// 初始化公司(组织结构)
var newOrg = new SysOrg
{
TenantId = tenantId,
Pid = 0,
Name = companyName,
Code = companyName
};
await _orgRep.InsertAsync(newOrg);
// 初始化角色
var newRole = new SysRole
{
TenantId = tenantId,
Code = CommonConst.SysAdminRoleCode,
Name = "系统管理员",
DataScope = DataScopeEnum.All
};
await _roleRep.InsertAsync(newRole);
var newPos = new SysPos
{
Name = "总经理",
Code = "zjl",
TenantId = tenantId
};
await _posRep.InsertAsync(newPos);
// 初始化租户管理员
var newUser = new SysUser
{
TenantId = tenantId,
UserName = admin,
Password = MD5Encryption.Encrypt(CommonConst.SysPassword),
NickName = newTenant.AdminName,
Email = newTenant.Email,
Phone = newTenant.Phone,
UserType = UserTypeEnum.Admin,
OrgId = newOrg.Id,
PosId = newPos.Id,
Birthday = System.DateTime.Parse("1988-02-03"),
RealName = "管理员",
Remark = "管理员"
};
await _userRep.InsertAsync(newUser);
var newUserRole = new SysUserRole
{
RoleId = newRole.Id,
UserId = newUser.Id
};
await _userRoleRep.InsertAsync(newUserRole);
var newUserExtOrgPos = new SysUserExtOrgPos
{
OrgId = newOrg.Id,
PosId = newPos.Id,
UserId = newUser.Id
};
await _sysUserExtOrgPosRep.InsertAsync(newUserExtOrgPos);
}
///
/// 删除租户
///
///
///
[HttpPost("/sysTenant/delete")]
public async Task DeleteTenant(DeleteTenantInput input)
{
var users = await _userRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == input.Id).ToListAsync();
// 超级管理员所在租户为默认租户
if (users.Any(u => u.UserType == UserTypeEnum.SuperAdmin))
throw Oops.Oh(ErrorCodeEnum.D1023);
var entity = await _tenantRep.GetFirstAsync(u => u.Id == input.Id);
await _tenantRep.DeleteAsync(entity);
// 删除与租户相关的表数据
var userIds = users.Select(u => u.Id).ToList();
await _userRep.AsDeleteable().Where(u => userIds.Contains(u.Id)).ExecuteCommandAsync();
await _userRoleRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync();
await _roleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
await _sysUserExtOrgPosRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync();
var roles = await _roleRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == input.Id).ToListAsync();
await _roleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
var roleIds = roles.Select(u => u.Id).ToList();
await _sysRoleMenuRep.AsDeleteable().Where(u => roleIds.Contains(u.RoleId)).ExecuteCommandAsync();
await _orgRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
await _posRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
}
///
/// 更新租户
///
///
///
[HttpPost("/sysTenant/edit")]
public async Task UpdateTenant(UpdateTenantInput input)
{
var entity = input.Adapt();
await _tenantRep.Context.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
var tenantAdminUser = await GetTenantAdminUser(input.Id);
if (tenantAdminUser == null) return;
tenantAdminUser.UserName = entity.AdminName;
await _userRep.Context.Updateable(tenantAdminUser).UpdateColumns(u => new { u.UserName }).ExecuteCommandAsync();
}
///
/// 获取租户详情
///
///
///
[HttpGet("/sysTenant/detail")]
public async Task GetTenant([FromQuery] QueryeTenantInput input)
{
return await _tenantRep.GetFirstAsync(u => u.Id == input.Id);
}
///
/// 获取租户列表
///
///
[HttpGet("/sysTenant/list")]
public async Task GetTenantList()
{
return await _tenantRep.AsQueryable().ToListAsync();
}
///
/// 授权租户管理员角色菜单
///
///
///
[HttpPost("/sysTenant/grantMenu")]
public async Task GrantMenu(RoleMenuInput input)
{
var tenantAdminUser = await GetTenantAdminUser(input.Id);
if (tenantAdminUser == null) return;
var roleIds = await _sysUserRoleService.GetUserRoleIdList(tenantAdminUser.Id);
input.Id = roleIds[0]; // 重置租户管理员角色Id
await _sysRoleMenuService.GrantRoleMenu(input);
}
///
/// 获取租户管理员角色拥有菜单Id集合
///
///
///
[HttpGet("/sysTenant/ownMenu")]
public async Task> OwnMenu([FromQuery] QueryeTenantInput input)
{
var tenantAdminUser = await GetTenantAdminUser(input.Id);
if (tenantAdminUser == null) return new List();
var roleIds = await _sysUserRoleService.GetUserRoleIdList(tenantAdminUser.Id);
var tenantAdminRoleId = roleIds[0]; // 租户管理员角色Id
return await _sysRoleMenuService.GetRoleMenu(new List { tenantAdminRoleId });
}
///
/// 重置租户管理员密码
///
///
///
[HttpPost("/sysTenant/resetPwd")]
public async Task ResetTenantPwd(QueryeTenantInput input)
{
var tenantAdminUser = await GetTenantAdminUser(input.Id);
tenantAdminUser.Password = MD5Encryption.Encrypt(CommonConst.SysPassword);
await _userRep.UpdateAsync(tenantAdminUser);
}
///
/// 获取租户管理员用户
///
///
///
private async Task GetTenantAdminUser(long tenantId)
{
return await _userRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == tenantId && u.UserType == UserTypeEnum.Admin).FirstAsync();
}
}