这个家电销售管理系统是我去年为一个区域家电连锁企业开发的实战项目,核心目标是解决他们从手工Excel管理向数字化系统转型的需求。系统上线后,门店的库存周转率提升了40%,订单处理效率提高了60%,最让我意外的是财务对账时间从原来的3天缩短到了2小时。
系统基于SpringBoot 2.7 + MyBatis-Plus + Vue.js技术栈,采用经典的RBAC权限模型,包含商品管理、采购入库、销售出库、售后管理、财务报表等核心模块。特别设计了智能库存预警机制,当库存量低于安全阈值时,会自动触发采购建议并推送给采购负责人。
后端选择SpringBoot而非传统SSM框架,主要考虑三个因素:
数据库采用MySQL 8.0,关键配置如下:
sql复制# 商品表核心字段设计
CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'SPU_ID',
`category_id` int NOT NULL COMMENT '类目ID',
`brand_id` int NOT NULL COMMENT '品牌ID',
`model` varchar(64) NOT NULL COMMENT '产品型号',
`spec_json` json DEFAULT NULL COMMENT '规格参数JSON',
`base_price` decimal(10,2) NOT NULL COMMENT '基准售价',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '上架状态',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_model` (`model`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二期项目将单体架构拆分为四个微服务:
遇到的典型问题及解决方案:
库存预警不是简单的阈值判断,而是结合了:
核心算法实现:
java复制public class PurchaseAlertService {
// 安全库存 = 日均销量 × (采购周期 + 缓冲天数) × 季节系数
public BigDecimal calculateSafetyStock(String productId) {
ProductSales sales = salesMapper.select30DaysSales(productId);
ProductSupply supply = supplyMapper.selectByProduct(productId);
BigDecimal base = sales.getDailyAvg()
.multiply(new BigDecimal(supply.getLeadDays() + 3))
.multiply(seasonFactorService.getCurrentFactor());
return base.setScale(0, RoundingMode.UP);
}
}
针对家电销售提成复杂的特点(基础提成+阶梯奖励+新品激励),设计规则引擎:
xml复制<!-- 提成规则配置示例 -->
<rule name="airConditionerBonus">
<condition>
<and>
<equals field="product.category" value="空调"/>
<greater field="amount" value="5000"/>
</and>
</condition>
<action>
<bonus rate="0.03" extra="200"/>
</action>
</rule>
618大促期间遇到的典型问题:
关键优化代码:
java复制@Transactional
public OrderResult createOrder(OrderDTO dto) {
// 分布式锁防止重复提交
String lockKey = "order:lock:" + dto.getUserId();
boolean locked = redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS);
if (!locked) throw new BusinessException("操作太频繁");
try {
// 乐观锁扣减库存
int updated = productMapper.reduceStock(
dto.getProductId(),
dto.getQuantity(),
LocalDateTime.now() // 版本号
);
if (updated == 0) throw new BusinessException("库存不足");
// 后续订单处理...
} finally {
redisLock.unlock(lockKey);
}
}
千万级销售数据查询优化方案:
为每个门店部署独立实例,数据通过ETL同步到总部,关键配置:
yaml复制# application-branch.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/branch_${store.id}
username: branch_user
password: ${DB_PASSWORD}
redis:
host: localhost
port: 6379
password: ${REDIS_PW}
采用双轨制发布流程:
现象:系统显示有库存但实际无货
排查过程:
现象:当日销售额统计不准确
排查步骤:
当前正在规划的三期改进:
这个项目给我的深刻体会是:零售系统的核心不在于技术复杂度,而在于对业务细节的把握。比如家电安装服务的调度逻辑、以旧换新的折旧计算规则等,这些业务Know-How才是系统的真正价值所在。