Files
workspace/code/fms/fms-api/config/migrations/032_rebuild_otherdata.sql
T
2026-08-02 22:05:44 +08:00

385 lines
19 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 032_rebuild_otherdata.sql — 重做"其他数据"子系统迁移
*
* 背景:此前用 OtherDataMigration 工具迁移产生错误结果——
* 1. 分类树被连跑 7 次产生重复分支;
* 2. 只有 b_port 一个数据模块,城市/币种/航线模块缺失;
* 3. b_port 真实数据未迁入(旧 b_id 含中文港口名,b_code 列 SQL_Latin1 排序规则存不下,
* 插入时中文转 '?' 触发 UQ_b_port_b_code 唯一索引冲突而整表回滚)。
*
* 本脚本(前置:026、030 已应用,b_other_bmfl 已无 b_level/b_path/b_i18n 列):
* 1. 清空并重建分类树(基础信息/财务信息/物流信息 + 4 个数据节点,模块编码沿用表名 b_*);
* 2. 移除 022 的 mock 占位数据;
* 3. b_port.b_code 排序规则改为 Chinese_PRC_CI_AS,迁入 193 条真实港口数据;
* 4. 补建 b_city / b_money / b_oceanline 数据模块(字段/列表/查询/编辑配置);
* 5. 回填 b_city / b_oceanline 迁移数据的 b_xh 排序值。
*
* 幂等:可重复执行。
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
/* =========================================================================
1. 清理错乱的分类树
========================================================================= */
DELETE FROM dbo.b_other_bmfl;
/* =========================================================================
2. 移除 022 mock 占位数据(按预留 ID 段精确删除)
========================================================================= */
DELETE FROM dbo.b_port WHERE b_id BETWEEN 920000000000110001 AND 920000000000110005;
DELETE FROM dbo.b_city WHERE b_id BETWEEN 920000000000110101 AND 920000000000110104;
DELETE FROM dbo.b_money WHERE b_id BETWEEN 920000000000110201 AND 920000000000110204;
DELETE FROM dbo.b_oceanline WHERE b_id BETWEEN 920000000000110301 AND 920000000000110304;
/* =========================================================================
3. b_port.b_code 排序规则改为 Chinese_PRC_CI_AS(容纳中文港口代码)
(需先删依赖该列的唯一索引,改完再重建)
========================================================================= */
IF EXISTS (
SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.b_port')
AND name = N'b_code'
AND collation_name <> N'Chinese_PRC_CI_AS'
)
BEGIN
IF EXISTS (
SELECT 1 FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.b_port')
AND name = N'UQ_b_port_b_code'
)
ALTER TABLE dbo.b_port DROP CONSTRAINT [UQ_b_port_b_code];
ALTER TABLE dbo.b_port ALTER COLUMN b_code varchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL;
IF NOT EXISTS (
SELECT 1 FROM sys.key_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.b_port')
AND name = N'UQ_b_port_b_code'
)
ALTER TABLE dbo.b_port ADD CONSTRAINT [UQ_b_port_b_code] UNIQUE NONCLUSTERED (b_code);
END;
GO
/* =========================================================================
4. 迁移 b_port 真实数据(193 行,含中文代码)
========================================================================= */
INSERT INTO dbo.b_port (
b_id, b_name_c, b_name_e, b_country, b_oceanline, b_edicode, b_bz, b_tz,
b_inputdatetime, b_code, b_xh
)
SELECT 920000000000110005 + ROW_NUMBER() OVER (ORDER BY LTRIM(RTRIM(old.b_id))),
old.b_name_c, old.b_name_e, old.b_country, old.b_oceanline, old.b_edicode,
old.b_bz, old.b_tz,
SYSDATETIME(),
LTRIM(RTRIM(old.b_id)),
ROW_NUMBER() OVER (ORDER BY LTRIM(RTRIM(old.b_id))) * 10
FROM G3HY2025.dbo.b_port old
WHERE NOT EXISTS (
SELECT 1 FROM dbo.b_port new WHERE new.b_code = LTRIM(RTRIM(old.b_id))
);
/* =========================================================================
5. 补建数据模块 b_city / b_money / b_oceanline
========================================================================= */
DECLARE @PageId bigint = 920000000000001100;
DECLARE @DataId bigint;
DECLARE @DataCode varchar(100);
/* ---- 5.1 b_city(城市) ---- */
SET @DataCode = 'b_city';
SET @DataId = 920000000000001102;
IF NOT EXISTS (SELECT 1 FROM dbo.s_module WHERE b_code = @DataCode)
BEGIN
INSERT INTO dbo.s_module (
b_id, b_code, b_parent_id, b_name, b_i18n, b_module_type, b_route,
b_viewtable, b_savetable, b_keyfield, b_orderfield, b_canmenu, b_canuse, b_xh
) VALUES (
@DataId, @DataCode, @PageId, N'城市', 'module.b_city', 'data', NULL,
'b_city', 'b_city', 'b_id', 'b_xh ASC', 0, 1, 20
);
END
DECLARE @CityFields TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_name nvarchar(200) NOT NULL, b_type varchar(30) NOT NULL, b_xh int NOT NULL);
INSERT INTO @CityFields VALUES
(920000000000010201, 'b_id', N'系统编号', 'input', 10),
(920000000000010202, 'b_code', N'城市代码', 'input', 20),
(920000000000010203, 'b_name_c', N'中文名称', 'input', 30),
(920000000000010204, 'b_name_e', N'英文名称', 'input', 40),
(920000000000010205, 'b_country_name_c', N'国家(中)', 'input', 50),
(920000000000010206, 'b_country_name_e', N'国家(英)', 'input', 60),
(920000000000010207, 'b_bz', N'备注', 'input', 70);
INSERT INTO dbo.s_module_field (b_id, b_module_id, b_field, b_name, b_i18n, b_type, b_canuse)
SELECT source.b_id, @DataId, source.b_field, source.b_name,
'field.b_city.' + source.b_field, source.b_type, 1
FROM @CityFields source
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field t WHERE t.b_id = source.b_id
);
DECLARE @CityList TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL, b_width int NOT NULL);
INSERT INTO @CityList VALUES
(920000000000020201, 'b_code', 10, 120),
(920000000000020202, 'b_name_c', 20, 150),
(920000000000020203, 'b_name_e', 30, 180),
(920000000000020204, 'b_country_name_c', 40, 140),
(920000000000020205, 'b_country_name_e', 50, 140);
INSERT INTO dbo.s_module_field_list (b_id, b_module_id, b_field_id, b_i18n, b_visible, b_xh, b_width)
SELECT source.b_id, @DataId, f.b_id, 'field.b_city.' + f.b_field, 1, source.b_xh, source.b_width
FROM @CityList source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_list t WHERE t.b_id = source.b_id
);
DECLARE @CityQuery TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL);
INSERT INTO @CityQuery VALUES
(920000000000030201, 'b_code', 10),
(920000000000030202, 'b_name_c', 20);
INSERT INTO dbo.s_module_field_query (b_id, b_module_id, b_field_id, b_component, b_operator, b_default_value, b_xh, b_canuse)
SELECT source.b_id, @DataId, f.b_id, 'input', 'like', NULL, source.b_xh, 1
FROM @CityQuery source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_query t WHERE t.b_id = source.b_id
);
DECLARE @CityEdit TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_visible int NOT NULL, b_xh int NOT NULL);
INSERT INTO @CityEdit VALUES
(920000000000050201, 'b_id', 0, 10),
(920000000000050202, 'b_code', 1, 20),
(920000000000050203, 'b_name_c', 1, 30),
(920000000000050204, 'b_name_e', 1, 40),
(920000000000050205, 'b_country_name_c', 1, 50),
(920000000000050206, 'b_country_name_e', 1, 60),
(920000000000050207, 'b_bz', 1, 70);
INSERT INTO dbo.s_module_field_edit (b_id, b_module_id, b_field_id, b_required, b_readonly, b_disabled, b_xh, b_visible)
SELECT source.b_id, @DataId, f.b_id, 0, 0, 0, source.b_xh, source.b_visible
FROM @CityEdit source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_edit t WHERE t.b_id = source.b_id
);
/* ---- 5.2 b_money(币种) ---- */
SET @DataCode = 'b_money';
SET @DataId = 920000000000001103;
IF NOT EXISTS (SELECT 1 FROM dbo.s_module WHERE b_code = @DataCode)
BEGIN
INSERT INTO dbo.s_module (
b_id, b_code, b_parent_id, b_name, b_i18n, b_module_type, b_route,
b_viewtable, b_savetable, b_keyfield, b_orderfield, b_canmenu, b_canuse, b_xh
) VALUES (
@DataId, @DataCode, @PageId, N'币种', 'module.b_money', 'data', NULL,
'b_money', 'b_money', 'b_id', 'b_xh ASC', 0, 1, 30
);
END
DECLARE @MoneyFields TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_name nvarchar(200) NOT NULL, b_type varchar(30) NOT NULL, b_xh int NOT NULL);
INSERT INTO @MoneyFields VALUES
(920000000000010301, 'b_id', N'系统编号', 'input', 10),
(920000000000010302, 'b_code', N'币种代码', 'input', 20),
(920000000000010303, 'b_name', N'名称', 'input', 30),
(920000000000010304, 'b_edicode', N'EDI代码', 'input', 40),
(920000000000010305, 'b_symbol', N'符号', 'input', 50),
(920000000000010306, 'b_hl', N'汇率', 'number', 60),
(920000000000010307, 'b_isconvert', N'可兑换', 'checkbox', 70),
(920000000000010308, 'b_canuse', N'启用', 'checkbox', 80),
(920000000000010309, 'b_xh', N'排序', 'number', 90),
(920000000000010310, 'b_bz', N'备注', 'input', 100);
INSERT INTO dbo.s_module_field (b_id, b_module_id, b_field, b_name, b_i18n, b_type, b_canuse)
SELECT source.b_id, @DataId, source.b_field, source.b_name,
'field.b_money.' + source.b_field, source.b_type, 1
FROM @MoneyFields source
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field t WHERE t.b_id = source.b_id
);
DECLARE @MoneyList TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL, b_width int NOT NULL);
INSERT INTO @MoneyList VALUES
(920000000000020301, 'b_code', 10, 120),
(920000000000020302, 'b_name', 20, 150),
(920000000000020303, 'b_edicode', 30, 120),
(920000000000020304, 'b_symbol', 40, 80),
(920000000000020305, 'b_hl', 50, 120),
(920000000000020306, 'b_canuse', 60, 80);
INSERT INTO dbo.s_module_field_list (b_id, b_module_id, b_field_id, b_i18n, b_visible, b_xh, b_width)
SELECT source.b_id, @DataId, f.b_id, 'field.b_money.' + f.b_field, 1, source.b_xh, source.b_width
FROM @MoneyList source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_list t WHERE t.b_id = source.b_id
);
DECLARE @MoneyQuery TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL);
INSERT INTO @MoneyQuery VALUES
(920000000000030301, 'b_code', 10),
(920000000000030302, 'b_name', 20);
INSERT INTO dbo.s_module_field_query (b_id, b_module_id, b_field_id, b_component, b_operator, b_default_value, b_xh, b_canuse)
SELECT source.b_id, @DataId, f.b_id, 'input', 'like', NULL, source.b_xh, 1
FROM @MoneyQuery source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_query t WHERE t.b_id = source.b_id
);
DECLARE @MoneyEdit TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_visible int NOT NULL, b_xh int NOT NULL);
INSERT INTO @MoneyEdit VALUES
(920000000000050301, 'b_id', 0, 10),
(920000000000050302, 'b_code', 1, 20),
(920000000000050303, 'b_name', 1, 30),
(920000000000050304, 'b_edicode', 1, 40),
(920000000000050305, 'b_symbol', 1, 50),
(920000000000050306, 'b_hl', 1, 60),
(920000000000050307, 'b_isconvert', 1, 70),
(920000000000050308, 'b_canuse', 1, 80),
(920000000000050309, 'b_xh', 1, 90),
(920000000000050310, 'b_bz', 1, 100);
INSERT INTO dbo.s_module_field_edit (b_id, b_module_id, b_field_id, b_required, b_readonly, b_disabled, b_xh, b_visible)
SELECT source.b_id, @DataId, f.b_id, 0, 0, 0, source.b_xh, source.b_visible
FROM @MoneyEdit source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_edit t WHERE t.b_id = source.b_id
);
/* ---- 5.3 b_oceanline(航线) ---- */
SET @DataCode = 'b_oceanline';
SET @DataId = 920000000000001104;
IF NOT EXISTS (SELECT 1 FROM dbo.s_module WHERE b_code = @DataCode)
BEGIN
INSERT INTO dbo.s_module (
b_id, b_code, b_parent_id, b_name, b_i18n, b_module_type, b_route,
b_viewtable, b_savetable, b_keyfield, b_orderfield, b_canmenu, b_canuse, b_xh
) VALUES (
@DataId, @DataCode, @PageId, N'航线', 'module.b_oceanline', 'data', NULL,
'b_oceanline', 'b_oceanline', 'b_id', 'b_xh ASC', 0, 1, 40
);
END
DECLARE @OceanFields TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_name nvarchar(200) NOT NULL, b_type varchar(30) NOT NULL, b_xh int NOT NULL);
INSERT INTO @OceanFields VALUES
(920000000000010401, 'b_id', N'系统编号', 'input', 10),
(920000000000010402, 'b_code', N'航线代码', 'input', 20),
(920000000000010403, 'b_name', N'名称', 'input', 30),
(920000000000010404, 'b_edicode', N'EDI代码', 'input', 40),
(920000000000010405, 'b_bz', N'备注', 'input', 50);
INSERT INTO dbo.s_module_field (b_id, b_module_id, b_field, b_name, b_i18n, b_type, b_canuse)
SELECT source.b_id, @DataId, source.b_field, source.b_name,
'field.b_oceanline.' + source.b_field, source.b_type, 1
FROM @OceanFields source
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field t WHERE t.b_id = source.b_id
);
DECLARE @OceanList TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL, b_width int NOT NULL);
INSERT INTO @OceanList VALUES
(920000000000020401, 'b_code', 10, 120),
(920000000000020402, 'b_name', 20, 180),
(920000000000020403, 'b_edicode', 30, 120);
INSERT INTO dbo.s_module_field_list (b_id, b_module_id, b_field_id, b_i18n, b_visible, b_xh, b_width)
SELECT source.b_id, @DataId, f.b_id, 'field.b_oceanline.' + f.b_field, 1, source.b_xh, source.b_width
FROM @OceanList source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_list t WHERE t.b_id = source.b_id
);
DECLARE @OceanQuery TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_xh int NOT NULL);
INSERT INTO @OceanQuery VALUES
(920000000000030401, 'b_code', 10),
(920000000000030402, 'b_name', 20);
INSERT INTO dbo.s_module_field_query (b_id, b_module_id, b_field_id, b_component, b_operator, b_default_value, b_xh, b_canuse)
SELECT source.b_id, @DataId, f.b_id, 'input', 'like', NULL, source.b_xh, 1
FROM @OceanQuery source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_query t WHERE t.b_id = source.b_id
);
DECLARE @OceanEdit TABLE (b_id bigint NOT NULL, b_field varchar(50) NOT NULL, b_visible int NOT NULL, b_xh int NOT NULL);
INSERT INTO @OceanEdit VALUES
(920000000000050401, 'b_id', 0, 10),
(920000000000050402, 'b_code', 1, 20),
(920000000000050403, 'b_name', 1, 30),
(920000000000050404, 'b_edicode', 1, 40),
(920000000000050405, 'b_bz', 1, 50);
INSERT INTO dbo.s_module_field_edit (b_id, b_module_id, b_field_id, b_required, b_readonly, b_disabled, b_xh, b_visible)
SELECT source.b_id, @DataId, f.b_id, 0, 0, 0, source.b_xh, source.b_visible
FROM @OceanEdit source
JOIN dbo.s_module_field f ON f.b_module_id = @DataId AND f.b_field = source.b_field
WHERE NOT EXISTS (
SELECT 1 FROM dbo.s_module_field_edit t WHERE t.b_id = source.b_id
);
/* =========================================================================
6. 回填 b_city / b_oceanline 迁移数据的 b_xh(b_money 旧库自带 b_xh)
========================================================================= */
WITH numbered AS (
SELECT b_id, b_xh, ROW_NUMBER() OVER (ORDER BY b_code ASC, b_id ASC) AS row_no
FROM dbo.b_city WHERE b_xh IS NULL
)
UPDATE numbered SET b_xh = row_no * 10;
WITH numbered AS (
SELECT b_id, b_xh, ROW_NUMBER() OVER (ORDER BY b_code ASC, b_id ASC) AS row_no
FROM dbo.b_oceanline WHERE b_xh IS NULL
)
UPDATE numbered SET b_xh = row_no * 10;
/* =========================================================================
7. 重建分类树(引用设计:category 仅结构,module 引用 s_module.b_code)
========================================================================= */
DECLARE @CatBasic bigint = 930000000000000101;
DECLARE @CatFinance bigint = 930000000000000102;
DECLARE @CatLogistics bigint = 930000000000000103;
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @CatBasic)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@CatBasic, NULL, N'基础信息', 'category', NULL, 10, 1);
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @CatFinance)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@CatFinance, NULL, N'财务信息', 'category', NULL, 20, 1);
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @CatLogistics)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@CatLogistics, NULL, N'物流信息', 'category', NULL, 30, 1);
DECLARE @NodePort bigint = 930000000000000201;
DECLARE @NodeCity bigint = 930000000000000202;
DECLARE @NodeMoney bigint = 930000000000000203;
DECLARE @NodeOceanline bigint = 930000000000000204;
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @NodePort)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@NodePort, @CatBasic, N'港口', 'module', 'b_port', 10, 1);
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @NodeCity)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@NodeCity, @CatBasic, N'城市', 'module', 'b_city', 20, 1);
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @NodeMoney)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@NodeMoney, @CatFinance, N'币种', 'module', 'b_money', 10, 1);
IF NOT EXISTS (SELECT 1 FROM dbo.b_other_bmfl WHERE b_id = @NodeOceanline)
INSERT INTO dbo.b_other_bmfl (b_id, b_parent_id, b_name, b_node_type, b_module_code, b_xh, b_canuse)
VALUES (@NodeOceanline, @CatLogistics, N'航线', 'module', 'b_oceanline', 10, 1);
COMMIT TRANSACTION;