package com.bohuikeji.delivery.backstage.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bohuikeji.delivery.backstage.entity.TCourier;
import com.bohuikeji.delivery.backstage.entity.TOrder;
import com.bohuikeji.delivery.backstage.entity.open.vo.CourierVo;
import com.bohuikeji.frame.module.admin.base.ServiceBase;
import com.bohuikeji.frame.module.admin.entity.back.APIEntity;
import com.bohuikeji.frame.module.admin.entity.sys.SysUser;
import com.bohuikeji.frame.module.admin.entity.vo.AddressVo;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * <p>
 * 订单记录表 服务类
 * </p>
 *
 * @author 10552
 * @since 2019-08-22
 */
public interface ITOrderService extends ServiceBase<TOrder> {


    TOrder pickUpParts(TOrder order,Integer courierId);

    /**
     * 初始化订单
     * @param order
     * @return
     */
    Boolean saveplace(TOrder order);

    /**
     * 新版初始话订单
     * @param order
     * @return
     */
    boolean savePlaceNew(TOrder order);

    /**
     *下单支付返回订单
     * @param order
     * @return
     */
    TOrder initialOrder(TOrder order);

    /**
     * 算出订单的金额
     * @param order
     * @return
     */
    TOrder moneySum(TOrder order);

    /**
     * 计算订单金额新版接口
     * @param order
     * @return
     */
    TOrder moneySumNew(TOrder order);

    /**
     * 获取货拉拉订单计价
     * @param order
     * @return
     */
    //BigDecimal huoLalaOrderPrice(TOrder order);
    //TOrder extractExtracttwo(TOrder order);

    /**
     * 订单佣金计算
     * @param order
     * @return
     */
    TOrder extractExtract(TOrder order);

    /**
     * 订单佣金计算
     * @param order
     * @return
     */
    TOrder estimate(TOrder order);

    /**
     * 指派/转派订单
     * @param user
     * @param order
     * @param courier
     * @return
     */
    APIEntity pointCourier(SysUser user, TOrder order, TCourier courier);

    /**
     * 根据订单编号，获取订单
     * @param orderNum
     * @return
     */
    TOrder getByNum(String orderNum);

    /**
     * 配送大厅：根据派送员与订单距离排序
     * @param order
     * @param address
     * @return
     */
    BigDecimal getDistanceByOrder(TOrder order, AddressVo address);

    /**
     * 派送员App抢单后向客户推送订阅消息
     * @param tOrderid
     * @return
     */
    String post(Integer tOrderid,String dsc);

    /**
     * 客户取消订单，订阅消息推送
     * @param dec
     * @param order
     * @return
     */
    String cancelOrder(String dec,TOrder order);
    /**
     * 客户取消订单
     * @param tOrder
     */
    //void cancelOrder(TOrder tOrder);

    /**
     * 通知栏通知派送员
     * @param tOrder
     */
    void curAppPush(TOrder tOrder,String type,String dec);

    /**
     * 通知栏通知客户
     * @param tOrder
     */
    void customerAppPush(TOrder tOrder,String type,String deca);


    /**
     * 配送大厅显示规则(一)
     * @param queryWrapper
     * @param courier
     * @return
     */
    QueryWrapper<TOrder> getTF(QueryWrapper<TOrder> queryWrapper, TCourier courier);

    /**
     * 配送大厅显示规则(二)
     * @param queryWrapper
     * @param order
     * @param courier
     * @return
     */
    QueryWrapper<TOrder> getWrapper(QueryWrapper<TOrder> queryWrapper, TOrder order, TCourier courier);

    /**
     * 计算取件剩余时间
     * @param order
     * @return
     */
    LocalDateTime getSurplusTime(TOrder order);

    /**
     * 骑手接单后计算剩余取件时间
     * @param order
     * @return
     */
    LocalDateTime getCourSurplusTime(TOrder order);

    /**
     * 计算预计送达时间
     * @param order
     * @param orderDis
     * @return
     */
    LocalDateTime getExpectTime(TOrder order,long orderDis);

    /**
     * 取件送件超时扣费
     * @param order
     */
    TOrder updatePriceByTime(TOrder order);

    /**
     * 获取订单状态
     * @param orderId
     * @return
     */
    String getOrderStatus(Integer orderId);

    /**
     * 取消订单并退款
     * @param order
     */
    void cancelAndRefund(TOrder order);

    /**
     * 获取订单客户手机号
     * @param orderNum 订单号
     * @return 如客户有手机号则返回，没有则返回寄件人手机号
     */
    String getCustomerPhone(String orderNum);

    /**
     * 获取用户今日接单后取消的订单数量
     * @param customerId 客户ID
     * @return
     */
    int cancelOrderTimes(Integer customerId);

    /**
     * 货拉拉获取token
     * @return
     */
    String getHuolalaToken();

    /**
     * 麦芽田订单状态流转
     * @param courierVo
     * @param order
     */
    void satusFlow(CourierVo courierVo,TOrder order);

}
