fix(sql): make fee migration MySQL-compatible
This commit is contained in:
@@ -6567,14 +6567,20 @@ DROP PROCEDURE IF EXISTS unified_publish_assert_fee_item_preflight;
|
|||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE PROCEDURE unified_publish_assert_fee_item_preflight()
|
CREATE PROCEDURE unified_publish_assert_fee_item_preflight()
|
||||||
BEGIN
|
BEGIN
|
||||||
IF (SELECT COUNT(*) FROM tmp_fee_item_seed) <> 110
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed) <> 110 THEN
|
||||||
OR (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'DOMESTIC') <> 84
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子总数不正确';
|
||||||
OR (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'INTERNATIONAL') <> 26 THEN
|
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子数量或国内国际范围不正确';
|
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (SELECT fee_code FROM tmp_fee_item_seed GROUP BY fee_code HAVING COUNT(*) > 1)
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'DOMESTIC') <> 84 THEN
|
||||||
OR EXISTS (SELECT trade_scope, fee_type_name FROM tmp_fee_item_seed GROUP BY trade_scope, fee_type_name HAVING COUNT(*) > 1) THEN
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel国内种子数量不正确';
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子编码或语义键重复';
|
END IF;
|
||||||
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'INTERNATIONAL') <> 26 THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel国际种子数量不正确';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT fee_code FROM tmp_fee_item_seed GROUP BY fee_code HAVING COUNT(*) > 1) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子编码重复';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT trade_scope, fee_type_name FROM tmp_fee_item_seed GROUP BY trade_scope, fee_type_name HAVING COUNT(*) > 1) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子语义键重复';
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
SELECT f.id
|
SELECT f.id
|
||||||
@@ -6648,18 +6654,20 @@ BEGIN
|
|||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
SELECT f.id
|
SELECT f.id
|
||||||
FROM fl_fee_item f
|
FROM fl_fee_item f
|
||||||
LEFT JOIN tmp_fee_item_seed by_code ON by_code.fee_code = NULLIF(TRIM(f.fee_code), '')
|
LEFT JOIN tmp_fee_item_seed matched_seed
|
||||||
LEFT JOIN tmp_fee_item_seed by_semantic ON by_semantic.trade_scope = f.trade_scope
|
ON matched_seed.fee_code = NULLIF(TRIM(f.fee_code), '')
|
||||||
AND by_semantic.fee_type_name = f.fee_type_name
|
OR (matched_seed.trade_scope = f.trade_scope
|
||||||
WHERE f.tenant_id > 0 AND by_code.seed_no IS NULL AND by_semantic.seed_no IS NULL
|
AND matched_seed.fee_type_name = f.fee_type_name)
|
||||||
|
WHERE f.tenant_id > 0 AND matched_seed.seed_no IS NULL
|
||||||
) THEN
|
) THEN
|
||||||
SELECT 'UNMAPPED_CUSTOMER_ITEM' AS conflict_type, f.id, f.tenant_id, f.fee_code,
|
SELECT 'UNMAPPED_CUSTOMER_ITEM' AS conflict_type, f.id, f.tenant_id, f.fee_code,
|
||||||
f.trade_scope, f.fee_type_name
|
f.trade_scope, f.fee_type_name
|
||||||
FROM fl_fee_item f
|
FROM fl_fee_item f
|
||||||
LEFT JOIN tmp_fee_item_seed by_code ON by_code.fee_code = NULLIF(TRIM(f.fee_code), '')
|
LEFT JOIN tmp_fee_item_seed matched_seed
|
||||||
LEFT JOIN tmp_fee_item_seed by_semantic ON by_semantic.trade_scope = f.trade_scope
|
ON matched_seed.fee_code = NULLIF(TRIM(f.fee_code), '')
|
||||||
AND by_semantic.fee_type_name = f.fee_type_name
|
OR (matched_seed.trade_scope = f.trade_scope
|
||||||
WHERE f.tenant_id > 0 AND by_code.seed_no IS NULL AND by_semantic.seed_no IS NULL;
|
AND matched_seed.fee_type_name = f.fee_type_name)
|
||||||
|
WHERE f.tenant_id > 0 AND matched_seed.seed_no IS NULL;
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:存在无法匹配公共种子的客户费用项目';
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:存在无法匹配公共种子的客户费用项目';
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
|
|||||||
@@ -170,14 +170,20 @@ DROP PROCEDURE IF EXISTS phase2_publish_assert_fee_item_preflight;
|
|||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE PROCEDURE phase2_publish_assert_fee_item_preflight()
|
CREATE PROCEDURE phase2_publish_assert_fee_item_preflight()
|
||||||
BEGIN
|
BEGIN
|
||||||
IF (SELECT COUNT(*) FROM tmp_fee_item_seed) <> 110
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed) <> 110 THEN
|
||||||
OR (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'DOMESTIC') <> 84
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子总数不正确';
|
||||||
OR (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'INTERNATIONAL') <> 26 THEN
|
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子数量或国内国际范围不正确';
|
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (SELECT fee_code FROM tmp_fee_item_seed GROUP BY fee_code HAVING COUNT(*) > 1)
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'DOMESTIC') <> 84 THEN
|
||||||
OR EXISTS (SELECT trade_scope, fee_type_name FROM tmp_fee_item_seed GROUP BY trade_scope, fee_type_name HAVING COUNT(*) > 1) THEN
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel国内种子数量不正确';
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子编码或语义键重复';
|
END IF;
|
||||||
|
IF (SELECT COUNT(*) FROM tmp_fee_item_seed WHERE trade_scope = 'INTERNATIONAL') <> 26 THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel国际种子数量不正确';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT fee_code FROM tmp_fee_item_seed GROUP BY fee_code HAVING COUNT(*) > 1) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子编码重复';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT trade_scope, fee_type_name FROM tmp_fee_item_seed GROUP BY trade_scope, fee_type_name HAVING COUNT(*) > 1) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:Excel种子语义键重复';
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
SELECT f.id
|
SELECT f.id
|
||||||
@@ -251,18 +257,20 @@ BEGIN
|
|||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
SELECT f.id
|
SELECT f.id
|
||||||
FROM fl_fee_item f
|
FROM fl_fee_item f
|
||||||
LEFT JOIN tmp_fee_item_seed by_code ON by_code.fee_code = NULLIF(TRIM(f.fee_code), '')
|
LEFT JOIN tmp_fee_item_seed matched_seed
|
||||||
LEFT JOIN tmp_fee_item_seed by_semantic ON by_semantic.trade_scope = f.trade_scope
|
ON matched_seed.fee_code = NULLIF(TRIM(f.fee_code), '')
|
||||||
AND by_semantic.fee_type_name = f.fee_type_name
|
OR (matched_seed.trade_scope = f.trade_scope
|
||||||
WHERE f.tenant_id > 0 AND by_code.seed_no IS NULL AND by_semantic.seed_no IS NULL
|
AND matched_seed.fee_type_name = f.fee_type_name)
|
||||||
|
WHERE f.tenant_id > 0 AND matched_seed.seed_no IS NULL
|
||||||
) THEN
|
) THEN
|
||||||
SELECT 'UNMAPPED_CUSTOMER_ITEM' AS conflict_type, f.id, f.tenant_id, f.fee_code,
|
SELECT 'UNMAPPED_CUSTOMER_ITEM' AS conflict_type, f.id, f.tenant_id, f.fee_code,
|
||||||
f.trade_scope, f.fee_type_name
|
f.trade_scope, f.fee_type_name
|
||||||
FROM fl_fee_item f
|
FROM fl_fee_item f
|
||||||
LEFT JOIN tmp_fee_item_seed by_code ON by_code.fee_code = NULLIF(TRIM(f.fee_code), '')
|
LEFT JOIN tmp_fee_item_seed matched_seed
|
||||||
LEFT JOIN tmp_fee_item_seed by_semantic ON by_semantic.trade_scope = f.trade_scope
|
ON matched_seed.fee_code = NULLIF(TRIM(f.fee_code), '')
|
||||||
AND by_semantic.fee_type_name = f.fee_type_name
|
OR (matched_seed.trade_scope = f.trade_scope
|
||||||
WHERE f.tenant_id > 0 AND by_code.seed_no IS NULL AND by_semantic.seed_no IS NULL;
|
AND matched_seed.fee_type_name = f.fee_type_name)
|
||||||
|
WHERE f.tenant_id > 0 AND matched_seed.seed_no IS NULL;
|
||||||
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:存在无法匹配公共种子的客户费用项目';
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '二期费用项目迁移失败:存在无法匹配公共种子的客户费用项目';
|
||||||
END IF;
|
END IF;
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
|
|||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
package com.baiyue.firstleg.repository;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class FeeItemMigrationSqlContractTest {
|
||||||
|
@Test
|
||||||
|
void temporarySeedTableIsNotReopenedWithinOneMysqlStatement() throws Exception {
|
||||||
|
assertMysqlCompatible(resolve("deploy/sql/头程数据库统一增量-MySQL8.sql"));
|
||||||
|
assertMysqlCompatible(resolve(
|
||||||
|
"firstleg/src/main/resources/db/phase2-published-freight-detail-migration.sql"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertMysqlCompatible(Path path) throws Exception {
|
||||||
|
String sql = Files.readString(path, StandardCharsets.UTF_8);
|
||||||
|
assertThat(sql)
|
||||||
|
.contains("LEFT JOIN tmp_fee_item_seed matched_seed")
|
||||||
|
.contains("matched_seed.fee_code = NULLIF(TRIM(f.fee_code), '')")
|
||||||
|
.contains("matched_seed.trade_scope = f.trade_scope")
|
||||||
|
.doesNotContain("LEFT JOIN tmp_fee_item_seed by_code")
|
||||||
|
.doesNotContain("LEFT JOIN tmp_fee_item_seed by_semantic")
|
||||||
|
.doesNotContain("OR (SELECT COUNT(*) FROM tmp_fee_item_seed")
|
||||||
|
.doesNotContain("OR EXISTS (SELECT trade_scope, fee_type_name FROM tmp_fee_item_seed");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Path resolve(String value) {
|
||||||
|
Path direct = Path.of(value);
|
||||||
|
if (Files.exists(direct)) return direct;
|
||||||
|
return Path.of("..", value).normalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user