package com.hzs.bonus.achieve.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.CuMemberAchieve;
import com.hzs.common.domain.member.achieve.ext.CuMemberAchieveExt;
import com.hzs.common.domain.member.swing.ext.CuMemberSwingNetExt;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.bonus.achieve.param.MemberAchieveParam;

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

/**
 * 会员业绩记录 服务类
 *
 * @author hzs
 * @since 2022-10-26
 */
public interface ICuMemberAchieveService extends IService<CuMemberAchieve> {

    /**
     * 创建每月的会员业绩记录表
     *
     * @param date 日期
     * @return: void
     * @Author: sui q
     * @Date: 2022/10/31 15:17
     */
    String createCuMemberAchieve(String date);

    /**
     * 创建每年的业绩统计年表，用于放月表
     *
     * @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(Integer day, String date);

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

    /**
     * 根据每日日业绩开始更新会员业绩 新增业绩、累计业绩
     *
     * @param memberAchieveParamMap 修改的结算
     * @param tablaName             修改的结算期间表
     * @return: Boolean
     * @Author: sui q
     * @Date: 2022/11/2 11:30
     */
    void updateCuMemberAchieveEveryDay(Map<Long, MemberAchieveParam> memberAchieveParamMap, String tablaName);

    /**
     * 重新结算会员网体业绩
     *
     * @param currentSettleTableName 更新甩网业绩
     * @return: void
     * @Author: sui q
     * @Date: 2022/11/3 13:56
     */
    void updateCuMemberNetAchieve(List<CuMemberAchieveExt> updMemberAchieveExtList, String currentSettleTableName);

    /**
     * 根据每日日业绩开始回退更新会员业绩 新增业绩、累计业绩
     *
     * @param memberAchieveParamMap 修改的结算
     * @param tablaName             修改的结算期间表
     * @return: Boolean
     * @Author: sui q
     * @Date: 2022/11/2 11:30
     */
    void updateCuMemberBackOldAchieveEveryDay(Map<Long, MemberAchieveParam> memberAchieveParamMap, String tablaName);

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

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

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

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

    /*
     * @description: 注水到期更新业绩
     * @author: sui q
     * @date: 2024/5/23 11:37
     * @param: null null
     **/
    void mergeCuMemberSettleByAchieveLogByDate(String targetTable, Date settleDate);

    /*
     * @description: 根据到期日期更新业绩，到期后需要还原到实际累计金额
     * @author: sui q
     * @date: 2023/4/8 15:32
     * @param: null null
     **/
    void updateCuMemberSettleAchieveByDueDate(String currentTableName, String yesTableName, Date currentDate);

    /*
     * @description: 退单回退业绩
     * @author: sui q
     * @date: 2023/9/22 9:27
     * @param: null null
     **/
    Boolean chargeBackSaOrder(SaOrder saOrder);

    /*
     * @description: 查询每月月业绩，获得血缘业绩 首购复购
     * @author: sui q
     * @date: 2023/12/11 15:36
     * @param: null null
     **/
    List<CuMemberAchieveExt> queryCuMemberMonthAchieveByMemberIdList(String settleTableName, List<CuMemberSwingNetExt> memberSwingNetExtList);
}
