package com.hzs.bonus.detail.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.detail.CuMemberAssess;
import org.apache.ibatis.annotations.Param;

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

/**
 * 会员信息-会员考核记录 Mapper 接口
 */
public interface CuMemberAssessMapper extends BaseMapper<CuMemberAssess> {

    /*
     * 清空表数据
     **/
    void deleteCuMemberAssessByPeriod(@Param("tableName") String tableName, @Param("period") Integer period);

    /**
     * 初始化复购考核表数据，将结算表数据插入到考核表中
     *
     * @param tableName       更新表名
     * @param sourceTableName 来源表，用哪个表进行更新
     * @param period          期间
     * @param month           考核月份
     */
    Integer insertRepCuMemberAssess(@Param("tableName") String tableName, @Param("sourceTableName") String sourceTableName,
                                    @Param("period") Integer period, @Param("month") String month);

    /**
     * 初始化复购考核表数据，将结算表数据插入到考核表中
     *
     * @param tableName       更新表名
     * @param sourceTableName 来源表，用哪个表进行更新
     * @param period          期间
     * @param month           考核月份
     */
    Integer insertRepCuMemberRangeAssess(@Param("tableName") String tableName, @Param("sourceTableName") String sourceTableName,
                                         @Param("period") Integer period, @Param("month") String month);

    /**
     * 更新会员复购考核业绩
     *
     * @param tableName       结算表
     * @param beforeTableName 上个月的表
     * @param sourcePeriod    来源结算期
     * @param period          结算结算期间
     * @param assessType      考核类型  0=复购考核 1=分红考核
     */
    Integer updateAssessPeriodBeginByBeforeMonth(@Param("beforeTableName") String beforeTableName, @Param("tableName") String tableName,
                                                 @Param("sourcePeriod") Integer sourcePeriod,
                                                 @Param("period") Integer period, @Param("assessType") Integer assessType);

    /**
     * 更新会员复购考核、分红考核 当月结余，根据上月复购订单
     *
     * @param tableName     表名
     * @param period        期间
     * @param assessType    考核类型
     * @param startDate     开始时间
     * @param endDate       结束时间
     * @param orderTypeList 订单类型
     */
    Integer updateAssessPeriodAddBySaOrder(@Param("tableName") String tableName, @Param("period") Integer period,
                                           @Param("assessType") Integer assessType, @Param("startDate") Date startDate,
                                           @Param("endDate") Date endDate, @Param("orderTypeList") List<Integer> orderTypeList);

    /**
     * 更新免考通过的考核表
     * 更新会员考核表，根据免考的更新期末结余，更新结余跟其他的不一样，
     * 只更新一张表，复购跟分红可以一起更新，复购或分红只需要更新一次
     *
     * @param tableName 表名
     * @param period    期间
     */
    Integer updateAssessPeriodExemptBalanceByUsed(@Param("tableName") String tableName, @Param("period") Integer period);

    /**
     * 更新考核表，更新复购考核状态为免考，首次注册、首次晋升的会员
     *
     * @param tableName       需要更新的会员考核表名
     * @param settleTableName 每日结算表
     * @param period          期间
     * @param startDate       开始日期
     * @param endDate         结束日期
     */
    Integer updateAssessCuMemberToRepExempt(@Param("tableName") String tableName, @Param("settleTableName") String settleTableName,
                                            @Param("period") Integer period, @Param("startDate") Date startDate, @Param("endDate") Date endDate,
                                            @Param("startPeriod") Integer startPeriod, @Param("endPeriod") Integer endPeriod);

    /**
     * 更新考核表，更新复购考核状态为免考，首次注册、首次晋升的会员，更新结算网体
     *
     * @param settleTableName 每日结算表
     * @param startDate       开始日期
     * @param endDate         结束日期
     */
    Integer updateCuMemberSettleToRepExempt(@Param("settleTableName") String settleTableName, @Param("startDate") Date startDate,
                                            @Param("endDate") Date endDate, @Param("startPeriod") Integer startPeriod,
                                            @Param("endPeriod") Integer endPeriod);

    /**
     * 更新考核表，更新复购考核状态为免考，首次注册、首次晋升的会员，更新结算网体
     *
     * @param settleTableName 每日结算表
     */
    Integer updateAllCuMemberSettleToRepExempt(@Param("settleTableName") String settleTableName);

    /**
     * 更新考核通过的考核表
     * 更新会员考核表，根据使用值的更新期末结余，更新结余跟其他的不一样，
     * 只更新一张表，复购跟分红可以一起更新，复购或分红只需要更新一次
     *
     * @param tableName 表名
     * @param period    期间
     */
    Integer updateAssessPeriodCheckBalanceByUsed(@Param("tableName") String tableName, @Param("period") Integer period);
}
