Import sanitized HIS processing tools

This commit is contained in:
2026-05-26 08:51:10 +08:00
commit 7e329f1d85
46 changed files with 19175 additions and 0 deletions

View File

@@ -0,0 +1,125 @@
# 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` 为准。