package com.hzs.member.base.mapper;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.ext.CuMemberExt;
import com.hzs.member.base.dto.MemberCountDTO;
import com.hzs.member.base.param.MemberRealInfoParam;
import com.hzs.member.base.param.MemberSelectParam;
import com.hzs.member.base.vo.*;
import com.hzs.member.census.param.CensusSummaryParam;
import com.hzs.member.handlebusiness.vo.BusinessMemberVO;
import com.hzs.member.handlebusiness.vo.HandleBusinessVO;
import com.hzs.member.marketnews.param.MarketNewsParam;
import com.hzs.member.marketnews.vo.UserInvestmentVo;
import org.apache.ibatis.annotations.Param;

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

/**
 * 会员 Mapper 接口
 */
public interface CuMemberMapper extends BaseMapper<CuMember> {

    /**
     * 查询登录会员以及状态
     *
     * @param memberCode 会员编号
     * @param pkMember   会员主键
     * @return
     */
    CuMemberExt queryLoginMember(@Param("memberCode") String memberCode, @Param("pkMember") Long pkMember);

    /**
     * 批量查询会员
     *
     * @param memberCodeList 会员编号列表
     * @param pkMemberList   会员ID列表
     * @return
     */
    List<CuMemberExt> queryMemberList(@Param("memberCodeList") List<String> memberCodeList, @Param("pkMemberList") List<Long> pkMemberList);

    /**
     * 前台查询会员的方法，通过传输不同的参数，查询不同的会员
     *
     * @param cuMember 会员编号
     */
    List<CuMemberExt> queryMemberInfoByCondition(CuMember cuMember);

    /*
     *  根据条件查询会员信息，查询单表
     **/
    List<CuMemberExt> queryMemberByCondition(CuMember cuMember);

    /**
     * 查找安置人伞上
     *
     * @param memberId 会员编号
     */
    List<CuMemberExt> selectPlaceSponsorOnUmbrella(@Param("memberId") Long memberId, @Param("memberCode") String memberCode,
                                                   @Param("phone") String phone);

    /**
     * 查找安置人伞下
     *
     * @param memberId 会员编号
     */
    List<CuMemberExt> selectPlaceSponsorUnderUmbrella(@Param("memberId") Long memberId);

    /**
     * 查找安置人伞下
     *
     * @param memberId 会员编号
     */
    List<CuMemberExt> selectPlaceSponsorUnderUmbrellaByCode(@Param("memberId") Long memberId, @Param("placeParentCode") String placeParentCode);

    /**
     * 查找安置人伞下
     *
     * @param memberId 会员编号
     */
    List<CuMemberExt> selectPlaceSponsorUnderUmbrellaByCondition(@Param("memberId") Long memberId, @Param("cuMemberExtList") List<CuMemberExt> cuMemberExtList);

    /**
     * 根据会员编号，查找该会员编号极左极下的那个人
     *
     * @param memberId  会员编号
     * @param placeDept 安置部门
     */
    CuMemberExt selectPlaceSponsorLastLeft(@Param("memberId") Long memberId, @Param("placeDept") Integer placeDept);

    /**
     * 查找血缘伞上，推荐人
     *
     * @param memberId 推荐人编号
     */
    List<CuMemberExt> selectBloodKinshipOnUmbrella(Long memberId);

    /**
     * 查找血缘伞下，推荐人
     *
     * @param memberId 推荐人编号
     */
    List<CuMemberExt> selectBloodKinshipUnderUmbrella(Long memberId);

    /**
     * 获取会员主键
     */
    Long createMemberId();

    /**
     * 查询会员信息，根据条件
     *
     * @param memberParam 参数
     */
    List<CuMemberVO> queryCuMemberByCondition(CuMemberVO memberParam);

    /*
     *  查询会员信息，根据条件
     **/
    List<CuMemberVO> queryCuMemberByMemberList(@Param("cuMemberVOList") List<CuMemberVO> cuMemberVOList);

    List<CuMemberVO> queryCuMemberByMemberListExcel(CuMemberVO memberParam);

    /**
     * 会员真实信息
     **/
    List<CuMemberVO> realCuMemberByCondition(CuMemberVO memberParam);

