Merge branch 'dev' into codex/bank-tag-real-rule-phase2-backend

This commit is contained in:
wkc
2026-03-20 16:28:47 +08:00
21 changed files with 2178 additions and 233 deletions

View File

@@ -328,7 +328,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
fur.file_name AS originalFileName,
fur.upload_time AS uploadTime
FROM ccdi_bank_statement bs
LEFT JOIN ccdi_file_upload_record fur ON fur.log_id = bs.batch_id AND fur.project_id = bs.project_id
LEFT JOIN (
SELECT latest_record.project_id, latest_record.log_id, latest_record.file_name, latest_record.upload_time
FROM ccdi_file_upload_record latest_record
INNER JOIN (
SELECT project_id, log_id, MAX(id) AS max_id
FROM ccdi_file_upload_record
GROUP BY project_id, log_id
) latest_meta ON latest_meta.max_id = latest_record.id
) fur ON fur.log_id = bs.batch_id AND fur.project_id = bs.project_id
WHERE bs.bank_statement_id = #{bankStatementId}
</select>

View File

@@ -121,7 +121,10 @@ class CcdiBankStatementMapperXmlTest {
String xml = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
assertTrue(
xml.contains("LEFT JOIN ccdi_file_upload_record fur ON fur.log_id = bs.batch_id AND fur.project_id = bs.project_id"),
xml.contains("LEFT JOIN (")
&& xml.contains("SELECT latest_record.project_id, latest_record.log_id, latest_record.file_name, latest_record.upload_time")
&& xml.contains("MAX(id) AS max_id")
&& xml.contains("fur.log_id = bs.batch_id AND fur.project_id = bs.project_id"),
xml
);
assertTrue(xml.contains("fur.file_name AS originalFileName"), xml);

View File

@@ -0,0 +1,48 @@
package com.ruoyi.ccdi.project.sql;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertTrue;
class CcdiBankTagRuleSqlMetadataTest {
@Test
void phase1MetadataSql_shouldAlignInitAndMigrationScripts() throws IOException {
String initSql = readProjectFile("sql", "2026-03-16-bank-tagging.sql");
String migrationSql = readProjectFile("sql", "migration", "2026-03-20-sync-bank-tag-phase1-rule-metadata.sql");
assertPhase1Metadata(initSql);
assertPhase1Metadata(migrationSql);
}
private void assertPhase1Metadata(String sqlContent) {
assertAll(
() -> assertTrue(sqlContent.contains("'FOREX_BUY_AMT'")
&& sqlContent.contains("'SINGLE_PURCHASE_AMOUNT'"),
"FOREX_BUY_AMT 应使用 SINGLE_PURCHASE_AMOUNT"),
() -> assertTrue(sqlContent.contains("'FOREX_SELL_AMT'")
&& sqlContent.contains("'SINGLE_SETTLEMENT_AMOUNT'"),
"FOREX_SELL_AMT 应使用 SINGLE_SETTLEMENT_AMOUNT"),
() -> assertTrue(sqlContent.contains("'LARGE_STOCK_TRADING'")
&& sqlContent.contains("'STOCK_TFR_LARGE'"),
"LARGE_STOCK_TRADING 应使用 STOCK_TFR_LARGE"),
() -> assertTrue(sqlContent.contains("真实规则:识别单笔购汇金额超过阈值的流水"),
"应同步 FOREX_BUY_AMT 的真实规则说明"),
() -> assertTrue(sqlContent.contains("真实规则:识别单笔结汇金额超过阈值的流水"),
"应同步 FOREX_SELL_AMT 的真实规则说明"),
() -> assertTrue(sqlContent.contains("真实规则:识别单笔三方资管交易金额超过阈值的流水"),
"应同步 LARGE_STOCK_TRADING 的真实规则说明")
);
}
private String readProjectFile(String... parts) throws IOException {
Path path = Path.of("..", parts);
return Files.readString(path, StandardCharsets.UTF_8);
}
}