- 定义注解
需要定义两个注解, @EnumMappingMethod加在方法上, @EnumMappingField加在字段上,指定枚举
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumMappingField {
String alias() default "";
Class<? extends Enum<?>> enumClass();
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumMappingMethod {
}
- 注解的实现
@Aspect
@Component
public class EnumMappingAspect {
@Pointcut("@annotation(com.hahacloud.server.saas.service.biz.vip.service.annotation.EnumMappingMethod)")
public void enumMappingMethod() {
}
@Around("enumMappingMethod()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
Object resultObject = joinPoint.proceed();
if (null == resultObject) {
return null;
}
if (resultObject instanceof PageInfo) {
List list = ((PageInfo) resultObject).getList();
if (CollectionUtils.isNotEmpty(list)) {
for (Object o : list) {
mappingField(o);
}
}
return resultObject;
}
if (resultObject instanceof List) {
if (CollectionUtils.isNotEmpty((Collection) resultObject)) {
for (Object o : (Collection) resultObject) {
mappingField(o);
}
}
return resultObject;
}
mappingField(resultObject);
return resultObject;
}
@SuppressWarnings(value = {"unchecked"})
private void mappingField(Object resultObject) throws IllegalAccessException {
Field[] fields = resultObject.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(EnumMappingField.class)) {
field.setAccessible(true);
Object enumCode = field.get(resultObject);
if (null == enumCode) {
continue;
}
if (enumCode instanceof String) {
if (StringUtils.isBlank((CharSequence) enumCode)) {
continue;
}
}
EnumMappingField annotation = field.getAnnotation(EnumMappingField.class);
EnumValidate[] enums = (EnumValidate[]) annotation.enumClass().getEnumConstants();
if (enums == null || enums.length == 0) {
continue;
}
field.set(resultObject, enums[0].getMessageByCode(enumCode));
}
}
}
}
- 定义接口 getMessageByCode()方法, 给Enum实现
public interface EnumValidate<T> {
boolean codeValidate(T code);
default String getMessageByCode(T code){
return "";
}
}
- Enum实现EnumValidate接口, 重写getMessageByCode()方法
@Getter
@AllArgsConstructor
public enum MemberTypeEnum implements EnumValidate<String> {
WEAK_MEMBER("0", "弱会员"),
STRENGTH_MEMBER("1", "强会员"),
;
private String code;
private String message;
@Override
public boolean codeValidate(String code) {
if (StringUtils.isBlank(code)) {
return false;
}
for (MemberTypeEnum memberTypeEnum : MemberTypeEnum.values()) {
if (memberTypeEnum.getCode().equalsIgnoreCase(code)) {
return true;
}
}
return false;
}
@Override
public String getMessageByCode(String code) {
for (MemberTypeEnum memberTypeEnum : MemberTypeEnum.values()) {
if (memberTypeEnum.getCode().equalsIgnoreCase(code)) {
return memberTypeEnum.getMessage();
}
}
return "";
}
}
- 如何使用
@Data
public class MemberManageExportBo {
@ExcelProperty(index = 0, value = "会员号")
private String memberNo;
@ExcelProperty(index = 1, value = "会员姓名")
private String memberName;
@ExcelProperty(index = 2, value = "会员手机号")
private String memberPhone;
@EnumMappingField(enumClass = SexEnum.class)
@ExcelProperty(index = 3, value = "会员性别")
private String sex;
@ExcelProperty(index = 4, value = "成长值")
private String totalGrowth;
@ExcelProperty(index = 5, value = "会员等级")
private String levelName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(index = 6, value = "注册时间")
private LocalDateTime createTime;
@EnumMappingField(enumClass = RegisterSourceEnum.class)
@ExcelProperty(index = 7, value = "注册渠道")
private String publisher;
@EnumMappingField(enumClass = MemberTypeEnum.class)
@ExcelProperty(index = 8, value = "会员类型")
private String memberType;
}
@EnumMappingMethod
@Override
public PageInfo<MemberManageExportBo> export(ExportTask exportTask, Map<String, Object> condition, Page page) {
MemberManageDto dto = EntityConverterUtils.convert(condition, MemberManageDto.class);
dto.setOrgId(StringUtils.isEmpty(dto.getOrgId()) ? exportTask.getOrgId() : dto.getOrgId());
dto.setTenantId(exportTask.getTenantId());
dto.setPageNum(page.getPageNum());
dto.setPageSize(page.getPageSize());
PageInfo<MemberManageBo> pageInfo = memberManageService.findPage(dto);
return EntityConverterUtils.convertPage(pageInfo, MemberManageExportBo.class);
}