package com.ecep.contract;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.fasterxml.jackson.databind.JsonNode;

/**
 * 查询服务接口，提供通用的分页查询能力
 * 泛型Vo表示查询结果的数据类型, View Object 类，可序列化，可持久的类
 */
public interface QueryService<Vo> {
    /**
     * 根据ID查询单条数据
     * @param id
     * @return 符合ID的Vo对象，若不存在则返回null
     */
    Vo findById(Integer id);

    /**
     * 根据查询参数和分页条件获取数据列表
     *
     * @param paramsNode JSON格式的查询参数节点，包含各种过滤条件
     * @param pageable   分页参数，包含页码、每页条数、排序规则等信息
     * @return 分页查询结果，包含符合条件的数据列表和分页元数据
     */
    Page<Vo> findAll(JsonNode paramsNode, Pageable pageable);

    /**
     * 根据查询参数统计符合条件的数据总数
     * @param paramsNode JSON格式的查询参数节点，包含各种过滤条件
     * @return 符合条件的数据总数
     */
    default long count(JsonNode paramsNode) {
        return 0;
    }
}