126 lines
5.6 KiB
Markdown
126 lines
5.6 KiB
Markdown
# 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` 为准。
|