    /**
     * 根据国家、会员编号查询会员信息
     *
     * @param memberCodes 会员编号
     * @param pkCountry   国家ID
     * @return List<CuMember>
     */
    List<CuMember> findMemberByMembercodesAndPkcountry(@Param("memberCodes") List<String> memberCodes,
                                                       @Param("pkCountry") Integer pkCountry);

    /**
     * 根据会员ID列表查询会员
     *
     * @param pkMemberList 会员ID列表 -- 必传
     * @param pkCountry    国家ID -- 非必传
     * @return
     */
    List<CuMemberExt> findMemberByMemberId(@Param("pkMemberList") List<Long> pkMemberList,
                                           @Param("pkCountry") Integer pkCountry);

    /**
     * 特殊业务-修改会员编号列表
     **/
    List<UpdateCodeVO> puCodeList(UpdateCodeVO updateCodeVO);

    /**
     * 查询全部修改过会员编号的记录
     **/
    List<UpdateCodeVO> puCodeAllList(UpdateCodeVO updateCodeVO);

    /**
     * 查询会员变更前信息
     **/
    UpdateCodeVO specialBusinessQuery(UpdateCodeVO updateCodeVO);

    /**
     * 查询会员个人资料
     *
     * @param memberId
     * @return
     */
    MemberDataVO queryMemberData(@Param("memberId") Long memberId);

    /**
     * 批理更新会员姓名、手机号
     *
     * @param businessMemberList 会员办理业务
     * @param businessType       业务类型
     * @param updatePkMember     更新人
     * @return Boolean
     */
    Boolean batchUpdateMemberNameAndMobileByPkmember(@Param("businessMemberList") List<BusinessMemberVO> businessMemberList,
                                                     @Param("businessType") int businessType,
                                                     @Param("updatePkMember") Long updatePkMember);


    /**
     * 根据业务类型批量理新
     *
     * @param handleBusinessVO 业务办理信息
     * @return Integer
     */
    Integer batchUpdateMemberByBusinessType(HandleBusinessVO handleBusinessVO);

    /**
     * 招商列表
     *
     * @param marketNewsParam
     * @return
     */
    List<UserInvestmentVo> selectBiddingList(MarketNewsParam marketNewsParam);

    /**
     * 保存会员信息
     *
     * @param cuMember 会员信息
     */
    Integer insertCuMember(CuMember cuMember);

    /**
     * 批量保存会员信息
     *
     * @param memberList 会员列表
     * @return
     */
    int insertBatchCuMember(@Param("memberList") List<CuMember> memberList);


    /**
     * 特殊业务-修改结算国
     **/
    List<UpdateSettleCountryVO> upseCountryList(UpdateSettleCountryVO upseCountryVO);

    /**
     * 特殊配置 修改结算国列表
     **/
    List<UpdateSettleCountryVO> upsettleCountryList(UpdateSettleCountryVO upseCountryVO);

    /**
     * 查询修改政策币列表
     **/
    List<UpPolicyCurrencyVO> upPolicyCurrencyList(UpPolicyCurrencyVO upVO);


    /**
     * 校验会员是否有充值审核
     **/
    Integer checkCecharge(@Param("pkMember") Long pkMember);

    /**
     * 校验会员是否有提现审核
     **/
    Integer checkWithdraw(@Param("pkMember") Long pkMember);

    /**
     * 校验会员所有账户是否有余额
     **/
    Integer checkAccount(@Param("pkMember") Long pkMember);

    /**
     * 查询会员是否存在未完成基础业务办理
     **/
    Integer checkmsLogCount(@Param("pkMember") Long pkMember,
                            @Param("editType") Integer editType);

    /**
     * 查询会员是否存在未完成注水业绩业务
     **/
    Integer checkMemberAchieveCount(@Param("pkMember") Long pkMember);

    /**
     * 查询选择会员列表
     *
     * @param param     查询参数
     * @param pkCountry 会员结算国
     * @return
     */
    List<CuMemberExt> queryMemberSelect(@Param("param") MemberSelectParam param, @Param("pkCountry") Integer pkCountry);

    /*
     *  查询历史网体的最末安置人，左右区一起查出来
     **/
    List<CuMemberExt> queryCuMemberLastPlaceParent(@Param("placeDeptList") List<Integer> placeDeptList, @Param("pkMember") Long pkMember);

    /**
     * 查询会员真实信息
     *
     * @return
     */
    List<MemberRealInfoVO> selectByMemberRealInfo(MemberRealInfoParam memberRealInfoParam);

