Files
workspace/code/fms/fms-api/tools/migration
2026-09-22 17:29:39 +08:00
..
2026-09-20 17:34:40 +08:00
2026-09-20 17:34:40 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-08-02 22:05:44 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-09-22 17:29:39 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 22:30:13 +08:00
2026-09-20 22:05:20 +08:00
2026-09-15 17:00:29 +08:00
2026-09-14 22:49:48 +08:00
2026-09-14 22:30:13 +08:00
2026-09-14 17:28:20 +08:00
2026-09-15 17:00:29 +08:00

迁移工具

fms-api/tools/migration/ 下的独立 Java 工具,用于在旧库 G3HY2025 与新库 FMS 之间 迁移数据、同步元数据、导出表结构。每个工具都是单文件程序,用 javac 手动编译运行,不走 Maven。

工具清单

工具 状态 用途
FieldNameSync.java V2 当前版本 从旧库 s_columnLib 同步字段名称与显示配置到 s_field / s_module_schema
SchemaDumpMarkdown.java 通用 导出该实例上任意库的表与视图结构为 Markdown
RunSqlFile.java 通用 在 FMS 库执行 sql/ 下的建表 / 视图 / 索引脚本(按 GO 分批,单事务)
OtherDataProbe.java 迁移辅助(只读) list 列出旧库 b_other_bmfl 的 65 个字典模块(启用/旧库行数/新库已建),输出 otherdata-modules.txt;tables <表名...> 导出新旧结构 + 旧库数据样例
OtherDataMigrate.java 其他数据迁移 导入 base_otherdata 下 64 个字典模块的数据(雪花主键)、重建 b_from/b_grade、转换 b_othercompany 引用值,输出映射 otherdata-id-map.tsv;支持 --dry-run
TreePathRepair.java 核对 / 修复 按 b_parent_id 重建树表的 b_depth / b_path,默认只读报告,--apply 才写库

FieldNameSync — 字段配置同步(V2)

从旧库 G3HY2025.dbo.s_columnLib 同步到新库 FMS:

序号 旧库来源 新库目标 说明
1 col_Caption s_field.b_name 字段中文名称
2 col_Visible='1' 的行 s_module_schema(b_schema_type='view')JSON 的 columns 列表列成员
3 col_edit='1' 的行 s_module_schema(b_schema_type='edit')JSON 的 children 表单成员
4 col_Width / col_Position view 节点的 width 与顺序 列表列宽与排列
5 col_edit_position edit 节点的顺序 表单字段排列

关联规则

旧库 s_columnLib.col_TableName  =  新库 s_module.b_view_table
旧库 s_columnLib.col_FieldName  =  新库 s_field.b_field

两侧按 Chinese_PRC_CI_AS 比较,兼容 v_b_OtherCompany 这类大小写差异。 s_module.b_view_table 对不上时,用第二个命令行参数显式指定旧库表/视图名。

字段名称

  • 旧库有 col_Caption 时写入 s_field.b_name;为空或该字段在旧库没有记录时保留原值。
  • 只处理 s_field.b_canuse = 1 的字段。

显示配置:整份重建

view / edit 两份 b_schema_json 由旧库名单完整重新生成, 不保留模块管理界面里手工调整的布局。已有非空行时必须加 --force 才覆盖, 否则工具在写入前整体拒绝退出。

成员资格沿用旧库语义:旧库标志为 '1' 的字段才进入对应配置, 其余字段(标志为 '0'、空值、旧库无记录)直接不写入 JSON,不写 visible:false。 s_field 里有、旧库名单里没有的字段同样不进入配置(节点不存在 = 不显示、不参与表单)。

顺序取旧库位置列:view 按 col_Position、edit 按 col_edit_position,位置缺失的排在最后; view 里备注列(b_bz)固定排到最后。 列表列宽取 col_Width,未配置时省略 width 键(前端按自身默认值渲染)。

生成的 JSON 结构与前端消费侧一致 (见 fms-vue/src/components/fms-module-common/schemaRender.js):

view: {"schemaVersion":1,"columns":[{"field":"b_id","width":123},{"field":"b_name","width":122}]}
edit: {"schemaVersion":1,"children":[{"field":"b_id","span":24},{"field":"b_name","span":24}]}

col_ShowSummary / col_DisplayFormat / col_CanSearch / col_ReadOnly / col_DefaultValue / col_edit_type 等旧库列在 V2 的 JSON 契约里没有对应位置(schemaRender.js 只读 field / width / visible / options),本工具不带迁移。

