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);
}
}
}