    /**
     * 注册列表
     *
     * @param marketNewsParam
     * @return
     */
    List<UserInvestmentVo> selectRegList(MarketNewsParam marketNewsParam);

    /**
     * 根据国家、会员编号查询未支付的会员信息
     *
     * @param memberCodes 会员编号
     * @param pkCountry   国家ID
     * @return List<CuMember>
     */
    List<String> findNoPayMember(@Param("memberCodes") List<String> memberCodes, @Param("pkCountry") Integer pkCountry);

    /**
     * 查询最新会员
     **/
    CuMember queryRecentlyMember(@Param("pkCountry") Integer pkCountry);

    /**
     * 查询最新国际编号
     **/
    CuMember queryInternationalMember();

    /**
     * 查询推荐列表
     *
     * @param pkParent        会员主键
     * @param memberCode      会员编号
     * @param memberName      会员名称
     * @param startCreateTime 开始时间
     * @param endCreateTime   结束时间
     * @param endCreateTime   结束时间
     * @param memberInfo      会员信息
     * @return
     */
    List<ParentMemberVo> parentList(@Param("pkParent") Long pkParent, @Param("memberCode") String memberCode, @Param("memberName") String memberName, @Param("startCreateTime") Date startCreateTime, @Param("endCreateTime") Date endCreateTime, @Param("memberInfo") String memberInfo);


    /**
     * 校验会员编号是否存在
     *
     * @param codeList           会员编号列表
     * @param checkEmpty         是否需要校验批量空单数据
     * @param excludeMemberEmpty 排除的批次
     * @return
     */
    List<MemberCountDTO> checkMemberCodeExist(@Param("codeList") Collection<String> codeList,
                                              @Param("checkEmpty") Boolean checkEmpty,
                                              @Param("excludeMemberEmpty") Long excludeMemberEmpty);

    /**
     * 查询左右区人数统计
     *
     * @param pkMember
     * @param placeDept
     * @return
     */
    Long selectByDeptNumberCount(@Param("pkMember") Long pkMember, @Param("placeDept") Integer placeDept);

    /**
     * 根据用户编号、用户用户名查询用户信息
     *
     * @param memberCode 用户编号
     * @param memberName 用户名
     * @param pkCountry  国家ID
     * @return List<CuMemberExt>
     */
    List<CuMemberExt> selectMemberByMemberCode(@Param("memberCode") String memberCode, @Param("memberName") String memberName, @Param("pkCountry") Integer pkCountry);

    /**
     * 查询编号是否在登录用户伞下
     *
     * @param pkMember
     * @param memberCode
     * @return
     */
    Long checkPlaceSponsorUnderUmbrella(@Param("pkMember") Long pkMember, @Param("memberCode") String memberCode);

    /**
     * 查询指定数量会员SEQ
     *
     * @param param 数量
     * @return
     */
    List<Long> querySeqList(@Param("param") Integer param);

    /**
     * 根据会员编号批量查询会员信息
     *
     * @param memberCodeList 需要查询的会员编号
     * @return
     */
    List<CuMember> queryMemberListByCode(@Param("memberCodeList") Collection<String> memberCodeList);

    /**
     * 查询最末安置人（根据会员编号）
     *
     * @param memberCode 会员编号
     * @param placeDept  安置部门
     * @return
     */
    CuMemberExt queryLastPlaceByMemberCode(@Param("memberCode") String memberCode, @Param("placeDept") Integer placeDept);

    /**
     * 查询pkMember伞下是否存在memberId
     *
     * @param pkMember
     * @param memberId
     * @return
     */
    Long queryBloodKinshipUnderUmbrellaCount(@Param("pkMember") Long pkMember, @Param("memberId") Long memberId);

    /**
     * 查询会员血缘伞下 人数和业绩
     *
     * @param memberIds
     * @return
     */
    List<MemberTeamInfoVo> selectBloodKinshipUnderUmbrellaByMemberIds(@Param("memberIds") List<Long> memberIds, @Param("tableName") String tableName);

    /**
     * 修改直推信息
     *
     * @param pkMember
     * @param pkParent
     */
    void updateParentById(@Param("pkMember") Long pkMember, @Param("pkParent") Long pkParent, @Param("directPushNumber") Integer directPushNumber);