query 配置行不由本工具处理(旧库没有对应来源)。

前置条件

  1. JDK 21(源码使用文本块语法)。

  2. mssql-jdbc 驱动,本目录已放了一份 mssql-jdbc-13.4.0.jre11.jar。

  3. 数据库连接:工具硬编码连接 118.89.70.199:1433,直连 FMS 并用三段名访问 G3HY2025。

  4. 模块已注册:目标模块的 b_id 必须在 s_module 中存在,且 s_field 里已有字段。

编译和运行

cd fms-api/tools/migration

# 设置 JDK 21
export JAVA_HOME=/path/to/jdk-21   # Linux/Mac
set JAVA_HOME=D:\devtool\jdk\jdk-21  # Windows

# 编译(源文件含中文注释,需指定 UTF-8 编码)
javac -encoding UTF-8 -cp "mssql-jdbc-13.4.0.jre11.jar" FieldNameSync.java

# 先 Dry-run 看清楚会发生什么
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp ".;mssql-jdbc-13.4.0.jre11.jar" FieldNameSync v_b_othercompany --dry-run

# 确认后执行
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp ".;mssql-jdbc-13.4.0.jre11.jar" FieldNameSync v_b_othercompany

# 运行完毕后删除 class 文件
del FieldNameSync*.class

-Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 用于让 Windows 控制台正确显示中文输出,可省略。

选项:

选项 说明
<moduleId> 必填,s_module.b_id,例如 v_b_othercompany
[oldTableName] 可选,覆盖旧库表/视图名;缺省用 s_module.b_view_table
--dry-run 只报告不写库,结束时回滚
--skip-schema 只同步 s_field.b_name,不重建 s_module_schema
--force 允许覆盖已存在且非空的 s_module_schema 行
--all-otherdata 批量模式:同步 base_otherdata 下所有数据模块(不需要 <moduleId>,失败跳过继续)

输出示例

模块: v_b_othercompany(合作伙伴)  类型: data
关联旧库表: v_b_othercompany(取自 s_module.b_view_table)
旧库 s_columnLib: 50 行,去重字段 50 个;当前模块 51 个字段中:进列表 15 个、进表单 41 个

=== 同步前 ===
  b_field                  s_field.b_name         col_Caption            进列表     进表单
  ----------------------------------------------------------------------------------------------
  b_id                     系统编号                   系统编号                   是          是
  b_ywid                   b_ywid                 (null)                 否          否
  ...

=== 1) 字段名称 (col_Caption → s_field.b_name) ===
  更新: 43 条;旧库无名称、保留原值: 8 条

=== 事务已提交 ===

=== 摘要 ===
  s_field.b_name 更新: 43 条
  s_module_schema(view): 15 个节点,未进入配置 36 个字段,新增行
  s_module_schema(edit): 41 个节点,未进入配置 10 个字段,新增行
  提示: 该模块尚无 query 配置行,工具不处理 query,需要时在模块管理中生成。

用 AI 助手调用

帮我用 FieldNameSync 同步模块 <moduleId> 的字段配置。

  1. 进入 fms-api/tools/migration/ 目录
  2. 用 JDK 21 编译:javac -encoding UTF-8 -cp "mssql-jdbc-13.4.0.jre11.jar" FieldNameSync.java
  3. 先跑 java -cp ".;mssql-jdbc-13.4.0.jre11.jar" FieldNameSync <moduleId> --dry-run 核对
  4. 确认后去掉 --dry-run 执行;目标模块已有非空 schema 时需 --force
  5. 运行完毕后删除 FieldNameSync*.class

SchemaDumpMarkdown — 表结构导出

导出该实例上任意数据库的用户表与视图结构为 Markdown 文档,用于对照旧库 G3HY2025 或 新库 FMS。新库 s_module.b_view_table 大多指向视图,因此视图与表一并导出。

javac -encoding UTF-8 -cp "mssql-jdbc-13.4.0.jre11.jar" SchemaDumpMarkdown.java

# 导出新库 FMS 到指定文件
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp ".;mssql-jdbc-13.4.0.jre11.jar" SchemaDumpMarkdown "D:\path\FMS表结构.md" FMS

# 只导出表,不含视图
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp ".;mssql-jdbc-13.4.0.jre11.jar" SchemaDumpMarkdown "D:\path\FMS表结构.md" FMS --tables-only

参数:<输出文件绝对路径> [数据库名,默认 G3HY2025] [--tables-only]

输出包含:对象清单(名称/类型/字段数/主键)、各表字段结构(含主键与外键)、视图字段结构。 字段「备注」列留空,供后续补充含义。


