医院门诊药房系统:一个完整的状态机
医院门诊药房系统挂号→收费→发药→退药一个完整的状态机文章目录医院门诊药房系统挂号→收费→发药→退药一个完整的状态机一、场景二、四个角色四套操作三、门诊链路一条最长状态链四、药库链路进销存管理五、住院链路更长但不复杂六、日结每天和钱对一次账七、总结不是 CRUD。是每一步都锁着上一步。一、场景一个人去医院门诊的完整路径挂号 → 看医生 → 医生开处方 → 收费处缴费 → 药房取药 → 走人。如果在任何一个环节出了问题——收错费、发错药、要退药——系统要能退回去而且要退得干净。不是因为退药就把发药记录删了是不能删只能冲正。下面拆解整条链路上的状态机设计。二、四个角色四套操作系统分四个功能域角色功能挂号处挂号、退号、日结收费处收费、作废、退费、取消作废、日结药房发药、取消发药、退药药库入库审批、出库审批、盘点、调价、药房申领每个角色的操作不是孤立的——收费锁着发药发药锁着退药退药锁着退费。前一个状态决定后一个能不能做。三、门诊链路一条最长状态链挂号 ──→ 退号只有未收费的挂号可退 │ ▼ 收费 ──→ 作废只有未发药的收费可作废 │ │ │ └──→ 取消作废作废撤销 │ ▼ 发药 ──→ 取消发药 │ ▼ 退药 ──→ 退费只有退药生成的处方才能退费每一步的约束操作前置条件做的事挂号无创建就诊记录退号未收费标记退号不删记录收费已挂号 有处方生成结算单更新费用汇总作废未发药费用撤销不删记录取消作废已作废恢复到已收费状态发药已收费 未发药更新处方发药字段 减库存取消发药已发药处方回到未发药库存加回退药已发药 有药品可退生成新处方退药处方明细插入负数库存加回退费有退药处方生成退费结算单伪代码实现// 挂号 function 挂号(患者ID, 科室ID): record INSERT INTO 就诊记录(患者ID,科室ID,状态已挂号) return record.就诊ID // 收费 function 收费(就诊ID, 处方列表): rec SELECT * FROM 就诊记录 WHERE ID就诊ID if rec.状态 ! 已挂号: return error(未挂号或已收费) sum 0 for item in 处方列表: INSERT INTO 费用明细(就诊ID, 项目, 金额, 状态未发药) sum item.金额 INSERT INTO 结算单(就诊ID, 金额sum, 状态已收费) UPDATE 就诊记录 SET 状态已收费 WHERE ID就诊ID return 收费成功 // 作废只有未发药的能作废 function 作废(就诊ID): rec SELECT * FROM 就诊记录 WHERE ID就诊ID if rec.状态 ! 已收费: return error(状态不正确) if EXISTS(SELECT 1 FROM 费用明细 WHERE 就诊ID就诊ID AND 状态已发药): return error(已有发药记录不能作废请走退药流程) UPDATE 结算单 SET 状态已作废 WHERE 就诊ID就诊ID UPDATE 就诊记录 SET 状态已作废 WHERE ID就诊ID return 作废成功 // 发药 function 发药(就诊ID, 药品列表): for drug in 药品列表: item SELECT * FROM 费用明细 WHERE 就诊ID就诊ID AND 项目drug.项目 if item.状态 ! 未发药: continue // 已发过的跳过 stock SELECT 库存 FROM 药房库存 WHERE 药品IDdrug.药品ID if stock drug.数量: return error(库存不足) UPDATE 药房库存 SET 库存库存-drug.数量 WHERE 药品IDdrug.药品ID UPDATE 费用明细 SET 状态已发药, 发药时间NOW() WHERE IDitem.ID return 发药成功 // 退药生成冲正记录不删原记录 function 退药(就诊ID, 退药列表): for drug in 退药列表: item SELECT * FROM 费用明细 WHERE 就诊ID就诊ID AND 项目drug.项目 if item.状态 ! 已发药: return error(未发药不能退) if item.数量 item.退药数量 drug.数量: return error(无可退数量) // 生成退药处方数量为负 INSERT INTO 处方汇总(就诊ID, 退药标志已退, 关联原处方号item.处方号) INSERT INTO 费用明细(处方号新处方号, 项目drug.项目, 数量-drug.数量, 状态已退药) UPDATE 药房库存 SET 库存库存drug.数量 WHERE 药品IDdrug.药品ID UPDATE 费用明细 SET 退药数量退药数量drug.数量 WHERE IDitem.ID return 退药成功 // 退费只有退药处方才能退费 function 退费(处方ID): rec SELECT * FROM 处方汇总 WHERE ID处方ID if rec.退药标志 ! 已退: return error(非退药处方不能退费) if EXISTS(SELECT 1 FROM 结算单 WHERE 处方ID处方ID AND 类型退费): return error(已退费不能重复) sum SELECT SUM(金额) FROM 费用明细 WHERE 处方ID处方ID // 金额为负 INSERT INTO 结算单(就诊IDrec.就诊ID, 金额sum, 类型退费, 状态已退费) return 退费成功关键的锁收费→发药之间只有未发药的处方可以作废。已发药的不能作废只能走退药。发药→退药退药不是把发药记录删掉是生成一条新处方明细是负数。原处方保留库存加回。审计可追溯。退药→退费只有退药生成的处方才能退费。不是随便一笔收费都能退。四、药库链路进销存管理药库管的是整批的药药房管的是发给患者的那几盒。药库入库申请 → 入库审批 → 更新库存 保存历史价格 药库出库申请 → 出库审批 → 更新库存 药库盘点录入 → 盘点确认 → 更新库存 药库调价申请 → 调价审批 → 保存历史价格 药房申领药房发起 → 药库确认 → 更新药房库存入库/出库都走申请→审批两条线。审批不通过库存不动。调价不是直接改价格——是保存新价格旧价格进历史表。历史价格永不删除。五、住院链路更长但不复杂住院比门诊多了一层病区护士入院登记 → 缴费/押金 → 分配床位 → 诊断 → 护理记录 → 体温单 → 医嘱录入 → 医嘱复核 → 医嘱提交 → 住院发药 → 医嘱执行 → 计费 → 退费 → 出院登记 → 出院结算 → 撤销结算 → 撤销出院登记 → 催款押金不够时触发 → 停止医嘱长期医嘱的终止角色分三层角色做的事住院收费处入院登记、缴费、出院结算病区护士分配床位、护理记录、体温单、医嘱执行、催款医生诊断、医嘱录入药房住院发药医嘱复合→提交→发药→执行这条线是住院的核心。医嘱不提交药房看不到药房不发药护士不能执行。六、日结每天和钱对一次账挂号处和收费处每天要做日结挂号日结 → 撤销日结 → 确认 → 查询 收费日结 → 撤销日结 → 确认 → 查询日结把当天的挂号记录和收费记录快照一份生成日结报表。报表可以撤销重做但确认后不可再撤销。日结不是业务操作是财务操作。业务系统可以崩日结数据不能丢。七、总结这套系统写了十几年状态机设计定下来之后就没大改过。为什么因为医院的业务流程是写在制度里的——挂号→收费→发药→退药不是系统决定的是医院管理规范决定的。系统只是忠实地把这些规则变成了代码。几个不变的原则不删只冲——退药不删发药记录退费不删收费记录。审计第一。状态锁状态——发药锁着退药退药锁着退费。不能跳不能倒。审批全留痕——入库审批、调价审批、日结确认每一步操作有记录、可追溯。HIS 系统的复杂度不在于算法。在于规则多、角色多、不允许出错。每次看到医院系统崩溃的新闻我都能感受到屏幕背后的 DBA 在经历什么。

