package com.hzs.sale.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.account.CuMemberAccount;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.common.domain.sale.ext.*;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.common.domain.sale.order.SaOrderItems;
import com.hzs.common.domain.system.config.BdGrade;
import com.hzs.common.domain.third.pay.ext.TOnlineRefundExt;
import com.hzs.sale.index.vo.CuMemberMyMarketVO;
import com.hzs.sale.order.param.*;
import com.hzs.sale.order.vo.*;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;

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

/**
 * 订单的service处理类
 */
public interface ISaOrderService extends IService<SaOrder> {

    /**
     * 根据订单编号查询订单
     *
     * @param saOrder 订单
     */
    SaOrder querySaleOrderByOrderCode(SaOrder saOrder);

    /**
     * 查询销售订单，携带订单表体
     *
     * @param saOrder    订单
     * @param itemIdList 订单明细主键
     */
    SaOrderExt querySaleOrderExtByOrderCode(SaOrder saOrder, List<Long> itemIdList);

    /**
     * 根据会员编号查找订单关系中订单信息,用于系统内部流转，不跟ui端交互
     *
     * @param pkCountry     国家
     * @param pkMember      会员编号
     * @param orderTypeList 订单类型
     * @param notOrderType  不处理订单类型
     */
    List<SaOrder> querySaleOrderByPkMember(Integer pkCountry, Long pkMember, List<Integer> orderTypeList, List<Integer> notOrderType);

    /**
     * 根据会员编号查找订单关系中订单信息,用于系统内部流转，不跟ui端交互
     *
     * @param pkCountry 国家
     * @param pkMember  会员编号
     */
    Integer querySaleOrderByPkMember(Integer pkCountry, Long pkMember);

    /**
     * 跟会员端进行交互的查询订单的方法
     *
     * @param orderQueryParam 交互参数
     */
    List<SaOrderVO> querySaleOrderByCondition(OrderQueryParam orderQueryParam);

    /**
     * 根据key值从redis中获取到会员信息
     *
     * @param pkId 会员主键
     */
    CuMember getCuMemberByKey(Long pkId);

    /**
     * 查询会员账户状态，账户信息
     *
     * @param cuMemberAccount 会员账户条件信息
     */
    List<CuMemberAccountExt> queryMemberAccountByCondition(CuMemberAccount cuMemberAccount);

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

    /**
     * 是否直接支付
     *
     * @param pkCountry   国家
     * @param specialArea 所属专区
     */
    boolean getIsToBePayByOrderType(Integer pkCountry, Integer specialArea);

    /**
     * 是否直接支付,待支付查询出剩余最大支付时间秒数
     *
     * @param pkCountry   国家
     * @param specialArea 所属专区
     */
    Long getIsToBePayTime(Integer pkCountry, Integer specialArea);

    /**
     * 查询邮费
     *
     * @param orderParam 前台传递的参数
     */
    void queryPostageByParam(OrderParam orderParam);

    /**
     * 根据订单编号执行订单撤销操作
     *
     * @param pkApprove             审核人
     * @param orderCancelParam      撤单参数
     * @param validateCancelOrderVO 订单
     */
    void revokeSaOrderByOrderCode(Long pkApprove, OrderCancelParam orderCancelParam, ValidateCancelOrderVO validateCancelOrderVO);

    /**
     * 自助撤单
     **/
    void selfRevokeOrder(Long pkApprove, MyOrderVO myOrderVO);

    /**
     * 生成空单注册
     *
     * @param orderBlankRegParams 参数
     */
    String registerEmptyOrder(OrderBlankRegParams orderBlankRegParams);

    /**
     * 获取系统参数
     *
     * @param pkCountry 国家
     * @param key       键
     */
    String querySystemConfigByKey(Integer pkCountry, String key);

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

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

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

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

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

    /**
     * 我的订单列表
     *
     * @param param     查询参数
     * @param memberId
     * @param pkCountry
     * @return
     */
    List<SaOrderExt> myOrderList(MyOrderParam param, Long memberId, Integer pkCountry);

    List<TOnlineRefundExt> queryRefundList();

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

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

    /**
     * 查询最新待发货订单
     **/
    String lastOrderList(Long memberId, Integer pkCountry);

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


    /**
     * 我的订单数量
     *
     * @param statusList 状态列表
     * @param memberId
     * @param pkCountry
     * @return
     */
    int myOrderNum(List<Integer> statusList, Long memberId, Integer pkCountry);

    /**
     * 我的订单确认收货
     *
     * @param pkOrder  订单ID
     * @param memberId 会员ID
     * @return
     */
    boolean myOrderConfirm(Long pkOrder, Long memberId);

    /**
     * 我的订单取消订单
     *
     * @param saOrder  订单
     * @param memberId 会员ID
     * @return
     */
    String myOrderCancel(SaOrder saOrder, Long memberId);

    /**
     * 订单业务列表
     *
     * @param param
     * @param pkCountry
     * @param systemType
     * @return
     */
    List<OrderBusinessVO> queryOrderBusinessList(OrderBusinessParam param, Integer pkCountry, Integer systemType);

    /**
     * 删除订单以及详情
     *
     * @param orderIdList 订单ID列表
     * @param userId      操作用户ID
     * @param pkCountry   所属国家 -- 非必传
     */
    void deleteOrderAndItems(List<Long> orderIdList, Long userId, Integer pkCountry);

    /**
     * 商品订单信息
     *
     * @param waresOrderParam
     * @return
     */
    List<WaresOrderVo> selectByOrderInfoList(WaresOrderParam waresOrderParam);

    /**
     * 订单开票列表
     *
     * @param param
     * @return
     */
    List<OrderInvoicingVO> listOrderInvoicing(OrderInvoicingParam param);

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

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

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

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

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

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

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

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

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

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

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

    /**
     * 根据编号查询会员首单
     *
     * @param memberCodeList
     * @return
     */
    List<MemberFirstOrderVo> checkMemberIsFirstOrder(List<String> memberCodeList);

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

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

    /**
     * 新零售校验会员账户余额是否足够
     *
     * @param cuMemberAccount
     * @param saOrder
     * @param orderItemList
     * @return
     */
    CuMemberAccountExt queryRetailOrderSpendDetails(CuMemberAccountExt cuMemberAccount, SaOrder saOrder, List<SaOrderItems> orderItemList);

    /**
     * 计算等级
     *
     * @return 返回 null 则为不满足升级条件
     */
    BdGrade calculateGrade();

}
