package com.hzs.bonus.achieve.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.CuMemberRetailRange;
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;

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

/**
 * 服务类
 */
public interface ICuMemberRetailRangeService extends IService<CuMemberRetailRange> {

    /**
     * 将昨天的业绩信息迁移到今天
     */
    void mergeMemberRetailRangeByYesterday(Date settleEndDate, String rangeTableName, String yesterdayRangeTableName, Boolean isSameMonth);

    /**
     * 根据会员查询会员上的所有网体, 按照pkParent作为key
     */
    List<CuMemberRetailRangeExt> queryCuMemberRetailRangeParent(String tableName, List<SaOrderExt> saOrderExtList);

    /**
     * 推荐推荐人查询推荐人下的所有部门, 该订单日期之前的算他的网体
     */
    List<CuMemberRetailRangeExt> queryCuMemberRetailRangeExtByParent(String tableName, Long pkParent);

    /**
     * 查询推荐人伞下满足
     */
    List<CuMemberRetailRangeExt> queryCuMemberRetailRangeEnoughAchieve(String tableName, Long pkParent, BigDecimal achievePv);

    /**
     * 根据会员查询会员上的所有网体, 按照pkParent作为key,查询极差秒接表
     */
    List<CuMemberRetailRangeExt> queryCuMemberSecondRangeParent(String rangeTableName, String secondTableName, Long pkMember);

    /**
     * 推荐推荐人查询推荐人下的所有部门, 该订单日期之前的算他的网体
     */
    List<CuMemberRetailRangeExt> queryCuMemberSecondRangeExtByParent(String rangeTableName, String secondTableName, Long pkMember);

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

    /**
     * 更新会员树的累计业绩
     *
     * @param settleTableName 结算日期
     * @param period          树
     */
    void mergeCuMemberRetailRangeBySpecial(String settleTableName, Integer period);

    /**
     * 之前有过注水，回退
     */
    void mergeCuMemberRetailBackBoxBySpecial(String rangeTableName, String beforeTableName, Integer period);

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

    /**
     * 查询出有奖衔的会员
     *
     * @param settleTableName 结算表
     */
    List<CuMemberRetailRangeExt> batchQueryMemberRetailRangeByAwards(String settleTableName);

    /**
     * 查询伞下会员，用于计算小区
     */
    List<CuMemberRetailRangeExt> batchQueryMemberRetailRangeByParent(String rangeTableName, List<CuMemberRetailRangeExt> memberRetailRangeExtList);

    /**
     * 查询有区域的会员
     */
    List<CuMemberRetailRangeExt> batchQueryMemberRetailRangeByCounty(String rangeTableName);

    /**
     * 查询有区域的会员
     */
    List<CuMemberRetailRangeExt> batchQueryMemberRetailSecondRangeByCounty(String rangeTableName, String secondRangeTableName, Integer county);

    /**
     * 更新极差秒接表，用昨天的结算表
     */
    void mergeMemberSecondRetailRangeByRange(String rangeTableName, String secondRangeTableName, Long pkMember);

    /**
     * 更新购买订单的等级
     */
    void mergeMemberRetailGradeByMember(String rangeTableName, Long pkMember, Integer isToday);

    /**
     * 更新会员树的累计业绩
     *
     * @param secondTableName 结算日期
     * @param cuMemberTreeMap 树
     */
    void updateCuMemberSecondRange(String secondTableName, Map<Long, CuMemberRetailRangeExt> cuMemberTreeMap);
}
