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.FundTransfer;

/**
 * 资金流转记录Mapper接口
 * 
 * @author ruoyi
 * @date 2025-12-17
 */
public interface FundTransferMapper 
{
    /**
     * 查询资金流转记录
     * 
     * @param transferId 资金流转记录主键
     * @return 资金流转记录
     */
    public FundTransfer selectFundTransferByTransferId(Long transferId);

    /**
     * 根据流转编号查询资金流转记录
     * 
     * @param transferNumber 流转编号
     * @return 资金流转记录
     */
    public FundTransfer selectFundTransferByTransferNumber(String transferNumber);

    /**
     * 查询资金流转记录列表
     * 
     * @param fundTransfer 资金流转记录
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferList(FundTransfer fundTransfer);

    /**
     * 根据转出账户ID查询流转记录
     * 
     * @param fromAccountId 转出账户ID
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByFromAccountId(Long fromAccountId);

    /**
     * 根据转入账户ID查询流转记录
     * 
     * @param toAccountId 转入账户ID
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByToAccountId(Long toAccountId);

    /**
     * 根据账户ID查询所有相关流转记录
     * 
     * @param accountId 账户ID
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByAccountId(Long accountId);

    /**
     * 根据转账类型查询流转记录
     * 
     * @param transferType 转账类型
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByType(String transferType);

    /**
     * 根据转账状态查询流转记录
     * 
     * @param transferStatus 转账状态
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByStatus(String transferStatus);

    /**
     * 根据区块链交易哈希查询流转记录
     * 
     * @param blockchainTxHash 区块链交易哈希
     * @return 资金流转记录
     */
    public FundTransfer selectFundTransferByBlockchainTxHash(String blockchainTxHash);

    /**
     * 根据时间范围查询流转记录
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 资金流转记录集合
     */
    public List<FundTransfer> selectFundTransferByDateRange(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 统计流转数量按类型分组
     * 
     * @return 统计结果
     */
    public List<java.util.Map<String, Object>> selectTransferCountByType();

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

    /**
     * 统计总流转金额
     * 
     * @return 总金额
     */
    public BigDecimal selectTotalTransferAmount();

    /**
     * 统计指定账户的流入金额
     * 
     * @param accountId 账户ID
     * @return 流入金额
     */
    public BigDecimal selectInflowAmountByAccountId(Long accountId);

    /**
     * 统计指定账户的流出金额
     * 
     * @param accountId 账户ID
     * @return 流出金额
     */
    public BigDecimal selectOutflowAmountByAccountId(Long accountId);

    /**
     * 新增资金流转记录
     * 
     * @param fundTransfer 资金流转记录
     * @return 结果
     */
    public int insertFundTransfer(FundTransfer fundTransfer);

    /**
     * 修改资金流转记录
     * 
     * @param fundTransfer 资金流转记录
     * @return 结果
     */
    public int updateFundTransfer(FundTransfer fundTransfer);

    /**
     * 更新转账状态
     * 
     * @param transferId 流转ID
     * @param transferStatus 转账状态
     * @return 结果
     */
    public int updateTransferStatus(@Param("transferId") Long transferId, @Param("transferStatus") String transferStatus);

    /**
     * 更新区块链交易哈希
     * 
     * @param transferId 流转ID
     * @param blockchainTxHash 区块链交易哈希
     * @return 结果
     */
    public int updateBlockchainTxHash(@Param("transferId") Long transferId, @Param("blockchainTxHash") String blockchainTxHash);

    /**
     * 删除资金流转记录
     * 
     * @param transferId 资金流转记录主键
     * @return 结果
     */
    public int deleteFundTransferByTransferId(Long transferId);

    /**
     * 批量删除资金流转记录
     * 
     * @param transferIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteFundTransferByTransferIds(Long[] transferIds);

    /**
     * 校验流转编号是否唯一
     * 
     * @param transferNumber 流转编号
     * @return 结果
     */
    public FundTransfer checkTransferNumberUnique(String transferNumber);
}