package com.ruoyi.ss.refund.service;

import com.ruoyi.ss.order.domain.Order;
import com.ruoyi.ss.order.domain.OrderVO;
import com.ruoyi.ss.refund.domain.*;

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

/**
 * 退款订单Service接口
 *
 * @author 邱贞招
 * @date 2024-05-10
 */
public interface IRefundService
{
    /**
     * 查询退款订单
     *
     * @param id 退款订单主键
     * @return 退款订单
     */
    public RefundVO selectEtRefundById(Long id);

    /**
     * 根据订单号查询退款订单对象
     *
     * @param orderNo 订单号
     * @return 退款订单
     */
    public List<Refund> selectEtRefundByOrderNo(String orderNo);

    /**
     * 根据退款单号查询退款订单对象
     *
     * @param refundNo 订单号
     * @return 退款订单
     */
    public Refund selectEtRefundByRefundNo(String refundNo);

    /**
     * 查询退款订单列表
     *
     * @param rlRefund 退款订单
     * @return 退款订单集合
     */
    public List<Refund> selectEtRefundList(RefundQuery rlRefund);

    /**
     * 查询退款订单列表（带数据隔离）
     *
     * @param rlRefund 退款订单
     * @return 退款订单集合
     */
    public List<Refund> selectEtRefundListWithIsolate(RefundQuery rlRefund);

    /**
     * 新增退款订单
     *
     * @param bo 退款bo
     * @return 结果
     */
    public int refund(RefundBO bo);

    /**
     * 构建退款订单并返回订单号
     *
     * @param dto 退款dto
     * @return 结果
     */
    public String saveRefund(RefundDTO dto,Long userId,OrderVO orderVO);

    /**
     * 修改退款订单
     *
     * @param rlRefund 退款订单
     * @return 结果
     */
    public int updateEtRefund(Refund rlRefund);

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

    /**
     * 删除退款订单信息
     *
     * @param id 退款订单主键
     * @return 结果
     */
    public int deleteEtRefundById(Long id);

    /**
     * 根据退款单号修改退款订单
     *
     * @param rlRefund 退款订单
     * @return 结果
     */
    public int updateEtRefundByRefundNo(Refund rlRefund);

    /**
     * 判断是否用户是否还有未退款的押金
     *
     * @param userId 用户id
     * @return 结果
     */
    List<Order> checkUserDeposit(Long userId);

    /**
     * 统计已退款金额
     *
     * @param query 条件
     * @return 结果
     */
    BigDecimal  getRefundedAmount(RefundQuery query);

    /**
     * 同意退款
     */
    int passRefund(String refundNo);

    /**
     * 拒绝退款
     */
    int reject(String refundNo);
}
