Files
HIS/患者列表处理

HIS 患者列表图片归档

这个项目用于把 HIS 患者列表截图批量 OCR 为结构化记录,并同步到 PostgreSQL 单表。

目录约定

  • 待处理-患者目录图片集群/:后续新下载、尚未归档的图片集群。
  • 已处理-患者目录图片集群/:已经完成归档的原始图片集群。
  • 数据处理工作区/:处理脚本、科室分类规则、数据库建表脚本和说明文档。
  • 人工复核网页端/Docker 化的人工复核网页端。
  • 数据处理结果区/已处理-患者目录图片集群/:各批次本地归档结果。
  • 数据处理结果区/信息记录/:全局信息记录和批次信息记录。

数据、图片、OCR 缓存、处理结果不应提交到 Git。

工作区脚本

  1. 数据处理工作区/01_科室分类规则.json
  2. 数据处理工作区/02_患者列表OCR归档.py
  3. 数据处理工作区/03_人工复核修正.json
  4. 数据处理工作区/04_合并批次结果.py
  5. 数据处理工作区/05_同步PostgreSQL单表.py
  6. 数据处理工作区/06_PostgreSQL建表结构.sql
  7. 数据处理工作区/07_处理程序说明.md
  8. 数据处理工作区/08_PostgreSQL调整Patient_Lists列顺序.sql
  9. 数据处理工作区/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_USERNAMEREVIEW_APP_PASSWORDREVIEW_APP_SECRET_KEYREVIEW_APP_PORT;如需抽查功能,再配置 KIMI_API_KEYKIMI_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 为准。