diff --git a/easyexcel-test/easytools-base/pom.xml b/easyexcel-test/easytools-base/pom.xml new file mode 100644 index 000000000..378d7bab8 --- /dev/null +++ b/easyexcel-test/easytools-base/pom.xml @@ -0,0 +1,50 @@ + + + + com.alibaba.easytools + easytools-parent + ${revision} + ../pom.xml + + 4.0.0 + easytools-base + + + + org.projectlombok + lombok + provided + + + com.alibaba.fastvalidator + fastvalidator-constraints + provided + + + javax.validation + validation-api + provided + + + + + + + + org.projectlombok + lombok-maven-plugin + 1.18.20.0 + + + generate-sources + + delombok + + + + + + + \ No newline at end of file diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/EasyToolsConstant.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/EasyToolsConstant.java new file mode 100644 index 000000000..fe715f026 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/EasyToolsConstant.java @@ -0,0 +1,36 @@ +package com.alibaba.easytools.base.constant; + +/** + * 常量 + * + * @author 是仪 + */ +public interface EasyToolsConstant { + + /** + * 最大分页大小 + */ + int MAX_PAGE_SIZE = 500; + + /** + * 序列化id + */ + long SERIAL_VERSION_UID = 1L; + + /** + * 最大循环次数 防止很多循环进入死循环 + */ + int MAXIMUM_ITERATIONS = 10 * 1000; + + /** + * 缓存占位符 + * 有些缓存只要判断有没有,可以放入这个 + */ + String CACHE_PLACEHOLDER = "C"; + + /** + * 鹰眼追踪id + */ + String EAGLEEYE_TRACE_ID = "EAGLEEYE_TRACE_ID"; + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/SymbolConstant.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/SymbolConstant.java new file mode 100644 index 000000000..afbea492e --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constant/SymbolConstant.java @@ -0,0 +1,58 @@ +package com.alibaba.easytools.base.constant; + +/** + * 常见符号的常量枚举 + * + * @author 是仪 + **/ +public class SymbolConstant { + /** + * + + */ + public static final String PLUS = "+"; + /** + * - + */ + public static final String MINUS = "-"; + /** + * * + */ + public static final String ASTERISK = "*"; + /** + * / + */ + public static final String SLASH = "/"; + /** + * 单引号"'" + */ + public static final String SQUOT = "'"; + /** + * 空串 "" + */ + public static final String EMPTY = ""; + /** + * 分隔符 "-" + */ + public static final String SEPARATOR = "-"; + /** + * 等号 "=" + */ + public static final String EQ = "="; + /** + * 分号 ";" + */ + public static final String SEMICOLON = ";"; + /** + * 逗号 "," + */ + public static final String COMMA = ","; + /** + * 点 "." + */ + public static final String DOT = "."; + /** + * 冒号 ":" + */ + public static final String COLON = ":"; + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/IsEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/IsEnum.java new file mode 100644 index 000000000..fa1dda02d --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/IsEnum.java @@ -0,0 +1,56 @@ +package com.alibaba.easytools.base.constraints; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; +import javax.validation.ReportAsSingleViolation; + +import com.alibaba.easytools.base.constraints.validator.IsEnumValidator; +import com.alibaba.easytools.base.enums.BaseEnum; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 判断一个对象是否是{@link BaseEnum} 里面具体的值 + * + * @author 是仪 + */ +@Documented +@Constraint(validatedBy = {IsEnumValidator.class}) +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@ReportAsSingleViolation +public @interface IsEnum { + + /** + * 需要校验的枚举类 + * + * @return 枚举类 + */ + Class> value(); + + String message() default "必须是枚举:{value} 中的值"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + /** + * Defines several {@code @IsEnum} annotations on the same element. + */ + @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) + @Retention(RUNTIME) + @Documented + public @interface List { + IsEnum[] value(); + } +} \ No newline at end of file diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/validator/IsEnumValidator.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/validator/IsEnumValidator.java new file mode 100644 index 000000000..fd8db78f1 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/constraints/validator/IsEnumValidator.java @@ -0,0 +1,40 @@ +package com.alibaba.easytools.base.constraints.validator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import com.alibaba.easytools.base.constraints.IsEnum; +import com.alibaba.easytools.base.enums.BaseEnum; + +/** + * 枚举的校验器 + * + * @author 是仪 + */ +public class IsEnumValidator implements ConstraintValidator { + + private Class> enumType; + + @Override + public void initialize(IsEnum constraintAnnotation) { + enumType = constraintAnnotation.value(); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + BaseEnum[] baseEnums = enumType.getEnumConstants(); + if (baseEnums == null) { + return false; + } + for (BaseEnum baseEnum : baseEnums) { + if (baseEnum.getCode().equals(value)) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseEnum.java new file mode 100644 index 000000000..2c9edbbee --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseEnum.java @@ -0,0 +1,26 @@ +package com.alibaba.easytools.base.enums; + +/** + * 基础的枚举 + * + * 由于java枚举继承的限制,枚举基类只能设计为接口,请自行保证子类一定是枚举类型。 + * + * @author Jiaju Zhuang + **/ +public interface BaseEnum { + + /** + * 返回枚举的code。一般建议直接返回枚举的name + * + * @return code + */ + T getCode(); + + /** + * 返回枚举的描述。返回枚举的中文 方便前端下拉 + * + * @return description + */ + String getDescription(); + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseErrorEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseErrorEnum.java new file mode 100644 index 000000000..79fb8a31b --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/BaseErrorEnum.java @@ -0,0 +1,8 @@ +package com.alibaba.easytools.base.enums; + +/** + * 基础的异常枚举 + * + * @author 是仪 + **/ +public interface BaseErrorEnum extends BaseEnum {} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/DeletedIdEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/DeletedIdEnum.java new file mode 100644 index 000000000..4bf811a63 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/DeletedIdEnum.java @@ -0,0 +1,40 @@ +package com.alibaba.easytools.base.enums; + +import lombok.Getter; + +/** + * 删除标记枚举 + *

+ * 为了兼容唯一主键+逻辑删除。使用DeletedId来标记当前数据是否删除。如果是0 则代表未删除。其他任何情况都代表已经删除。 + * 删除的时候 执行语句:update set deleted_id = di where 条件=条件; + * + * @author 是仪 + */ +@Getter +public enum DeletedIdEnum implements BaseEnum { + + /** + * 未删除 + */ + NOT_DELETED(0L, "未删除"), + + ; + + final Long code; + final String description; + + DeletedIdEnum(Long code, String description) { + this.code = code; + this.description = description; + } + + /** + * 判断 当前数据是否已经逻辑删除 + * + * @param deletedId 表中的deleted_id + * @return 是否已经删除 + */ + public static boolean isDeleted(Long deletedId) { + return !NOT_DELETED.getCode().equals(deletedId); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OperationEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OperationEnum.java new file mode 100644 index 000000000..65a1591cf --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OperationEnum.java @@ -0,0 +1,39 @@ +package com.alibaba.easytools.base.enums; + +import lombok.Getter; + +/** + * 操作枚举 + * + * @author 是仪 + */ +@Getter +public enum OperationEnum implements BaseEnum { + /** + * 新增 + */ + CREATE("新增"), + + /** + * 修改 + */ + UPDATE("修改"), + + /** + * 删除 + */ + DELETE("删除"), + + ; + + final String description; + + OperationEnum(String description) { + this.description = description; + } + + @Override + public String getCode() { + return this.name(); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OrderByDirectionEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OrderByDirectionEnum.java new file mode 100644 index 000000000..c62e8d31f --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/OrderByDirectionEnum.java @@ -0,0 +1,35 @@ +package com.alibaba.easytools.base.enums; + +/** + * 排序方向的枚举 + * + * @author 是仪 + */ +public enum OrderByDirectionEnum implements BaseEnum { + + /** + * 升序 + */ + ASC, + /** + * 降序 + */ + DESC, + + /** + * 智能排序 + * 需要人工处理的排序 也就是先不指定,到下一层去解析后处理 + */ + SMART, + ; + + @Override + public String getCode() { + return this.name(); + } + + @Override + public String getDescription() { + return this.name(); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/YesOrNoEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/YesOrNoEnum.java new file mode 100644 index 000000000..c695f63ff --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/YesOrNoEnum.java @@ -0,0 +1,53 @@ +package com.alibaba.easytools.base.enums; + +import lombok.Getter; + +/** + * 是否枚举 + * + * @author 是仪 + */ +@Getter +public enum YesOrNoEnum implements BaseEnum { + + /** + * 是 + */ + YES("是", true), + /** + * 未读 + */ + NO("否", false), + + ; + + final String description; + final boolean booleanValue; + + YesOrNoEnum(String description, boolean booleanValue) { + this.description = description; + this.booleanValue = booleanValue; + } + + @Override + public String getCode() { + return this.name(); + } + + /** + * 根据布尔值转换 + * + * @param booleanValue 布尔值 + * @return + */ + public static YesOrNoEnum valueOf(Boolean booleanValue) { + if (booleanValue == null) { + return null; + } + if (booleanValue) { + return YesOrNoEnum.YES; + } + return YesOrNoEnum.NO; + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/BaseOssKindEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/BaseOssKindEnum.java new file mode 100644 index 000000000..5734655aa --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/BaseOssKindEnum.java @@ -0,0 +1,26 @@ +package com.alibaba.easytools.base.enums.oss; + +import com.alibaba.easytools.base.enums.BaseEnum; + +/** + * oss枚举 + * + * @author 是仪 + */ +public interface BaseOssKindEnum extends BaseEnum { + + /** + * 获取权限控制 + * + * @return + */ + OssObjectAclEnum getOssObjectAcl(); + + /** + * 样式处理 + * + * @return + */ + String getProcess(); + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/OssObjectAclEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/OssObjectAclEnum.java new file mode 100644 index 000000000..753f688d5 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/enums/oss/OssObjectAclEnum.java @@ -0,0 +1,41 @@ +package com.alibaba.easytools.base.enums.oss; + +import com.alibaba.easytools.base.enums.BaseEnum; + +import lombok.Getter; + +/** + * oss权限 + * + * @author 是仪 + */ +@Getter +public enum OssObjectAclEnum implements BaseEnum { + /** + * 共有读 + */ + PUBLIC_READ("public-read"), + + /** + * 私有 + */ + PRIVATE("private"), + // 分号 + ; + + final String ossAcl; + + OssObjectAclEnum(String ossAcl) { + this.ossAcl = ossAcl; + } + + @Override + public String getCode() { + return this.name(); + } + + @Override + public String getDescription() { + return this.name(); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/BusinessException.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/BusinessException.java new file mode 100644 index 000000000..9fba5a738 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/BusinessException.java @@ -0,0 +1,64 @@ +package com.alibaba.easytools.base.excption; + +import com.alibaba.easytools.base.enums.BaseErrorEnum; + +import lombok.Data; + +/** + * 业务异常。不需要人工介入的叫做业务异常。 + * + * @author 是仪 + */ +@Data +public class BusinessException extends RuntimeException { + /** + * 异常的编码 + */ + private String code; + + public BusinessException(String message) { + this(CommonErrorEnum.COMMON_BUSINESS_ERROR, message); + } + + public BusinessException(String message, Throwable throwable) { + this(CommonErrorEnum.COMMON_BUSINESS_ERROR, message, throwable); + } + + public BusinessException(BaseErrorEnum errorEnum, String message) { + this(errorEnum.getCode(), message); + } + + public BusinessException(BaseErrorEnum errorEnum, String message, Throwable throwable) { + super(message, throwable); + this.code = errorEnum.getCode(); + } + + public BusinessException(BaseErrorEnum errorEnum) { + this(errorEnum.getCode(), errorEnum.getDescription()); + } + + public BusinessException(String code, String message) { + super(message); + this.code = code; + } + + public static BusinessException of(String message) { + return new BusinessException(message); + } + + public static BusinessException of(String code, String message) { + return new BusinessException(code, message); + } + + public static BusinessException of(BaseErrorEnum errorEnum, String message, Throwable throwable) { + return new BusinessException(errorEnum, message, throwable); + } + + public static BusinessException of(BaseErrorEnum errorEnum) { + return new BusinessException(errorEnum); + } + + public static BusinessException of(BaseErrorEnum errorEnum, String message) { + return new BusinessException(errorEnum, message); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/CommonErrorEnum.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/CommonErrorEnum.java new file mode 100644 index 000000000..ddf1778e4 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/CommonErrorEnum.java @@ -0,0 +1,85 @@ +package com.alibaba.easytools.base.excption; + +import com.alibaba.easytools.base.enums.BaseErrorEnum; + +import lombok.Getter; + +/** + * 通用的返回码定义 + * + * @author 是仪 + */ +@Getter +public enum CommonErrorEnum implements BaseErrorEnum { + /** + * 通用业务异常 + */ + COMMON_BUSINESS_ERROR("填写的信息异常,请尝试刷新页面"), + /** + * 通用系统异常 + */ + COMMON_SYSTEM_ERROR("系统开小差啦,请尝试刷新页面或者联系管理员"), + /** + * 通用系统异常 + */ + PARAM_ERROR("参数错误"), + /** + * 找不到数据 + */ + DATA_NOT_FOUND("找不到对应数据"), + /** + * 没有权限 + */ + PERMISSION_DENIED("权限不够"), + + /** + * 超过最大上传 + */ + MAX_UPLOAD_SIZE("上传的文件超过最大限制"), + + /** + * 需要登陆 + * 前端需要跳转到登陆界面 + */ + NEED_LOGGED_IN("未登录,请重新登陆"), + + /** + * 没有登录 + * 代表用户没有登陆,不需要跳转展示为空即可 + */ + NOT_LOGGED_IN("无法获取登陆信息,请尝试刷新页面或者重新登陆"), + + /** + * 超过访问限制 + */ + ACCESS_LIMIT_EXCEEDED("超过访问限制"), + + /** + * 找不到指定页面 + */ + PAGE_NOT_FOUND("找不到指定页面"), + + /** + * 上传文件失败 + */ + FAILED_TO_UPLOAD_FILE("上传文件失败"), + + + /** + * metaq重推专用异常 + */ + METAQ_RECONSUME_LATER("metaq重推专用异常"), + + ; + + CommonErrorEnum(String description) { + this.description = description; + } + + final String description; + + @Override + public String getCode() { + return this.name(); + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/MetaqReconsumeLaterBusinessException.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/MetaqReconsumeLaterBusinessException.java new file mode 100644 index 000000000..1dfa6c128 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/MetaqReconsumeLaterBusinessException.java @@ -0,0 +1,30 @@ +package com.alibaba.easytools.base.excption; + +import lombok.Getter; + +/** + * mq重推专用异常 + * + * @author 是仪 + */ + +@Getter +public class MetaqReconsumeLaterBusinessException extends BusinessException { + + public MetaqReconsumeLaterBusinessException() { + super(CommonErrorEnum.METAQ_RECONSUME_LATER, "mq消息重试"); + } + + public MetaqReconsumeLaterBusinessException(String message) { + super(CommonErrorEnum.METAQ_RECONSUME_LATER, message); + } + + public static MetaqReconsumeLaterBusinessException of(String message) { + return new MetaqReconsumeLaterBusinessException(message); + } + + public static MetaqReconsumeLaterBusinessException newInstance() { + return new MetaqReconsumeLaterBusinessException(); + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/SystemException.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/SystemException.java new file mode 100644 index 000000000..910fa7558 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/excption/SystemException.java @@ -0,0 +1,66 @@ +package com.alibaba.easytools.base.excption; + +import com.alibaba.easytools.base.enums.BaseErrorEnum; + +import lombok.Data; + +/** + * 业务异常。简单的说就是需要人工介入的异常叫做系统异常。 + * + * @author 是仪 + */ +@Data +public class SystemException extends RuntimeException { + + /** + * 异常的编码 + */ + private String code; + + public SystemException(String message) { + this(CommonErrorEnum.COMMON_SYSTEM_ERROR, message); + } + + public SystemException(String message, Throwable throwable) { + this(CommonErrorEnum.COMMON_SYSTEM_ERROR, message, throwable); + } + + public SystemException(String code, String message) { + super(message); + this.code = code; + } + + public SystemException(BaseErrorEnum errorEnum, String message, Throwable throwable) { + super(message, throwable); + this.code = errorEnum.getCode(); + } + + public SystemException(BaseErrorEnum errorEnum) { + this(errorEnum.getCode(), errorEnum.getDescription()); + } + + public SystemException(BaseErrorEnum errorEnum, String message) { + this(errorEnum.getCode(), message); + } + + public static SystemException of(String message) { + return new SystemException(message); + } + + public static SystemException of(String code, String message) { + return new SystemException(code, message); + } + + public static SystemException of(BaseErrorEnum errorEnum, String message, Throwable throwable) { + return new SystemException(errorEnum, message, throwable); + } + + public static SystemException of(BaseErrorEnum errorEnum) { + return new SystemException(errorEnum); + } + + public static SystemException of(BaseErrorEnum errorEnum, String message) { + return new SystemException(errorEnum, message); + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/handler/EasyCallBackHandler.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/handler/EasyCallBackHandler.java new file mode 100644 index 000000000..2067f3e98 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/handler/EasyCallBackHandler.java @@ -0,0 +1,29 @@ +package com.alibaba.easytools.base.handler; + +/** + * 回调的处理器 + * 比如meatq回调的时候 会执行这个方法 + * + * @author 是仪 + */ +public interface EasyCallBackHandler { + /** + * 在处理回调前调用 + */ + default void preHandle() { + } + + /** + * 在处理回调后调用 + * 抛出异常了不会处理 + */ + default void postHandle() { + } + + /** + * 在处理回调后调用 + * 无论是否异常 都会调用 + */ + default void afterCompletion() { + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/ObjectWrapper.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/ObjectWrapper.java new file mode 100644 index 000000000..4ffe37b96 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/ObjectWrapper.java @@ -0,0 +1,42 @@ +package com.alibaba.easytools.base.wrapper; + +import java.io.Serializable; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; + +import lombok.Getter; +import lombok.Setter; + +/** + * 封装一个对象 + * + * @author 是仪 + */ +@Getter +@Setter +public class ObjectWrapper implements Serializable { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + + private T value; + + public ObjectWrapper(T value) { + this.value = value; + } + + public static ObjectWrapper of(T value) { + return new ObjectWrapper<>(value); + } + + public static ObjectWrapper ofNull() { + return new ObjectWrapper<>(null); + } + + public T get() { + return value; + } + + public void set(T value) { + this.value = value; + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Result.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Result.java new file mode 100644 index 000000000..ca010eb90 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Result.java @@ -0,0 +1,52 @@ +package com.alibaba.easytools.base.wrapper; + +/** + * @author qiuyuyu + * @date 2022/01/20 + */ +public interface Result extends Traceable{ + /** + * 是否成功 + * + * @return + * @mock true + */ + boolean success(); + + /** + * 设置是否成功 + * + * @return + */ + void success(boolean success); + + /** + * 错误编码 + * + * @return + * @mock 000000 + */ + String errorCode(); + + /** + * 设置错误编码 + * + * @param errorCode + */ + void errorCode(String errorCode); + + /** + * 错误信息 + * + * @return + */ + String errorMessage(); + + + /** + * 设置错误信息 + * + * @param errorMessage + */ + void errorMessage(String errorMessage); +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Traceable.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Traceable.java new file mode 100644 index 000000000..44cac90fe --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/Traceable.java @@ -0,0 +1,22 @@ +package com.alibaba.easytools.base.wrapper; + +/** + * 是否可以跟踪 + * + * @author 是仪 + */ +public interface Traceable { + /** + * 获取 traceId + * + * @return traceId + */ + String getTraceId(); + + /** + * 设置traceId + * + * @param traceId + */ + void setTraceId(String traceId); +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderBy.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderBy.java new file mode 100644 index 000000000..aae704b06 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderBy.java @@ -0,0 +1,46 @@ +package com.alibaba.easytools.base.wrapper.param; + +import java.io.Serializable; + +import com.alibaba.easytools.base.enums.OrderByDirectionEnum; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 排序的对象 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class OrderBy implements Serializable { + /** + * 排序字段 + */ + private String orderConditionName; + /** + * 排序方向 + */ + private OrderByDirectionEnum direction; + + public static OrderBy of(String property, OrderByDirectionEnum direction) { + return new OrderBy(property, direction); + } + + public static OrderBy asc(String property) { + return new OrderBy(property, OrderByDirectionEnum.ASC); + } + + public static OrderBy desc(String property) { + return new OrderBy(property, OrderByDirectionEnum.DESC); + } + + public static OrderBy smart(String property) { + return new OrderBy(property, OrderByDirectionEnum.SMART); + } +} \ No newline at end of file diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderCondition.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderCondition.java new file mode 100644 index 000000000..b996059f6 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/OrderCondition.java @@ -0,0 +1,16 @@ +package com.alibaba.easytools.base.wrapper.param; + +/** + * 排序条件 + * + * @author 是仪 + */ +public interface OrderCondition { + + /** + * 返回列的名字 + * + * @return + */ + OrderBy getOrderBy(); +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/PageQueryParam.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/PageQueryParam.java new file mode 100644 index 000000000..bf14723e1 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/PageQueryParam.java @@ -0,0 +1,141 @@ +package com.alibaba.easytools.base.wrapper.param; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.OrderByDirectionEnum; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.Range; + +/** + * 分页查询的参数 + * + * @author zhuangjiaju + * @date 2021/06/26 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class PageQueryParam implements Serializable { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 页码 + */ + @NotNull(message = "分页页码不能为空") + @Min(value = 1, message = "分页页码必须大于0") + @Builder.Default + private Integer pageNo = 1; + /** + * 分页大小 + */ + @NotNull(message = "分页大小不能为空") + @Range(min = 1, max = EasyToolsConstant.MAX_PAGE_SIZE, + message = "分页大小必须在1-" + EasyToolsConstant.MAX_PAGE_SIZE + "之间") + @Builder.Default + private Integer pageSize = 100; + + /** + * 是否返回总条数 + * 默认不返回 提高性能 + */ + @Builder.Default + private Boolean enableReturnCount = Boolean.FALSE; + + /** + * 排序 + */ + private List orderByList; + + /** + * 查询全部数据 + */ + public void queryAll() { + this.pageNo = 1; + this.pageSize = Integer.MAX_VALUE; + } + + /** + * 查询一条数据 + */ + public void queryOne() { + this.pageNo = 1; + this.pageSize = 1; + } + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderBy 排序 + * @return 排序参数 + */ + public PageQueryParam orderBy(OrderBy orderBy) { + orderByList = new ArrayList<>(); + orderByList.add(orderBy); + return this; + } + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderConditionName 排序字段 + * @param direction 排序方向 + * @return 排序参数 + */ + public PageQueryParam orderBy(String orderConditionName, OrderByDirectionEnum direction) { + return orderBy(new OrderBy(orderConditionName, direction)); + } + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderCondition 排序条件 + * @return 排序参数 + */ + public PageQueryParam orderBy(OrderCondition orderCondition) { + return orderBy(orderCondition.getOrderBy()); + } + + /** + * 新增一个排序 + * + * @param orderBy 排序 + * @return 排序参数 + */ + public PageQueryParam andOrderBy(OrderBy orderBy) { + orderByList.add(orderBy); + return this; + } + + /** + * 新增一个排序 + * + * @param orderConditionName 排序字段 + * @param direction 排序方向 + * @return 排序参数 + */ + public PageQueryParam andOrderBy(String orderConditionName, OrderByDirectionEnum direction) { + return andOrderBy(new OrderBy(orderConditionName, direction)); + } + + /** + * 新增一个排序 + * + * @param orderCondition 排序条件 + * @return 排序参数 + */ + public PageQueryParam andOrderBy(OrderCondition orderCondition) { + return andOrderBy(orderCondition.getOrderBy()); + } +} + diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/QueryParam.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/QueryParam.java new file mode 100644 index 000000000..21c601723 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/param/QueryParam.java @@ -0,0 +1,98 @@ +package com.alibaba.easytools.base.wrapper.param; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.OrderByDirectionEnum; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 查询的参数 + * + * @author zhuangjiaju + * @date 2021/06/26 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class QueryParam implements Serializable { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + + /** + * 排序 + */ + private List orderByList; + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderBy 排序 + * @return 排序参数 + */ + public QueryParam orderBy(OrderBy orderBy) { + orderByList = new ArrayList<>(); + orderByList.add(orderBy); + return this; + } + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderConditionName 排序字段 + * @param direction 排序方向 + * @return 排序参数 + */ + public QueryParam orderBy(String orderConditionName, OrderByDirectionEnum direction) { + return orderBy(new OrderBy(orderConditionName, direction)); + } + + /** + * 新增一个排序 并替换原有排序 + * + * @param orderCondition 排序条件 + * @return 排序参数 + */ + public QueryParam orderBy(OrderCondition orderCondition) { + return orderBy(orderCondition.getOrderBy()); + } + + /** + * 新增一个排序 + * + * @param orderBy 排序 + * @return 排序参数 + */ + public QueryParam andOrderBy(OrderBy orderBy) { + orderByList.add(orderBy); + return this; + } + + /** + * 新增一个排序 + * + * @param orderConditionName 排序字段 + * @param direction 排序方向 + * @return 排序参数 + */ + public QueryParam andOrderBy(String orderConditionName, OrderByDirectionEnum direction) { + return andOrderBy(new OrderBy(orderConditionName, direction)); + } + + /** + * 新增一个排序 + * + * @param orderCondition 排序条件 + * @return 排序参数 + */ + public QueryParam andOrderBy(OrderCondition orderCondition) { + return andOrderBy(orderCondition.getOrderBy()); + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/request/PageQueryRequest.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/request/PageQueryRequest.java new file mode 100644 index 000000000..7146ff768 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/request/PageQueryRequest.java @@ -0,0 +1,43 @@ +package com.alibaba.easytools.base.wrapper.request; + +import java.io.Serializable; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.Range; + +/** + * 分页查询的参数 + * + * @author zhuangjiaju + * @date 2021/06/26 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class PageQueryRequest implements Serializable { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 页码 + */ + @NotNull(message = "分页页码不能为空") + @Builder.Default + private Integer pageNo = 1; + /** + * 分页条数 + */ + @NotNull(message = "分页大小不能为空") + @Range(min = 1, max = EasyToolsConstant.MAX_PAGE_SIZE, + message = "分页大小必须在1-" + EasyToolsConstant.MAX_PAGE_SIZE + "之间") + @Builder.Default + private Integer pageSize = 10; + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ActionResult.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ActionResult.java new file mode 100644 index 000000000..d68415eee --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ActionResult.java @@ -0,0 +1,128 @@ +package com.alibaba.easytools.base.wrapper.result; + +import java.io.Serializable; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.BaseErrorEnum; +import com.alibaba.easytools.base.excption.CommonErrorEnum; +import com.alibaba.easytools.base.wrapper.Result; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * action的返回对象 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class ActionResult implements Serializable, Result { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 是否成功 + * + * @mock true + */ + @NotNull + @Builder.Default + private Boolean success = Boolean.TRUE; + + /** + * 错误编码 + * + * @see CommonErrorEnum + */ + private String errorCode; + /** + * 错误信息 + */ + private String errorMessage; + + /** + * traceId + */ + private String traceId; + + /** + * 返回成功 + * + * @return 运行结果 + */ + public static ActionResult isSuccess() { + return new ActionResult(); + } + + @Override + public boolean success() { + return success; + } + + @Override + public void success(boolean success) { + this.success = success; + } + + @Override + public String errorCode() { + return errorCode; + } + + @Override + public void errorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String errorMessage() { + return errorMessage; + } + + @Override + public void errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + /** + * 返回失败 + * + * @param errorCode 错误编码 + * @param errorMessage 错误信息 + * @return 运行结果 + */ + public static ActionResult fail(String errorCode, String errorMessage) { + ActionResult result = new ActionResult(); + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.success = Boolean.FALSE; + return result; + } + + /** + * 返回失败 + * + * @param errorEnum 错误枚举 + * @return 运行结果 + */ + public static ActionResult fail(BaseErrorEnum errorEnum) { + return fail(errorEnum.getCode(), errorEnum.getDescription()); + } + + /** + * 返回失败 + * + * @param errorEnum 错误枚举 + * @return 运行结果 + */ + public static ActionResult fail(BaseErrorEnum errorEnum, String errorMessage) { + return fail(errorEnum.getCode(), errorMessage); + } + +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/DataResult.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/DataResult.java new file mode 100644 index 000000000..abe7a72c1 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/DataResult.java @@ -0,0 +1,171 @@ +package com.alibaba.easytools.base.wrapper.result; + +import java.io.Serializable; +import java.util.function.Function; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.BaseErrorEnum; +import com.alibaba.easytools.base.excption.CommonErrorEnum; +import com.alibaba.easytools.base.wrapper.Result; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * data的返回对象 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class DataResult implements Serializable, Result { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 是否成功 + * + * @mock true + */ + @NotNull + @Builder.Default + private Boolean success = Boolean.TRUE; + + /** + * 错误编码 + * + * @see CommonErrorEnum + */ + private String errorCode; + + /** + * 错误信息 + */ + private String errorMessage; + + /** + * 数据信息 + */ + private T data; + + /** + * traceId + */ + private String traceId; + + private DataResult(T data) { + this(); + this.data = data; + } + + /** + * 构建返回对象 + * + * @param data 需要构建的对象 + * @param 需要构建的对象类型 + * @return 返回的结果 + */ + public static DataResult of(T data) { + return new DataResult<>(data); + } + + /** + * 构建空的返回对象 + * + * @param 需要构建的对象类型 + * @return 返回的结果 + */ + public static DataResult empty() { + return new DataResult<>(); + } + + /** + * 构建异常返回 + * + * @param errorCode 错误编码 + * @param errorMessage 错误信息 + * @param 需要构建的对象类型 + * @return 返回的结果 + */ + public static DataResult error(String errorCode, String errorMessage) { + DataResult result = new DataResult<>(); + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.success = false; + return result; + } + + /** + * 构建异常返回 + * + * @param errorEnum 错误枚举 + * @param 需要构建的对象类型 + * @return 返回的结果 + */ + public static DataResult error(BaseErrorEnum errorEnum) { + return error(errorEnum.getCode(), errorEnum.getDescription()); + } + + /** + * 判断是否存在数据 + * + * @param dataResult + * @return 是否存在数据 + */ + public static boolean hasData(DataResult dataResult) { + return dataResult != null && dataResult.getSuccess() && dataResult.getData() != null; + } + + /** + * 将当前的类型转换成另外一个类型 + * + * @param mapper 转换的方法 + * @param 返回的类型 + * @return 返回的结果 + */ + public DataResult map(Function mapper) { + R returnData = hasData(this) ? mapper.apply(getData()) : null; + DataResult dataResult = new DataResult<>(); + dataResult.setSuccess(getSuccess()); + dataResult.setErrorCode(getErrorCode()); + dataResult.setErrorMessage(getErrorMessage()); + dataResult.setData(returnData); + dataResult.setTraceId(getTraceId()); + return dataResult; + } + + @Override + public boolean success() { + return success; + } + + @Override + public void success(boolean success) { + this.success = success; + } + + @Override + public String errorCode() { + return errorCode; + } + + @Override + public void errorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String errorMessage() { + return errorMessage; + } + + @Override + public void errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ListResult.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ListResult.java new file mode 100644 index 000000000..3bc74f29c --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/ListResult.java @@ -0,0 +1,173 @@ +package com.alibaba.easytools.base.wrapper.result; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.BaseErrorEnum; +import com.alibaba.easytools.base.excption.CommonErrorEnum; +import com.alibaba.easytools.base.wrapper.Result; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * data的返回对象 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class ListResult implements Serializable, Result { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 是否成功 + * + * @mock true + */ + @NotNull + @Builder.Default + private Boolean success = Boolean.TRUE; + + /** + * 错误编码 + * + * @see CommonErrorEnum + */ + private String errorCode; + /** + * 异常信息 + */ + private String errorMessage; + /** + * 数据信息 + */ + private List data; + /** + * traceId + */ + private String traceId; + + private ListResult(List data) { + this(); + this.data = data; + } + + /** + * 构建列表返回对象 + * + * @param data 需要构建的对象 + * @param 需要构建的对象类型 + * @return 返回的列表 + */ + public static ListResult of(List data) { + return new ListResult<>(data); + } + + /** + * 构建空的列表返回对象 + * + * @param 需要构建的对象类型 + * @return 返回的列表 + */ + public static ListResult empty() { + return of(Collections.emptyList()); + } + + /** + * 构建异常返回列表 + * + * @param errorCode 错误编码 + * @param errorMessage 错误信息 + * @param 需要构建的对象类型 + * @return 返回的列表 + */ + public static ListResult error(String errorCode, String errorMessage) { + ListResult result = new ListResult<>(); + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.success = Boolean.TRUE; + return result; + } + + /** + * 构建异常返回列表 + * + * @param errorEnum 错误枚举 + * @param 需要构建的对象类型 + * @return 返回的列表 + */ + public static ListResult error(BaseErrorEnum errorEnum) { + return error(errorEnum.getCode(), errorEnum.getDescription()); + } + + /** + * 判断是否存在数据 + * + * @param listResult + * @return 是否存在数据 + */ + public static boolean hasData(ListResult listResult) { + return listResult != null && listResult.getSuccess() && listResult.getData() != null && !listResult.getData() + .isEmpty(); + } + + /** + * 将当前的类型转换成另外一个类型 + * + * @param mapper 转换的方法 + * @param 返回的类型 + * @return 分页返回对象 + */ + public ListResult map(Function mapper) { + List returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList()) + : Collections.emptyList(); + ListResult listResult = new ListResult<>(); + listResult.setSuccess(getSuccess()); + listResult.setErrorCode(getErrorCode()); + listResult.setErrorMessage(getErrorMessage()); + listResult.setData(returnData); + listResult.setTraceId(getTraceId()); + return listResult; + } + + @Override + public boolean success() { + return success; + } + + @Override + public void success(boolean success) { + this.success = success; + } + + @Override + public String errorCode() { + return errorCode; + } + + @Override + public void errorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String errorMessage() { + return errorMessage; + } + + @Override + public void errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/PageResult.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/PageResult.java new file mode 100644 index 000000000..a66026d51 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/PageResult.java @@ -0,0 +1,360 @@ +package com.alibaba.easytools.base.wrapper.result; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.BaseErrorEnum; +import com.alibaba.easytools.base.excption.CommonErrorEnum; +import com.alibaba.easytools.base.wrapper.Result; +import com.alibaba.easytools.base.wrapper.param.PageQueryParam; +import com.alibaba.easytools.base.wrapper.result.web.WebPageResult; +import com.alibaba.easytools.base.wrapper.result.web.WebPageResult.Page; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * data的返回对象 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class PageResult implements Serializable, Result> { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 是否成功 + * + * @mock true + */ + @NotNull + @Builder.Default + private Boolean success = Boolean.TRUE; + + /** + * 错误编码 + * + * @see CommonErrorEnum + */ + private String errorCode; + /** + * 异常信息 + */ + private String errorMessage; + /** + * 数据信息 + */ + private List data; + /** + * 分页编码 + */ + @Builder.Default + private Integer pageNo = 1; + /** + * 分页大小 + */ + @Builder.Default + private Integer pageSize = 10; + /** + * 总的大小 + */ + @Builder.Default + private Long total = 0L; + /** + * traceId + */ + private String traceId; + /** + * 是否存在下一页 + */ + private Boolean hasNextPage; + + private PageResult(List data, Long total, Long pageNo, Long pageSize) { + this(); + this.data = data; + this.total = total; + if (pageNo != null) { + this.pageNo = Math.toIntExact(pageNo); + } + if (pageSize != null) { + this.pageSize = Math.toIntExact(pageSize); + } + } + + private PageResult(List data, Long total, Integer pageNo, Integer pageSize) { + this(); + this.data = data; + this.total = total; + if (pageNo != null) { + this.pageNo = pageNo; + } + if (pageSize != null) { + this.pageSize = pageSize; + } + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult of(List data, Long total, Long pageNo, Long pageSize) { + return new PageResult<>(data, total, pageNo, pageSize); + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult of(List data, Long total, Integer pageNo, Integer pageSize) { + return new PageResult<>(data, total, pageNo, pageSize); + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param param 分页参数 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult of(List data, Long total, PageQueryParam param) { + return new PageResult<>(data, total, param.getPageNo(), param.getPageSize()); + } + + /** + * 构建空的返回对象 + * + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult empty(Long pageNo, Long pageSize) { + return of(new ArrayList<>(), 0L, pageNo, pageSize); + } + + /** + * 构建空的返回对象 + * + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult empty(Integer pageNo, Integer pageSize) { + return of(new ArrayList<>(), 0L, pageNo, pageSize); + } + + /** + * 构建空的返回对象 + * + * @param param 查询参数 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static PageResult empty(PageQueryParam param) { + return of(new ArrayList<>(), 0L, param.getPageNo(), param.getPageSize()); + } + + /** + * 判断是否还有下一页 + * 根据分页大小来计算 防止total为空 + * + * @return 是否还有下一页 + */ + public Boolean calculateHasNextPage() { + // 存在分页大小 根据分页来计算 + if (total > 0) { + return (long)pageSize * pageNo <= total; + } + // 没有数据 肯定没有下一页 + if (data == null || data.isEmpty()) { + return false; + } + // 当前数量小于分页数量 + return data.size() >= pageSize; + } + + /** + * 判断是否还有下一页 + * 根据分页大小来计算 防止total为空 + * + * @return 是否还有下一页 + * @deprecated 使用 {@link #getHasNextPage()} ()} + */ + @Deprecated + public boolean hasNextPage() { + return getHasNextPage(); + } + + public Boolean getHasNextPage() { + if (hasNextPage == null) { + hasNextPage = calculateHasNextPage(); + } + return hasNextPage; + } + + /** + * 返回查询异常信息 + * + * @param errorCode 错误编码 + * @param errorMessage 错误信息 + * @param 返回的对象 + * @return 分页返回对象 + */ + public static PageResult error(String errorCode, String errorMessage) { + PageResult result = new PageResult<>(); + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.success = Boolean.FALSE; + return result; + } + + /** + * 返回查询异常信息 + * + * @param errorEnum 错误枚举 + * @param 返回的对象 + * @return 分页返回对象 + */ + public static PageResult error(BaseErrorEnum errorEnum) { + return error(errorEnum.getCode(), errorEnum.getDescription()); + } + + /** + * 判断是否存在数据 + * + * @param pageResult + * @return 是否存在数据 + */ + public static boolean hasData(PageResult pageResult) { + return pageResult != null && pageResult.getSuccess() && pageResult.getData() != null && !pageResult.getData() + .isEmpty(); + } + + /** + * 将当前的类型转换成另外一个类型 + * + * @param mapper 转换的方法 + * @param 返回的类型 + * @return 分页返回对象 + */ + public PageResult map(Function mapper) { + List returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList()) + : new ArrayList<>(); + PageResult pageResult = new PageResult<>(); + pageResult.setSuccess(getSuccess()); + pageResult.setErrorCode(getErrorCode()); + pageResult.setErrorMessage(getErrorMessage()); + pageResult.setData(returnData); + pageResult.setPageNo(getPageNo()); + pageResult.setPageSize(getPageSize()); + pageResult.setTotal(getTotal()); + pageResult.setTraceId(getTraceId()); + return pageResult; + } + + /** + * 将当前的类型转换成另外一个类型 + * 并且转换成web的类型 + * 这里注意如果当前项目在web层用的也是 PageResult 则直接使用 map方法接口即可 + * + * @param mapper 转换的方法 + * @param 返回的类型 + * @return 分页返回对象 + */ + public WebPageResult mapToWeb(Function mapper) { + List returnData = hasData(this) ? getData().stream().map(mapper).collect(Collectors.toList()) + : new ArrayList<>(); + WebPageResult pageResult = new WebPageResult<>(); + pageResult.setSuccess(getSuccess()); + pageResult.setErrorCode(getErrorCode()); + pageResult.setErrorMessage(getErrorMessage()); + pageResult.setTraceId(getTraceId()); + // 重新设置一个分页信息 + Page page = new Page<>(); + pageResult.setData(page); + page.setData(returnData); + page.setPageNo(getPageNo()); + page.setPageSize(getPageSize()); + page.setTotal(getTotal()); + pageResult.setData(page); + return pageResult; + } + + /** + * 转成一个web 的分页 + * + * @return 分页返回对象 + */ + public WebPageResult toWeb() { + WebPageResult pageResult = new WebPageResult<>(); + pageResult.setSuccess(getSuccess()); + pageResult.setErrorCode(getErrorCode()); + pageResult.setErrorMessage(getErrorMessage()); + pageResult.setTraceId(getTraceId()); + // 重新设置一个分页信息 + Page page = new Page<>(); + pageResult.setData(page); + page.setData(getData()); + page.setPageNo(getPageNo()); + page.setPageSize(getPageSize()); + page.setTotal(getTotal()); + pageResult.setData(page); + return pageResult; + } + + @Override + public boolean success() { + return success; + } + + @Override + public void success(boolean success) { + this.success = success; + } + + @Override + public String errorCode() { + return errorCode; + } + + @Override + public void errorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String errorMessage() { + return errorMessage; + } + + @Override + public void errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/web/WebPageResult.java b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/web/WebPageResult.java new file mode 100644 index 000000000..e82ab6e26 --- /dev/null +++ b/easyexcel-test/easytools-base/src/main/java/com/alibaba/easytools/base/wrapper/result/web/WebPageResult.java @@ -0,0 +1,331 @@ +package com.alibaba.easytools.base.wrapper.result.web; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.validation.constraints.NotNull; + +import com.alibaba.easytools.base.constant.EasyToolsConstant; +import com.alibaba.easytools.base.enums.BaseErrorEnum; +import com.alibaba.easytools.base.wrapper.Result; +import com.alibaba.easytools.base.wrapper.param.PageQueryParam; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * data的返回对象 + * 和 PageResult 比较一致 也可以直接用 PageResult。 这个是部分项目前端需要将 data+pageNo 封装到一起 所以额外创建的类 + * + * @author 是仪 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class WebPageResult implements Serializable, Result> { + private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID; + /** + * 是否成功 + * + * @mock true + */ + @NotNull + @Builder.Default + private Boolean success = Boolean.TRUE; + /** + * 异常编码 + */ + private String errorCode; + /** + * 异常信息 + */ + private String errorMessage; + /** + * 数据信息 + */ + @Builder.Default + private Page data = new Page<>(); + /** + * traceId + */ + private String traceId; + + private WebPageResult(List data, Long total, Long pageNo, Long pageSize) { + this.success = Boolean.TRUE; + this.data = new Page<>(data, total, pageNo, pageSize); + } + + private WebPageResult(List data, Long total, Integer pageNo, Integer pageSize) { + this.success = Boolean.TRUE; + this.data = new Page<>(data, total, pageNo, pageSize); + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static WebPageResult of(List data, Long total, Long pageNo, Long pageSize) { + return new WebPageResult<>(data, total, pageNo, pageSize); + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static WebPageResult of(List data, Long total, Integer pageNo, Integer pageSize) { + return new WebPageResult<>(data, total, pageNo, pageSize); + } + + /** + * 构建分页返回对象 + * + * @param data 返回的对象 + * @param total 总的条数 + * @param param 分页参数 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static WebPageResult of(List data, Long total, PageQueryParam param) { + return new WebPageResult<>(data, total, param.getPageNo(), param.getPageSize()); + } + + /** + * 构建空的返回对象 + * + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static WebPageResult empty(Long pageNo, Long pageSize) { + return of(Collections.emptyList(), 0L, pageNo, pageSize); + } + + /** + * 构建空的返回对象 + * + * @param pageNo 页码 + * @param pageSize 分页大小 + * @param 返回的对象类型 + * @return 分页返回对象 + */ + public static WebPageResult empty(Integer pageNo, Integer pageSize) { + return of(Collections.emptyList(), 0L, pageNo, pageSize); + } + + /** + * 判断是否还有下一页 + * 根据分页大小来计算 防止total为空 + * + * @return 是否还有下一页 + * @deprecated 使用 {@link #getHasNextPage()} ()} + */ + @Deprecated + public boolean hasNextPage() { + return getHasNextPage(); + } + + public Boolean getHasNextPage() { + if (data == null) { + return Boolean.FALSE; + } + return data.getHasNextPage(); + } + + /** + * 返回查询异常信息 + * + * @param errorCode 错误编码 + * @param errorMessage 错误信息 + * @param 返回的对象 + * @return 分页返回对象 + */ + public static WebPageResult error(String errorCode, String errorMessage) { + WebPageResult result = new WebPageResult<>(); + result.errorCode = errorCode; + result.errorMessage = errorMessage; + result.success = Boolean.FALSE; + return result; + } + + /** + * 返回查询异常信息 + * + * @param errorEnum 错误枚举 + * @param 返回的对象 + * @return 分页返回对象 + */ + public static WebPageResult error(BaseErrorEnum errorEnum) { + return error(errorEnum.getCode(), errorEnum.getDescription()); + } + + /** + * 判断是否存在数据 + * + * @param pageResult + * @return 是否存在数据 + */ + public static boolean hasData(WebPageResult pageResult) { + return pageResult != null && pageResult.getSuccess() && pageResult.getData() != null + && pageResult.getData().getData() != null && !pageResult.getData().getData().isEmpty(); + } + + /** + * 将当前的类型转换成另外一个类型 + * + * @param mapper 转换的方法 + * @param 返回的类型 + * @return 分页返回对象 + */ + public WebPageResult map(Function mapper) { + List returnData = hasData(this) ? getData().getData().stream().map(mapper).collect(Collectors.toList()) + : Collections.emptyList(); + WebPageResult pageResult = new WebPageResult<>(); + pageResult.setSuccess(getSuccess()); + pageResult.setErrorCode(getErrorCode()); + pageResult.setErrorMessage(getErrorMessage()); + pageResult.setTraceId(getTraceId()); + // 重新设置一个分页信息 + Page page = new Page<>(); + pageResult.setData(page); + page.setData(returnData); + page.setPageNo(data.getPageNo()); + page.setPageSize(data.getPageSize()); + page.setTotal(data.getTotal()); + return pageResult; + } + + @Override + public boolean success() { + return success; + } + + @Override + public void success(boolean success) { + this.success = success; + } + + @Override + public String errorCode() { + return errorCode; + } + + @Override + public void errorCode(String errorCode) { + this.errorCode = errorCode; + } + + @Override + public String errorMessage() { + return errorMessage; + } + + @Override + public void errorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + /** + * 分页信息 + * + * @param + */ + @Data + public static class Page { + /** + * 数据信息 + */ + private List data; + /** + * 分页编码 + */ + private Integer pageNo; + /** + * 分页大小 + */ + private Integer pageSize; + /** + * 总的大小 + */ + private Long total; + /** + * 是否存在下一页 + */ + private Boolean hasNextPage; + + public Page() { + this.pageNo = 1; + this.pageSize = 10; + this.total = 0L; + } + + private Page(List data, Long total, Long pageNo, Long pageSize) { + this(); + this.data = data; + this.total = total; + if (pageNo != null) { + this.pageNo = Math.toIntExact(pageNo); + } + if (pageSize != null) { + this.pageSize = Math.toIntExact(pageSize); + } + } + + private Page(List data, Long total, Integer pageNo, Integer pageSize) { + this(); + this.data = data; + this.total = total; + if (pageNo != null) { + this.pageNo = pageNo; + } + if (pageSize != null) { + this.pageSize = pageSize; + } + } + + public Boolean getHasNextPage() { + if (hasNextPage == null) { + hasNextPage = calculateHasNextPage(); + } + return hasNextPage; + } + + /** + * 判断是否还有下一页 + * 根据分页大小来计算 防止total为空 + * + * @return 是否还有下一页 + */ + public Boolean calculateHasNextPage() { + // 存在分页大小 根据分页来计算 + if (total > 0) { + return (long)pageSize * pageNo <= total; + } + // 没有数据 肯定没有下一页 + if (data == null || data.isEmpty()) { + return false; + } + // 当前数量小于分页数量 + return data.size() >= pageSize; + } + } +} diff --git a/easyexcel-test/easytools-common/pom.xml b/easyexcel-test/easytools-common/pom.xml new file mode 100644 index 000000000..ae50f7014 --- /dev/null +++ b/easyexcel-test/easytools-common/pom.xml @@ -0,0 +1,65 @@ + + + + com.alibaba.easytools + easytools-parent + ${revision} + ../pom.xml + + 4.0.0 + easytools-common + + + + com.alibaba.easytools + easytools-base + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + org.slf4j + slf4j-api + + + org.projectlombok + lombok + + + com.google.guava + guava + + + com.alibaba + fastjson + + + cn.hutool + hutool-all + + + + + org.mapstruct + mapstruct + + + org.mapstruct + mapstruct-processor + + + + javax.validation + validation-api + provided + + + + \ No newline at end of file diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/model/IntegerWrapper.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/model/IntegerWrapper.java new file mode 100644 index 000000000..1aafc27b5 --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/model/IntegerWrapper.java @@ -0,0 +1,88 @@ +package com.alibaba.easytools.common.model; + +import java.io.Serializable; + +/** + * 整形的封装类 + * + * @author 是仪 + */ +public class IntegerWrapper extends Number implements Serializable { + private static final long serialVersionUID = 1L; + + private int value; + + public IntegerWrapper(int initialValue) { + value = initialValue; + } + + public IntegerWrapper() { + } + + public final int get() { + return value; + } + + public final void set(int newValue) { + value = newValue; + } + + public final int getAndIncrement() { + return getAndAdd(1); + } + + public final int getAndDecrement() { + return getAndAdd(-1); + } + + public final int getAndAdd(int delta) { + int oldValue = value; + value += delta; + return oldValue; + } + + public final int incrementAndGet() { + return addAndGet(1); + } + + public final int decrementAndGet() { + return addAndGet(-1); + } + + public final int addAndGet(int delta) { + value += delta; + return value; + } + + public final void increment() { + add(1); + } + + public final void decrement() { + add(-1); + } + + public final void add(int delta) { + value += delta; + } + + @Override + public int intValue() { + return get(); + } + + @Override + public long longValue() { + return get(); + } + + @Override + public float floatValue() { + return get(); + } + + @Override + public double doubleValue() { + return get(); + } +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyCollectionUtils.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyCollectionUtils.java new file mode 100644 index 000000000..153722ce6 --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyCollectionUtils.java @@ -0,0 +1,235 @@ +package com.alibaba.easytools.common.util; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 集合工具类 + * + * @author Jiaju Zhuang + */ +public class EasyCollectionUtils { + + /** + * 集合stream + * + * @param collection 集合 + * @param 返回的类型 + * @return 集合的stream + */ + public static Stream stream(Collection collection) { + return collection != null ? collection.stream() : Stream.empty(); + } + + /** + * for 循环一个集合 + * + * @param collection + * @param action + * @param + */ + public static void forEach(Collection collection, Consumer action) { + if (collection == null || collection.isEmpty()) { + return; + } + collection.forEach(action); + } + + /** + * 将一个集合 转换成一个list + *

+ * 会过滤集合中转换前后的空数据,所以会入参出参数量不一致 + * + * @param collection 集合 + * @param function 转换function + * @param 转换前的数据类型 + * @param 转换后数据类型 + * @return list 如果入参为空 会返回一个空数组,且无法修改 + */ + public static List toList(Collection collection, Function function) { + return stream(collection) + .filter(Objects::nonNull) + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将一个集合 转换成一个list + *

+ * 会过滤集合中转换前后的空数据,所以会入参出参数量不一致 + * + * @param collection 集合 + * @param function 转换function + * @param 转换前的数据类型 + * @param 转换后数据类型 + * @return list 如果入参为空 会返回一个空数组,且无法修改 + */ + public static List toList(Collection collection, Function function, Predicate filter) { + return stream(collection) + .filter(Objects::nonNull) + .filter(filter) + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将一个集合 转换成一个list 并去重 + *

+ * 会过滤集合中转换前后的空数据,所以会入参出参数量不一致 + * + * @param collection 集合 + * @param function 转换function + * @param 转换前的数据类型 + * @param 转换后数据类型 + * @return list 如果入参为空 会返回一个空数组,且无法修改 + */ + public static List toDistinctList(Collection collection, Function function) { + return stream(collection) + .filter(Objects::nonNull) + .map(function) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + /** + * 将一个集合 里面的List属性的字段全部铺开,重新转换成新的list + *

+ * 会过滤集合中转换前后的空数据,所以会入参出参数量不一致 + * + * @param collection 集合 + * @param function 转换function + * @param 转换前的数据类型 + * @param 转换后数据类型 + * @return list 如果入参为空 会返回一个空数组,且无法修改 + */ + public static List toFlatList(Collection collection, Function> function) { + return stream(collection) + .map(function) + .filter(CollectionUtils::isNotEmpty) + .flatMap(Collection::stream) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将一个集合 转换成一个set + *

+ * 会过滤集合中转换前后的空数据 + * + * @param collection 集合 + * @param function 转换function + * @param 转换前的数据类型 + * @param 转换后数据类型 + * @return list 如果入参为空 会返回一个空数组,且无法修改 + */ + public static Set toSet(Collection collection, Function function) { + return stream(collection) + .filter(Objects::nonNull) + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + /** + * 将一个集合转成map,遇到key冲突以第二个为准 + * + * @param collection 集合 + * @param keyFunction keyFunction + * @param valueFunction valueFunction + * @param key数据类型 + * @param value数据类型 + * @param 转换前的数据类型 + * @return 转成以后的map + */ + public static Map toMap(Collection collection, Function keyFunction, + Function valueFunction) { + return stream(collection) + .filter(Objects::nonNull) + .collect(Collectors.toMap(keyFunction, valueFunction, (oldValue, newValue) -> newValue)); + } + + /** + * 将一个集合转成map,map的value就是集合的值,遇到key冲突以第二个为准 + * + * @param collection 集合 + * @param keyFunction keyFunction + * @param key数据类型 + * @param 转换前的数据类型 + * @return 转成以后的map + */ + public static Map toIdentityMap(Collection collection, Function keyFunction) { + return toMap(collection, keyFunction, Function.identity()); + } + + /** + * 将一个集合转成map 转换成一个 map 数据包含list + * + * @param collection 集合 + * @param keyFunction keyFunction + * @param key数据类型 + * @param 转换前的数据类型 + * @return 转成以后的map + */ + public static Map> toGroupingMap(Collection collection, Function keyFunction) { + return stream(collection) + .filter(Objects::nonNull) + .collect(Collectors.groupingBy(keyFunction)); + } + + /** + * 往一个集合里面加入另一个一个集合 + * + * @param collection 原始的集合 + * @param collectionAdd 需要被加入的集合 + * @param + * @return 是否加入了数据 + */ + public static boolean addAll(final Collection collection, final Collection collectionAdd) { + if (collectionAdd == null) { + return false; + } + return collection.addAll(collectionAdd); + } + + /** + * 判断一个集合的长度为0 但是不为null + * + * @param collection 集合 + * @return + */ + public static boolean isEmptyButNotNull(final Collection collection) { + return collection != null && collection.isEmpty(); + } + + /** + * 判断 一堆集合 是否存在一个 长度为0 但是不为null的数组 + * + * @param collections 为空则返回false + * @return + */ + public static boolean isAnyEmptyButNotNull(final Collection... collections) { + if (ArrayUtils.isEmpty(collections)) { + return false; + } + for (final Collection collection : collections) { + if (isEmptyButNotNull(collection)) { + return true; + } + } + return false; + } +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyEnumUtils.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyEnumUtils.java new file mode 100644 index 000000000..8b4840ef0 --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyEnumUtils.java @@ -0,0 +1,97 @@ +package com.alibaba.easytools.common.util; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.alibaba.easytools.base.enums.BaseEnum; + +/** + * enum工具类 + *

+ * 主要为了解决每个枚举都需要写一个根据code 获取value 的函数,看起来不太友好 + * + * @author Jiaju Zhuang + */ +public class EasyEnumUtils { + /** + * 枚举缓存 不用每次都去循环读取枚举 + */ + private static final Map>> ENUM_CACHE = new ConcurrentHashMap<>(); + + /** + * 根据一个枚举类型获取 枚举的描述 + * + * @param clazz 枚举的class + * @param code 枚举的编码 + * @param 枚举的类型 + * @return 找不到code 则返回为空 + */ + public static > String getDescription(final Class clazz, final Object code) { + BaseEnum baseEnum = getEnum(clazz, code); + if (baseEnum == null) { + return null; + } + return baseEnum.getDescription(); + } + + /** + * 根据一个枚举类型获取 枚举的描述 + * + * @param clazz 枚举的class + * @param code 枚举的编码 + * @param 枚举的类型 + * @return 找不到code 则返回为空 + */ + public static > T getEnum(final Class clazz, final Object code) { + return getEnumMap(clazz).get(code); + } + + /** + * 校验是否是一个有效的枚举 + * + * @param clazz 枚举的class + * @param code 枚举的编码 , null 也认为是一个有效的枚举 + * @param 枚举的类型 + * @return 是否有效 + */ + public static > boolean isValidEnum(final Class clazz, final Object code) { + return isValidEnum(clazz, code, true); + } + + /** + * 校验是否是一个有效的枚举 + * + * @param clazz 枚举的class + * @param code 枚举的编码,为空认为是一个无效的枚举 + * @param ignoreNull 是否忽略空的code + * @param 枚举的类型 + * @return 是否有效 + */ + public static > boolean isValidEnum(final Class clazz, final Object code, + final boolean ignoreNull) { + if (code == null) { + return ignoreNull; + } + return getEnumMap(clazz).containsKey(code); + } + + /** + * 获取一个枚举的code Enum的map + * + * @param clazz 枚举的class + * @param 枚举的类型 + * @return Map + */ + public static > Map getEnumMap(final Class clazz) { + String className = clazz.getName(); + Map> result = ENUM_CACHE.computeIfAbsent(className, value -> { + T[] baseEnums = clazz.getEnumConstants(); + return Arrays.stream(baseEnums) + .collect(Collectors.toMap(BaseEnum::getCode, Function.identity())); + }); + return (Map)result; + } +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyOptionalUtils.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyOptionalUtils.java new file mode 100644 index 000000000..0f669c408 --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyOptionalUtils.java @@ -0,0 +1,39 @@ +package com.alibaba.easytools.common.util; + +import java.util.Optional; +import java.util.function.Function; + +/** + * Optional的工具类 + * + * @author Jiaju Zhuang + */ +public class EasyOptionalUtils { + + /** + * 将一个可能未null 的对象 获取其值 + * + * @param source 原始对象 + * @param function 转换方法 + * @param + * @param + * @return 返回值 为空则返回nulll + */ + public static R mapTo(T source, Function function) { + return mapTo(source, function, null); + } + + /** + * 将一个可能未null 的对象 获取其值 + * + * @param source 原始对象 + * @param function 转换方法 + * @param defaultValue 默认值 + * @param + * @param + * @return 返回值 + */ + public static R mapTo(T source, Function function, R defaultValue) { + return Optional.ofNullable(source).map(function).orElse(defaultValue); + } +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyReflectUtils.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyReflectUtils.java new file mode 100644 index 000000000..0ed044a7a --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyReflectUtils.java @@ -0,0 +1,38 @@ +package com.alibaba.easytools.common.util; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import lombok.extern.slf4j.Slf4j; + +/** + * 反射工具类 + * + * @author Jiaju Zhuang + */ +@Slf4j +public class EasyReflectUtils { + + /** + * 获取一个类的父类的泛型类型,如果没有 则获取父类的父类 + * + * @return + */ + public static Class superParameterizedType(Class clazz) { + Type type = clazz.getGenericSuperclass(); + // 获取父类的 + if (type instanceof Class) { + type = ((Class)type).getGenericSuperclass(); + } + // 获取父类的父类 + if (type instanceof Class) { + type = ((Class)type).getGenericSuperclass(); + } + + // 不管父类的父类是不是 强制转 如果不是这里会报错 + ParameterizedType parameterizedType = (ParameterizedType)type; + // 直接拿第一个强制转换 + return (Class)parameterizedType.getActualTypeArguments()[0]; + } + +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyStringUtils.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyStringUtils.java new file mode 100644 index 000000000..21add78f9 --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/EasyStringUtils.java @@ -0,0 +1,154 @@ +package com.alibaba.easytools.common.util; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.StringUtils; + +/** + * String工具类 + * + * @author Jiaju Zhuang + */ +public class EasyStringUtils { + /** + * 0的字符 + */ + private static final char ZERO_CHAR = '0'; + + /** + * 去掉工号前面的0 + * + * @param userId 工号 + * @return 修改后的工号 + */ + public static String cutUserId(String userId) { + if (!org.apache.commons.lang3.StringUtils.isNumeric(userId)) { + return userId; + } + int startIndex = 0; + for (int i = 0; i < userId.length(); i++) { + char c = userId.charAt(i); + // 查询第一个不是0的位置 + if (ZERO_CHAR == c) { + startIndex = i + 1; + } else { + break; + } + } + // 可能整个账号都是0 + if (startIndex == userId.length()) { + return "0"; + } + return userId.substring(startIndex); + } + + /** + * 去除花名后面的工号 + * + * @param name 姓名或者花名 + * @return 去除工号后的姓名或者花名 + */ + public static String cutName(String name, String workNo) { + if (StringUtils.isBlank(workNo) || StringUtils.isBlank(name)) { + return name; + } + // 这里可能会出现 0结的情况 + String cutName = RegExUtils.removeFirst(name, workNo); + int lastIndex = cutName.length(); + for (int i = cutName.length() - 1; i >= 0; i--) { + char c = cutName.charAt(i); + // 查询第最后一个不是0的位置 + if (ZERO_CHAR == c) { + lastIndex = i; + } else { + break; + } + } + return cutName.substring(0, lastIndex); + } + + /** + * 增加工号前面的0 + * + * @param userId 工号 + * @return 修改后的工号 + */ + public static String padUserId(String userId) { + if (!StringUtils.isNumeric(userId)) { + return userId; + } + return StringUtils.leftPad(userId, 6, '0'); + } + + /** + * 构建展示的名称 + * + * @param name 姓名 + * @param nickName 花名 + * @return 展示名称 姓名(花名) + */ + public static String buildShowName(String name, String nickName) { + StringBuilder showName = new StringBuilder(); + if (StringUtils.isNotBlank(name)) { + showName.append(name); + } + if (StringUtils.isNotBlank(nickName)) { + showName.append("("); + showName.append(nickName); + showName.append(")"); + } + return showName.toString(); + } + + /** + * 将多个字符串 拼接在一起 + * + * @param delimiter 分隔符 不能为空 + * @param elements 字符串 可以为空 会忽略空的字符串 + * @return + */ + public static String join(CharSequence delimiter, CharSequence... elements) { + if (elements == null) { + return null; + } + List charSequenceList = Arrays.stream(elements).filter( + org.apache.commons.lang3.StringUtils::isNotBlank).collect(Collectors.toList()); + if (charSequenceList.isEmpty()) { + return null; + } + return String.join(delimiter, charSequenceList); + } + + /** + * 限制一个string字符串的长度 ,超过长度 会用... 替换 + * + * @param str 字符串 + * @param length 限制长度 + * @return + */ + public static String limitString(String str, int length) { + if (Objects.isNull(str)) { + return null; + } + String limitString = StringUtils.substring(str, 0, length); + if (limitString.length() == length) { + limitString += "..."; + } + return limitString; + } + + /** + * 根据冒号拼接在一起 + * + * @param objs 对象 + * @return 拼接完成的数据 + */ + public static String joinWithColon(Object... objs) { + return StringUtils.join(objs, ":"); + } + +} diff --git a/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/function/Executor.java b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/function/Executor.java new file mode 100644 index 000000000..d74a37d9e --- /dev/null +++ b/easyexcel-test/easytools-common/src/main/java/com/alibaba/easytools/common/util/function/Executor.java @@ -0,0 +1,13 @@ +package com.alibaba.easytools.common.util.function; + +/** + * 没有入参 出参的function + */ +@FunctionalInterface +public interface Executor { + + /** + * 执行 + */ + void execute(); +} diff --git a/easyexcel-test/easytools/pom.xml b/easyexcel-test/easytools/pom.xml new file mode 100644 index 000000000..acaf01055 --- /dev/null +++ b/easyexcel-test/easytools/pom.xml @@ -0,0 +1,23 @@ + + + + com.alibaba.easytools + easytools-parent + ${revision} + ../pom.xml + + 4.0.0 + easytools + + + + + com.alibaba.easytools + easytools-common + + + + + \ No newline at end of file diff --git a/easyexcel-test/lombok.config b/easyexcel-test/lombok.config new file mode 100644 index 000000000..f6394b21c --- /dev/null +++ b/easyexcel-test/lombok.config @@ -0,0 +1,4 @@ +# 转换toString 调用上一层 +lombok.toString.callSuper = CALL +# 全局配置 equalsAndHashCode 的 callSuper 属性为true +lombok.equalsAndHashCode.callSuper=call \ No newline at end of file diff --git a/easyexcel-test/pom.xml b/easyexcel-test/pom.xml index 8c540b22e..699e65146 100644 --- a/easyexcel-test/pom.xml +++ b/easyexcel-test/pom.xml @@ -1,82 +1,427 @@ - - - 4.0.0 + - com.alibaba - easyexcel-parent - ${revision} - ../pom.xml + com.taobao + parent + 2.0.0 - https://github.com/alibaba/easyexcel - jar - easyexcel-test - easyexcel-test + 4.0.0 + com.alibaba.easytools + easytools-parent + pom + ${revision} + easytools-parent - true + + 1.1.11-SNAPSHOT + 1.8 + 1.8 + 1.8 + UTF-8 + UTF-8 + 2.7.11 + 2023-03-release + 1.18.22 - - - - com.alibaba - easyexcel-core - - - com.alibaba.fastjson2 - fastjson2 - 2.0.51 - - - org.springframework.boot - spring-boot-starter-web - 2.7.18 - - - org.springframework.boot - spring-boot-starter-test - 2.7.18 - - - - - org.slf4j - slf4j-simple - 1.7.36 - - - org.slf4j - jcl-over-slf4j - 1.7.36 - - - org.slf4j - log4j-over-slf4j - 1.7.36 - - - ch.qos.logback - logback-classic - 1.5.6 - - + + easytools + easytools-spring-boot-autoconfigure + easytools-spring-boot-starter + easytools-base + easytools-common + easytools-log + easytools-spring-demo + easytools-spring + easytools-test + + + + + + + com.alibaba.easytools + easytools-base + ${revision} + + + com.alibaba.easytools + easytools-common + ${revision} + + + com.alibaba.easytools + easytools-log + ${revision} + + + com.alibaba.easytools + easytools-log-core + ${revision} + + + com.alibaba.easytools + easytools-log-spring-boot-autoconfigure + ${revision} + + + com.alibaba.middleware + eagleeye-core-sdk + 1.9.5--2021-11-release + + + com.alibaba.easytools + easytools-log-spring-boot-starter + ${revision} + + + com.alibaba.easytools + easytools-spring-core + ${revision} + + + com.alibaba.easytools + easytools-spring-spring-boot-autoconfigure + ${revision} + + + com.alibaba.easytools + easytools-spring-boot-autoconfigure + ${revision} + + + com.alibaba.easytools + easytools-spring-boot-starter + ${revision} + + + com.alibaba.easytools + easytools-spring-demo + ${revision} + + + + + org.zalando + logbook-spring-boot-starter + 3.7.2 + + + + org.zalando + logbook-servlet + 3.7.2 + javax + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + com.taobao.pandora + pandora-boot-starter-bom + ${pandora-boot.version} + pom + import + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + com.alibaba.schedulerx + schedulerx2-spring-boot-starter + 1.2.4.3 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.apache.commons + commons-collections4 + 4.4 + + + org.slf4j + slf4j-api + 1.7.26 + + + org.projectlombok + lombok + ${lombok.version} + + + com.alibaba + fastjson + 1.2.83 + + + + com.alibaba.middleware + tddl-client-sdk + 5.2.12--2021-07-release + + + + com.h2database + h2 + 1.4.200 + + + com.baomidou + mybatis-plus-boot-starter + 3.4.2 + + + + cn.hutool + hutool-all + 5.7.20 + + + com.google.guava + guava + 30.1-jre + + + + + com.aliyun.oss + aliyun-sdk-oss + 3.14.0 + + + com.aliyun + aliyun-java-sdk-imm + 1.23.4 + + + com.aliyun + aliyun-java-sdk-core + 4.5.25 + + + org.jsoup + jsoup + 1.13.1 + + + + + com.alibaba.middleware + hsf-sdk + 3.1.1.5-SINK--2022-02-release + + + + + aspectjweaver + org.aspectj + 1.9.6 + + + + com.alibaba.fastvalidator + fastvalidator-constraints + 2.6.2.5 + + + com.alibaba.fastvalidator + fastvalidator-generator + 2.6.2.5 + + + + javax.validation + validation-api + 1.1.0.Final + + + + + org.mapstruct + mapstruct + 1.5.2.Final + + + org.mapstruct + mapstruct-processor + 1.5.2.Final + + + + + com.aliyun.opensearch + aliyun-sdk-opensearch + 3.3.0 + + + org.apache.httpcomponents + httpclient + + + org.slf4j + slf4j-nop + + + + + com.taobao.aliauto + open-search-spring-starter + 1.2.4 + + + + com.alibaba.grow + grow-client-api + 1.0.2 + + + com.alibaba.easytools + easy-base + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + org.redisson + redisson-spring-boot-starter + 3.27.2 + + + + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + + + + + com.squareup.okhttp3 + okhttp + 4.12.0 + + + com.squareup.okhttp3 + okhttp-sse + 4.12.0 + + + + + com.dtflys.forest + forest-spring-boot-starter + 1.5.36 + + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + true + + + + compile + + jar + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.2.7 + + true + oss + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + org.apache.maven.plugins maven-surefire-plugin + 2.22.2 - /com/alibaba/easyexcel/test/core/**/*.java + /com/alibaba/easytools/test/**/*.java - false + true + + + + + + + + + + + + + + + + + + + +