package com.ruoyi.ss.order.service;

import com.ruoyi.common.utils.wx.vo.PrepayResponseVO;
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.dto.OrderDTO;
import com.ruoyi.ss.order.domain.dto.ProductDTO;
import com.ruoyi.ss.order.domain.dto.ReOrderDTO;
import com.ruoyi.ss.order.domain.vo.ReservedTimePeriod;
import com.ruoyi.ss.refund.domain.Refund;
import com.ruoyi.system.domain.query.IndexChartQuery;
import com.ruoyi.system.domain.vo.*;

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

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

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

//    /**
//     * 查询订单
//     *
//     * @param outTradeNo 第三方订单号
//     * @return 订单
//     */
//    public OrderVO selectRlOrderByOutTradeNo(String outTradeNo);

    /**
     * 查询订单详情，详细信息
     *
     * @param orderNo 订单主键
     * @return 订单
     */
    public OrderVO getOrderInfoByOrderNo(String orderNo);

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

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

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

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

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

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

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

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

    /**
     * 下单
     */
    PrepayResponseVO createOrder(OrderDTO order);

    /**
     * 续单
     */
    PrepayResponseVO reOrder(ReOrderDTO order);

//    /**
//     * 充值订单
//     */
//    PrepayResponseVO topUp(TopUpOrderDTO topUpOrder);

    /**
     * 货柜订单
     */
    PrepayResponseVO productOrder(ProductDTO productDTO);

//    /**
//     * 确认支付
//     */
//    PrepayResponseVO confirmPay(String orderNo);

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

//    /**
//     * 用户扫码绑定车辆
//     */
//    int userBandDevice(Long userId, String sn);

    /**
     * 续单
     */
    PrepayResponseVO relet(OrderQuery order);

    /**
     * 订单取消
     */
    Boolean orderCancel(String orderNo);

    /**
     * 订单结束
     */
    Boolean orderEnd(String orderNo);

    /**
     * 车损扣款
     */
    Boolean deductMoney(BigDecimal money, String orderNo);

    /**
     * 订单退款
     */
    int refund(OrderQuery order);

    /**
     * 创建退款
     *
     */
    public Refund createRefund(String reason, Long userId, String orderNo,
                               BigDecimal refundAmount,
                               BigDecimal dispatchFee,
                               BigDecimal deliveryFee,
                               BigDecimal leaseFee, String outRefundNo, String type);




//    /**
//     * 根据订单号查询可还车的店铺
//     */
//    List<StoreVo> getReturnStoreList(String orderNo,String lon,String lat);

//    /**
//     * 根据sn查询正在进行中的订单
//     */
//    OrderVO getInProgressOrder(String sn);


    void validate(OrderQuery orderQuery);

    /**
     * app首页统计
     */
    IndexAdminVo indexStatistics();

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

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

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

    /**
     * 进行中的订单
     */
    List<OrderVO> getInProgressOrderList(Long roomId);

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

    /**
     * 根据用户id查询历史订单
     */
    List<OrderVO> getHistoricalOrderListByUserId(Long userId);

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

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

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

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

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

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

    /**
     * 统计营收
     */
    BigDecimal getRevenueByTimeType(String timeType,OrderQuery query);

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

    /**
     * 增加订单中的退款金额
     */
    int addRefundAmountByOrderNo(String orderNo, BigDecimal amount);

    /**
     * 获取首页营收统计列表
     */
    IndexIncomeList getIndexInComeList(String timeLimit);

    /**
     * 后台首页统计
     */
    AdminIndexDataVO adminIndexStatistics();

    /**
     * 后台首页图表数据
     */
    IndexChartDatas adminIndexChartData(IndexChartQuery query);
}
