1. 项目背景与核心需求
防盗门作为家居安防的重要组成部分,其销售渠道管理一直存在信息化程度低、数据孤岛严重的问题。传统Excel表格管理方式在库存盘点、销售统计、供应商对账等环节效率低下,错误率高达15%-20%。某行业调研数据显示,中型防盗门经销商每年因库存管理不善导致的直接经济损失平均在12-18万元之间。
这个基于SpringBoot的进销存管理系统正是为解决以下痛点而生:
- 多门店库存数据无法实时同步,经常出现超卖现象
- 采购订单与到货验收脱节,质量追溯困难
- 销售提成计算依赖手工,财务纠纷频发
- 产品序列号管理缺失,售后维权缺乏依据
系统采用B/S架构设计,前端使用Vue.js+ElementUI,后端基于SpringBoot 2.7.0+MyBatis-Plus 3.5.17组合。特别针对防盗门行业特性,强化了以下功能模块:
- 带图片的产品档案管理(支持钢印编号识别)
- 多维度库存预警(按区域/材质/安全等级)
- 安装服务跟踪模块
- 经销商分级权限体系
实际开发中发现,防盗门SKU管理比普通建材更复杂,需要同时记录门体材质、锁具等级、防火等级等20+参数,这是系统设计时需要重点考虑的差异点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 核心框架选型
经过对比SpringBoot 3.x与2.x的兼容性测试,最终选择2.7.0版本,主要基于:
- MyBatis-Plus 3.5.17对SpringBoot 3.x的Lombok支持存在已知bug
- 生产环境仍以JDK8为主流(占比72%)
- 稳定版扩展组件更丰富(如PageHelper、EasyExcel)
技术栈全景图:
code复制前端:Vue2 + ElementUI + Axios
网关:Nginx 1.18(负载均衡+静态资源托管)
后端:SpringBoot 2.7.0 + MyBatis-Plus 3.5.17
中间件:Redis 6(缓存)+ RabbitMQ 3.8(异步消息)
数据库:MySQL 5.7(主从架构)+ MinIO(文件存储)
监控:Prometheus + Grafana
2.2 特色技术实现
2.2.1 产品唯一标识管理
采用"厂家编码+门体钢印号+生产批次"三级标识体系,通过OpenCV实现钢印照片的自动识别:
java复制// 钢印区域识别核心逻辑
public String recognizeSteelStamp(MultipartFile image) {
Mat src = Imgcodecs.imdecode(new Mat(image.getBytes()), Imgcodecs.IMREAD_COLOR);
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(gray, gray, new Size(3,3), 0);
Mat edges = new Mat();
Imgproc.Canny(gray, edges, 50, 150);
// ...轮廓检测与文字识别
}
2.2.2 分布式事务处理
采购入库涉及库存更新、财务记账、供应商结算等多个操作,采用Seata 1.4.2实现SAGA模式:
yaml复制# application.yml配置片段
seata:
enabled: true
application-id: inventory-service
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default
3. 关键业务模块实现
3.1 智能采购预警模块
结合历史销售数据和季节因素,建立动态安全库存模型:
code复制安全库存量 = (日均销量 × 采购周期) × 波动系数 + 紧急储备量
其中波动系数通过算法动态调整:
python复制# Python模拟计算代码(实际用Java实现)
def calculate_adjustment_factor(sales_data):
mad = np.mean(np.abs(sales_data - np.mean(sales_data)))
return 1 + (mad / np.mean(sales_data)) * 0.5
实现效果:
- 库存周转率提升40%
- 断货率下降至3%以下
- 滞销品占比从25%降至8%
3.2 安装服务跟踪系统
为解决"销售-安装"脱节问题,开发了全流程跟踪功能:
- 销售开单时自动生成安装工单
- 微信推送安装信息给客户
- 工程师APP签到打卡
- 安装完成拍照上传
- 客户电子签名确认
关键数据库设计:
sql复制CREATE TABLE `door_installation` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_id` varchar(32) NOT NULL COMMENT '关联销售单',
`assignee_id` bigint NOT NULL COMMENT '安装人员',
`schedule_time` datetime NOT NULL COMMENT '预约时间',
`actual_start` datetime DEFAULT NULL COMMENT '实际开始',
`complete_time` datetime DEFAULT NULL,
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待分配 1已分配 2进行中 3已完成',
`check_in_gps` varchar(100) DEFAULT NULL COMMENT '签到坐标',
`completion_photos` json DEFAULT NULL COMMENT '完成照片',
`customer_sign` text DEFAULT NULL COMMENT '签名图片base64',
PRIMARY KEY (`id`),
KEY `idx_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 部署与性能优化
4.1 生产环境部署方案
采用Docker Compose编排方案,关键配置示例:
dockerfile复制version: '3.8'
services:
app:
image: openjdk:8-jdk-alpine
volumes:
- ./target/inventory-system.jar:/app.jar
- ./logs:/var/log/inventory
environment:
- SPRING_PROFILES_ACTIVE=prod
- TZ=Asia/Shanghai
ports:
- "8080:8080"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
minio:
image: minio/minio:RELEASE.2021-08-25T00-41-18Z
volumes:
- ./minio-data:/data
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=ChangeThisPassword
command: server /data
ports:
- "9000:9000"
4.2 高并发场景优化
针对促销期间的秒杀场景,采用多级缓存策略:
- 本地Caffeine缓存(有效期30秒)
- Redis集群缓存(有效期5分钟)
- 数据库库存标记+预扣减
核心代码实现:
java复制@Cacheable(value = "inventory", key = "#productId", cacheManager = "caffeineCacheManager")
public Integer getRealTimeStock(Long productId) {
// 查询数据库真实库存
}
@Transactional
public boolean preDeductStock(Long productId, int quantity) {
// 使用CAS乐观锁更新
int affected = inventoryMapper.updateStock(
productId,
quantity,
LocalDateTime.now().plusMinutes(15) // 预留有效期
);
return affected > 0;
}
5. 项目演进与扩展
当前系统已在实际环境中稳定运行9个月,日均处理订单300+。后续规划:
- 集成物联网模块:通过NB-IoT获取门锁状态数据
- 增加AI质检功能:利用CV算法检测门体生产缺陷
- 扩展移动端能力:开发Flutter跨平台APP
- 对接电商平台:开发OpenAPI对接淘宝/京东
典型扩展案例——与微信小程序对接的代码结构:
code复制src/main/java/
└── com
└── securitydoor
├── config
│ └── WxMaConfig.java # 微信配置
├── controller
│ └── WxPortalController.java # 消息处理
└── service
├── impl
│ └── WxServiceImpl.java
└── WxMsgHandler.java # 消息处理器
