package com.hzs.bonus.achieve.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.bonus.achieve.param.MemberAchieveParam;
import com.hzs.bonus.bonus.param.BonusParam;
import com.hzs.common.domain.member.achieve.CuMemberAchieve;
import com.hzs.common.domain.member.achieve.ext.CuMemberAchieveExt;
import com.hzs.bonus.achieve.param.MonthAchieveParam;
import com.hzs.bonus.achieve.vo.CuMemberAwardsUnderVO;
import com.hzs.bonus.achieve.vo.CuMemberMonthAchieveContrastVO;
import com.hzs.bonus.achieve.vo.CuMemberNewAddAchieveVO;
import com.hzs.common.domain.member.ext.CuMemberSettleCountryExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 会员业绩记录 Mapper 接口
 * </p>
 *
 * @author hzs
 * @since 2022-10-26
 */
public interface CuMemberAchieveMapper extends BaseMapper<CuMemberAchieve> {

    /**
     * 创建会员网体记录表
     *
     * @param tableName 日期
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 11:44
     */
    void createCuMemberAchieveTable(String tableName);

    /**
     * 创建每年的会员考核表
     *
     * @param tableName 表名
     * @return: void
     * @Author: sui q
     * @Date: 2022/11/7 14:10
     */
    void createCuMemberMonthTable(String tableName);

    /*
     * @description:更新会员业绩表 每月月统计报表
     * @author: sui q
     * @date: 2023/8/29 10:57
     * @param: null null
     **/
    void mergeCuMemberMonth(@Param("date") String date, @Param("period") Integer period);

    /**
     * 将结算日表的值插入到结算月表中
     *
     * @param targetTableName 目标表 网体月表
     * @param sourceTableName 来源表 结算日表
     * @param period          期间
     * @return: void2
     * @Author: sui q
     * @Date: 2023/2/16 11:35
     */
    void insertCuMemberAchieveBySettleDate(@Param("targetTableName") String targetTableName,
                                           @Param("sourceTableName") String sourceTableName, @Param("period") Integer period);

    /**
     * 将结算日表的值插入到结算月表中
     *
     * @param targetTableName 目标表 网体月表
     * @param sourceTableName 来源表 结算日表
     * @param period          期间
     * @return: void
     * @Author: sui q
     * @Date: 2023/2/16 11:35
     */
    void mergeCuMemberAchieveBySettleDate(@Param("targetTableName") String targetTableName,
                                          @Param("sourceTableName") String sourceTableName, @Param("period") Integer period);

    /**
     * 将昨天日表数据插入今天日表中, 昨日日表更新今天日表网体表
     * 根据昨天结算表数据更新今天结算表的业绩数据
     *
     * @param sourceTable 来源表，记录10天跟月表一摸一样的滚动表数据
     * @param targetTable 目标表 记录10天跟月表一摸一样的滚动表数据
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 16:26
     */
    void updateCuMemberSettleAchieveByBeforeDay(@Param("sourceTable") String sourceTable, @Param("targetTable") String targetTable,
                                                @Param("flag") Integer flag);

    /**
     * 将昨天日表数据插入今天日表中, 昨日日表更新今天日表网体表
     * 根据昨天结算表数据更新今天结算表的业绩数据
     *
     * @param sourceTable 来源表，记录10天跟月表一摸一样的滚动表数据
     * @param targetTable 目标表 记录10天跟月表一摸一样的滚动表数据
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 16:26
     */
    void updateCuMemberSettleAchieveDetailByBeforeDay(@Param("sourceTable") String sourceTable, @Param("targetTable") String targetTable,
                                                      @Param("flag") Integer flag);

