All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.onetool4j.ddd.dto.PageDTO Maven / Gradle / Ivy

There is a newer version: 1.0.4
Show newest version
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