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 日期
     * @return: void
     */
    void createCuMemberTreeTable(String tableName);

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

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

    /**
     * 删除会员结算表
     *
     * @param tableName 表明
     * @return: void
     */
    void dropCuMemberSettleTable(String tableName);

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

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

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

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

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

    /*
     * @description: 结算日表网体添加到网体月表中
     * @param: null null
     **/
    void mergeCuMemberTreeBySettleDate(@Param("targetTableName") String targetTableName,
                                       @Param("sourceTableName") String sourceTableName, @Param("period") Integer period);

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

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

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

    /*
     * @description: 查询表数量
     * @param: null null
     **/
    Integer queryExistOrderTableCount(String tableName);

    /**
     * 根据注册撤单数据将会员网体历史记录表的会员修改为死点
     *
     * @param saOrderExtList  撤单数据
     * @param settleTableName 结算表
     * @return: void
     */
    void updateCuMemberTreeByCancelOrder(@Param("saOrderExtList") List<?> saOrderExtList, @Param("settleTableName") String settleTableName);

    /**
     * 根据升级撤单数据将会员网体历史记录表的会员修改等级
     *
     * @param saOrderExtList  撤单数据
     * @param tomorrow        日期
     * @param settleTableName 结算表
     * @return: void
     */
    void updateCuMemberTreeGradeByCancelOrder(@Param("saOrderExtList") List<?> saOrderExtList, @Param("currentDate") Date tomorrow, @Param("settleTableName") String settleTableName);

    /**
     * 查询出符合下一奖衔足够业绩的会员
     *
     * @param settleTableName
     * @return
     */
    List<CuMemberSettleExt> queryCuMemberSettleEnoughAwardAchieve(String settleTableName);

    /**
     * 回退会员奖衔
     *
     * @param settleTableName
     * @param period
     */
    void updateBackCuMemberSettleAward(@Param("settleTableName") String settleTableName, @Param("period") Integer period);

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

    /*
     * @description: 查询所有有奖衔的会员
     * @param: null null
     **/
    List<CuMemberSettleExt> queryMemberSettleByAwards(@Param("settleTableName") String settleTableName, @Param("rangeTableName") String rangeTableName,
                                                      @Param("startPeriod") Integer startPeriod, @Param("endPeriod") Integer endPeriod);

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

    /**
     * 查询会员结算表，查询出结算表中会员伞下左右区满足等级
     *
     * @param settleTableName 结算表
     * @param awardsValue     验证等级对应的值
     * @param placeDept       部门
     * @param pkMember        会员
     * @return: List<CuMemberSettleExt>
     */
    Integer queryCuMemberSettlePlaceUnderUmbrella(@Param("settleTableName") String settleTableName,
                                                  @Param("awardsValue") Integer awardsValue,
                                                  @Param("placeDept") Integer placeDept,
                                                  @Param("pkMember") Long pkMember);

    /**
     * 查询会员结算表，查询出结算表中会员血缘关系满足等级
     *
     * @param settleTableName 结算表
     * @param pkMember        会员
     * @return: List<CuMemberSettleExt>
     */
    Integer queryCuMemberSettleBloodUnderUmbrella(@Param("settleTableName") String settleTableName,
                                                  @Param("awardsValue") Integer awardsValue,
                                                  @Param("placeDept") Integer placeDept,
                                                  @Param("pkMember") Long pkMember);

    /**
     * 批量根据订单信息查询会员结算表中的数据
     *
     * @param settleTableName      结算表
     * @param period               期间
     * @param firPurchaseOrderList 首单列表
     */
    List<CuMemberSettleExt> batchQueryCuMemberSettlePlaceParent(@Param("settleTableName") String settleTableName,
                                                                @Param("period") Integer period,
                                                                @Param("firPurchaseOrderList") List<?> firPurchaseOrderList);

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

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

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

    /**
     * 更新会员网体奖衔数据，更新月表、结算表
     *
     * @param updateTableName 更新表名
     */
    Integer updateCuMemberSettleByPeriod(@Param("updateTableName") String updateTableName, @Param("period") Integer period);

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName  结算表
     * @param cuMemberTreeList 树
     * @return: void
     */
    void updateCuMemberSettle(@Param("settleTableName") String settleTableName, @Param("cuMemberTreeList") List<?> cuMemberTreeList);

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName  结算表
     * @param cuMemberTreeList 树
     * @return: void
     */
    void updateCuMemberExpandSettle(@Param("settleTableName") String settleTableName, @Param("cuMemberTreeList") List<?> cuMemberTreeList);

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName  结算表
     * @param cuMemberTreeList 树
     * @return: void
     */
    void updateCuMemberSecond(@Param("settleTableName") String settleTableName, @Param("cuMemberTreeList") List<?> cuMemberTreeList);

    /**
     * 根据会员编号更新会员安置伞上秒结数据，新增或修改
     *
     * @param secondTableName  秒结表
     * @param settleTableName  结算表
     * @param pkMember         会员表
     * @param cuMemberTreeList 树
     * @param isPlace          是否安置关系
     * @return: void
     */
    void updateCuMemberSecondPlaceParent(@Param("secondTableName") String secondTableName, @Param("settleTableName") String settleTableName,
                                         @Param("pkMember") Long pkMember, @Param("cuMemberTreeList") List<?> cuMemberTreeList,
                                         @Param("isPlace") Integer isPlace);

    /**
     * 根据会员编号查询会员伞上安置人秒结数据
     *
     * @param secondTableName 秒接
     * @param pkMember        会员
     * @return: List<CuMemberSettleExt>
     */
    List<CuMemberSettleExt> queryCuMemberSecondPlaceParent(@Param("secondTableName") String secondTableName, @Param("pkMember") Long pkMember);

    /**
     * 根据会员编号查询会员伞上推荐人秒结数据
     *
     * @param secondTableName  秒接
     * @param cuMemberTreeList 推荐人
     * @return: List<CuMemberSettleExt>
     */
    List<CuMemberSettleExt> queryCuMemberSecondParent(@Param("secondTableName") String secondTableName, @Param("cuMemberTreeList") List<?> cuMemberTreeList);

    /**
     * 回退会员等级
     *
     * @param settleTableName
     * @param period
     */
    void updateBackCuMemberSettleGrade(@Param("settleTableName") String settleTableName, @Param("period") Integer period);

    /**
     * 更新会员网体等级数据，更新结算表
     *
     * @param updateTableName 更新表名
     */
    Integer updateCuMemberSettleGradeByPeriod(@Param("updateTableName") String updateTableName, @Param("period") Integer period);

    /**
     * 查询左右区足够可以升级的会员
     *
     * @param settleTableName
     * @param awardsValue
     * @return
     */
    List<CuMemberSettleExt> listUpgradeAwards(@Param("settleTableName") String settleTableName, @Param("awardsValue") Integer awardsValue);

    /**
     * 有奖衔的会员，本月左右区新増，上月最后一期左右区结余
     *
     * @param settleTableName          当天结算表
     * @param settleTableNameMonthLast 上月最后一天结算表
     * @param pkMemberList             查询奖衔会员
     * @return
     */
    List<CuMemberSettleExt> listMemberMonthAssess(@Param("settleTableName") String settleTableName,
                                                  @Param("settleTableNameMonthLast") String settleTableNameMonthLast,
                                                  @Param("pkMemberList") List<?> pkMemberList);

}