    /**
     * 将昨天日表数据插入今天日表中, 昨日日表更新今天日表网体表
     * 根据昨天结算表数据更新今天结算表的业绩数据
     *
     * @param sourceTable 来源表，记录10天跟月表一摸一样的滚动表数据
     * @param targetTable 目标表 记录10天跟月表一摸一样的滚动表数据
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 16:26
     */
    void updateCuMemberSettleCountryDetailByBeforeDay(@Param("sourceTable") String sourceTable, @Param("targetTable") String targetTable);

    /*
     * @description: 根据期间更新会员表复消剩余收益次数  复消剩余收益奖金
     * @author: sui q
     * @date: 2023/11/2 16:15
     * @param: null null
     **/
    void mergeBackCuMemberReSaleDate(@Param("targetTable") String targetTable, @Param("period") Integer period);

    /*
     * @description: 更新为最初始的数据，新增的为0，历史的通过昨天进行更新
     * @author: sui q
     * @date: 2023/8/11 14:57
     * @param: null null
     **/
    void updateCuMemberSettleInitAchieve(String targetTable);

    /*
     * @description: 更新为最初始的数据，新增的为0，历史的通过昨天进行更新
     * @author: sui q
     * @date: 2023/8/11 14:57
     * @param: null null
     **/
    void updateCuMemberSettleDetailInitAchieve(String targetTable);

    /*
     * @description: 更新为最初始的数据，新增的为0，历史的通过昨天进行更新
     * @author: sui q
     * @date: 2023/8/11 14:57
     * @param: null null
     **/
    void updateCuMemberCountryDetailInitAchieve(String targetTable);

    /**
     * 根据特殊业务更新业绩
     *
     * @param targetTable 结算表
     * @param period      期间
     * @param pkId        主键
     * @return: void
     * @Author: sui q
     * @Date: 2023/3/11 13:42
     */
    void updateCuMemberSettleAchieveBySpecialBus(@Param("targetTable") String targetTable, @Param("period") Integer period,
                                                 @Param("pkId") Long pkId);

    /**
     * 根据每日日业绩开始更新会员业绩 新增业绩、累计业绩
     *
     * @param memberAchieveParamList 会员业绩
     * @param tableName              更新的表，结算日的日表
     * @return: Boolean
     * @Author: sui q
     * @Date: 2022/11/2 11:30
     */
    Boolean updateCuMemberBackOldAchieveEveryDay(@Param("memberAchieveParamList") List<?> memberAchieveParamList,
                                                 @Param("tableName") String tableName ,@Param("settleTableNameDetail") String settleTableNameDetail);

    /*
     * @description: 退单回退业绩
     * @author: sui q
     * @date: 2023/9/22 9:27
     * @param: null null
     **/
    void chargeBackSaOrder(@Param("targetTable") String targetTable, @Param("sourceTable") String sourceTable,
                           @Param("period") Integer period, @Param("achieve") MemberAchieveParam memberAchieveParam);

    /**
     * 根据每日日业绩开始更新会员业绩 新增业绩、累计业绩
     *
     * @param memberAchieveParamList 会员业绩
     * @param tableName              更新的表，结算日的日表
     * @return: Boolean
     * @Author: sui q
     * @Date: 2022/11/2 11:30
     */
    void updateCuMemberBackAchieveEveryDay(@Param("memberAchieveParamList") List<?> memberAchieveParamList, @Param("settleTableNameDetail") String settleTableNameDetail,
                                           @Param("tableName") String tableName);

    /*
     * @description: 更新累计血缘业绩
     * @author: sui q
     * @date: 2023/10/10 15:16
     * @param: null null
     **/
    void updateCuMemberBloodAchieveEveryDate(@Param("memberAchieveParamList") List<?> memberAchieveParamList,
                                             @Param("tableName") String tableName);

    /*
     * @description: 查询会员公司来源业绩
     * @author: sui q
     * @date: 2024/1/18 20:52
     * @param: null null
     **/
    List<CuMemberSettleCountryExt> queryCuMemberSettleCountry(@Param("settleCountryTable")String settleCountryTable, @Param("bonusParam") BonusParam bonusParam);
}
