| 项目 | 说明 |
|---|---|
| 适用对象 | 实施、运维、数据迁移现场人员 |
| 适用系统 | HIS IHD 数据迁移模块(hisihd-mediway-boot + 前端 bsp/ihd) |
| 文档目的 | 按步骤完成「源库 → 临时表 → 正式业务表」迁移 |
| 版本说明 | 1.0 |
源系统库(Cache/ IRIS / Oracle / 人大金仓等)
│ JDBC 查询(或 Excel 文件)
▼
HIS 临时/中间表(class_name 对应表,如 bsp_ihd_pa_pat)
│ 正式导入(按 ID 范围 / 字段分组等)
▼
HIS 正式业务表
| 阶段 | 做什么 | 主要入口 |
|---|---|---|
| 准备 | 配 JDBC、建任务、字段对照、字典对照 | 基础配置 / 导入任务配置 / 通用字典 / 字典对照 |
| 临时导入 | 从源库或 Excel 写入中间表 | 数据迁移平台 → 导入临时表 |
| 正式导入 | 从中间表写入正式业务 | 数据迁移平台 → 导入正式表 |
| 核查 | 看进度与错误明细 | 临时表进度 / 正式表进度 |
进入 数据迁移 菜单后,顶部 Tab:

| Tab | 页面 | 作用 |
|---|---|---|
| 数据迁移平台 | import-data.html |
选任务、写 SQL/选文件、导入临时/正式、看进度 |
| 基础配置 | config.html |
JDBC 等键值配置(驱动、URL、用户、密码) |
| 导入任务配置 | biz-config.html |
业务任务(cf_bsp_ihd_biz_config)、参数、字段对照入口 |
| 通用字典 | dictionary.html |
IHD 通用字典树 |
| 字典对照 | map.html |
内外码对照(旧码 → 新码) |
hisihd-mediway-server)可访问;前端已登录 HIS。class_name 表已在目标 HIS 库建好。flowchart TD
A[1.基础配置 JDBC] --> B[2.测试并应用 JDBC]
B --> C[3.新建/维护导入任务]
C --> D[4.表字段对照]
D --> E[5.字典与对照 按需]
E --> F[6.导入临时表]
F --> G[7.查临时进度与错误]
G --> H[8.导入正式表]
H --> I[9.查正式进度与验收]

入口:数据迁移 → 基础配置

| 配置代码 | 配置名称示例 | 配置值说明 |
|---|---|---|
jdbc.driverClassName |
JDBC驱动类 | 如 Cache:com.intersys.jdbc.CacheDriver;人大金仓:com.kingbase8.Driver;Oracle:oracle.jdbc.OracleDriver |
jdbc.url |
JDBC连接串 | 必须与驱动匹配(见下表) |
jdbc.username |
JDBC用户名 | 源库账号 |
jdbc.password |
JDBC密码 | 源库密码(列表显示为 ********) |
常见 URL 写法:
| 源库 | 驱动类 | URL 示例 |
|---|---|---|
| 老 Cache | com.intersys.jdbc.CacheDriver |
jdbc:Cache://主机:1972/命名空间 |
| 人大金仓 | com.kingbase8.Driver |
jdbc:kingbase8://主机:5432/库名 |
| Oracle | oracle.jdbc.OracleDriver |
jdbc:oracle:thin:@//主机:端口/服务名 |
注意:驱动与 URL 必须成对匹配。例如金仓驱动不要配
jdbc:Cache://,Oracle 不要用jdbc:orcl://非标准协议。
********,接口也会脱敏。********,系统视为未改,保留原密码。入口:数据迁移 → 导入任务配置


| 字段 | 说明 | 示例 |
|---|---|---|
任务代码 code |
唯一业务编码 | paPat |
任务名称 name |
界面显示名 | 患者主索引 |
配置数值 value |
常用作默认 SQL / 说明用途 | 视项目约定(第三方示例) |
临时表实体类 class_name |
中间表表名(枢纽) | bsp_ihd_pa_pat |
| 导入接口 | 正式导入时调用产品组的接口 | 按产品约定 |
默认条数 default_count |
正式导入按 ID 切分时每个线程条数 | 如 50000 |
打包数量 pack_number |
正式导入时多少条中间表数据调用一次产品组接 | 如 200 |
| 是否启用 | 必须启用后才能在迁移页选到 | 启用 |
| 覆盖导入 | 是否覆盖已有数据 | 按业务定 |

