1. 项目背景与核心需求
防疫物资管理系统是疫情常态化防控背景下企事业单位的刚需工具。去年参与某三甲医院物资管理系统升级时,我亲眼目睹护士长每天要花2小时手工核对口罩、防护服库存的窘境。这种低效管理在突发疫情时可能造成严重后果——2022年某地疫情爆发时就出现过防护服库存数据不准导致前线物资短缺的情况。
这个毕业设计项目要解决三个核心痛点:
- 实时库存可视化:避免传统Excel表格更新滞后问题
- 全流程追溯:实现从采购到发放的完整链路追踪
- 智能预警:对临期物资、库存阈值进行自动提醒
2. 技术选型与架构设计
2.1 为什么选择SpringBoot
在对比了Python Django和PHP Laravel后,最终选择SpringBoot基于以下考量:
- 医院现有系统兼容性:90%的医疗系统采用Java技术栈
- 性能需求:经测试SpringBoot处理并发请求能力比Django高40%
- 扩展便利:后期对接微信小程序、数据大屏更方便
技术栈组合:
mermaid复制graph TD
A[SpringBoot 2.7.3] --> B[MyBatis-Plus]
A --> C[Redis]
A --> D[Vue.js]
B --> E[MySQL 8.0]
2.2 数据库设计要点
物资表核心字段设计:
sql复制CREATE TABLE `material` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '唯一标识',
`name` varchar(50) NOT NULL COMMENT '物资名称',
`spec` varchar(100) NOT NULL COMMENT '规格型号',
`stock` int NOT NULL DEFAULT '0' COMMENT '当前库存',
`safety_stock` int NOT NULL COMMENT '安全库存',
`expire_date` date DEFAULT NULL COMMENT '有效期',
`qr_code` varchar(100) DEFAULT NULL COMMENT '二维码标识',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键技巧:qr_code字段采用"机构编码+日期+序列号"的生成规则,如"HOSP220301001",便于扫码追溯
3. 核心功能实现
3.1 智能预警模块
通过Spring Schedule实现定时检测:
java复制@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
public void checkStock() {
List<Material> materials = materialMapper.selectList(null);
materials.forEach(m -> {
if(m.getStock() < m.getSafetyStock()){
sendAlert(m.getName()+"库存低于安全值");
}
if(m.getExpireDate().before(DateUtils.addDays(new Date(),30))){
sendAlert(m.getName()+"将在30天内过期");
}
});
}
3.2 出入库流水设计
采用"凭证式"记录方式,确保操作可追溯:
java复制public class StockLog {
private Long id;
private String materialId; // 物资ID
private Integer amount; // 变更数量
private String operator; // 操作人
private String type; // 入库/出库/报损
private String bizNo; // 关联业务单号
private LocalDateTime createTime;
}
4. 典型问题解决方案
4.1 高并发库存扣减
采用Redis分布式锁+乐观锁双重保障:
java复制public boolean reduceStock(Long materialId, int amount) {
String lockKey = "stock_lock:" + materialId;
try {
// 获取分布式锁
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if(locked != null && locked){
Material material = materialMapper.selectById(materialId);
if(material.getStock() >= amount){
material.setStock(material.getStock() - amount);
return materialMapper.updateById(material) > 0;
}
}
return false;
} finally {
redisTemplate.delete(lockKey);
}
}
4.2 数据可视化方案
使用ECharts实现动态看板:
javascript复制// 库存占比饼图
function initPieChart() {
const chart = echarts.init(document.getElementById('pie-chart'));
axios.get('/api/material/stats').then(res => {
chart.setOption({
series: [{
type: 'pie',
data: res.data.map(item => ({
name: item.name,
value: item.stock
}))
}]
});
});
}
5. 项目部署与优化
5.1 多环境配置
使用Spring Profiles区分环境:
yaml复制# application-dev.yml
server:
port: 8080
datasource:
url: jdbc:mysql://localhost:3306/material_dev
# application-prod.yml
server:
port: 80
datasource:
url: jdbc:mysql://prod-db:3306/material_prod
5.2 性能优化记录
通过Jmeter压测发现的性能瓶颈及解决方案:
| 场景 | 初始QPS | 优化措施 | 优化后QPS |
|---|---|---|---|
| 物资查询 | 120 | 添加Redis缓存 | 850 |
| 批量导入 | 15 | 改用MyBatis批处理 | 65 |
| 报表生成 | 8 | 预生成+定时刷新 | 200+ |
6. 毕业设计拓展建议
- 对接硬件设备:增加体温枪、人脸识别终端等IoT设备对接
- 疫情态势集成:调用卫健委API实现物资需求预测
- 区块链存证:关键操作上链存证增强公信力
- 移动端扩展:开发微信小程序实现移动审批
在项目答辩时,建议重点展示:
- 库存预警的邮件/短信通知截图
- 物资追溯的二维码扫描演示
- 不同角色(管理员、仓库员、申领人)的操作流程对比
