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.order.SaOrder;
import com.hzs.common.domain.sale.order.SaOrderItems;
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>> querySaOrderByDay(Date startDate, Date endDate);

    /*
     *  根据主键查询订单
     **/
    R<SaOrder> querySaOrderExtByPkId(Long pkId);

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

    /**
     * 查询有效时间范围内的订单,用于查询个人之前买过的订单用于计算店铺收益
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     */
    R<List<SaOrderExt>> queryDeliverySaOrderByDay(Date startDate, Date endDate);

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

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

    /**
     * 根据订单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);

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

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

    /**
     * 保存订单信息返回ID
     *
     * @param saOrder    订单
     * @param orderItems 订单详情
     * @return R<Long>
     */
    R<Long> saveOrderInfo(SaOrder saOrder, SaOrderItems orderItems);


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

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

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

    /*
     *  根据订单对订单进行发货，公司发到店铺
     **/
    R<Boolean> sendDeliverBySaOrder(List<SaOrderExt> saOrderExtList, Long pkMember);

    /*
     *  查询店铺自提、店铺配送未发货订单，用于店铺发货界面
     **/
    R<List<SaOrderExt>> queryStoreSaOrderByParam(List<Long> orderItemIdList);

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

}
