From a01dd8dec37489b188c2f1ad49d1418f239146a5 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Mon, 16 Mar 2026 17:27:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=A0=B8=E5=BF=83=E8=A1=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=B8=8E=E5=AE=9E=E4=BD=93=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/CcdiBankTagResult.java | 66 +++++++++++++++ .../domain/entity/CcdiBankTagRule.java | 54 +++++++++++++ .../domain/entity/CcdiBankTagTask.java | 54 +++++++++++++ .../entity/CcdiBankTagEntityMappingTest.java | 24 ++++++ sql/2026-03-16-bank-tagging.sql | 81 +++++++++++++++++++ 5 files changed, 279 insertions(+) create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagResult.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagRule.java create mode 100644 ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagTask.java create mode 100644 ccdi-project/src/test/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagEntityMappingTest.java create mode 100644 sql/2026-03-16-bank-tagging.sql diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagResult.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagResult.java new file mode 100644 index 00000000..f0f8f34c --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagResult.java @@ -0,0 +1,66 @@ +package com.ruoyi.ccdi.project.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流水标签结果实体 + */ +@Data +@TableName("ccdi_bank_statement_tag_result") +public class CcdiBankTagResult implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Long id; + + private Long projectId; + + private String modelCode; + + private String modelName; + + private String ruleCode; + + private String ruleName; + + private String indicatorCode; + + private String resultType; + + private String riskLevel; + + private Long bankStatementId; + + private String objectType; + + private String objectKey; + + private Integer groupId; + + private Integer logId; + + private String reasonDetail; + + private String businessCaliberSnapshot; + + private String hitValueSnapshot; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + private String remark; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagRule.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagRule.java new file mode 100644 index 00000000..2805c1df --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagRule.java @@ -0,0 +1,54 @@ +package com.ruoyi.ccdi.project.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流水标签规则定义实体 + */ +@Data +@TableName("ccdi_bank_tag_rule") +public class CcdiBankTagRule implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Long id; + + private String modelCode; + + private String modelName; + + private String ruleCode; + + private String ruleName; + + private String indicatorCode; + + private String resultType; + + private String riskLevel; + + private String businessCaliber; + + private Integer enabled; + + private Integer sortOrder; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + + private String remark; +} diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagTask.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagTask.java new file mode 100644 index 00000000..0ff80aa7 --- /dev/null +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagTask.java @@ -0,0 +1,54 @@ +package com.ruoyi.ccdi.project.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 流水标签任务实体 + */ +@Data +@TableName("ccdi_bank_tag_task") +public class CcdiBankTagTask implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Long id; + + private Long projectId; + + private String triggerType; + + private String modelCode; + + private String status; + + private Integer needRerun; + + private Integer successRuleCount; + + private Integer failedRuleCount; + + private Integer hitCount; + + private String errorMessage; + + private Date startTime; + + private Date endTime; + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; +} diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagEntityMappingTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagEntityMappingTest.java new file mode 100644 index 00000000..13fffb53 --- /dev/null +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/domain/entity/CcdiBankTagEntityMappingTest.java @@ -0,0 +1,24 @@ +package com.ruoyi.ccdi.project.domain.entity; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CcdiBankTagEntityMappingTest { + + @Test + void bankTagResult_shouldExposeStatementAndObjectFields() { + CcdiBankTagResult result = new CcdiBankTagResult(); + result.setProjectId(40L); + result.setRuleCode("RULE_1"); + result.setBankStatementId(10L); + result.setGroupId(40); + result.setLogId(40001); + result.setObjectType("STAFF_ID_CARD"); + result.setObjectKey("330101198801010011"); + + assertEquals(40L, result.getProjectId()); + assertEquals(40001, result.getLogId()); + assertEquals("STAFF_ID_CARD", result.getObjectType()); + } +} diff --git a/sql/2026-03-16-bank-tagging.sql b/sql/2026-03-16-bank-tagging.sql new file mode 100644 index 00000000..cbd945fc --- /dev/null +++ b/sql/2026-03-16-bank-tagging.sql @@ -0,0 +1,81 @@ +CREATE TABLE IF NOT EXISTS `ccdi_bank_tag_rule` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `model_code` VARCHAR(64) NOT NULL COMMENT '模型编码', + `model_name` VARCHAR(128) NOT NULL COMMENT '模型名称', + `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码', + `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称', + `indicator_code` VARCHAR(64) DEFAULT NULL COMMENT '指标编码', + `result_type` VARCHAR(32) NOT NULL COMMENT '结果类型', + `risk_level` VARCHAR(32) DEFAULT NULL COMMENT '风险等级', + `business_caliber` VARCHAR(1000) DEFAULT NULL COMMENT '业务口径', + `enabled` TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用', + `sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序', + `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_ccdi_bank_tag_rule_code` (`rule_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水标签规则定义表'; + +CREATE TABLE IF NOT EXISTS `ccdi_bank_statement_tag_result` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `model_code` VARCHAR(64) NOT NULL COMMENT '模型编码', + `model_name` VARCHAR(128) NOT NULL COMMENT '模型名称', + `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码', + `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称', + `indicator_code` VARCHAR(64) DEFAULT NULL COMMENT '指标编码', + `result_type` VARCHAR(32) NOT NULL COMMENT '结果类型', + `risk_level` VARCHAR(32) DEFAULT NULL COMMENT '风险等级', + `bank_statement_id` BIGINT DEFAULT NULL COMMENT '流水ID', + `object_type` VARCHAR(64) DEFAULT NULL COMMENT '对象类型', + `object_key` VARCHAR(128) DEFAULT NULL COMMENT '对象主键', + `group_id` INT DEFAULT NULL COMMENT '项目分组ID', + `log_id` INT DEFAULT NULL COMMENT '批次日志ID', + `reason_detail` VARCHAR(2000) DEFAULT NULL COMMENT '异常原因快照', + `business_caliber_snapshot` VARCHAR(2000) DEFAULT NULL COMMENT '业务口径快照', + `hit_value_snapshot` VARCHAR(1000) DEFAULT NULL COMMENT '命中值快照', + `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_ccdi_bank_tag_statement_hit` (`project_id`, `rule_code`, `bank_statement_id`), + UNIQUE KEY `uk_ccdi_bank_tag_object_hit` (`project_id`, `rule_code`, `object_type`, `object_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水标签结果表'; + +CREATE TABLE IF NOT EXISTS `ccdi_bank_tag_task` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `trigger_type` VARCHAR(64) NOT NULL COMMENT '触发方式', + `model_code` VARCHAR(64) DEFAULT NULL COMMENT '模型编码', + `status` VARCHAR(32) NOT NULL COMMENT '任务状态', + `need_rerun` TINYINT NOT NULL DEFAULT 0 COMMENT '是否需要补跑', + `success_rule_count` INT NOT NULL DEFAULT 0 COMMENT '成功规则数', + `failed_rule_count` INT NOT NULL DEFAULT 0 COMMENT '失败规则数', + `hit_count` INT NOT NULL DEFAULT 0 COMMENT '命中数量', + `error_message` VARCHAR(2000) DEFAULT NULL COMMENT '错误信息', + `start_time` DATETIME DEFAULT NULL COMMENT '开始时间', + `end_time` DATETIME DEFAULT NULL COMMENT '结束时间', + `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_ccdi_bank_tag_task_project_status` (`project_id`, `status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水标签任务表'; + +INSERT INTO `ccdi_bank_tag_rule` +(`model_code`, `model_name`, `rule_code`, `rule_name`, `indicator_code`, `result_type`, `risk_level`, `business_caliber`, `enabled`, `sort_order`, `create_by`, `remark`) +VALUES +('LARGE_TRANSACTION', '大额交易', 'HOUSE_OR_CAR_EXPENSE', '房车消费支出交易', 'HOUSE_OR_CAR_EXPENSE', 'STATEMENT', 'HIGH', '识别房产、购车等大额消费支出流水', 1, 10, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'TAX_EXPENSE', '税务支出交易', 'TAX_EXPENSE', 'STATEMENT', 'HIGH', '识别税务类大额支出流水', 1, 20, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'SINGLE_LARGE_INCOME', '大额单笔收入', 'SINGLE_TRANSACTION_AMOUNT', 'STATEMENT', 'HIGH', '识别超过单笔阈值的收入流水', 1, 30, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'CUMULATIVE_INCOME', '累计收入超限', 'CUMULATIVE_TRANSACTION_AMOUNT', 'OBJECT', 'HIGH', '识别累计收入超过阈值的对象', 1, 40, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'ANNUAL_TURNOVER', '年流水交易额超限', 'annual_turnover', 'OBJECT', 'HIGH', '识别年交易额超过阈值的对象', 1, 50, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'LARGE_CASH_DEPOSIT', '大额存现交易', 'LARGE_CASH_DEPOSIT', 'STATEMENT', 'HIGH', '识别大额现金存入流水', 1, 60, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'FREQUENT_CASH_DEPOSIT', '短时间多次存现', 'FREQUENT_CASH_DEPOSIT', 'OBJECT', 'HIGH', '识别短时间多次现金存入对象', 1, 70, 'system', '初始化规则'), +('LARGE_TRANSACTION', '大额交易', 'LARGE_TRANSFER', '大额转账交易', 'FREQUENT_TRANSFER', 'STATEMENT', 'HIGH', '识别大额转账流水', 1, 80, 'system', '初始化规则');