SelectOptionItemVO.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package cc.uncarbon.module.adminapi.model.response;
  2. import cc.uncarbon.framework.core.enums.HelioBaseEnum;
  3. import cn.hutool.core.collection.CollUtil;
  4. import com.fasterxml.jackson.annotation.JsonInclude;
  5. import io.swagger.v3.oas.annotations.media.Schema;
  6. import lombok.Getter;
  7. import lombok.NonNull;
  8. import lombok.Setter;
  9. import lombok.experimental.Accessors;
  10. import java.io.Serializable;
  11. import java.util.Arrays;
  12. import java.util.Collection;
  13. import java.util.Collections;
  14. import java.util.List;
  15. import java.util.function.Function;
  16. import java.util.function.Predicate;
  17. import java.util.stream.Stream;
  18. /**
  19. * 后台管理-下拉框数据单项 VO
  20. */
  21. @JsonInclude(JsonInclude.Include.NON_NULL)
  22. @Accessors(chain = true)
  23. @Getter
  24. public class SelectOptionItemVO implements Serializable {
  25. private static final long serialVersionUID = 1L;
  26. // ID👉名称 一对(用于关联各种实体)
  27. @Schema(description = "ID")
  28. private Number id;
  29. @Schema(description = "名称")
  30. private String name;
  31. public SelectOptionItemVO(Number id, String name) {
  32. this.id = id;
  33. this.name = name;
  34. }
  35. // 有时候额外需要上级ID
  36. @Schema(description = "上级ID")
  37. @Setter
  38. private Number parentId;
  39. public SelectOptionItemVO(Number id, String name, Number parentId) {
  40. this.id = id;
  41. this.name = name;
  42. this.parentId = parentId;
  43. }
  44. // 值👉标签 一对(仅用于枚举)
  45. @Schema(description = "值")
  46. private Number value;
  47. @Schema(description = "标签")
  48. private String label;
  49. public SelectOptionItemVO(HelioBaseEnum<? extends Number> helioBaseEnum) {
  50. this.value = helioBaseEnum.getValue();
  51. this.label = helioBaseEnum.getLabel();
  52. }
  53. /*
  54. ----------------------------------------------------------------
  55. 自定义业务字段都写在这里
  56. 都要标记释义、用处、新增时版本号
  57. 免得每个人各取一个名,不统一
  58. ----------------------------------------------------------------
  59. */
  60. /*
  61. ----------------------------------------------------------------
  62. 构造方法 builders
  63. ----------------------------------------------------------------
  64. */
  65. /**
  66. * 构造List<SelectOptionItemVO>
  67. * 将转换源集合中所有集合项
  68. * 无需上级ID
  69. * @param source 源集合
  70. * @param idGetter id getter
  71. * @param nameGetter name getter
  72. */
  73. public static <T> List<SelectOptionItemVO> listOf(
  74. Collection<T> source,
  75. @NonNull Function<T, Number> idGetter,
  76. @NonNull Function<T, String> nameGetter
  77. ) {
  78. return listOf(source, idGetter, nameGetter, null, null);
  79. }
  80. /**
  81. * 构造List<SelectOptionItemVO>
  82. * 将转换源集合中所有集合项
  83. * 支持上级ID
  84. * @param source 源集合
  85. * @param idGetter id getter
  86. * @param nameGetter name getter
  87. */
  88. public static <T> List<SelectOptionItemVO> listOf(
  89. Collection<T> source,
  90. @NonNull Function<T, Number> idGetter,
  91. @NonNull Function<T, String> nameGetter,
  92. Function<T, Number> parentIdGetter
  93. ) {
  94. return listOf(source, idGetter, nameGetter, parentIdGetter, null);
  95. }
  96. /**
  97. * 构造List<SelectOptionItemVO>
  98. * 支持自定义过滤器,仅转换需要的集合项
  99. * 支持上级ID
  100. * @param source 源集合
  101. * @param idGetter id getter
  102. * @param nameGetter name getter
  103. * @param parentIdGetter (可选)parentId getter
  104. * @param sourceItemFilter (可选)集合项过滤器
  105. */
  106. public static <T> List<SelectOptionItemVO> listOf(
  107. Collection<T> source,
  108. @NonNull Function<T, Number> idGetter,
  109. @NonNull Function<T, String> nameGetter,
  110. Function<T, Number> parentIdGetter,
  111. Predicate<T> sourceItemFilter
  112. ) {
  113. if (CollUtil.isEmpty(source)) {
  114. return Collections.emptyList();
  115. }
  116. Stream<T> stream = source.stream();
  117. if (sourceItemFilter != null) {
  118. stream = stream.filter(sourceItemFilter);
  119. }
  120. return stream.map(item ->
  121. new SelectOptionItemVO(idGetter.apply(item), nameGetter.apply(item),
  122. parentIdGetter == null ? null : parentIdGetter.apply(item)))
  123. .toList();
  124. }
  125. /**
  126. * 构造List<SelectOptionItemVO>
  127. * 将转换枚举类中所有枚举常量
  128. * @param helioBaseEnum 实现了HelioBaseEnum的枚举类
  129. */
  130. public static <E extends Enum<?> & HelioBaseEnum<? extends Number>> List<SelectOptionItemVO> listOf(Class<E> helioBaseEnum) {
  131. return listOf(helioBaseEnum, null);
  132. }
  133. /**
  134. * 构造List<SelectOptionItemVO>
  135. * 支持自定义过滤器,仅转换需要的枚举常量
  136. * @param helioBaseEnum 实现了HelioBaseEnum的枚举类
  137. * @param enumConstantFilter (可选)枚举类中枚举常量过滤器
  138. */
  139. public static <E extends Enum<?> & HelioBaseEnum<? extends Number>> List<SelectOptionItemVO> listOf(
  140. Class<E> helioBaseEnum,
  141. Predicate<E> enumConstantFilter
  142. ) {
  143. if (helioBaseEnum == null) {
  144. return Collections.emptyList();
  145. }
  146. Stream<E> stream = Arrays.stream(helioBaseEnum.getEnumConstants());
  147. if (enumConstantFilter != null) {
  148. stream = stream.filter(enumConstantFilter);
  149. }
  150. return stream.map(SelectOptionItemVO::new).toList();
  151. }
  152. }