package com.ruoyi.ccdi.project.mapper;

import com.ruoyi.ccdi.project.domain.vo.BankTagStatementHitVO;
import com.ruoyi.ccdi.project.domain.vo.BankTagObjectHitVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 流水标签分析 Mapper
 */
public interface CcdiBankTagAnalysisMapper {

    /**
     * 房车消费支出交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectHouseOrCarExpenseStatements(@Param("projectId") Long projectId);

    /**
     * 税务支出交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectTaxExpenseStatements(@Param("projectId") Long projectId);

    /**
     * 大额单笔收入
     *
     * @param projectId 项目ID
     * @param threshold 单笔阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectSingleLargeIncomeStatements(@Param("projectId") Long projectId,
                                                                  @Param("threshold") BigDecimal threshold);

    /**
     * 累计收入超限对象
     *
     * @param projectId 项目ID
     * @param threshold 累计阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectCumulativeIncomeObjects(@Param("projectId") Long projectId,
                                                           @Param("threshold") BigDecimal threshold);

    /**
     * 年流水交易额超限对象
     *
     * @param projectId 项目ID
     * @param threshold 年交易额阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectAnnualTurnoverObjects(@Param("projectId") Long projectId,
                                                         @Param("threshold") BigDecimal threshold);

    /**
     * 大额存现交易
     *
     * @param projectId 项目ID
     * @param threshold 存现阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectLargeCashDepositStatements(@Param("projectId") Long projectId,
                                                                 @Param("threshold") BigDecimal threshold);

    /**
     * 短时间多次存现对象
     *
     * @param projectId 项目ID
     * @param amountThreshold 单笔存现阈值
     * @param frequencyThreshold 频次阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectFrequentCashDepositObjects(@Param("projectId") Long projectId,
                                                              @Param("amountThreshold") BigDecimal amountThreshold,
                                                              @Param("frequencyThreshold") Integer frequencyThreshold);

    /**
     * 大额转账交易
     *
     * @param projectId 项目ID
     * @param threshold 转账阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectLargeTransferStatements(@Param("projectId") Long projectId,
                                                              @Param("threshold") BigDecimal threshold);

    /**
     * 外部人员单笔大额交易
     *
     * @param projectId 项目ID
     * @param threshold 单笔大额阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectExternalSingleLargeAmountStatements(@Param("projectId") Long projectId,
                                                                          @Param("threshold") BigDecimal threshold);

    /**
     * 外部人员累计交易超限
     *
     * @param projectId 项目ID
     * @param threshold 累计交易阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectExternalCumulativeTransactionAmountObjects(@Param("projectId") Long projectId,
                                                                              @Param("threshold") BigDecimal threshold);

    /**
     * 外部人员年流水超限
     *
     * @param projectId 项目ID
     * @param threshold 年流水阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectExternalAnnualTurnoverObjects(@Param("projectId") Long projectId,
                                                                 @Param("threshold") BigDecimal threshold);

    /**
     * 与客户之间非正常资金往来
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectAbnormalCustomerTransactionStatements(@Param("projectId") Long projectId);

    /**
     * 低收入亲属大额交易
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectLowIncomeRelativeLargeTransactionObjects(@Param("projectId") Long projectId);

    /**
     * 疑似赌博交易
     *
     * @param projectId 项目ID
     * @param amountMinThreshold 可疑金额下限
     * @param amountMaxThreshold 可疑金额上限
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectMultiPartyGamblingTransferObjects(@Param("projectId") Long projectId,
                                                                     @Param("amountMinThreshold") BigDecimal amountMinThreshold,
                                                                     @Param("amountMaxThreshold") BigDecimal amountMaxThreshold);

    /**
     * 疑似敏感交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectGamblingSensitiveKeywordStatements(@Param("projectId") Long projectId);

    /**
     * 外部人员疑似赌博摘要
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectExternalGamblingMemoStatements(@Param("projectId") Long projectId);

    /**
     * 外部人员同日多对手方疑似赌博交易
     *
     * @param projectId 项目ID
     * @param amountMinThreshold 可疑金额下限
     * @param amountMaxThreshold 可疑金额上限
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectExternalMultiPartyGamblingTransferObjects(@Param("projectId") Long projectId,
                                                                             @Param("amountMinThreshold") BigDecimal amountMinThreshold,
                                                                             @Param("amountMaxThreshold") BigDecimal amountMaxThreshold);

    /**
     * 特殊金额交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectSpecialAmountTransactionStatements(@Param("projectId") Long projectId);

    /**
     * 外部人员与员工或员工亲属交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectExternalToStaffOrFamilyTransactionStatements(@Param("projectId") Long projectId);

    /**
     * 外部人员夜间交易
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectExternalNightTransactionStatements(@Param("projectId") Long projectId);

    /**
     * 月度固定收入疑似兼职
     *
     * @param projectId 项目ID
     * @param threshold 月度固定收入阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectMonthlyFixedIncomeObjects(@Param("projectId") Long projectId,
                                                             @Param("threshold") BigDecimal threshold);

    /**
     * 固定交易对手转入疑似兼职
     *
     * @param projectId 项目ID
     * @param quarterMinThreshold 季度收入下限
     * @param quarterMaxThreshold 季度收入上限
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectFixedCounterpartyTransferObjects(@Param("projectId") Long projectId,
                                                                    @Param("quarterMinThreshold") BigDecimal quarterMinThreshold,
                                                                    @Param("quarterMaxThreshold") BigDecimal quarterMaxThreshold);

    /**
     * 摘要收入疑似兼职
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectSuspiciousIncomeKeywordStatements(@Param("projectId") Long projectId);

    /**
     * 购房交易与房产登记不匹配
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectHouseRegistrationMismatchStatements(@Param("projectId") Long projectId);

    /**
     * 物业缴费与房产登记不匹配
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectPropertyFeeRegistrationMismatchStatements(@Param("projectId") Long projectId);

    /**
     * 大额纳税与资产登记不匹配
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectTaxAssetRegistrationMismatchStatements(@Param("projectId") Long projectId);

    /**
     * 收入资产不符
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectIncomeAssetMismatchStatements(@Param("projectId") Long projectId);

    /**
     * 单笔购汇金额超限
     *
     * @param projectId 项目ID
     * @param threshold 单笔购汇阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectForexBuyAmtStatements(@Param("projectId") Long projectId,
                                                            @Param("threshold") BigDecimal threshold);

    /**
     * 单笔结汇金额超限
     *
     * @param projectId 项目ID
     * @param threshold 单笔结汇阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectForexSellAmtStatements(@Param("projectId") Long projectId,
                                                             @Param("threshold") BigDecimal threshold);

    /**
     * 单笔跨境汇款金额超限
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectCrossBorderAmtStatements(@Param("projectId") Long projectId);

    /**
     * 可疑付息
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectInterestPaymentByOthersObjects(@Param("projectId") Long projectId);

    /**
     * 单笔采购金额超过10万元
     *
     * @param projectId 项目ID
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectLargePurchaseTransactionStatements(@Param("projectId") Long projectId);

    /**
     * 供应商集中采购
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectSupplierConcentrationObjects(@Param("projectId") Long projectId);

    /**
     * 可疑银证大额转账
     *
     * @param projectId 项目ID
     * @param threshold 银证转账阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectStockTfrLargeStatements(@Param("projectId") Long projectId,
                                                              @Param("threshold") BigDecimal threshold);

    /**
     * 微信支付宝频繁提现
     *
     * @param projectId 项目ID
     * @param frequencyThreshold 提现频次阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectWithdrawCntObjects(@Param("projectId") Long projectId,
                                                      @Param("frequencyThreshold") Integer frequencyThreshold);

    /**
     * 微信支付宝提现超额
     *
     * @param projectId 项目ID
     * @param amountThreshold 提现金额阈值
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectWithdrawAmtObjects(@Param("projectId") Long projectId,
                                                      @Param("amountThreshold") BigDecimal amountThreshold);

    /**
     * 工资快速转出
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectSalaryQuickTransferObjects(@Param("projectId") Long projectId);

    /**
     * 工资无使用记录
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectSalaryUnusedObjects(@Param("projectId") Long projectId);

    /**
     * 突然销户
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectSuddenAccountClosureObjects(@Param("projectId") Long projectId);

    /**
     * 休眠账户大额启用
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectDormantAccountLargeActivationObjects(@Param("projectId") Long projectId);

    /**
     * 大额炒股
     *
     * @param projectId 项目ID
     * @param threshold 三方资管交易阈值
     * @return 流水命中结果
     */
    List<BankTagStatementHitVO> selectLargeStockTradingStatements(@Param("projectId") Long projectId,
                                                                  @Param("threshold") BigDecimal threshold);

    /**
     * 疑似代理他人账户
     *
     * @param projectId 项目ID
     * @return 对象命中结果
     */
    List<BankTagObjectHitVO> selectProxyAccountOperationObjects(@Param("projectId") Long projectId);
}
