package com.hzs.member.base.mapper;

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.*;
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);

    /**
     * 根据服务编号登录用户（2024.07.09 兼容海外临时需求）
     *
     * @param serviceCode 服务编号
     * @return
     */
    CuMemberExt queryTmpLoginMember(@Param("serviceCode") String serviceCode);

    /**
     * 查询会员（无删除标记）
     *
     * @param memberCode 会员编号
     * @param pkMember   会员主键
     * @return
     */
    CuMember queryMemberNotFlag(@Param("memberCode") String memberCode, @Param("pkMember") Long pkMember);

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

    /*
     *  根据条件查询会员信息，查询单表
     * @param: null null
     **/
    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> querySponsorOnUmbrella(@Param("memberId") Long memberId, @Param("memberCodeList") List<String> memberCodeList);

    /**
     * 查找安置人伞下
     *
     * @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);

    /**
     * 获取会员主键
     *
     * @return: Integer
     */
    Long createMemberId();

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

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

    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);


    /**
     * 根据会员编号查询会员信息（数量超过1000）
     *
     * @param memberCodeList 会员编号
     * @param pkCountry      国家ID
     * @return List<CuMember>
     */
    List<CuMember> findMemberByMemberCodeList(@Param("memberCodeList") List<String> memberCodeList,
                                              @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<UpdateExpireStopVO> getMemberExpireStopList(UpdateExpireStopVO updateExpireStopVO);

    /**
     * 查询全部修改过会员编号的记录
     **/
    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);

    /*
     * description: 查询历史网体的最末安置人，左右区一起查出来
     **/
    List<CuMemberExt> queryCuMemberLastPlaceParent(@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);

    /**
     * 查询推荐列表
     *
     * @param pkParent        会员主键
     * @param memberCode      会员编号
     * @param memberName      会员名称
     * @param startCreateTime 开始时间
     * @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 topCode  顶点编号
     * @param pkMember 当前会员
     * @return
     */
    int checkParent(@Param("topCode") String topCode, @Param("pkMember") Long pkMember);

    /**
     * 查询会员是否在血缘下
     *
     * @param topCodeList 顶点编号列表
     * @param userId      当前会员
     * @return
     */
    CuMemberExt checkMemberByParentList(@Param("topCodeList") List<String> topCodeList, @Param("userId") Long userId);


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

    /**
     * 查询全部用户
     *
     * @return
     */
    List<CuMemberExt> findAll();

    /**
     * 查询左右区人数统计
     *
     * @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);

    /**
     * 校验是否安置关系（从下往上找）
     *
     * @param topCode  顶点编号
     * @param pkMember 当前会员
     * @return
     */
    int checkPlaceParent(@Param("topCode") String topCode, @Param("pkMember") Long pkMember);

    /**
     * 查询指定数量会员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);

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

    /**
     * 修改直推信息
     *
     * @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);

    /*
     *  查询会员左右区人数
     **/
    List<CuMember> queryMemberLeftRightCount(@Param("pkMember") Long pkMember);

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

    /**
     * 查询海粉订单
     *
     * @param orderCode 订单编号
     * @return
     */
    CuMemberExt queryFansOrder(@Param("orderCode") String orderCode);

    /**
     * 查询注册订单信息
     *
     * @param orderCode 订单编号
     * @param pkMember  会员编号
     * @return
     */
    CuMemberExt queryRegisterOrder(@Param("orderCode") String orderCode, @Param("pkMember") Long pkMember);

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

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

    /*
     *  查询伞下会员
     **/
    List<CuMember> queryCuMemberUnderUmbrella(@Param("pkMember") Long pkMember);

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

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

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

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

    /**
     * 查询会员安置伞上
     *
     * @param pkMember
     * @param editNewPlaceMemberCode
     * @return
     */
    List<CuMember> checkMemberPlaceParent(@Param("pkMember") Long pkMember, @Param("editNewPlaceMemberCode") String editNewPlaceMemberCode);

    /**
     * @param pkMember               推荐人
     * @param editNewPlaceMemberCode 安置后会员编号
     * @return
     */
    Long checkPlaceMemberList(@Param("pkMember") Long pkMember, @Param("editNewPlaceMemberCode") String editNewPlaceMemberCode);

    /**
     * 查询安置会员列表
     *
     * @param memberCode 会员编号
     * @param pkCountry  所属国家
     * @return
     */
    List<CuMemberExt> queryPlaceMemberList(@Param("memberCode") String memberCode, @Param("pkCountry") Integer pkCountry);

    /**
     * 查询血缘上所属体系
     *
     * @param pkMember 会员ID
     * @return
     */
    CuMemberExt queryParentVertex(@Param("pkMember") Long pkMember);

    /**
     * 提前三个月自动把服务协议有效期续期一年
     */
    Integer updateMemberExpireDate();

    /**
     * 用户消费统计
     *
     * @return
     */
    List<MemberConsumptionStatVo> getMemberConsumptionStat(MemberConsumptionStatParam memberConsumptionStatParam);

    /**
     * 查询表是否存在
     **/
    Integer selectExistTable(String tableName);

    /**
     * 批量查询会员是否在血缘伞下
     *
     * @param waresAuthorityParentParamList
     * @return
     */
    List<Long> queryBloodKinshipUnderUmbrella(@Param("paramList") Collection<WaresAuthorityParentParam> waresAuthorityParentParamList);

    /**
     * 批量查询会员是否在安置伞下
     *
     * @param waresAuthorityParentParamList
     * @return
     */
    List<Long> queryPlaceSponsorUnderUmbrella(@Param("paramList") Collection<WaresAuthorityParentParam> waresAuthorityParentParamList);

    /**
     * 查询同姓名、同手机号，奖衔最高的人
     *
     * @param memberName 会员姓名
     * @param phone      手机号
     * @param pkCountry  所属国家
     * @return
     */
    CuMemberExt querySameMemberByAwards(@Param("memberName") String memberName,
                                        @Param("phone") String phone,
                                        @Param("pkCountry") Integer pkCountry);

    /**
     * 重置【有效期】【休止期】
     *
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param expireDate 有效期
     * @param stopDate   休止期
     * @param pkCountry  所属国家
     * @return
     */
    int resetExpireAndStopDate(@Param("memberName") String memberName,
                               @Param("phone") String phone,
                               @Param("expireDate") Date expireDate,
                               @Param("stopDate") Date stopDate,
                               @Param("pkCountry") Integer pkCountry);

    /**
     * 批量更新【有效期】【休止期】
     * 同姓名、同手机号只更新比自己有效期早的
     *
     * @param pkMember   会员ID
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param expireDate 有效期
     * @param stopMonth  休止月份（6或12）
     * @param pkCountry  所属国家
     * @return
     */
    int updateExpireAndStopDate(@Param("pkMember") Long pkMember,
                                @Param("memberName") String memberName,
                                @Param("phone") String phone,
                                @Param("expireDate") Date expireDate,
                                @Param("stopMonth") Integer stopMonth,
                                @Param("pkCountry") Integer pkCountry);

    /**
     * 批量更新【休止期】
     *
     * @param pkMember   会员ID
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param stopMonth  休止月份（6或12）
     * @param pkCountry  所属国家
     * @return
     */
    int updateStopDate(@Param("pkMember") Long pkMember,
                       @Param("memberName") String memberName,
                       @Param("phone") String phone,
                       @Param("stopMonth") Integer stopMonth,
                       @Param("pkCountry") Integer pkCountry);

    /**
     * 变更户籍更新【有效期】【休止期】
     *
     * @param pkMember   会员ID
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param stopMonth  休止月份（6或12）
     * @param pkCountry  所属国家
     * @return
     */
    int updateExpireAndStopDateByChange(@Param("pkMember") Long pkMember,
                                        @Param("memberName") String memberName,
                                        @Param("phone") String phone,
                                        @Param("stopMonth") Integer stopMonth,
                                        @Param("pkCountry") Integer pkCountry);

    /**
     * 更新有效状态
     *
     * @param pkMember   会员ID
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param pkCountry  所属国家
     * @return
     */
    int updateExpireStatus(@Param("pkMember") Long pkMember,
                           @Param("memberName") String memberName,
                           @Param("phone") String phone,
                           @Param("pkCountry") Integer pkCountry);

    /**
     * 批量更新会员休止期时间
     *
     * @param pkCountry 所属国家
     * @return
     */
    int flushStopDateBatch(@Param("pkCountry") Integer pkCountry);

    /**
     * 批量刷新会员【休止期】状态
     *
     * @param pkCountry 所属国家
     * @return
     */
    int flushExpireStatusBatch(@Param("pkCountry") Integer pkCountry);

    /**
     * 批量刷新会员【已终止】状态
     *
     * @param pkCountry
     * @return
     */
    int flushStopStatusBatch(@Param("pkCountry") Integer pkCountry);

    /**
     * 查询菜单用户
     *
     * @param pkMember
     * @return
     */
    CuMemberExt getMenuMember(@Param("pkMember") Long pkMember);

    /**
     * 查询会员服务编号列表
     *
     * @param memberServiceCodeParam
     * @return
     */
    List<MemberServiceCodeVo> queryMemberServiceCodeList(MemberServiceCodeParam memberServiceCodeParam);

    /**
     * 根据会员编号置空服务编号
     *
     * @param memberCode
     */
    void updateMemberCodeByServiceCodeBlack(@Param("memberCode") String memberCode);

    /**
     * 查询最大服务编码
     *
     * @param pkCountry
     * @return
     */
    String getMaxServiceCode(@Param("pkCountry") Integer pkCountry);

    /**
     * 根据会员编号获取推荐人信息
     *
     * @param memberCode 会员编号
     * @return
     */
    CuMember getParentMember(@Param("memberCode") String memberCode);

    /**
     * 查询同姓名同手机号指定等级会员数量
     *
     * @param memberName 会员姓名
     * @param phone      手机号码
     * @param pkGrade    结算等级
     * @param pkCountry  所属国家
     * @return
     */
    int countGradeMemberPoint(@Param("memberName") String memberName,
                              @Param("phone") String phone,
                              @Param("pkGrade") Integer pkGrade,
                              @Param("pkCountry") Integer pkCountry);

}
