医院门诊药房系统:一个完整的状态机
医院门诊药房系统挂号→收费→发药→退药一个完整的状态机文章目录医院门诊药房系统挂号→收费→发药→退药一个完整的状态机一、场景二、四个角色四套操作三、门诊链路一条最长状态链四、药库链路进销存管理五、住院链路更长但不复杂六、日结每天和钱对一次账七、总结不是 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/10/2 14:08:16 阅读更多 →
AliceUI兼容性处理:IE6+浏览器适配的实用方案

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

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

2026/10/15 4:48:45 阅读更多 →
7款PDF转Word工具盘点对比:哪几款免费好用、无水印、手机也能用?

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

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

2026/10/14 18:27:08 阅读更多 →

最新新闻

光子晶体光纤仿真降维实操:笔记本搞定模式干涉建模

光子晶体光纤仿真降维实操:笔记本搞定模式干涉建模

最近有个朋友跟我诉苦:他接手了一个光子晶体光纤传感器的项目,领导开口就问“你这个仿真要多大内存,是不是得租台服务器”,他按照常规三维时域软件一估算,发现模型随便就是几十亿网格,当场就自闭了。我跟他…

2026/10/15 7:41:00 阅读更多 →
Zotero本地增强方案:可视化+AI问答+全文翻译

Zotero本地增强方案:可视化+AI问答+全文翻译

1. 这不是“又一个Zotero插件”,而是一套可落地的学术工作流增强方案你有没有过这样的时刻:文献库攒了八百篇PDF,点开Zotero主界面却像面对一座没有索引的图书馆——知道里面有东西,但找不到入口;读到关键段落想查证原…

2026/10/15 7:41:00 阅读更多 →
一人公司的商业价值与运营策略解析

一人公司的商业价值与运营策略解析

1. 一人公司的产业定位解析在商业生态系统中,一人公司正以独特的组织形式填补着传统企业难以触及的市场缝隙。这种微型企业形态不同于自由职业者或个体工商户,其核心特征在于以公司法人身份运作,却保持极简的组织架构。我观察到近年来在软件开…

2026/10/15 7:41:00 阅读更多 →
考虑源荷不确定性的两阶段鲁棒机组调度:Yalmip+Gurobi实现

考虑源荷不确定性的两阶段鲁棒机组调度:Yalmip+Gurobi实现

1. 项目概述:源荷不确定性下的机组调度为何需要重做模型电力系统的机组调度问题,如果只在确定性场景下做,说实话已经不算难事了。常规的经济调度加机组启停约束,用线性规划或者混合整数线性规划就能收敛得很漂亮。真正让调度模型从…

2026/10/15 7:41:00 阅读更多 →
AI热点背后的认知校准:GPT-6、世界模型与术语通胀解析

AI热点背后的认知校准:GPT-6、世界模型与术语通胀解析

1. 标题背后的三重信号:一场被误读的“AI纪年”重构看到这个标题,我第一反应不是点开看内容,而是下意识翻了翻日历——2026年10月?再确认一遍手机系统时间:2024年9月。没错,这根本不是一份“新闻简报”&…

2026/10/15 7:41:00 阅读更多 →
2026年10月北京市联通宽带实测办理避坑全攻略

2026年10月北京市联通宽带实测办理避坑全攻略

上个月我翻了一下家里的宽带账单,一年算下来花了快两千块。很多人有个反常识的误区,觉得宽带资费越贵,网速就绝对越快。其实我拿着四家运营商的账单横向对比后发现,花双倍钱办的千兆宽带,实际体验甚至不如邻居办的五百…

2026/10/15 7:40:00 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →