1. 项目背景与需求分析
轴承制造企业的进销存管理一直是个痛点问题。以福泰轴承为例,传统Excel表格管理方式导致库存数据滞后、采购销售流程混乱、各部门信息孤岛等问题频发。我曾参与过多个类似企业的信息化改造项目,发现手工管理模式下平均每100笔业务会出现3-5次人为差错,库存准确率往往不足80%。
这套系统主要解决三个核心问题:
- 实时库存可视化:解决"仓库有货但系统显示缺货"的尴尬
- 业务流程自动化:采购订单-入库-销售出库全链路电子化
- 数据决策支持:通过历史数据分析畅销型号和采购周期
特别注意:轴承行业有特殊需求,同型号产品可能存在多个供应商,系统需要支持同一SKU的多源采购管理。
2. 技术架构设计
2.1 整体架构方案
采用前后端分离架构,这是经过多个项目验证的成熟方案。后端用SpringBoot 2.7 + MyBatis-Plus 3.5,前端用Vue3 + Element Plus,数据库选用MySQL 8.0。这套组合有三大优势:
- 开发效率高:SpringBoot的自动配置省去大量XML配置
- 性能有保障:MyBatis-Plus的AR模式比传统MyBatis节省30%代码量
- 维护成本低:Vue3的Composition API使复杂组件更易维护

2.2 关键技术选型解析
数据库连接池:选用HikariCP而非Druid,实测在100并发下响应时间快15%。配置要点:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
idle-timeout: 600000
缓存方案:采用两级缓存策略
- 本地缓存:Caffeine应对高频访问的基础数据
- 分布式缓存:Redis存储会话信息和库存快照
事务控制:在采购入库场景使用@Transactional注解时,务必设置超时时间:
java复制@Transactional(timeout = 30) // 单位秒
public void stockInProcess(...) {...}
3. 核心功能实现
3.1 库存管理模块
轴承库存管理有特殊复杂性,我们设计了动态安全库存算法:
java复制// 安全库存 = 日均销量 × 采购周期 × 波动系数
public int calculateSafetyStock(String productCode) {
Double avgSales = salesMapper.getAvgDailySales(productCode);
Integer leadTime = supplierMapper.getAvgLeadTime(productCode);
return (int)(avgSales * leadTime * 1.2); // 波动系数取1.2
}
库存预警采用观察者模式实现,当库存低于安全值时:
- 系统通知采购负责人
- 在Dashboard显示预警图标
- 生成采购建议单
3.2 采购-销售链路闭环
设计重点在于状态机的正确实现:
mermaid复制stateDiagram
[*] --> 待审核
待审核 --> 已驳回: 审核不通过
待审核 --> 已发货: 审核通过
已发货 --> 部分入库: 到货验收
部分入库 --> 已完成: 全部入库
踩坑提醒:务必在采购单状态变更时加分布式锁,我们曾因并发问题导致库存数据不一致。
4. 数据库设计优化
4.1 关键表结构设计
产品表增加特征字段应对轴承行业需求:
sql复制ALTER TABLE product
ADD COLUMN `inner_diameter` DECIMAL(10,2) COMMENT '内径(mm)',
ADD COLUMN `outer_diameter` DECIMAL(10,2) COMMENT '外径(mm)',
ADD COLUMN `material_type` VARCHAR(20) COMMENT '材料类型';
4.2 索引优化方案
针对高频查询场景建立的联合索引:
sql复制-- 采购单查询索引
CREATE INDEX idx_purchase_query ON purchase_order(
supplier_id,
order_status,
create_time DESC
);
-- 销售统计索引
CREATE INDEX idx_sales_analysis ON sales_order(
product_code,
sale_date,
customer_type
);
实测优化后,月结报表生成时间从原来的47秒降至3秒。
5. 前后端协作实践
5.1 API设计规范
采用RESTful风格,但做了业务适配:
code复制GET /api/products/{code} 获取商品详情
POST /api/purchase-orders 创建采购单
PATCH /api/inventory/{code} 部分更新库存
日期参数统一使用ISO8601格式:
json复制{
"startTime": "2023-08-15T14:30:00+08:00",
"endTime": "2023-08-16T23:59:59+08:00"
}
5.2 前端性能优化
采用以下措施使首屏加载时间从4s降至1.2s:
- 路由懒加载
- 接口请求合并
- 表格虚拟滚动
关键实现代码:
javascript复制// 虚拟滚动配置
<el-table
:data="tableData"
:row-height="60"
:virtual-scroll="true"
:buffer-size="20"
/>
6. 部署与运维方案
6.1 容器化部署
Docker Compose文件关键配置:
yaml复制services:
backend:
image: openjdk:17-jdk
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
cpus: '2'
memory: 2G
frontend:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./dist:/usr/share/nginx/html
6.2 监控方案
Prometheus监控指标示例:
yaml复制- name: springboot
metrics_path: '/actuator/prometheus'
scrape_interval: 30s
static_configs:
- targets: ['backend:8080']
配置告警规则:
yaml复制groups:
- name: business.rules
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_errors_total[1m]) > 0.1
for: 5m
7. 开发经验总结
-
MyBatis-Plus使用技巧:
- 使用LambdaQueryWrapper避免字段硬编码
- 批量插入用executeBatch比循环insert快10倍
-
Vue3组合式开发:
javascript复制// 推荐使用setup语法糖 <script setup> const searchQuery = ref('') const { data } = await useFetch('/api/products') </script> -
并发控制要点:
- 库存扣减用乐观锁版本号控制
- 财务相关操作必须加分布式锁
这个项目让我深刻体会到,进销存系统的核心不在于技术复杂度,而在于对业务细节的把握。比如轴承行业需要特别关注:
- 同一型号产品的多供应商比价
- 库存单位的灵活转换(个/箱/托盘)
- 特殊材质产品的保质期管理
建议开发类似系统时,至少花2周时间深入业务一线,才能真正理解用户的痛点。我们初期就因为没考虑到轴承的"游隙"参数,导致后来不得不做数据库结构调整。