HIS 患者列表图片归档
这个项目用于把 HIS 患者列表截图批量 OCR 为结构化记录,并同步到 PostgreSQL 单表。
目录约定
待处理-患者目录图片集群/:后续新下载、尚未归档的图片集群。已处理-患者目录图片集群/:已经完成归档的原始图片集群。数据处理工作区/:处理脚本、科室分类规则、数据库建表脚本和说明文档。人工复核网页端/:Docker 化的人工复核网页端。数据处理结果区/已处理-患者目录图片集群/:各批次本地归档结果。数据处理结果区/信息记录/:全局信息记录和批次信息记录。
数据、图片、OCR 缓存、处理结果不应提交到 Git。
工作区脚本
数据处理工作区/01_科室分类规则.json数据处理工作区/02_患者列表OCR归档.py数据处理工作区/03_人工复核修正.json数据处理工作区/04_合并批次结果.py数据处理工作区/05_同步PostgreSQL单表.py数据处理工作区/06_PostgreSQL建表结构.sql数据处理工作区/07_处理程序说明.md数据处理工作区/08_PostgreSQL调整Patient_Lists列顺序.sql数据处理工作区/09_PostgreSQL住院号非空唯一约束.sql
03_人工复核修正.json 可能包含患者信息,仓库中只保留模板文件。
处理新批次
export TENCENTCLOUD_SECRET_ID='...'
export TENCENTCLOUD_SECRET_KEY='...'
python3 数据处理工作区/02_患者列表OCR归档.py \
--input "待处理-患者目录图片集群/批次文件夹名" \
--output "数据处理结果区/已处理-患者目录图片集群/批次文件夹名-列表归档结果" \
--ocr-engine table-v3 \
--batch-size 6 \
--image-padding-y 24 \
--workers 1 \
--folder-workers 2 \
--timeout 90 \
--max-retries 1
处理完成后优先查看:
患者列表_结构化.json患者列表_记录.csv复核报告.json重复住院号报告.json
如果只想用已有 OCR 缓存重建结果:
python3 数据处理工作区/02_患者列表OCR归档.py \
--input "待处理-患者目录图片集群/批次文件夹名" \
--output "数据处理结果区/已处理-患者目录图片集群/批次文件夹名-列表归档结果" \
--ocr-engine table-v3 \
--batch-size 6 \
--image-padding-y 24 \
--workers 1 \
--folder-workers 2 \
--rebuild-from-cache
确认无误后,把原始图片目录移动到 已处理-患者目录图片集群/。
合并与入库
python3 数据处理工作区/04_合并批次结果.py
export HIS_DB_HOST='DB_HOST'
export HIS_DB_PORT='5432'
export HIS_DB_NAME='DB_NAME'
export HIS_DB_USER='DB_USER'
export HIS_DB_PASSWORD='...'
python3 数据处理工作区/05_同步PostgreSQL单表.py
PostgreSQL 只使用 "Patient_Lists" 一个正式表。科室映射、OCR 缓存路径、拼接图路径、OCR 请求号等处理过程信息保留在本地工作区和结果目录,不进入数据库正式表。
人工复核网页端
在根目录 .env 中配置 REVIEW_APP_USERNAME、REVIEW_APP_PASSWORD、REVIEW_APP_SECRET_KEY、REVIEW_APP_PORT;如需抽查功能,再配置 KIMI_API_KEY、KIMI_MODEL。可参考 .env.example。启动:
cd 人工复核网页端
docker compose up -d --build
默认访问 http://127.0.0.1:8090。网页端包含概览、复核、抽查、抽查查看、设置区域,会读取各批次 复核报告.json,按图片内行号裁剪原图,人工修订会保存到 数据处理工作区/03_人工复核修正.json 并尽量同步 PostgreSQL。出院时间允许为空;若填写,则会校验时间格式以及是否早于入院时间。
入库后建议核对:
SELECT count(*) FROM "Patient_Lists";
SELECT count(*) FROM "Patient_Lists" WHERE review_status = '需人工复核';
SELECT inpatient_no FROM "Patient_Lists" GROUP BY inpatient_no HAVING count(*) > 1;
关键规则
- 默认使用
RecognizeTableAccurateOCR表格识别 V3。 - 患者字段顺序固定为:姓名、性别、年龄、住院号、诊断、入院时间、最后书写时间、住院天数、出院时间、手术后天数。
- 拼接图默认给每张原图上下各加
24px白边,减少贴边表格行被 OCR 忽略的概率。 - 处理时优先 6 张拼接;如果行数偏少、接口超时或识别失败,程序会动态降到 4/3/2/单张。
住院号是唯一强制校验条件:不能为空且全库唯一。重复住院号按后出现记录覆盖先出现记录;格式异常但非空的住院号保留,后续在网页端人工核验。出院时间允许为空;若入院时间晚于出院时间,程序和 PostgreSQL 都会把它作为需复核问题处理。自动复核通过表示 OCR 结果经过规则校验后无明显异常;人工复核通过表示该行命中了人工修正配置,修正后校验通过。- 抽查结果直接写入 PostgreSQL 的
audit_*字段,不再使用本地抽查记录.json。 AI修改-待确认只作为网页端辅助修正草稿,不会被“提交待同步”当作人工确认结果入库。- 旧批次若用缓存重建,要沿用当时的拼接和白边参数,避免新图片名和旧 OCR 缓存不匹配。
迁移注意
- 需要 Python 3、
Pillow和 PostgreSQL 客户端psql。 - 腾讯云密钥和数据库密码只通过环境变量传入,不要写入脚本或提交到文件。
raw_ocr/是 OCR 响应缓存,迁移时建议保留,可减少重复调用。merged_images/是拼接图,便于复核。- PostgreSQL 结构以
数据处理工作区/06_PostgreSQL建表结构.sql为准。