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,72 @@
# 患者列表归档处理程序说明
## 工作区文件
1. `01_科室分类规则.json`:大科室、子科室、文件夹别名归类规则。
2. `02_患者列表OCR归档.py`:单个图片集群的 OCR、字段清洗、去重、复核报告生成程序。
3. `03_人工复核修正.json`:少量无法靠规则自动判断的人工修正项,可能包含患者信息,不提交到 Git。
4. `04_合并批次结果.py`:合并所有 `*-列表归档结果`,生成全局 JSON/CSV 和 `信息记录`
5. `05_同步PostgreSQL单表.py`:把合并结果同步到 PostgreSQL 的 `"Patient_Lists"` 单表。
6. `06_PostgreSQL建表结构.sql`:数据库单表结构、索引、表注释、字段注释。
7. `07_处理程序说明.md`:当前说明。
8. `08_PostgreSQL调整Patient_Lists列顺序.sql`:保留数据的前提下,把现有 `"Patient_Lists"` 物理列顺序调整为当前字段顺序。
9. `09_PostgreSQL住院号非空唯一约束.sql`:删除住院号为空的记录,重复住院号保留最新一条,并让 PostgreSQL 强制住院号不能为空且唯一。
## 智能体处理顺序
1. 检查待处理批次目录和图片数量。
2. 必要时更新 `01_科室分类规则.json` 的别名。
3. 运行 `02_患者列表OCR归档.py` 处理一个批次。
4. 查看 `复核报告.json``重复住院号报告.json`
5. 若有需人工复核项,优先补自动清洗规则;仍不能自动判断时,写入 `03_人工复核修正.json`
6.`--rebuild-from-cache` 重建该批次结果,确认复核项和重复住院号符合预期。
7. 运行 `04_合并批次结果.py` 更新全局 `信息记录`
8. 运行 `05_同步PostgreSQL单表.py` 同步到 PostgreSQL。
9. 导入 PostgreSQL 后查询记录数、需复核记录数、重复住院号组数。
## 人工复核网页端
- 代码目录:`人工复核网页端/`
- 启动方式:`cd 人工复核网页端 && docker compose up -d --build`
- 登录配置从项目根目录 `.env` 读取:`REVIEW_APP_USERNAME``REVIEW_APP_PASSWORD``REVIEW_APP_SECRET_KEY``REVIEW_APP_PORT`
- 网页端读取各批次 `复核报告.json`,按原始图片路径与图片内行号裁剪截图;住院号不能为空且唯一,格式是否规范交由人工复核时判断。
- 保存修订后写入 `数据处理工作区/03_人工复核修正.json`,并尽量同步 PostgreSQL若 PostgreSQL 暂不可用,会保留待同步状态,之后可在网页端点击“提交待同步”。
- 出院时间默认允许为空;确有出院时间时,网页端和处理程序会校验时间格式以及是否早于入院时间。
- 页面包含概览、复核、抽查、抽查查看、设置区域;抽查功能可随机抽取患者行,调用 Kimi 多模态模型二次核验,并把 AI 反馈、机器判断、人工抽查结论写入 PostgreSQL。
## 识别策略
- OCR 接口:腾讯云 `RecognizeTableAccurateOCR` 表格识别 V3。
- 新批次拼接图默认给每张原图上下各加 `24px` 白色边界,减少贴边表格行被裁掉或和相邻图片粘连的概率。
- 正式处理优先用 6 张拼接;接口超时、失败或行数偏少时,程序会自动降到 4/3/2/单张。
- 行数校验:按图片高度推断应有行数,返回行数偏少即判定该拼接档位不可靠。
- 漏行不一定只发生在最上方或最下方两行;长拼接图中间也可能漏行,白边只能缓解贴边问题。
- 同一科室内会记忆稳定回退档位;跨科室不共享该记忆,避免重建历史缓存时误用。
- 只用缓存重建时,若前序回退策略需要的缓存不完整,会先尝试该组主缓存,避免因缓存形态不同造成少行。
- 字段顺序固定为:姓名、性别、年龄、住院号、诊断、入院时间、最后书写时间、住院天数、出院时间、手术后天数。
- 字段清洗包含日期规范化、住院号常见误识别修正、长诊断吞入入院时间、空时间字段导致列左移、`后XX天` 错位等。
## 住院号核验规则
- `住院号` 是唯一强制校验条件:不能为空且全库唯一。
- 单批次、全局合并和 PostgreSQL 同步都会剔除住院号为空的记录;重复住院号按后出现记录覆盖先出现记录;格式异常但非空的住院号保留。
- 网页端保存时优先按图片路径和图片内行号定位数据库记录;如果当前住院号已存在于另一条记录,会用当前修订覆盖既有住院号记录,并删除当前重复图片记录。
- 数据库约束允许 `出院时间` 为空;若入院时间和出院时间均为标准格式且入院时间晚于出院时间,该记录必须标记为 `需人工复核`
## PostgreSQL 单表字段
`"Patient_Lists"` 只保留正式查看和追溯需要的字段:
- 数据定位:`batch_name``source_folder``image_path``image_name``image_row_no`
- 科室信息:`major_department``sub_department`
- 患者信息:姓名、性别、年龄、住院号、诊断、入院时间、最后书写时间、住院天数、出院时间、手术后天数
- 复核信息:`review_status``review_notes``manual_corrected`
- 抽查信息:`audit_result``audit_ai_feedback``audit_manual_feedback``audit_machine_verdict``audit_source``audit_checked_by``audit_checked_at`
复核状态含义:
- `自动复核通过`OCR 结果经过程序规则校验后没有发现明显异常,`manual_corrected=false`
- `人工复核通过`:该行命中了 `03_人工复核修正.json` 中的人工修正项,修正后校验通过,`manual_corrected=true`
- `AI修改-待确认`:网页端 Kimi 辅助生成的草稿状态,不会被待同步流程写入 PostgreSQL需人工保存确认。
OCR 请求号、OCR 缓存路径、拼接图路径、拼接组号等中间态字段不进入数据库正式表。