SysTenantService.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. using Furion.DataEncryption;
  2. using Furion.DependencyInjection;
  3. using Furion.DynamicApiController;
  4. using Furion.FriendlyException;
  5. using Mapster;
  6. using Microsoft.AspNetCore.Mvc;
  7. using SqlSugar;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11. namespace Admin.NET.Core.Service
  12. {
  13. /// <summary>
  14. /// 租户管理服务
  15. /// </summary>
  16. [ApiDescriptionSettings(Name = "租户管理", Order = 140)]
  17. public class SysTenantService : IDynamicApiController, ITransient
  18. {
  19. private readonly SqlSugarRepository<SysTenant> _tenantRep;
  20. private readonly SqlSugarRepository<SysOrg> _orgRep;
  21. private readonly SqlSugarRepository<SysRole> _roleRep;
  22. private readonly SqlSugarRepository<SysPos> _posRep;
  23. private readonly SqlSugarRepository<SysUser> _userRep;
  24. private readonly SqlSugarRepository<SysUserExtOrgPos> _sysUserExtOrgPosRep;
  25. private readonly SqlSugarRepository<SysRoleMenu> _sysRoleMenuRep;
  26. private readonly SqlSugarRepository<SysUserRole> _userRoleRep;
  27. private readonly SysUserRoleService _sysUserRoleService;
  28. private readonly SysRoleMenuService _sysRoleMenuService;
  29. public SysTenantService(SqlSugarRepository<SysTenant> tenantRep,
  30. SqlSugarRepository<SysOrg> orgRep,
  31. SqlSugarRepository<SysRole> roleRep,
  32. SqlSugarRepository<SysPos> posRep,
  33. SqlSugarRepository<SysUser> userRep,
  34. SqlSugarRepository<SysUserExtOrgPos> sysUserExtOrgPosRep,
  35. SqlSugarRepository<SysRoleMenu> sysRoleMenuRep,
  36. SqlSugarRepository<SysUserRole> userRoleRep,
  37. SysUserRoleService sysUserRoleService,
  38. SysRoleMenuService sysRoleMenuService)
  39. {
  40. _tenantRep = tenantRep;
  41. _orgRep = orgRep;
  42. _roleRep = roleRep;
  43. _posRep = posRep;
  44. _userRep = userRep;
  45. _sysUserExtOrgPosRep = sysUserExtOrgPosRep;
  46. _sysRoleMenuRep = sysRoleMenuRep;
  47. _userRoleRep = userRoleRep;
  48. _sysUserRoleService = sysUserRoleService;
  49. _sysRoleMenuService = sysRoleMenuService;
  50. }
  51. /// <summary>
  52. /// 获取租户分页列表
  53. /// </summary>
  54. /// <param name="input"></param>
  55. /// <returns></returns>
  56. [HttpGet("/sysTenant/page")]
  57. public async Task<dynamic> GetTenantPageList([FromQuery] TenantInput input)
  58. {
  59. return await _tenantRep.Context.Queryable<SysTenant>()
  60. .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim()))
  61. .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone.Trim()))
  62. .ToPagedListAsync(input.Page, input.PageSize);
  63. }
  64. /// <summary>
  65. /// 增加租户
  66. /// </summary>
  67. /// <param name="input"></param>
  68. /// <returns></returns>
  69. [HttpPost("/sysTenant/add")]
  70. public async Task AddTenant(AddTenantInput input)
  71. {
  72. var isExist = await _tenantRep.IsAnyAsync(u => u.Name == input.Name || u.AdminName == input.AdminName);
  73. if (isExist) throw Oops.Oh(ErrorCodeEnum.D1300);
  74. var entity = input.Adapt<SysTenant>();
  75. await _tenantRep.InsertAsync(entity);
  76. await InitNewTenant(entity);
  77. }
  78. /// <summary>
  79. /// 初始化新增租户数据
  80. /// </summary>
  81. /// <param name="newTenant"></param>
  82. private async Task InitNewTenant(SysTenant newTenant)
  83. {
  84. long tenantId = newTenant.Id;
  85. string admin = newTenant.AdminName;
  86. string companyName = newTenant.Name;
  87. // 初始化公司(组织结构)
  88. var newOrg = new SysOrg
  89. {
  90. TenantId = tenantId,
  91. Pid = 0,
  92. Name = companyName,
  93. Code = companyName
  94. };
  95. await _orgRep.InsertAsync(newOrg);
  96. // 初始化角色
  97. var newRole = new SysRole
  98. {
  99. TenantId = tenantId,
  100. Code = "sys_manager_role",
  101. Name = "系统管理员",
  102. DataScope = DataScopeEnum.All
  103. };
  104. await _roleRep.InsertAsync(newRole);
  105. var newPos = new SysPos
  106. {
  107. Name = "总经理",
  108. Code = "zjl",
  109. TenantId = tenantId
  110. };
  111. await _posRep.InsertAsync(newPos);
  112. // 初始化租户管理员
  113. var newUser = new SysUser
  114. {
  115. TenantId = tenantId,
  116. UserName = admin,
  117. Password = MD5Encryption.Encrypt(CommonConst.SysPassword),
  118. NickName = newTenant.AdminName,
  119. Email = newTenant.Email,
  120. Phone = newTenant.Phone,
  121. UserType = UserTypeEnum.Admin,
  122. OrgId = newOrg.Id,
  123. PosId = newPos.Id,
  124. Birthday = System.DateTime.Parse("1988-02-03"),
  125. RealName = "管理员",
  126. Remark = "管理员"
  127. };
  128. await _userRep.InsertAsync(newUser);
  129. var newUserRole = new SysUserRole
  130. {
  131. RoleId = newRole.Id,
  132. UserId = newUser.Id
  133. };
  134. await _userRoleRep.InsertAsync(newUserRole);
  135. var newUserExtOrgPos = new SysUserExtOrgPos
  136. {
  137. OrgId = newOrg.Id,
  138. PosId = newPos.Id,
  139. UserId = newUser.Id
  140. };
  141. await _sysUserExtOrgPosRep.InsertAsync(newUserExtOrgPos);
  142. }
  143. /// <summary>
  144. /// 删除租户
  145. /// </summary>
  146. /// <param name="input"></param>
  147. /// <returns></returns>
  148. [HttpPost("/sysTenant/delete")]
  149. public async Task DeleteTenant(DeleteTenantInput input)
  150. {
  151. var entity = await _tenantRep.GetFirstAsync(u => u.Id == input.Id);
  152. await _tenantRep.DeleteAsync(entity);
  153. var users = await _userRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == input.Id).ToListAsync();
  154. // 超级管理员所在租户为默认租户
  155. if (users.Any(u => u.UserType == UserTypeEnum.SuperAdmin))
  156. throw Oops.Oh(ErrorCodeEnum.D1023);
  157. // 删除与租户相关的表数据
  158. var userIds = users.Select(u => u.Id).ToList();
  159. await _userRep.AsDeleteable().Where(u => userIds.Contains(u.Id)).ExecuteCommandAsync();
  160. await _userRoleRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync();
  161. await _roleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
  162. await _sysUserExtOrgPosRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync();
  163. var roles = await _roleRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == input.Id).ToListAsync();
  164. await _roleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
  165. var roleIds = roles.Select(u => u.Id).ToList();
  166. await _sysRoleMenuRep.AsDeleteable().Where(u => roleIds.Contains(u.RoleId)).ExecuteCommandAsync();
  167. await _orgRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
  168. await _posRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync();
  169. }
  170. /// <summary>
  171. /// 更新租户
  172. /// </summary>
  173. /// <param name="input"></param>
  174. /// <returns></returns>
  175. [HttpPost("/sysTenant/edit")]
  176. public async Task UpdateTenant(UpdateTenantInput input)
  177. {
  178. var entity = input.Adapt<SysTenant>();
  179. await _tenantRep.Context.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync();
  180. var tenantAdminUser = await GetTenantAdminUser(input.Id);
  181. if (tenantAdminUser == null) return;
  182. tenantAdminUser.UserName = entity.AdminName;
  183. await _userRep.Context.Updateable(tenantAdminUser).UpdateColumns(u => new { u.UserName }).ExecuteCommandAsync();
  184. }
  185. /// <summary>
  186. /// 获取租户详情
  187. /// </summary>
  188. /// <param name="input"></param>
  189. /// <returns></returns>
  190. [HttpGet("/sysTenant/detail")]
  191. public async Task<SysTenant> GetTenant([FromQuery] QueryeTenantInput input)
  192. {
  193. return await _tenantRep.GetFirstAsync(u => u.Id == input.Id);
  194. }
  195. /// <summary>
  196. /// 获取租户列表
  197. /// </summary>
  198. /// <param name="input"></param>
  199. /// <returns></returns>
  200. [HttpGet("/sysTenant/list")]
  201. public async Task<dynamic> GetTenantList([FromQuery] TenantInput input)
  202. {
  203. return await _tenantRep.AsQueryable().ToListAsync();
  204. }
  205. /// <summary>
  206. /// 授权租户管理员角色菜单
  207. /// </summary>
  208. /// <param name="input"></param>
  209. /// <returns></returns>
  210. [HttpPost("/sysTenant/grantMenu")]
  211. public async Task GrantMenu(RoleMenuInput input)
  212. {
  213. var tenantAdminUser = await GetTenantAdminUser(input.Id);
  214. if (tenantAdminUser == null) return;
  215. var roleIds = await _sysUserRoleService.GetUserRoleIdList(tenantAdminUser.Id);
  216. input.Id = roleIds[0]; // 重置租户管理员角色Id
  217. await _sysRoleMenuService.GrantRoleMenu(input);
  218. }
  219. /// <summary>
  220. /// 获取租户管理员角色拥有菜单Id集合
  221. /// </summary>
  222. /// <param name="input"></param>
  223. /// <returns></returns>
  224. [HttpGet("/sysTenant/ownMenu")]
  225. public async Task<List<SysMenu>> OwnMenu([FromQuery] QueryeTenantInput input)
  226. {
  227. var tenantAdminUser = await GetTenantAdminUser(input.Id);
  228. if (tenantAdminUser == null) return new List<SysMenu>();
  229. var roleIds = await _sysUserRoleService.GetUserRoleIdList(tenantAdminUser.Id);
  230. var tenantAdminRoleId = roleIds[0]; // 租户管理员角色Id
  231. return await _sysRoleMenuService.GetRoleMenu(new List<long> { tenantAdminRoleId });
  232. }
  233. /// <summary>
  234. /// 重置租户管理员密码
  235. /// </summary>
  236. /// <param name="input"></param>
  237. /// <returns></returns>
  238. [HttpPost("/sysTenant/resetPwd")]
  239. public async Task ResetTenantPwd(QueryeTenantInput input)
  240. {
  241. var tenantAdminUser = await GetTenantAdminUser(input.Id);
  242. tenantAdminUser.Password = MD5Encryption.Encrypt(CommonConst.SysPassword);
  243. await _userRep.UpdateAsync(tenantAdminUser);
  244. }
  245. /// <summary>
  246. /// 获取租户管理员用户
  247. /// </summary>
  248. /// <param name="tenantId"></param>
  249. /// <returns></returns>
  250. private async Task<SysUser> GetTenantAdminUser(long tenantId)
  251. {
  252. return await _userRep.AsQueryable().Filter(null, true).Where(u => u.TenantId == tenantId && u.UserType == UserTypeEnum.Admin).FirstAsync();
  253. }
  254. }
  255. }