Files
change_code/docs/使用手册.md
T

414 lines
23 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.
# Uft30ChangeCode 使用手册
| 文档信息 | 内容 |
| --- | --- |
| 软件名称 | Uft30ChangeCode(UF20 → UFT3 转码工具) |
| 手册版本 | V1.6.0 |
| 更新日期 | 2026-09-14 |
| 适用对象 | 使用本工具进行代码转码的开发/维护人员 |
---
## 1. 软件简介
Uft30ChangeCode 是一款桌面端 UF20 → UFT3 代码转码工具,主要提供:
- **业务转码**:**全量转码**(LS_ 功能清单式整体转码)与**按需转码**(非 LS 功能,支持单文件/递归两种模式)两个工作台;
- **代码检索**:查看功能的调用链路(向上调用方、向下被调),支持导出调用文件与链路文本;
- **功能查询**:检索 UF20 / UFT3 功能元数据,支持**多关键词批量查询**(逗号/空格分隔);UF20 查询结果可双击/右键**一键加入**转码清单,UFT3 仅用于查询核对;
- **数据映射**:维护 UF20 → UFT3 的表替换、函数替换对照表;
- **元数据更新**:解析 UF20/UFT3 源码,建立功能索引缓存(首次使用前必须执行)。
## 2. 运行环境
| 项目 | 要求 |
| --- | --- |
| 操作系统 | Windows 10/11(64 位) |
| 运行库 | Qt 6.6.2 运行库(随部署包提供) |
| 磁盘权限 | 对安装目录及源码目录具有读写权限 |
## 3. 安装与启动
1. 将部署包解压到任意目录(建议路径不含中文与空格);
2. 确认目录下包含 `Uft30ChangeCode.exe` 与 `uf2touft3\config\` 配置目录;
3. 双击 `Uft30ChangeCode.exe` 启动,主界面左侧为功能导航栏。
> **首次使用必读**:请先在底部"设置"中配置 UFT30/UF20 项目环境路径(见 §5.5),再到"元数据更新"页执行一次元数据更新(见 §5.1)。否则各页面的"是否存在"判断与功能查询均不可用。
## 4. 界面总览
启动后左侧导航栏包含以下页面:
| 导航项 | 用途 |
| --- | --- |
| 功能转码 → 业务转码 | 全量转码与按需转码工作台(页内 Tab 切换) |
| 功能转码 → 代码检索 | 功能调用链路查询与导出 |
| 功能查询 → UF20功能查询 | 检索 UF20 功能(支持批量关键词),双击/右键一键加入转码清单 |
| 功能查询 → UFT3功能查询 | 检索 UFT3 功能元数据(仅查询核对,不加入清单) |
| 数据映射 → 表替换 | 维护 UF20 → UFT3 表名映射 |
| 数据映射 → 函数替换 | 维护 UF20 → UFT3 函数名映射 |
| 元数据更新 | 解析源码、构建/刷新元数据缓存 |
| 设置(底部) | 项目环境路径与主题配置 |
| 帮助 / 关于(底部) | 在线帮助、版本信息 |
## 5. 功能操作详解
### 5.1 元数据更新(首次使用必做)
**前提**:元数据更新按"设置"页配置的项目环境路径扫描源码,请先完成 §5.5 的路径配置。
**操作步骤:**
1. 左侧导航进入 **元数据更新**;
2. 页面分为 **UFT30更新范围** 与 **UF20更新范围** 两个卡片,勾选需要更新的元数据项(默认全选):
- UFT30:数据类型、标准字段、表结构、接口数据;
- UF20:数据类型、标准字段、标准错误号、接口数据、常量、菜单功能、模块、表结构;
3. 可用 **全选 / 全不选** 按钮快速调整勾选范围;
4. 点击 **更新UFT30** 或 **更新UF20**,页面显示进度与当前处理项;
5. 等待完成提示后,再使用其他功能页面。
**选项说明:**
- **增量快速跳过**:增量更新先对比源码目录整体修改时间,源码无任何变化时秒级完成,不再逐文件重复扫描;
- **强制全量更新**(进度条右上角复选框):默认增量更新,仅重新处理有变化的文件;勾选后将重新扫描并解析全部接口文件、重建增量缓存,耗时较久,勾选时需二次确认;
- 源码变更后请重新执行更新,保证索引与实际代码一致;
- 更新过程在后台线程执行,界面不会卡死。
### 5.2 功能转码
#### 5.2.1 业务转码
业务转码页顶部通过 Tab 切换 **全量转码** / **按需转码** 两个工作台。
> **任务互斥**:任一 Tab 转换期间,另一 Tab 的"开始转换"按钮被禁用并提示等待,避免并发冲突。
##### 5.2.1.1 全量转码
**说明**:全量转码仅支持 **LS_ 开头**的功能("内存交易"改造范围),按清单对功能进行整体转码。清单保存在 `cust.json` 的 `convert.dir` 节点(见 §6.1)。
**表格列**:`UF20函数名` | `是否存在` | `核心` | `是否柜面接口`(**双击函数名所在行**可在弹窗中修改函数名)。
- "是否存在"显示 **否**:说明元数据未更新或该功能在 UF20 元数据中检索不到(见 §7 FAQ);
- **核心**:下拉选择该功能转码后归属的核心,可选 **ucbp**(默认)/ **uses** / **uarg** / **usms**;SQL 方言由核心自动派生——ucbp/uses 对应 mdb,uarg/usms 对应 db;
- **是否柜面接口**:下拉选择 **否**(默认)/ **是**,标识该功能是否为柜面接口;
- 每次显示页面时自动刷新"是否存在"列。
**操作步骤:**
1. 切到 **全量转码** Tab;
2. 点击 **添加**,弹窗内**每行输入一个** LS_ 函数名(支持批量粘贴);输入非 LS 函数将被拒绝,并提示切换到"按需转码";
3. 也可在 **UF20功能查询** 中双击或右键选中 LS_ 功能直接加入(见 §5.3.1);
4. **双击函数名所在行**可在弹窗中修改函数名;**删除选中** / **清空列表**(二次确认)维护清单;
5. 点击 **开始转换**,进度条与状态文字显示转换进度;转换中按钮变为 **停止转换**,可随时点击终止任务。
**清单同步**:手工编辑 `cust.json` 保存后约 0.3 秒内界面自动刷新(文件监视 + 防抖),程序与手工编辑双向同步。
##### 5.2.1.2 按需转码
**说明**:按需转码针对**非 LS 功能**转码,支持**单文件转码**与**递归转码**两种模式,转码范围不包含核心文件、module 模块文件。
- **非递归模式**:仅对目标文件本身执行转码,不会处理该文件内调用的函数;
- **递归模式**:转码目标文件的同时,自动对文件中所调用的关联函数一并完成转码。
**添加功能(三种方式):**
- **方式一(推荐)**:进入 **UF20功能查询**,双击或右键目标非 LS 函数(支持多选后右键批量加入)→ 弹窗提示"已将 N 个功能加入**按需转码**";
- **方式二**:按需转码 Tab 点击 **添加**,弹窗内每行输入一个函数短名(如 `AS_xxx`);误带 `.service_design` 等后缀会自动剥离;新增功能递归模式默认 **否**;若输入 LS_ 开头函数仅给出提示(建议放入全量转码),不会拦截;
- **方式三**:手工编辑配置文件 `cust_nonls.json`(见 §6.2),保存后程序自动检测并刷新界面。
**表格列**:`UF20函数名` | `是否存在` | `是否递归` | `db模式`(**双击函数名所在行**可在弹窗中修改函数名)。
- LS_ 开头的函数名以橙色字体显示提醒(不拦截)。
**设置递归模式与 db 模式:**
1. 在目标行的 **是否递归** 下拉框选择 **否**(单文件)或 **是**(递归);
2. 在 **db模式** 下拉框选择 SQL 语法转换方言:**否** = mdb(默认)、**是** = db;
3. 选择后立即写入 `cust_nonls.json` 并生效,无需额外点击。
**执行转码:** 点击 **开始转换**,进度显示与停止方式同全量转码;任务互斥规则相同。
**清单同步**:外部编辑保存后约 0.3 秒内界面自动刷新,支持程序内修改与外部文件修改双向同步。
#### 5.2.2 代码检索
**说明**:代码检索用于查看功能的**调用链路**——该功能调用了哪些下游函数、被哪些上游功能调用,用于转码前评估影响范围、转码后核对结果。
页面顶部 Tab 切换 **转码业务** / **非转码业务** 两种模式,两种模式各自维护检索路径与索引,互不干扰。
**通用操作:**
1. **代码检索路径**:选择需要分析的代码目录(默认 `bin\uf2touft3\change_code`),点 **浏览** 更改;
2. 首次显示页面会**自动构建索引**(优先读取缓存,秒级加载);若手动更改过路径,需点 **刷新索引** 重新加载;
3. 索引构建在后台线程执行,期间显示进度框,完成后写入缓存;
4. 每次转码任务完成后,程序会自动静默刷新索引;
5. 检索路径按模式持久化保存,下次启动自动恢复(见 §6.3)。
**转码业务模式:**
- 左侧显示 **业务转码函数列表**(与全量转码清单 `cust.json` 的 `convert.dir` 同步);
- **双击**左侧函数 → 右侧树显示调用链路(向上:哪些上游功能调用了它;向下:它调用了哪些下游函数);该模式仅支持从列表双击查询,不提供手动输入检索行;
- 树列为:`函数名`、`目录`、`模块`;当前查询行**蓝色高亮**;
- **原代码已支持** 行**绿色高亮**(该函数无需转码,行前带 UFT3 功能号前缀);其他标记:`[未找到]`、`[循环调用]`、`[层级截断]`;
- 点 **导出调用文件**:将链路上所有需转码文件按原目录结构复制到 `<检索路径>\function_output\<查询函数名>\`,并生成链路文本 `_call_chain.txt`;
- 树标题行右侧 **全部展开 / 全部折叠** 按钮控制树展示层级,列宽自适应内容且可拖拽调整。
**非转码业务模式:**
该模式通过页面顶部输入行检索,支持两种检索方式(下拉框切换):
- **按函数名检索**:输入函数名(如 `LS_xxx` / `LF_xxx`,也支持带功能号前缀的 `功能号-函数名` 格式),回车或点 **查询链路** 直接查询;
- **按功能号检索**:输入 UFT3 功能号,程序先通过 UFT3 功能元数据将功能号解析为对应函数(英文名),再查询调用链路。前提是元数据已更新(见 §5.1),否则提示"功能数据未加载";功能号不存在时提示"未找到功能号对应函数"。
查询成功后调用链路显示在右侧树中,展示规则(列、高亮、状态标记)与转码业务模式一致。
- 点 **导出调用链路**:仅导出 `_call_chain.txt` 链路文本到 `<检索路径>\function_output\<查询函数名>\`(不复制源文件)。
### 5.3 功能查询
#### 5.3.1 UF20 功能查询
**操作步骤:**
1. 进入 **UF20功能查询** 页;
2. 左侧下拉选择检索字段:**函数名** / **功能号**,输入关键字回车或点搜索图标;
- **批量查询**:多个关键词用**逗号、分号或空格**分隔(中英文均可),如 `LS_证券参数, LS_股票名单`;各关键词命中结果取**并集**展示;
- 单个关键词可命中同一功能的多个字段,结果按"函数名+功能号"自动去重;
3. 搜索框内可切换**精确匹配**(默认模糊匹配);
4. 查看结果列表,列:`函数名`、`英文名`、`功能号`;
5. **双击或右键选中行一键加入转码工作台**:LS_ 开头功能 → **全量转码**;其它功能 → **按需转码**;
- 支持 **Ctrl/Shift 多选**后一次加入;右键行不在选区内时仅加入该行;
- 加入结果**只弹一个提示框**("全量转码"、"按需转码"字样加粗):同时包含两类功能时显示"已将 N 个功能加入全量转码,已将 M 个功能加入按需转码";重复添加的功能自动跳过并在提示中注明;全部已存在时提示"均已在转码列表中"。
**查询提示**:查询反馈显示在页面底部提示栏(颜色随日间/夜间主题自动适配),不弹对话框打断操作——输入为空提示"请输入查询内容";无匹配结果提示"⚠️ 未找到匹配的功能";查询成功后显示"已查询 X 个业务功能函数(M 个无匹配)"并接默认操作提示。
#### 5.3.2 UFT3 功能查询
- 界面与 UF20 功能查询一致(函数名 / 功能号检索、**批量关键词**、精确匹配),结果列为 `函数名`、`英文名`、`功能号`,查询提示同样在页面底部提示栏反馈;
- 仅用于查询核对 UFT3 功能元数据,**双击/右键不加入转码清单**;
- 代码检索中"原代码已支持"行前的功能号即来自 UFT3 元数据。
### 5.4 数据映射
**说明**:数据映射维护 UF20 → UFT3 的**替换对照表**与**不转码清单**,转码引擎按映射替换代码中的表名 / 函数名,清单内的功能函数名则跳过替换。各页数据均保存在 `cust.json`(见 §6.1);界面修改后点 **保存** 写盘生效,外部编辑 `cust.json` 保存后界面自动刷新(程序自身保存后的 2 秒内暂停文件监控,此间的外部修改需再次保存文件才会被检测到)。
#### 5.4.1 表替换
维护 UF20 表名 → UFT3 表名的映射。
**操作步骤:**
1. 进入 **数据映射 → 表替换**;
2. 顶部搜索框实时过滤两列内容(不区分大小写);
3. **双击单元格**直接修改;
4. 点 **添加** 弹窗输入 UF20 / UFT3 表名(UF20 表名必填且不可重复);
5. **删除选中** 需二次确认(支持多选);
6. 修改后点 **保存** 生效。
#### 5.4.2 函数替换
维护 UF20 函数名 → UFT3 函数名的映射,操作方式与表替换完全相同。
#### 5.4.3 不转码功能函数
维护**不参与函数名替换**的功能函数清单,对应 `cust.json` 顶层键 `noChangeFullNameCode`(字符串数组)。转码时,清单内的功能函数名保持原样,不做 UF20 → UFT3 全名替换。
**操作步骤:**
1. 进入 **数据映射 → 不转码功能函数**;
2. 顶部搜索框实时过滤条目(不区分大小写);
3. **双击单元格**直接修改;
4. 点 **添加** 弹窗输入功能函数名(必填,重复时保存被拦截提示);
5. **删除选中** 需二次确认(支持多选);
6. 修改后点 **保存** 生效;保存按原文件顶层键顺序写回 `cust.json`,不影响其它配置。
> **典型用途**:某功能在 UFT3 中名称未变化、或不希望被批量替换时,将其加入本清单即可跳过替换。
### 5.5 系统设置(底部"设置")
**环境配置**:
| 配置项 | 说明 |
| --- | --- |
| UFT30项目环境路径 | UFT30 项目根目录 |
| UF20项目环境路径 | UF20 项目根目录 |
| UF20账户项目环境路径 | UF20 账户项目根目录 |
| UF20清算项目环境路径 | UF20 清算参数项目目录,供清算相关元数据处理使用 |
| 转码生成路径 | 转码结果输出目录 |
- 路径保存在 `config\config.ini` 的 `[projectPath]` 节,供元数据更新与转码引擎使用;
- 保存时程序自动同步维护 `uft30pub = <UFT30路径>\upub\dev_codes`;
- 保存与恢复默认均**保留 config.ini 中的手工注释、空行与键顺序**,只更新对应配置项的值(程序运行期间手工编辑的配置也不会被保存动作覆盖,仅界面显式修改过的项以界面为准);
- **元数据更新(§5.1)按这些路径扫描源码,首次使用必须先配置**。
**系统配置**:
- 主题模式:日间模式 / 夜间模式,即时切换。
**按钮**:
- **保存设置**:写盘生效;
- **恢复默认**:清空全部路径与主题并恢复默认(二次确认)。
## 6. 配置文件说明
### 6.1 cust.json
- **路径**:`bin\uf2touft3\config\cust.json`
- **作用**:一个文件承载四类配置——全量转码清单、表替换映射、函数替换映射、不转码功能函数清单。
| 节点 | 结构 | 用途 |
| --- | --- | --- |
| `convert.dir` | 对象数组,元素 `{name, core, viaUmgr, dialect}` | 全量转码清单(含核心、柜面接口配置) |
| `tableCompareUf2_Uf3` | 对象 `{UF20表名: UFT3表名}` | 表替换映射 |
| `functionReplace` | 对象 `{UF20函数名: UFT3函数名}` | 函数替换映射 |
| `noChangeFullNameCode` | 字符串数组 | 不转码功能函数清单,转码时跳过这些函数名的替换 |
`convert.dir` 元素字段说明(详见 `docs/转码配置格式契约.md`):
| 字段 | 说明 |
| --- | --- |
| `name` | 功能名(含 `.service_design` 后缀) |
| `core` | 归属核心:`ucbp`(默认)/ `uses` / `uarg` / `usms` |
| `viaUmgr` | 是否柜面接口:`false`(默认)/ `true` |
| `dialect` | SQL 方言,由 core 派生:`ucbp`/`uses` → `mdb`,`uarg`/`usms` → `db`(程序保存时自动生成,无需手工填写) |
**手工编辑示例(以实际文件结构为准):**
```json
{
"convert": {
"dir": [
{
"name": "LS_CustQry.service_design",
"core": "ucbp",
"viaUmgr": false,
"dialect": "mdb"
},
{
"name": "LS_AcctChk.service_design",
"core": "uarg",
"viaUmgr": true,
"dialect": "db"
}
]
},
"tableCompareUf2_Uf3": {
"UF20表A": "UFT3表A"
},
"functionReplace": {
"UF20函数1": "UFT3函数1"
},
"noChangeFullNameCode": [
"AF_NoChange1",
"LF_NoChange2"
]
}
```
**编辑注意:**
- 程序内修改(全量转码 / 表替换 / 函数替换 / 不转码功能函数页)会自动写回该文件;
- 手工编辑保存后各页面自动检测并刷新;
- 全量转码清单函数名可省略 `.service_design` 后缀展示,`dir` 为对象数组结构,程序保存时保留文件其余内容与格式;
- 兼容旧版 `dir` 为字符串数组(仅函数名)的格式,旧条目按 core=ucbp、viaUmgr=false、dialect=mdb 加载。
### 6.2 cust_nonls.json(按需转码清单)
- **路径**:`bin\uf2touft3\config\cust_nonls.json`
- **作用**:保存按需转码功能清单及每项的递归标志与 SQL 方言(db 模式),供界面与转码引擎共用。
| 节点 | 结构 | 说明 |
| --- | --- | --- |
| `convert.dir[功能名]` | 对象 `{depth, dialect}` | `depth`: `0` = 否(单文件转码)、`-1` = 是(递归转码);`dialect`: `mdb` = 否(默认)、`db` = 是 |
| `convert.dir["*"]` | 引擎兜底键(数值) | 非清单功能,界面不展示、保存时原样保留 |
| `convert.ext` | 后缀数组 | 引擎识别的功能文件后缀,程序保存时自动维护 |
**手工编辑示例(以实际文件结构为准):**
```json
{
"convert": {
"dir": {
"*": -1,
"AS_CustQry": { "depth": 0, "dialect": "mdb" },
"LF_AcctChk": { "depth": -1, "dialect": "db" }
},
"ext": [
".service_design",
".function_design",
".aservice_design",
".procedure_design",
".afunction_design"
]
}
}
```
**编辑注意:**
- 保持 JSON 格式合法(逗号、引号完整);若格式非法,程序将保留内存中的现有清单并在日志中记录警告;
- 兼容旧版格式:`dir` 值为数值(`0`/`-1`,无方言,按"否/mdb"加载)或为数组(无递归标志,一律按"否/mdb"加载);
- 外部编辑保存后约 0.3 秒内界面自动刷新;程序自身写入该文件时不会触发重复刷新,可放心与手工编辑混用。
### 6.3 config.ini 与 change_code.ini
- **`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` 节:代码检索两种模式的检索路径持久化。
## 7. 常见问题(FAQ)
### 7.1 元数据与索引问题
**Q1:全量转码/按需转码页"是否存在"列全部显示"否"?**
A:元数据缓存未就绪。请先确认"设置"页项目环境路径配置正确,再到"元数据更新"页执行一次更新并等待完成。
**Q2:首次打开页面"是否存在"显示"否",重开程序后变正常?**
A:已知问题——首次打开时索引尚未加载完成。规避方法:执行元数据更新后再进入转码页面;后续版本将实现索引就绪后自动刷新。
### 7.2 业务转码问题
**Q3:全量转码"添加"时提示函数无法加入?**
A:全量转码仅支持 **LS_ 开头**的功能。非 LS 功能请切到业务转码的"按需转码"Tab 添加。
**Q4:递归模式选"是"后转码范围包含核心文件吗?**
A:不包含。按需转码(无论是否递归)均不处理核心文件、module 模块文件。
**Q5:切换"是否递归"后需要保存吗?**
A:不需要,下拉选择后立即写入 `cust_nonls.json` 并生效。
### 7.3 代码检索、清单与转码执行问题
**Q6:双击/右键 UF20 功能查询中的函数加入了哪个清单?**
A:按功能名自动分流——**LS_ 开头**加入"全量转码",**其它功能**加入"按需转码";可 Ctrl/Shift 多选后批量加入,结果合并为一个提示框(重复项自动跳过)。UFT3 功能查询仅用于核对,不加入清单。
**Q7:手工修改 cust_nonls.json / cust.json 后界面没刷新?**
A:界面刷新有约 0.3 秒防抖延迟;若长时间未刷新,检查 JSON 格式是否合法、文件是否保存在 `bin\uf2touft3\config\` 目录下。
**Q8:代码检索双击函数提示"请先刷新索引"?**
A:手动更改过检索路径后需点"刷新索引"重新加载;首次显示页面通常会自动构建索引。
**Q9:点击"开始转换"后提示任务失败?**
A:多为转码引擎 `bin\uf2touft3\uf2touft3.exe` 缺失、被杀毒软件隔离或被占用导致启动失败(程序会立即提示并恢复界面,不会卡死)。确认引擎文件存在后重试。
**Q10:进度条走到后段却提示"转换失败(N 个文件转换失败)"?**
A:个别功能文件转码失败时,程序会如实提示失败而不会误报"转换完成",进度条停留在当前位置。请到 exe 目录 `logs\` 下查看当天的日志,定位失败文件(日志含 `FAIL` 行与失败汇总)后重试。
## 8. 日志与问题反馈
### 8.1 日志
- 程序运行日志输出到 exe 目录 `logs\` 下(文件名带日期前缀,基础名可在 `config\change_code.ini` 的 `[log]` 节配置,默认 `change_code.log`);
- 转码过程中若出现文件转换失败,日志会记录 `FAIL` 行与失败汇总,界面提示"转换失败(N 个文件转换失败)",请结合日志定位问题;
- 配置保存/加载失败、索引刷新失败等异常均会写入警告日志。
### 8.2 问题反馈
- 反馈问题时请提供:操作步骤、界面提示内容、日志文件,以及 `cust.json` / `cust_nonls.json` 当前内容。
---
*配套文档:《详细设计文档》(`docs/详细设计文档.md`),含系统架构图与各模块流程图。*