package com.tmerclub.cloud.order.mapper;

import com.tmerclub.cloud.common.database.util.PageAdapter;
import com.tmerclub.cloud.common.mongodb.bo.order.MongoOrderBO;
import com.tmerclub.cloud.common.order.bo.EsOrderBO;
import com.tmerclub.cloud.common.order.bo.OrderStatusBO;
import com.tmerclub.cloud.common.order.dto.OrderDTO;
import com.tmerclub.cloud.common.order.dto.OrderSearchDTO;
import com.tmerclub.cloud.common.order.vo.*;
import com.tmerclub.cloud.order.bo.SubmitOrderPayAmountInfoBO;
import com.tmerclub.cloud.order.model.Order;
import com.tmerclub.cloud.order.vo.OrderAndPreSaleVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 订单信息
 *
 * @author tmerclub
 * @date 2020-12-05 14:13:50
 */
public interface OrderMapper {

    /**
     * 根据订单信息id获取订单信息
     *
     * @param orderId 订单信息id
     * @return 订单信息
     */
    Order getByOrderId(@Param("orderId") Long orderId);

    /**
     * 更新订单信息
     *
     * @param order 订单信息
     */
    void update(@Param("order") Order order);

    /**
     * 根据订单信息id删除订单信息
     *
     * @param orderId
     */
    void deleteById(@Param("orderId") Long orderId);

    /**
     * 批量保存订单数据
     *
     * @param orders
     */
    void saveBatch(@Param("orders") List<Order> orders);

    /**
     * 查询订单状态
     *
     * @param orderIds 多个订单的订单id
     * @return 订单状态列表
     */
    List<OrderStatusBO> getOrdersStatus(@Param("orderIds") List<Long> orderIds);

    /**
     * 计算订单实际金额
     *
     * @param orderIds 多个订单的订单id
     * @return 订单实际金额总和
     */
    List<OrderAndPreSaleVO> listOrderActualAmount(@Param("orderIds") List<Long> orderIds);

    /**
     * 将订单改为已支付状态
     *
     * @param orderStatus 订单信息
     * @param payType     支付方式
     * @param paySysType
     */
    void updateByToPaySuccess(@Param("orderStatus") OrderStatusBO orderStatus, @Param("payType") Integer payType, @Param("paySysType") Integer paySysType);

    /**
     * 获取订单中的金额信息，不包含退款
     *
     * @param orderIds 多个订单的订单id
     * @return 获取订单中的金额信息
     */
    List<OrderSimpleAmountInfoBO> getOrdersSimpleAmountInfo(@Param("orderIds") List<Long> orderIds);

