package com.hzs.bonus.achieve.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.CuMemberTree;
import com.hzs.common.domain.member.achieve.ext.CuMemberAchieveExt;
import com.hzs.common.domain.member.ext.CuMemberSettleExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.bonus.achieve.param.MemberAchieveParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 会员网体历史记录 服务类
 */
public interface ICuMemberTreeService extends IService<CuMemberTree> {

    /**
     * 创建会员网体记录表，每天凌晨12点初始化昨天数据
     *
     * @param date 结算日期，初始化哪天的值 格式是 yyyyMM
     * @return: void
     */
    void createCuMemberTree(String date);

    /**
     * 每月初，初始化考核数据，根据月底网体数据，先进行奖金计算在进行考核，考核在计算奖金之后
     *
     * @param settleDate 结算日期
     * @return: void
     */
    void initCuMemberAssessData(String settleDate);

    /**
     * 初始用来结算奖金的表，
     *
     * @param yesterdaySettleTableName 昨天的结算表
     * @param currentSettleTableName   结算日的结算表
     * @return: void
     */
    void initCuMemberTreeTable(String yesterdaySettleTableName, String currentSettleTableName);

    /**
     * 初始用来结算奖金的表，多次重算奖金，只更新结余
     *
     * @param yesterdaySettleTableName 昨天的结算表
     * @param currentSettleTableName   结算日的结算表
     * @return: void
     */
    void initCuMemberExpandTreeTable(String yesterdaySettleTableName, String currentSettleTableName);

    /**
     * 重新结算会员网体
     *
     * @param currentSettleTableName 结算日的表名
     * @return: void
     */
    void updateCuMemberSettle(Map<Long, MemberAchieveParam> cuMemberAchieveHashMap, String currentSettleTableName);

    /**
     * 重新结算会员网体业绩
     *
     * @param currentSettleTableName 更新甩网业绩
     * @return: void
     */
    void updateCuMemberNetAchieve(List<CuMemberAchieveExt> updMemberAchieveExtList, String currentSettleTableName);

    /**
     * 重新结算会员网体
     *
     * @param currentSettleTableName 结算日的表名
     * @return: void
     */
    void updateCuMemberBackSettle(Map<Long, MemberAchieveParam> cuMemberAchieveHashMap, String currentSettleTableName);

    /**
     * 更新会员网体，将会员网体改为死点，检查网体是否有问题
     *
     * @param revokeRegSaOrderList 注册撤销订单
     * @param revokeUpdSaOrderList 升级撤销订单
     * @param settleDate           计算日期
     * @param settleTableName      结算表名
     * @return: void
     */
    void updateCuMemberTreeByCancelOrder(List<SaOrderExt> revokeRegSaOrderList, List<SaOrderExt> revokeUpdSaOrderList,
                                         String settleDate, String settleTableName);

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

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

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

    /**
     * 将结算日表的值插入到结算月表中
     *
     * @param settleDate      结算日期
     * @param settleTableName 结算日表
     * @param period          期间
     * @return: void
     */
    void insertCuMemberTreeBySettleDate(String settleDate, String settleTableName, Integer period);

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

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

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

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

    /**
     * 更新会员网体奖衔数据，更新月表、结算表
     *
     * @param periodList 期间
     */
    void updateCuMemberSettleByPeriod(List<Integer> periodList);

    /**
     * 根据订单，查询出网体中记录的会员数据，推荐人、安置人
     *
     * @param settleTableName 结算表
     * @param saOrderExtList  订单
     * @return: List<CuMemberSettleExt>
     */
    List<CuMemberSettleExt> batchQueryMemberSettleBySaOrder(String settleTableName, List<SaOrderExt> saOrderExtList);

    /**
     * 根据订单，查询出网体中记录的会员数据，推荐人、安置人
     *
     * @param settleTableName  结算表
     * @param serviceMemberSet 会员编号
     * @return: List<CuMemberSettleExt>
     */
    List<CuMemberSettleExt> batchQueryMemberSettleByMemberPk(String settleTableName, Set<Long> serviceMemberSet);

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

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

    /**
     * 批量根据订单信息查询会员结算表中的父级安置数据
     *
     * @param settleTableName      结算表
     * @param period
     * @param firPurchaseOrderList 首单列表
     */
    Map<Long, List<CuMemberSettleExt>> batchQueryCuMemberSettlePlaceParent(String settleTableName, Integer period, List<SaOrderExt> firPurchaseOrderList);

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

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

    /**
     * 批量根据量奖信息查询会员结算表中的父级血缘数据
     *
     * @param settleTableName 结算表
     * @param expandMemberSet 有量奖的会员
     * @return: Map<Long, CuMemberSettleExt> 主键，通过推荐人向上找父级
     */
    List<CuMemberSettleExt> batchQuerySpecialCuMemberSettleParent(String settleTableName, Set<Long> expandMemberSet);

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

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName 结算日期
     * @param cuMemberTreeMap 树
     * @return: void
     */
    void updateCuMemberSettle(String settleTableName, Map<Long, CuMemberSettleExt> cuMemberTreeMap);

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName 结算日期
     * @param cuMemberTreeMap 树
     * @return: void
     */
    void updateCuMemberExpandSettle(String settleTableName, Map<Long, CuMemberSettleExt> cuMemberTreeMap);

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName 结算日期
     * @param cuMemberTreeMap 树
     * @return: void
     */
    void updateCuMemberSecond(String settleTableName, Map<Long, CuMemberSettleExt> cuMemberTreeMap);

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


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

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

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

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

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

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

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

    /**
     * 更新会员网体等级数据，更新结算表
     *
     * @param periodList 期间
     */
    void updateCuMemberSettleGradeByPeriod(List<Integer> periodList);

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

}
