package com.hzs.sale.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.sale.ext.SaDeliverItemsExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.common.domain.sale.ext.SaOrderItemsExt;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.sale.deliver.param.DeliverSecondParam;
import com.hzs.sale.deliver.vo.DeliverSecondVO;
import com.hzs.sale.index.vo.CuMemberMyMarketDetailVO;
import com.hzs.sale.index.vo.CuMemberMyMarketVO;
import com.hzs.sale.order.param.*;
import com.hzs.sale.order.vo.*;
import org.apache.ibatis.annotations.Param;

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

/**
 * Mapper 接口
 */
public interface SaOrderMapper extends BaseMapper<SaOrder> {

    /**
     * 查询会员注册、升级累计消费的业绩，用于计算海外升级
     *
     * @param memberCode 会员编号
     */
    SaOrderVO queryTotalOrderAchieve(String memberCode);

    /**
     * 根据查询条件查询销售订单
     *
     * @param orderQueryParam 查询条件
     */
    List<SaOrderVO> querySaOrderByCondition(OrderQueryParam orderQueryParam);

    /**
     * 批量更新订单发货方式
     *
     * @param idList      订单ID殂
     * @param deliveryWay 发货方式
     * @param userId
     * @return
     */
    int updateDeliveryWayBatch(@Param("idList") List<Long> idList,
                               @Param("deliveryWay") Integer deliveryWay,
                               @Param("userId") Long userId);

    /*
     *  批量撤单
     **/
    void updateSaOrderByMember(@Param("memberList") List<Long> memberList, @Param("pkApprove") Long pkApprove, @Param("currentDateTime") Date currentDateTime);

    /**
     * 查询时间范围内的订单，需要查询出del_flag = 1的值
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     */
    List<SaOrderExt> querySaOrderByTime(@Param("startDate") Date startDate, @Param("endDate") Date endDate,
                                        @Param("orderCode") String orderCode);

