diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapper.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapper.java index 5e78ef3a..dc81be47 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapper.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapper.java @@ -190,17 +190,21 @@ public interface CcdiBankTagAnalysisMapper { * 单笔购汇金额超限 * * @param projectId 项目ID + * @param threshold 单笔购汇阈值 * @return 流水命中结果 */ - List selectForexBuyAmtStatements(@Param("projectId") Long projectId); + List selectForexBuyAmtStatements(@Param("projectId") Long projectId, + @Param("threshold") BigDecimal threshold); /** * 单笔结汇金额超限 * * @param projectId 项目ID + * @param threshold 单笔结汇阈值 * @return 流水命中结果 */ - List selectForexSellAmtStatements(@Param("projectId") Long projectId); + List selectForexSellAmtStatements(@Param("projectId") Long projectId, + @Param("threshold") BigDecimal threshold); /** * 单笔跨境汇款金额超限 @@ -238,17 +242,21 @@ public interface CcdiBankTagAnalysisMapper { * 可疑银证大额转账 * * @param projectId 项目ID + * @param threshold 银证转账阈值 * @return 流水命中结果 */ - List selectStockTfrLargeStatements(@Param("projectId") Long projectId); + List selectStockTfrLargeStatements(@Param("projectId") Long projectId, + @Param("threshold") BigDecimal threshold); /** * 微信支付宝频繁提现 * * @param projectId 项目ID + * @param frequencyThreshold 提现频次阈值 * @return 对象命中结果 */ - List selectWithdrawCntObjects(@Param("projectId") Long projectId); + List selectWithdrawCntObjects(@Param("projectId") Long projectId, + @Param("frequencyThreshold") Integer frequencyThreshold); /** * 微信支付宝提现超额 @@ -278,9 +286,11 @@ public interface CcdiBankTagAnalysisMapper { * 大额炒股 * * @param projectId 项目ID + * @param threshold 三方资管交易阈值 * @return 流水命中结果 */ - List selectLargeStockTradingStatements(@Param("projectId") Long projectId); + List selectLargeStockTradingStatements(@Param("projectId") Long projectId, + @Param("threshold") BigDecimal threshold); /** * 疑似代理他人账户 diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java index 2fdfc90b..0c1edf3b 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java @@ -24,13 +24,18 @@ import lombok.extern.slf4j.Slf4j; @Component public class BankTagRuleConfigResolver { - private static final Map> RULE_PARAM_MAPPING = Map.of( - "SINGLE_LARGE_INCOME", Set.of("SINGLE_TRANSACTION_AMOUNT"), - "CUMULATIVE_INCOME", Set.of("CUMULATIVE_TRANSACTION_AMOUNT"), - "ANNUAL_TURNOVER", Set.of("ANNUAL_TURNOVER"), - "LARGE_CASH_DEPOSIT", Set.of("LARGE_CASH_DEPOSIT"), - "FREQUENT_CASH_DEPOSIT", Set.of("LARGE_CASH_DEPOSIT", "FREQUENT_CASH_DEPOSIT"), - "LARGE_TRANSFER", Set.of("FREQUENT_TRANSFER") + private static final Map> RULE_PARAM_MAPPING = Map.ofEntries( + Map.entry("SINGLE_LARGE_INCOME", Set.of("SINGLE_TRANSACTION_AMOUNT")), + Map.entry("CUMULATIVE_INCOME", Set.of("CUMULATIVE_TRANSACTION_AMOUNT")), + Map.entry("ANNUAL_TURNOVER", Set.of("ANNUAL_TURNOVER")), + Map.entry("LARGE_CASH_DEPOSIT", Set.of("LARGE_CASH_DEPOSIT")), + Map.entry("FREQUENT_CASH_DEPOSIT", Set.of("LARGE_CASH_DEPOSIT", "FREQUENT_CASH_DEPOSIT")), + Map.entry("LARGE_TRANSFER", Set.of("FREQUENT_TRANSFER")), + Map.entry("FOREX_BUY_AMT", Set.of("SINGLE_PURCHASE_AMOUNT")), + Map.entry("FOREX_SELL_AMT", Set.of("SINGLE_SETTLEMENT_AMOUNT")), + Map.entry("WITHDRAW_CNT", Set.of("WITHDRAW_CNT")), + Map.entry("STOCK_TFR_LARGE", Set.of("STOCK_TFR_LARGE")), + Map.entry("LARGE_STOCK_TRADING", Set.of("STOCK_TFR_LARGE")) ); @Resource diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java index f0fae6da..d6cd9440 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImpl.java @@ -233,12 +233,20 @@ public class CcdiBankTagServiceImpl implements ICcdiBankTagService { case "PROPERTY_FEE_REGISTRATION_MISMATCH" -> analysisMapper.selectPropertyFeeRegistrationMismatchStatements(projectId); case "TAX_ASSET_REGISTRATION_MISMATCH" -> analysisMapper.selectTaxAssetRegistrationMismatchStatements(projectId); case "INCOME_ASSET_MISMATCH" -> analysisMapper.selectIncomeAssetMismatchStatements(projectId); - case "FOREX_BUY_AMT" -> analysisMapper.selectForexBuyAmtStatements(projectId); - case "FOREX_SELL_AMT" -> analysisMapper.selectForexSellAmtStatements(projectId); + case "FOREX_BUY_AMT" -> analysisMapper.selectForexBuyAmtStatements( + projectId, toBigDecimal(config.getThresholdValue("SINGLE_PURCHASE_AMOUNT")) + ); + case "FOREX_SELL_AMT" -> analysisMapper.selectForexSellAmtStatements( + projectId, toBigDecimal(config.getThresholdValue("SINGLE_SETTLEMENT_AMOUNT")) + ); case "CROSS_BORDER_AMT" -> analysisMapper.selectCrossBorderAmtStatements(projectId); case "LARGE_PURCHASE_TRANSACTION" -> analysisMapper.selectLargePurchaseTransactionStatements(projectId); - case "STOCK_TFR_LARGE" -> analysisMapper.selectStockTfrLargeStatements(projectId); - case "LARGE_STOCK_TRADING" -> analysisMapper.selectLargeStockTradingStatements(projectId); + case "STOCK_TFR_LARGE" -> analysisMapper.selectStockTfrLargeStatements( + projectId, toBigDecimal(config.getThresholdValue("STOCK_TFR_LARGE")) + ); + case "LARGE_STOCK_TRADING" -> analysisMapper.selectLargeStockTradingStatements( + projectId, toBigDecimal(config.getThresholdValue("STOCK_TFR_LARGE")) + ); default -> List.of(); }; } @@ -264,7 +272,9 @@ public class CcdiBankTagServiceImpl implements ICcdiBankTagService { case "FIXED_COUNTERPARTY_TRANSFER" -> analysisMapper.selectFixedCounterpartyTransferObjects(projectId); case "INTEREST_PAYMENT_BY_OTHERS" -> analysisMapper.selectInterestPaymentByOthersObjects(projectId); case "SUPPLIER_CONCENTRATION" -> analysisMapper.selectSupplierConcentrationObjects(projectId); - case "WITHDRAW_CNT" -> analysisMapper.selectWithdrawCntObjects(projectId); + case "WITHDRAW_CNT" -> analysisMapper.selectWithdrawCntObjects( + projectId, toInteger(config.getThresholdValue("WITHDRAW_CNT")) + ); case "WITHDRAW_AMT" -> analysisMapper.selectWithdrawAmtObjects(projectId); case "SALARY_QUICK_TRANSFER" -> analysisMapper.selectSalaryQuickTransferObjects(projectId); case "SALARY_UNUSED" -> analysisMapper.selectSalaryUnusedObjects(projectId); diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml index b930686c..58ee94ed 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml @@ -396,9 +396,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bs.bank_statement_id AS bankStatementId, bs.group_id AS groupId, bs.batch_id AS logId, - '占位SQL,待补充真实规则' AS reasonDetail + CONCAT( + '摘要/对手命中赌博敏感词,摘要“', IFNULL(bs.USER_MEMO, ''), + '”,对手方“', IFNULL(bs.CUSTOMER_ACCOUNT_NAME, ''), + '”,支出金额 ', CAST(IFNULL(bs.AMOUNT_DR, 0) AS CHAR), ' 元' + ) AS reasonDetail from ccdi_bank_statement bs - where 1 = 0 + inner join ccdi_base_staff staff on staff.id_card = bs.cret_no + where bs.project_id = #{projectId} + and IFNULL(bs.AMOUNT_DR, 0) > 0 + and ( + IFNULL(bs.USER_MEMO, '') REGEXP '游戏|抖币|体彩|福彩|彩票|赌|球|外围|博彩|六合|时时彩|赛车|赌场|筹码|盘口|返水|洗码|庄家|闲家|百家乐|斗牛|炸金花|牌九|麻将|捕鱼|电子游艺|投注' + or IFNULL(bs.CUSTOMER_ACCOUNT_NAME, '') REGEXP '游戏|抖币|体彩|福彩|彩票|赌|球|外围|博彩|六合|时时彩|赛车|赌场|筹码|盘口|返水|洗码|庄家|闲家|百家乐|斗牛|炸金花|牌九|麻将|捕鱼|电子游艺|投注' + ) select - bs.bank_statement_id AS bankStatementId, - bs.group_id AS groupId, - bs.batch_id AS logId, - '占位SQL,待补充真实规则' AS reasonDetail - from ccdi_bank_statement bs - where 1 = 0 + CAST(NULL AS SIGNED) AS bankStatementId, + CAST(NULL AS SIGNED) AS groupId, + CAST(NULL AS SIGNED) AS logId, + CONCAT( + '采购事项“', IFNULL(t.subjectName, ''), + '”实际采购金额 ', CAST(IFNULL(t.actualAmount, 0) AS CHAR), + ' 元,供应商“', IFNULL(t.supplierName, ''), '”' + ) AS reasonDetail + from ( + select distinct + pt.purchase_id AS purchaseId, + pt.subject_name AS subjectName, + pt.supplier_name AS supplierName, + pt.actual_amount AS actualAmount + from ccdi_purchase_transaction pt + inner join ccdi_base_staff staff + on CAST(staff.staff_id AS CHAR) = pt.applicant_id + where IFNULL(pt.actual_amount, 0) > 100000 + union + select distinct + pt.purchase_id AS purchaseId, + pt.subject_name AS subjectName, + pt.supplier_name AS supplierName, + pt.actual_amount AS actualAmount + from ccdi_purchase_transaction pt + inner join ccdi_base_staff staff + on CAST(staff.staff_id AS CHAR) = pt.purchase_leader_id + where pt.purchase_leader_id is not null + and IFNULL(pt.actual_amount, 0) > 100000 + ) t