package com.ruoyi.payment.mapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.payment.domain.PaymentRecord;

/**
 * 支付记录Mapper接口
 * 
 * @author ruoyi
 * @date 2025-12-17
 */
public interface PaymentRecordMapper 
{
    /**
     * 查询支付记录
     * 
     * @param paymentId 支付记录主键
     * @return 支付记录
     */
    public PaymentRecord selectPaymentRecordByPaymentId(Long paymentId);

    /**
     * 根据支付编号查询支付记录
     * 
     * @param paymentNumber 支付编号
     * @return 支付记录
     */
    public PaymentRecord selectPaymentRecordByPaymentNumber(String paymentNumber);

    /**
     * 根据交易流水号查询支付记录
     * 
     * @param transactionId 交易流水号
     * @return 支付记录
     */
    public PaymentRecord selectPaymentRecordByTransactionId(String transactionId);

    /**
     * 查询支付记录列表
     * 
     * @param paymentRecord 支付记录
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordList(PaymentRecord paymentRecord);

    /**
     * 根据合同ID查询支付记录
     * 
     * @param contractId 合同ID
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByContractId(Long contractId);

    /**
     * 根据支付方ID查询支付记录
     * 
     * @param payerId 支付方ID
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByPayerId(Long payerId);

    /**
     * 根据收款方ID查询支付记录
     * 
     * @param payeeId 收款方ID
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByPayeeId(Long payeeId);

    /**
     * 根据支付方式查询支付记录
     * 
     * @param paymentMethod 支付方式
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByPaymentMethod(String paymentMethod);

    /**
     * 根据支付状态查询支付记录
     * 
     * @param paymentStatus 支付状态
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByStatus(String paymentStatus);

    /**
     * 根据时间范围查询支付记录
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 支付记录集合
     */
    public List<PaymentRecord> selectPaymentRecordByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 统计支付数量按方式分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectPaymentCountByMethod();

    /**
     * 统计支付数量按状态分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectPaymentCountByStatus();

    /**
     * 统计总支付金额
     * 
     * @return 总金额
     */
    public BigDecimal selectTotalPaymentAmount();

    /**
     * 统计指定合同的支付金额
     * 
     * @param contractId 合同ID
     * @return 支付金额
     */
    public BigDecimal selectPaymentAmountByContractId(Long contractId);

    /**
     * 新增支付记录
     * 
     * @param paymentRecord 支付记录
     * @return 结果
     */
    public int insertPaymentRecord(PaymentRecord paymentRecord);

    /**
     * 修改支付记录
     * 
     * @param paymentRecord 支付记录
     * @return 结果
     */
    public int updatePaymentRecord(PaymentRecord paymentRecord);

    /**
     * 更新支付状态
     * 
     * @param paymentId 支付记录ID
     * @param paymentStatus 支付状态
     * @return 结果
     */
    public int updatePaymentStatus(@Param("paymentId") Long paymentId, @Param("paymentStatus") String paymentStatus);

    /**
     * 确认支付
     * 
     * @param paymentId 支付记录ID
     * @param confirmTime 确认时间
     * @return 结果
     */
    public int confirmPayment(@Param("paymentId") Long paymentId, @Param("confirmTime") Date confirmTime);

    /**
     * 删除支付记录
     * 
     * @param paymentId 支付记录主键
     * @return 结果
     */
    public int deletePaymentRecordByPaymentId(Long paymentId);

    /**
     * 批量删除支付记录
     * 
     * @param paymentIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deletePaymentRecordByPaymentIds(Long[] paymentIds);

    /**
     * 校验支付编号是否唯一
     * 
     * @param paymentNumber 支付编号
     * @return 结果
     */
    public PaymentRecord checkPaymentNumberUnique(String paymentNumber);
}