using Admin.NET.Plugin.AiDOP.Entity.S8; namespace Admin.NET.Plugin.AiDOP.Service.S8; public class S8RoleConfigService : ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _sysRoleRep; public S8RoleConfigService( SqlSugarRepository rep, SqlSugarRepository sysRoleRep) { _rep = rep; _sysRoleRep = sysRoleRep; } public async Task> ListAsync(long tenantId, long factoryId) => await _rep.AsQueryable() .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId) .ToListAsync(); public async Task CreateAsync(AdoS8RolePermissionConfig body) { if (string.IsNullOrWhiteSpace(body.RoleCode)) throw new S8BizException("角色编码必填"); var exists = await _rep.AsQueryable() .AnyAsync(x => x.TenantId == body.TenantId && x.FactoryId == body.FactoryId && x.RoleCode == body.RoleCode); if (exists) throw new S8BizException("角色编码已存在"); body.Id = 0; body.CreatedAt = DateTime.Now; await _rep.InsertAsync(body); return body; } public async Task UpdateAsync(long id, AdoS8RolePermissionConfig body) { var e = await _rep.GetByIdAsync(id) ?? throw new S8BizException("记录不存在"); if (string.IsNullOrWhiteSpace(body.RoleCode)) throw new S8BizException("角色编码必填"); var exists = await _rep.AsQueryable() .AnyAsync(x => x.Id != id && x.TenantId == body.TenantId && x.FactoryId == body.FactoryId && x.RoleCode == body.RoleCode); if (exists) throw new S8BizException("角色编码已存在"); body.Id = id; body.CreatedAt = e.CreatedAt; body.UpdatedAt = DateTime.Now; await _rep.UpdateAsync(body); return body; } public async Task DeleteAsync(long id) => await _rep.DeleteByIdAsync(id); /// /// 从系统角色表一键导入,跳过已存在的角色编码,返回本次新增条数。 /// public async Task ImportFromSysRolesAsync(long tenantId, long factoryId) { var sysRoles = await _sysRoleRep.AsQueryable() .Where(r => r.TenantId == tenantId && r.Status == StatusEnum.Enable) .Where(r => !string.IsNullOrEmpty(r.Code)) .Select(r => new { r.Code, r.Name }) .ToListAsync(); var existingCodes = (await _rep.AsQueryable() .Where(x => x.TenantId == tenantId && x.FactoryId == factoryId) .Select(x => x.RoleCode) .ToListAsync()).ToHashSet(); var toInsert = sysRoles .Where(r => !existingCodes.Contains(r.Code!)) .Select(r => new AdoS8RolePermissionConfig { TenantId = tenantId, FactoryId = factoryId, RoleCode = r.Code!, PermissionCodes = "[]", CreatedAt = DateTime.Now }).ToList(); if (toInsert.Count > 0) await _rep.InsertRangeAsync(toInsert); return toInsert.Count; } }