package com.hzs.report.member.service;

import com.hzs.report.member.param.ProductDetailQueryParam;
import com.hzs.report.member.vo.*;

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

public interface MemberReportService {

    /**
     * 查询伞下直推新增业绩-查询会员
     *
     * @return
     */
    List<DirectPushNewVo> directPushNewList(List<String> memberCodeList, Integer pkCountry,
                                            Date startPayTime, Date endPayTime);

    /**
     * 查询伞下直推新增业绩-业绩
     **/
    List<DirectPushNewVo> directPushNewAchieList(DirectPushNewVo dpo, List<Long> pkMemberList);

    /**
     * 查询会员总盒数
     **/
    List<DirectPushBoxVo> directPushNewBoxList(DirectPushBoxVo dpb, List<DirectPushBoxVo> dpbList);

    /**
     * 查询伞下直推新增业绩-业绩
     **/
    List<DirectPushNewVo> directPushNewAchieUpList(DirectPushNewVo dpo,
                                                   List<Long> pkMemberList);

    /**
     * 用户消费统计
     *
     * @param memberCode   用户编号
     * @param memberName   用户姓名
     * @param startPayTime 开始支付时间
     * @param endPayTime   结束支付时间
     * @param pkWares      商品主键
     * @return
     */
    List<MemberConsumptionVo> memberConsumptionList(String memberCode, String memberName, Date startPayTime, Date endPayTime, Integer pkWares);

    /**
     * 伞下新增安置业绩
     *
     * @return
     */
    List<MemberResettleAchieveVo> memberResettleAchieve(Long pkMember, String memberName, Date startPayTime, Date endPayTime, Integer pkVertex, Integer pkTeamCode, Integer pkCountry, Integer pkAwards, List<Integer> orderTypeList);

    /**
     * 查询伞下新增安置业绩
     **/
    List<MemberResettleAchieveVo> selectBrollyNewABAchieve(Long pkMember, String memberName, Date startPayTime, Date endPayTime, Integer pkVertex,
                                                           Integer pkTeamCode, Integer pkCountry, Integer pkAwards, String achieveTableName, int period);

    /**
     * 订单币种查询
     *
     * @param memberCode 会员编号
     * @param memberName 会员名称
     * @param orderCode  订单编号
     * @param orderType  订单类型
     * @return
     */
    List<OrderCurrencyVo> getOrderCurrencyList(String memberCode, String memberName, String orderCode, Integer orderType);

    /**
     * 查询订单币种
     *
     * @param orderCodeList
     * @return
     */
    List<MemberTradeVo> getBySourceCodeMemberTradeList(List<String> orderCodeList);

    /**
     * 查询省订单
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pkCountry 所属国家
     * @return
     */
    List<OrderDistribution> getByProvinceOrderDistribution(Date startTime, Date endTime, Integer pkCountry);

    /**
     * 查询市订单
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pkCountry 所属国家
     * @return
     */
    List<OrderDistribution> getByCityOrderDistribution(Date startTime, Date endTime, Integer pkCountry);

    /**
     * 查询区县订单
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pkCountry 所属国家
     * @return
     */
    List<OrderDistribution> getByDistrictOrderDistribution(Date startTime, Date endTime, Integer pkCountry);

    /**
     * 出货明细汇总
     *
     * @param productName
     * @param pkClassify
     * @return
     */
    List<ProductOrderInfoVo> getProductOrderInfo(String productName, Integer pkClassify, Date startTime, Date endTime, Integer pkCountry, List<Integer> orderTypeList);

    /**
     * 报单汇总
     *
     * @return
     */
    List<ReportSummaryVo> reportSummaryList(ReportSummaryVo reportSummaryVo);


    /**
     * 出货明细汇总统计详情
     *
     * @param pkProduct
     * @param productName
     * @return
     */
    List<ProductShippingDetailsInfoVo> productShippingDetailsList(Integer pkProduct, String productName, Integer pkClassify, Integer pkAwards, List<Integer> orderTypeList, Date startTime, Date endTime, Integer pkCountry);

    /**
     * 产品明细查询
     *
     * @param productDetailQueryParam
     * @return
     */
    List<ProductDetailQueryVo> productDetailQueryList(ProductDetailQueryParam productDetailQueryParam);

    /**
     * 小区新增业绩
     *
     * @param addAchieveVO 入参
     * @return List<SmallAreaNewAddAchieveVO>
     */
    List<SmallAreaNewAddAchieveVO> selectSmallAreaNewAdd(SmallAreaNewAddAchieveVO addAchieveVO);


    /**
     * 查询伞下钱包明细
     *
     * @param walletVO 入参
     * @return List<CuMemberWalletVO>
     */
    List<CuMemberWalletVO> selectMemberUnderWalletList(CuMemberWalletVO walletVO);

    /**
     * 查询商品统计信息
     *
     * @param
     * @return
     */
    List<ProductSaleStatVo> productSaleStatList(String skuCode, String productName, Integer orderType, Date startTime, Date endTime, Integer pkCountry);

    /**
     * 统计产品所有汇总
     *
     * @param productName
     * @param pkClassify
     * @param startTime
     * @param endTime
     * @param pkCountry
     * @param orderTypeList
     * @return
     */
    Integer sumQuantity(String productName, Integer pkClassify, Date startTime, Date endTime, Integer pkCountry, List<Integer> orderTypeList);

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

    /**
     * 查询会员大小区业绩
     **/
    DirectPushNewVo sizeZoneAchie(DirectPushNewVo dpo, Long pkMember, BigDecimal rate);

    /**
     * 查询会员大小区金额业绩
     **/
    DirectPushNewVo sizeZoneAchieAmount(DirectPushNewVo dpo, Long pkMember, BigDecimal rate);

    /**
     * 定时任务批量处理统计会员以及伞下金额业绩盒数
     **/
    void pushAmountBoxmethod();

    /**
     * 定时任务7天重算直推会员金额业绩盒数
     **/
    void repeatPushAmountBoxmethod(String startDateStr, String endDateStr);

    /**
     * 初始化会员直推金额业绩盒数统计数据
     **/
    void washMemberAmountBox(String startDateStr, String endDateStr);

    /**
     * 查询会员大小区盒数
     *
     * @param pkMember 会员ID
     * @return CuMemberRetailAchieveVO
     */
    DirectPushBoxVo sizeZoneBox(DirectPushBoxVo dpbVo, String memberCode, Long pkMember);

    /**
     * 查询会员是否激活
     **/
    List<DirectPushBoxVo> selectMemberActiveState(DirectPushBoxVo dpbVo, List<Long> pkMemberList);

    /**
     * 查询直推会员信息
     **/
    List<DirectPushNewVo> querDirectPushDetails(DirectPushNewVo directPushNewVo);

    /**
     * 创建表
     **/
    void createCuMemberAmountBoxTable(String tabeName);
}
