1. 项目背景与意义
基层诊所是医疗卫生服务体系的重要组成部分,承担着常见病、多发病的诊疗和慢性病管理等工作。然而,许多基层诊所仍采用纸质病历和手写处方的方式开展门诊工作,存在病历书写不规范、处方保存困难、药品库存不清、复诊信息难以追溯等问题。纸质病历不仅占用大量物理空间,还容易因保管不善而丢失或损坏,给医疗纠纷处理和医保报销带来不便。
随着医疗信息化建设的不断推进,基层诊所对门诊电子病历与处方管理的需求日益迫切。基于SpringBoot的基层诊所门诊电子病历与处方管理系统,旨在通过信息化手段实现患者信息管理、电子病历书写、处方开具、药品库存管理和统计查询等功能的一体化,帮助基层诊所提升门诊工作效率,规范医疗文书,降低运营成本,提高医疗服务质量。
本系统的建设具有以下现实意义:
- 提升工作效率:电子化病历和处方替代手工书写,减少重复录入,缩短患者候诊时间。
- 规范医疗文书:通过结构化模板和必填校验,保证病历和处方的完整性与规范性。
- 保障用药安全:系统可对药品库存、用法用量进行辅助校验,减少人为差错。
- 便于统计追溯:门诊数据电子化存储,支持按时间、疾病、药品等多维度统计分析,为诊所运营决策提供数据支撑。
2. 系统技术栈
本系统采用前后端分离的架构设计,后端基于SpringBoot框架构建,前端采用Vue.js和Element UI组件库,数据库使用MySQL,ORM层使用MyBatis-Plus。整体技术栈选型如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | SpringBoot 2.7.x | 提供依赖注入、自动配置、嵌入式Web容器等能力,简化项目搭建与部署 |
| 安全框架 | Spring Security + JWT | 实现用户认证与接口鉴权,保障系统数据安全 |
| ORM框架 | MyBatis-Plus | 简化数据库操作,提供通用Mapper、分页插件和代码生成器 |
| 数据库 | MySQL 8.0 | 存储患者、病历、处方、药品、用户等业务数据 |
| 前端框架 | Vue.js 2.x + Element UI | 构建单页应用,提供表格、表单、弹窗等丰富的UI组件 |
| 构建工具 | Maven 3.6+ | 管理后端项目依赖与构建流程 |
| 开发环境 | JDK 1.8 + IDEA | 后端开发与调试环境 |
3. 系统功能模块设计
根据基层诊所门诊业务流程,系统划分为以下核心功能模块:
3.1 用户登录与权限管理
系统支持管理员、医生、药师三种角色。管理员负责系统基础配置和用户管理;医生负责病历书写和处方开具;药师负责药品库存管理和处方审核。用户登录后,系统根据角色动态加载菜单和操作权限。
3.2 患者信息管理
患者信息管理模块支持患者档案的新增、修改、查询和删除。患者档案包括姓名、性别、年龄、身份证号、联系电话、过敏史等基本信息。系统支持按姓名、手机号、病历号等关键字快速检索患者,方便医生在接诊时快速调取历史病历。
3.3 电子病历管理
电子病历模块是系统的核心功能。医生接诊时,可选择患者并新建门诊病历,记录主诉、现病史、既往史、体格检查、初步诊断、处理意见等内容。病历支持按患者和时间维度查询,医生可随时查看患者的历史就诊记录,辅助诊断决策。
3.4 处方管理
处方管理模块支持医生在病历基础上开具电子处方。处方内容包括药品名称、规格、剂量、用法、用量、天数等。系统自动关联药品库存,当药品库存不足时给出提示。处方开具完成后,药师可进行审核确认,审核通过的处方方可发药。
3.5 药品库存管理
药品库存管理模块支持药品信息的维护、入库、出库和库存查询。药品信息包括药品编码、名称、规格、生产厂家、有效期、库存数量、预警阈值等。当库存低于预警阈值时,系统自动提醒管理员补货。
3.6 统计报表
统计报表模块提供门诊量统计、疾病分布统计、药品消耗统计等功能。管理员可按时间范围查看每日门诊人次、常见疾病排行、药品消耗排行等数据,为诊所运营管理提供数据支持。
4. 数据库设计
系统核心数据表包括用户表、患者表、病历表、处方表、处方明细表、药品表等。以下为主要数据表的结构说明:
4.1 患者表(patient)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| patient_no | varchar(32) | 病历号,唯一 |
| name | varchar(50) | 患者姓名 |
| gender | tinyint | 性别:0男,1女 |
| age | int | 年龄 |
| phone | varchar(20) | 联系电话 |
| id_card | varchar(18) | 身份证号 |
| allergy_history | varchar(255) | 过敏史 |
| create_time | datetime | 创建时间 |
4.2 病历表(medical_record)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| patient_id | bigint | 患者ID,外键 |
| doctor_id | bigint | 接诊医生ID,外键 |
| chief_complaint | varchar(500) | 主诉 |
| present_illness | text | 现病史 |
| past_history | text | 既往史 |
| physical_exam | text | 体格检查 |
| diagnosis | varchar(500) | 初步诊断 |
| treatment_advice | text | 处理意见 |
| create_time | datetime | 就诊时间 |
4.3 处方表(prescription)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| record_id | bigint | 病历ID,外键 |
| patient_id | bigint | 患者ID,外键 |
| doctor_id | bigint | 开方医生ID,外键 |
| status | tinyint | 状态:0待审核,1已审核,2已发药 |
| create_time | datetime | 开方时间 |
5. 核心代码实现
5.1 项目依赖配置
在pom.xml中引入SpringBoot、MyBatis-Plus、MySQL驱动、JWT等核心依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>5.2 实体类定义
以患者实体为例,使用Lombok注解简化实体类开发:
@Data @TableName("patient") public class Patient { @TableId(type = IdType.AUTO) private Long id; private String patientNo; private String name; private Integer gender; private Integer age; private String phone; private String idCard; private String allergyHistory; private LocalDateTime createTime; }5.3 病历新增接口
病历新增是门诊流程中的核心操作,Controller层接收前端提交的病历数据,Service层完成业务校验和数据持久化:
@RestController @RequestMapping("/api/record") public class MedicalRecordController { @Resource private MedicalRecordService recordService; @PostMapping("/add") public Result add(@RequestBody MedicalRecord record) { if (record.getPatientId() == null) { return Result.error("请选择患者"); } if (StringUtils.isBlank(record.getChiefComplaint())) { return Result.error("主诉不能为空"); } recordService.saveRecord(record); return Result.success("病历保存成功"); } }Service层实现病历保存逻辑,同时记录操作日志:
@Service public class MedicalRecordServiceImpl implements MedicalRecordService { @Resource private MedicalRecordMapper recordMapper; @Override public void saveRecord(MedicalRecord record) { record.setCreateTime(LocalDateTime.now()); recordMapper.insert(record); } }5.4 处方开具接口
处方开具时,系统需要校验药品库存是否充足,并在开方成功后扣减库存:
@Service public class PrescriptionServiceImpl implements PrescriptionService { @Resource private PrescriptionMapper prescriptionMapper; @Resource private PrescriptionItemMapper itemMapper; @Resource private DrugMapper drugMapper; @Override @Transactional(rollbackFor = Exception.class) public void createPrescription(PrescriptionDTO dto) { Prescription prescription = new Prescription(); prescription.setRecordId(dto.getRecordId()); prescription.setPatientId(dto.getPatientId()); prescription.setDoctorId(dto.getDoctorId()); prescription.setStatus(0); prescription.setCreateTime(LocalDateTime.now()); prescriptionMapper.insert(prescription); for (PrescriptionItemDTO item : dto.getItems()) { Drug drug = drugMapper.selectById(item.getDrugId()); if (drug == null || drug.getStock() < item.getQuantity()) { throw new BusinessException("药品库存不足:" + drug.getName()); } PrescriptionItem detail = new PrescriptionItem(); detail.setPrescriptionId(prescription.getId()); detail.setDrugId(item.getDrugId()); detail.setQuantity(item.getQuantity()); detail.setUsageMethod(item.getUsageMethod()); itemMapper.insert(detail); drug.setStock(drug.getStock() - item.getQuantity()); drugMapper.updateById(drug); } } }5.5 药品库存查询接口
药品库存查询支持按药品名称模糊检索,并返回库存预警状态:
@RestController @RequestMapping("/api/drug") public class DrugController { @Resource private DrugMapper drugMapper; @GetMapping("/list") public Result list(@RequestParam(required = false) String keyword) { LambdaQueryWrapper<Drug> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(keyword)) { wrapper.like(Drug::getName, keyword); } List<Drug> drugs = drugMapper.selectList(wrapper); drugs.forEach(d -> d.setLowStock(d.getStock() < d.getWarnThreshold())); return Result.success(drugs); } }6. 系统测试与部署
系统开发完成后,需进行功能测试、接口测试和性能测试。功能测试覆盖患者管理、病历管理、处方管理、药品管理等核心流程;接口测试使用Postman验证各REST接口的入参校验和返回结果;性能测试关注高并发场景下接口的响应时间。
部署方面,后端项目通过Maven打包为可执行的JAR文件,使用内置Tomcat容器运行,命令如下:
mvn clean package -DskipTests java -jar clinic-system.jar前端项目构建后部署到Nginx,通过反向代理将API请求转发至后端服务,实现前后端分离部署。
7. 总结与展望
本文设计并实现了一个基于SpringBoot的基层诊所门诊电子病历与处方管理系统。系统覆盖患者管理、电子病历、处方管理、药品库存和统计报表等核心业务模块,能够有效提升基层诊所的门诊工作效率和医疗文书规范性。系统采用前后端分离架构,具有良好的扩展性和可维护性。
后续可在以下方向继续完善:一是引入电子签名和医保接口对接,满足更严格的合规要求;二是增加智能辅助诊断和用药提醒功能,进一步提升医疗服务质量;三是支持多诊所连锁部署,实现数据集中管理和业务协同。