/* 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;