package com.hzs.member.base.service;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailSExt;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.detail.CuMemberGrade;
import com.hzs.common.domain.member.ext.CuMemberExt;
import com.hzs.common.domain.system.config.BdTradeWhiteConfig;
import com.hzs.member.base.param.UpdatePlaceParentPetitionParam;
import com.hzs.member.base.dto.ShowWaresDTO;
import com.hzs.member.base.dto.ZeroElementRevokeDTO;
import com.hzs.member.base.param.*;
import com.hzs.member.base.vo.*;
import com.hzs.member.census.param.CensusSummaryParam;
import com.hzs.member.census.vo.CensusSummaryVo;
import com.hzs.member.handlebusiness.dto.AnalysisBusinessAppealParam;
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 com.hzs.member.share.param.ShareRegisterParam;
import com.hzs.retail.member.param.ShareRetailMemberParam;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;

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

/**
 * 会员 服务类
 */
public interface ICuMemberService extends IService<CuMember> {

    /**
     * 保存会员信息
     *
     * @param cuMember 会员信息
     */
    Boolean saveMember(CuMember cuMember);

    /*
     *  查询网体是否存在推荐人
     **/
    Integer queryCuMemberByPkMember(Long pkReference);

    /**
     * 根据会员编号获取会员信息（查库）
     *
     * @param memberCode
     * @return
     */
    CuMemberExt getMemberByCode(String memberCode);

    /**
     * 根据会员ID获取会员信息（查库）
     *
     * @param memberId
     * @return
     */
    CuMemberExt getMemberById(Long memberId);

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

    /**
     * 获取会员缓存
     *
     * @param memberCode 会员编号的值
     * @return CuMember
     */
    CuMember getMember(String memberCode);

    /**
     * 获取会员缓存
     *
     * @param pkId 会员的主键
     * @return CuMember
     */
    CuMember getMember(Long pkId);

    /*
     *  查询会员
     **/
    CuMember queryMember(String memberCode);

    /*
     *  查询会员
     **/
    CuMember queryMember(Long pkMember);

    /**
     * 校验会员下的安置人、推荐人是否存在
     *
     * @param pkMember 会员ID
     * @return 存在返回 true
     */
    boolean checkLowerMember(Long pkMember);

    /**
     * 查找安置人伞上
     *
     * @param memberId 安置人，编号
     */
    List<CuMemberExt> queryPlaceSponsorOnUmbrella(Long memberId);

    /**
     * 查找安置人伞上
     *
     * @param memberId 安置人，编号
     */
    List<CuMemberExt> queryPlaceSponsorOnUmbrella(Long memberId, String memberCode, String phone);

    /**
     * 查找安置人伞上会员信息
     *
     * @param memberId 编号、安置人
     */
    List<CuMemberExt> querySponsorOnUmbrella(Long memberId, List<String> memberCodeList);

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

    /**
     * 查找安置人伞下
     *
     * @param memberId 安置人，编号
     */
    List<CuMemberExt> queryPlaceSponsorUnderUmbrella(Long memberId, String... placeParent);

    /**
     * 查询最末安置人
     * 根据会员编号，查找该会员编号极左极下的那个人
     *
     * @param memberId  会员编号
     * @param placeDept 1代表左区极左极下，2代表右区极左极下
     */
    CuMemberExt queryPlaceSponsorLastLeft(Long memberId, Integer placeDept);

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

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

    /**
     * 生成会员编号（根据结算地区前缀）
     *
     * @param cuMember 会员
     */
    CuMember createMemberIdAndCode(CuMember cuMember);

    /**
     * 创建注册会员编号（放入会员编号批次占用）
     *
     * @param cuMember 会员信息
     * @return
     */
    CuMember createRegisterMemberCode(CuMember cuMember);

    /**
     * 查询新零售会员信息
     **/
    List<RetailMemberVO> retailMemberList(RetailMemberVO retailMemberVO);

    /**
     * 查询真实信息
     **/
    List<CuMemberVO> realCuMemberByCondition(CuMemberVO memberParam);

    /**
     * 生成会员编号
     *
     * @param pkCountry 所属国家
     * @param digit     编号数字位数
     * @return
     */
    String createUserNameByPremix(Integer pkCountry, Integer digit);

    /**
     * 批量生成会员编号
     *
     * @param prefix   前缀
     * @param quantity 生成数量
     * @return
     */
    List<String> createUserCodeBatch(String prefix, Integer quantity);

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

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

    /**
     * 创建空单注册会员
     *
     * @param member
     * @return
     */
    CuMember createEmptyOrderMember(CuMemberExt member);

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

    /**
     * 零元撤单列表
     **/
    List<ZeroElementRevokeVO> zeroList(ZeroElementRevokeVO zeroElementRevokeVO);

    /**
     * 零元撤单签呈列表
     **/
    List<ZeroElementRevokeDTO> zeroByBusinessList(AnalysisBusinessAppealParam analysisBusinessAppealParam);

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

    /**
     * 修改安置信息
     *
     * @param placeParentParam
     */
    String updatePlaceParent(PlaceParentParam placeParentParam);

