using Mapster; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Wood.Data.Repository; using Wood.Entity; using Wood.Entity.SystemManage; using Wood.Service.BaseService; using Wood.Service.SystemManage.Dto; using Wood.Service.SystemManage.Manager; using Wood.Service.SystemManage.Param; using Wood.Util; namespace Wood.Service.SystemManage { /// /// 租户管理 /// public class TenantService : ApiService { private readonly SqlSugarRepository _tenantRepository; private readonly OrgManager _orgManager; private readonly UserManager _userManager; private readonly SqlSugarRepository _roleRepository; private readonly SqlSugarRepository _menuAuthorizeRepository; private readonly SqlSugarRepository _menuRepository; private readonly SqlSugarRepository _userBelongRoleRepository; public TenantService(SqlSugarRepository tenantRepository, OrgManager orgManager, UserManager userManager, SqlSugarRepository roleRepository, SqlSugarRepository menuAuthorizeRepository, SqlSugarRepository menuRepository, SqlSugarRepository userBelongRoleRepository) { _tenantRepository = tenantRepository; _orgManager = orgManager; _userManager = userManager; _roleRepository = roleRepository; _menuAuthorizeRepository = menuAuthorizeRepository; _menuRepository = menuRepository; _userBelongRoleRepository = userBelongRoleRepository; } /// /// 分页查询职位 /// /// /// public async Task> Paged(TenantPagedParam param) { var dtos = await _tenantRepository.AsQueryable() .LeftJoin((it, oe) => it.OrgId == oe.Id) .WhereIF(!string.IsNullOrEmpty(param.Name), it => it.TenantName.Contains(param.Name!)) .Select((it, oe) => new TenantPagedDto() { Id = it.Id.SelectAll(), OrgName = oe.OrgName }) .ToPagedListAsync(param); return dtos; } /// /// 新建租户 /// 初始化信息 /// /// /// [UnitOfWork] public async Task Add(TenantAddParam param) { if (await _tenantRepository.IsAnyAsync(it => it.TenantName == param.TenantName)) throw Oops.Oh("租户名称不能重复!"); var orgId = IdGeneratorHelper.Instance.GetId(); //建立租户 TenantEntity tenantEntity = new TenantEntity() { TenantName = param.TenantName, OrgId = orgId, Sort = (await _tenantRepository.AsQueryable().MaxAsync(x => x.Sort)) + 10, }; await _tenantRepository.InsertAsync(tenantEntity); //建立机构部门 OrgEntity entity = new OrgEntity() { Id = orgId, OrgName = param.OrgName, ShortName = param.OrgName, FormCode = param.OrgFormCode, Sort = (await _orgManager.AsQueryable().MaxAsync(x => x.Sort)) + 10, TenantId = tenantEntity.Id }; await _orgManager.AsRepository().InsertAsync(entity); //建立租户管理员角色 RoleEntity roleEntity = new RoleEntity() { FormCode = "zg_admin_" + param.OrgFormCode, DataScopeType = DataScopeTypeEnum.All, Sort = (await _roleRepository.AsQueryable().MaxAsync(x => x.Sort)) + 10, RoleName = "租管-" + param.OrgName, TenantId = tenantEntity.Id, }; await _roleRepository.InsertAsync(roleEntity); //给角色赋值 基础 权限 string[] defaultMenus = ["工作台", "主页", "系统管理", "机构管理", "角色管理", "用户管理", "职位管理", "个人中心"]; var menus = await _menuRepository.GetListAsync(it => defaultMenus.Contains(it.MenuName)); foreach (var item in menus) { var menuAndBtns = await _menuRepository.AsQueryable().ToChildListAsync(it => it.ParentId, item.Id); var menuAuthorizeEntities = menuAndBtns.Select(it => new MenuAuthorizeEntity() { RoleId = roleEntity.Id, MenuId = it.Id, TenantId = tenantEntity.Id, }); await _menuAuthorizeRepository.InsertRangeAsync(menuAuthorizeEntities.ToArray()); } //建立租户管理员账号 UserEntity userEntity = new UserEntity() { AccountType = AccountTypeEnum.TenantAdmin, NickName = param.RealName, UserName = param.UserName, Salt = CryptogramHelper.GenerateRandomString(16), Password = CryptogramHelper.GMSM4Encrypt("123456"), RealName = param.RealName, Birthday = DateTime.Now, OrgId = orgId, TenantId = tenantEntity.Id }; await _userManager.AsRepository().InsertAsync(userEntity); //关联账号和角色信息 UserBelongRoleEntity belongRoleEntity = new UserBelongRoleEntity() { RoleId = roleEntity.Id, UserId = userEntity.Id, }; await _userBelongRoleRepository.InsertAsync(belongRoleEntity); } /// /// 获取明细 /// /// /// public async Task GetDetail(BaseIdParam param) { return await _tenantRepository.AsQueryable() .LeftJoin((it, oe) => it.OrgId == oe.Id) .Where(it => it.Id == param.Id) .Select((it, oe) => new TenantDetailDto() { Id = it.Id.SelectAll(), OrgName = oe.OrgName }).FirstAsync(); } /// /// 假删除 /// /// [UnitOfWork] public async Task Delete(BaseIdParam param) { if (param.Id > 0) await _tenantRepository.FakeDeleteAsync(it => param.Id == it.Id); } /// /// 启用租户 /// /// /// [HttpGet] public async Task Open(BaseIdParam param) { var tenant = await _tenantRepository.GetByIdAsync(param.Id); tenant.Status = 1; await _tenantRepository.UpdateAsync(tenant); } /// /// 禁用租户 /// /// /// [HttpGet] public async Task Close(BaseIdParam param) { var tenant = await _tenantRepository.GetByIdAsync(param.Id); tenant.Status = 0; await _tenantRepository.UpdateAsync(tenant); } public async Task GetMaxSort() { var result = await this._tenantRepository.AsQueryable().MaxAsync(it => it.Sort); return result + 10; } } }