RunSqlFile — 执行 sql 脚本

执行 sql/ 目录下的脚本。目标库固定取 config/dbconfigs/G3HD.properties,执行前校验 catalog 必须是 FMS;按 GO 把脚本拆成批次,在单个事务中依次执行,任一批失败整体回滚。

cd fms-api

# 先 dry-run 看批次划分
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/RunSqlFile.java ../sql/fms_business_contact.sql --dry-run

# 确认后执行
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/RunSqlFile.java ../sql/fms_business_contact.sql

源码启动模式不产生 .class 文件;如需手动编译:

cd fms-api/tools/migration
javac -encoding UTF-8 -cp "mssql-jdbc-13.4.0.jre11.jar" RunSqlFile.java

含「重建」段落(drop ... if exists)的脚本会删除同名表及其数据,执行前确认表中数据已不需要。


TreePathRepair — 树表 b_depth / b_path 核对与修复

b_parent_id 是树结构的权威关系,b_depth / b_path 是派生字段(见《FMS新系统核心表结构设计》1.7)。 本工具按 b_parent_id 重算这两列,用于核对和修复派生字段与父子关系不一致的数据。

历史背景:模块管理 / 菜单管理的拖拽排序曾有一处缺陷,会把根节点 b_path 的前导 / 抹掉 (/base/ 被写成 base/)并整树落库。前端已修复,本工具用于核对历史数据、必要时重算。 b_path 的约定格式形如 /base/base_otherdata/(节点编码前后均带 /)。

行为

  • 默认只读报告,不写库;确认无误后加 --apply 才在单个事务内更新 b_depth / b_path,失败整体回滚。
  • 只更新这两列,b_parent_id 与其余字段一律不动;父级不存在的节点按根处理(与前端 buildTree 一致)。
  • 成环的节点无法派生路径,只报告不修——父子关系成环是数据问题,需人工先修 b_parent_id。
  • 报告会区分「只缺前导 /」这一缺陷典型症状,并给出变更样例。

用法

cd fms-api

# 只读报告(默认):核对 s_module / s_menu
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/TreePathRepair.java

# 核对全部四张树表
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/TreePathRepair.java --tables s_module,s_menu,b_dept,b_othercompany_category

# 确认后执行修复
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/TreePathRepair.java --apply

# 多机构:指向目标机构的连接配置(默认 config/dbconfigs/G3HD.properties)
java -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp "tools/migration/mssql-jdbc-13.4.0.jre11.jar" \
  tools/migration/TreePathRepair.java --config config/dbconfigs/OTHER.properties

参数:

参数 说明
(无) 只读报告,不写库
--dry-run 同「无参数」,显式表达只读
--apply 执行修复(单事务)
--tables a,b 待核对表,默认 s_module,s_menu;可选 s_module / s_menu / b_dept / b_othercompany_category
--config <path> 连接配置,默认 config/dbconfigs/G3HD.properties

修复只重算派生字段,全部内容都能由 b_parent_id 重新推出,因此可安全重复执行; 执行后重跑一次只读报告应得到「待更新 0 行」。


已有同步记录

模块 / 视图 同步日期 字段数 备注
v_b_othercompany 2026-07-30 50 V1 时代(s_module_field*,已废弃)
v_b_contact 2026-07-30 36 V1 时代(s_module_field*,已废弃)
b_port 2026-08-01 13 V1 时代(s_module_field*,已废弃)
v_b_othercompany 2026-09-14 51 V2:改名 43 条、保留原值 8 条;重建 view(15 列,含旧库列宽/顺序)与 edit(41 个字段),未进入配置的字段不写入 JSON
v_b_contact 2026-09-14 36 V2:改名 28 条、保留原值 8 条;重建 view(19 列)与 edit(19 个字段)。同批新增 b_contact / b_contact_type 表、v_b_contact 视图与模块注册
其他数据(base_otherdata) 2026-09-14 668 62 张字典表(sql/fms_business_otherdata.sql,模块直接查表)、模块注册(sql/fms_module_otherdata.sql:根 + 6 个分组 + 64 个数据模块,编码 = 表名)、导入 555 行(OtherDataMigrate.java);FieldNameSync --all-otherdata --force 同步字段名与 view/edit 配置(含重命名字段别名 b_vessel_name→b_name、b_name_c→b_name),新增通用字段名由注册脚本补齐,旧库无配置的 44 个模块补默认列(名称 + 备注)。b_from/b_grade 已重建为雪花,其引用转换待 b_othercompany 数据迁入后重跑