[开源] 多部门会签文档进度自动重建系统:面向医院行政与临床协同的OCR+状态机追踪工具 本项目是专为医院多部门会签流程设计的轻量级文档进度追踪系统解决术前讨论、器械采购、医务审批等跨科室纸质/扫描件流转中「卡在哪、谁没签、超没超时」三大盲区。我们用手机拍照上传会签单自动识别当前签署节点如「麻醉科已签」「ICU待审」驱动状态机记录每一步流转时间生成唯一二维码供患者或申请科室扫码查实时状态和预计完成时间对停留超48小时未处理的节点系统自动告警。它不是通用工作流引擎不对接HIS或EMR而是聚焦「会签文档本身」这一最小可追踪单元提供CLI命令行、Web API和HTML仪表盘三类交付形态技术栈全部基于Python生态Tesseractchi_sim中文包做OCR、OpenCV预处理图像、SQLite本地存档、Flask暴露API、Rich渲染终端界面、Jinja2生成中式政务风HTML页。定位与能力范围我们不做流程再造也不替代签字动作本身只做一件事把散落在不同科室桌面上的会签单变成一条可追溯、可查询、可预警的时间线。适用场景明确限定在「多部门顺序或并行签署的正式文书」典型如术前讨论纪要、高值耗材采购申请、院内会诊邀请单、科研伦理审查表、大型设备使用审批单。不覆盖日常交接班记录、护理巡视单、检验申请单等非会签类表单也不处理电子签名平台已在线签署的文档本系统专治那些仍靠打印、手写、传阅、拍照的「半数字化」环节。它的能力边界清晰 - 输入必须是含会签栏的文档图像支持JPG/PNG能识别出「科室名签署人时间」结构化字段 - 状态机仅管理「创建→流转中→完成→取消」四态节点粒度到科室级非个人不拆解到具体医生工号 - QR码仅编码文档ID与查询密钥不承载业务数据扫码页只读不修改 - 所有告警基于配置的threshold_hours默认48小时不引入外部日历或节假日规则。核心功能模块模块关键能力说明图像采集与OCR灰度化、二值化、倾斜校正、中文识别OpenCV预处理保障Tesseract在模糊、反光、倾斜照片上仍可提取「外科张三 2026-05-10」类文本状态机引擎节点级待签/已签/已拒、全局文档状态、完整时间戳链每次sign操作触发状态校验拒绝重复签署或跳过前置节点所有变更写入timeline表QR码管理文档ID密钥编码、可打印标签生成、扫码直连状态页生成PNG后可粘贴至纸质单右下角患者扫码即见当前所处节点及剩余预估时长如「距超时还剩36小时」HTML可视化时间轴图谱、四象限仪表盘待处理/进行中/已完成/超时、响应式布局界面采用蓝灰主色、方正字体、无动画适配iPad及门诊自助机浏览器CLI工具集全生命周期操作建单、查状态、签节点、看时间轴、导报表支持--status in_progress筛选、batch-import夹批量导入、export --format csv导出台账使用与配置安装只需三步克隆代码、装Python依赖、配Tesseract中文包。无需数据库服务或云环境SQLite文件默认存于data/document_flow.db开箱即用。pip install -r requirements.txtTesseract安装按系统区分 - Windows下载UB-Mannheim安装包勾选chi_sim中文语言包 - Linuxsudo apt-get install tesseract-ocr tesseract-ocr-chi-sim - macOSbrew install tesseract tesseract-lang。配置通过config.json统一管理关键项包括OCR语言默认chi_simeng、超时阈值单位小时、Web服务端口、日志路径。首次运行可自动生成模板python main.py init-config工作流实操示例以「术前讨论纪要」为例全流程6步可在5分钟内走完创建文档声明标题与初始会签科室python main.py create 术前讨论纪要 --departments 外科,麻醉科,ICU补全节点追加医务科、分管院长等后续环节python main.py add-node 1 --name 医务科审核 --department 医务科python main.py add-node 1 --name 分管院长审批 --department 院领导导入照片外科医生拍下已签署页面上传绑定文档python main.py import-image ./img/waike.jpg --doc-id 1OCR识别系统自动解析出「外科李四 2026-05-10」并标记该节点为SIGNEDpython main.py scan-document ./img/waike.jpg扫码查看打印QR码贴单患者扫码即见「当前节点麻醉科待签预计24小时内完成」python main.py generate-qr 1监控超时若麻醉科48小时未签report --type overdue将列出该文档管理员可定向催办。工程结构与扩展性项目采用分层架构各模块职责分明便于医院信息科二次开发目录/文件职责可定制点src/state_machine.py状态转换规则、节点校验逻辑修改transition_rules可适配本院特有会签顺序如需「先ICU后麻醉科」src/ocr_engine.py图像预处理参数、Tesseract调用封装调整threshold默认128或开关denoise可优化特定扫描件识别率src/qr_generator.pyQR码内容格式、密钥生成策略替换generate_query_key()函数可对接院内统一认证体系templates/HTML页面样式与数据渲染逻辑修改CSS变量即可切换蓝白/绿白主题适配不同科室视觉偏好所有CRUD操作经由src/crud.py抽象数据库表结构固化但字段可扩documents表存主干信息nodes表存科室节点timeline表存每一次签署动作新增字段不影响现有CLI命令。环境与运行保障系统对运行环境要求极低Python 3.8即可无GPU依赖。测试覆盖核心路径运行pytest可验证OCR解析、状态跳转、QR码生成等关键行为。日志默认写入logs/document_flow.log级别可配为DEBUG用于排查识别失败原因。常见问题有标准应对手段 | 问题现象 | 原因定位 | 解决方式 | |----------|----------|----------| | OCR识别不出科室名 | 图片过暗/反光/倾斜严重 | 用scan-document前先手动旋转图片或调高config.json中ocr.threshold值 | |status命令报错「no such table」 |data/目录无写权限或路径不存在 | 手动创建data文件夹或修改config.json中database.path为绝对路径 | | Web服务启动失败 | 端口5000被占用 | 修改config.json中web.port为5001或执行lsof -i :5000杀进程 |数据与交付形态系统输出两类核心数据资产一是结构化台账含文档ID、标题、各节点签署人、时间、备注支持CSV/JSON导出供质控分析二是可视化视图仪表盘按状态分类统计文档数时间轴页展示从发起至当前的完整流转图谱。所有数据落盘于SQLite无外部依赖导出即走符合医院数据本地化要求。CLI命令覆盖全部管理动作Web API则为前端集成预留接口GET /api/document/{id}返回摘要GET /api/document/{id}/timeline返回带时间戳的节点序列GET /api/document/{id}/status返回是否超时等布尔态。不提供POST/PUT接口杜绝远程篡改风险。项目地址https://github.com/nexorin9/document-flow-tracker