    /**
     * 取消订单
     *
     * @param orderIds 订单ids
     * @return
     */
    int cancelOrders(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单号和用户id获取订单
     *
     * @param orderId orderId
     * @param userId  userId
     * @return Order
     */
    Order getOrderByOrderIdAndUserId(@Param("orderId") Long orderId, @Param("userId") Long userId);

    /**
     * 根据订单号和自提点id获取订单
     *
     * @param orderId   orderId
     * @param stationId stationId
     * @return Order
     */
    Order getOrderByOrderIdAndStationId(@Param("orderId") Long orderId, @Param("stationId") Long stationId);

    /**
     * 注意：如果你无法理解下面这句话的话，请不要随意更改里面的sql
     * 众所周知，确认收货之后是不能改变状态的，
     * 但是确认收货之前是可以改变状态的，如果在确认收货之前，
     * 也就是下面这条sql执行之前进行了订单状态的改变（比如退款），那会造成不可预知的后果，
     * 所以更新订单状态的时候也要在条件当中加上订单状态，确定这条sql是原子性的
     * 这里的确认收货，条件加上订单的状态，确保这次更新是幂等的
     *
     * @param orderId
     * @return
     */
    int receiptOrder(@Param("orderId") Long orderId);

    /**
     * 根据订单号删除订单
     *
     * @param orderId 订单号
     */
    void deleteOrder(@Param("orderId") Long orderId);

    /**
     * 根据订单号和店铺id获取订单
     *
     * @param orderId orderId
     * @param shopId  shopId
     * @return Order
     */
    Order getOrderByOrderIdAndShopId(@Param("orderId") Long orderId, @Param("shopId") Long shopId);

    /**
     * 获取订单和订单项的数据
     *
     * @param orderId
     * @param shopId
     * @return
     */
    Order getOrderAndOrderItemData(@Param("orderId") Long orderId, @Param("shopId") Long shopId);

    /**
     * 根据订单id列表获取订单金额信息
     *
     * @param orderIdList 订单id列表
     * @return
     */
    SubmitOrderPayAmountInfoBO getSubmitOrderPayAmountInfo(@Param("orderIdList") long[] orderIdList);

    /**
     * 获取订单需要保存到es中的数据
     *
     * @param orderId 订单id
     * @return
     */
    EsOrderBO getEsOrder(@Param("orderId") Long orderId);

    /**
     * 计算每个订单状态的状态数量
     *
     * @param userId 用户id
     * @return
     */
    OrderCountVO countNumberOfStatus(@Param("userId") Long userId);

    /**
     * 获取订单的创建状态，给秒杀提供查询是否已经创建订单成功的功能
     *
     * @param orderId 订单id
     * @return
     */
    int countByOrderId(Long orderId);

    /**
     * 将订单更新为待成团状态
     *
     * @param orderIds   需要更新的订单id
     * @param payType    支付方式
     * @param paySysType
     */
    void updateByToGroupPaySuccess(@Param("orderIds") List<Long> orderIds, @Param("payType") Integer payType, @Param("paySysType") Integer paySysType);

    /**
     * 将预售订单更新为预售队赢状态
     *
     * @param orderIds 需要更新的订单id
     * @param status   订单未更新前状态
     */
    void updateByToPreSaleSuccess(@Param("orderIds") List<Long> orderIds, @Param("status") Integer status);

    /**
     * 将自提订单更新为待收货(已自提)状态
     *
     * @param orderIds 需要更新的订单id
     */
    void updateByToStatinoSuccess(@Param("orderIds") List<Long> orderIds);

    /**
     * 更新团购订单到待发货状态
     *
     * @param orderMold
     * @param orderIds  订单ids
     */
    void updateGroupOrderSuccessStatus(@Param("orderMold") Integer orderMold, @Param("orderIds") List<Long> orderIds);

    /**
     * 将订单标记为已结算状态
     *
     * @param orderIds 订单ids
     * @return 变更数量
     */
    int settledOrder(@Param("orderIds") List<Long> orderIds);

    /**
     * 获取订单及订单项的列表信息
     *
     * @param orderId 订单id
     * @return 订单信息
     */
    EsOrderBO getEsOrderInfo(@Param("orderId") Long orderId);

    /**
     * 批量修改订单采购信息
     *
     * @param order 订单信息
     */
    void updateWaitPurchase(@Param("order") Order order);

    /**
     * 获取正常状态的订单数量
     *
     * @param orderIds 订单ids
     * @return 订单详情
     */
    Integer countNormalOrderByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 更新订单时间，用于更新es数据，发票使用
     *
     * @param orderId
     */
    void updateOrderTime(@Param("orderId") Long orderId);

    /**
     * 修改订单分销金额
     *
     * @param orders 订单
     */
    void updateDistributionAmount(@Param("order") Order order);

    /**
     * 根据订单id获取发货需要的信息
     *
     * @param orderId
     * @return
     */
    Order getDeliveryInfoByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取指定的预售订单
     *
     * @param orderId
     * @return
     */
    OrderAndPreSaleVO getBalanceTimeExpireByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取用户的第一笔支付订单id
     *
     * @param userId
     * @param supplierId
     * @param orderId
     * @return
     */
    MongoOrderBO getUserFirstUserOrder(@Param("userId") Long userId, @Param("supplierId") Long supplierId, @Param("orderId") Long orderId);

    /**
     * 获取活动订单的支付信息列表
     *
     * @param orderId
     * @return
     */
    OrderActivityVO getActivityOrderInfo(Long orderId);


    /**
     * 获取活动订单的支付信息
     *
     * @param activityId   活动id
     * @param activityType 活动类型
     * @param spuId        商品id
     * @param userId       用户id
     * @return
     */
    Integer getUserBuyNumByActivityId(@Param("activityId") Long activityId, @Param("activityType") Integer activityType, @Param("spuId") Long spuId, @Param("userId") Long userId);


    /**
     * 根据订单集合获取对应用户
     *
     * @param orderIds
     * @return
     */
    List<EsOrderVO> getUserByOrderIdList(@Param("orderIds") List<Long> orderIds);

    /**
     * 获取订单分页的订单id列表
     *
     * @param orderSearchDTO
     * @return
     */
    Long countPageOrderIds(@Param("orderSearchDTO") OrderSearchDTO orderSearchDTO);

    /**
     * 获取订单分页的订单id列表
     *
     * @param orderSearchDTO
     * @return
     */
    List<Long> pageOrderIds(@Param("orderSearchDTO") OrderSearchDTO orderSearchDTO, @Param("page") PageAdapter pageAdapter);

    /**
     * 订单列表（用户端）
     *
     * @param orderIds
     * @param lang
     * @return
     */
    List<EsOrderVO> userOrderList(@Param("orderIds") List<Long> orderIds, @Param("lang") Integer lang);

    /**
     * 查询指定的订单及订单项列表
     *
     * @param orderIds
     * @return
     */
    List<OrderVO> listOrderAndOrderItemByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据信息获取
     *
     * @param orderIds
     * @return
     */
    List<OrderVO> listOrderAndLangByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 获取待自提的订单
     *
     * @param orderIdList 订单编号列表
     * @param userId      用户id
     * @param stationId   自提点id
     * @return 订单列表
     */
    List<OrderVO> getStationOrderByOrderIds(@Param("orderIdList") List<Long> orderIdList, @Param("userId") Long userId, @Param("stationId") Long stationId);

    /**
     * 获取自提点订单列表
     *
     * @param orderDTO
     * @return
     */
    List<OrderVO> listStationOrder(@Param("orderDTO") OrderDTO orderDTO);

    /**
     * 获取待采购订单和支付定金未支付尾款的订单Ids
     *
     * @param paySysType
     * @return 订单Ids
     */
    List<OrderVO> listWaitPurchaseAndUnPayBalanceOrderIds(@Param("paySysType") Integer paySysType);

    /**
     * 查询指定订单数据列表
     *
     * @param orderIds
     * @return
     */
    List<OrderVO> listOrderByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 保存cue订单
     *
     * @param order 参数
     */
    void saveCueOrder(Order order);
    /**
     * 更新cue订单
     *
     * @param order 参数
     */
    void updateCueOrder(Order order);
}
