Merge branch 'dev' into codex/bank-tag-real-rule-phase2-backend
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user