table-map.html)入口:导入任务配置 → 任务行上的 字段对照(或打开 table-map.html)

临时导入时:源 SQL 结果列名(map_field)必须能对照到中间表字段(source_field)。缺对照会直接失败。
导入前可在迁移页确保 SQL 列都能对照;若提示「该字段 xxx 没有对照」,回到本页补全后再导。
如果遇到界面点击无效,界面关闭再打开即可。

在维护老系统字典时,维护上老系统的获取字典视图,然后点击同步数据即可将老系统字典同步过来。(前提:JDBC链接测试通过)


原则:先有字典与对照,再大批量正式导入,减少失败与脏数据。

入口:数据迁移 → 数据迁移平台

; 分隔,后端会拆成多任务并行执行。;,以免被误拆。示例:
SELECT ... FROM old_pat WHERE id BETWEEN 1 AND 100000;
SELECT ... FROM old_pat WHERE id BETWEEN 100001 AND 200000;
SELECT ... FROM old_pat WHERE id BETWEEN 200001 AND 300000
| 按钮 | 作用 | 风险 |
|---|---|---|
| 清临时表 | 清空当前任务对应中间表数据 | 不可恢复,确认后再点 |
| 清除日志 | 清空导入相关日志表 | 排查记录会丢失 |
入口:临时表进度(及临时明细错误日志页面)
关注:
| 项 | 说明 |
|---|---|
| 状态 | Start → End;异常是否有 error 信息 |
| 成功数 / 失败数 / 总数 | 是否与预期行数接近 |
| 明细错误 | bs_bsp_ihd_temp_itm_log:单行失败原因与参数,用于排查 |
常见失败:
当前实现支持 批量插入;若整批失败会回退逐行并记录每条错误,便于排查。

前提:临时表数据已就绪,且失败率可接受。
正式导入依赖任务上配置的 导入类、导入方法;未配置或类不存在会失败。

