Files
workspace/code/fms/fms-api/tools/migration/README.md
T
2026-09-15 17:00:29 +08:00

270 lines
13 KiB
Markdown
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.
# 迁移工具
`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`):
```json
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` 里已有字段。
### 编译和运行
```bash
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` 大多指向视图,因此视图与表一并导出。
```bash
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` 把脚本拆成批次,在单个事务中依次执行,任一批失败整体回滚。
```bash
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` 文件;如需手动编译:
```bash
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`。
- 报告会区分「只缺前导 `/`」这一缺陷典型症状,并给出变更样例。
### 用法
```bash
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` 数据迁入后重跑 |