项目介绍
在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对医疗挂号信息管理的提升,也为了对医疗挂号信息进行更好的维护,医疗挂号管理系统的出现就变得水到渠成不可缺少。通过对医疗挂号管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。
医疗挂号管理系统通过MySQL数据库与Spring Boot框架进行开发,医疗挂号管理系统能够实现病例管理,挂号管理,挂号人员管理,划价人员管理,患者管理,门诊管理,体检管理,药品管理,医生管理等功能。
通过医疗挂号管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。
4.2功能结构设计
本系统主要是基于数据的增加,修改,删除等操作,使用者能够通过提前设定的登录功能进入指定的操作区,这里对使用者设计的功能进行结构展示。
管理员功能结构图的绘制结果见图4-1。管理员登录进入本系统操作的功能包括对挂号人员,划价人员,患者,门诊信息,体检信息,药品信息等进行管理。
挂号人员功能结构图的绘制结果见图4-2。挂号人员登录进入本系统操作的功能包括新增挂号信息,新增患者信息,管理挂号和患者信息,查看门诊信息,病例信息,以及药品信息等。
划价人员功能结构图的绘制结果见图4-3。划价人员登录进入本系统操作的功能包括为已划价的病例进行取药,查看体检信息,药品信息,医生信息,门诊信息等。
医生功能结构图的绘制结果见图4-4。医生登录进入本系统操作的功能包括添加病例信息,管理病例信息,查看挂号信息,患者信息,体检信息,门诊信息等。
开发环境
编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SpringBoot
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序vue/爬虫/c#/asp.net
系统实现
5.1管理员功能实现
5.1.1 药品管理
管理员进入如图5-1所示的药品管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成药品信息的修改,删除等操作。
图5-1 药品管理界面
5.1.2 体检管理
管理员进入如图5-2所示的体检管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成体检信息的修改,删除等操作。
图5-2 体检管理界面
5.1.3 门诊管理
管理员进入如图5-3所示的门诊管理界面之后,管理员点击信息显示栏中最右侧的修改,删除按钮可依次完成门诊信息的修改,删除等操作。
图5-3 门诊管理界面
5.2 挂号人员功能实现
5.2.1 患者管理
挂号人员进入如图5-4所示的患者管理界面之后,挂号人员点击信息显示栏中最右侧的详情,删除按钮可依次完成患者信息的详情查看,删除等操作。挂号人员可以新增患者信息。
图5-4 患者管理界面
5.2.2 挂号管理
挂号人员进入如图5-5所示的挂号管理界面之后,挂号人员点击信息显示栏中最右侧的修改,删除按钮可依次完成挂号信息的修改,删除等操作。挂号人员需要添加挂号信息。
图5-5 挂号管理界面
5.2.3 门诊查看
挂号人员进入如图5-6所示的门诊查看界面之后,挂号人员点击信息显示栏中最右侧的详情按钮可以查看门诊详情,包括医生姓名,挂号费,门诊位置,星期几坐诊等信息。
图5-6 门诊查看界面
5.3 划价人员功能实现
5.3.1 病例管理
划价人员进入如图5-7所示的病例管理界面之后,划价人员可以查看病例详细内容,可以对已划价状态的病例进行取药操作。
图5-7 病例管理界面
5.3.2 体检查看
划价人员进入如图5-8所示的体检查看界面之后,划价人员可以查看患者的体检详情信息,包括左眼度数,肺部听诊,血常规详情等信息。
图5-8 体检查看界面
5.3.3 药品查看
划价人员进入如图5-9所示的药品查看界面之后,划价人员查看药品详情,包括药品名称,药品编号等信息。
图5-9 药品查看界面
5.4 医生功能实现
5.4.1 病例管理
医生进入如图5-10所示的病例管理界面之后,医生可以删除患者的病例信息,可以对患者的病例进行新增。
图5-10 病例管理界面
5.4.2 挂号查看
医生进入如图5-11所示的挂号查看界面之后,医生查看患者挂号费,科室,职位,挂号人员姓名,患者姓名等信息,可以查询患者挂号信息。
图5-11 挂号查看界面
5.4.3 患者查看
医生进入如图5-12所示的患者查看界面之后,医生查看患者详情,包括患者手机号,患者姓名,患者身份证号等信息,可以查询患者信息。
图5-12 患者查看界面
核心代码
package com.controller;
import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;
/**
* 患者
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/huanzhe")
public class HuanzheController {
private static final Logger logger = LoggerFactory.getLogger(HuanzheController.class);
@Autowired
private HuanzheService huanzheService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private YishengService yishengService;
@Autowired
private HuajiarenyuanService huajiarenyuanService;
@Autowired
private GuahaorenyuanService guahaorenyuanService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("医生".equals(role))
params.put("yishengId",request.getSession().getAttribute("userId"));
else if("划价人员".equals(role))
params.put("huajiarenyuanId",request.getSession().getAttribute("userId"));
else if("挂号人员".equals(role))
params.put("guahaorenyuanId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = huanzheService.queryPage(params);
//字典表数据转换
List<HuanzheView> list =(List<HuanzheView>)page.getList();
for(HuanzheView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
HuanzheEntity huanzhe = huanzheService.selectById(id);
if(huanzhe !=null){
//entity转view
HuanzheView view = new HuanzheView();
BeanUtils.copyProperties( huanzhe , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody HuanzheEntity huanzhe, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,huanzhe:{}",this.getClass().getName(),huanzhe.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<HuanzheEntity> queryWrapper = new EntityWrapper<HuanzheEntity>()
.eq("huanzhe_name", huanzhe.getHuanzheName())
.eq("huanzhe_phone", huanzhe.getHuanzhePhone())
.eq("huanzhe_id_number", huanzhe.getHuanzheIdNumber())
.eq("sex_types", huanzhe.getSexTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
HuanzheEntity huanzheEntity = huanzheService.selectOne(queryWrapper);
if(huanzheEntity==null){
huanzhe.setCreateTime(new Date());
huanzheService.insert(huanzhe);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody HuanzheEntity huanzhe, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,huanzhe:{}",this.getClass().getName(),huanzhe.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<HuanzheEntity> queryWrapper = new EntityWrapper<HuanzheEntity>()
.notIn("id",huanzhe.getId())
.andNew()
.eq("huanzhe_name", huanzhe.getHuanzheName())
.eq("huanzhe_phone", huanzhe.getHuanzhePhone())
.eq("huanzhe_id_number", huanzhe.getHuanzheIdNumber())
.eq("sex_types", huanzhe.getSexTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
HuanzheEntity huanzheEntity = huanzheService.selectOne(queryWrapper);
if("".equals(huanzhe.getHuanzhePhoto()) || "null".equals(huanzhe.getHuanzhePhoto())){
huanzhe.setHuanzhePhoto(null);
}
if(huanzheEntity==null){
huanzheService.updateById(huanzhe);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
huanzheService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
try {
List<HuanzheEntity> huanzheList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
HuanzheEntity huanzheEntity = new HuanzheEntity();
// huanzheEntity.setHuanzheName(data.get(0)); //患者姓名 要改的
// huanzheEntity.setHuanzhePhone(data.get(0)); //患者手机号 要改的
// huanzheEntity.setHuanzheIdNumber(data.get(0)); //患者身份证号 要改的
// huanzheEntity.setHuanzhePhoto("");//照片
// huanzheEntity.setSexTypes(Integer.valueOf(data.get(0))); //性别 要改的
// huanzheEntity.setCreateTime(date);//时间
huanzheList.add(huanzheEntity);
//把要查询是否重复的字段放入map中
//患者手机号
if(seachFields.containsKey("huanzhePhone")){
List<String> huanzhePhone = seachFields.get("huanzhePhone");
huanzhePhone.add(data.get(0));//要改的
}else{
List<String> huanzhePhone = new ArrayList<>();
huanzhePhone.add(data.get(0));//要改的
seachFields.put("huanzhePhone",huanzhePhone);
}
//患者身份证号
if(seachFields.containsKey("huanzheIdNumber")){
List<String> huanzheIdNumber = seachFields.get("huanzheIdNumber");
huanzheIdNumber.add(data.get(0));//要改的
}else{
List<String> huanzheIdNumber = new ArrayList<>();
huanzheIdNumber.add(data.get(0));//要改的
seachFields.put("huanzheIdNumber",huanzheIdNumber);
}
}
//查询是否重复
//患者手机号
List<HuanzheEntity> huanzheEntities_huanzhePhone = huanzheService.selectList(new EntityWrapper<HuanzheEntity>().in("huanzhe_phone", seachFields.get("huanzhePhone")));
if(huanzheEntities_huanzhePhone.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(HuanzheEntity s:huanzheEntities_huanzhePhone){
repeatFields.add(s.getHuanzhePhone());
}
return R.error(511,"数据库的该表中的 [患者手机号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
//患者身份证号
List<HuanzheEntity> huanzheEntities_huanzheIdNumber = huanzheService.selectList(new EntityWrapper<HuanzheEntity>().in("huanzhe_id_number", seachFields.get("huanzheIdNumber")));
if(huanzheEntities_huanzheIdNumber.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(HuanzheEntity s:huanzheEntities_huanzheIdNumber){
repeatFields.add(s.getHuanzheIdNumber());
}
return R.error(511,"数据库的该表中的 [患者身份证号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
huanzheService.insertBatch(huanzheList);
return R.ok();
}
}
}
}catch (Exception e){
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
论文参考
目 录
第一章 绪论 1
1.1 选题背景 1
1.2 选题意义 1
1.3 研究内容 2
第二章 开发环境 3
2.1 Java语言 3
2.2 MYSQL数据库 3
2.3 Eclipse开发工具 4
2.4 Spring Boot框架 4
第三章 系统分析 5
3.1可行性分析 5
3.1.1技术可行性 5
3.1.2操作可行性 5
3.1.3经济可行性 5
3.2系统流程分析 6
3.3系统性能分析 9
3.3.1系统安全性 9
3.3.2数据完整性 10
3.3.3系统可扩展性 10
3.4系统功能分析 10
第四章 系统设计 15
4.1 系统设计目标 15
4.2功能结构设计 16
4.3数据库设计 19
4.3.1 数据库概念设计 19
4.3.2 数据库物理设计 22
第五章 系统实现 27
5.1管理员功能实现 27
5.1.1 药品管理 27
5.1.2 体检管理 27
5.1.3 门诊管理 28
5.2 挂号人员功能实现 29
5.2.1 患者管理 29
5.2.2 挂号管理 29
5.2.3 门诊查看 30
5.3 划价人员功能实现 31
5.3.1 病例管理 31
5.3.2 体检查看 31
5.3.3 药品查看 32
5.4 医生功能实现 33
5.4.1 病例管理 33
5.4.2 挂号查看 33
5.4.3 患者查看 34
第六章 系统测试 35
6.1系统测试的特点 35
6.2 系统功能测试 35
6.2.1 医生登录测试 35
6.2.2 挂号查询测试 36
6.3 系统测试结果 36
结 论 37
致 谢 39
参考文献 40