1. 项目概述
这个应急物资管理系统是一个典型的B/S架构企业级应用,采用前后端分离设计模式。系统主要解决企事业单位在应急物资管理中的核心痛点:物资台账混乱、调拨效率低下、库存预警不及时等问题。我在参与某大型制造企业应急仓库数字化改造时,发现他们还在使用Excel表格手工记录物资出入库,经常出现账实不符的情况,这套系统正是针对此类场景设计的解决方案。
技术栈选型上,后端采用SpringBoot 2.7.x框架,前端使用Vue 3组合式API,数据库选用MySQL 8.0。这种技术组合在当前企业级应用中非常普遍,SpringBoot的自动配置特性可以快速搭建RESTful API服务,Vue的响应式特性适合构建动态管理界面,而MySQL作为成熟的关系型数据库能很好满足物资管理的ACID需求。
2. 核心功能解析
2.1 物资全生命周期管理
系统实现了从采购入库到报废处置的全流程跟踪:
- 智能入库:支持扫码枪快速录入物资信息,自动生成唯一物资编码(格式:类别码+日期+4位随机数)
- 动态库存:实时计算各仓库库存量,核心算法:
// 当前库存 = 初始库存 + 入库总量 - 出库总量 - 报损量 public BigDecimal calculateCurrentStock(Long materialId) { BigDecimal initial = stockMapper.selectInitialStock(materialId); BigDecimal inTotal = recordMapper.sumInRecords(materialId); BigDecimal outTotal = recordMapper.sumOutRecords(materialId); BigDecimal loss = recordMapper.sumLossRecords(materialId); return initial.add(inTotal).subtract(outTotal).subtract(loss); } - 效期预警:对药品、食品类物资提前30天触发预警
重要提示:效期检测建议使用Quartz定时任务每天凌晨执行,避免在业务高峰期计算影响系统性能
2.2 应急调拨管理
针对突发事件设计的快速响应机制:
- 创建调拨单时自动校验库存可用量
- 多级审批流程配置(可自定义审批人)
- 调拨电子签收功能(前端使用Canvas手写签名)
- 调拨路线优化算法(基于Dijkstra的最短路径计算)
2.3 智能预警系统
通过配置规则引擎实现多维度的预警:
- 库存阈值预警(低于安全库存时触发)
- 物资过期预警(基于有效期字段计算)
- 巡检逾期预警(关联设备巡检模块)
预警通知支持短信、邮件、系统消息三种方式,采用观察者模式实现:
public interface AlertObserver { void update(AlertMessage message); } @Service public class SmsAlert implements AlertObserver { @Override public void update(AlertMessage message) { // 调用短信网关API } }3. 技术实现细节
3.1 后端架构设计
采用经典的三层架构:
controller(接口层) ↓ service(业务逻辑层) ↓ repository(数据访问层)性能优化要点:
- 使用Redis缓存热点物资数据(配置30分钟TTL)
- 批量操作采用Spring Batch处理
- 复杂报表查询使用MyBatis的二级缓存
3.2 前端关键技术
Vue3的主要实践:
- 使用Pinia替代Vuex进行状态管理
- 基于Element Plus构建UI组件
- 采用axios拦截器处理全局异常
- 路由守卫实现权限控制
// 典型API调用示例 const fetchMaterials = async () => { loading.value = true; try { const res = await api.get('/api/materials', { params: { page: currentPage.value } }); materialList.value = res.data; } catch (err) { ElMessage.error('获取物资列表失败'); } finally { loading.value = false; } };3.3 数据库设计
核心表结构设计:
- 物资表(em_material):存储物资基础信息
- 仓库表(em_warehouse):记录仓库位置、容量等
- 库存表(em_stock):物资与仓库的关联表
- 出入库记录表(em_record):所有物资流动记录
CREATE TABLE `em_material` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `code` VARCHAR(32) NOT NULL COMMENT '物资编码', `name` VARCHAR(100) NOT NULL, `spec` VARCHAR(100) COMMENT '规格型号', `unit` VARCHAR(20) COMMENT '计量单位', `expire_days` INT COMMENT '有效期天数', `danger_level` TINYINT COMMENT '危险等级', PRIMARY KEY (`id`), UNIQUE KEY `uk_code` (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4. 部署与运行指南
4.1 环境准备
最低配置要求:
- JDK 11+
- Node.js 16+
- MySQL 8.0+
- Redis 5.0+
推荐使用Docker快速搭建环境:
# MySQL容器 docker run -d --name em-mysql \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -p 3306:3306 mysql:8.0 # Redis容器 docker run -d --name em-redis \ -p 6379:6379 redis:5.04.2 后端启动步骤
- 导入Maven依赖
- 修改application.yml中的数据库配置
- 初始化数据库(提供schema.sql和data.sql)
- 运行SpringBoot主类
关键配置项说明:
spring: datasource: url: jdbc:mysql://localhost:3306/em?useSSL=false username: root password: yourpassword redis: host: localhost port: 63794.3 前端启动流程
- 安装依赖
npm install- 配置API基础路径
// .env.development VITE_API_BASE_URL=http://localhost:8080- 启动开发服务器
npm run dev5. 常见问题排查
5.1 数据库连接失败
现象:启动时报JDBC连接异常解决方案:
- 检查MySQL服务是否运行
- 验证application.yml中的连接参数
- 测试网络连通性:
telnet localhost 33065.2 前端跨域问题
现象:API请求被浏览器拦截解决方法:
- 后端配置CORS:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*"); } }- 或配置Nginx反向代理
5.3 性能优化实践
慢查询优化:
- 为常用查询字段添加索引
- 避免SELECT * 操作
- 大数据量分页使用游标方式
-- 优化后的分页查询 SELECT * FROM em_material WHERE id > 1000 ORDER BY id LIMIT 20;6. 扩展开发建议
6.1 移动端适配
可扩展的功能方向:
- 微信小程序扫码盘点
- APP端应急物资地图
- 移动审批流程
技术实现方案:
// 微信JS-SDK扫码示例 wx.scanQRCode({ needResult: 1, scanType: ["qrCode"], success: function(res) { const result = res.resultStr; } });6.2 物联网集成
硬件对接方案:
- 温湿度传感器数据采集(MQTT协议)
- 智能货架重量感应
- 人脸识别门禁系统
// MQTT消息处理示例 @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setServerURIs("tcp://iot-server:1883"); return factory; }这套系统在实际部署时,建议先在小规模仓库试运行1-2个月,重点验证库存准确率和预警及时性。根据我们的实施经验,初期需要重点培训保管员的扫码入库操作规范,避免因操作不当导致系统数据与实际库存出现偏差。