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.common.domain.third.pay.ext.TOnlineRefundExt;
import com.hzs.sale.deliver.param.DeliverSecondParam;
import com.hzs.sale.deliver.vo.DeliverSecondVO;
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);

    /*
     *  批量撤单
     * @author: sui q
     * @date: 2023/7/27 16:04
     * @param: null null
     **/
    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> queryRepeatSaOrderByDay(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /*
     *  根据发货单查询销售订单
     * @author: sui q
     * @date: 2023/11/30 10:58
     * @param: null null
     **/
    List<SaOrderExt> querySaOrderByDeliverList(@Param("deliverItemExtList") List<SaDeliverItemsExt> deliverItemExtList);

    /**
     * 查询总销售金额
     *
     * @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);

    List<TOnlineRefundExt> queryRefundList(@Param("userId") Long userId);

    /**
     * 自助撤单列表
     **/
    List<SaOrderExt> selfRevokeOrderList(@Param("param") MyOrderParam param,
                                         @Param("memberId") Long memberId,
                                         @Param("pkCountry") Integer pkCountry);


    /**
     * 自助服务-可申请订单列表
     **/
    List<SaOrderExt> selfOrderList(@Param("param") MyOrderParam param,
                                   @Param("memberId") Long memberId,
                                   @Param("pkCountry") Integer pkCountry);

    String lastOrderList(@Param("memberId") Long memberId, @Param("pkCountry") Integer pkCountry);


    /**
     * 自助服务- 修改收货地址订单列表
     **/
    List<SaOrderExt> selfAddressOrderList(@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 param
     * @return
     */
    List<OrderInvoicingVO> listOrderInvoicing(OrderInvoicingParam param);

    /**
     * 查询订单以及会员信息
     *
     * @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 param     查询参数
     * @param pkCountry 所属国家 -- 非必传
     * @return List<SaOrderItemsExt>
     */
    List<SaOrderItemsExt> queryOrderSelect(@Param("param") OrderSelectParam param, @Param("pkCountry") Integer pkCountry);

    /**
     * 定时关单  订单三十分钟未支付自动关闭
     */
    int 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);

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

    /*
     *  查询满足复购分享收益的订单
     **/
    List<SaOrder> querySaOrderByTimeForCouponShare(@Param("startDate") Date startDate, @Param("endDate") Date endDate,
                                                   @Param("orderTypeList") List<Integer> orderTypeList, @Param("orderAmount") BigDecimal orderAmount,
                                                   @Param("orderAchieve") BigDecimal orderAchieve, @Param("pkCountry") Integer pkCountry);

    /**
     * 二次发货列表
     *
     * @param param     查询参数
     * @param pkCountry 所属国家
     * @return
     */
    List<DeliverSecondVO> secondList(@Param("param") DeliverSecondParam param, @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 memberCodeList
     * @return
     */
    List<MemberFirstOrderVo> checkMemberIsFirstOrder(@Param("memberCodeList") List<String> memberCodeList);

    /**
     * 查询最新注册订单或升级订单
     *
     * @param pkMember  会员ID
     * @param pkCountry 所属国家
     * @return
     */
    SaOrder queryLastRegisterOrUpdate(@Param("pkMember") Long pkMember, @Param("pkCountry") Integer pkCountry);

    /**
     * 根据订单ID查询订单信息
     *
     * @param pkOrder   订单ID（与订单编号二选一）
     * @param orderCode 订单编号（与订单ID二选一）
     * @param pkCountry 所属国家（可为空）
     * @return
     */
    SaOrderExt queryByPkIdOrCode(@Param("pkOrder") Long pkOrder, @Param("orderCode") String orderCode, @Param("pkCountry") Integer pkCountry);


    /**
     * 查询订单单品统计
     *
     * @return
     */
    List<SingleItemStatVo> singleItemStat(SingleItemStatParam singleItemStatParam);

    /**
     * 根据订单类型和商品编码查询列表
     *
     * @param pkMember      会员ID（必填）
     * @param orderTypeList 订单类型列表（必填）
     * @param waresCodeList 商品编码列表（必填）
     * @return
     */
    List<SaOrder> listByOrderTypeAndWaresCode(@Param("pkMember") Long pkMember,
                                              @Param("orderTypeList") List<Integer> orderTypeList,
                                              @Param("waresCodeList") List<String> waresCodeList);

    /**
     * 根据主键列表更新订单明细，删除部分退的订单
     *
     * @param pkOrder     订单明细
     * @param pkApprove   审核人
     * @param currentDate 更新时间
     */
    Boolean updateOrderById(@Param("pkOrder") Long pkOrder, @Param("pkApprove") Long pkApprove, @Param("currentDateTime") Date currentDate);
}
