ConstSelectorService.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 常量下拉框服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Name = "常量下拉框", Order = 189)]
  6. public class ConstSelectorService : IDynamicApiController, ITransient
  7. {
  8. //private readonly IDistributedCache _cache;
  9. private readonly ISysCacheService _sysCacheService;
  10. public ConstSelectorService(IDistributedCache cache,
  11. ISysCacheService sysCacheService)
  12. {
  13. //_cache = cache;
  14. _sysCacheService = sysCacheService;
  15. }
  16. /// <summary>
  17. /// 获取所有常量下拉框列表
  18. /// </summary>
  19. /// <returns></returns>
  20. [AllowAnonymous]
  21. [HttpGet("/constSelector/allConstSelector")]
  22. public async Task<List<SelectorDto>> GetAllConstSelector()
  23. {
  24. var key = $"{CacheConst.KeyConstSelector}AllSelector";
  25. var json = await _sysCacheService.GetStringAsync(key);
  26. if (!string.IsNullOrWhiteSpace(json))
  27. {
  28. return json.ToObject<List<SelectorDto>>();
  29. }
  30. var typeList = await GetAllTypesAsync();
  31. var selectData = typeList.Select(x => new SelectorDto
  32. {
  33. Name = x.CustomAttributes.ToList().FirstOrDefault()?.ConstructorArguments.ToList().FirstOrDefault().Value?.ToString() ?? x.Name,
  34. Code = x.Name
  35. }).ToList();
  36. await _sysCacheService.SetStringAsync(key, selectData.ToJson());
  37. return selectData;
  38. }
  39. /// <summary>
  40. /// 根据类名获取下拉框数据
  41. /// </summary>
  42. /// <param name="typeName"></param>
  43. /// <returns></returns>
  44. [AllowAnonymous]
  45. [HttpGet("/constSelector/constSelector")]
  46. public async Task<List<SelectorDto>> GetConstSelector(string typeName)
  47. {
  48. var key = $"{CacheConst.KeyConstSelector}{typeName.ToUpper()}";
  49. var json = await _sysCacheService.GetStringAsync(key);
  50. if (!string.IsNullOrWhiteSpace(json))
  51. {
  52. return json.ToObject<List<SelectorDto>>();
  53. }
  54. var typeList = await GetAllTypesAsync();
  55. var type = typeList.FirstOrDefault(x => x.Name == typeName);
  56. var isEnum = type.BaseType.Name == "Enum";
  57. var selectData = type.GetFields()?
  58. .Where(isEnum, x => x.FieldType.Name == typeName)
  59. .Select(x => new SelectorDto
  60. {
  61. Name = x.Name,
  62. Code = isEnum ? (int)x.GetValue(BindingFlags.Instance) : x.GetValue(BindingFlags.Instance)
  63. }).ToList();
  64. await _sysCacheService.SetStringAsync(key, selectData.ToJson());
  65. return selectData;
  66. }
  67. /// <summary>
  68. /// 获取所有下拉框及选项 用于前端缓存
  69. /// </summary>
  70. /// <returns></returns>
  71. [AllowAnonymous]
  72. [HttpGet("/constSelector/allConstSelectorWithOptions")]
  73. public async Task<List<SelectorDto>> GetAllConstSelectorWithOptions()
  74. {
  75. var selectors = await GetAllConstSelector();
  76. foreach (var p in selectors)
  77. {
  78. p.Data = await GetConstSelector(Convert.ToString(p.Code));
  79. }
  80. return selectors;
  81. }
  82. /// <summary>
  83. /// 获取所有常量
  84. /// </summary>
  85. /// <returns></returns>
  86. private async Task<List<Type>> GetAllTypesAsync()
  87. {
  88. return await Task.Run(() =>
  89. {
  90. var typeList = AppDomain.CurrentDomain.GetAssemblies()
  91. .SelectMany(x => x.GetTypes())
  92. .Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(ConstSelectorAttribute)))
  93. .ToList();
  94. return typeList;
  95. });
  96. }
  97. }