    /**
     * 修改直推
     *
     * @param parentParam
     */
    String updateParent(ParentParam parentParam);

    /**
     * 批量修改会员编号
     **/
    UpdateCodeVO updateCode(UpdateCodeVO updateCodeVO);

    /**
     * 零元撤单业务
     **/
    ZeroElementRevokeVO zeroRevokeBusiness(ZeroElementRevokeVO zeroElementRevokeVO);

    /**
     * 发起签呈-零元撤单
     **/
    ZeroElementRevokeVO zeroPetition(ZeroElementRevokeVO zeroElementRevokeVO);

    /**
     * 发起签呈-修改会员编号
     **/
    UpdateCodeVO petition(UpdateCodeVO updateCodeVO);

    /**
     * 审核通过根据业务单号，业务类型批量修改业务数据
     **/
    boolean updateCodeByBusinessNo(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 政策币签呈审核
     **/
    boolean upPolicyCurrencyProcess(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 删除政策币业务审核
     **/
    boolean delPolicyCurrencyProcess(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 审核驳回 根据业务单号，业务类型批量修改业务数据
     **/
    boolean updateCodeReject(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 真实奖衔控制-通过或驳回
     **/
    boolean awardsControlPetition(ApprovalBusinessResultDTO approvalBusinessResultDTO);

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

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

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

    List<UpdateSettleCountryVO> upsettleCountryList(UpdateSettleCountryVO upseCountryVO);

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

    /**
     * 特殊业务-修改结算国
     **/
    UpdateSettleCountryVO updateSettleCountry(UpdateSettleCountryVO upseCountryVO);

    /**
     * 特殊业务-修改政策币
     **/
    UpPolicyCurrencyVO upPolicyCurrency(UpPolicyCurrencyVO policyCurrencyVO);

    /**
     * 特殊业务-删除政策币业务
     **/
    UpPolicyCurrencyVO delPolicyCurrency(UpPolicyCurrencyVO policyCurrencyVO);

    /**
     * 发起签呈-修改结算国
     **/
    UpdateSettleCountryVO petition(UpdateSettleCountryVO upseCountryVO);

    /**
     * 发起签呈-修改政策币发起签呈
     **/
    UpPolicyCurrencyVO petition(UpPolicyCurrencyVO policyCurrencyVO);

    /**
     * 零元撤单审核-审核通过、驳回
     **/
    boolean zeroByBusinessNo(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 后台推荐上下级
     *
     * @param memberRetailExtList
     * @param memberRetailExt
     * @param settleTableName
     * @return
     */
    List<Tree<String>> systemListTree(List<CuMemberRetailSExt> memberRetailExtList, CuMemberRetailSExt memberRetailExt, String settleTableName);

    /**
     * 特殊业务-修改结算国-审核通过
     **/
    boolean updateSettleCountryAdopt(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 特殊业务-修改结算国-审核驳回
     **/
    boolean updateSettleCountryReject(ApprovalBusinessResultDTO approvalBusinessResultDTO);

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

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

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

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

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

    /**
     * 获取等级的翻译KEY值
     **/
    Integer getGradeTranslateValue(Integer pkId);

    /**
     * 获取奖衔的翻译KEY值
     **/
    Integer getAwardsTranslateValue(Integer pkCountry, Integer pkId);

    /**
     * 取消用户（取消注册相关订单，同步取消用户）
     *
     * @param pkMember
     * @return
     */
    boolean cancelMember(Long pkMember);

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

    /**
     * 分享注册会员
     *
     * @param registerParam 分享注册入参
     * @return
     */
    CuMember shareRegisterMember(ShareRegisterParam registerParam);

    /**
     * 删除会员信息
     *
     * @param pkMember        会员主键
     * @param pkApprove       审核人
     * @param currentDateTime 时间
     */
    void deleteCuMemberByPkMember(Long pkMember, Long pkApprove, Date currentDateTime);

    /**
     * 户籍变更
     *
     * @param pkMember   会员主键
     * @param memberName 会员姓名
     * @param phone      联系方式
     * @param pkModified 修改人
     * @return boolean
     */
    boolean updateMemberNameAndPhone(Long pkMember, String memberName, String phone, Long pkModified);

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

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

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

    /**
     * 校验是否血缘关系
     *
     * @param topCode  顶点编号
     * @param pkMember 当前会员
     * @return
     */
    int checkParent(String topCode, Long pkMember);

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

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

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


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

    /**
     * 校验商品团队信息是否可见
     *
     * @param showWaresDTOS
     * @return
     */
    Map<Integer, Boolean> checkIsShowWares(List<ShowWaresDTO> showWaresDTOS);

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

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

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

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

    /**
     * 修改直推审批
     *
     * @param updateParentPetitionParam
     */
    UpdateParentPetitionParam petitionUpdateParent(UpdateParentPetitionParam updateParentPetitionParam);

    /**
     * 修改安置审批
     *
     * @param updatePlaceParentPetitionParam
     */
    UpdatePlaceParentPetitionParam petitionUpdatePlaceParent(UpdatePlaceParentPetitionParam updatePlaceParentPetitionParam);

    /**
     * 修改直推 通过
     *
     * @param approvalBusinessResultDTO
     */
    void updateParentByBusinessNo(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 修改直推驳回
     *
     * @param approvalBusinessResultDTO
     */
    void updateParentByBusinessNoReject(ApprovalBusinessResultDTO approvalBusinessResultDTO);

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

    /**
     * 修改安置通过
     *
     * @param approvalBusinessResultDTO
     */
    void updatePlaceParentByBusinessNo(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 修改安置驳回
     *
     * @param approvalBusinessResultDTO
     */
    void updatePlaceParentByBusinessNoReject(ApprovalBusinessResultDTO approvalBusinessResultDTO);

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

    /**
     * 更新会员的认证状态
     *
     * @param pkMembers      会员IDs
     * @param updatePkMember 更新人
     * @param type           类型
     * @return Boolean
     */
    Boolean updateMemberStatusByPkIds(List<Long> pkMembers, Long updatePkMember, Integer type);

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

    /**
     * 校验修改直推 推荐编号不能是自己本身
     *
     * @param pkMember
     * @param memberCode
     * @return
     */
    Long checkMemberParent(Long pkMember, String memberCode);

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

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

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

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

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

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

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

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

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

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

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

    /**
     * 会员奖衔查询列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家
     * @return
     */
    List<MemberAwardsQueryVO> listMemberAwards(MemberAwardsQueryParam param, Integer pkCountry);

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

    /**
     * 根据会员编号获取会员信息（查库）
     *
     * @param memberCode 会员编号
     * @return
     */
    CuMemberExt getRetailMemberByCode(String memberCode);

    /**
     * 查询有效顶点
     *
     * @return
     */
    List<CuMemberExt> vertexList();

    /**
     * 根据会员ID获取会员信息（查库）
     *
     * @param memberId 会员ID
     * @return
     */
    CuMemberExt getRetailMemberById(Long memberId);

    /**
     * 生成新零新会员ID和编号
     *
     * @param cuMember 会员信息
     * @return
     */
    CuMember createRetailMemberIdAndCode(CuMember cuMember);

    /**
     * 新零售查询会员血缘伞上
     * pkMember、memberCode，必传一项
     * topPkMember、topMemberCode，必传一项
     *
     * @param pkMember      查询会员ID
     * @param memberCode    查询会员编号
     * @param topPkMember   顶点会员ID
     * @param topMemberCode 顶点会员编号
     * @return
     */
    CuMember getRetailTopMember(Long pkMember, String memberCode, Long topPkMember, String topMemberCode);

    /**
     * 校验注册关系（是否跨团队）
     * 2024.12.24 修改为校验手机号必须唯一（9035）
     * 根据推荐人编号，校验手机号必须唯一
     *
     * @param phone      联系方式
     * @param parentCode 推荐编号
     * @return 返回为null则正常，否则则错误信息
     */
    String checkRegisterRelation(String phone, String parentCode);

    /**
     * 根据推荐人ID，校验手机号必须唯一
     *
     * @param phone    联系方式
     * @param pkParent 推荐人ID
     * @return
     */
    String checkRegisterRelation(String phone, Long pkParent);

    /**
     * 添加等级升级记录
     **/
    void saveMemberGrade(CuMemberGrade cuMemberGrade);

    /**
     * 根据手机号查询会员
     *
     * @param phone 联系方式
     * @return
     */
    List<CuMemberExt> listMemberByPhone(String phone);

    /**
     * 推荐列表
     *
     * @param pkMember 会员ID
     * @return
     */
    List<CuMemberExt> listRecommend(Long pkMember);

    /**
     * 查询分享或空单并且没有订单会员列表
     *
     * @param param 查询条件
     * @return
     */
    List<CuMemberExt> listRetailMemberNotOrder(ShareRetailMemberParam param);

    /**
     * 删除会员
     *
     * @param pkMember 删除会员ID
     * @param userId   当前会员
     */
    void shareDelete(Long pkMember, Long userId);

    /**
     * 删除伞下会员
     *
     * @param memberList 删除会员列表
     * @param userId     当前会员
     */
    void shareParentDelete(List<CuMember> memberList, Long userId);

    /**
     * 校验有订单的会员
     *
     * @param pkMemberList 会员ID列表
     * @return
     */
    List<Long> checkMemberOrder(List<Long> pkMemberList);

    /**
     * 查询多会员是否在血缘伞下
     *
     * @param pkMember   会员ID
     * @param memberType 会员类型
     * @return BdTradeWhiteConfig
     */
    BdTradeWhiteConfig selectMemberByUnderBlood(Long pkMember, Integer memberType);

    /**
     * 获取用户体系分享图片
     *
     * @return
     */
    String getSharePosterImage();

    /**
     * 查询汇总
     *
     * @param censusSummaryParam 表格名称
     * @return
     */
    List<CensusSummaryVo> selectCensusSummary(CensusSummaryParam censusSummaryParam, List<String> days);

}
