# 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` 可能包含患者信息,仓库中只保留模板文件。 ## 处理新批次 ```bash 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 缓存重建结果: ```bash 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 ``` 确认无误后,把原始图片目录移动到 `已处理-患者目录图片集群/`。 ## 合并与入库 ```bash 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`。启动: ```bash cd 人工复核网页端 docker compose up -d --build ``` 默认访问 `http://127.0.0.1:8090`。网页端包含概览、复核、抽查、抽查查看、设置区域,会读取各批次 `复核报告.json`,按图片内行号裁剪原图,人工修订会保存到 `数据处理工作区/03_人工复核修正.json` 并尽量同步 PostgreSQL。出院时间允许为空;若填写,则会校验时间格式以及是否早于入院时间。 入库后建议核对: ```sql 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` 为准。