ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

医院HIS管理系统详细设计说明书:从文档到工程蓝图的核心要点

医院HIS管理系统详细设计说明书:从文档到工程蓝图的核心要点 简介这份《医院HIS管理系统详细设计说明书》面向医院信息化开发人员、实施人员及医院管理人员用于指导HIS系统的开发与落地解决医院日常运营与管理中的信息化建设问题。文档从引言、系统总体描述、数据库设计到系统窗口设计逐层展开涵盖编写目的、读者对象、编写原则、项目背景与术语定义并给出病人注册、诊疗服务、检查报告、药品管理、财务管理等业务处理总流程及总体功能结构图还包含数据库物理模型与门诊挂号、门诊划价等窗口设计细节便于读者理解系统架构与模块划分。资源包共1个doc文件约1.45MB内容为完整的设计说明文档适合作为毕业设计、课程设计或实际项目开发中的参考模板。目前已有200人学习下载可供需要撰写HIS详细设计文档或了解医院信息系统整体设计思路的读者查阅借鉴。1. 医院HIS管理系统详细设计说明书从一纸文档到能落地的工程蓝图接手一个医院HIS管理系统的详细设计说明书很多人第一反应是“写文档而已”。但真正做过HIS实施工程师的人都清楚这份文档写砸了后面编码、联调、上线全是血泪账。HIS不是普通后台管理系统它要同时扛住门诊挂号、医嘱开立、收费结算、药房发药、医保对接等多条业务线任何一处设计含糊上线当天就可能出现挂号卡死、医嘱丢失、收费对不上账的翻车现场。详细设计说明书的核心价值是把需求阶段那句“支持门诊挂号”翻译成具体的表结构、接口定义、状态流转和异常处理策略。它面向的是要照着写代码的后端工程师、要对接的医保接口人、要做压测的运维以及后续接手维护的同事。这篇笔记就按我实际写HIS详细设计的路径把这份文档该有什么、每部分怎么落笔、参数怎么定、坑在哪一层层拆开讲。2. 先搞清楚详细设计说明书在HIS项目里的边界2.1 总体设计和详细设计到底怎么分很多团队在总体设计阶段就把表结构画完了到了详细设计只剩贴代码这是典型的职责错位。总体设计回答的是“系统分几个模块、模块之间怎么调、部署成什么样”比如HIS划分为挂号子系统、门诊医生站、收费子系统、药房子系统、医保接口层各子系统通过内部服务或消息队列通信。详细设计回答的是“每个模块内部怎么实现”具体到某张表的字段类型、某个接口的入参出参、某个状态机的流转条件。我一般用一条判断标准如果一段描述能让两个不同的工程师写出不兼容的代码它就属于详细设计必须写清楚的内容。比如“挂号成功后生成就诊号”这句话在总体设计里够了但详细设计必须写明就诊号的生成规则是日期加科室码加当日序号序号每日重置并发时用数据库序列还是Redis自增冲突了怎么重试。这些不写两个工程师一个用时间戳一个用自增联调时就得返工。HIS系统还有个特殊之处医保接口和院内业务是两套节奏。医保那边给的接口文档往往只有报文格式没有业务时序。详细设计说明书里必须把医保交易和院内状态的对应关系补上比如医保挂号成功但院内写库失败时是走冲正还是挂起这个决策直接影响后面收费能不能对上账。2.2 详细设计说明书必须覆盖的六类内容一份能指导编码的HIS详细设计说明书我通常会覆盖这几块模块结构图与职责边界、数据库表结构定义、接口定义与报文示例、关键业务时序、状态机与异常分支、非功能性约束。这六块缺一块编码阶段就会有人来问你。模块结构图不是画着好看是要标清楚每个模块的输入输出和依赖方向。数据库表结构定义要写到字段级包括字段名、类型、长度、是否为空、默认值、索引和约束。接口定义要给出请求方法、路径、请求体字段、响应体字段、错误码。关键业务时序用文字或表格描述比如“挂号→收费→发药”这条链路上每一步的前置条件和后置动作。状态机要列出所有状态和允许的迁移异常分支要写明每种失败场景的处理策略。非功能性约束包括响应时间目标、并发量预估、数据保留周期。提示详细设计说明书不是一次写完就锁死的但每次变更必须留版本记录和变更原因否则上线出问题回溯时找不到依据。2.3 读者是谁决定了你写多细这份文档的读者至少有三类写代码的后端工程师、做接口对接的医保或第三方厂商、后续维护的运维和二次开发人员。后端工程师关心表结构和接口签名医保对接方关心报文格式和错误码运维关心部署依赖和数据量预估。写的时候要照顾到这三类人的检索习惯比如表结构用统一模板接口用统一模板不要一段散文一段表格混着来。我见过一份详细设计表结构写在正文段落里字段用逗号隔开后端工程师看了直接自己重新画了一遍结果和文档不一致测试阶段对不上。后来我们统一用表格每个字段一行谁看都清楚。文档的格式一致性直接决定了它会不会被真正使用。3. 数据库表结构设计HIS详细设计里最容易埋雷的部分3.1 核心业务表的字段定义与约束HIS的核心表其实不多但每张都关键。以挂号表和就诊记录表为例挂号表要记录挂号流水号、患者ID、科室、医生、挂号类型、挂号时间、状态、费用。就诊记录表要记录就诊号、患者ID、挂号流水号、接诊医生、就诊时间、诊断信息、状态。这两张表通过挂号流水号关联设计时要考虑一个患者同一天同一科室多次挂号的情况。下面是我常用的挂号表建表语句模板字段命名用下划线风格主键用业务无关的自增ID业务流水号单独建唯一索引。CREATE TABLE his_registration ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 自增主键, reg_serial_no VARCHAR(32) NOT NULL COMMENT 挂号流水号格式REGyyyyMMdd6位序列, patient_id VARCHAR(32) NOT NULL COMMENT 患者唯一标识, dept_code VARCHAR(16) NOT NULL COMMENT 科室编码, doctor_code VARCHAR(16) DEFAULT NULL COMMENT 医生工号普通号可为空, reg_type TINYINT NOT NULL COMMENT 挂号类型1普通 2专家 3急诊 4复诊, reg_fee DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 挂号费, reg_time DATETIME NOT NULL COMMENT 挂号时间, status TINYINT NOT NULL DEFAULT 0 COMMENT 状态0待就诊 1已就诊 2已退号 3已作废, visit_no VARCHAR(32) DEFAULT NULL COMMENT 就诊号就诊后回填, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_reg_serial_no (reg_serial_no), KEY idx_patient_time (patient_id, reg_time), KEY idx_dept_status (dept_code, status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT挂号记录表;这段建表语句里几个关键决策reg_serial_no用唯一索引而不是主键因为业务流水号可能因迁移或补录需要调整主键保持稳定status用TINYINT而不是枚举字符串查询效率高且扩展方便idx_patient_time和idx_dept_status两个组合索引分别覆盖患者查挂号和科室查待就诊列表两个高频场景。reg_fee用DECIMAL而不是FLOAT金额计算不能有精度损失。参数说明reg_serial_no长度32够用格式里日期8位加序列6位加前缀3位共17位留了余量。status的取值要在文档里列全并且写明每个状态允许的迁移比如0只能迁到1或21只能迁到32和3是终态。这些约束不写编码时有人直接改status值后面统计就乱了。3.2 医保接口相关表的特殊处理医保接口是HIS里最特殊的一块因为医保交易有冲正、对账、明细上传等异步流程。我一般会单独建医保交易流水表和医保对账表。交易流水表记录每笔医保交易的请求报文、响应报文、交易状态、院内关联单号。对账表记录每日对账结果包括医保返回的总笔数、总金额和院内统计的差异。CREATE TABLE his_mi_transaction ( id BIGINT NOT NULL AUTO_INCREMENT, mi_trade_no VARCHAR(64) NOT NULL COMMENT 医保交易流水号, biz_type VARCHAR(16) NOT NULL COMMENT 业务类型REG挂号 FEE收费 SETTLE结算 REFUND退费, request_body TEXT COMMENT 请求报文JSON, response_body TEXT COMMENT 响应报文JSON, trade_status TINYINT NOT NULL DEFAULT 0 COMMENT 0处理中 1成功 2失败 3已冲正, his_order_no VARCHAR(64) DEFAULT NULL COMMENT 院内关联单号, retry_count INT NOT NULL DEFAULT 0 COMMENT 重试次数, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_mi_trade_no (mi_trade_no), KEY idx_his_order (his_order_no), KEY idx_status_time (trade_status, create_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT医保交易流水表;request_body和response_body用TEXT存完整报文方便出问题时回溯。trade_status的0处理中状态很关键医保交易可能超时超时后不能直接判失败要挂起等对账或主动查询。retry_count用来控制重试次数超过阈值要告警而不是无限重试。his_order_no关联院内单号对账时用来匹配。注意医保报文里可能包含患者敏感信息存储时要评估是否需要脱敏或加密至少访问权限要收紧。3.3 表结构评审时必查的五个点表结构写完不是直接进文档我一般会拉上后端负责人和DBA过一遍重点查五个点。第一主键策略是否统一HIS里我建议统一用自增BIGINT不用UUID因为UUID做聚簇索引插入性能差。第二金额字段是否都用DECIMAL有没有混入FLOAT或DOUBLE。第三状态字段的取值是否列全有没有遗漏中间态。第四高频查询是否有对应索引索引列顺序是否匹配查询条件。第五表注释和字段注释是否完整后续维护的人能不能看懂。这五个点里最容易翻车的是索引。我见过挂号表在dept_code上建了单列索引但实际查询是dept_code加status加reg_time排序单列索引效果很差。后来改成组合索引才把挂号列表的响应时间从两秒降到两百毫秒。索引不是越多越好每个索引都要对应一个明确的查询场景写文档时把场景标注在索引旁边评审时一目了然。4. 接口定义与业务时序让前后端和医保对接方都能照着写4.1 院内接口的请求响应模板HIS内部接口我一般用RESTful风格但路径和字段命名要统一。挂号接口的请求体包含患者ID、科室编码、医生编码、挂号类型响应体返回挂号流水号、就诊号、排队序号、费用。错误码要分层次比如1001表示参数错误2001表示号源已满3001表示患者不存在。{ patientId: P20240101001, deptCode: D001, doctorCode: DOC001, regType: 1, operatorId: OP001 }响应体{ code: 0, message: success, data: { regSerialNo: REG20240101000001, visitNo: V20240101000001, queueNo: 5, regFee: 10.00 } }接口文档里要写明每个字段的类型、是否必填、长度限制和业务含义。regType的取值要和数据库status的取值对应上不能一个用数字一个用字符串。错误码要集中管理不能每个接口自己定义一套。我一般会在详细设计里附一张错误码总表所有接口共用。参数说明patientId是院内患者唯一标识不是身份证号身份证号单独字段存储。deptCode和doctorCode要和基础数据表里的编码一致不能有别名。queueNo是排队序号同科室同一天内递增退号后序号不回收。regFee要和收费子系统的金额一致挂号接口返回的费用是预计算值实际收费以收费接口为准。4.2 医保接口的报文与时序设计医保接口的报文格式由医保平台规定但详细设计里要补充院内怎么组装和解析。以医保挂号为例时序是院内先校验患者和号源然后调医保挂号接口医保返回成功后院内写挂号表如果院内写库失败要调医保冲正接口。这个时序必须写清楚否则编码时有人先写库再调医保医保失败后院内数据就成了脏数据。def mi_register(patient_id, dept_code, doctor_code): # 第一步院内校验 validate_patient(patient_id) validate_slot(dept_code, doctor_code) # 第二步组装医保报文 mi_request build_mi_request(patient_id, dept_code, doctor_code) # 第三步调医保接口带超时和重试 mi_response call_mi_api(mi_request, timeout5, retry1) # 第四步医保成功则写院内库失败则抛异常 if mi_response[code] 0: try: reg_serial_no save_registration(patient_id, dept_code, doctor_code) except Exception as e: # 院内写库失败调医保冲正 call_mi_cancel(mi_response[miTradeNo]) raise e return reg_serial_no else: raise BizException(mi_response[message])这段伪代码的关键在于异常处理顺序医保成功但院内失败时必须冲正不能只记日志。冲正接口也要有重试和告警冲正失败要进人工处理队列。超时时间设5秒是经验值医保接口响应一般在两秒内超过五秒大概率是网络或医保侧问题重试一次仍失败就挂起。参数说明timeout和retry要根据医保平台的实际SLA调整有的地区医保接口较慢timeout要放宽到10秒。miTradeNo是医保返回的交易流水号冲正时必须带上。冲正接口的调用要记录到医保交易流水表trade_status置为3已冲正。4.3 关键业务时序的文档化写法业务时序我一般用表格写每一步一行列出步骤序号、参与方、动作、输入、输出、异常处理。比如门诊挂号时序患者到窗口操作员输入患者信息系统校验患者系统校验号源系统调医保医保返回系统写挂号表系统返回挂号成功。每一步的异常处理单独一列写清楚失败后回滚到哪一步。这种表格的好处是测试人员可以直接照着写测试用例每一步的正常和异常都是一条用例。我见过有的详细设计只画一张时序图没有异常分支测试时全靠猜漏测一堆边界。表格虽然不如图好看但信息密度高落地性强。提示时序表格里的异常处理要写到具体动作比如“医保超时→挂起交易→记录流水→返回挂号失败”不能只写“处理异常”。5. 避坑与排查HIS详细设计说明书里那些后悔药5.1 状态字段取值没列全导致统计口径不一致现象上线后门诊量统计和财务统计对不上差了十几条记录。原因挂号表status字段文档里只写了0待就诊、1已就诊、2已退号编码时有人加了3已作废表示医生停诊后系统自动作废的挂号但文档没更新统计脚本只统计了0和1漏了3。解决状态字段的取值必须在详细设计里列全并且写明每个取值的业务含义和统计口径。后续新增状态要走变更流程同步更新统计脚本。5.2 接口超时时间设太短导致医保交易重复现象医保挂号偶尔出现同一患者两条挂号记录医保侧扣了一次费院内写了两条。原因医保接口超时设了3秒网络抖动时请求已到医保但响应超时院内重试了一次医保侧处理了两次。解决医保接口的超时和重试策略要单独设计超时后不能直接重试要先查询交易状态。详细设计里要写明“超时→查询→确认失败才重试”的流程并且重试要带唯一请求号医保侧做幂等。5.3 金额字段用FLOAT导致对账差几分钱现象收费日报和医保对账差0.01元查了半天是浮点精度问题。原因建表时reg_fee用了FLOAT累加时出现精度损失。解决所有金额字段统一用DECIMAL(10,2)或DECIMAL(12,2)详细设计里明确禁止使用FLOAT和DOUBLE存金额。这个坑几乎每个HIS项目都会踩一次写文档时直接写死。5.4 索引缺失导致挂号高峰期查询超时现象早上八点挂号高峰期挂号列表加载要五六秒操作员抱怨。原因挂号表只建了主键索引查询按科室加状态加时间排序时全表扫描。解决详细设计里每个高频查询都要标注对应索引评审时用真实数据量估算。挂号表至少要有科室加状态的组合索引收费表要有时间加状态的组合索引。5.5 医保报文没存导致问题无法回溯现象医保对账差异但找不到当时的请求响应报文无法定位。原因详细设计里没要求存医保报文编码时只记了交易号和状态。解决医保交易流水表必须存完整请求和响应报文至少保留三个月。报文里如果有敏感信息做脱敏或加密但不能不存。这个后悔药吃过一次就再也不会省。6. 从文档到代码的验证用检查清单和原型表提前暴露问题详细设计写完怎么验证它能不能指导编码我一般做两件事一是拉一个检查清单逐项核对二是用关键表结构建原型跑几条真实业务数据。检查清单我固定用这几项每张核心表是否有建表语句和字段说明每个对外接口是否有请求响应示例和错误码每条关键业务链路是否有正常和异常时序每个状态字段是否有取值表和迁移规则每个金额字段是否用DECIMAL每个高频查询是否有索引。这六项全过文档基本能支撑编码。原型验证更直接。拿挂号、收费、发药三张核心表建到测试库造一百条患者数据跑一遍挂号到发药的完整流程看表结构能不能支撑接口字段够不够用。我一般会在原型阶段发现字段缺失或类型不对的问题比如患者表缺了医保类型字段导致医保挂号时没法判断患者类别。这种问题在文档阶段改成本最低上线后改就是事故。检查项通过标准常见问题表结构字段类型、长度、约束、索引齐全金额用FLOAT状态取值不全接口定义请求响应示例、错误码、幂等说明错误码各接口不统一业务时序正常和异常分支都有只写正常流程异常靠猜状态机状态取值和迁移规则明确中间态遗漏终态可回退非功能约束响应时间、并发量、数据保留没写上线后无依据最后说个我自己的习惯详细设计说明书里每张表、每个接口都标一个负责人编码阶段有问题直接找人不搞匿名文档。文档版本用日期加序号每次变更在文档头部记一行变更日志写清楚改了什么、为什么改、谁改的。这个习惯帮我省了很多次回溯时间也让我在HIS实施这条路上少踩了不少坑。希望帮到你。本文还有配套的精品资源点击获取
返回列表