Files
HIS/患者列表处理/README.md

126 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 为准。