    /**
     * 修改安置
     *
     * @param pkMember
     * @param pkPlaceParent
     */
    void updatePlaceParentAndPlaceDeptById(@Param("pkMember") Long pkMember, @Param("pkPlaceParent") Long pkPlaceParent, @Param("placeDept") Integer placeDept);

    /**
     * 校验会员编号是否存在
     *
     * @param memberCodeList 会员编号列表
     * @return
     */
    List<String> checkCodeExist(@Param("memberCodeList") List<String> memberCodeList);

    /**
     * 查询业绩汇总
     *
     * @param censusSummaryParam
     * @return
     */
    List<MemberMeritsSummaryVo> queryDateBySummary(CensusSummaryParam censusSummaryParam);

    /**
     * 查询安置位置错误
     *
     * @return List<CuMemberExt>
     */
    List<CuMemberExt> selectPlaceErrorCode();

    /**
     * 查询会员部门列表
     *
     * @param pkMember 会员ID
     * @return
     */
    List<Integer> queryMemberPlaceDept(@Param("pkMember") Long pkMember);

    /**
     * 更新奖金年金时间
     *
     * @param pkMember
     * @param expireDate
     */
    void updateExpireDate(@Param("pkMember") Long pkMember, @Param("expireDate") DateTime expireDate);

    /**
     * 根据会员ID查询部门信息
     *
     * @param pkMember  会员ID
     * @param placeDept 部门
     * @return List<CuMemberVO>
     */
    List<CuMemberVO> selectMemberPlaceDeptByPkMember(@Param("pkMember") Long pkMember, @Param("placeDept") Integer placeDept);

    /**
     * 查询会员最大部门
     *
     * @param pkMember
     * @return
     */
    Integer getMaxMemberDept(@Param("pkMember") Long pkMember);

    /**
     * 查询撤单部门
     *
     * @return
     */
    List<CuMemberExt> getNotDelPlaceParentMember(@Param("pkMember") Long pkMember);

    /*
     *  回退会员的剩余复销收益次数
     **/
    Integer updateMemberReSaleNumber(@Param("pkMember") Long pkMember, @Param("reSaleNumber") Integer reSaleNumber);

    /**
     * 未激活点位列表
     **/
    List<NotActivePointVO> notActiveList(NotActivePointVO notActivePointVO);

    /**
     * 查询会员未激活点位注册订单
     **/
    Long notActiveOrderId(NotActivePointVO notActivePointVO);

    /**
     * 删除未激活会员订单
     **/
    boolean delNotActiveOrder(NotActivePointVO notActivePointVO);

    /**
     * 删除未激活点位订单明细
     **/
    boolean delNotActiveOrderItems(NotActivePointVO notActivePointVO);

    /**
     * 校验修改直推 memberCode 是否在自己血缘伞下
     *
     * @param pkMember
     * @param memberCode
     * @return
     */
    Long checkMemberParent(@Param("pkMember") Long pkMember, @Param("memberCode") String memberCode);

    /**
     * 校验新安置部门和安置编号下是否已存在节点
     *
     * @param placeDeptMemberCode
     * @param placeDept
     * @return
     */
    Long checkPlaceDeptAndMemberCode(@Param("placeDeptMemberCode") String placeDeptMemberCode, @Param("placeDept") Integer placeDept);

    /**
     * 更新会员的修改次数
     *
     * @param pkMemberList ID列表
     * @return Integer
     */
    Integer updateMemberEditNumber(@Param("pkMemberList") List<Long> pkMemberList, @Param("updatePkMember") Long updatePkMember);

    /**
     * 校验会员体系伞下
     *
     * @param vertexIdList
     * @return
     */
    List<CuMemberExt> checkMemberVertex(@Param("vertexIdList") List<Integer> vertexIdList, @Param("memberCode") String memberCode);

    /**
     * 根据编号查询 会员
     *
     * @param memberCode
     * @return
     */
    CuMemberExt getMemberByCodeNotDel(@Param("memberCode") String memberCode);

    /**
     * 查询全部会员
     *
     * @param gradeId
     * @return
     */
    List<CuMemberExt> getMemberAll(@Param("gradeId") List<Integer> gradeId, @Param("pkCountry") Integer pkCountry, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询安置伞下人数
     *
     * @param pkMember
     * @return
     */
    Long selectByQuerySparentMemberCount(@Param("pkMember") Long pkMember);
}
