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.account.CuMemberAccount;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.ext.CuMemberExt;
import com.hzs.common.domain.member.ext.CuMemberSettleExt;
import com.hzs.common.domain.member.ext.MemberSettleTreeExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.member.base.controller.manager.UpdatePlaceParentPetitionParam;
import com.hzs.member.base.dto.NotActivePointDTO;
import com.hzs.member.base.dto.ShowWaresDTO;
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.param.MemberParam;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;

import java.math.BigDecimal;
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 会员编号的值
     * @return: CuMemberExt
     */
    List<CuMemberExt> getMemberInfoByCondition(CuMember cuMember);

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

    /*
     *  查询会员的部门
     **/
    List<Integer> queryMemberDept(Long pkMember);

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

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

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

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

    /**
     * 查询是否存在该会员的安置人、推荐人
     *
     * @param pkMember 会员主键
     */
    List<CuMember> queryCuMemberByPkId(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> 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 会员
     * @param isHaiFun 是否嗨粉
     */
    CuMember createMemberIdAndCode(CuMember cuMember, Boolean isHaiFun);

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

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

    List<CuMemberVO> queryCuMemberByMemberListExcel(CuMemberVO memberParam);

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

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

    /**
     * 批量生成会员编号
     *
     * @param pkCountry 所属国家
     * @param isHaiFun  是否嗨粉
     * @param quantity  生成数量
     * @return
     */
    List<String> createUserCodeBatch(Integer pkCountry, Boolean isHaiFun, Integer quantity);

    /**
     * 根据国家、会员编号查询会员信息
     *
     * @param memeberCodes 会员编号
     * @param pkCountry    国家ID
     * @return List<CuMember>
     */
    List<CuMember> findMemberByMembercodesAndPkcountry(List<String> memeberCodes, 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);

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

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

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

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

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

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

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

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

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

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

    /**
     * 批理更新会员姓名、手机号
     *
     * @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);

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

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

    /**
     * 后台设置推荐上下级
     *
     * @param memberSettleExtList 列表
     * @param memberSettleExt     顶点
     * @param settleTableName     查询表名
     * @param isMemberSecord      是否是当天秒结表
     * @return
     */
    List<Tree<String>> systemTjSetListTree(List<CuMemberSettleExt> memberSettleExtList, CuMemberSettleExt memberSettleExt, String settleTableName, Boolean isMemberSecord);

    /**
     * 特殊业务-修改结算国-审核通过
     **/
    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);

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

    /**
     * 后台安置列表
     *
     * @param list
     * @param memberSettleExt
     * @return
     */
    List<Tree<String>> systemAzSetListTree(List<CuMemberSettleExt> list, CuMemberSettleExt memberSettleExt);

    /**
     * 获取等级的翻译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 memberParam 参数
     */
    CuMember confirmShareMemberByMemberParam(MemberParam memberParam);

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

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

    /**
     * 查询会员memberCode是否存在于安置第一层
     *
     * @param pkPlaceParent
     * @param memberCode
     * @return
     */
    boolean getMemberPlaceParent(Integer pkPlaceParent, String memberCode);

    /**
     * 查询会员真实信息
     *
     * @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(List<String> memberCodes, Integer pkCountry);

    /**
     * 获取最新国家编号和国际编号
     **/
    void generateNumber(CuMember cuMember, Integer pkCountry);

    /**
     * 查询推荐列表
     *
     * @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 codeList           会员编号列表
     * @param checkEmpty         是否需要校验批量空单数据
     * @param excludeMemberEmpty 排除的批次
     * @return
     */
    Map<String, Integer> checkMemberCodeExist(Collection<String> codeList, Boolean checkEmpty, Long excludeMemberEmpty);

    /**
     * 根据用户编号、用户用户名查询用户信息
     *
     * @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 pkMember
     * @param memberCode
     * @return
     */
    Long checkPlaceSponsorUnderUmbrella(Long pkMember, String memberCode);

    /**
     * 查询最末安置人（根据会员编号）
     *
     * @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);

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

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

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

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

    /**
     * 兑换年金 （确定按钮）
     *
     * @param renewAmount   单价
     * @param number        数量
     * @param pkMember      会员
     * @param pkRate        汇率
     * @param expireDate    年金到期时间
     * @param cemberAccount 会员账户
     * @param payTime       奖金购买时间
     * @param memberCode    会员编号
     */
    void exchangeAnnuity(BigDecimal renewAmount, Integer number, Long pkMember, Integer pkRate, Date expireDate, CuMemberAccount cemberAccount, String memberCode, Integer pkAwards, Integer pkSettleGrade, Date payTime);

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

    /**
     * 查询会员业绩表
     *
     * @param settleTableName
     * @param pkMembers
     * @return
     */
    List<MemberSettleTreeExt> queryMemberSettle(String settleTableName, List<Long> pkMembers, Integer level);

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

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

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

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

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

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

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


    /**
     * 未激活点位确认
     **/
    NotActivePointVO notActiveRevokeBusiness(NotActivePointVO notActivePointVO);

    /**
     * 未激活点位发起签呈
     **/
    NotActivePointVO notActivePetition(NotActivePointVO notActivePointVO);

    /**
     * 未激活点位审核-审核通过、驳回
     **/
    boolean notActiveByBusinessNo(ApprovalBusinessResultDTO approvalBusinessResultDTO);


    /**
     * 未激活点位签呈列表
     **/
    List<NotActivePointDTO> notActiveByBusinessList(AnalysisBusinessAppealParam analysisBusinessAppealParam);

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

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


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

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

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

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

    /**
     * 安置架构网体(安置架构一(新))
     *
     * @param resultList
     * @param memberSettleExt
     * @return
     */
    List<Tree<String>> systemAzSetFirstListTree(List<CuMemberSettleExt> resultList, CuMemberSettleExt memberSettleExt);

    /**
     * 安置伞下人数
     *
     * @param pkMember
     * @return
     */
    Long selectByQuerySparentMemberCount(Long pkMember);

    /**
     * 更新奖金年金时间
     *
     * @param saOrder
     */
    void updateExpireDate(SaOrderExt saOrder);
}