SELECT COUNT(*)、关键业务键抽查。| 主题 | 建议 |
|---|---|
| JDBC 变更 | 改配置后必须重新 测试 + 应用 |
| 长任务 | 勿重复狂点「导入」;用进度页观察;必要时用终止接口(若有授权) |
| 性能 | 临时导入已批量写中间表;源 SQL 尽量只查需要列;中间表索引过多会拖慢插入 |
| 密码安全 | 勿截图泄露明文密码;列表已掩码 |
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 测试 JDBC 失败 | 驱动/URL/账号/网络 | 核对四元组;查防火墙;确认 jar 已部署(Cache 需 CacheDB.jar) |
| 提示目标库 JDBC 尚未配置 | 未点「应用」或启动未加载成功 | 再点「应用JDBC配置」 |
| 字段 xxx 没有对照 | 字段映射缺失 | 补全表字段对照 |
| 临时导入很慢后期更慢 | 大表索引、并发过高、磁盘 | 降并发、减索引、分段 SQL |
| 部分线程结束/终止 | 人为取消、中断、异常 | 看临时日志 error;勿误点终止 |
| 正式导入无反应 | 导入类方法未配 / ID 范围空 | 检查任务配置与临时表是否有数据 |
| 密码保存后连不上 | 误把掩码当新密码保存 | 重新编辑输入真实新密码 |
| 表名 | 用途 |
|---|---|
cf_bsp_ihd_config |
基础配置(含 JDBC) |
cf_bsp_ihd_biz_config |
导入任务 |
cf_bsp_ihd_table_field_map |
字段对照 |
ct_bsp_ihd_map / ct_bsp_ihd_map_itm |
字典对照 |
bs_bsp_ihd_temp_log / bs_bsp_ihd_temp_itm_log |
临时导入日志 |
bs_bsp_ihd_formal_log / bs_bsp_ihd_formal_itm_log |
正式导入日志 |
| 功能 | 路径 |
|---|---|
| JDBC 列表/保存/测试/应用 | /ihd/config/* |
| 导入临时表 | /ihd/import/temp |
| 导入正式表 | /ihd/import/formal |
| 任务配置 | /ihd/bizConfig/* |
| 字段对照 | /ihd/tableMap/* |
接口 正确若现场菜单名、按钮文案与本文略有差异,以实际环境界面为准;流程顺序建议仍按本文执行。
| 项目 | 说明 |
|---|---|
| 适用医院 | XX保健院,XX医院 |
| 适用对象 | 实施、运维、现场数据迁移人员 |
| 关联文档 | 《IHD数据迁移-实施操作手册》(平台通用操作见该文档) |
| 文档目的 | 按现场实测节奏,完成本院患者档案、病案号、门诊预约三类业务迁移 |
说明:本文聚焦「现场执行顺序与 SQL 分片」。JDBC 配置、任务配置、字段/字典对照、界面按钮等通用操作,请先按《IHD数据迁移-实施操作手册》完成。
| 序号 | 业务 | 临时表(中间表) | 临时表量级 / 并发 | 临时表预计 | 正式表策略 | 正式表预计 |
|---|---|---|---|---|---|---|
| 1 | 患者档案 | bsp_ihd_pa_pat |
约 150 万 / 15 进程 | 约 1.5 小时 | 每进程 10 万条,约 16 进程 | 约 8 小时 |
| 2 | 患者病案号 | bsp_ihd_ma_mr_medicareno |
约 44 万 / 15 进程 | 约 2 分钟 | 每进程 5 万条,约 8 进程 | 约 0.5 小时 |
| 3 | 门诊预约 | bsp_ihd_paadm_op_appointment |
约 8000 条 | 可忽略 | 按实际量导入即可 | 可忽略 |
| — | 合计 | — | — | — | — | 约 9~10 小时 |
建议导入顺序(有依赖时勿颠倒):
开始前请逐项确认:
按院方/项目组既定方案,清除目标 HIS 库中相关业务正式数据。
清业务数据后,检查下列中间表是否已空;若不为空,执行 truncate:
TRUNCATE TABLE bsp_ihd_pa_pat;
TRUNCATE TABLE bsp_ihd_ma_mr_medicareno;
TRUNCATE TABLE bsp_ihd_paadm_op_appointment;
可用快速核对:
SELECT 'bsp_ihd_pa_pat' AS tbl, COUNT(*) AS cnt FROM bsp_ihd_pa_pat
UNION ALL
SELECT 'bsp_ihd_ma_mr_medicareno', COUNT(*) FROM bsp_ihd_ma_mr_medicareno
UNION ALL
SELECT 'bsp_ihd_paadm_op_appointment', COUNT(*) FROM bsp_ihd_paadm_op_appointment;
期望结果:cnt 均为 0。
导入前清空进度/明细日志,避免与历史批次混淆(在 HIS 库执行):
TRUNCATE TABLE bs_bsp_ihd_temp_log;
TRUNCATE TABLE bs_bsp_ihd_temp_itm_log;
TRUNCATE TABLE bs_bsp_ihd_formal_log;
TRUNCATE TABLE bs_bsp_ihd_formal_itm_log;
也可在数据迁移平台使用「清除日志」类功能(以界面实际按钮为准)。
| 项 | 值 |
|---|---|
| 任务 | 患者档案(中间表 bsp_ihd_pa_pat) |
| 数据量 | 约 150 万 |
| 并发 | 15 个进程(界面将多段 SQL 用 ; 分隔提交) |
| 预计耗时 | 约 1.5 小时 |
在「数据迁移平台」选择对应任务 → 导入临时表,SQL 使用下方 15 段(按出生日期分片,以 ; 分隔一次提交):
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('0648-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1969-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1970-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1976-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1977-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1980-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1981-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1982-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1983-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1986-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1987-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1989-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1990-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1992-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1993-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1995-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1996-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('1998-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('1999-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('2002-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('2003-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('2013-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('2016-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('2017-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('2019-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('2020-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('2024-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM pa_pat_mast_transfer WHERE EXP_STR='Y' AND BIRTH_DATETIME >= TO_DATE('2025-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND BIRTH_DATETIME <= TO_DATE('9992-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
临时表验收:
SELECT COUNT(*) FROM bsp_ihd_pa_pat; 与源库可导出行数基本一致(允许因过滤条件略有差异)| 项 | 值 |
|---|---|
| 分片策略 | 按临时表 ID,约 100000 条 / 进程 |
| 并发 | 约 16 个进程 |
| 预计耗时 | 约 8 小时 |
操作:数据迁移平台 → 选择患者档案任务 → 导入正式表(按 ID 范围或界面默认分片)。
正式表验收:
建议在患者档案正式导入完成并通过抽查后再导入病案号。
| 项 | 值 |
|---|---|
| 中间表 | bsp_ihd_ma_mr_medicareno |
| 数据量 | 约 44 万 |
| 并发 | 7个进程 |
| 预计耗时 | 约 2 分钟 |
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE <= TO_DATE('2008-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2009-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND LAST_ADM_DATE <= TO_DATE('2011-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2012-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND LAST_ADM_DATE <= TO_DATE('2014-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND LAST_ADM_DATE <= TO_DATE('2017-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2018-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND LAST_ADM_DATE <= TO_DATE('2020-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2021-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') AND LAST_ADM_DATE <= TO_DATE('2023-12-31 00:00:00','yyyy-mm-dd hh24:mi:ss');
SELECT * FROM bsp_ihd_ma_mr_medicareno WHERE LAST_ADM_DATE >= TO_DATE('2024-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
注意:上述 SQL 在「导入临时表」时由 IHD 通过 JDBC 在源库执行。请确认源库中该表/视图名称与字段
LAST_ADM_DATE实际存在;若源表名与 HIS 中间表同名,以现场源库对象为准。
| 项 | 值 |
|---|---|
| 分片策略 | 约 50000 条 / 进程 |
| 并发 | 约 8 个进程 |
| 预计耗时 | 约 0.5 小时 |
完成后在「正式表进度」确认全部结束,并抽查病案号业务数据。
注意:需要有门诊预约记录的患者档案视图,这样每次只增量导入少部分患者就行可以了,不用每次导入150W全量患者。
| 项 | 值 |
|---|---|
| 中间表 | bsp_ihd_paadm_op_appointment |
| 数据量 | 约 8000 条 |
| 预计耗时 | 可忽略(数据量小) |
操作要点:
| 场景 | 入口 |
|---|---|
| 临时表进度 / 失败明细 | 临时表进度界面(可查看进程号、线程名称) |
| 正式表进度 / 失败明细 | 正式表进度界面 |
| 导出错误 | 各进度页、明细页「导出」 |
| 现象 | 建议处理 |
|---|---|
| 长时间「进行中」且运行时间不再增加 | 看进程号对应线程;查应用日志是否停在「读源库」或「写临时表」;必要时「结束进程」后排查源库锁/目标库锁,再重导失败分片 |
| 字段对照错误 | 到「字段映射」补全后,清空该业务中间表相关数据再重导 |
| 数据对照失败 | 到「字典对照」补码后重导失败数据 |
| 产品组接口报错(如院区 ID) | 确认界面已选院区、导入接口地址正确;将【产品组】错误反馈对应产品组 |
| 多进程打满资源 | 确认 K8s 为约 8 核 8G;可适当减少并发分片数 |
| 阶段 | 预计 |
|---|---|
| 清库 + 清中间表 + 清日志 + 环境确认 | 视现场,建议预留 0.5~1 小时 |
| 患者档案(临时 + 正式) | 约 1.5 + 8 ≈ 9.5 小时(正式表为主) |
| 病案号(临时 + 正式) | 约 2 分钟 + 0.5 小时 |
| 门诊预约 | 可忽略 |
| 现场连续作业 | 约 9~11 小时(含准备与验收缓冲) |
建议:患者档案正式导入安排在夜间或业务低峰;安排人员轮值查看「正式表进度」。
serialNo / 日志备查; 分隔,后端会按段启动多个异步进程。