package com.hzs.member.detail.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.detail.CuMemberAssess;
import com.hzs.common.domain.member.ext.CuMemberAssessExt;
import com.hzs.common.domain.member.ext.CuMemberSettleExt;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.member.detail.vo.CuMemberAssessVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * <p>
 * 会员信息-会员考核记录 Mapper 接口
 * </p>
 *
 * @author hzs
 * @since 2022-08-31
 */
public interface CuMemberAssessMapper extends BaseMapper<CuMemberAssess> {

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

    /**
     * 创建会员网体推荐人索引
     *
     * @param tableName 日期
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 13:32
     */
    void createCuMemberTableUniqueIndex(String tableName);

    /**
     * 创建表注释
     *
     * @param tableName 表名
     * @return: void
     * @Author: sui q
     * @Date: 2022/11/9 16:25
     */
    void createCuMemberAssessTableComment(String tableName);

    /**
     * 查询表中是否存在数据
     *
     * @param tableName 表名
     * @param period    期间
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/7 14:31
     */
    Integer queryCuMemberAssessCount(@Param("tableName") String tableName, @Param("period") Integer period);

    /*
     * @description: 清空表数据
     * @author: sui q
     * @date: 2023/5/25 10:45
     * @param: null null
     **/
    void deleteCuMemberAssessByPeriod(@Param("tableName") String tableName, @Param("period") Integer period);

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

    /**
     * 将撤单的数据插入临时表中，通过临时表进行批量更新
     *
     * @param cuMemberAssessesList 考核数据
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/9 14:30
     */
    Integer insertTmpCuMemberAssess(@Param("cuMemberAssessesList") List<CuMemberAssessExt> cuMemberAssessesList);

    /**
     * 更新会员复购考核业绩
     *
     * @param tableName       结算表
     * @param beforeTableName 上个月的表
     * @param sourcePeriod    来源结算期
     * @param period          结算结算期间
     * @param assessType      考核类型  0=复购考核 1=分红考核
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/7 17:55
     */
    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 订单类型
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/8 9:21
     */
    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    期间
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/8 10:32
     */
    Integer updateAssessPeriodExemptBalanceByUsed(@Param("tableName") String tableName, @Param("period") Integer period);

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

