- 项目在线演示网址:
- 1、项目开发
- 2、需求分析
- 3、系统设计
- 3.1 原型设计:主线流程
- 3.2 原型设计:其他功能:
- 3.3 表设计
- 3.3.1 实体设计:ER图
- 3.3.2 表设计
- 3.3.3 表设计文档
- 数据表整体设计
- 1、医院员工表:employee
- 2、科室表:department
- 3、挂号级别表:regist_level
- 4、结算类别表:settle_category
- 5、排班表: scheduling
- 6、患者历次挂号信息表:register
- 7、检查申请表:check_request
- 8、检验申请表:inspection_request
- 9、处置申请表:disposal_request
- 10、医技项目表:medical_technology
- 11、患者病历表:medical_record
- 12、病历首页疾病关联表:medical_record_disease
- 13、疾病表:disease
- 14、处方表:prescription
- 15、药品信息表:drug_info
- 3.4 项目关键状态图
- 3.5 模块设计
- 4、系统实现
- 数据库连接配置
- MyBatis配置
- 设置端口号
- 4.2.前端项目
项目在线演示网址:
http://39.105.101.77:8080/index.html#/
1、项目开发
1.1 项目开发流程整体说明:
- 可行性研究
- 工作负荷:列出现有系统所承担的工作及工作量
- 费用开支:列出由于运行现有系统所引起的费用开支
- 技术条件方面的可能性
- 可选择的其他系统方案
- 投资及效益分析
- 法律方面的可行性
- 。。。
- 需求分析:
- 项目功能,项目模块
- 对性能的规定
- 数据管理能力要求
- 系统设计:指导开发代码的具体做法,对团队合作、代码测试、后期维护有非常重要的作用。
- 系统实现:编码实现项目功能
- 系统测试:决定项目的健壮性,功能的完善程度
- 系统维护:项目后期完善,二次开发
- 迭代开发
- 根据业务复杂度,项目可以进行多次迭代开发
- 先启迭代
- 重点确认需求部分
- 少量代码,以项目框架搭建为主
- 精化迭代
- 重点是分析与设计部分,修改优化和完善需求部分
- 进入代码阶段
- 少量测试
- 构造迭代
- 重点是编码部分,修改优化和完善需求、设计部分
- 测试部分也是重点
- 进入部署阶段,本次迭代后期,部署也是重点部分
- 根据业务规模和实际情况,可能会进行多次构造迭代
- 移交迭代
- 重点是部署部分,少量测试和代码优化
1.2 项目背景
在医院的管理方面,计算机技术发挥了重要的作用。为了方便医院管理,简化流程,医院管理系统已经在各大医院中得到应用。而**HIS(门诊管理)系统作为医院管理系统的一个子系统**,其重要程度远远胜过医院管理系统中的一些其他子系统。<br /> 通常,医院门诊流量大,手续较繁锁。在传统的手工方式下,医护人员要做大量的重复工作,而这些工作往往是一些必要的信息记录工作。在传统方式下,这些工作的进行不仅效率非常低,而且经常出现差错。记录信息的纸质文件不仅不方便管理,影响工作效率,还造成了很多就诊病人得不到合理有效的就诊服务,甚至影响医疗质量。<br /> 正是因为这样,门诊管理系统的优势得以显现。门诊管理系统不仅可以使门诊的各个部门高度紧密的协作,而且简化了门诊就医的流程。它将原本的纸质病历变成电子病历,很多操作都是通过系统自动完成,比如病历中患者基本信息的填写。这使得患者就医的时间得到压缩,医生需要做的工作得到减少。而且电子病历更易存取,方便管理,更加安全。<br /> 门诊管理系统不仅可以提搞服务效率和质量,使病人和医生情绪能够得以放松,还使得门诊工作可以高效有序的运转。
1.3 开发目标
项目的总体目标是为医院的门诊开发一套信息化门诊系统,能满足医院从病人挂号到诊断到缴费的一整套流程的业务需要,为门诊医生和门诊相关的医院工作人员提供便利,**实现挂号、看病与缴费的系统化流程。**
1.4 需求调研
对业务相关人进行调研,确定工作流程。本部分的语言更偏重业务描述。
调研目的 | 业务功能 | 调研人 | XXX、XX |
---|---|---|---|
调研时间 (日期、起止时间) |
202X-3-20 至202X-3-28 | 调研地点 | XXX医院 |
调研对象 | 业务人员 | 调研部门 | 门诊 |
调研问题 | 回答问题 | 备注 | |
挂号窗口的功能 | 对到医院的患者,进行现场挂号、退号、收费(包括各种药品、检查、检验等收费)、退费,以及患者费用的查询。 | 窗口挂号人员 | |
医生坐诊工作管理 | 医生填写患者病历,根据问诊情况初步判断患者病情,根据初步判断开设检查和检验项目; 根据患者的检查和检验结果,完成病情确诊; 根据患者确诊病情,进行开药或者开立处置(例如:洗胃等),进行治疗 |
门诊医生 | |
药房管理 | 药品的入库、信息维护等工作; 根据患者缴费情况,发药,并录入系统; 如果患者退药,将退回的药品入库; 查看药品的交易记录 |
药局管理人员 | |
检查科室工作管理 | 根据系统中,医生开出的检查申请,对患者进行检查操作; 患者信息录入系统; 将完成的检查结果,录入到系统中对应患者名下,提供给医生进行诊断参考; 对历史检查结果进行管理; |
检查科医生 | |
检验科室工作管理 | 根据系统中,医生开出的检验申请,对患者进行检验操作; 患者信息录入系统; 将完成的检验结果,录入到系统中对应患者名下,提供给医生进行诊断参考; 对历史检验结果进行管理; |
检验科医生 | |
处置科室工作管理 | 根据系统中,医生开出的处置申请,对患者进行处置操作; 患者信息录入系统; 将完成的处置结果,录入到系统中对应患者名下,提供给医生进行诊断参考; 对历史处置结果进行管理; |
处置科医生 |
1.5 项目技术
前端
- Vue开发前端开发框架
优势:
- 数据绑定:vue会根据对应的元素进行数据的实时绑定,进行网页及应用的数据渲染 。
- 组件式开发:通过vue的模块封装,它可以将一个web开发中设计的各种模块进行拆分,变成单独的组件,然后通过数据绑定,调用对应模版组件,同时传入参数。
Element UI
ElementUI是一款功能强大的组件工具,体现出非常强大的一致性,在使用过程中有清晰的反馈,而且效率高,可控性强。在本次项目中,大部分组件都是由ElementUI实现的
优势:
- 样式多样,能够轻松的使页面更加美观。
- 文档清晰,使用方便。
后端
Springboot+SpringMVC+Spring综合使用
SpringBoot用来简化Spring应用的初始搭建以及开发过程,可以使开发人员不再需要定义样板化的配置,它默认配置了很多框架的使用方式,使Spring的应用更加简便。
Spring MVC是一种基于java的框架,实现了Web MVC设计模式的请求驱动类型的轻量框架,能够使编写出更干净、更可管理、并且更易于测试的代码
Spring框架是一个开放源代码的JavaEE应用程序框架,它在大小与开销方面都是轻量的,可以通过一种称作控制反转的技术促进低耦合,并且提供了面向切面变成的支持,包含并管理了应用对象的配置和生命周期,可以将简单的组件配置组合成复杂的应用
优势:
- 搭建项目快,几秒钟就可以搭建完成;支持声明式事务处理
- 让测试变的简单
- 让配置变的简单
- 内嵌容器
- 方便监控
- MyBatis
使用XML描述或注释对象与存储过程或SQL语句耦合,使关系数据库与面向对象应用结合起来更加容易
优势:
- 简单易学
- 灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。
- 解除sql与程序代码的耦合
- maven
通过使用maven快速且高频地自动构建项目的所有源码,和实现项目版本依赖。
数据库
- MySQL
优势:
- Mysql性能卓越,服务稳定,很少出现宕机。
- 开放源代码,自主性,使用成本低
- 历史悠久,社区用户非常活跃,遇到问题可以寻求帮助。
- 软件体积小,安装使用简单,并且易于维护
版本控制
- Git
一个团队或一个项目组可以在上面建立一个库,通过密匙加入其访问和修改,可以将项目上传在库中,供可查看的人查看,大大减少团队合作一个项目的复杂度
优势:
- 离线工作。
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
-
2、需求分析
一般性需求
完整正确的门诊流程,为用户提供良好的使用体验
- 完全基于浏览器的操作模式,安装简单、操作方便,具有良好的系统扩充能力。
- 灵活的模块需求设计,可根据实训项目周期灵活裁剪。
功能性需求
(1)挂号管理:主要用户是窗口挂号人员,主要包含的功能有现场挂号与退号、收费与退费、患者收费信息的查询与管理、发票信息的查看与重打补打、门诊收费的日结记录与日结查询。
(2)坐诊管理:主要用户为坐诊医生,涉及病案管理、处方药模板管理、处置管理等
(3)检查/检验管理:主要用户为检验科医师,涉及检验/检查申请记录查看、检验详情查看、检查结果录入等。
(4)患者药物信息管理:主要用户为药师,涉及药库信息管理、发药管理、退药管理、发退药信息查看。
2.1 功能分解
根据需求调研,分解业务功能如下
角色 | 备注 |
---|---|
挂号窗口 | 使用者是窗口挂号人员,主要包含的功能有现场挂号与退号、收费与退费、患者收费信息的查询与管理。 |
门诊医生 | 使用者为门诊医生,涉及患者诊疗、开立检查检验项目,开立处方药治疗、开立处置治疗等 |
检查医生 | 使用者为检查科医师,涉及检查申请记录查看、检查详情查看、检查结果录入等(医生给患者根据病历要求患者进行的检查项:一般无比对标准,如B超)。 |
检验医生 | 使用者为检验科医师,涉及检验申请记录查看、检验详情查看、检验结果录入等。(医生给患者根据病历要求患者进行的检验项:一般有比对标准,如血常规) |
处置医生 | 使用者为处置科室医师,涉及处置申请记录查看、处置详情查看、处置结果录入等。(医生给患者根据病历要求患者进行的处置项:一般有治疗作用,如洗胃) |
药房管理 | 使用者为药师,涉及药库信息管理、发药管理、退药管理、发退药信息查看。 |
2.2 用例图
2.3 流程图
2.4 原型设计:用户角色和菜单
2.4.1 整体菜单
root权限:可以查看所有功能,但是不要进行业务操作,本权限不是业务角色
2.4.2 详细菜单
根据权限,有6个不同的角色,32个业务功能,不同角色对应不同的业务功能菜单如下:
角色名称 | 功能菜单 |
---|---|
- 挂号收费员 |
![]() |
- 门诊医生 |
![]() |
- 检查医生 |
![]() |
- 检验医生 |
![]() |
- 药房管理员 |
![]() |
- 处置医生 |
![]() |
3、系统设计
3.1 原型设计:主线流程
本部分使用原型工具Axure RP进行页面绘制,配合文档说明,确认每个界面功能。
3.1.1 挂号收费:窗口挂号
1. 挂号收费员点击“窗口挂号”菜单;
2.. 系统进入现场挂号页面,自动生成“病历号”;
3. 系统默认显示“看诊日期”为当前日期,午别为当前午别,该信息不可修改;
4. 挂号收费员询问患者挂号级别、挂号科室;
5. 挂号收费员根据患者要求,选择对应的“挂号级别”、“挂号科室”;
6. 系统根据挂号级别显示挂号费;
7. 系统根据挂号级别、挂号科室,读取相应科室、相应挂号级别、当前日期、当前午别的出诊医生;
8. 挂号收费员询问患者是否选择挂号医生;
9. 挂号收费员根据患者要求,选择对应的“医生”;
10. 挂号收费员录入患者基本信息,包括:患者姓名、性别、出生日期、年龄、结算类别、身份证号、家庭住址、是否要病历本;
11. 挂号收费员在录入信息完毕后,单击“挂号”按钮,完成患者挂号;
3.1.2 门诊医生:患者查看
1. 门诊医生登录后,点击导航栏的“患者查看”;
2. 系统进入患者查看页面,顶部显示已经看诊人数和排队人数;
3.显示登录医生对应挂号的患者列表,根据挂号时间排序分页显示;
3. 门诊医生可以输入患者的病历号或姓名,进行“查询”;
4. 系统显示符合条件的患者列表;
5. 门诊医生点击患者姓名后面的“创建病例“,开始看诊;
3.1.3 门诊医生:病历首页
1. 门诊医生点击导航栏的“病历首页”,对”患者查看“页面选择的患者病例进行填写。页面顶部会显示医生选择的患者基本信息。
2.门诊医生根据询问患者,在病历首页中填写:主诉、现病史、现病治疗情况、既往史、过敏史、体格检查;
3. 门诊医生进行初步诊断,选择患者疾病;
4.门诊医生填写检查\检验建议;
5.门诊医生填写完成后,点击保存完成患者病例首页的填写;
3.1.4 门诊医生:检查申请
1. 门诊医生点击“检查申请”
2. 系统进入检查申请页面,在病历首页页面部分,显示该患者基本信息;
3. 门诊医生点击新增项目;
4. 系统弹出新增检查项目页面列表,页面包括检查编码、检查名称、检查规格、单价,门诊医生可以按检查编码和检查名称执行查询;
5. 门诊医生在查询结果中,选中要新增的检查项目前面的复选框,所有项目选中之后,点击“添加”按钮;
6. 系统在检查申请页面,填入医生已经选择的项目;
7. 门诊医生输入检查目的要求、检查部位、备注等;
8. 门诊医生点击“申请提交”;
3.1.5 挂号收费:收费
1. 挂号收费员点击“收费”;
2. 系统进入患者收费页面;
3. 挂号收费员输入患者的“病历号”后点击”搜索“按钮;
4. 系统查询出该患者的基本信息;
5. 挂号收费员确认患者姓名是否正确;
6. 系统查询出该患者本次看诊的待缴费项目,并按项目开立时间时间降序排序;
7. 挂号收费员确认患者本次缴纳哪些项目,选中相应项目前面的复选框;
8. 系统自动计算出本次的缴费金额;
9. 挂号收费员点击“收费结算”按钮,完成收费;
3.1.6 检查管理:检查申请
1. 检查医生登录后,点击导航栏的“检查申请”;
2. 系统进入检查申请查看页面,顶部显示已经检查人数和排队人数;
3.显示等待检查的患者列表;
3. 门诊医生可以输入患者的病历号或姓名,进行“查询”;
4. 系统显示符合条件的患者列表;
5. 门诊医生点击患者姓名后面的“进行检查“,检查登记完成;
3.1.7 检查管理:患者录入
1. 检查医生点击导航栏的“患者录入”,对”检查申请“页面选择的患者的检查项目进行科室和医生的分配。页面顶部会显示医生选择的患者基本信息。
2.系统会显示选择的患者所有等待检查的项目;
3. 检查医生点击对应项目后,表格下方会显示 已选择的检查项目名称;
4.检查医生选择录入自己的科室和姓名,确认检查医生信息;
5.检查医生点击“开始检查”,患者检查录入完成;
3.1.8 检查管理:检查结果录入
1. 检查医生点击导航栏的“检查结果录入”。页面显示患者信息;检查医生可以根据患者病历号和患者姓名,进行搜索患者。
2.检查医生点击患者信息后端的“已完成检查”按钮,会显示该患者所有已经完成的检查项目;
3. 检查医生点击对应项目后,表格下方会显示 已选择的检查项目名称;
4.检查医生选择录入自己的科室和姓名,确认结果录入医生信息;
5.检查医生录入检查结果;
6.检查医生点击“结果提交”完成检查结果录入
3.1.9 门诊医生:看诊记录
1. 门诊医生点击导航栏的“看诊记录”;
2. 系统进入患者继续看诊选择页面;
3.显示登录医生对应已经看诊的患者列表;
3. 门诊医生可以输入患者的病历号或姓名,进行“查询”;
4. 系统显示符合条件的患者列表;
5. 门诊医生点击患者姓名后面的“更新病例“,开始对已出检查结果的患者继续看诊;
3.1.10 门诊医生:查看检查结果
- 门诊医生点击导航栏的“检查结果”,对”看诊记录“页面选择的患者的检查结果进行查看。页面顶部会显示医生选择的患者基本信息。
2.系统会显示选择的患者的已经出结果的检查项目;
3. 门诊医生选择检查项目,会看到检查的结果;3.1.11 门诊医生:门诊确诊
1. 门诊医生点击导航栏的“门诊确诊”,对”看诊记录“页面选择的患者录入诊断结果和处理意见。
2. 门诊医生选择“确诊提交”,完成患者的病历确诊部分内容填写;3.1.12 门诊医生:开设处方
1、 门诊医生点击导航栏的“开设处方”,进入处方界面,点击“增加”。
2、 系统弹出“搜索药品界面”
3、 门诊医生输入药品信息(药品编码、药品名称等)后,点击“查询”按钮,查询药品信息
4、 系统显示符合条件的药品列表
5、 门诊医生选择所需药品,点击确定,添加药品到处方中
6、 关闭药品选择对话框,界面显示医生已经选择的药品内容。
7、 门诊医生对药品输入:用法、用量、频次、使用天数、用药嘱托等医嘱信息;输入药品数量
8、 门诊医生可以多次添加药品或删除药品;添加完药品后,门诊医生点击开立处方,完成处方开立。
9、 在主界面中,会有处方金额合计,根据数量改变会自动改变
10、点击每个药品,下拉列表显示药品的详细信息(药品编码、包装单位、生产厂家、药剂类型等)3.1.13 药房管理:药房发药
1、 发药员点击导航栏的“药房发药”链接。
2、 系统查询并在左侧显示待发药患者列表界面,查询条件包括:病历号、患者姓名;默认状态为“未发”(其他状态:已发、已退、全部)
3、 发药员输入查询信息,点击“查询”
4、 系统显示符合条件的患者列表
5、 发药员选择对应患者
6、 系统显示出该患者的待发药品信息,显示在界面上
7、 发药员点击“发药”按钮。
8、 完毕后会提示发药成功的信息。
9、 发药员给患者药品
3.2 原型设计:其他功能:
3.2.1、门诊挂号:退费
3.2.2、门诊挂号:退号
3.2.3、门诊挂号:费用记录查询
3.2.4、门诊医生:开立检验
3.2.5、门诊医生:开立处置
3.2.6、检查医生:检查管理
3.2.7、检验医生:患者叫号
3.2.8、检验医生:执行检验
3.2.9、检验医生:录入检验结果
3.2.10、检验医生:检验管理
3.2.11、药库管理:退药
3.2.12、药库管理:药品管理
3.2.13、药库管理:交易记录
3.2.14、处置医生:患者叫号
3.2.15、处置医生:执行处置
3.2.16、处置医生:录入处置结果
3.2.17、处置医生:处置管理
3.3 表设计
3.3.1 实体设计:ER图
3.3.2 表设计
根据ER图和界面原型,确认表字段和关联情况
3.3.3 表设计文档
数据表整体设计
序号 | 表中文名 | 表英文名 | 表功能说明 |
---|---|---|---|
1 | 医院员工表 | employee | 保存医院的员工信息(主要是医生) |
2 | 科室表 | department | 医生所在的科室,如:骨外科 |
3 | 挂号级别表 | regist_level | 保存医生挂号等级(例如:专家号、普通号、主任医生号) |
4 | 结算类别表 | settle_category | 存放患者的结算类别信息,如:自费、医保、新农合等 |
5 | 排班表 | scheduling | 医生是否出诊(按照星期进行排班,如:周三下午、周五上午出诊) |
6 | 患者历次挂号信息表 | register | 存储患者历次挂号信息 |
7 | 检查申请表 | check_request | 检查申请 |
8 | 检验申请表 | inspection_request | 检验申请 |
9 | 处置申请表 | disposal_request | 处置申请 |
10 | 医技项目表 | medical_technology | 医疗技术项目,包括检查、检验、处置等项目 |
11 | 患者病历表 | medical_record | 医生对患者填写的病例 |
12 | 病历首页疾病关联表 | medical_record_disease | 病例和疾病关联表 |
13 | 疾病表 | disease | 保存疾病信息 |
14 | 处方表 | prescription | 医生开立处方信息 |
15 | 药品信息表 | drug_info | 保存药品信息 |
1、医院员工表:employee
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
所在科室id | deptment_id | INT(9) | 外键 | 指向department(_id)_ | |
挂号级别id | regist_level_id | INT(9) | 外键 | 指向regist_level (ID) | |
排班id | scheduling_id | INT(9) | 外键 | ||
真实姓名 | realname | VARCHAR(64) | |||
密码 | password | VARCHAR(64) | |||
生效标记 | delmark | INT(1) | 1 | 1-生效 0-已删除 |
2、科室表:department
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
科室编码 | dept_code | VARCHAR(64) | 如:SJNK | ||
科室名称 | dept_name | VARCHAR(64) | 如:神经内科 | ||
科室类型 | dept_type | VARCHAR(64) | |||
生效标记 | delmark | INT(1) | 1 | 1-正常 0-已删除 |
3、挂号级别表:regist_level
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
号别编码 | regist_code | VARCHAR(64) | |||
号别名称 | regist_name | VARCHAR(64) | |||
挂号费 | regist_fee | DECIMAL(8,2) | |||
挂号限额 | regist_quota | INT(5) | |||
显示顺序号 | sequence_no | INT(3) | |||
生效标记 | delmark | INT(1) | 1 | 1-正常 0-已删除 |
4、结算类别表:settle_category
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
类别编码 | settle_code | VARCHAR(64) | |||
类别名称 | settle_name | VARCHAR(64) | |||
显示顺序号 | sequence_no | INT(3) | |||
生效标记 | delmark | INT(1) | 1 | 1-正常 0-已删除 |
5、排班表: scheduling
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
排班规则名称 | rule_name | VARCHAR(64) | |||
星期规则 | week_rule | VARCHAR(14) | |||
生效标记 | delmark | INT(1) | 1 | 1-正常 0-已删除 |
6、患者历次挂号信息表:register
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
病历号 | case_number | VARCHAR(64) | |||
姓名 | real_name | VARCHAR(64) | |||
性别 | gender | VARCHAR(6) | 男/女 | ||
身份证号 | card_number | VARCHAR(18) | |||
出生日期 | birthdate | DATE | |||
年龄 | age | INT(3) | |||
年龄类型 | age_type | VARCHAR(6) | 年/天 | ||
家庭住址 | home_address | VARCHAR(64) | |||
本次看诊日期 | visit_date | DATETIME | |||
午别 | noon | VARCHAR(6) | 上午/下午 | ||
本次挂号科室ID | deptment_id | INT(9) | 外键 | 指向department(_ID)_ | |
本次挂号医生ID | employee_id | INT(9) | 外键 | 指向employee(ID) | |
本次挂号级别ID | regist_level_id | INT(9) | 外键 | 指向regist_Level (ID) | |
结算类别ID | settle_category_id | INT(9) | 外键 | 指向settle_category(ID) | |
病历本要否 | is_book | CHAR(2) | 是/否 | ||
收费方式 | regist_method | VARCHAR(10) | 现金、银行卡、医保卡、微信、支付宝 | ||
挂号金额 | regist_money | DECIMAL(8,2) | |||
本次看诊状态 | visit_state | INT(1) | 1-已挂号 2-医生接诊 3-看诊结束 4-已退号 |
7、检查申请表:check_request
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
挂号id | register_id | INT(9) | 外键 | ||
医技项目id | medical_technology_id | INT(9) | 外键 | ||
目的要求 | check_info | VARCHAR(512) | |||
检查部位 | check_position | VARCHAR(255) | |||
开立时间 | creation_time | datetime | |||
检查人员id | check_employee_id | INT(9) | 外键 | ||
结果录入人员id | inputcheck_employee_id | INT(9) | 外键 | ||
检查时间 | check_time | datetime | |||
检查结果 | check_result | VARCHAR(512) | |||
状态 | check_state | VARCHAR(64) | |||
备注 | check_remark | VARCHAR(512) |
8、检验申请表:inspection_request
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
挂号id | register_id | INT(9) | 外键 | ||
医技项目id | medical_technology_id | INT(9) | 外键 | ||
目的要求 | inspection_info | VARCHAR(512) | |||
检验部位 | inspection_position | VARCHAR(255) | |||
开立时间 | creation_time | datetime | |||
检验人员id | inspection_employee_id | INT(9) | 外键 | ||
结果录入人员id | inputinspection_employee_id | INT(9) | 外键 | ||
检验时间 | inspection_time | datetime | |||
检验结果 | inspection_result | VARCHAR(512) | |||
状态 | inspection_state | VARCHAR(64) | |||
备注 | inspection_remark | VARCHAR(512) |
9、处置申请表:disposal_request
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
挂号id | register_id | INT(9) | 外键 | ||
医技项目id | medical_technology_id | INT(9) | 外键 | ||
目的要求 | disposal_info | VARCHAR(512) | |||
处置部位 | disposal_position | VARCHAR(255) | |||
开立时间 | creation_time | datetime | |||
处置人员id | disposal_employee_id | INT(9) | 外键 | ||
结果录入人员id | inputdisposal_employee_id | INT(9) | 外键 | ||
处置时间 | disposal_time | datetime | |||
处置结果 | disposal_result | VARCHAR(512) | |||
状态 | disposal_state | VARCHAR(64) | |||
备注 | disposal_remark | VARCHAR(512) |
10、医技项目表:medical_technology
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
项目编码 | tech_code | VARCHAR(64) | |||
项目名称 | tech_name | VARCHAR(64) | |||
规格 | tech_format | VARCHAR(64) | |||
单价 | tech_price | DECIMAL(8,2) | |||
类型 | tech_type | VARCHAR(64) | |||
费用分类 | price_type | VARCHAR(64) | |||
执行科室 | deptment_id | INT(9) | 外键 |
11、患者病历表:medical_record
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
挂号ID | register_id | INT(9) | 外键 | ||
主诉 | readme | VARCHAR(512) | |||
现病史 | present | VARCHAR(512) | |||
现病治疗情况 | present_treat | VARCHAR(512) | |||
既往史 | history | VARCHAR(512) | |||
过敏史 | allergy | VARCHAR(512) | |||
体格检查 | physique | VARCHAR(512) | |||
检查/检验建议 | proposal | VARCHAR(512) | |||
注意事项 | careful | VARCHAR(512) | |||
诊断结果 | diagnosis | VARCHAR(512) | |||
处理意见 | cure | VARCHAR(512) |
12、病历首页疾病关联表:medical_record_disease
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
病历id | medical_record_id | INT(9) | 外键 | ||
疾病id | disease_id | INT(9) | 外键 |
13、疾病表:disease
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
疾病助记编码 | disease_code | VARCHAR(64) | |||
疾病名称 | disease_name | VARCHAR(255) | |||
国际ICD编码 | diseaseICD | VARCHAR(64) | |||
疾病所属分类 | disease_category | VARCHAR(64) |
14、处方表:prescription
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
病历id | register_id | INT(9) | 外键 | ||
药品id | drug_id | INT(9) | 外键 | ||
用法用量频次 | drug_usage | VARCHAR(255) | |||
数量 | drug_number | VARCHAR(255) | |||
开立时间 | creation_time | DATETIME | |||
状态 | drug_state | VARCHAR(64) |
15、药品信息表:drug_info
字段名 | 字段编码 | 数据类型 | 键值 | 默认值 | 注释 |
---|---|---|---|---|---|
ID | id | INT(9) | 主键 | 自增长类型 | |
药品编码 | drug_code | VARCHAR(255) | |||
药品名称 | drug_name | VARCHAR(255) | |||
药品规格 | drug_format | VARCHAR(255) | |||
包装单位 | drug_unit | VARCHAR(16) | |||
生产厂家 | manufacturer | VARCHAR(255) | |||
药剂类型 | drug_dosage | VARCHAR(64) | |||
药品类型 | drug_type | VARCHAR(64) | |||
药品单价 | drug_price | DECIMAL(8,2) | |||
拼音助记码 | mnemonic_code | VARCHAR(255) | |||
创建时间 | creation_date | DATE |
3.4 项目关键状态图
3.4.1 挂号患者状态图
3.4.2 医生开立检查状态图
3.4.1 医生开立检验状态图
3.4.1 医生开立处方状态图
3.4.1 医生开立处置状态图
3.5 模块设计
3.5.1 前端模块及页面
- 挂号收费模块:registration
- onsite_registratiion 窗口挂号
- registration_record 窗口退号
- expense_charge 收费
- expense_refund 退费
- expense_manage 费用记录查看
- 门诊医生模块:physician
- physician_patient 患者查看
- 医生诊疗
- home_medical_record 病历首页
- check_request 检查申请
- inspection_request 检验申请
- physician-history 看诊记录
- check_results 检查结果查看
- inspection_results 检验结果查看
- outpatient_diagnosis 门诊确诊
- write_prescription 开立处方
- disposal_request 处置申请
- expense_query 费用查询
- 检查医生模块:check
- check_apply 检查申请
- check-patient 患者录入
- check_input 结果录入
- check-manage 检查管理
- 检验医生模块:inspection
- inspection_apply 检验申请
- inspection_patient 患者录入
- inspection_input 检验录入
- inspection_manage 检验管理
- 药库管理模块:drugstore
- give_medicine 药房发药
- drug_medicine 药房退药
- drug_storage 药库管理
- tran_history 交易记录
- 处置医生模块:disposal
4、系统实现
项目在线演示网址:http://39.105.101.77:8080/index.html#/
4.1 服务器端项目
4.1.1.服务器端项目搭建
4.1.1.1.开发工具检查
创建maven工程
创建maven模块
- pom.xml文件
hismodules/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.neuedu</groupId>
<artifactId>hismodules</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>his-common</module>
<module>his-drugstore</module>
<module>his-outpatient</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot 核心 :Web容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot 测试 : JUnit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- Spring Boot 数据库使用 : MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Spring Boot 数据库使用 : MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
his-outpatient/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 门诊模块:挂号管理(挂号、退号、收费、退费),医生看诊,对患者进行检查,对患者检验,对患者处置 -->
<parent>
<groupId>com.neuedu</groupId>
<artifactId>hismodules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>his-outpatient</artifactId>
<dependencies>
<!-- 自定义的通用模块:common -->
<dependency>
<groupId>com.neuedu</groupId>
<artifactId>his-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
his-drugstore/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 药库管理模块:药品管理(增加药品、修改药品、删除药品、查找药品)、给患者发药、给患者退药 -->
<parent>
<groupId>com.neuedu</groupId>
<artifactId>hismodules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>his-drugstore</artifactId>
<dependencies>
<!-- 自定义的通用模块:common -->
<dependency>
<groupId>com.neuedu</groupId>
<artifactId>his-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
his-common/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 通用模块:给业务模块进行支撑 -->
<parent>
<groupId>com.neuedu</groupId>
<artifactId>hismodules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!-- 设置jar包 -->
<packaging>jar</packaging>
<artifactId>his-common</artifactId>
<name>his-common</name>
</project>
- 工程目录结构
- SpringBoot入口文件
- application.properties配置文件:
```properties
数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/his01?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useUnicode=true&useSSL=false spring.datasource.username=root spring.datasource.password=123456
MyBatis配置
mybatis.mapper-locations=classpath:/mapper/*.xml
设置端口号
server.port=8091
```properties
# 数据库连接配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/his01?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useUnicode=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# MyBatis配置
mybatis.mapper-locations=classpath:/mapper/*.xml
# 设置端口号
server.port=8092
4.1.2.服务器端代码
4.2.前端项目
4.2.1.前端项目搭建
4.2.1.1.开发工具检查
- 检查vscode是否安装成功。
- 检查npm安装环境: 命令行下输入:npm -v
- 检查VueCli安装环境:命令行下输入:vue -V (注意:本工程使用VueCli3版本)
附录:
- 安装npm:直接安装node.js (输入 “npm -v” 测试是否安装成功; 输入 node –v 查看node版本)
- 全局安装vuecli:npm install -g @vue/cli@3.11
- 查看当前安装的vue-cli版本:vue —version 或 vue –V
- 卸载旧版本的vue-cli:npm uninstall vue-cli -g
查看远程仓库中的版本号:npm view @vue/cli versions —json
4.2.1.2.搭建VueCli工程
命令行下进入工作空间目录中,输入: vue create hisclient(工程名必须小写)
- 选择预设模板:这里选择“Manually select features”(手动选择特征)
- 模块选取:Babel、Router
- 选择是否使用history 形式的路由:选择:N
- 将依赖文件放在package.json中:选择:“in package.json”
- 是否将当前选择保存以备下次使用:选择:N
- 进入创建好的工程目录:cd hisclient
- 启动工程:npm run serve
在浏览器中测试:http://localhost:8080
4.2.1.3.添加其它依赖及配置文件
添加element与axios依赖:
npm install element-ui —save
npm install axios —save
4.2.1.4.main.js文件
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import Axios from 'axios'
import 'element-ui/lib/theme-chalk/index.css';
Vue.config.productionTip = false
Vue.use(ElementUI);
Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
Vue.prototype.$http = Axios;
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
4.2.1.5.index.vue文件
注意:在layout/index.vue文件中,完成项目主界面。
<template>
<!-- 项目主界面 -->
<el-container>
<!-- 主界面的标题栏 -->
<el-header style="background-color: #20A0FF;">
<div style="display:flex;justify-content:space-between">
<div style="display:flex">
<div class="home-title-text" style="width:220px">东软云医院HIS系统</div>
<div class="home-title-icon"><i class="el-icon-s-fold"></i></div>
</div>
<div style="display:flex">
<div class="home-title-img">
<el-image src="logo.png" fit="contain "></el-image>
</div>
<div class="home-title-menu" style="width:150px">
<el-dropdown @command="dropdownClick">
<span class="el-dropdown-link">
{{titleUserName}}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" >
<el-dropdown-item>个人信息</el-dropdown-item>
<el-dropdown-item divided command="logout">退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</div>
</el-header>
<el-container style="height:1000px">
<el-aside style="background-color: #D3DCE6;" width="240px">
<el-menu default-active="1" class="el-menu-demo" style="background-color: #ECECEC" mode="vertical" router >
<el-submenu :index="''+index" v-for="(item,index) in this.menuList" :key="index"
v-if="!item.hidden && (item.meta.type == dept_type || dept_type == 'root')" >
<template slot="title"><i :class="item.iconCls"></i><span>{{item.name}}</span></template>
<el-menu-item :index="child.path" v-for="(child,cindex) in item['children']" :key="cindex">
<span>{{child.name}}</span>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<el-main style="background-color: #E9EEF3;">
<router-view/>
</el-main>
</el-container>
</el-container>
</template>
<script>
export default ({
mounted: function(){
this.menuList = this.$router.options.routes;
let loginUser = sessionStorage.getItem("loginUser");
if(loginUser !=null && loginUser.length>0){
loginUser = JSON.parse(loginUser);
this.titleUserName = loginUser.realname;
this.dept_type = loginUser.dept_type;
}
},
methods:{
dropdownClick(commond){
if(commond == "logout"){
sessionStorage.removeItem("loginUser");
sessionStorage.removeItem("Flag");
//退出跳转到指定页面
location.href="http://39.105.101.77:8080/index.html";
}
}
},
data(){
return{
menuList:[],
titleUserName:"东软医生",
dept_type:''//部门类型
}
}
})
</script>
<style scoped>
.home-title-text {
color: #FFFFFF;
font-size: 22px;
margin-top: 15px;
text-align: left;
}
.home-title-icon {
margin-top: 15px;
width: 40px;
font-size: 22px;
}
.home-title-img{
margin-top: 10px;
}
.home-title-menu{
margin-top: 15px;
}
.el-dropdown-link {
cursor: pointer;
color: #FFFFFF;
font-size: 20px;
}
.el-icon-arrow-down {
font-size: 20px;
}
</style>
4.2.1.6.路由index.js文件
import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '../layout/index.vue'
import Login from '../views/Login.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Login',
hidden:true,
component: Login,
meta: {
isLogin: false
}
},{
path: '/login',
name: 'Login',
hidden:true,
component: Login,
meta: {
isLogin: false
}
},{
path: '/home',
name: 'Layout',
hidden:true,
component: Layout,
meta: {
isLogin: true
}
},{
path: '/',
name: '挂号收费',
component: Layout,
iconCls:"el-icon-document",
meta: {
type: "财务"
},
children:[
{
path: '/onsite-registration',
name: '窗口挂号',
component: () => import('../views/registration/onsite_registration.vue'),
meta: {
isLogin: true
}
},
{
path: '/registration-record',
name: '窗口退号',
component: () => import('../views/registration/registration_record.vue'),
meta: {
isLogin: true
}
},
{
path: '/expense-charge',
name: '收费',
component: () => import('../views/registration/expense_charge.vue'),
meta: {
isLogin: true
}
},
{
path: '/expense-refund',
name: '退费',
component: () => import('../views/registration/expense_refund.vue'),
meta: {
isLogin: true
}
},
{
path: '/expense-manage',
name: '费用记录查询',
component: () => import('../views/registration/expense_manage.vue'),
meta: {
isLogin: true
}
},
]
},{
path: '/',
name: '门诊医生',
component: Layout,
iconCls:"el-icon-user",
meta: {
type: "门诊"
},
children:[
{
path: '/physician-patient',
name: '患者查看',
component: () => import('../views/physician/physician_patient.vue'),
meta: {
isLogin: true
}
},
{
path: '/home_medical_record',
name: '医生诊疗:病历首页',
component: () => import('../views/physician/patient/home_medical_record.vue'),
meta: {
isLogin: true
}
},
{
path: '/check_request',
name: '医生诊疗:检查申请',
component: () => import('../views/physician/patient/check_request.vue'),
meta: {
isLogin: true
}
},
{
path: '/inspection_request',
name: '医生诊疗:检验申请',
component: () => import('../views/physician/patient/inspection_request.vue'),
meta: {
isLogin: true
}
},
{
path: '/physician-history',
name: '看诊记录',
component: () => import('../views/physician/physician_history.vue'),
meta: {
isLogin: true
}
},
{
path: '/check_results',
name: '医生诊疗:检查结果',
component: () => import('../views/physician/patient/check_results.vue'),
meta: {
isLogin: true
}
},
{
path: '/inspection_results',
name: '医生诊疗:检验结果',
component: () => import('../views/physician/patient/inspection_results.vue'),
meta: {
isLogin: true
}
},
{
path: '/outpatient_diagnosis',
name: '医生诊疗:门诊确诊',
component: () => import('../views/physician/patient/outpatient_diagnosis.vue'),
meta: {
isLogin: true
}
},
{
path: '/write_prescription',
name: '医生诊疗:开设处方',
component: () => import('../views/physician/patient/write_prescription.vue'),
meta: {
isLogin: true
}
},
{
path: '/disposal_request',
name: '医生诊疗:处置申请',
component: () => import('../views/physician/patient/disposal_request.vue'),
meta: {
isLogin: true
}
},
{
path: '/expense_query',
name: '医生诊疗:费用查询',
component: () => import('../views/physician/patient/expense_query.vue'),
meta: {
isLogin: true
}
},
]
},{
path: '/',
component: Layout,
name: '检查管理',
iconCls: 'el-icon-camera',
meta: {
type: "检查"
},
children: [
{
path: '/check-apply',
name: '检查申请',
component: () => import('../views/check/check_apply.vue'),
meta: {
isLogin: true
}
},{
path: '/check-patient',
name: '患者录入',
component: () => import('../views/check/check_patient.vue'),
meta: {
isLogin: true
}
},{
path: '/check-input',
name: '检查结果录入',
component: () => import('../views/check/check_input.vue'),
meta: {
isLogin: true
}
},{
path: '/check-manage',
name: '检查管理',
component: () => import('../views/check/check_manage.vue'),
meta: {
isLogin: true
}
}
]
},{
path: '/',
component: Layout,
name: '检验管理',
iconCls: 'el-icon-headset',
meta: {
type: "检验"
},
children: [
{
path: '/inspection-apply',
name: '检验申请',
component: () => import('../views/inspection/inspection_apply.vue'),
meta: {
isLogin: true
}
},{
path: '/inspection-patient',
name: '患者录入',
component: () => import('../views/inspection/inspection_patient.vue'),
meta: {
isLogin: true
}
},{
path: '/inspection-input',
name: '检验结果录入',
component: () => import('../views/inspection/inspection_input.vue'),
meta: {
isLogin: true
}
},{
path: '/inspection-manage',
name: '检验管理',
component: () => import('../views/inspection/inspection_manage.vue'),
meta: {
isLogin: true
}
}
]
},{
path: '/',
component: Layout,
name: '药房管理',
iconCls: 'el-icon-wallet',
meta: {
type: "药房"
},
children: [
{
path: '/give-medicine',
name: '药房发药',
component: () => import('../views/drugstore/give_medicine.vue'),
meta: {
isLogin: true
}
},{
path: '/refund_medicine',
name: '药房退药',
component: () => import('../views/drugstore/refund_medicine.vue'),
meta: {
isLogin: true
}
},{
path: '/drug-storage',
name: '药库管理',
component: () => import('../views/drugstore/drug_storage.vue'),
meta: {
isLogin: true
}
},{
path: '/tran-history',
name: '交易记录',
component: () => import('../views/drugstore/tran_history.vue'),
meta: {
isLogin: true
}
}
]
},{
path: '/',
component: Layout,
name: '处置管理',
iconCls: 'el-icon-first-aid-kit',
meta: {
type: "处置"
},
children: [
{
path: '/disposal-apply',
name: '处置申请',
component: () => import('../views/disposal/disposal_apply.vue'),
meta: {
isLogin: true
}
},{
path: '/disposal-patient',
name: '患者录入',
component: () => import('../views/disposal/disposal_patient.vue'),
meta: {
isLogin: true
}
},{
path: '/disposal-input',
name: '处置录入',
component: () => import('../views/disposal/disposal_input.vue'),
meta: {
isLogin: true
}
},{
path: '/disposal-manage',
name: '处置管理',
component: () => import('../views/disposal/disposal_manage.vue'),
meta: {
isLogin: true
}
}
]
}
]
const router = new VueRouter({
routes
})
export default router