1. 项目背景与核心需求
天盛装潢公司作为一家快速发展的室内装饰企业,面临着业务规模扩大带来的管理挑战。传统Excel表格和纸质单据已无法满足材料采购、项目进度跟踪、客户沟通等核心业务需求。这套基于SpringBoot的管理系统正是为解决以下痛点而生:
- 材料管理混乱:装饰材料种类繁多(瓷砖、板材、五金等),库存变动频繁,手工记录易出错
- 项目进度失控:多个工地并行时,项目经理难以及时掌握各节点完成情况
- 财务对账困难:材料采购、人工费用、客户付款等资金流缺乏系统化追踪
- 客户体验不佳:设计方案确认、施工进度反馈等环节沟通效率低下
提示:装修行业管理系统需要特别关注材料规格参数管理(如瓷砖的色号、批次)、项目阶段划分(量房-设计-施工-验收)等业务特性
2. 技术选型与架构设计
2.1 为什么选择SpringBoot
作为Java领域最流行的微服务框架,SpringBoot在本项目中展现出三大优势:
- 快速开发:通过starter依赖一键集成MyBatis、Redis等组件,大幅减少XML配置
- 内嵌容器:无需额外部署Tomcat,打包成jar后可直接运行,降低运维复杂度
- 生态丰富:Spring生态中的Security、Batch等模块可灵活扩展系统功能
技术栈组成:
- 前端:Vue.js + ElementUI(前后端分离架构)
- 后端:SpringBoot 2.7 + MyBatis-Plus + PageHelper
- 数据库:MySQL 8.0(主从架构)+ Redis缓存
- 部署:Docker容器化 + Nginx负载均衡
2.2 核心模块划分
mermaid复制graph TD
A[客户管理] --> B[需求登记]
A --> C[合同管理]
D[项目管理] --> E[进度跟踪]
D --> F[材料调度]
G[库存管理] --> H[采购预警]
G --> I[供应商管理]
J[财务管理] --> K[收支统计]
J --> L[工资核算]
(注:实际交付时需替换为文字描述)系统采用模块化设计,各模块通过RESTful API交互。特别设计了材料二维码功能,通过扫码即可查看当前施工阶段的材料使用明细。
3. 关键业务实现细节
3.1 材料库存的实时同步
装修行业对材料库存敏感度极高,我们采用"数据库+Redis+本地缓存"三级保障机制:
-
数据库层:建立材料规格参数表,包含关键字段:
sql复制CREATE TABLE `material` ( `id` bigint NOT NULL AUTO_INCREMENT, `category` varchar(20) COMMENT '瓷砖/涂料/五金', `spec_code` varchar(50) COMMENT '规格编码', `color_no` varchar(20) COMMENT '色号', `stock` decimal(10,2) COMMENT '当前库存', `unit` varchar(10) COMMENT '单位', `safety_stock` decimal(10,2) COMMENT '安全库存', PRIMARY KEY (`id`), UNIQUE KEY `idx_spec` (`spec_code`,`color_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
缓存策略:
- 高频访问材料信息缓存到Redis,设置5分钟过期
- 使用Spring Cache抽象层实现注解式缓存
- 库存变更时通过@CacheEvict清除缓存
-
并发控制:
java复制@Transactional public boolean reduceStock(Long materialId, BigDecimal amount) { // 使用乐观锁防止超卖 int updated = materialMapper.updateStock( materialId, amount, LocalDateTime.now() // 版本标识 ); return updated > 0; }
3.2 项目进度可视化
针对装修项目多阶段特性,设计甘特图接口:
-
数据库设计:
sql复制CREATE TABLE `project_phase` ( `id` bigint NOT NULL AUTO_INCREMENT, `project_id` bigint NOT NULL, `phase_type` varchar(20) COMMENT '水电/泥木/油漆', `plan_start` date, `plan_end` date, `actual_start` date, `actual_end` date, `status` tinyint COMMENT '0未开始 1进行中 2已完成', `delay_reason` varchar(255), PRIMARY KEY (`id`) ); -
前端交互逻辑:
- 使用ECharts实现动态甘特图
- 颜色区分:绿色(按期)、黄色(预警)、红色(延期)
- 点击节点显示该阶段材料清单和工人信息
-
进度预警机制:
- 每日凌晨跑批检查即将到期阶段
- 通过企业微信机器人发送提醒
- 关键节点延迟自动触发责任追溯流程
4. 典型业务场景实现
4.1 材料采购审批流
结合装修行业特点设计的审批流程:
- 项目经理提交采购申请
- 仓库核对库存(自动读取当前库存与安全库存)
- 财务审核预算(关联项目剩余款项)
- 总经理终审(超过5万元需额外审批)
- 生成采购单同步至供应商系统
代码示例:
java复制@PostMapping("/purchase/apply")
public Result applyPurchase(@Valid @RequestBody PurchaseApplyDTO dto) {
// 1. 校验材料库存
Material material = materialService.getById(dto.getMaterialId());
if (material.getStock().compareTo(dto.getAmount()) > 0) {
throw new BusinessException("当前库存充足,无需采购");
}
// 2. 启动审批流程
String processId = activitiService.startPurchaseProcess(
dto.getProjectId(),
dto.getMaterialId(),
dto.getAmount()
);
// 3. 记录申请单
PurchaseApply apply = new PurchaseApply();
BeanUtils.copyProperties(dto, apply);
apply.setProcessId(processId);
apply.setStatus(0); // 审批中
applyMapper.insert(apply);
return Result.success(processId);
}
4.2 移动端工地打卡
针对装修工人设计的特色功能:
- GPS定位打卡:自动记录工人到达/离开工地时间
- 施工日志拍照上传:每日进度通过图片存档
- 材料使用确认:扫码关联材料与施工位置
数据库设计:
sql复制CREATE TABLE `construction_daily` (
`id` bigint NOT NULL AUTO_INCREMENT,
`project_id` bigint NOT NULL,
`worker_id` bigint NOT NULL,
`check_in` datetime COMMENT '上班打卡',
`check_out` datetime COMMENT '下班打卡',
`location` point COMMENT 'GPS坐标',
`weather` varchar(20) COMMENT '天气情况',
`progress_desc` text COMMENT '进度说明',
PRIMARY KEY (`id`),
SPATIAL KEY `idx_location` (`location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5. 部署与性能优化
5.1 生产环境配置
推荐服务器配置:
- 应用服务器:4核8G × 2(Docker容器)
- 数据库:8核16G + SSD磁盘(主从架构)
- Redis:哨兵模式3节点
关键JVM参数:
bash复制java -jar \
-Xms2048m -Xmx2048m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-Dspring.profiles.active=prod \
management-system.jar
5.2 高频查询优化
- 材料库存查询:使用Redis缓存+定时刷新策略
- 项目进度统计:建立物化视图定期预计算
- 财务汇总报表:采用ClickHouse列式存储
SQL优化示例:
sql复制-- 原慢查询
SELECT p.*, c.name FROM project p
LEFT JOIN customer c ON p.customer_id = c.id
WHERE p.status = 1;
-- 优化后
SELECT p.id, p.name, p.status, c.name AS customer_name
FROM project p
STRAIGHT_JOIN customer c ON p.customer_id = c.id
WHERE p.status = 1
USE INDEX(idx_status);
6. 踩坑与解决方案
6.1 材料规格参数冲突
初期直接使用材料名称作为唯一标识,导致:
- 同名称不同批次的瓷砖色号差异
- 规格参数变更引发历史数据混乱
解决方案:
- 建立复合唯一键(规格编码+色号+批次)
- 设计变更日志表记录参数修改历史
- 前端增加规格对比功能
6.2 高并发下单问题
促销期间多个项目经理同时申请热门材料,出现:
- 库存显示充足但实际超卖
- 数据库连接池耗尽
改进措施:
- 引入Redis分布式锁
java复制public boolean lockMaterial(Long materialId) { String key = "lock:material:" + materialId; return redisTemplate.opsForValue() .setIfAbsent(key, "1", 30, TimeUnit.SECONDS); } - 采用Sentinel限流保护核心接口
- 数据库连接池改用HikariCP
6.3 移动端图片上传失败
工地现场网络不稳定导致:
- 施工日志图片上传中断
- 重复上传产生冗余数据
优化方案:
- 实现断点续传功能
- 采用腾讯云COS对象存储
- 前端增加压缩和重试机制
这套系统上线后,天盛装潢公司的平均项目周期缩短了18%,材料浪费率下降23%。特别在2023年旺季期间,成功支撑了同时进行的57个装修项目管理。对于中小型装潢企业,建议先聚焦材料管理和进度跟踪两个核心模块,后续再逐步扩展财务和CRM功能。实际使用中发现,定期清理施工日志图片(保留最近3个月)可减少40%以上的存储空间占用。
