# 患者列表归档处理程序说明 ## 工作区文件 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 缓存路径、拼接图路径、拼接组号等中间态字段不进入数据库正式表。