优化若干性能问题

This commit is contained in:
taocong
2026-09-22 15:15:22 +08:00
committed by taocong
parent afb8161648
commit 43e184bffb
118 changed files with 5518 additions and 6372 deletions
+27 -5
View File
@@ -187,7 +187,7 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
### 5.4 数据映射
**说明**:数据映射维护 UF20 → UFT3 的**替换对照表**,转码引擎按映射替换代码中的表名 / 函数名。两类映射均保存在 `cust.json`(见 §6.1);界面修改后点 **保存** 写盘生效,外部编辑 `cust.json` 保存后界面自动刷新(程序自身保存后的 2 秒内暂停文件监控,此间的外部修改需再次保存文件才会被检测到)。
**说明**:数据映射维护 UF20 → UFT3 的**替换对照表**与**不转码清单**,转码引擎按映射替换代码中的表名 / 函数名,清单内的功能函数名则跳过替换。各页数据均保存在 `cust.json`(见 §6.1);界面修改后点 **保存** 写盘生效,外部编辑 `cust.json` 保存后界面自动刷新(程序自身保存后的 2 秒内暂停文件监控,此间的外部修改需再次保存文件才会被检测到)。
#### 5.4.1 表替换
@@ -206,6 +206,21 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
维护 UF20 函数名 → UFT3 函数名的映射,操作方式与表替换完全相同。
#### 5.4.3 不转码功能函数
维护**不参与函数名替换**的功能函数清单,对应 `cust.json` 顶层键 `noChangeFullNameCode`(字符串数组)。转码时,清单内的功能函数名保持原样,不做 UF20 → UFT3 全名替换。
**操作步骤:**
1. 进入 **数据映射 → 不转码功能函数**;
2. 顶部搜索框实时过滤条目(不区分大小写);
3. **双击单元格**直接修改;
4. 点 **添加** 弹窗输入功能函数名(必填,重复时保存被拦截提示);
5. **删除选中** 需二次确认(支持多选);
6. 修改后点 **保存** 生效;保存按原文件顶层键顺序写回 `cust.json`,不影响其它配置。
> **典型用途**:某功能在 UFT3 中名称未变化、或不希望被批量替换时,将其加入本清单即可跳过替换。
### 5.5 系统设置(底部"设置")
**环境配置**:
@@ -215,10 +230,12 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
| UFT30项目环境路径 | UFT30 项目根目录 |
| UF20项目环境路径 | UF20 项目根目录 |
| UF20账户项目环境路径 | UF20 账户项目根目录 |
| UF20清算项目环境路径 | UF20 清算参数项目目录,供清算相关元数据处理使用 |
| 转码生成路径 | 转码结果输出目录 |
- 路径保存在 `config\config.ini` 的 `[projectPath]` 节,供元数据更新与转码引擎使用;
- 保存时程序自动同步维护 `uft30pub = <UFT30路径>\upub\dev_codes`;
- 保存与恢复默认均**保留 config.ini 中的手工注释、空行与键顺序**,只更新对应配置项的值(程序运行期间手工编辑的配置也不会被保存动作覆盖,仅界面显式修改过的项以界面为准);
- **元数据更新(§5.1)按这些路径扫描源码,首次使用必须先配置**。
**系统配置**:
@@ -235,13 +252,14 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
### 6.1 cust.json
- **路径**:`bin\uf2touft3\config\cust.json`
- **作用**:一个文件承载三类配置——全量转码清单、表替换映射、函数替换映射。
- **作用**:一个文件承载四类配置——全量转码清单、表替换映射、函数替换映射、不转码功能函数清单。
| 节点 | 结构 | 用途 |
| --- | --- | --- |
| `convert.dir` | 数组,元素为 `"函数名.service_design"` | 全量转码清单 |
| `tableCompareUf2_Uf3` | 对象 `{UF20表名: UFT3表名}` | 表替换映射 |
| `functionReplace` | 对象 `{UF20函数名: UFT3函数名}` | 函数替换映射 |
| `noChangeFullNameCode` | 字符串数组 | 不转码功能函数清单,转码时跳过这些函数名的替换 |
**手工编辑示例(以实际文件结构为准):**
@@ -258,13 +276,17 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
},
"functionReplace": {
"UF20函数1": "UFT3函数1"
}
},
"noChangeFullNameCode": [
"AF_NoChange1",
"LF_NoChange2"
]
}
```
**编辑注意:**
- 程序内修改(全量转码 / 表替换 / 函数替换页)会自动写回该文件;
- 程序内修改(全量转码 / 表替换 / 函数替换 / 不转码功能函数页)会自动写回该文件;
- 手工编辑保存后各页面自动检测并刷新;
- 全量转码清单函数名可省略 `.service_design` 后缀展示,`dir` 为数组结构,程序保存时保留文件其余内容与格式。
@@ -308,7 +330,7 @@ Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提
### 6.3 config.ini 与 change_code.ini
- **`bin\uf2touft3\config\config.ini`**:`[projectPath]` 节保存设置页的项目环境路径(`uft30` / `uf20` / `ufAcct20` / `createPath` / `uft30pub`),供元数据更新与转码引擎使用;
- **`bin\uf2touft3\config\config.ini`**:`[projectPath]` 节保存设置页的项目环境路径(`uft30` / `uf20` / `ufAcct20` / `UftdbSett` / `createPath` / `uft30pub`),供元数据更新与转码引擎使用;
- **`bin\uf2touft3\config\change_code.ini`**:程序私有配置(与 config.ini 分离,避免程序更新时被覆盖):
- `[log]` 节:日志配置(`file`:日志基础文件名,默认 `change_code.log`,输出到 exe 目录 `logs\` 下,文件名带当天日期前缀);
- `codeSearch` 节:代码检索两种模式的检索路径持久化。
+70 -36
View File
@@ -23,8 +23,8 @@ Uft30ChangeCode 是一款桌面端 **UF20 → UFT3 代码转码工具**,提供
- **业务转码**:**全量转码**(LS_ 功能清单式整体转码,清单存 `cust.json`)与**按需转码**(非 LS 功能,单文件/递归两种模式,清单存 `cust_nonls.json`,转码范围不含核心文件、module 模块文件),转码动作由外部引擎 `bin/uf2touft3/uf2touft3.exe` 执行;
- **代码检索**:功能**调用链路查询**(向上调用方、向下被调),双模式(转码业务/非转码业务),支持导出调用文件与链路文本;
- **功能查询**:检索 UF20 / UFT3 功能元数据,支持**多关键词批量查询**(逗号/分号/空格分隔,OR 并集);UF20 查询结果**双击/右键一键分流**——可多选,LS_ 功能加入全量转码、其它功能加入按需转码,加入结果合并为单次提示;UFT3 仅用于查询核对;
- **数据映射**:维护 UF20 → UFT3 的表替换、函数替换对照表(存 `cust.json`,转码引擎按映射替换代码中的表名/函数名);
- **系统设置**:项目环境路径与主题配置(元数据更新与转码引擎依赖这些路径)。
- **数据映射**:维护 UF20 → UFT3 的表替换、函数替换对照表与**不转码功能函数清单**(存 `cust.json`,转码引擎按映射替换代码中的表名/函数名,清单内功能函数名跳过替换);
- **系统设置**:项目环境路径(含 UF20清算项目环境路径)与主题配置(元数据更新与转码引擎依赖这些路径)。
### 1.3 术语约定
@@ -136,13 +136,13 @@ Uft30ChangeCode/
│ │ ├── nonlsconvert/ # 按需转码页
│ │ ├── codesearch/ # 代码检索页(调用链路查询)
│ │ ├── functionsearch/ # 功能查询(FunctionSearchPage 基类 + UF20/UFT3 子页)
│ │ ├── datamapping/ # 数据映射(表替换 / 函数替换)
│ │ ├── metadatupdate/ # 元数据更新页
│ │ ├── datamapping/ # 数据映射(表替换 / 函数替换 / 不转码功能函数)
│ │ ├── metadataupdate/ # 元数据更新页
│ │ ├── settings/ # 设置页
│ │ └── about/ # 关于(AboutDialog 对话框)
│ └── utils/ # Constants.h / business_strategy / configreaderbase
│ # / uf2configreader / uft3configreader / callchainanalyzer
│ # / datacache / configmanager / logmanager
│ # / datacache / configmanager / logmanager / custjsonio
│ # / version / versionchecker
├── 3rd/ElaWidgetTools/ # 第三方 UI 库
├── bin/
@@ -165,9 +165,9 @@ Uft30ChangeCode/
| 按需转码 | `NonLsConvertPage` | — | 非 LS 功能清单管理、递归模式选择、外部修改同步 |
| 功能查询 | `FunctionSearchPage`(基类)、`UF20/UFT3FunctionSearchPage` | 模板方法(基类复用) | 元数据检索(多关键词批量查询);UF20 双击/右键一键分流加入转码清单(合并单次提示),UFT3 纯查询 |
| 代码检索 | `CodeSearchPage`、`CallChainAnalyzer` | — | 调用链路查询、索引构建与缓存、导出 |
| 数据映射 | `TableMappingPage`、`FunctionMappingPage` | — | `cust.json` 表替换/函数替换映射维护 |
| 数据映射 | `TableMappingPage`、`FunctionMappingPage`、`NoChangeFullNamePage` | — | `cust.json` 表替换/函数替换映射维护、不转码功能函数清单维护(增删改查) |
| 元数据更新 | `MetadataUpdatePage` + `src/metadataupdate/` 解析器组 | 观察者(信号槽) | 后台解析源码、进度上报、原子落库 |
| 设置 | `SettingsPage` | — | 项目环境路径、主题配置 |
| 设置 | `SettingsPage` | — | 项目环境路径(含 UF20清算项目环境路径 `UftdbSett`)、主题配置 |
| 缓存 | `DataCache` | 单例 | QSqlDatabase 双库读写、功能查询内存缓存 |
| 引擎调用 | `PythonRunner` | — | 外部进程封装(打包 exe / Python 脚本双模式) |
| 日志 | `LogManager` | 单例 | 统一日志 |
@@ -185,7 +185,7 @@ flowchart TD
A --> B[初始化 LogManager 日志单例]
B --> C[初始化 ConfigManager 读取全局配置]
C --> D[构造 MainWindow ElaWindow]
D --> E["注册导航页面<br/>功能转码:业务转码 / 代码检索<br/>功能查询:UF20 / UFT3<br/>数据映射:表替换 / 函数替换<br/>元数据更新;底部:设置 / 帮助 / 关于"]
D --> E["注册导航页面<br/>功能转码:业务转码 / 代码检索<br/>功能查询:UF20 / UFT3<br/>数据映射:表替换 / 函数替换 / 不转码功能函数<br/>元数据更新;底部:设置 / 帮助 / 关于"]
E --> F[DataCache.initDatabase<br/>打开 uf20_cache.db / uft3_cache.db]
F --> G{缓存库是否有效?}
G -- 是 --> H[正常进入主界面]
@@ -200,7 +200,7 @@ flowchart TD
### 3.2 页面导航机制
- `MainWindow` 基于 `ElaWindow` 实现,侧边栏按分组注册页面:**功能转码**(业务转码、代码检索)、**功能查询**(UF20、UFT3)、**数据映射**(表替换、函数替换)、**元数据更新**;底部为设置、帮助、关于;
- `MainWindow` 基于 `ElaWindow` 实现,侧边栏按分组注册页面:**功能转码**(业务转码、代码检索)、**功能查询**(UF20、UFT3)、**数据映射**(表替换、函数替换、不转码功能函数)、**元数据更新**;底部为设置、帮助、关于;
- 业务转码页内部通过 ElaPivot 切换全量/按需两个工作台;
- 页面切换由 ElaWindow 内部路由完成,各页面通过 `showEvent` 感知可见性变化(如按需转码页每次显示时刷新表格,代码检索页每次显示时重读 `cust.json` 清单并按需构建索引)。
@@ -562,33 +562,36 @@ flowchart TD
- **导出调用链路**(非转码业务):仅生成 `_call_chain.txt`,不复制源文件;
- 目录名经 `sanitizeDirName` 清洗 Windows 非法字符。
### 5.6 数据映射模块(TableMappingPage / FunctionMappingPage)
### 5.6 数据映射模块(MappingTablePage 基类 + TableMappingPage / FunctionMappingPage / NoChangeFullNamePage)
**职责**:维护 UF20 → UFT3 的**表替换**(`tableCompareUf2_Uf3`)与**函数替换**(`functionReplace`)映射,两页代码同构,均读写 `cust.json` 对应节点;转码引擎按映射替换代码中的表名/函数名。
**职责**:维护 UF20 → UFT3 的**表替换**(`tableCompareUf2_Uf3`)与**函数替换**(`functionReplace`)映射,以及**不转码功能函数清单**(`noChangeFullNameCode`,字符串数组——转码时清单内功能函数名保持原样、不做全名替换)。三页共同继承公共基类 `MappingTablePage`(UI 骨架收编),读写 `cust.json` 对应顶层键经 `CustJsonIo`(见 §6.8)与 `Constants::CustKeys`(见 §6.4);转码引擎按映射替换代码中的表名/函数名。
**MappingTablePage 公共基类**(`src/pages/datamapping/mappingtablepage.h/.cpp`):收编三页原本同构的 UI 骨架与交互样板——搜索框 + `QStandardItemModel` + 参数化列数的 `MappingFilterProxyModel`(不区分大小写 contains 过滤)+ `ElaTableView` + 添加/删除选中/保存按钮 + tip 标签 + `JsonFileMonitor`(见 §6.9)+ 主题联动。三页仅以纯虚点注入差异:
| 虚点 | 说明 |
| --- | --- |
| `populateModel(custJson)` | 从 cust.json 填充模型(`load()` 内调用) |
| `collectMappingData(custJson, errorMessage)` | 保存时校验并回填数据,返回 `overrideRaw`(键名→格式化原文);校验失败置 errorMessage(弹警告不落盘) |
| `onAddRow()` | 添加一行(各页数据结构不同:对象条目 / 字符串数组) |
可覆写文案虚点:`loadFailureText` / `saveLogText` / `reloadLogText` / `deleteConfirmSingle` / `deleteConfirmMulti`。子类在构造体内调用非虚的 `load()`(规避构造期虚函数绑定到基类版本)。基类统一实现:删除多选二次确认、就地编辑脏标志(`m_dirty`,`onModelItemChanged` 中 `m_isLoading` 保护)、保存流程(见下时序)、外部修改重载(脏数据不覆盖、弹确认)与 tip 样式联动。
```mermaid
flowchart TD
A([进入表替换 / 函数替换页]) --> B["readCustJson 读取映射节点"]
B --> C["渲染表格(QStandardItemModel)<br/>QSortFilterProxyModel 两列不区分大小写过滤"]
A([进入 表替换 / 函数替换 / 不转码功能函数页]) --> B["readCustJson 读取映射节点"]
B --> C["populateModel 渲染表格<br/>QSortFilterProxyModel 不区分大小写过滤"]
C --> D{用户操作}
D -- 双击 / F2 编辑 --> E[更新模型]
D -- 添加 --> F["弹窗:UF20 名必填 + 查重"]
D -- 删除选中 --> G[二次确认(支持多选)]
E --> H[点击保存]
D -- 双击 / F2 编辑 --> E[更新模型 + 置脏标志]
D -- 添加 --> F["onAddRow:弹窗名称必填 + 查重"]
D -- 删除选中 --> G["onDeleteRow:二次确认(支持多选)"]
E --> H["onSave:beginSaveWindow"]
F --> H
G --> H
H --> I["读取原始文本<br/>extractTopLevelKeyOrder 提取顶层 key 顺序"]
I --> J["writeCustJson 按序写回:<br/>本映射节点有序输出,其余节点原样保留"]
J --> K["保存后 2s 内忽略 fileChanged<br/>(QTimer)并重新 addPath"]
L[外部编辑 cust.json] -. fileChanged .-> M[loadData 立即刷新]
H --> I["collectMappingData 校验回填<br/>读取原始文本提取顶层 key 顺序"]
I --> J["CustJsonIo::writeCustJsonOrdered 按序原子写回<br/>endSave 结束保存窗口"]
K[外部编辑 cust.json] -. JsonFileMonitor::reloadRequested .-> L["onReloadRequested:脏数据弹确认<br/>否则 loadData 立即刷新"]
```
**要点:**
- 保存采用**保留顶层 key 顺序的整体重写**:先从原始文本用正则提取 key 出现顺序,再按顺序写出,避免 JSON 重排破坏手工维护的文件结构;
- 自身保存后 2 秒内的 `fileChanged` 事件被忽略(防回环),此后恢复监听;
- 添加弹窗校验:UF20 名非空且不与现有行重复。
### 5.7 元数据更新页面(MetadataUpdatePage)
**职责**:元数据更新的人机入口——勾选更新范围、触发更新、展示进度与统计结果(见 §4.1 时序图)。
@@ -604,9 +607,10 @@ flowchart TD
| 配置项 | 说明 |
| --- | --- |
| UFT30 / UF20 / UF20账户项目环境路径 | 元数据更新与转码引擎的源码扫描根目录 |
| UF20清算项目环境路径 | UF20 清算参数项目目录,写 `config.ini` 的 `[projectPath] UftdbSett`,供清算相关元数据处理使用 |
| 转码生成路径 | 转码结果输出目录 |
- 路径保存于 `config.ini` 的 `[projectPath]` 节;保存时程序自动同步维护 `uft30pub = <UFT30路径>\upub\dev_codes`;
- 路径保存于 `config.ini` 的 `[projectPath]` 节(含 `UftdbSett`);"保存"与"恢复默认"统一经 `ConfigManager::saveConfig()` **保留布局式写回**(手工注释/键顺序/外部新增键不丢失,见 §6.3),程序自动同步维护 `uft30pub = <UFT30路径>\upub\dev_codes`;
- 主题模式(日间/夜间)即时切换;"恢复默认"需二次确认。
---
@@ -629,8 +633,9 @@ flowchart TD
### 6.3 ConfigManager(单例)
- 管理 `config.ini`(`[projectPath]` 节),启动时全量加载至内存缓存;
- `setValue()` 更新缓存并立即回写文件;读取侧复用 `ConfigReaderBase`(QSettings 兼容读取,加载过程经 LogManager 记录)。
- 管理 `config.ini`,启动时按节全量加载至内存缓存(UTF8/本地编码探测);路径白名单键(`uft30` / `uf20` / `ufAcct20` / `UftdbSett` / `createPath` / `uft30pub`)加载时统一归一化为正斜杠;
- `setValue()` 仅更新内存缓存并记录脏键(缓存中路径键恒为正斜杠,与加载侧对称,任何来源不再漂移),由设置页显式调 `saveConfig()` 落盘;
- `saveConfig()` 为**保留布局式写回**:以磁盘当前内容为基底逐行输出,仅替换"显式 setValue 过"的键行(写盘时换回反斜杠),**手工注释、空行、节顺序、外部新增键一律原样保留**,缓存中有而文件没有的键在对应节尾追加;落盘前经 mtime 探测外部手编,对应用未显式修改过的键采纳磁盘值(外部已有键的修改不被内存覆盖),并以 `QSaveFile` 原子写。
### 6.4 Constants.h(全局常量)
@@ -639,6 +644,7 @@ flowchart TD
| ToolDir / ChangeCodeDir / FunctionOutput / CacheDir | `uf2touft3` / `change_code` / `function_output` / `cache` | 引擎目录与输出子目录 |
| Exe | `uf2touft3.exe` | 转码引擎可执行文件名 |
| CustJson / CustNonLsJson | `config/cust.json` / `config/cust_nonls.json` | 转码配置文件 |
| CustKeys::ConvertDir / TableCompare / FunctionReplace / NoChangeFullName | `convert` / `tableCompareUf2_Uf3` / `functionReplace` / `noChangeFullNameCode` | cust.json 顶层键名集中定义(含 cust_nonls.json 的 `convert`),数据映射三页与转码工作台统一引用,避免散落字符串字面量 |
| Uf20DbFile / Uft3DbFile | `uf20_cache.db` / `uft3_cache.db` | 双缓存库文件名 |
| ChangeCodeIni | `change_code.ini` | 路径持久化与日志配置文件 |
| CodeSearch::ConvertPathKey / SearchPathKey | `codeSearch/convertPath` / `codeSearch/searchPath` | 代码检索路径配置键 |
@@ -673,6 +679,33 @@ flowchart TD
- 启动时经 QNetworkAccessManager 拉取 `update_info.json`,解析多版本发布列表,取 `Version::compare` 比较后的最大版本为最新版;
- 与当前版本比较后发射 `newVersionAvailable(latestVersion, releaseNotes)` / `checkError(msg)` / `noUpdateNeeded()`,MainWindow 弹出更新提示,"关于"页亦可手动检查。
### 6.8 CustJsonIo(cust.json 保序读写工具)
命名空间级公共工具(`src/utils/custjsonio.h/.cpp`),供数据映射三个页面(表替换 / 函数替换 / 不转码功能函数)共用,消除原先两份重复实现:
| 函数 | 说明 |
| --- | --- |
| `extractTopLevelKeyOrder(rawJson)` | 深度感知扫描原始 JSON 文本(跳过字符串字面量),仅记录 depth==1 时后跟冒号的顶层键,返回键顺序;正则方案无法匹配中文/特殊字符键且会误捕嵌套键,故弃用 |
| `indentJsonValue(json)` | 对 JSON 文本整体缩进(每行前加 4 空格) |
| `formatJsonValue(value)` | 通用 JSON 值格式化:对象/数组走 `QJsonDocument::Indented` 再整体缩进,字符串手工转义,其余按 bool/number/null |
| `formatOrderedJsonObject(pairs)` | 按给定顺序格式化 string→string 对象(条目 8 空格缩进),供映射页输出 |
| `formatOrderedJsonArray(items)` | 按给定顺序格式化字符串数组(条目 8 空格缩进,空数组输出 `[]`),供不转码功能函数页输出 |
| `writeCustJsonOrdered(jsonPath, json, keyOrder, overrideRaw)` | `QSaveFile` 原子写:按 keyOrder 顺序输出顶层键,`overrideRaw` 中的键用调用方自定义格式化文本重写,其余键走 `formatJsonValue`;保存失败记录错误日志 |
### 6.9 JsonFileMonitor(JSON 配置外部修改监控组件)
公共监控组件(`src/utils/jsonfilemonitor.h/.cpp`),收编原先散落在 5 个页面(数据映射三页 + 全量转码页 + 非转码业务页)的**文件+目录双监控样板**——每处约 50 行的 QFileSystemWatcher 事件处理、防抖、回环过滤逻辑统一为一个可复用组件,页面侧仅剩 `watch()` + `connect(reloadRequested)` + 保存时 `beginSaveWindow()/endSave()` 三行。
| 成员/方法 | 说明 |
| --- | --- |
| `watch(filePath)` | 切换监控目标:文件 + 所在目录双监控(Windows 下外部程序整文件替换会使文件句柄失效,目录事件兜底补挂) |
| `refreshWatch()` | 补挂监控(fileChanged 后文件路径可能已从 watcher 移除,防抖触发前先补挂) |
| `currentMtime()` | 当前文件 mtime 基准(文件不存在返回 0) |
| `beginSaveWindow()` / `endSave()` | 保存窗口:窗口期内监控事件直接忽略;`endSave()` 立即提升保存代数(`m_saveSeq`),使窗口内已排队的防抖事件全部过期,替代旧实现"保存后固定 2 秒忽略"的硬等待 |
| `reloadRequested()` 信号 | 外部修改确认(300ms 防抖 + mtime 基准过滤自身写入回环后)单发;页面侧检查脏标志后重载 |
**回环过滤原理**:`beginSaveWindow()` 预置当前 mtime 为基准;监控事件到达时若 `mtime <= 基准` 或处于保存窗口/保存代数过期,视为自身写入引发的变化,不触发重载——自身保存经 `endSave()` 提升基准后,外部手编(mtime 变大)才会命中。
---
## 7. 数据设计
@@ -690,10 +723,11 @@ flowchart TD
| --- | --- | --- |
| `tableCompareUf2_Uf3` | UF20→UFT3 表名映射 | 全量/按需转码的表替换 |
| `functionReplace` | 函数替换规则 | 转码的函数替换 |
| `noChangeFullNameCode` | 字符串数组(功能函数全名清单) | 转码引擎对清单内功能函数名不做全名替换 |
| 其余键 | 引擎自身配置 | 原样透传 |
- 数据映射两页各自只读写所属节,其余内容原样保留;
- 程序保存时经 `extractTopLevelKeyOrder` 提取顶层 key 顺序、`writeCustJson` 按原顺序写回,不破坏 JSON 键序。
- 数据映射三页各自只读写所属顶层键(键名统一引用 `Constants::CustKeys`,见 §6.4),其余内容原样保留;
- 程序保存时经 `CustJsonIo::extractTopLevelKeyOrder` 提取顶层 key 顺序、`CustJsonIo::writeCustJsonOrdered` 按原顺序 `QSaveFile` 原子写回,不破坏 JSON 键序(见 §6.8)。
### 7.3 cust_nonls.json(非转码业务配置)
@@ -714,7 +748,7 @@ flowchart TD
| 文件 | 节/键 | 说明 |
| --- | --- | --- |
| config.ini | `[projectPath]` | UFT30/UF20/项目环境路径、转码生成路径;保存时同步维护 `uft30pub = <UFT30路径>\upub\dev_codes` |
| config.ini | `[projectPath]` | UFT30/UF20/UF20账户/清算项目环境路径(`uft30` / `uf20` / `ufAcct20` / `UftdbSett`)、转码生成路径;保存时同步维护 `uft30pub = <UFT30路径>\upub\dev_codes` |
| change_code.ini | `[log]` | 日志级别/开关,LogManager 启动时读取 |
---
@@ -769,7 +803,7 @@ MainWindow 启动即校验 `bin/uf2touft3/uf2touft3.exe` 是否存在:缺失
| --- | --- |
| `Uft30ChangeCode.exe` | 主程序 |
| `uf2touft3/uf2touft3.exe` | 转码引擎(外部进程) |
| `uf2touft3/config/cust.json` | 表/函数映射配置(数据映射页读写) |
| `uf2touft3/config/cust.json` | 表/函数映射与不转码功能函数清单配置(数据映射页读写) |
| `uf2touft3/config/cust_nonls.json` | 非转码业务配置(业务转码页读写) |
| `uf2touft3/cache/uf20_cache.db` / `uft3_cache.db` | 元数据缓存库(首次元数据更新生成) |
| `config.ini` / `change_code.ini` | 程序路径配置 / 日志配置 |
@@ -786,7 +820,7 @@ MainWindow 启动即校验 `bin/uf2touft3/uf2touft3.exe` 是否存在:缺失
| 业务转码 | `src/pages/businessconvert/`(容器)+ `src/pages/batchconvert/`(全量)+ `src/pages/nonlsconvert/`(按需) |
| 功能查询 | `src/pages/functionsearch/`(UF20 / UFT3 双模式) |
| 代码检索 | `src/pages/codesearch/`(含 CallChainAnalyzer) |
| 数据映射 | `src/pages/datamapping/`(TableMappingPage / FunctionMappingPage) |
| 数据映射 | `src/pages/datamapping/`(TableMappingPage / FunctionMappingPage / NoChangeFullNamePage) |
| 元数据更新 | `src/pages/metadataupdate/`(页面)+ `src/metadataupdate/`(解析器组) |
| 设置 / 关于 | `src/pages/settings/` / `src/pages/about/` |
| 公共支撑 | `src/utils/`(DataCache、LogManager、ConfigManager、VersionChecker、Constants 等)、`src/pythonrunner/`、`src/components/` |
| 公共支撑 | `src/utils/`(DataCache、LogManager、ConfigManager、CustJsonIo、VersionChecker、Constants 等)、`src/pythonrunner/`、`src/components/` |