一、系统架构设计
1. 核心模块划分
- 仓库基础信息管理:维护仓库位置、容量、类型等基本信息
- 库存管理:实时跟踪各仓库库存状态,支持多维度查询
- 调拨管理:处理仓库间商品调拨流程
- 订单分配:根据库存和位置智能分配订单到最优仓库
- 报表分析:提供库存周转率、仓库利用率等关键指标
2. 技术架构
- 前端:React/Vue + Ant Design Pro (管理后台)
- 后端:Spring Cloud微服务架构
- 数据库:MySQL(主库) + Redis(缓存) + MongoDB(日志/分析)
- 中间件:RabbitMQ(消息队列)、Elasticsearch(搜索)
- 部署:Docker + Kubernetes容器化部署
二、多仓库管理核心功能实现
1. 仓库模型设计
```java
public class Warehouse {
private Long id;
private String code; // 仓库编码
private String name; // 仓库名称
private String region; // 所属区域
private String address; // 详细地址
private Double longitude; // 经度
private Double latitude; // 纬度
private WarehouseType type; // 仓库类型(中心仓/区域仓/前置仓)
private Integer capacity; // 总容量
private Integer usedCapacity; // 已用容量
// 其他属性...
}
```
2. 库存管理实现
- 库存模型:
```java
public class Inventory {
private Long id;
private Long warehouseId; // 所属仓库ID
private Long productId; // 商品ID
private Integer quantity; // 当前库存量
private Integer lockedQuantity;// 锁定库存(待出库)
private Date updateTime; // 最后更新时间
// 其他属性...
}
```
- 库存服务接口:
```java
public interface InventoryService {
// 查询库存
InventoryDetail getInventory(Long warehouseId, Long productId);
// 锁定库存(下单时调用)
boolean lockInventory(LockInventoryRequest request);
// 释放库存(取消订单时调用)
boolean unlockInventory(UnlockInventoryRequest request);
// 扣减库存(出库时调用)
boolean deductInventory(DeductInventoryRequest request);
// 增加库存(入库时调用)
boolean increaseInventory(IncreaseInventoryRequest request);
}
```
3. 智能订单分配算法
```java
public class OrderAllocationStrategy {
public Warehouse allocateWarehouse(Order order, List
candidates) {
// 1. 过滤掉库存不足的仓库
List validWarehouses = candidates.stream()
.filter(w -> hasEnoughStock(w, order.getItems()))
.collect(Collectors.toList());
if (validWarehouses.isEmpty()) {
throw new BusinessException("无可用仓库");
}
// 2. 按距离和库存综合评分排序
return validWarehouses.stream()
.max(Comparator.comparingDouble(w ->
calculateScore(w, order.getDeliveryAddress())
))
.orElseThrow();
}
private double calculateScore(Warehouse warehouse, Address deliveryAddress) {
// 距离权重0.6,库存权重0.4
double distanceScore = calculateDistanceScore(warehouse, deliveryAddress);
double stockScore = calculateStockScore(warehouse, orderItems);
return distanceScore * 0.6 + stockScore * 0.4;
}
}
```
4. 调拨管理实现
```java
public class TransferServiceImpl implements TransferService {
@Override
@Transactional
public TransferOrder createTransfer(TransferRequest request) {
// 1. 验证库存
validateSourceInventory(request);
// 2. 创建调拨单
TransferOrder order = new TransferOrder();
order.setCode(generateCode());
order.setStatus(TransferStatus.PENDING);
// 设置其他属性...
// 3. 锁定源仓库库存
lockSourceInventory(request, order);
// 4. 保存调拨单
transferOrderRepository.save(order);
return order;
}
@Override
public void confirmReceipt(Long transferId) {
TransferOrder order = findById(transferId);
if (order.getStatus() != TransferStatus.IN_TRANSIT) {
throw new BusinessException("状态不正确");
}
// 1. 更新目标仓库库存
updateTargetInventory(order);
// 2. 释放源仓库锁定库存
releaseSourceLock(order);
// 3. 更新调拨单状态
order.setStatus(TransferStatus.COMPLETED);
order.setCompleteTime(new Date());
save(order);
}
}
```
三、关键技术实现
1. 分布式库存锁
```java
public class DistributedInventoryLock {
private final RedisTemplate redisTemplate;
public boolean tryLock(String lockKey, String requestId, int expireSeconds) {
return Boolean.TRUE.equals(redisTemplate.opsForValue()
.setIfAbsent(lockKey, requestId, expireSeconds, TimeUnit.SECONDS));
}
public boolean releaseLock(String lockKey, String requestId) {
String value = (String) redisTemplate.opsForValue().get(lockKey);
if (requestId.equals(value)) {
return Boolean.TRUE.equals(redisTemplate.delete(lockKey));
}
return false;
}
}
```
2. 库存同步机制
- 最终一致性方案:
- 使用消息队列实现异步库存更新
- 本地消息表保证消息不丢失
- 定时任务补偿机制
```java
@Transactional
public void updateInventoryAsync(UpdateInventoryEvent event) {
// 1. 保存事件到本地消息表
messageRepository.save(convertToMessage(event));
// 2. 发送到MQ
rabbitTemplate.convertAndSend("inventory.update", event);
}
// 消费者
@RabbitListener(queues = "inventory.update")
public void processInventoryUpdate(UpdateInventoryEvent event) {
try {
inventoryService.update(event);
// 标记消息为已处理
messageService.markAsProcessed(event.getMessageId());
} catch (Exception e) {
// 记录失败,等待重试或人工干预
log.error("库存更新失败", e);
}
}
```
3. 库存预警机制
```java
public class InventoryAlertService {
@Scheduled(cron = "0 0/30 * * * ?") // 每30分钟执行一次
public void checkInventoryAlerts() {
List warehouses = warehouseRepository.findAll();
warehouses.forEach(warehouse -> {
List products = productRepository.findAll();
products.forEach(product -> {
Inventory inventory = inventoryRepository.findByWarehouseAndProduct(
warehouse.getId(), product.getId());
if (inventory != null) {
// 检查最低库存预警
if (inventory.getQuantity() <= product.getMinStock()) {
alert(warehouse, product, AlertType.LOW_STOCK);
}
// 检查最高库存预警
if (inventory.getQuantity() >= product.getMaxStock()) {
alert(warehouse, product, AlertType.OVER_STOCK);
}
// 检查临期预警
checkExpiryAlert(warehouse, product);
}
});
});
}
}
```
四、系统优化建议
1. 性能优化:
- 对库存查询使用Redis缓存热点数据
- 实现库存分片存储,按仓库ID分库分表
- 使用批量操作减少数据库交互
2. 高可用设计:
- 核心服务部署多节点
- 数据库主从复制+读写分离
- 实现服务降级和熔断机制
3. 数据一致性:
- 采用TCC或SAGA模式处理分布式事务
- 实现库存操作的幂等性
- 重要操作记录操作日志
4. 扩展性考虑:
- 仓库模型支持动态扩展字段
- 策略模式实现不同的订单分配策略
- 插件化架构支持新增仓库类型
五、实施路线图
1. 第一阶段(1-2个月):
- 完成仓库基础信息管理模块
- 实现单仓库库存管理
- 搭建基础技术框架
2. 第二阶段(2-3个月):
- 实现多仓库库存同步机制
- 开发调拨管理功能
- 实现基本订单分配逻辑
3. 第三阶段(1-2个月):
- 优化智能订单分配算法
- 实现库存预警系统
- 完善报表分析功能
4. 第四阶段(持续):
- 系统性能优化
- 新功能迭代
- 运营监控体系建设
以上方案可根据美菜生鲜的实际业务需求和技术栈进行调整,重点需要解决多仓库间的库存同步、数据一致性和智能分配等核心问题。