相关新闻

衡水林熠网站建设公司如何通过真诚服务与精湛技术为中小企业打造数字化未来

衡水林熠网站建设公司如何通过真诚服务与精湛技术为中小企业打造数字化未来

在这个数字化浪潮汹涌的时代,每一个企业,无论大小,都仿佛在波涛中寻找着一座灯塔。对于衡水这座城市而言,经济的转型和升级不仅仅是宏观政策下的宏大叙事,更是每一个个体商家、每一份辛勤耕耘背后最真实的渴望。当我们谈论网站时,很多人第一反应可能是“技术”、“代码”…

2026/8/7 20:24:35 阅读更多 →
AliceUI兼容性处理:IE6+浏览器适配的实用方案

AliceUI兼容性处理:IE6+浏览器适配的实用方案

AliceUI兼容性处理:IE6浏览器适配的实用方案 【免费下载链接】aliceui.github.io 写样式的一种方式 项目地址: https://gitcode.com/gh_mirrors/al/aliceui.github.io AliceUI是一套基于支付宝实际需求开发的通用样式模块,特别针对IE6及以上浏览器…

2026/8/7 20:24:35 阅读更多 →
7款PDF转Word工具盘点对比:哪几款免费好用、无水印、手机也能用?

7款PDF转Word工具盘点对比:哪几款免费好用、无水印、手机也能用?

