using Infrastructure.Attribute; using ZR.Service; using ZR.ServiceCore.Model; using ZR.ServiceCore.Model.Dto; using ZR.ServiceCore.Services.IService; namespace ZR.ServiceCore.Services; [AppService(ServiceType = typeof(ISysFieldService), ServiceLifetime = LifeTime.Transient)] public class SysFieldService : BaseService, ISysFieldService { private readonly ISysRoleFieldService _sysRoleFieldService; public SysFieldService(ISysRoleFieldService sysRoleFieldService) { _sysRoleFieldService = sysRoleFieldService; } public async Task> GetFields(string fullName, long roleId) { var fields = await Queryable() .Where(it => it.FullName == fullName) .ToListAsync(); var roleFields = await _sysRoleFieldService .Queryable() .Where(it => it.RoleId == roleId) .Select(it => it.FieldId) .ToListAsync(); var list = fields.Select(it => new SysFieldDto { FieldName = it.FieldName, FieldType = it.FieldType, FullName = it.FullName, Id = it.Id, IsClass = it.IsClass, IsPermission = !roleFields.Contains(it.Id) }).ToList(); return list; } public async Task InitFields() { var serviceCoreModels = AppDomain.CurrentDomain .GetAssemblies() .First(it => it.FullName.Contains("ZR.ServiceCore")) .ExportedTypes .Where(p => p.FullName.StartsWith("ZR.ServiceCore.Model")) .Select(it => new { it.FullName, Properties = it.GetProperties().Select(pt => new { FieldName = pt.Name, FieldType = pt.PropertyType.FullName, IsClass = pt.PropertyType.IsClass, IsArray = pt.PropertyType.IsArray, // IsList = pt.PropertyType.IsClass ? pt.DeclaringType.FullName : string.Empty }).ToList() // Properties = it.GetProperties() }) .ToList(); foreach (var serviceCoreModel in serviceCoreModels) { var sysFields = serviceCoreModel.Properties .Select(property => new SysField { FieldName = property.FieldName, FullName = serviceCoreModel.FullName, FieldType = property.FieldType, IsClass = property.IsClass ? "1" : "0" }).ToList(); await Deleteable() .Where(it => !sysFields.Select(sf => sf.FieldName) .ToArray().Contains(it.FieldName)) .Where(it => it.FullName == serviceCoreModel.FullName) .ExecuteCommandAsync(); var sysFieldStore = await Storageable(sysFields) .WhereColumns(it => new { it.FieldName, it.FullName }) .ToStorageAsync(); await sysFieldStore .AsInsertable .ExecuteReturnSnowflakeIdListAsync(); await sysFieldStore .AsUpdateable .IgnoreColumns(it => it.Id) .ExecuteCommandAsync(); } return true; } }