1. 项目背景与核心需求
服装行业作为典型的快消领域,库存管理直接影响企业现金流和运营效率。传统Excel手工记账方式存在数据孤岛、实时性差、盘点耗时长等问题。我在大三实习期间曾目睹某服装品牌因库存数据滞后导致促销商品缺货,单日损失超15万元,这促使我选择库存系统作为毕业设计课题。
SpringBoot的自动配置特性完美匹配中小服装企业的技术现状。通过对比JFinal和SpringBoot的启动时间(实测SpringBoot 2.7.3平均启动耗时2.8秒,比JFinal慢0.5秒但生态更完善),最终选用SpringBoot+MyBatis-Plus技术栈。系统需实现以下核心功能:
- 实时库存水位监控(含安全库存预警)
- 多维度库存分析(SKU/颜色/尺码/门店)
- 采购建议生成(基于销售周期动态计算)
- 移动端盘点支持(PDA扫码)
关键设计约束:系统需在2000个SKU量级下保持响应时间<500ms,这对关联查询优化提出挑战
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型决策树
面对服装行业季节性爆发的业务特点,技术选型需重点考虑弹性扩展能力。经过压力测试对比(JMeter模拟500并发):
- 数据库:MySQL 8.0 vs PostgreSQL
- MySQL在简单查询场景快12%,但PG的JSONB类型更适合服装属性存储
- 最终采用MySQL分区表(按季节划分)+Redis缓存热销款数据
- 前端:Vue.js vs React
- 开发效率相当,但Ant Design Pro的表格组件更适合库存报表展示
- 报表引擎:EasyExcel vs POI-TL
- EasyExcel导出10万行数据内存占用降低60%
2.2 核心表结构设计
服装行业的SKU复杂性体现在多维属性上。采用"基础商品表+属性关联表"的范式设计:
sql复制CREATE TABLE `product` (
`id` BIGINT PRIMARY KEY,
`spu_code` VARCHAR(32) COMMENT '标准款编码',
`name` VARCHAR(64) COMMENT '商品名称',
`category_id` INT COMMENT '类目ID',
`season` ENUM('SPRING','SUMMER','AUTUMN','WINTER') COMMENT '季节属性'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `sku` (
`id` BIGINT PRIMARY KEY,
`product_id` BIGINT COMMENT '关联商品ID',
`color` VARCHAR(16) COMMENT '颜色',
`size` VARCHAR(8) COMMENT '尺码',
`barcode` VARCHAR(32) UNIQUE COMMENT '国际条码',
`stock` INT DEFAULT 0 COMMENT '当前库存',
`safety_stock` INT COMMENT '安全库存'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
踩坑记录:初期未建立size/color的字典表,导致"深蓝色"和"DarkBlue"被系统识别为不同颜色,后期通过正则清洗数据耗时3天
3. 核心功能实现
3.1 动态库存扣减策略
服装行业存在预售、调拨等复杂场景,采用"预占+实际扣减"双阶段模式:
java复制@Transactional
public Result deductStock(Long skuId, Integer num, DeductType type) {
// 1. 检查库存可用性(包含已预占未扣减部分)
SkuStock stock = skuMapper.selectStockForUpdate(skuId);
if(stock.getAvailable() < num) {
return Result.fail("库存不足");
}
// 2. 根据业务类型处理
switch(type) {
case ONLINE_ORDER:
stock.setPreOccupied(stock.getPreOccupied() + num); // 预占
break;
case OFFLINE_SALE:
stock.setActual(stock.getActual() - num); // 直接扣减
break;
case TRANSFER_OUT:
stock.setActual(stock.getActual() - num);
stock.setInTransit(stock.getInTransit() + num); // 在途库存
break;
}
// 3. 记录库存流水
stockFlowMapper.insert(new StockFlow(skuId, num, type));
return Result.success();
}
3.2 智能补货算法
基于移动加权平均法计算补货量,核心公式:
code复制补货量 = MAX(日均销量 × 备货周期 × 安全系数 - 当前库存 - 在途采购, 0)
其中日均销量采用时间衰减权重:
java复制public double calculateDailySales(Long skuId) {
List<SaleRecord> records = saleMapper.selectLast30Days(skuId);
return records.stream()
.mapToDouble(r -> r.getQuantity() * Math.pow(0.95, Duration.between(r.getSaleTime(), LocalDateTime.now()).toDays()))
.sum() / 30;
}
4. 性能优化实践
4.1 热点库存解决方案
双十一期间某爆款卫衣的库存操作QPS达到1200+,通过三级缓存策略应对:
- 第一层:本地Caffeine缓存(有效期5秒)
- 第二层:Redis集群(Lua脚本保证原子性)
- 第三层:数据库分片(按SKU尾号分8个库)
压测数据对比:
| 方案 | 1000QPS成功率 | 平均响应时间 |
|---|---|---|
| 纯数据库 | 38% | 2.3s |
| Redis+数据库 | 89% | 320ms |
| 三级缓存 | 99.6% | 28ms |
4.2 分布式事务处理
跨门店调拨涉及分布式事务,采用Seata的AT模式+补偿机制:
java复制@GlobalTransactional
public void transferStock(Long fromStore, Long toStore, Long skuId, Integer num) {
// 调出方扣减
inventoryService.reduce(fromStore, skuId, num);
// 调入方增加
inventoryService.add(toStore, skuId, num);
// 记录调拨单
transferMapper.insert(new Transfer(fromStore, toStore, skuId, num));
}
经验:Seata的undo_log表需要单独监控,曾因日志堆积导致磁盘爆满
5. 毕业论文专项建议
5.1 系统特色提炼方向
建议在论文中重点突出:
- 行业适配性:针对服装行业特有的SKU管理方案
- 技术创新点:如基于时间衰减的销量预测算法
- 实证数据:压测指标、上线前后库存周转率对比
5.2 论文结构优化
推荐采用以下章节框架:
code复制第3章 系统设计
3.1 库存模型设计 → 重点说明SPU/SKU分离设计
3.2 并发控制方案 → 对比乐观锁/悲观锁选型依据
3.3 预警机制实现 → 滑动时间窗算法应用
第4章 实施效果
4.1 性能测试 → JMeter+Arthas监控数据
4.2 业务价值 → 某客户库存准确率从78%提升至99.2%
5.3 答辩常见问题准备
根据导师关注点预测可能问题:
- "与现有商业系统(如金蝶)的区别是什么?"
→ 强调轻量级、定制化程度高 - "算法有没有理论支撑?"
→ 引用《供应链管理》中的安全库存公式 - "系统扩展性如何?"
→ 演示通过K8s Horizontal Pod Autoscaler实现自动扩容
我在项目验收时被问到"如何保证Redis与数据库一致性",现场画出了监听binlog的同步方案图获得加分。建议准备3-5张核心架构图备用
