package com.hzs.bonus.achieve.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.achieve.CuMemberTree;
import com.hzs.common.domain.member.ext.CuMemberSettleExt;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 会员网体历史记录 Mapper 接口
 */
public interface CuMemberTreeMapper extends BaseMapper<CuMemberTree> {

    /**
     * 创建会员网体记录表
     *
     * @param tableName 日期
     */
    void createCuMemberTreeTable(String tableName);

    /**
     * 创建会员网体结算记录表（按照日记录，每天一条，记录30天的）
     *
     * @param tableName 日期
     */
    void createCuMemberSettleTable(String tableName);

    /*
     *  创建会员网体复购极差结算表
     **/
    void createCuMemberRetailRangeTable(String tableName);

    /*
     *  创建极差秒结算表
     **/
    void createCuMemberRetailRangeSecondTable(String tableName);

    /**
     * 创建会员网体推荐人索引
     *
     * @param tableName 日期
     */
    void createCuMemberTreeParentIndex(String tableName);

    /**
     * 创建会员网体安置人索引
     *
     * @param tableName 日期
     */
    void createCuMemberTreePlaceIndex(String tableName);

    /**
     * 创建会员网体推荐人索引
     *
     * @param tableName 日期
     */
    void createCuMemberTableUniqueIndex(String tableName);

    /**
     * 创建表的序列
     *
     * @param tableName    表名
     * @param tableNameSeq 序列名
     */
    void createCuMemberTableSequence(@Param("tableName") String tableName, @Param("tableNameSeq") String tableNameSeq);

    /**
     * 创建会员网体推荐人索引
     *
     * @param tableName 日期
     */
    void createCuMemberTreeDayOnlyIndex(String tableName);

    /**
     * 删除日表数据
     *
     * @param tableName 表名
     */
    void truncateCuMemberTreeTable(@Param("tableName") String tableName);

    /**
     * 将会员表数据插入结算日表中
     *
     * @param settleTableName 结算表名
     */
    void insertCuMemberRetailRangeByMember(@Param("settleTableName") String settleTableName);

    /**
     * 判断是否存在临时表
     *
     * @param tableName 表名
     */
    Integer queryExistOracleTable(String tableName);

    /**
     * 查询表数量
     */
    Integer queryExistOrderTableCount(String tableName);

    /*
     *  回退会员奖衔
     **/
    void updateBackCuMemberRetailRangeAward(@Param("rangeTableName") String rangeTableName, @Param("period") Integer period,
                                            @Param("awardType") Integer awardType);

    /*
     *  回退会员奖衔
     **/
    void updateCuMemberRetailRangeAwardByDate(@Param("rangeTableName") String rangeTableName, @Param("settleDate") Date settleDate,
                                              @Param("awardType") Integer awardType);

    /**
     * 初始化期间奖衔
     */
    void updateCuMemberRetailRangeInitAward(@Param("rangeTableName") String rangeTableName);

    /**
     * 初始化期间V5奖衔
     */
    void updateCuMemberRetailRangeInitV5Award(@Param("rangeTableName") String rangeTableName);

    /**
     * 根据订单，查询出网体中记录的会员数据，推荐人、安置人
     *
     * @param settleTableName 结算表
     * @param memberPkList    需要查询的会员列表
     */
    List<CuMemberSettleExt> queryMemberSettleBySaOrder(@Param("settleTableName") String settleTableName,
                                                       @Param("memberPkList") List<?> memberPkList);

    /**
     * 根据订单，查询出网体中记录的会员数据及推荐人
     *
     * @param settleTableName  结算表
     * @param serviceMemberSet 会员编号
     */
    List<CuMemberSettleExt> batchQueryMemberSettleParentByMemberPk(@Param("settleTableName") String settleTableName, @Param("memberPkList") List<?> serviceMemberSet);

    /**
     * 批量根据量奖信息查询会员结算表中的父级血缘数据
     *
     * @param settleTableName 结算表
     * @param pkMemberList    有量奖的会员列表
     */
    List<CuMemberSettleExt> batchQueryCuMemberSettleParent(@Param("settleTableName") String settleTableName,
                                                           @Param("pkMemberList") List<?> pkMemberList);

}