    /**
     * 查询有效时间范围内的订单,用于查询个人之前买过的订单用于计算加权积分分红
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     */
    List<SaOrderExt> querySaOrderByEffectiveDay(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询有效时间范围内的订单,用于查询个人之前买过的订单用于计算加权积分分红
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     */
    List<SaOrderExt> queryDeliverySaOrderByDay(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询总销售金额
     *
     * @return BigDecimal
     */
    BigDecimal selectSum();

    /**
     * 根据订单id查询订单
     *
     * @param pkId      订单ID（必传）
     * @param pkCountry 所属国家（非必传）
     * @return SaOrderExt
     */
    SaOrderExt queryOrderByPkId(@Param("pkId") Long pkId,
                                @Param("pkCountry") Integer pkCountry);

    /**
     * 根据订单编号查询订单
     *
     * @param orderCode 订单编号（必传）
     * @param pkCountry 所属国家（非必传）
     * @return SaOrderExt
     */
    SaOrderExt queryOrderByCode(@Param("orderCode") String orderCode,
                                @Param("pkCountry") Integer pkCountry);

    /**
     * 根据订单编号批量查询订单以及详情
     *
     * @param orderCodeList 订单编号列表（必传）
     * @param pkCountry     所属国家（非必传）
     * @return List<SaOrderExt>
     */
    List<SaOrderExt> queryOrderListByCodeList(@Param("orderCodeList") List<String> orderCodeList,
                                              @Param("pkCountry") Integer pkCountry);

    /**
     * 根据订单ID批量查询订单以及详情
     *
     * @param orderIdList 订单ID列表（必传）
     * @param pkCountry   所属国家（非必传）
     * @return List<SaOrderExt>
     */
    List<SaOrderExt> queryOrderListByIdList(@Param("orderIdList") List<Long> orderIdList,
                                            @Param("pkCountry") Integer pkCountry);

    /**
     * 我的订单列表（前台）
     *
     * @param param     查询参数
     * @param memberId  用户ID
     * @param pkCountry 所属国家
     * @return List<SaOrderExt>
     */
    List<SaOrderExt> myOrderList(@Param("param") MyOrderParam param,
                                 @Param("memberId") Long memberId,
                                 @Param("pkCountry") Integer pkCountry);

    /**
     * 我的订单数量（前台）
     *
     * @param statusList 状态列表
     * @param memberId   用户ID
     * @param pkCountry  所属国家
     * @return int
     */
    int myOrderNum(@Param("statusList") List<Integer> statusList,
                   @Param("memberId") Long memberId,
                   @Param("pkCountry") Integer pkCountry);

    /**
     * 订单打印（前台）
     *
     * @param orderCode 订单编号
     * @param memberId  用户ID
     * @param pkCountry 所属国家
     * @return MyOrderPrintVO
     */
    MyOrderPrintVO orderPrint(@Param("orderCode") String orderCode,
                              @Param("memberId") Long memberId,
                              @Param("pkCountry") Integer pkCountry);

    /**
     * 订单业务列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家
     * @return List<OrderBusinessVO>
     */
    List<OrderBusinessVO> queryOrderBusinessList(@Param("param") OrderBusinessParam param,
                                                 @Param("pkCountry") Integer pkCountry);

    /**
     * 商品订单接口
     */
    List<WaresOrderVo> selectByOrderInfoList(WaresOrderParam waresOrderParam);

    /**
     * 查询订单以及会员信息
     *
     * @param orderTypeList 订单类型列表（非必传）
     * @param pkMemberList  会员列表（非必传）
     * @param orderCodeList 订单编号列表（非必传）
     * @param pkCountry     所属国家（非必传）
     * @return List<SaOrderExt>
     */
    List<SaOrderExt> queryOrderMemberInfo(@Param("orderTypeList") List<Integer> orderTypeList,
                                          @Param("pkMemberList") List<Long> pkMemberList,
                                          @Param("orderCodeList") List<String> orderCodeList,
                                          @Param("pkCountry") Integer pkCountry);

    /**
     * 根据明细查询订单信息
     *
     * @param orderStatusList 订单状态列表（非必传）
     * @param pkMemberList    会员列表（非必传）
     * @param pkCountry       所属国家（非必传）
     * @return List<SaOrder>
     */
    List<SaOrder> queryOrderInfoByDetail(@Param("orderStatusList") List<Integer> orderStatusList,
                                         @Param("pkMemberList") List<Long> pkMemberList,
                                         @Param("pkCountry") Integer pkCountry);

    /**
     * 查询选择订单列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家 -- 非必传
     * @return List<SaOrderItemsExt>
     */
    List<SaOrderItemsExt> queryOrderSelect(@Param("param") OrderSelectParam param, @Param("pkCountry") Integer pkCountry);

    /**
     * 定时关单  订单三十分钟未支付自动关闭
     */
    void closeOrder(@Param("pkCountry") Integer pkCountry, @Param("data") String data, @Param("orderType") Integer orderType);

    List<SaOrder> selectCancelableOrder(@Param("pkCountry") Integer pkCountry, @Param("data") String data, @Param("orderType") Integer orderType);

    /**
     * 统计用户pv
     *
     * @param startPayDate 开始支付时间
     * @param endPayDate   结束支付时间
     * @param memberId     会员id
     * @return
     */
    BigDecimal selectBySumPv(@Param("startPayDate") Date startPayDate, @Param("endPayDate") Date endPayDate, @Param("memberId") Long memberId);

    /**
     * 统计用户金额
     *
     * @param startPayDate 开始支付时间
     * @param endPayDate   结束支付时间
     * @param memberId     会员id
     * @return
     */
    BigDecimal selectBySumAmount(@Param("startPayDate") Date startPayDate, @Param("endPayDate") Date endPayDate, @Param("memberId") Long memberId);

    /**
     * 查询订单类型
     *
     * @param memberId  会员ID
     * @param pkCountry 所属国家
     * @return
     */
    List<Integer> queryOrderType(@Param("memberId") Long memberId, @Param("pkCountry") Integer pkCountry);

    /**
     * 二次发货列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家
     * @return
     */
    List<DeliverSecondVO> secondList(@Param("param") DeliverSecondParam param, @Param("pkCountry") Integer pkCountry);

    /**
     * 会员首页我的市场
     *
     * @param pkMember  用户ID
     * @param pkCountry 国家ID
     * @return
     */
    CuMemberMyMarketVO selectMyMarket(@Param("pkMember") Long pkMember, @Param("pkCountry") Integer pkCountry);

    /**
     * 会员首页我的市场
     *
     * @param pkMember  用户ID
     * @param pkCountry 国家ID
     * @return
     */
    List<CuMemberMyMarketDetailVO> selectMyMarketDetail(@Param("pkMember") Long pkMember, @Param("pkCountry") Integer pkCountry);

    /**
     * 查询当天已支付订单信息
     **/
    List<SaOrder> querySaOrderByOrderType(@Param("payTime") String payTime);

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

    /**
     * 批量插入订单数据
     *
     * @param orderList 订单列表
     * @return
     */
    int insertBach(@Param("orderList") List<SaOrder> orderList);

    /**
     * 查询会员店铺订单
     *
     * @param param
     * @param pkStore
     * @param pkCountry
     * @return
     */
    List<SaOrderExt> myStoreOrderList(@Param("param") MyOrderParam param,
                                      @Param("pkStore") Integer pkStore,
                                      @Param("pkCountry") Integer pkCountry);

    /**
     * 批量插入虚拟订单数据
     **/
    int insertUnrealOrderBach(@Param("orderList") List<SaOrder> orderList);

    /**
     * 查询升级金额以及业绩
     *
     * @param pkMember 会员ID
     * @return
     */
    SaOrderExt queryUpgradeAmountAndAchieve(@Param("pkMember") Long pkMember);

    /**
     * 查询会员订单总业绩
     *
     * @param pkMember
     * @return
     */
    BigDecimal getMemberOrderAchieve(@Param("pkMember") Long pkMember);

    /*
     *  根据发货单查询销售订单
     **/
    List<SaOrderExt> querySaOrderByDeliverList(@Param("deliverItemExtList") List<SaDeliverItemsExt> deliverItemExtList);

    /**
     * 查询店铺
     *
     * @param statusList
     * @param pkStore
     * @param pkCountry
     * @return
     */
    int getStoreNum(@Param("statusList") List<Integer> statusList,
                    @Param("pkStore") Integer pkStore,
                    @Param("pkCountry") Integer pkCountry);

    /*
     *  查询订单，存在可能已经撤单的
     **/
    SaOrder querySaOrderExtByPkId(Long pkId);

    /**
     * 获取订单PV总值
     *
     * @param pkMember     会员ID
     * @param notOrderCode 不存在订单编号
     * @return
     */
    SaOrder querySumAmountAndAchieve(@Param("pkMember") Long pkMember, @Param("notOrderCode") String notOrderCode);

    /*
     *  查询店铺自提、店铺配送未发货订单，用于店铺发货界面
     **/
    List<SaOrderExt> queryStoreSaOrderByParam(@Param("orderQueryParam") OrderQueryParam orderQueryParam);

    /**
     * 查询购买订单数量
     *
     * @param pkMember  会员ID
     * @param orderType 订单类型
     * @param year      年份
     * @return
     */
    int countOrderCountByYear(@Param("pkMember") Long pkMember, @Param("orderType") Integer orderType, @Param("year") String year);

}
