基于领域驱动设计重构医院门诊挂号收费系统的探索
如果无法正常显示,请先停止浏览器的去广告插件。
1. 智慧医院建设与实践
Construction and Practice of Smart Hospital
基于领域驱动设计重构医院门诊挂号收费
系 统的 探 索
王磊
王鹏
张蒙
王雅颀
田宗梅
【摘要】目的:解决医院信息系统(HIS)难以适应业务发展需要,可维护性、可扩展性差等问题。方法:以变
更频繁的门诊挂号收费系统为切入点,运用领域驱动设计方法进行系统重构,探索医院信息系统渐进式演进的
方法路径。结果:重构后的门诊挂号收费系统性能提高,资源消耗减少,主要质量指标得到明显提升。结论:领
域驱动设计方法适用于医院信息系统的渐进式演进,对医院推进信息系统更新迭代具有借鉴意义。
【关键词】领域驱动设计;医院;门诊挂号收费系统;重构
Doi:10.3969/j.issn.1673-7571.2024.02.015
【中图分类号】R197.3;R319
Reconstructing hospital outpatient registration and charging system based on domain-
driven design
WANG Lei, WANG Peng, ZHANG Meng, WANG Yaqi, TIAN Zongmei. Information Center, Beijing Shijitan Hospital,
Capital Medical University, Beijing 100038, China
Corresponding author: TIAN Zongmei, Email: tianzm@bjsjth.cn
【Abstract】Objective To solve the problem that HIS (Hospital Information System) is difficult to meet the needs
of operation development, and has poor maintainability and scalability. Methods Taking the frequently changed
outpatient registration and charging system as the entry point, the domain-driven design method was applied to
reconstruct the system and practically explore the incremental evolution method of HIS. Results The performance of
the reconstructed outpatient registration and charging system was improved, the resource consumption was reduced, and
the major quality indicators were significantly improved. Conclusion The domain-driven design method is suitable
for the incremental evolution of HIS, and has a reference significance for the hospital to promote the updating and
iteration of HIS.
【Keywords】Domain-driven design; Hospital; Outpatient registration and charging system; Reconstruct
作者单位:100038 北京,首都医科大学附属北京世纪坛医院信息中心
通信作者:田宗梅,Email: tianzm@bjsjth.cn
友好医院学报,2020,34(6):342-344.
[6] 李金苗,高文娟,李鹏,等.体检中心
多诊室智能导检方案的研究与应
用[J].中国数字医学,2021,16(10):
49-52.
[7] 占慧琛,阮文珍,施金萍.信息化智
能导检系统在体检中心的应用[J].
中国乡村医药,2021,28(11):68-69.
[8] 庄楚璇,邱淑妹,陈凤.智能导检系统
在体检中心的应用效果观察[J].中
国社区医师,2022,38(36):167-169.
[9] 黄辉,兰丽琴,江碧桃,等.高峰期体
检流程优化的效果评估[J].护理实
践与研究,2022,19(15):2354-2356.
[10] 谢 秋 霞 , 王 郑 芳 , 张 晗 , 等 . 全 智 能
导检系统在降低健康体检弃检
率中的应用 [J]. 中国现代医药杂
志,2023,25(2):95-97.
【收稿日期:2023-07-19】
【修回日期:2023-11-03】
(责任编辑:朱那新)
《中国数字医学》2024 第 19 卷 第 2 期
79
2. 智慧医院建设与实践
Construction and Practice of Smart Hospital
传统的软件开发方法是以数据 分为 4 层:接口层、应用层、领域
确定数据表结构,然后围绕数据库 接口层:包含前端界面和访问
库为中心进行建模,首先根据需求
层和基础设施层
[3-4]
,见图 1。
设计开发软件。使用这种方法设计 入口,负责接收用户请求、解释外
层次、代码混乱等问题,软件的可 用层服务进行处理。
的软件,容易出现抽象不足、缺乏
维护性、可扩展性存在严重瓶颈 。
[1]
部协议、转换数据格式,并调用应
用的能力支撑,如持久化、缓存、
日志等,并负责与第三方系统或遗
留系统进行通信。
2 系统设计与实现
领域驱动设计思想认为软件设
应用层:定义系统要完成的工 计应将关注点聚焦在构建领域模型
设施层服务实现应用功能。应用层 的复杂性,即领域复杂性,而非技
我院信息系统上线于 2004 年,业 作,负责协调、调度领域层和基础
开发维护困难,难以适应医院发展 不包含业务逻辑,不保存业务状态, 术复杂性。设计步骤可分为战略设
务逻辑中夹杂着大量 SQL 语句,
需 要。 为 主 动 适 应 形 势, 减 轻 运
维 压 力,2015 年, 我 院 尝 试 引 入
MVC 三层架构,使用面向对象方
负责实现应用本身的安全认证、事
务管理、消息通知等功能。
领域层:包含领域的模型和行
和实现领域逻辑上,关注业务本身
计和战术设计。
2.1 战略设计
战略设计主要从业务角度出
法对门诊挂号收费系统进行重构, 为,负责实现核心业务逻辑,是整 发,建立领域模型,封装领域能力,
从技术角度进行分层的方法逐渐暴 念,是面向业务的,包含一项业务 领域模型的建立可确定系统内部模
但随着业务需求的扩展,MVC 仅
露出 3 个问题:一是模型定义脱离
业务,实践中仍是围绕数据库进行
开 发; 二 是 数 据 行 为 天 然 分 离,
承载业务逻辑的服务层越来越臃
肿;三是边界划分模糊不清,服务
层事务与第三方系统耦合紧密,测
试 困 难。2020 年 开 始, 我 院 使 用
个系统的核心。领域是一个范围概
的所有概念、状态、流程和规则。
领域使用实体、值对象和领域服务
描述业务,使用聚合封装模型,使
用仓库保存状态,使用工厂创建复
杂聚合。
基础设施层:为其他层提供通
划分领域边界,提供领域服务 [5-6] 。
块的划分,而系统总体架构的选择
将决定领域如何对外提供服务。如
果选择单体架构,则领域以函数
形式提供服务;如果选择微服务
架构,则领域以 HTTP、RPC 等形
式提供服务。
领域驱动设计方法(domain-driven
design, DDD)再次进行系统重构,
充分发挥信息中心的跨专业优势,
注重领域模型定义和业务流程梳
理,坚持面向业务、深层理解、实
践检验、稳步推进的思路,取得了
良好效果。
1 领域驱动设计的基本概念
领域驱动设计是构建大型复杂
系统的领域建模与分析方法,于
2004 年 被 首 次 提 出 [2] 。 近 年 来,
随着微服务架构的广泛应用,领域
驱动设计受到越来越多的关注。领
域驱动设计常使用分层架构,一般
80
China Digital Medicine. 2024,Vol.19,No.2
图 1 领域驱动设计分层架构
3. 智慧医院建设与实践
Construction and Practice of Smart Hospital
微服务架构是当前主流的架构 腐层(anticorruption layer, ACL)设 统的实现和服务于应急场景的依赖
缩等机制提高系统可用性,但同时 层,称为防腐层。内部模块仅依赖 统有一个适配器,适配器包含配
风格,可以通过冗余部署、自动伸
会增加测试和运维的复杂性 。综
[7]
合考虑系统负载、变更频率、团队
人数以及发展阶段等因素,我院选
择了单体架构,将系统构建为模块
化单体程序。根据患者就诊流程、
发生时间以及服务部门的不同,可
将门诊业务划分为排班、挂号、诊
疗和发药 4 个领域。其中,挂号和
计,即在基础设施层增加一个子
自身定义的功能接口,由防腐层依
赖外部系统实现其接口。防腐层对
内负责提供稳定的功能支撑,对外
负责与依赖系统进行通信,按功能
一般可分为两类:仓库实现和适配
器。每个领域仓库有两个实现,即
服务于一般场景的依赖数据库系
本地文件系统的实现。每个外部系
置开关和缓存队列,负责处理外
部系统的连接断开、数据缓存和
失败重传。
2.2 战术设计
战术设计主要从技术角度出
发,对领域内的具体问题提出解
决 方 案。 使 用 实 体(entity)、 值
诊疗是核心业务,作为核心领域;
排班和发药是前两项的补充,作为
支撑领域。另外,患者、科室、医
生和项目等基础数据作为通用领
域,见图 2。
在领域划分的基础上,系统总
体按照先分层、后分包的原则进行
设计,见图 3。接口层、应用层按
应用功能划分,基础设施层按提供
能力划分。为消除对外部系统的直
接依赖,增强系统可用性,采用防
图 2 领域划分
图 3 以医保移动支付平台应用为例展示总体架构设计
《中国数字医学》2024 第 19 卷 第 2 期
81
4. 智慧医院建设与实践
Construction and Practice of Smart Hospital
对 象(value object)、 领 域 服 务
(service)、 聚 合(aggregate)、
理念。我们选用 Go 语言进行开发, 关注点分离原则落实到代码层面。
其接口、结构体等语法特性,支持
仓库(repository)和工厂(factory) 将设计模型直观映射为软件代码。
等基本元素将领域模型映射为代码
重构是在不改变系统外部行为
逻辑,完成软件落地。以挂号领域 的前提下,对内部结构进行调整的
的一次就诊记录,始于线上预约或 旧系统数据兼容,我院统筹领域实
为例,业务上使用挂号来描述患者
窗口登记,止于成功取药或完成医
技报告。“挂号”使用唯一业务流
水号进行标识,需要多次保存和加
载,定义为实体。挂号实体包含的
“就诊状态”,没有唯一标识,业
务仅关心其反映的内容,可在内存
中临时构建,定义为值对象。挂号
实体的患者、科室、医生、项目等
属性是对通用领域的引用。实体和
值对象采用充血模型实现,使用对
象方法实现业务行为。对象方法不
方便实现的,通过领域服务实现,
如获取挂号记录。领域将实体和值
过程 [9] 。为保证门诊业务稳定和新
证了聚合内部的一致性。领域通过
重构后的门诊挂号收费系统,
步,从静态、动态两方面入手梳理 防腐层设计,外部依赖得到有效管
进行。开发过程大体分 3 步:第一
系统原有功能。静态方面,进行代
码分析,形成数据流程图;动态方
提升:一是系统可用性增强。采用
理。增加日志监控,遇有故障时能
够及时告警。二是系统可维护性增
面,跟踪日志数据,修正分析结果。 强。领域层完整封装核心业务逻辑,
第二步,还原业务视角下的高层视 体现了单一职责原则,消除了数据
入理解业务规则。第三步,运用领 等问题。三是系统可扩展性增强。
图,咨询领域专家和业务部门,深
域驱动设计方法进行重新设计,完
成新系统替代功能上线。
开发过程中,充分利用编程语
函数,集中进行领域仓库初始化。
作为一个整体进行加载和保存,保
3 结果
耗。系统的主要质量指标得到明显
态”“支付状态”等值对象,为挂
久化接口,称为仓库。仓库把聚合
何更新。
按照开发、验证、替代的步骤迭代 言特性,注意业务逻辑与技术细节
号领域的聚合。领域定义聚合的持
更新内容,由基础设施层决定如
现和应用扩展,坚持“小步前进”, 提高了系统性能,降低了资源消
对象封装在一起,称为聚合。挂号
实体封装了“挂号来源”“就诊状
以聚合更新为例,由领域层决定
的局部化集中处理。一是利用 init
二是利用 defer 关键字,集中进行
日志和错误处理。三是使用函数选
项(functional options) 模 式, 将
不一致、故障难定位、需求难变更
领域逻辑与应用逻辑分层,上层应
用系统实现解耦,新增应用变得简
单、高效、可控。四是系统可测试
性改善。功能代码与测试代码同步
开发,逐层实现、逐层测试,自下
而上积累了一整套测试用例。测试
用例能独立于用户界面自动化运
行,有效支撑下一步重构。系统质
量指标在重构前后的对比见表 1。
公开的方法和函数对外提供服务,
保证了领域的完整性,降低了领域
交互的复杂性。挂号领域的具体设
计见图 4。
2.3 系统实现
领域驱动设计思想认为应该通
过持续重构去“提炼”模型而非“预
见”模型,应该绑定设计与开发,
使设计理念在开发过程中得以成功
实现 [8] 。因此,设计应具有“柔性”,
便于修改,开发则应忠实体现设计
82
China Digital Medicine. 2024,Vol.19,No.2
图 4 以挂号领域为例展示领域层模块战术设计
5. 智慧医院建设与实践
Construction and Practice of Smart Hospital
表 1 重构前后系统质量指标对比
质量指标
重构前
重构后
[2] EVANS E.Domain-driven design:
重构带来的收益 tackling complexity in the heart
of software[M].Florida:Pearson
系统性能 直连数据库。系
统性能差,数
据库负载重 使用缓存。系统性能
好,数据库负载轻 数据库查询操作减少 95%
以上,连接数减少 90%
以上
资源消耗 扩展功能需要新
建服务,新增
服务器 同一个服务,扩展功
能仅需新增模块 扭转了服务器数量随需求
线性增长的趋势
可用性
内部逻辑与外部系 统一管理外部依赖,
统紧密耦合,没
实时监控系统日志
有日志
可维护性 不易维护。业务
变更需多处修
改,易引发不
一致问题 易于维护。业务逻辑
与应用逻辑分层,
业务变更一处修改
全部生效 可维护性大大提高,运维
时间减少 80% 左右
系统的一个组成部分。领域驱动设
重构的实践案例,通过战略设计、 实践,为医院信息系统的整体重构
统的原有问题得以解决,多项质量
计思想在门诊挂号收费系统的成功
积累了有益经验。我们将在保证系
代系统功能,实现了遗留系统瘦
身,减轻了运维压力;另一方面,
不断接入新的应用,先后接入了互
联网医院、门诊自助机、医保移动
支付平台、预约挂号统一平台等,
适应了医院发展需要。
门诊挂号收费系统是医院信息
管理系统的应用研究[J].中国新通
信,2021,23(16):94-95.
技大学学报,2019,34(1):80-85.
[6] 陈茹.遗留系统重构过程中微服务
提取研究[D].呼和浩特:内蒙古大
学,2021.
[7] 刘阳,文霞,林加论.基于微服务架
构的医疗服务外联平台设计与思
考[J].中国数字医学,2023,18(2):
107-111.
统稳定性和业务连续性的前提下, [8] 贾子甲,钟陈星,周世旗,等.领域驱
运用命令查询责任分离(command 述[J].软件学报,2021,32(9):2642-2664.
继续稳步推进重构工作,并探索
指标获得提升。重构是一个渐进的、 query responsibility segregation,
持续迭代的过程。一方面,平稳替
72-75,101.
设计划分微服务的方法[J].西南科
4 总结与讨论
留系统重构的过程。通过重构,系
实验室研究与探索 ,2013,32(8):
[5] 宁小庚,黄晓芳.一种基于领域驱动
新增应用简单、高效、可控
示了运用领域驱动设计思想进行遗
计构建企业级Web平台的应用[J].
[4] 时梨.基于领域驱动设计在构建IT
易于扩展。业务逻辑
与应用逻辑分层,
扩展功能仅需新增
应用模块
战术设计和系统实现 3 个方面,展
[3] 黄 光 芳 ,金 义 富 .基 于 领 域驱 动 设
故障定位时间缩短 95%
以上,与外部系统解耦,
最大限度保证内部系统
可用 可扩展性 不易扩展。扩展
功能需要新建
服务,各服务
完全独立
本研究结合门诊挂号收费系统
Education Inc,2004.
CQRS)模式 [10] 剥离遗留系统中的
统计功能,最终完成医院信息系统
的更新迭代。
动设计模式的收益与挑战:系统综
[9] 王莉,吕世炅,梁冰,等.领域驱动的
数字图书馆系统重构研究[J].数字
图书馆论坛,2015(5):34-41.
[10] 王薇,许军,张春丽,等.一个领域消
息驱动的Takia CQRS模型设计[J].
参考文献
[1] 王鹏,刘渊,冷文浩. 领域驱动设计
在SPP系统中的应用[J].计算机工
程与设计,2008,29(13):3362-3364.
计算机应用与软件,2014(9):94-97.
【收稿日期:2023-10-10】
【修回日期:2023-11-05】
(责任编辑:朱那新)
《中国数字医学》2024 第 19 卷 第 2 期
83