using System.Linq; using System.Threading.Tasks; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Domain.Pkg; using ZhonTai.Admin.Domain.PkgPermission; using ZhonTai.Admin.Services.Pkg.Dto; using ZhonTai.DynamicApi; using ZhonTai.DynamicApi.Attributes; using Microsoft.AspNetCore.Mvc; using ZhonTai.Admin.Core.Consts; using ZhonTai.Admin.Core.Attributes; using ZhonTai.Admin.Domain.TenantPkg; using ZhonTai.Admin.Domain.Tenant; using System.Collections.Generic; using ZhonTai.Admin.Domain.RolePermission; using ZhonTai.Admin.Domain.User; namespace ZhonTai.Admin.Services.Pkg; /// /// 套餐服务 /// [Order(51)] [DynamicApi(Area = AdminConsts.AreaName)] public class PkgService : BaseService, IDynamicApi { private IPkgRepository _pkgRepository => LazyGetRequiredService(); private ITenantRepository _tenantRepository => LazyGetRequiredService(); private ITenantPkgRepository _tenantPkgRepository => LazyGetRequiredService(); private IPkgPermissionRepository _pkgPermissionRepository => LazyGetRequiredService(); private IRolePermissionRepository _rolePermissionRepository => LazyGetRequiredService(); private IUserRepository _userRepository => LazyGetRequiredService(); public PkgService() { } /// /// 查询 /// /// /// public async Task GetAsync(long id) { return await _pkgRepository.Select .WhereDynamic(id) .ToOneAsync(); } /// /// 查询列表 /// /// /// public async Task> GetListAsync([FromQuery]PkgGetListInput input) { var list = await _pkgRepository.Select .WhereIf(input.Name.NotNull(), a => a.Name.Contains(input.Name)) .OrderBy(a => new {a.ParentId, a.Sort}) .ToListAsync(); return list; } /// /// 查询分页 /// /// /// [HttpPost] public async Task> GetPageAsync(PageInput input) { var key = input.Filter?.Name; var list = await _pkgRepository.Select .WhereDynamicFilter(input.DynamicFilter) .WhereIf(key.NotNull(), a => a.Name.Contains(key)) .Count(out var total) .OrderByDescending(true, c => c.Id) .Page(input.CurrentPage, input.PageSize) .ToListAsync(); var data = new PageOutput() { List = list, Total = total }; return data; } /// /// 查询套餐租户列表 /// /// /// public async Task> GetPkgTenantListAsync([FromQuery] PkgGetPkgTenantListInput input) { var list = await _tenantRepository.Select.From() .InnerJoin(a => a.t2.TenantId == a.t1.Id) .Where(a => a.t2.PkgId == input.PkgId) .WhereIf(input.TenantName.NotNull(), a => a.t1.Org.Name.Contains(input.TenantName)) .OrderByDescending(a => a.t1.Id) .ToListAsync(a=> new PkgGetPkgTenantListOutput { Id = a.t1.Id, Name = a.t1.Org.Name, Code = a.t1.Org.Code }); return list; } /// /// 查询套餐权限列表 /// /// 套餐编号 /// public async Task> GetPkgPermissionList(long pkgId) { var permissionIds = await _pkgPermissionRepository .Select.Where(d => d.PkgId == pkgId) .ToListAsync(a => a.PermissionId); return permissionIds; } /// /// 设置套餐权限 /// /// /// [AdminTransaction] public virtual async Task SetPkgPermissionsAsync(PkgSetPkgPermissionsInput input) { //查询套餐权限 var permissionIds = await _pkgPermissionRepository.Select.Where(d => d.PkgId == input.PkgId).ToListAsync(m => m.PermissionId); //批量删除套餐权限 var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d)); if (deleteIds.Any()) { //删除套餐权限 await _pkgPermissionRepository.DeleteAsync(m => m.PkgId == input.PkgId && deleteIds.Contains(m.PermissionId)); //删除套餐下关联的角色权限 await _rolePermissionRepository.DeleteAsync(a => deleteIds.Contains(a.PermissionId)); } //批量插入套餐权限 var pkgPermissions = new List(); var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d)); if (insertPermissionIds.Any()) { foreach (var permissionId in insertPermissionIds) { pkgPermissions.Add(new PkgPermissionEntity() { PkgId = input.PkgId, PermissionId = permissionId, }); } await _pkgPermissionRepository.InsertAsync(pkgPermissions); } //清除套餐下所有用户权限缓存 var tenantIds = await _tenantPkgRepository.Select.Where(a => a.PkgId == input.PkgId).ToListAsync(a => a.TenantId); var userIds = await _userRepository.Select.Where(a => tenantIds.Contains(a.TenantId.Value)).ToListAsync(a => a.Id); if (userIds.Any()) { foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.UserPermissions + userId); } } } /// /// 添加套餐租户 /// /// /// public async Task AddPkgTenantAsync(PkgAddPkgTenantListInput input) { var pkgId = input.PkgId; var tenantIds = await _tenantPkgRepository.Select.Where(a => a.PkgId == pkgId).ToListAsync(a => a.TenantId); var insertTenantIds = input.TenantIds.Except(tenantIds); if (insertTenantIds != null && insertTenantIds.Any()) { var tenantPkgList = insertTenantIds.Select(tenantId => new TenantPkgEntity { TenantId = tenantId, PkgId = pkgId }).ToList(); await _tenantPkgRepository.InsertAsync(tenantPkgList); } var clearTenantIds = tenantIds.Concat(input.TenantIds).Distinct(); foreach (var tenantId in clearTenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 移除套餐租户 /// /// /// [HttpPost] public async Task RemovePkgTenantAsync(PkgAddPkgTenantListInput input) { var tenantIds = input.TenantIds; if (tenantIds != null && tenantIds.Any()) { await _tenantPkgRepository.Where(a => a.PkgId == input.PkgId && input.TenantIds.Contains(a.TenantId)).ToDelete().ExecuteAffrowsAsync(); } foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 新增 /// /// /// public async Task AddAsync(PkgAddInput input) { if (await _pkgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Name == input.Name)) { throw ResultOutput.Exception($"此套餐名已存在"); } if (input.Code.NotNull() && await _pkgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Code == input.Code)) { throw ResultOutput.Exception($"此套餐编码已存在"); } var entity = Mapper.Map(input); if (entity.Sort == 0) { var sort = await _pkgRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort); entity.Sort = sort + 1; } await _pkgRepository.InsertAsync(entity); return entity.Id; } /// /// 修改 /// /// /// public async Task UpdateAsync(PkgUpdateInput input) { var entity = await _pkgRepository.GetAsync(input.Id); if (!(entity?.Id > 0)) { throw ResultOutput.Exception("套餐不存在"); } if (await _pkgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Name == input.Name)) { throw ResultOutput.Exception($"此套餐名已存在"); } if (input.Code.NotNull() && await _pkgRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Code == input.Code)) { throw ResultOutput.Exception($"此套餐编码已存在"); } Mapper.Map(input, entity); await _pkgRepository.UpdateAsync(entity); var tenantIds = await _tenantPkgRepository.Select.Where(a => a.PkgId == entity.Id).ToListAsync(a => a.TenantId); foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 彻底删除 /// /// /// [AdminTransaction] public virtual async Task DeleteAsync(long id) { var pkgIdList = await _pkgRepository.GetChildIdListAsync(id); var tenantIds = await _tenantPkgRepository.Select.Where(a => pkgIdList.Contains(a.PkgId)).ToListAsync(a => a.TenantId); //删除租户套餐 await _tenantPkgRepository.DeleteAsync(a => a.TenantId == id); //删除套餐权限 await _pkgPermissionRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); //删除套餐 await _pkgRepository.DeleteAsync(a => pkgIdList.Contains(a.Id)); foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 批量彻底删除 /// /// /// [AdminTransaction] public virtual async Task BatchDeleteAsync(long[] ids) { var pkgIdList = await _pkgRepository.GetChildIdListAsync(ids); var tenantIds = await _tenantPkgRepository.Select.Where(a => pkgIdList.Contains(a.PkgId)).ToListAsync(a => a.TenantId); //删除租户套餐 await _tenantPkgRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); //删除套餐权限 await _pkgPermissionRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); //删除套餐 await _pkgRepository.Where(a => pkgIdList.Contains(a.Id)).AsTreeCte().ToDelete().ExecuteAffrowsAsync(); foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 删除 /// /// /// [AdminTransaction] public virtual async Task SoftDeleteAsync(long id) { var pkgIdList = await _pkgRepository.GetChildIdListAsync(id); var tenantIds = await _tenantPkgRepository.Select.Where(a => pkgIdList.Contains(a.PkgId)).ToListAsync(a => a.TenantId); await _tenantPkgRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); await _pkgPermissionRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); await _pkgRepository.SoftDeleteRecursiveAsync(a => pkgIdList.Contains(a.Id)); foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } /// /// 批量删除 /// /// /// [AdminTransaction] public virtual async Task BatchSoftDeleteAsync(long[] ids) { var pkgIdList = await _pkgRepository.GetChildIdListAsync(ids); var tenantIds = await _tenantPkgRepository.Select.Where(a => ids.Contains(a.PkgId)).ToListAsync(a => a.TenantId); await _tenantPkgRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); await _pkgPermissionRepository.DeleteAsync(a => pkgIdList.Contains(a.PkgId)); await _pkgRepository.SoftDeleteRecursiveAsync(a => pkgIdList.Contains(a.Id)); foreach (var tenantId in tenantIds) { await Cache.DelAsync(CacheKeys.DataPermission + tenantId); } } }