1. 项目概述
这个工厂车间管理系统采用前后端分离架构,前端使用Vue.js框架,后端基于SpringBoot构建,数据存储选用MySQL关系型数据库,ORM层采用MyBatis实现数据持久化。系统主要面向制造业企业的生产管理场景,实现从原材料入库到成品出库的全流程数字化管控。
在实际开发中,我们遇到了几个典型挑战:如何实现高并发下的工单状态同步、如何优化BOM(物料清单)的多级关联查询、以及如何确保不同角色(操作工、班组长、车间主任)的操作权限隔离。系统最终实现了工单派发、设备管理、质量检验等12个核心模块,日均处理工单量可达3000+。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 后端技术栈选型
选择SpringBoot 2.7.x版本主要基于:
- 内嵌Tomcat简化部署
- 自动配置减少XML配置
- 完善的监控端点(Actuator)
- 与MyBatis的天然集成
数据库选用MySQL 8.0考虑因素:
- 事务支持满足工单状态一致性要求
- 窗口函数便于生产报表统计
- JSON类型字段存储动态表单数据
MyBatis配置关键点:
xml复制<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="defaultFetchSize" value="1000"/>
</settings>
2.2 前端架构方案
Vue 3组合式API的优势:
- 按功能组织代码(工单管理、设备监控等)
- 更好的TypeScript支持
- Composition API复用逻辑代码
典型页面结构示例:
code复制/src
/views
/production
WorkOrder.vue // 工单管理
Equipment.vue // 设备监控
/stores
production.js // Pinia状态管理
3. 核心功能实现
3.1 工单状态机设计
采用状态模式实现工单流转:
java复制public interface OrderState {
void confirm(WorkOrder order);
void start(WorkOrder order);
void complete(WorkOrder order);
void reject(WorkOrder order);
}
@Component
@Scope("prototype")
public class PendingState implements OrderState {
// 实现状态转换逻辑
}
状态转换时序:
- 创建后进入"待确认"状态
- 班组长确认后变为"待生产"
- 操作工点击开始进入"生产中"
- 质检通过后标记为"已完成"
3.2 实时数据看板
WebSocket配置关键代码:
java复制@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.withSockJS();
}
}
前端订阅示例:
javascript复制const stompClient = new StompJs.Client({
brokerURL: 'ws://localhost:8080/ws'
});
stompClient.subscribe('/topic/production', (message) => {
this.realTimeData = JSON.parse(message.body);
});
4. 性能优化实践
4.1 MySQL查询优化
针对BOM多级查询问题:
- 使用CTE递归查询:
sql复制WITH RECURSIVE bom_tree AS (
SELECT * FROM bom WHERE parent_id IS NULL
UNION ALL
SELECT b.* FROM bom b JOIN bom_tree bt ON b.parent_id = bt.id
)
SELECT * FROM bom_tree;
- 添加复合索引:
sql复制ALTER TABLE work_order
ADD INDEX idx_floor_status (workshop_floor, status);
4.2 缓存策略设计
采用多级缓存方案:
- 本地Caffeine缓存高频访问的工序数据
- Redis缓存共享的设备状态信息
- 缓存击穿防护:
java复制@Cacheable(value = "processes", key = "#id",
unless = "#result == null",
cacheManager = "caffeineCacheManager")
public Process getProcessById(Long id) {
// 查询数据库
}
5. 安全控制实现
5.1 权限控制模型
RBAC与ABAC结合方案:
- 角色:operator, supervisor, manager
- 资源:workOrder, equipment, qualityCheck
- 操作:create, read, update, delete
Spring Security配置示例:
java复制http.authorizeRequests()
.antMatchers("/api/workOrder/**")
.hasAnyRole("SUPERVISOR", "MANAGER")
.antMatchers(HttpMethod.POST, "/api/quality/**")
.hasRole("QUALITY_INSPECTOR");
5.2 数据安全措施
- 敏感字段加密:
java复制@ColumnTransformer(
read = "AES_DECRYPT(UNHEX(employee_id_card), 'encryptionKey')",
write = "HEX(AES_ENCRYPT(?, 'encryptionKey'))"
)
private String idCardNumber;
- SQL注入防护:
- 严格使用MyBatis参数绑定
- 启用mybatis-filter插件:
xml复制<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
<property name="sqlParser" value="blockAttack"/>
</plugin>
6. 部署与监控
6.1 容器化部署
Dockerfile示例:
dockerfile复制FROM openjdk:17-jdk-slim
COPY target/workshop-system.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
docker-compose编排:
yaml复制services:
app:
image: workshop-system:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
6.2 监控方案
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['host.docker.internal:8080']
Grafana看板指标:
- JVM内存使用率
- 工单处理吞吐量
- 数据库连接池状态
- API响应时间P99
7. 典型问题排查
7.1 工单状态不同步
问题现象:
- 前端显示状态滞后于实际状态
- 多人操作同一工单时状态冲突
解决方案:
- 引入乐观锁机制:
java复制@Version
private Integer version;
- 增加WebSocket状态广播:
java复制@Transactional
public void updateOrderStatus(Long orderId, Status newStatus) {
// 更新数据库
simpMessagingTemplate.convertAndSend(
"/topic/orderStatus",
new StatusUpdate(orderId, newStatus));
}
7.2 批量导入超时
优化方案:
- 采用分批次提交:
java复制@Transactional
public void batchImport(List<Material> materials) {
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
MaterialMapper mapper = session.getMapper(MaterialMapper.class);
for (int i = 0; i < materials.size(); i++) {
mapper.insert(materials.get(i));
if (i % 500 == 0 || i == materials.size() - 1) {
session.commit();
session.clearCache();
}
}
} finally {
session.close();
}
}
- 增加前端断点续传功能
8. 扩展功能实现
8.1 移动端适配
Vue响应式布局要点:
css复制@media (max-width: 768px) {
.data-table {
grid-template-columns: repeat(2, 1fr);
}
}
PWA配置关键步骤:
- 注册Service Worker
- 配置manifest.json
- 实现离线缓存策略
8.2 第三方集成
ERP系统对接方案:
- 提供RESTful API
- 支持Webhook回调通知
- 数据格式转换中间层
MES系统数据同步:
java复制@Scheduled(cron = "0 0/5 * * * ?")
public void syncProductionData() {
// 调用MES接口获取数据
// 转换后存入本地数据库
}
9. 测试策略
9.1 单元测试重点
MyBatis Mapper测试:
java复制@SpringBootTest
class MaterialMapperTest {
@Autowired
private MaterialMapper mapper;
@Test
@Transactional
@Rollback
void testBatchInsert() {
// 测试数据准备
int result = mapper.batchInsert(materials);
assertEquals(50, result);
}
}
9.2 压力测试方案
JMeter测试场景:
- 模拟50并发工单提交
- 持续30分钟稳定性测试
- 混合读写场景(70%查询,30%更新)
关键监控指标:
- 平均响应时间<500ms
- 错误率<0.1%
- CPU利用率<70%
10. 项目演进方向
-
引入预测性维护:
- 设备传感器数据采集
- 机器学习模型训练
- 异常预警机制
-
质量分析看板:
- 缺陷帕累托图
- 过程能力指数(CPK)计算
- 相关性分析
-
数字孪生集成:
- 3D车间建模
- 实时数据映射
- 模拟优化方案
在实施过程中我们发现,合理的领域划分(如将生产、设备、质量等子域明确分离)对后期功能扩展至关重要。对于中小型制造企业,建议先实现核心的工单跟踪和设备管理功能,再逐步扩展高级功能模块。