上半年我手头正好攒了一批PDF要处理,有合同、有扫描版通知、还有几份从数据库直接导出的文字型PDF。一开始想法很简单——随便找个工具转成Word就行。结果第一份转出来段落全散,第二份排版倒是对上了,但落款处的公章变成了乱码,第…

2026/8/7 20:24:35 阅读更多 →

最新新闻

3分钟掌握ncmdump:免费解锁网易云音乐NCM格式终极指南

3分钟掌握ncmdump:免费解锁网易云音乐NCM格式终极指南

3分钟掌握ncmdump:免费解锁网易云音乐NCM格式终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否遇到过从网易云音乐下载的歌曲在其他播放器无法播放的困扰?🎵 今天我要介绍一个神奇的…

2026/8/7 21:25:59 阅读更多 →
AI 编程不是取代程序员:80% 的琐碎活交给 AI 之后,开发在做什么

AI 编程不是取代程序员:80% 的琐碎活交给 AI 之后,开发在做什么

一、先泼一盆冷水这两年"AI 取代程序员"的标题党看太多了。作为一个真实在用 AI 编程平台的团队负责人,我想先说结论:AI 编程短期内取代不了程序员,但它会彻底改变程序员在做什么。我们组用 MonkeyCode(长亭科技开源&am…

2026/8/7 21:25:58 阅读更多 →
团队 AI 编程落地指南:从 0 到 1 的实操路线图

团队 AI 编程落地指南:从 0 到 1 的实操路线图

一、为什么很多团队的 AI 编程项目会"凉"这两年看过不少团队上 AI 编程,结局大多是同一个:立项时热火朝天,三个月后没人用了。原因不是工具不行,而是落地方式不对——要么一步到位全上,开发被逼着用&#xf…

2026/8/7 21:25:58 阅读更多 →
jamovi社区与支持:如何获取帮助、贡献代码并参与开源项目

jamovi社区与支持:如何获取帮助、贡献代码并参与开源项目

jamovi社区与支持:如何获取帮助、贡献代码并参与开源项目 【免费下载链接】jamovi jamovi - open software to bridge the gap between researcher and statistician 项目地址: https://gitcode.com/gh_mirrors/ja/jamovi jamovi是一款免费开源的统计分析软件…

2026/8/7 21:25:58 阅读更多 →
3个步骤掌握YimMenu:GTA5最强防护与增强工具完整指南

3个步骤掌握YimMenu:GTA5最强防护与增强工具完整指南

3个步骤掌握YimMenu:GTA5最强防护与增强工具完整指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMe…

2026/8/7 21:25:58 阅读更多 →
折叠屏铰链MIM件一焊就裂?渐变脉冲三招破局

折叠屏铰链MIM件一焊就裂?渐变脉冲三招破局

一、铰链焊接的底层困局:MIM件凭什么比普通不锈钢难焊十倍 所谓折叠屏铰链MIM件,指的是通过金属注射成型工艺制造的铰链精密零件——螺帽、转轴座、限位块,材质以高强不锈钢(如17-4PH、THOR系列)为主,屈服…

2026/8/7 21:24:58 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →