SysEnumDataService.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 枚举值服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Name = "SysEnumData", Order = 1000)]
  6. [AllowAnonymous]
  7. public class SysEnumDataService : IDynamicApiController, ITransient
  8. {
  9. private readonly EnumOptions _enumOptions;
  10. public SysEnumDataService(IOptions<EnumOptions> enumOptions)
  11. {
  12. _enumOptions = enumOptions.Value;
  13. }
  14. /// <summary>
  15. /// 获取所有枚举值
  16. /// </summary>
  17. /// <returns></returns>
  18. [HttpGet("/sysEnumData/enumTypeList")]
  19. public dynamic GetEnumTypeList()
  20. {
  21. List<dynamic> result = new List<dynamic>();
  22. var enumTypeList = App.EffectiveTypes.Where(t => t.IsEnum && _enumOptions.EntityAssemblyNames.Contains(t.Assembly.GetName().Name)).ToList();
  23. foreach (var item in enumTypeList)
  24. {
  25. result.Add(GetEnumDescription(item));
  26. }
  27. return result;
  28. }
  29. private dynamic GetEnumDescription(Type type)
  30. {
  31. string description = type.Name;
  32. var attrs = type.GetCustomAttributes(typeof(DescriptionAttribute), false);
  33. if (attrs.Any())
  34. {
  35. //获取到:超级管理员
  36. var att = ((DescriptionAttribute[])attrs)[0];
  37. description = att.Description;
  38. }
  39. return new
  40. {
  41. Name = description,
  42. Code = type.Name,
  43. Sort = 100,
  44. Remark = description
  45. };
  46. }
  47. /// <summary>
  48. /// 通过枚举类型获取枚举值集合
  49. /// </summary>
  50. /// <param name="input"></param>
  51. /// <returns></returns>
  52. [HttpGet("/sysEnumData/list")]
  53. public async Task<dynamic> GetEnumDataList([FromQuery] EnumDataInput input)
  54. {
  55. // 查找枚举
  56. var enumType = App.EffectiveTypes.FirstOrDefault(t => t.IsEnum && t.Name == input.EnumName);
  57. if (enumType == null)
  58. throw Oops.Oh(ErrorCodeEnum.D1502).StatusCode(405);
  59. //// 获取枚举的Key和描述
  60. return await Task.Run(() =>
  61. EnumExtension.GetEnumDescDictionary(enumType)
  62. .Select(x => new EnumDataOutput
  63. {
  64. Code = x.Key,
  65. Value = x.Value
  66. }));
  67. }
  68. /// <summary>
  69. /// 通过实体字段类型获取相关集合(目前仅支持枚举类型)
  70. /// </summary>
  71. /// <param name="input"></param>
  72. /// <returns></returns>
  73. [HttpGet("/sysEnumData/listByFiled")]
  74. public async Task<dynamic> GetEnumDataListByField([FromQuery] QueryEnumDataInput input)
  75. {
  76. // 获取实体类型属性
  77. Type entityType = null;
  78. foreach (var item in _enumOptions.EntityAssemblyNames)
  79. {
  80. entityType = Type.GetType($"{item}.Entity.{input.EntityName}");
  81. if (entityType != null)
  82. break;
  83. }
  84. if (entityType == null) throw Oops.Oh(ErrorCodeEnum.D1504);
  85. // 获取字段类型
  86. var fieldType = entityType.GetProperties().FirstOrDefault(p => p.Name == input.FieldName)?.PropertyType;
  87. if (fieldType is not { IsEnum: true })
  88. throw Oops.Oh(ErrorCodeEnum.D1503);
  89. // 获取枚举的Key和描述
  90. return await Task.Run(() =>
  91. EnumExtension.GetEnumDescDictionary(fieldType)
  92. .Select(x => new EnumDataOutput
  93. {
  94. Code = x.Key,
  95. Value = x.Value
  96. }));
  97. }
  98. }