package com.ruoyi.bst.order.mapper;

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

import org.apache.ibatis.annotations.Param;

import com.ruoyi.bst.order.domain.Order;
import com.ruoyi.bst.order.domain.OrderQuery;
import com.ruoyi.bst.order.domain.OrderVO;
import com.ruoyi.bst.order.domain.query.OrderRefundQuery;
import com.ruoyi.bst.order.domain.vo.OrderDailyRefundStatVO;
import com.ruoyi.bst.order.domain.vo.OrderDailyStatVO;
import com.ruoyi.bst.order.domain.vo.OrderRankVO;
import com.ruoyi.common.domain.vo.StringIntegerVO;

/**
 * 订单Mapper接口
 *
 * @author ruoyi
 * @date 2025-03-24
 */
public interface OrderMapper {
    /**
     * 查询订单
     *
     * @param id 订单主键
     * @return 订单
     */
    OrderVO selectOrderById(Long id);

    /**
     * 查询订单列表
     *
     * @param query 订单
     * @return 订单集合
     */
    List<OrderVO> selectOrderList(@Param("query") OrderQuery query);

    /**
     * 新增订单
     *
     * @param order 订单
     * @return 结果
     */
    int insertOrder(Order order);

    /**
     * 修改订单
     *
     * @param order 订单
     * @return 结果
     */
    public int updateOrder(@Param("data") Order order);

    /**
     * 删除订单
     *
     * @param id 订单主键
     * @return 结果
     */
    int deleteOrderById(Long id);

    /**
     * 批量删除订单
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteOrderByIds(Long[] ids);

    /**
     * 根据查询条件更新订单
     *
     * @param data  更新数据
     * @param query 查询条件
     * @return 结果
     */
    int updateByQuery(@Param("data") Order data, @Param("query") OrderQuery query);

    /**
     * 查询订单用户数量
     *
     * @param query 查询条件
     * @return 结果
     */
    int selectUserCount(@Param("query") OrderQuery query);

    /**
     * 查询订单数量
     *
     * @param query 查询条件
     * @return 结果
     */
    int selectCount(@Param("query") OrderQuery query);

    /**
     * 查询订单支付金额
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfPayAmount(@Param("query") OrderQuery query);

    /**
     * 查询订单退款金额
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfRefundAmount(@Param("query") OrderRefundQuery query);

    /**
     * 查询订单每日统计
     *
     * @param query 查询条件
     * @param keys  查询字段
     * @return 结果
     */
    List<OrderDailyStatVO> selectDailyStat(@Param("query") OrderQuery query, @Param("keys") List<String> keys);

    /**
     * 查询订单每日退款统计
     *
     * @param query 查询条件
     * @param keys  查询字段
     * @return 结果
     */
    List<OrderDailyRefundStatVO> selectDailyRefundStat(@Param("query") OrderRefundQuery query,
            @Param("keys") List<String> keys);

    /**
     * 查询订单排行榜
     *
     * @param query 查询条件
     * @return 结果
     */
    List<OrderRankVO> selectRank(@Param("query") OrderQuery query);

    /**
     * 查询订单状态数量
     *
     * @param query 查询条件
     * @return 结果
     */
    List<StringIntegerVO> selectStatusCount(@Param("query") OrderQuery query);

    /**
     * 增加车损费
     *
     * @param id
     * @param deductionFee
     * @return
     */
    int addDeductionFee(@Param("id") Long id, @Param("deductionFee") BigDecimal deductionFee);

    /**
     * 根据查询条件查询订单ID列表
     *
     * @param query 查询条件
     * @return 订单ID列表
     */
    List<Long> selectIdByQuery(@Param("query") OrderQuery query);

    /**
     * 查询订单实收金额
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfActualAmount(@Param("query") OrderQuery query);

    /**
     * 查询订单骑行费
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfActualRiddingFee(@Param("query") OrderQuery query);

    /**
     * 查询订单车损费
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfActualDeductionFee(@Param("query") OrderQuery query);

    /**
     * 查询订单调度费
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfActualDispatchFee(@Param("query") OrderQuery query);

    /**
     * 查询订单管理费
     *
     * @param query 查询条件
     * @return 结果
     */
    BigDecimal selectSumOfActualManageFee(@Param("query") OrderQuery query);

    /**
     * 押金抵扣
     * @param data
     */
    int deductDeposit(@Param("data") Order data);

    /**
     * 更新退款信息
     * @param data
     * @param query
     * @return
     */
    int updateRefund(@Param("data") Order data, @Param("query") OrderQuery query);

    /**
     * 清空订单的VIP信息
     * @param orderId
     * @param vipUserId
     * @return
     */
    int clearVipInfo(@Param("orderId") Long orderId, @Param("vipUserId") Long vipUserId);

}
