package com.tmerclub.cloud.order.mapper;

import com.tmerclub.cloud.api.delivery.dto.DeliveryOrderItemDTO;
import com.tmerclub.cloud.api.order.bo.DistributionAmountWithOrderIdBO;
import com.tmerclub.cloud.api.order.bo.UserScoreLogOrderBO;
import com.tmerclub.cloud.common.order.bo.EsOrderItemBO;
import com.tmerclub.cloud.common.order.vo.OrderItemVO;
import com.tmerclub.cloud.order.model.OrderItem;
import com.tmerclub.cloud.order.vo.OrderItemDetailVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 订单项
 *
 * @author tmerclub
 * @date 2020-12-04 11:27:35
 */
public interface OrderItemMapper {

    /**
     * 获取订单项列表
     *
     * @return 订单项列表
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> list();

    /**
     * 根据订单项id获取订单项
     *
     * @param orderItemId 订单项id
     * @param lang
     * @return 订单项
     */
    com.tmerclub.cloud.common.order.vo.OrderItemVO getByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("lang") Integer lang);

    /**
     * 保存订单项
     *
     * @param orderItem 订单项
     */
    void save(@Param("orderItem") OrderItem orderItem);

    /**
     * 保存订单项
     *
     * @param orderItems 订单项
     */
    void saveBatch(@Param("orderItems") List<OrderItem> orderItems);

    /**
     * 更新订单项
     *
     * @param orderItem 订单项
     */
    void update(@Param("orderItem") OrderItem orderItem);

    /**
     * 根据订单项id删除订单项
     *
     * @param orderItemId
     */
    void deleteById(@Param("orderItemId") Long orderItemId);

    /**
     * 根据订单项ids删除订单项
     *
     * @param orderItemIds
     */
    void deleteBatchByIds(@Param("orderItemIds") List<Long> orderItemIds);

    /**
     * 根据订单号获取订单项
     *
     * @param orderId 订单id
     * @return 订单项
     */
    List<OrderItem> listOrderItemsByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据订单号获取订单项,不包含赠品
     *
     * @param orderId 订单id
     * @return 订单项
     */
    List<OrderItem> listOrderItemsByOrderIds(@Param("orderId") Long orderId);

    /**
     * 根据订单号获取订单项
     *
     * @param orderIds 订单id
     * @return 订单项
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> listOrderItemAndLangByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 计算订单项已结算分销金额
     *
     * @param orderIds
     * @return
     */
    List<DistributionAmountWithOrderIdBO> sumTotalDistributionAmountByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单id获取订单项商品数量
     *
     * @param orderId
     * @return
     */
    Integer sumNumByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据订单id获取订单项数量
     *
     * @param orderId
     * @return
     */
    Integer countByOrderId(@Param("orderId") Long orderId);

    /**
     * 更新订单项发货数量信息
     *
     * @param orderItem    发货订单项
     * @param deliveryType 发货方式
     */
    void updateByDelivery(@Param("orderItem") DeliveryOrderItemDTO orderItem, @Param("deliveryType") Integer deliveryType);

    /**
     * 计算未发货商品数量
     *
     * @param orderId
     * @return
     */
    int countUnDeliveryNumByOrderId(@Param("orderId") Long orderId);

    /**
     * 减少订单项待发货数量
     *
     * @param orderItemId
     * @param count
     */
    void reduceUnDeliveryNumByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("count") Integer count);

    /**
     * 更新订单项退款状态
     *
     * @param orderId
     * @param refundStatus
     */
    void updateRefundStatusByOrderId(@Param("orderId") Long orderId, @Param("refundStatus") Integer refundStatus);

    /**
     * 根据订单id查询订单项、退款详情
     *
     * @param orderId 订单id
     * @param lang    语言
     * @return 订单项、退款详情
     */
    List<OrderItemDetailVO> listDetailByOrderId(@Param("orderId") Long orderId, @Param("lang") Integer lang);

    /**
     * 根据订单项id获取订单项中的商品信息
     *
     * @param orderItemId
     * @param lang
     * @return
     */
    com.tmerclub.cloud.common.order.vo.OrderItemVO getSpuInfoByOrderItemId(@Param("orderItemId") Long orderItemId, @Param("lang") Integer lang);

    /**
     * 根据订单号获取订单项的物流类型
     *
     * @param orderItemId 订单号
     * @return 物流类型
     */
    int getDevTypeByOrderItemId(@Param("orderItemId") Long orderItemId);

    /**
     * 根据订单号获取订单项
     *
     * @param orderId 订单号
     * @return 订单id以及发货方式
     */
    List<Integer> getDevTypeByOrderId(@Param("orderId") Long orderId);

    /**
     * 批量修改订单项的分销金额
     *
     * @param orderItem 订单项
     * @return 受影响行数
     */
    int updateBatchDistributionAmount(@Param("orderItem") EsOrderItemBO orderItem);

    /**
     * 获取指定的订单项
     *
     * @param orderIds
     * @return
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> listOrderItemByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单号获取用户积分订单详情
     *
     * @param orderIds 订单号
     * @return 订单详情
     */
    List<UserScoreLogOrderBO> getUserScoreLogDetail(@Param("orderIds") List<Long> orderIds);


    /**
     * 根据赠送主订单项id获取
     *
     * @param userId
     * @param giveawayOrderItemId
     * @return
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> getOrderItemByGiveawayOrderItemId(@Param("userId") Long userId, @Param("giveawayOrderItemId") Long giveawayOrderItemId);

    /**
     * 根据赠送主订单项id获取
     *
     * @param giveawayOrderItemIds
     * @param userId
     * @param sysType
     * @return
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> getOrderItemByGiveawayOrderItemIds(@Param("giveawayOrderItemIds") List<Long> giveawayOrderItemIds, @Param("userId") Long userId, @Param("sysType") Integer sysType);

    /**
     * 获取用户指定的订单项列表
     *
     * @param userId
     * @param orderIds
     * @return
     */
    List<com.tmerclub.cloud.common.order.vo.OrderItemVO> listOrderItemsByUserIdAndOrderIds(@Param("userId") Long userId, @Param("orderIds") List<Long> orderIds);

    /**
     * 根据ids获取订单项
     *
     * @param itemIds
     * @return
     */
    List<OrderItem> listByIds(@Param("itemIds") List<Long> itemIds);

    /**
     * 查询指定的订单项及语言数据
     *
     * @param orderItemIds
     * @return
     */
    List<OrderItemVO> listOrderItemAndLangByOrderItemIds(@Param("orderItemIds") List<Long> orderItemIds);

    /**
     * 保存cue订单项
     *
     * @param orderItem 订单项
     */
    void saveCueOrderItem(@Param("orderItem") OrderItem orderItem);
}
