package cn.iocoder.yudao.framework.mybatis.core.service;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;

import java.util.Collection;
import java.util.List;

/**
 * 功能描述: IService 层 基础接口，其他 Service 接口 请继承该接口
 * <p>
 * 作者:
 * 日期: 2022-09-16 18:57
 * @author Administrator
 */
public interface IService<T> extends com.baomidou.mybatisplus.extension.service.IService<T> {
    /***
     * 分页查询
     * @param vo
     * @param object
     * @return
     */
    PageResult<T> selectPage(PageVO vo, Object object);

    /***
     * 分页查询
     * @param vo
     * @param queryWrapper
     * @return
     */
    PageResult<T> selectPage(PageVO vo, Wrapper<T> queryWrapper);

    /***
     * 分页查询
     * @param pageParam
     * @param queryWrapper
     * @return
     */
    PageResult<T> selectPage(PageParam pageParam, Wrapper<T> queryWrapper);

    /***
     * 根据字段名查询
     * @param field
     * @param value
     * @return
     */
    T selectOne(String field, Object value);

    /***
     * 根据字段名查询
     * @param queryWrapper
     * @return
     */
    T selectOne(Wrapper<T> queryWrapper);

    /***
     * 根据字段名查询
     * @param field
     * @param value
     * @return
     */
    T selectOne(SFunction<T, ?> field, Object value);

    /***
     * 根据字段名查询
     * @param field1
     * @param value1
     * @param field2
     * @param value2
     * @return
     */
    T selectOne(String field1, Object value1, String field2, Object value2);

    /***
     * 根据字段名查询
     * @param field1
     * @param value1
     * @param field2
     * @param value2
     * @return
     */
    T selectOne(SFunction<T, ?> field1, Object value1, SFunction<T, ?> field2, Object value2);

    /***
     * 查询记录数
     * @return
     */
    Long selectCount();

    /***
     * 查询列表
     * @param queryWrapper
     * @return
     */
    Long selectCount(Wrapper<T> queryWrapper);

    /***
     * 查询记录数
     * @param field
     * @param value
     * @return
     */
    Long selectCount(String field, Object value);

    /***
     * 查询记录数
     * @param field
     * @param value
     * @return
     */
    Long selectCount(SFunction<T, ?> field, Object value);

    /***
     * 查询列表
     * @return
     */
    List<T> selectList();


    /***
     * 查询列表
     * @param queryWrapper
     * @return
     */
    List<T> selectList(Wrapper<T> queryWrapper);

    /***
     * 查询列表
     * @param object
     * @return
     */
    List<T> selectList(Object object);

    /***
     * 查询列表
     * @param field
     * @param value
     * @return
     */
    List<T> selectList(String field, Object value);

    /***
     * 查询列表
     * @param field
     * @param value
     * @return
     */
    List<T> selectList(SFunction<T, ?> field, Object value);

    /****
     * 查询列表
     * @param field
     * @param values
     * @return
     */
    List<T> selectList(String field, Collection<?> values);

    /***
     * 查询列表
     * @param field
     * @param values
     * @return
     */
    List<T> selectList(SFunction<T, ?> field, Collection<?> values);

    /***
     * 批量插入
     * @param entities
     */
    void insertBatch(Collection<T> entities);

    /***
     * 批量更新
     * @param update
     */
    void updateBatch(T update);

    /***
     * 批量更新
     * @param entities
     */
    void updateBatch(Collection<T> entities);

    /***
     * 分页查询
     * @param form
     * @param object
     * @return
     */
    PageResult<T> pager(PageVO form, Object object);

    /***
     * 分页查询
     * @param form
     * @param object
     * @return
     */
    List<T> pagerList(PageVO form, Object object);

    /***
     * 处理分页查询参数
     * @param object
     */
    void beforeHandler(Object object);

    /***
     * 处理分页查询参数
     * @param list
     */
    void afterHandler(List<T> list);
}
