package com.ruoyi.ss.order.mapper;

import com.ruoyi.ss.order.domain.Order;
import com.ruoyi.ss.order.domain.OrderQuery;
import com.ruoyi.ss.order.domain.OrderVO;
import com.ruoyi.ss.order.domain.vo.ReservedTimePeriod;
import com.ruoyi.system.domain.query.IndexChartQuery;
import com.ruoyi.system.domain.vo.InCome;
import com.ruoyi.system.domain.vo.IndexInCome;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 订单Mapper接口
 *
 * @author qzz
 * @date 2024-09-19
 */
public interface OrderMapper
{
    /**
     * 查询订单
     *
     * @param orderId 订单主键
     * @return 订单
     */
    public OrderVO selectRlOrderByOrderId(Long orderId);

    /**
     * 查询订单
     *
     * @param orderNo 订单号
     * @return 订单
     */
    public OrderVO selectRlOrderByOrderNo(String orderNo);

    /**
     * 查询订单列表
     *
     * @param rlOrder 订单
     * @return 订单集合
     */
    public List<OrderVO> selectRlOrderList(OrderQuery rlOrder);

    /**
     * 查询所有订单列表
     *
     * @param rlOrder 订单
     * @return 订单集合
     */
    public List<OrderVO> selectAllRlOrderList(OrderQuery rlOrder);

    /**
     * 新增订单
     *
     * @param rlOrder 订单
     * @return 结果
     */
    public int insertRlOrder(Order rlOrder);

    /**
     * 修改订单
     *
     * @param rlOrder 订单
     * @return 结果
     */
    public int updateRlOrder(Order rlOrder);

    /**
     * 修改订单
     *
     * @param rlOrder 订单
     * @return 结果
     */
    public int updateRlOrderByOrderNo(Order rlOrder);

    /**
     * 删除订单
     *
     * @param orderId 订单主键
     * @return 结果
     */
    public int deleteRlOrderByOrderId(Long orderId);

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

    /**
     * 根据房间号查询正在进行中的订单
     */
    int getInProgressOrder(Long roomId);

    /**
     * 根据房间id列表查询正在进行中的订单
     */
    int getInProgressOrderByIds(List<Long> roomIds);

    /**
     * 根据房间号查询正在进行中的订单
     */
    List<OrderVO> getInProgressOrderList(Long roomId);

    /**
     * 根据userId查询进行中的订单
     */
    List<OrderVO> getInProgressOrderListByUserId(Long userId);

    /**
     * 获取历史订单
     */
    List<OrderVO> getHistoricalOrderListByUserId(Long userId);

//    /**
//     * 根据deviceId查询进行中的订单
//     */
//    int getInProgressOrderListByDeviceId(Long deviceId);

//    /**
//     * 订单金额
//     */
//    BigDecimal getOrderFee(@Param("startDateStr") String startDateStr , @Param("endDateStr") String endDateStr ,@Param("merchantId") Long merchantId);

    /**
     * 订单数量
     */
    Integer getOrderNum(@Param("merchantId") Long merchantId, @Param("startTime") LocalDateTime startDateStr , @Param("endTime") LocalDateTime endDateStr);

    /**
     * 已售数量
     */
    int selectSoldNum(Long roomId);

    /**
     * 已预约订单时间段
     */
    List<ReservedTimePeriod> selectReservedTimes(@Param("roomId") Long roomId, @Param("startTime") Date startTime, @Param("endTime")  Date endTime);

    /**
     * 时间段内是否有预定单
     */
    int isReserved(@Param("roomId") Long roomId, @Param("startTime") Date startTime, @Param("endTime")  Date endTime);

    /**
     * 更换包间
     */
    int changeRoom(OrderQuery order);

    /**
     * 获取已结束订单
     */
    List<OrderVO> selectEndOrderList();

    /**
     * 获取待使用订单
     */
    List<OrderVO> selectToeUsedOrderList();

    /**
     * 查询押金模式还未退金额的订单
     */
    List<OrderVO> selectNotRefundedOrderList();

    /**
     * 统计数量
     */
    Integer getCount(OrderQuery rlOrder);

    /**
     * 统计营收
     */
    BigDecimal getOrderFee(OrderQuery rlOrder);

    /**
     * 支付对账
     */
    IndexInCome getReconciliation(IndexChartQuery query);

    /**
     * 统计营收（根据日期返回）
     */
    List<InCome> getInComeList(OrderQuery rlOrder);

    /**
     * 添加退款金额
     */
    int addRefundAmountByOrderNo(@Param("orderNo") String orderNo,
                                 @Param("refundAmount") BigDecimal refundAmount);

    /**
     * 获取平台服务费
     */
    BigDecimal getPlatformServiceFee(OrderQuery query);

//    /**
//     * 扫码绑定车辆
//     */
//    int bandDevice(String orderNo, String sn);
}
