公司动态
SpringBoot实战:医院床位资源管理系统的设计与实现
这次我们来看一个医院床位资源管理的实战项目——“基于SpringBoot的全院一张床设计与实现”。这个项目的核心不是炫技而是解决一个非常实际的医院运营痛点床位资源分散、科室壁垒导致利用率不均、患者等待时间长。通过一个统一的床位管理平台打破科室间的物理隔离实现全院床位的动态调配与智能分配。对于开发者而言这个项目是一个典型的SpringBoot企业级应用涵盖了从需求分析、数据库设计、核心业务逻辑实现到前后端交互的全流程。它不依赖特定的GPU或高性能硬件重点在于业务模型的设计与系统架构的合理性。本文将带你从零开始深入理解“全院一张床”的业务逻辑并基于SpringBoot技术栈完成一个可运行、可扩展的原型系统实现。无论你是想学习SpringBoot项目实战还是对医疗信息化系统设计感兴趣这篇文章都能提供清晰的路径和可落地的代码。1. 核心能力速览在深入代码之前我们先快速了解这个项目的核心特性和技术选型这有助于判断它是否是你需要的学习或参考项目。能力项说明项目类型企业级后台管理系统医疗资源管理技术栈SpringBoot 2.x, MyBatis-Plus, MySQL, Redis, Vue.js (前后端分离假设)核心业务全院床位统一视图、床位动态分配、患者智能匹配、床位周转分析硬件门槛低。普通开发机即可运行无需GPU。依赖Java运行环境和MySQL数据库。启动方式标准SpringBoot应用启动mvn spring-boot:run或直接运行主类。支持Docker容器化部署。接口能力提供完整的RESTful API涵盖床位查询、患者入住/出院、统计报表等。批量任务支持批量导入床位信息、批量办理出院等后台任务。适合场景1. SpringBoot全栈学习项目2. 医疗信息化系统设计与开发参考3. 资源调度与优化算法实践。2. 适用场景与使用边界适合谁Java/SpringBoot学习者这是一个包含完整CRUD、复杂业务逻辑、多表关联和状态管理的经典案例远超简单的增删改查Demo。医疗软件开发者可以直接参考其床位管理、患者流转的核心业务模型设计。系统架构兴趣者项目涉及资源池化、动态调度、实时状态同步等架构思想。能解决什么问题资源利用率最大化将全院床位视为一个资源池根据患者病情和科室能力动态分配减少“有的科室床满为患有的科室床位空置”的现象。缩短患者等待时间系统智能推荐可用床位加速入院流程。精细化运营管理提供床位周转率、平均住院日等关键指标的数据看板辅助管理决策。不适合什么场景超大型医院直接投产本文实现的是一个原型系统在高并发、高可用性、与现有HIS/LIS/PACS等系统深度集成方面需要进一步的企业级改造。替代专业医疗决策床位分配建议仅供参考最终决策权在医生和科室系统需确保医疗安全第一。合规与安全边界数据隐私患者信息属于高度敏感数据任何实现都必须严格遵守《个人信息保护法》和医疗数据安全规范包括数据加密存储、传输和访问审计。系统权限必须实现基于角色RBAC的精细权限控制例如护士只能操作本科室床位医务科管理员可查看全院视图。操作日志所有床位分配、调整、患者出入院操作必须留有不可篡改的完整日志满足医疗质量追溯要求。3. 环境准备与前置条件开始编码前请确保你的开发环境已就绪。Java开发环境JDK 8 或 JDK 11推荐。SpringBoot 2.x 对这两个版本支持最稳定。使用java -version确认版本。项目管理与构建工具Maven 3.6 或 Gradle。本文以Maven为例。使用mvn -v确认安装。数据库MySQL 5.7 或 MariaDB 10.3。这是业务数据的主存储。需要提前创建好数据库例如hospital_bed_management。建议安装一个图形化客户端如Navicat、DBeaver方便操作。缓存可选但推荐Redis 5.0。用于缓存热点数据如科室列表、床位状态看板提升系统响应速度。如果暂不涉及可在配置中关闭Redis相关功能。开发工具IDEIntelliJ IDEA推荐或 Eclipse。API测试工具Postman 或 Apifox用于测试后端接口。浏览器用于前端访问若包含前端或Swagger接口文档查看。版本控制Git。用于代码版本管理。4. 项目初始化与核心依赖我们使用Spring Initializr或IDE内置功能快速初始化项目。核心依赖选择Spring Web用于构建RESTful API。MyBatis Framework或MyBatis-Plus强烈推荐MyBatis-Plus它提供了强大的CRUD封装和条件构造器。MySQL Driver连接MySQL数据库。Lombok简化实体类代码Getter/Setter/Constructor等。Spring Boot DevTools开发热部署。Spring Cache与Redis缓存支持。生成的pom.xml关键依赖部分如下dependencies !-- SpringBoot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus 简化数据库操作 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- Redis -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- 开发工具 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency !-- 测试 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies配置文件 (application.yml) 基础设置server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hospital_bed_management?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password redis: host: localhost port: 6379 database: 0 # password: 如果Redis有密码则配置 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印SQL生产环境关闭 global-config: db-config: logic-delete-field: deleted # 全局逻辑删除字段名 logic-delete-value: 1 logic-not-delete-value: 0 logging: level: com.yourpackage.mapper: debug # 调整为你自己的mapper包路径5. 数据库设计与核心表结构“全院一张床”的核心是数据模型。以下是简化但关键的表设计。-- 科室表 CREATE TABLE department ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, dept_code varchar(50) NOT NULL COMMENT 科室编码, dept_name varchar(100) NOT NULL COMMENT 科室名称, dept_type varchar(20) DEFAULT NULL COMMENT 科室类型内科/外科/急诊..., bed_capacity int(11) DEFAULT 0 COMMENT 核定床位数, phone varchar(20) DEFAULT NULL COMMENT 联系电话, status tinyint(4) DEFAULT 1 COMMENT 状态0停用1启用, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_dept_code (dept_code) ) ENGINEInnoDB COMMENT科室信息表; -- 床位资源表核心表 CREATE TABLE bed ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, bed_code varchar(50) NOT NULL COMMENT 床位编码全院唯一如A-101-01, bed_name varchar(100) DEFAULT NULL COMMENT 床位名称可读性更好, dept_id bigint(20) NOT NULL COMMENT 所属科室ID, room_number varchar(50) DEFAULT NULL COMMENT 房间号, bed_status tinyint(4) NOT NULL DEFAULT 0 COMMENT 床位状态0空闲1占用2预留3消毒中4停用, bed_type varchar(20) DEFAULT 普通 COMMENT 床位类型普通、重症ICU、隔离、抢救..., device_info varchar(500) DEFAULT NULL COMMENT 配套设备信息, current_patient_id bigint(20) DEFAULT NULL COMMENT 当前占用患者ID, last_discharge_time datetime DEFAULT NULL COMMENT 上次出院时间用于计算床位周转, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_bed_code (bed_code), KEY idx_dept_id (dept_id), KEY idx_bed_status (bed_status), CONSTRAINT fk_bed_dept FOREIGN KEY (dept_id) REFERENCES department (id) ) ENGINEInnoDB COMMENT床位资源表; -- 患者信息表 CREATE TABLE patient ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, patient_id varchar(50) NOT NULL COMMENT 患者唯一标识如住院号, name varchar(50) NOT NULL COMMENT 姓名, gender tinyint(4) DEFAULT NULL COMMENT 性别, age int(11) DEFAULT NULL COMMENT 年龄, id_card varchar(20) DEFAULT NULL COMMENT 身份证号, phone varchar(20) DEFAULT NULL COMMENT 联系电话, admission_status tinyint(4) DEFAULT 0 COMMENT 在院状态0待入院1在院2已出院, primary_diagnosis varchar(500) DEFAULT NULL COMMENT 主要诊断, required_bed_type varchar(20) DEFAULT NULL COMMENT 所需床位类型, priority int(11) DEFAULT 0 COMMENT 入院优先级数值越大越优先, admission_time datetime DEFAULT NULL COMMENT 入院时间, discharge_time datetime DEFAULT NULL COMMENT 出院时间, current_bed_id bigint(20) DEFAULT NULL COMMENT 当前所在床位ID, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_patient_id (patient_id), KEY idx_admission_status (admission_status), KEY fk_patient_bed (current_bed_id), CONSTRAINT fk_patient_bed FOREIGN KEY (current_bed_id) REFERENCES bed (id) ) ENGINEInnoDB COMMENT患者信息表; -- 床位分配记录表用于追溯 CREATE TABLE bed_allocation_record ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, bed_id bigint(20) NOT NULL COMMENT 床位ID, patient_id bigint(20) NOT NULL COMMENT 患者ID, action varchar(20) NOT NULL COMMENT 操作入住、换床、出院, operator_id bigint(20) DEFAULT NULL COMMENT 操作员ID, operator_name varchar(50) DEFAULT NULL COMMENT 操作员姓名, remark varchar(500) DEFAULT NULL COMMENT 备注, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 操作时间, PRIMARY KEY (id), KEY idx_bed_id (bed_id), KEY idx_patient_id (patient_id), KEY idx_create_time (create_time) ) ENGINEInnoDB COMMENT床位分配记录表;设计要点床位状态 (bed_status)这是调度的核心字段必须实时准确。床位与科室解耦bed表通过dept_id关联科室但分配时可以跨科室。这为“全院一张床”提供了数据基础。患者与床位关联patient.current_bed_id和bed.current_patient_id互相关联确保数据一致性。操作记录bed_allocation_record表记录每一次床位变动满足审计和追溯要求。6. 核心业务逻辑实现6.1 实体类与Mapper使用MyBatis-Plus和Lombok代码非常简洁。Bed.java (实体类)package com.hospital.bed.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.util.Date; Data TableName(bed) public class Bed { TableId(type IdType.AUTO) private Long id; private String bedCode; private String bedName; private Long deptId; private String roomNumber; private Integer bedStatus; // 0空闲1占用... private String bedType; private String deviceInfo; private Long currentPatientId; private Date lastDischargeTime; TableField(fill FieldFill.INSERT) private Date createTime; TableField(fill FieldFill.INSERT_UPDATE) private Date updateTime; // 非数据库字段用于关联查询显示科室名称 TableField(exist false) private String deptName; }BedMapper.java (Mapper接口)package com.hospital.bed.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hospital.bed.entity.Bed; import org.apache.ibatis.annotations.Select; import java.util.List; public interface BedMapper extends BaseMapperBed { /** * 查询指定状态和科室的床位列表带科室名 */ Select(SELECT b.*, d.dept_name FROM bed b LEFT JOIN department d ON b.dept_id d.id WHERE b.bed_status #{status} AND b.dept_id #{deptId}) ListBed selectBedsByStatusAndDept(Integer status, Long deptId); /** * 查询全院空闲床位用于全局调度 */ Select(SELECT b.*, d.dept_name FROM bed b LEFT JOIN department d ON b.dept_id d.id WHERE b.bed_status 0 ORDER BY d.dept_name, b.bed_code) ListBed selectAllAvailableBeds(); }6.2 床位查询与状态管理服务IBedService.java BedServiceImpl.javapackage com.hospital.bed.service; import com.baomidou.mybatisplus.extension.service.IService; import com.hospital.bed.entity.Bed; import com.hospital.bed.vo.BedVO; import java.util.List; public interface IBedService extends IServiceBed { /** * 获取全院床位状态概览用于大屏 */ BedOverviewVO getBedOverview(); /** * 根据条件分页查询床位 */ PageResultBedVO queryBedPage(PageParam pageParam, BedQueryDTO queryDTO); /** * 智能推荐床位核心算法入口 */ ListBed recommendBeds(Patient patient); } Service Slf4j public class BedServiceImpl extends ServiceImplBedMapper, Bed implements IBedService { Autowired private DepartmentMapper departmentMapper; Autowired private RedisTemplateString, Object redisTemplate; private static final String BED_OVERVIEW_KEY bed:overview; Override public BedOverviewVO getBedOverview() { // 尝试从Redis缓存获取 BedOverviewVO overview (BedOverviewVO) redisTemplate.opsForValue().get(BED_OVERVIEW_KEY); if (overview ! null) { return overview; } // 缓存未命中查询数据库 overview new BedOverviewVO(); // 1. 查询全院总床位数 Integer totalBeds baseMapper.selectCount(null); // 2. 查询占用床位数 (status1) Integer occupiedBeds baseMapper.selectCount(Wrappers.BedlambdaQuery().eq(Bed::getBedStatus, 1)); // 3. 查询空闲床位数 (status0) Integer freeBeds baseMapper.selectCount(Wrappers.BedlambdaQuery().eq(Bed::getBedStatus, 0)); // 4. 计算各科室床位占用率简化示例 ListDepartment depts departmentMapper.selectList(null); ListDeptBedStats statsList new ArrayList(); for (Department dept : depts) { Integer deptTotal baseMapper.selectCount(Wrappers.BedlambdaQuery().eq(Bed::getDeptId, dept.getId())); Integer deptOccupied baseMapper.selectCount(Wrappers.BedlambdaQuery() .eq(Bed::getDeptId, dept.getId()) .eq(Bed::getBedStatus, 1)); double occupancyRate deptTotal 0 ? 0.0 : (deptOccupied * 100.0 / deptTotal); statsList.add(new DeptBedStats(dept.getDeptName(), deptTotal, deptOccupied, occupancyRate)); } overview.setTotalBeds(totalBeds); overview.setOccupiedBeds(occupiedBeds); overview.setFreeBeds(freeBeds); overview.setOccupancyRate(totalBeds 0 ? 0 : (occupiedBeds * 100.0 / totalBeds)); overview.setDeptStats(statsList); // 存入Redis设置5分钟过期 redisTemplate.opsForValue().set(BED_OVERVIEW_KEY, overview, 5, TimeUnit.MINUTES); return overview; } Override public ListBed recommendBeds(Patient patient) { // 1. 获取患者所需床位类型 String requiredBedType patient.getRequiredBedType(); // 2. 构建查询条件空闲状态 匹配床位类型或通用类型 LambdaQueryWrapperBed queryWrapper Wrappers.lambdaQuery(); queryWrapper.eq(Bed::getBedStatus, 0) // 空闲 .and(wrapper - wrapper.eq(Bed::getBedType, requiredBedType) .or() .eq(Bed::getBedType, 普通)); // 普通床位可作为备选 // 3. 可加入优先级排序例如优先推荐同科室床位其次按房间号排序 queryWrapper.orderByAsc(Bed::getDeptId).orderByAsc(Bed::getRoomNumber); ListBed candidateBeds baseMapper.selectList(queryWrapper); // 4. 进阶这里可以加入更复杂的评分算法 // - 科室专业匹配度诊断 vs 科室特长 // - 患者性别与病房类型 // - 距离护士站远近 // - 设备配套情况 // 本文示例返回简单列表实际项目需实现评分逻辑 return candidateBeds; } }6.3 床位分配与患者入住服务这是业务最核心的部分涉及事务控制和数据一致性。BedAllocationService.javaService Transactional(rollbackFor Exception.class) // 声明式事务 Slf4j public class BedAllocationService { Autowired private BedMapper bedMapper; Autowired private PatientMapper patientMapper; Autowired private BedAllocationRecordMapper recordMapper; /** * 执行床位分配患者入住 * param bedId 床位ID * param patientId 患者ID * param operator 操作员 * return 分配结果 */ public boolean allocateBed(Long bedId, Long patientId, String operator) { // 1. 检查床位状态乐观锁思想通过状态判断 Bed bed bedMapper.selectById(bedId); if (bed null) { throw new BusinessException(床位不存在); } if (!bed.getBedStatus().equals(0)) { // 非空闲 throw new BusinessException(床位当前不可用状态为 bed.getBedStatus()); } // 2. 检查患者状态 Patient patient patientMapper.selectById(patientId); if (patient null) { throw new BusinessException(患者不存在); } if (patient.getAdmissionStatus().equals(1)) { // 已在院 throw new BusinessException(患者已在院当前床位ID patient.getCurrentBedId()); } // 3. 更新床位状态和关联患者 bed.setBedStatus(1); // 设置为占用 bed.setCurrentPatientId(patientId); bed.setUpdateTime(new Date()); int updateBedResult bedMapper.updateById(bed); // 4. 更新患者状态和关联床位 patient.setAdmissionStatus(1); // 在院 patient.setCurrentBedId(bedId); patient.setAdmissionTime(new Date()); patient.setUpdateTime(new Date()); int updatePatientResult patientMapper.updateById(patient); // 5. 记录分配日志 BedAllocationRecord record new BedAllocationRecord(); record.setBedId(bedId); record.setPatientId(patientId); record.setAction(入住); record.setOperatorName(operator); record.setRemark(系统分配); recordMapper.insert(record); // 6. 清理相关缓存例如床位概览 redisTemplate.delete(bed:overview); log.info(床位分配成功床位[{}] - 患者[{}], 操作员{}, bed.getBedCode(), patient.getName(), operator); return updateBedResult 0 updatePatientResult 0; } /** * 患者出院释放床位 */ public boolean dischargePatient(Long patientId, String operator) { // 类似allocateBed反向操作 // 1. 查询患者及床位 // 2. 更新床位状态为空闲清空currentPatientId记录lastDischargeTime // 3. 更新患者状态为已出院记录dischargeTime清空currentBedId // 4. 记录“出院”操作日志 // 5. 清理缓存 // 注意事务和异常处理 // ... return true; } }7. RESTful API接口设计与实现提供清晰的前后端交互契约。BedController.javaRestController RequestMapping(/api/bed) Api(tags 床位管理接口) public class BedController { Autowired private IBedService bedService; Autowired private BedAllocationService allocationService; GetMapping(/overview) ApiOperation(获取全院床位概览大屏数据) public ResultBedOverviewVO getOverview() { BedOverviewVO overview bedService.getBedOverview(); return Result.success(overview); } PostMapping(/query) ApiOperation(分页条件查询床位列表) public ResultPageResultBedVO queryBedPage(RequestBody BedQueryDTO queryDTO) { PageParam pageParam new PageParam(queryDTO.getPageNum(), queryDTO.getPageSize()); PageResultBedVO pageResult bedService.queryBedPage(pageParam, queryDTO); return Result.success(pageResult); } GetMapping(/available) ApiOperation(获取全院空闲床位列表用于下拉选择) public ResultListBed getAvailableBeds() { ListBed beds bedService.list(Wrappers.BedlambdaQuery().eq(Bed::getBedStatus, 0)); return Result.success(beds); } PostMapping(/allocate) ApiOperation(分配床位患者入住) public ResultBoolean allocateBed(RequestBody Valid BedAllocateDTO allocateDTO) { boolean success allocationService.allocateBed(allocateDTO.getBedId(), allocateDTO.getPatientId(), allocateDTO.getOperator()); return success ? Result.success(true) : Result.error(分配失败); } PostMapping(/recommend) ApiOperation(为患者智能推荐床位) public ResultListBed recommendBeds(RequestBody Patient patient) { ListBed recommendedBeds bedService.recommendBeds(patient); return Result.success(recommendedBeds); } }使用Postman测试接口启动应用mvn spring-boot:run访问GET http://localhost:8080/api/bed/overview应返回JSON格式的床位概览数据。访问GET http://localhost:8080/api/bed/available应返回所有空闲床位列表。8. 前端界面关键功能点思路虽然本文侧重后端但前端是系统的门面。关键页面包括全院床位状态总览大屏使用ECharts等图表库展示床位总数、占用数、空闲数、科室占用率排行榜。数据通过/api/bed/overview接口获取并利用WebSocket实现实时刷新。床位资源管理列表页表格展示所有床位支持按科室、状态、类型筛选。提供“分配”、“释放”、“编辑”操作按钮。患者入院办理页面表单录入患者信息点击“分配床位”时调用/api/bed/recommend获取推荐床位列表供选择确认后调用/api/bed/allocate完成分配。床位分配记录查询页按时间、操作员、患者查询历史分配记录用于审计。9. 系统扩展与进阶思考一个原型系统跑通后可以考虑以下方向进行深化智能推荐算法优化当前的recommendBeds方法比较简单。可以引入评分模型考虑因素包括科室专业匹配度、患者性别、年龄、病情紧急程度、床位空闲时长、距离护士站距离等实现真正的“智能”分配。预约与预留机制实现床位预约功能允许为即将入院的患者临时锁定床位一段时间。与HIS系统集成通过企业服务总线ESB或直接数据库对接不推荐从医院HIS系统同步患者基本信息、诊断信息避免手动重复录入。移动端支持开发护士站PAD应用或医生微信小程序方便床旁操作和查询。数据统计与BI分析集成更强大的报表工具分析床位周转率、平均住院日、科室效益等深度指标。微服务化改造将床位服务、患者服务、科室服务拆分为独立的微服务通过Spring Cloud进行治理提升系统弹性和可维护性。容器化部署编写Dockerfile和docker-compose.yml将SpringBoot应用、MySQL、Redis等一键部署提升交付效率。10. 常见问题与排查方法在开发和部署过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案应用启动失败报数据库连接错误1. 数据库地址/端口/用户名/密码错误2. MySQL服务未启动3. 数据库hospital_bed_management不存在1. 检查application.yml中的spring.datasource配置2. 命令行登录MySQL确认服务状态和数据库存在3. 查看启动日志中的详细错误信息1. 修正配置文件2. 启动MySQL服务3. 执行提供的SQL脚本创建数据库和表调用床位分配接口数据未更新1. 事务未生效2. 代码逻辑错误导致更新条件不满足3. 前端传递参数错误1. 检查Service方法是否添加了Transactional注解2. 在allocateBed方法关键步骤打日志或调试3. 使用Postman直接测试后端接口排除前端问题1. 添加或检查事务注解2. 修复业务逻辑3. 核对API文档和实际传参查询接口返回慢尤其是概览接口1. 数据量大未分页2. 复杂查询未加索引3. 缓存未生效1. 检查SQL语句使用EXPLAIN分析2. 查看bed,department表相关查询字段是否建立索引3. 检查Redis连接和缓存逻辑1. 分页查询2. 为dept_id,bed_status等字段添加索引3. 确保缓存键正确Redis服务正常前端页面显示“跨域错误”浏览器同源策略阻止了请求查看浏览器开发者工具Console和Network面板在后端配置CORS添加CrossOrigin注解或使用WebMvcConfigurer全局配置修改代码后未热更新Spring Boot DevTools配置或IDE自动编译未开启检查IDEA设置Build, Execution, Deployment-Compiler- 勾选Build project automatically确保DevTools依赖已添加并开启IDEA自动编译。也可手动mvn compile11. 项目总结与下一步这个“基于SpringBoot的全院一张床”项目从零到一演示了如何将一个具体的业务需求转化为可工作的软件系统。它的价值不在于技术多么新颖而在于对复杂业务逻辑的梳理、数据库设计的权衡、事务一致性的保证以及前后端协作的完整呈现。最值得尝试的点业务建模理解“资源池化”和“动态调度”在软件中的体现。MyBatis-Plus实战熟练运用其CRUD接口、条件构造器极大提升开发效率。Redis缓存应用学习在何处、以何种粒度使用缓存来提升性能。事务控制掌握Transactional在确保业务数据一致性上的关键作用。最先应该验证的功能启动项目确保能连上数据库。插入几条测试的科室和床位数据。调用/api/bed/overview和/api/bed/available接口看是否能正确返回数据。模拟一个患者入住流程从推荐床位到完成分配检查数据库记录是否准确更新。最容易踩的坑事务失效注意Transactional在同类方法内调用、异常被捕获等情况会失效。缓存数据一致性更新数据库后一定要记得清理或更新对应的缓存。并发分配在高并发下两个请求可能同时认为一个床位是空闲的。更严谨的做法是使用数据库悲观锁SELECT ... FOR UPDATE或乐观锁版本号字段。后续方向将本文的代码作为一个基础框架尝试实现前面提到的“进阶思考”中的任意一点例如实现一个更复杂的推荐算法或者集成Swagger生成在线API文档。学习使用Jenkins或GitLab CI/CD为这个项目搭建自动化构建和部署流水线。研究如何将单机应用改造成Spring Cloud Alibaba微服务架构。建议将代码托管到GitHub或Gitee并撰写详细的README。这不仅是一个学习记录也是你技术能力的一个有力证明。在实际开发中还要充分考虑权限控制、操作日志、数据导出等企业级功能。