1. 项目概述:基于SpringBoot+Vue的供应链物资采购系统
去年接手某制造企业数字化改造项目时,我遇到了一个典型痛点:他们的采购部门还在用Excel手工记录上千种原材料采购流程,经常出现库存数据滞后、审批流程混乱的情况。为此我们开发了这套供应链管理系统(项目代号S7XF373A),采用SpringBoot+Vue技术栈实现物资全生命周期管理。系统上线后采购效率提升40%,异常响应时间从平均3天缩短到2小时内。
这套系统本质上是一个面向中大型企业的数字化采购解决方案,核心解决三个问题:
- 多品类物资的标准化管理(从螺丝钉到大型设备)
- 跨部门协作流程可视化(需求提报→比价→合同→入库)
- 实时数据驱动的决策支持(库存预警、供应商评估)
技术选型上,后端采用SpringBoot 2.7 + MyBatis-Plus的组合,前端用Vue3+Element Plus构建管理后台。特别在采购订单模块采用了RabbitMQ实现异步处理,应对高峰期每秒200+的并发创建请求。
2. 核心模块设计与技术实现
2.1 采购流程引擎设计
采购审批流程是系统的中枢神经,我们采用状态机模式实现多级流转。以生产性物资采购为例,典型状态转换如下:
java复制// 状态机配置示例
StateMachineBuilder<PurchaseState, PurchaseEvent> builder = StateMachineBuilderFactory.create();
builder.configureStates()
.withStates()
.initial(PurchaseState.DRAFT)
.state(PurchaseState.DEPARTMENT_APPROVED)
.state(PurchaseState.FINANCE_APPROVED)
.end(PurchaseState.COMPLETED);
builder.configureTransitions()
.withExternal()
.source(PurchaseState.DRAFT)
.target(PurchaseState.DEPARTMENT_APPROVED)
.event(PurchaseEvent.SUBMIT)
.action(c -> sendApprovalNotice(c.getTarget()));
关键实现细节:
- 使用Spring StateMachine框架管理状态流转
- 每个状态变更都会生成审计日志(记录操作人、时间戳、IP)
- 支持动态流程配置(不同金额触发不同审批路径)
踩坑提醒:初期直接用if-else实现状态流转,导致后期新增审批层级时不得不重构。建议复杂流程一定要用状态机模式。
2.2 实时库存管理
库存模块采用CQRS模式分离读写操作:
- 写模型:处理入库/出库指令,保证强一致性
- 读模型:Elasticsearch聚合实时库存数据
核心库存扣减逻辑(防超卖):
java复制@Transactional
public void deductStock(Long itemId, int quantity) {
// 悲观锁保证原子性
MaterialStock stock = stockMapper.selectByIdForUpdate(itemId);
if (stock.getAvailableQuantity() < quantity) {
throw new BusinessException("库存不足");
}
stock.setAvailableQuantity(stock.getAvailableQuantity() - quantity);
stockMapper.updateById(stock);
// 发送领域事件
eventPublisher.publishEvent(new StockDeductedEvent(itemId, quantity));
}
性能优化点:
- 热点数据采用Redis缓存+本地缓存二级架构
- 批量操作使用MyBatis的BatchExecutor
- 历史数据按月分表(按material_id哈希分片)
3. 前后端协同开发实践
3.1 接口规范设计
我们制定了严格的RESTful接口规范:
- 版本控制:/api/v1/purchase-orders
- 响应格式:
json复制{
"code": 200,
"data": {},
"message": "success",
"traceId": "3d3f4a1b"
}
- 错误处理:
- 400系错误:前端展示message内容
- 500错误:仅提示"系统异常",通过traceId定位问题
3.2 Vue前端工程化
项目结构采用业务模块划分:
code复制src/
├── modules/
│ ├── purchase/ # 采购模块
│ │ ├── api.js # API封装
│ │ ├── components/ # 业务组件
│ │ └── store.js # Pinia状态管理
├── core/
│ ├── axios.js # 请求拦截器
│ └── permission.js # 路由守卫
性能优化技巧:
- 使用Vite的按需加载配置:
js复制export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'pinia'],
element: ['element-plus']
}
}
}
}
})
- 表格大数据量采用虚拟滚动
- 高频操作按钮添加防抖
4. 典型问题排查实录
4.1 采购单导出内存溢出
现象:导出超过1万条记录时Node服务崩溃
排查过程:
- 通过Heapdump分析内存快照
- 发现ElementUI的table组件缓存了全部数据
- 改用流式导出方案:
java复制// 后端实现
@GetMapping("/export")
public void export(HttpServletResponse response) {
response.setContentType("application/octet-stream");
try (OutputStream os = response.getOutputStream();
ExcelWriter writer = EasyExcel.write(os).build()) {
// 分页查询写入
int page = 1;
while (true) {
Page<PurchaseOrder> data = service.getPage(page, 1000);
if (data.isEmpty()) break;
writer.write(data.getRecords(),
EasyExcel.writerSheet("Sheet1").build());
page++;
}
}
}
4.2 供应商评价计算延迟
问题:200+供应商的月度评价计算耗时超过5分钟
解决方案:
- 引入Spring Batch批处理框架
- 关键指标预计算(每日凌晨跑定时任务)
- 最终采用ForkJoinPool并行计算:
java复制public class RatingCalculator extends RecursiveTask<Map<Long, BigDecimal>> {
private final List<Supplier> suppliers;
protected Map<Long, BigDecimal> compute() {
if (suppliers.size() <= 10) {
return calculateBatch(suppliers);
}
// 任务拆分
int mid = suppliers.size() / 2;
RatingCalculator left = new RatingCalculator(suppliers.subList(0, mid));
RatingCalculator right = new RatingCalculator(suppliers.subList(mid, suppliers.size()));
left.fork();
Map<Long, BigDecimal> rightResult = right.compute();
Map<Long, BigDecimal> leftResult = left.join();
leftResult.putAll(rightResult);
return leftResult;
}
}
5. 部署与监控方案
5.1 容器化部署
Docker Compose编排关键服务:
yaml复制version: '3'
services:
app:
image: registry.cn-hangzhou.aliyuncs.com/company/supply-chain:${TAG}
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
5.2 监控指标埋点
核心监控项:
- 采购单创建耗时(P99<500ms)
- 库存查询缓存命中率(>95%)
- 消息队列积压预警(设置2000阈值)
SpringBoot Actuator配置示例:
properties复制management.endpoints.web.exposure.include=health,metrics,prometheus
management.metrics.export.prometheus.enabled=true
management.metrics.tags.application=${spring.application.name}
这套系统经过三个迭代周期后,目前日均处理采购订单1200+,管理SKU超过5万。最大的收获是认识到:在业务系统开发中,比起追求最新技术,更重要的是建立清晰的领域模型和稳健的异常处理机制。比如我们为采购模块设计的"防呆"机制——当采购员选择非生产性物资时,系统会自动检查预算科目匹配性,这种业务规则编码往往比技术实现更有价值。
