在现代医疗环境中,传统窗口挂号模式存在排队耗时长、信息不透明、资源分配不均等痛点。医疗资源管理平台应运而生,该系统基于SpringBoot框架开发,通过数字化手段连接患者与医院,实现了预约挂号的线上化管理和医疗资源的智能化调度。
系统架构与技术栈
该平台采用典型的三层架构设计,后端基于SpringBoot 2.x构建,充分利用其自动配置、起步依赖和嵌入式Servlet容器等特性。数据持久层使用Spring Data JPA与MySQL进行交互,前端采用Thymeleaf模板引擎结合JavaScript实现动态页面渲染。项目通过Maven进行依赖管理,集成Druid连接池确保数据库访问性能。
配置文件展示了项目的核心设置:
server.servlet.context-path=/
spring.thymeleaf.cache=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://47.101.198.61:3306/boot_zxguahaosys?characterEncoding=utf8
spring.datasource.username=boot_zxguahaosys
spring.datasource.password=boot_zxguahaosys
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
数据库设计深度解析
床位管理表设计优化
CREATE TABLE `bed` (
`bedId` int(11) NOT NULL AUTO_INCREMENT,
`bedname` varchar(255) NOT NULL COMMENT '床位名称',
`departmentId` int(11) NOT NULL COMMENT '科室ID',
`state` int(11) DEFAULT NULL COMMENT '状态',
`price` double DEFAULT NULL COMMENT '价格',
PRIMARY KEY (`bedId`) USING BTREE,
KEY `fk_bedDepartmentid` (`departmentId`) USING BTREE,
CONSTRAINT `fk_bedDepartmentid` FOREIGN KEY (`departmentId`)
REFERENCES `departments` (`departmentId`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
该表设计体现了几个重要优化点:使用BTREE索引提升查询效率,外键约束确保数据一致性,AUTO_INCREMENT实现主键自增。状态字段采用整型而非字符串,减少了存储空间并提高了查询性能。
药品库存管理的复杂关联设计
CREATE TABLE `drugstore` (
`rugstoreId` int(11) NOT NULL AUTO_INCREMENT COMMENT '药库ID',
`drugstoreName` varchar(255) NOT NULL COMMENT '药品名称',
`supplierId` int(11) DEFAULT NULL COMMENT '供应商ID',
`skullId` int(11) DEFAULT NULL COMMENT '负责人ID',
`warehouseId` int(11) DEFAULT NULL COMMENT '仓库ID',
`unit` int(11) NOT NULL COMMENT '单位',
`tradePrice` double NOT NULL COMMENT '批发价格',
`sellingPrice` double NOT NULL COMMENT '销售价格',
`area` int(11) NOT NULL COMMENT '地区',
`type` int(11) NOT NULL COMMENT '类型',
`produceDate` date NOT NULL COMMENT '生产日期',
`validDate` date NOT NULL COMMENT '有效期',
`drugstorenum` int(11) NOT NULL COMMENT '药品数量',
`batch` varchar(255) NOT NULL COMMENT '批号',
PRIMARY KEY (`rugstoreId`) USING BTREE,
CONSTRAINT `fk_dgarea` FOREIGN KEY (`area`) REFERENCES `area` (`areaId`),
CONSTRAINT `fk_dgunit` FOREIGN KEY (`unit`) REFERENCES `unit` (`unitId`),
CONSTRAINT `fk_dtype` FOREIGN KEY (`type`) REFERENCES `type` (`typeId`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8
该表通过6个外键关联实现了完整的药品溯源体系,包含供应商、负责人、仓库、地区、单位和类型等多维度信息。日期字段使用DATE类型确保数据准确性,价格字段使用DOUBLE类型支持精确计算。

核心功能实现详解
区域管理模块
区域管理控制器实现了完整的CRUD操作,采用PageHelper进行分页处理:
@Controller
@RequestMapping("area")
public class AreaController {
@Autowired
private AreaService areaService;
@RequestMapping("findAllArea")
@ResponseBody
public Object AreaList(Area Area, Integer page, Integer limit){
PageHelper.startPage(page, limit);
List<Area> listAll = areaService.findAllArea(Area);
PageInfo pageInfo = new PageInfo(listAll);
Map<String, Object> tableData = new HashMap<String, Object>();
tableData.put("code", 0);
tableData.put("msg", "");
tableData.put("count", pageInfo.getTotal());
tableData.put("data", pageInfo.getList());
return tableData;
}
@RequestMapping("addArea")
@ResponseBody
public Object addArea(Area Area){
int count = areaService.count(Area);
if(count==0){
int i = areaService.addArea(Area);
if(i==1){
return "添加成功";
}else{
return "添加失败";
}
}else {
return Area.getAreaName()+"已存在";
}
}
}
该实现采用了防御式编程,在添加操作前先检查重复记录,确保数据唯一性。返回格式符合LayUI表格组件的要求,实现了前后端分离的数据交互。
医生排班管理
排班管理是系统的核心功能,实现了医生工作时间的智能化安排:
@Service
public class ScheduleService {
public List<Schedule> generateWeeklySchedule(Doctor doctor,
LocalDate startDate,
Map<String, TimeSlot> timeSlots) {
List<Schedule> schedules = new ArrayList<>();
for (int i = 0; i < 7; i++) {
LocalDate currentDate = startDate.plusDays(i);
for (TimeSlot slot : timeSlots.values()) {
Schedule schedule = new Schedule();
schedule.setDoctorId(doctor.getId());
schedule.setScheduleDate(currentDate);
schedule.setTimeSlot(slot);
schedule.setAvailable(true);
schedules.add(schedule);
}
}
return schedules;
}
}

预约业务逻辑处理
预约服务包含了复杂的业务规则校验:
@Service
@Transactional
public class AppointmentService {
public AppointmentResult makeAppointment(AppointmentRequest request) {
// 检查医生排班状态
Schedule schedule = scheduleRepository.findById(request.getScheduleId());
if (!schedule.isAvailable()) {
return AppointmentResult.failed("该时段已被预约");
}
// 检查患者同一时段是否已有预约
boolean hasConflict = appointmentRepository.existsByPatientAndTime(
request.getPatientId(), schedule.getScheduleDate(), schedule.getTimeSlot());
if (hasConflict) {
return AppointmentResult.failed("同一时段已有其他预约");
}
// 创建预约记录
Appointment appointment = new Appointment();
appointment.setPatientId(request.getPatientId());
appointment.setScheduleId(request.getScheduleId());
appointment.setCreateTime(LocalDateTime.now());
appointment.setStatus(AppointmentStatus.PENDING);
appointmentRepository.save(appointment);
schedule.setAvailable(false);
scheduleRepository.save(schedule);
return AppointmentResult.success(appointment);
}
}
药品库存预警机制
库存管理模块实现了智能预警功能:
@Component
public class DrugInventoryMonitor {
@Scheduled(fixedRate = 3600000) // 每小时执行一次
public void checkLowInventory() {
List<Drugstore> lowInventoryDrugs = drugstoreRepository
.findByDrugstorenumLessThan(minimumStockLevel);
for (Drugstore drug : lowInventoryDrugs) {
sendInventoryAlert(drug);
}
}
private void sendInventoryAlert(Drugstore drug) {
AlertMessage alert = new AlertMessage();
alert.setType(AlertType.INVENTORY_LOW);
alert.setDrugName(drug.getDrugstoreName());
alert.setCurrentStock(drug.getDrugstorenum());
alert.setTimestamp(LocalDateTime.now());
messageService.sendToPharmacist(alert);
}
}
实体模型设计
系统采用面向对象的设计思想,实体类结构清晰:
public class Area {
private Integer areaId;
private String areaName;
public Integer getAreaId() {
return areaId;
}
public void setAreaId(Integer areaId) {
this.areaId = areaId;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
}
这种简洁的实体设计配合JPA注解,实现了对象关系映射的优雅转换。每个实体都遵循JavaBean规范,提供了完整的getter和setter方法。

功能展望与优化方向
1. 引入Redis缓存提升性能
当前系统在高并发场景下可能存在数据库压力问题。引入Redis可以实现热点数据的缓存,如医生排班信息、药品目录等:
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
@Service
public class CachedScheduleService {
@Cacheable(value = "schedules", key = "#doctorId + '_' + #date")
public List<Schedule> getSchedulesByDoctorAndDate(Long doctorId, LocalDate date) {
return scheduleRepository.findByDoctorIdAndScheduleDate(doctorId, date);
}
}
2. 微服务架构改造
将单体应用拆分为多个微服务,如用户服务、预约服务、药品服务等,提升系统的可维护性和扩展性:
# application.yml for appointment-service
spring:
application:
name: appointment-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
3. 移动端适配与PWA支持
开发响应式前端,支持PWA技术,让用户可以通过手机APP形式使用系统:
// 注册Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW registered: ', registration);
});
}
4. 智能推荐算法集成
基于历史预约数据,为患者推荐合适的医生和时段:
@Service
public class RecommendationService {
public List<Doctor> recommendDoctors(Patient patient, Department department) {
// 基于协同过滤算法实现智能推荐
return recommendationEngine.getRecommendations(patient, department);
}
}
5. 消息队列异步处理
使用RabbitMQ或Kafka处理预约通知、库存预警等异步任务:
@Component
public class AppointmentNotificationSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendAppointmentConfirmation(Appointment appointment) {
AppointmentMessage message = convertToMessage(appointment);
rabbitTemplate.convertAndSend("appointment.exchange",
"appointment.confirmation", message);
}
}

技术实现亮点
数据库连接池优化
系统采用Druid连接池,配置了完善的监控和防护机制:
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
事务管理策略
使用Spring的声明式事务管理,确保数据一致性:
@Service
@Transactional(readOnly = true)
public class PatientService {
@Transactional
public Patient registerPatient(Patient patient) {
// 患者注册业务逻辑,包含多个数据库操作
return patientRepository.save(patient);
}
}
安全控制机制
基于角色的访问控制(RBAC)实现精细化的权限管理:
CREATE TABLE `sys_role_menu` (
`rid` int(11) NOT NULL COMMENT '角色ID',
`mid` int(11) NOT NULL COMMENT '菜单ID',
PRIMARY KEY (`rid`,`mid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
该医疗资源管理平台通过精心的架构设计和详细的功能实现,为医疗机构提供了完整的数字化解决方案。系统在数据库设计、业务逻辑处理、用户体验等方面都体现了较高的技术水平,为后续的功能扩展和性能优化奠定了坚实基础。