项目介绍
当下,如果还依然使用纸质文档来记录并且管理相关信息,可能会出现很多问题,比如原始文件的丢失,因为采用纸质文档,很容易受潮或者怕火,不容易备份,需要花费大量的人员和资金来管理用纸质文档存储的信息,最重要的是数据出现问题寻找起来很麻烦,并且修改也困难,如果还这样操作会造成很大的资源浪费和经济损失。所以,对于本课题研究的病房信息的管理就需要有一款软件来代替手工操作,因此病房管理系统就应运而生。
病房管理系统运用的工具包括idea,Tomcat以及Navicat等。该系统可以实现开方类型管理,科室管理,药品类型管理,医护职位管理,职位管理,患者管理,病床管理,病床使用管理,病例管理,开方管理,药品管理,医护人员管理,医生管理等功能。
病房管理系统就是采用目前最流行的互联网应用思维,让信息处理变得更加高效,并且处理结果更加的符合预期,只要是关于数据管理方面,不管是添加还是修改,以及数据维护甚至是数据迁移,都可以达到更快更安全的要求。
4.2 功能结构设计
在基于系统功能分析的基础之上,开始对系统的详细功能进行设计,最终将使用结构图的形式对设计的结果进行展示。
管理员具备的详细功能将参照最终的设计结果,即图4.1所示的管理员功能结构图。其中管理员对开方类型,药品类型,职位等基础数据进行管理,对病床,病床使用,患者,医护人员,药品,开方等信息进行管理。
医生具备的详细功能将参照最终的设计结果,即图4.2所示的医生功能结构图。其中医生增删改查病例,开方,药品信息,查看病床信息以及病床使用信息。
医护人员具备的详细功能将参照最终的设计结果,即图4.3所示的医护人员功能结构图。其中医护人员主要是查看患者,病例,开方信息以及药品信息,查看病床信息以及病床使用信息。
患者具备的详细功能将参照最终的设计结果,即图4.4所示的患者功能结构图。其中患者查看病例,查看开方信息,查看病床使用信息。
开发环境
编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具: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 开方查看界面
核心代码
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("/bingchuang")
public class BingchuangController {
private static final Logger logger = LoggerFactory.getLogger(BingchuangController.class);
@Autowired
private BingchuangService bingchuangService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private HuanzheService huanzheService;
@Autowired
private YihurenyuanService yihurenyuanService;
@Autowired
private YishengService yishengService;
/**
* 后端列表
*/
@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("huanzheId",request.getSession().getAttribute("userId"));
else if("医护人员".equals(role))
params.put("yihurenyuanId",request.getSession().getAttribute("userId"));
else if("医生".equals(role))
params.put("yishengId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = bingchuangService.queryPage(params);
//字典表数据转换
List<BingchuangView> list =(List<BingchuangView>)page.getList();
for(BingchuangView 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);
BingchuangEntity bingchuang = bingchuangService.selectById(id);
if(bingchuang !=null){
//entity转view
BingchuangView view = new BingchuangView();
BeanUtils.copyProperties( bingchuang , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody BingchuangEntity bingchuang, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,bingchuang:{}",this.getClass().getName(),bingchuang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<BingchuangEntity> queryWrapper = new EntityWrapper<BingchuangEntity>()
.eq("bingchuang_uuid_number", bingchuang.getBingchuangUuidNumber())
.eq("fangjian_name", bingchuang.getFangjianName())
.eq("fangjian_address", bingchuang.getFangjianAddress())
.eq("chuanghao", bingchuang.getChuanghao())
.eq("shifoushiyong_types", bingchuang.getShifoushiyongTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
BingchuangEntity bingchuangEntity = bingchuangService.selectOne(queryWrapper);
if(bingchuangEntity==null){
bingchuang.setInsertTime(new Date());
bingchuang.setCreateTime(new Date());
bingchuangService.insert(bingchuang);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody BingchuangEntity bingchuang, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,bingchuang:{}",this.getClass().getName(),bingchuang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<BingchuangEntity> queryWrapper = new EntityWrapper<BingchuangEntity>()
.notIn("id",bingchuang.getId())
.andNew()
.eq("bingchuang_uuid_number", bingchuang.getBingchuangUuidNumber())
.eq("fangjian_name", bingchuang.getFangjianName())
.eq("fangjian_address", bingchuang.getFangjianAddress())
.eq("chuanghao", bingchuang.getChuanghao())
.eq("shifoushiyong_types", bingchuang.getShifoushiyongTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
BingchuangEntity bingchuangEntity = bingchuangService.selectOne(queryWrapper);
if(bingchuangEntity==null){
bingchuangService.updateById(bingchuang);//根据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());
bingchuangService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<BingchuangEntity> bingchuangList = 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("../../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){
//循环
BingchuangEntity bingchuangEntity = new BingchuangEntity();
// bingchuangEntity.setBingchuangUuidNumber(data.get(0)); //病床编号 要改的
// bingchuangEntity.setFangjianName(data.get(0)); //房间名 要改的
// bingchuangEntity.setFangjianAddress(data.get(0)); //房间位置 要改的
// bingchuangEntity.setChuanghao(data.get(0)); //床号 要改的
// bingchuangEntity.setShifoushiyongTypes(Integer.valueOf(data.get(0))); //是否使用 要改的
// bingchuangEntity.setInsertTime(date);//时间
// bingchuangEntity.setCreateTime(date);//时间
bingchuangList.add(bingchuangEntity);
//把要查询是否重复的字段放入map中
//病床编号
if(seachFields.containsKey("bingchuangUuidNumber")){
List<String> bingchuangUuidNumber = seachFields.get("bingchuangUuidNumber");
bingchuangUuidNumber.add(data.get(0));//要改的
}else{
List<String> bingchuangUuidNumber = new ArrayList<>();
bingchuangUuidNumber.add(data.get(0));//要改的
seachFields.put("bingchuangUuidNumber",bingchuangUuidNumber);
}
}
//查询是否重复
//病床编号
List<BingchuangEntity> bingchuangEntities_bingchuangUuidNumber = bingchuangService.selectList(new EntityWrapper<BingchuangEntity>().in("bingchuang_uuid_number", seachFields.get("bingchuangUuidNumber")));
if(bingchuangEntities_bingchuangUuidNumber.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(BingchuangEntity s:bingchuangEntities_bingchuangUuidNumber){
repeatFields.add(s.getBingchuangUuidNumber());
}
return R.error(511,"数据库的该表中的 [病床编号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
bingchuangService.insertBatch(bingchuangList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
论文参考
目 录
第1章 绪论 1
1.1 选题动因 1
1.2 目的和意义 1
1.3 论文结构安排 2
第2章 开发环境与技术 3
2.1 Tomcat 简介 3
2.2 Eclipse简介 3
2.3 Navicat简介 4
第3章 系统分析 5
3.1 可行性分析 5
3.1.1 经济可行性 5
3.1.2 技术可行性 5
3.1.3 操作可行性 5
3.2 系统流程分析 6
3.3 系统性能分析 7
3.4 系统功能分析 8
第4章 系统设计 12
4.1 布局设计原则 12
4.2 功能结构设计 13
4.3 数据库设计 16
4.3.1 数据库E-R图设计 16
4.3.2 数据库表结构设计 19
第5章 系统实现 23
5.1 管理员功能实现 23
5.1.1 患者管理 23
5.1.2 病床管理 23
5.1.3 病床使用管理 24
5.2 医生功能实现 25
5.2.1 病例管理 25
5.2.2 开方管理 25
5.2.3 药品管理 26
5.3 医护人员功能实现 26
5.3.1 病床使用查看 26
5.3.2 病例查看 27
5.3.3 开方查看 27
5.4 患者功能实现 28
5.4.1 病例查看 28
5.4.2 开方查看 28
第6章 系统测试 30
6.1 系统测试方法 30
6.2 功能测试 30
6.2.1 登录功能测试 30
6.2.2 病例查询功能测试 31
6.3 测试结果分析 31
结 论 32
参考文献 33
致 谢 34