    /**
     * 更新考核表，更新复购考核状态为免考，首次注册、首次晋升的会员，更新结算网体
     *
     * @param settleTableName 每日结算表
     * @param period          期间
     * @param startDate       开始日期
     * @param endDate         结束日期
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/8 19:17
     */
    Integer updateCuMemberSettleToRepExempt(@Param("settleTableName") String settleTableName,
                                            @Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 更新考核表，更新分红考核状态为免考，根据上一期的考核数据
     *
     * @param tableName       需要更新的会员考核表名
     * @param settleTableName 每日结算表
     * @param period          期间
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/8 19:17
     */
    Integer updateAssessCuMemberToShareExempt(@Param("tableName") String tableName, @Param("settleTableName") String settleTableName,
                                              @Param("period") Integer period);

    /**
     * 根据临时表中的订单撤单数据进行回写数据
     *
     * @param tableName 表名
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/9 15:00
     */
    Integer updateAssessPeriodByRevokeOrder(@Param("tableName") String tableName);

    /**
     * 查询出考核表中某一期免考的会员
     *
     * @param tableName 表名
     * @param period    期间
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/9 9:09
     */
    List<CuMemberAssess> queryExemptAssessCuMember(@Param("tableName") String tableName, @Param("period") Integer period);

    /**
     * 查询期间满足会员考核的数据，需要回填明细
     *
     * @param tableName 表名
     * @param period    会员期间
     * @return: List<CuMemberAssess>
     * @Author: sui q
     * @Date: 2022/11/8 10:51
     */
    List<CuMemberAssess> queryEnoughCuMemberAssess(@Param("tableName") String tableName, @Param("period") Integer period);

    /**
     * 发生过撤单的数据，需要变更考核月新增，进行重新考核，撤单可以存在撤奖衔，需要查询目标金额
     *
     * @param tableName       表名
     * @param settleTableName 每日结算表
     * @param period          期间
     * @param saOrderList     根据撤单数据过来的订单
     * @return: List<CuMemberAssess>
     * @Author: sui q
     * @Date: 2022/11/9 11:24
     */
    List<CuMemberAssessExt> queryAssessPeriodByRevokeOrder(@Param("tableName") String tableName, @Param("settleTableName") String settleTableName,
                                                           @Param("period") Integer period, @Param("saOrderList") List<?> saOrderList);

    /**
     * 根据会员主键查询考核结果，只查询出来考核通过的会员
     *
     * @param tableName             表名
     * @param period                期间
     * @param assessType            考核类型
     * @param cuMemberSettleExtList 会员列表
     * @return: List<CuMemberAssess>
     * @Author: sui q
     * @Date: 2022/11/16 19:13
     */
    List<CuMemberAssess> queryCuMemberAssessByMember(@Param("tableName") String tableName, @Param("period") Integer period,
                                                     @Param("assessType") Integer assessType,
                                                     @Param("cuMemberSettleExtList") List<?> cuMemberSettleExtList);

    /**
     * 查询会员分红考核结果，只查询出免考或者考核通过的，用于分红
     *
     * @param tableName 表名
     * @param period    期间
     * @return: List<CuMemberAssess>
     * @Author: sui q
     * @Date: 2022/11/16 19:13
     */
    List<CuMemberAssess> queryCuMemberShareAssess(@Param("tableName") String tableName, @Param("period") Integer period);

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

    /**
     * 更新考核通过的考核表,根据临时表
     * 更新会员考核表，根据使用值的更新期末结余，更新结余跟其他的不一样，
     * 只更新一张表，复购跟分红可以一起更新，复购或分红只需要更新一次
     *
     * @param tableName                表名
     * @param period                   期间
     * @param newCuMemberSettleExtList 需要更新的会员
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/8 10:32
     */
    Integer updateAssessPeriodCheckBalanceByTmp(@Param("tableName") String tableName, @Param("period") Integer period, @Param("cuMemberList") List<?> newCuMemberSettleExtList);

    /**
     * 初始化分红考核表数据，将结算表数据插入到考核表中
     *
     * @param tableName       更新表名
     * @param sourceTableName 来源表，用哪个表进行更新
     * @param period          期间
     * @param month           考核月份
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/11/7 14:33
     */
    Integer insertShareCuMemberAssess(@Param("tableName") String tableName, @Param("sourceTableName") String sourceTableName,
                                      @Param("period") Integer period, @Param("month") String month);

    /**
     * 会员-考核明细列表
     *
     * @author: zhang jing
     * @date: 2023/1/23 10:20
     * @param: [cuMemberAssessVO] 查询条件
     * @return: java.util.List<com.hzs.member.detail.vo.CuMemberAssessVO>
     **/
    List<CuMemberAssessVO> selectAssessList(@Param("tableName") String tableName,
                                            @Param("pkMember") Long pkMember,
                                            @Param("pkCountry") Integer pkCountry,
                                            @Param("assessStatus") Integer assessStatus,
                                            @Param("assessType") Integer assessType,
                                            @Param("changeType") Integer changeType,
                                            @Param("startDate") Date startDate,
                                            @Param("endDate") Date endDate,
                                            @Param("orderTypeList") List<Integer> orderTypeList




    );

    /**
     * @description: 查询会员月度考核
     * @author: zhang jing
     * @date: 2023/3/14 14:44
     * @param: [tableName, cuMemberAssessVO]
     * @return: java.util.List<com.hzs.member.detail.vo.CuMemberAssessVO>
     **/
    List<CuMemberAssessVO> getMemberAssessMonthList(@Param("tableName") String tableName,
                                                    @Param("pkMember") Long pkMember,
                                                    @Param("assessType") Integer assessType,
                                                    @Param("pkCountry") Integer pkCountry,
                                                    @Param("period") Integer period
    );


    /**
     * @description: 查询会员订单考核积分
     * @author: zhang jing
     * @date: 2023/3/14 17:52
     * @param: [cuMemberAssessVO]
     * @return: java.util.List<com.hzs.member.detail.vo.CuMemberAssessVO>
     **/
    CuMemberAssessVO getOrderAssessList(CuMemberAssessVO cuMemberAssessVO);

    /**
     * @description: 根据考核类型查询会员订单信息
     * @author: zhang jing
     * @date: 2023/4/23 19:43
     * @param: [cuMemberAssessVO]
     * @return: java.util.List<com.hzs.member.detail.vo.CuMemberAssessVO>
     **/
    List<CuMemberAssessVO> getOrderByAssessList(CuMemberAssessVO cuMemberAssessVO);

    /*
     * @description: 查询满足分红考核的人数，达标人数
     * @author: sui q
     * @date: 2023/7/3 16:51
     * @param: null null
     **/
    List<CuMemberAssess> queryCuMemberAssTotal(@Param("settleTable") String settleTable, @Param("period") Integer period,
                                               @Param("pkCountry") Integer pkCountry);
}
