using System.Reflection; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using NPin.Framework.Ddd.Application; using NPin.Framework.SqlSugarCore.Abstractions; using NPin.Framework.TenantManagement.Application.Contracts; using NPin.Framework.TenantManagement.Application.Contracts.Dtos; using NPin.Framework.TenantManagement.Domain; using SqlSugar; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; using Volo.Abp.Uow; namespace NPin.Framework.TenantManagement.Application; public class TenantService : NPinCrudAppService, ITenantService { private ISqlSugarRepository _repository; private IDataSeeder _dataSeeder; public TenantService(IRepository repository, ISqlSugarRepository sqlSugarRepository, IDataSeeder dataSeeder) : base(repository) { _repository = sqlSugarRepository; _dataSeeder = dataSeeder; } /// /// 租户单查 /// /// 唯一ID /// public override Task GetAsync(Guid id) { return base.GetAsync(id); } /// /// 租户多查 /// /// /// public override async Task> GetListAsync(TenantGetListInput input) { RefAsync total = 0; var entities = await _repository.DbQueryable .WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name.Contains(input.Name!)) .WhereIF(input.StartTime is not null && input.EndTime is not null, x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); } /// /// 租户选项列表(显示名称) /// /// public async Task> GetSelectAsync() { var entities = await _repository.DbQueryable.ToListAsync(); return entities.Select(x => new TenantSelectOutputDto { Id = x.Id, Name = x.Name }) .ToList(); } /// /// 创建租户 /// /// /// public override async Task CreateAsync(TenantCreateInput input) { // 检查是否存在 if (await _repository.IsAnyAsync(x => x.Name == input.Name)) { throw new UserFriendlyException("创建失败,当前租户已存在"); } return await base.CreateAsync(input); } /// /// 更新租户信息 /// /// /// /// public override async Task UpdateAsync(Guid id, TenantUpdateInput input) { if (await _repository.IsAnyAsync(x => x.Name == input.Name && x.Id != id)) { throw new UserFriendlyException("更新失败,更新后租户已存在"); } return await base.UpdateAsync(id, input); } /// /// 租户删除 /// /// /// public override Task DeleteAsync(IEnumerable ids) { return base.DeleteAsync(ids); } /// /// 初始化租户 /// /// [HttpPost("tenant/init/{id}")] public async Task InitAsync([FromRoute] Guid id) { await CurrentUnitOfWork.SaveChangesAsync(); using (CurrentTenant.Change(id)) { // 初始化 租户数据库/表 结构 await CodeFirst(LazyServiceProvider); // 插入 种子数据 await _dataSeeder.SeedAsync(id); } } /// /// 数据库 / 表 初始化 /// /// private async Task CodeFirst(IServiceProvider service) { var moduleContainer = service.GetRequiredService(); // 没有数据库,不能创建工作单元,先创建库再关闭 ISqlSugarClient db = null; using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: false)) { db = await _repository.GetDbContextAsync(); // 尝试创建数据库 db.DbMaintenance.CreateDatabase(); await uow.CompleteAsync(); } List types = new List(); foreach (var module in moduleContainer.Modules) { types.AddRange(module.Assembly.GetTypes() .Where(x => x.GetCustomAttribute() == null) .Where(x => x.GetCustomAttribute() != null) .Where(x => x.GetCustomAttribute() is null) .Where(x => x.GetCustomAttribute() is null)); } if (types.Count > 0) { db.CopyNew().CodeFirst.InitTables(types.ToArray()); } } }