io.github.onetool4j.ddd.dto.PageDTO Maven / Gradle / Ivy
package io.github.onetool4j.ddd.dto;
import io.github.onetool4j.util.Reflections;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
* 标准分页对象
*
* @param `data`的类型
* @author admin
*/
public class PageDTO {
/**
* 序列化版本号
*/
private static final long serialVersionUID = 1L;
/**
* 分页对象缓存
*/
private final static Map, PageDTOClazzField> pagedto_clazz_cache = new ConcurrentHashMap<>();
/**
* 每页记录数
*/
int pageSize = 10;
/**
* 当前页码
*/
int currentPage = 1;
/**
* 总记录数
*/
int totalCnt = 0;
/**
* 数据
*/
List data;
/**
* 构造方法隐藏
*/
private PageDTO() {
}
/**
* 空分页对象
*
* @param pageSize 每页记录数
* @param 数据类型
* @return PageDTO
*/
public static PageDTO ofEmpty(int pageSize) {
return of(null, pageSize, 1, 0);
}
/**
* 空分页对象
*
* @param pageSize 每页记录数
* @param currentPage 当前页码
* @param 数据类型
* @return PageDTO
*/
public static PageDTO ofEmpty(int pageSize, int currentPage) {
return of(null, pageSize, currentPage, 0);
}
/**
* 空分页对象
*
* @param data 数据
* @param pageSize 每页记录数
* @param currentPage 当前页码
* @param totalCnt 总记录数
* @param 数据类型
* @return PageDTO
*/
public static PageDTO of(List data, int pageSize, int currentPage, int totalCnt) {
PageDTO pageDTO = new PageDTO<>();
pageDTO.pageSize = pageSize;
pageDTO.currentPage = currentPage;
pageDTO.data = data;
pageDTO.totalCnt = totalCnt;
return pageDTO;
}
/**
* 空分页对象
*
* @param query 分页查询对象
* @param 数据类型
* @return PageDTO
*/
public static PageDTO ofEmpty(PageQuery query) {
return of(null, query, 0);
}
/**
* 空分页对象
*
* @param query 分页查询对象
* @param totalCnt 总记录数
* @param 数据类型
* @return PageDTO
*/
public static PageDTO of(List data, PageQuery query, int totalCnt) {
PageDTO pageDTO = new PageDTO<>();
pageDTO.pageSize = query.getPageSize();
pageDTO.currentPage = query.getPageNum();
pageDTO.data = data;
pageDTO.totalCnt = totalCnt;
return pageDTO;
}
/**
* 复制分页对象复制并转换分页对象,
* 复制:用于将开源的一些PageDTO对象复制为当前这个PageDTO工具,比如将mybatis-plus的Page对象复制为当前PageDTO工具
*
* @param originPageDTO 原始分页对象
* @param 原始分页对象的Data类型
* @return 复制后的分页对象
*/
public static PageDTO copy(Object originPageDTO) {
PageDTOClazzField normalPageDTO = getNormalPageDTO(originPageDTO);
if (normalPageDTO == null) {
throw new IllegalArgumentException("不是标准分页对象XxxPageDTO(records,size,total,current)");
}
try {
return of((List) normalPageDTO.records.get(originPageDTO), Integer.parseInt(Objects.toString(normalPageDTO.pageSize.get(originPageDTO))), Integer.parseInt(Objects.toString(normalPageDTO.currentPage.get(originPageDTO))), Integer.parseInt(Objects.toString(normalPageDTO.totalCount.get(originPageDTO))));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 复制并转换分页对象,
* 复制:用于将开源的一些PageDTO对象复制为当前这个PageDTO工具,比如将mybatis-plus的Page对象复制为当前PageDTO
* 转化:将Data的类型转化为另外一种类型,比如将UserDTO转化为UserVO
*
* @param originPageDTO 原始分页对象
* @param convert 转换函数
* @param 原始分页对象的Data类型
* @param 转换后的分页对象的Data类型
* @return 复制并转换后的分页对象
*/
public static PageDTO copyAndConvert(Object originPageDTO, Function, List> convert) {
PageDTO copyPageDTO = copy(originPageDTO);
return of(convert.apply(copyPageDTO.getData()), copyPageDTO.getPageSize(), copyPageDTO.getCurrentPage(), copyPageDTO.getTotalCnt());
}
/**
* 复制并转换分页对象结构,有更多的分页对象类型可以在这个方法兼容
*
* @param originPageDTO 原始分页对象
* @return 通用的分页对象结构cache
*/
private static PageDTOClazzField getNormalPageDTO(Object originPageDTO) {
return pagedto_clazz_cache.computeIfAbsent(originPageDTO.getClass(), key -> {
PageDTOClazzField pageDTOClazzField = new PageDTOClazzField();
pageDTOClazzField.records = Reflections.getField(key, "records");
pageDTOClazzField.pageSize = Reflections.getField(key, "size");
pageDTOClazzField.totalCount = Reflections.getField(key, "total");
pageDTOClazzField.currentPage = Reflections.getField(key, "current");
assert pageDTOClazzField.isPageDTO();
pageDTOClazzField.records.setAccessible(true);
pageDTOClazzField.pageSize.setAccessible(true);
pageDTOClazzField.totalCount.setAccessible(true);
pageDTOClazzField.currentPage.setAccessible(true);
return pageDTOClazzField;
});
}
/**
* page size
*
* @return int
*/
public int getPageSize() {
return pageSize;
}
/**
* current page
*
* @return int
*/
public int getCurrentPage() {
return currentPage;
}
/**
* next page
*
* @return int
*/
public int getNextPage() {
return currentPage + 1;
}
/**
* previous page
*
* @return int
*/
public int getPreviousPage() {
return currentPage <= 1 ? 1 : currentPage - 1;
}
/**
* has next page
*
* @return data
*/
public List getData() {
return data;
}
/**
* total count
*
* @return int
*/
public int getTotalCnt() {
return totalCnt;
}
/**
* total pages
*
* @return int
*/
public int getTotalPages() {
return totalCnt / pageSize + 1;
}
/**
* 分页对象结构缓存
*/
static class PageDTOClazzField {
/**
* 数据
*/
Field records;
/**
* 总记录数
*/
Field totalCount;
/**
* 当前页码
*/
Field currentPage;
/**
* 每页记录数
*/
Field pageSize;
/**
* 构造方法隐藏
*/
PageDTOClazzField() {
}
/**
* 是否是标准分页对象
*
* @return boolean
*/
boolean isPageDTO() {
return records != null && totalCount != null && currentPage != null && pageSize != null;
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy