package com.hzs.sale.order;

import com.hzs.common.core.domain.R;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
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.sale.order.SaOrderItems;
import com.hzs.sale.order.dto.*;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;

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

/**
 * 订单服务对外提供接口
 */
public interface ISaOrderServiceApi {

    /**
     * 查询时间范围内的所有订单，按照订单时间排序,只能用于奖金结算
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     */
    R<List<SaOrderExt>> listSaOrderByDay(Date startDate, Date endDate, String orderCode);

    /**
     * 查询时间范围内的所有订单，按照订单时间排序,只能用于奖金结算
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     */
    R<List<SaOrderExt>> queryRepeatSaOrderByDay(Date startDate, Date endDate);

    /*
     *  查询订单编号
     **/
    R<SaOrderExt> querySaOrderByDay(Date startDate, Date endDate, String orderCode);

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

    /**
     * 查询时间范围内的所有订单，按照订单时间排序，不查询删除的，用于云代奖金计算，只需要主表
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     */
    R<List<SaOrder>> querySaOrderByDayForCloud(Date startDate, Date endDate);

    /**
     * 计算复购券分享奖金，查询订单
     *
     * @param startDate     开始日期
     * @param endDate       结束日期
     * @param orderTypeList 订单类型
     * @param orderAmount   订单金额
     * @param orderAchieve  订单业绩
     */
    R<List<SaOrder>> querySaOrderByTimeForCouponShare(Date startDate, Date endDate, List<Integer> orderTypeList,
                                                      BigDecimal orderAmount, BigDecimal orderAchieve, Integer pkCountry);

    /**
     * 根据订单ID查询订单详细列表
     *
     * @param pkOrderList 订单ID列表 -- 必传
     * @param pkCountry   国家ID -- 非必传
     * @return
     */
    R<List<SaOrderItemsExt>> queryOrderItemsListByOrderId(List<Long> pkOrderList, Integer pkCountry);

    /**
     * 根据订单编号查询订单
     *
     * @param pkMember  会员主键
     * @param orderCode 订单编号
     */
    R<BigDecimal> querySaOrderByOrderCode(Long pkMember, String orderCode);

    /**
     * 根据订单编号查询订单信息
     *
     * @param orderCode 订单编号
     * @param pkMember  会员主键
     * @return
     */
    R<SaOrderExt> queryOrderByCode(String orderCode, Long pkMember);

    /**
     * 在线支付回调方法
     *
     * @param pkMember  订单编号
     * @param orderCode 订单编号
     */
    R<Boolean> onlinePaymentCallBack(Long pkMember, String orderCode);

    /**
     * 空单注册审核通过
     *
     * @param approvalBusinessResultDTO
     * @return
     */
    R<Boolean> regEmptyOrderApproved(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 空单注册审核驳回
     *
     * @param approvalBusinessResultDTO
     * @return
     */
    Boolean regEmptyOrderReject(ApprovalBusinessResultDTO approvalBusinessResultDTO);

    /**
     * 自助服务-修改收货地址
     **/
    R<Boolean> updateOrder(SaOrder saOrder);

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

    /**
     * 定时关单  订单三十分钟未支付自动关闭
     */
    void closeOrder();

    /**
     * 根据订单类型查询当天已支付订单信息
     **/
    R<List<SaOrder>> querySaOrderByOrderType(String payTime);

    /*
     *  查询订单某段时间累计金额，累计业绩
     **/
    R<SaOrder> queryOrderTotalAchieveByTime(Date startDate, Date endDate);

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

    /**
     * 自助服务-修改收货地址订单列表
     **/
    R<List<SaOrderExt>> selfAddressOrderList(String orderCode, Integer editType, Long memberId, Integer pkCountry);

    /**
     * 查询邮费
     **/
    R<OrderParamDTO> queryPostageByParam(OrderParamDTO orderParam);

    /**
     * 批量保存订单
     *
     * @param orderList      订单列表（需要pk_id）
     * @param orderItemsList 订单明细列表
     * @return
     */
    R<?> saveOrderBatch(List<SaOrder> orderList, List<SaOrderItems> orderItemsList);

    /**
     * 查询注册订单数量
     *
     * @param memberCodeList
     * @return
     */
    List<MemberFirstOrderDTO> checkMemberIsFirstOrder(List<String> memberCodeList);

    /**
     * 验证会员账户余额，是否够支付
     *
     * @param cuMemberAccount 会员账户
     * @param saOrder         订单信息
     * @param orderItemList
     * @return
     */
    R<CuMemberAccountExt> queryOrderSpendDetails(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, List<SaOrderItems> orderItemList);

    /**
     * 查询订单单品统计
     *
     * @return
     */
    List<SingleItemStatDTO> singleItemStat(SingleItemStatParamDTO singleItemStatParamDTO);

}
