船舶维保管理系统是航运企业数字化升级的关键基础设施。传统纸质工单和Excel管理方式存在响应滞后、数据孤岛、维保记录追溯困难等痛点。我们团队基于SpringBoot+Vue3+MyBatis技术栈开发的这套系统,实现了从故障申报到闭环处理的全流程数字化管理。系统上线后帮助某港口集团将平均维修响应时间从48小时缩短至6小时,备件库存周转率提升35%。
这套方案采用前后端分离架构,前端使用Vue3组合式API开发,后端基于SpringBoot 2.7实现RESTful接口,数据持久层采用MyBatis-Plus增强工具。特别针对船舶维保场景设计了以下特色功能:
Vue3作为主流前端框架,在本项目中发挥三大优势:
组合式API:将工单状态管理、备件查询等逻辑封装成可复用hook
javascript复制// useWorkOrder.js
export default function() {
const priorityColors = computed(() => ({
'CRITICAL': '#ff4d4f',
'HIGH': '#faad14',
'MEDIUM': '#1890ff'
}))
const calcPriority = (downtimeCost, equipmentLevel) => {
// 优先级算法实现
}
return { priorityColors, calcPriority }
}
TypeScript支持:定义严谨的接口类型
typescript复制interface WorkOrder {
id: string
vesselId: number
faultCode: string
priority: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW'
}
可视化方案:
SpringBoot采用多模块设计:
code复制com.ship.maintenance
├── admin # 管理端API
├── api # 移动端API
├── job # 定时任务
└── common # 公共模块
核心配置示例:
yaml复制# 工单状态机配置
spring:
statemachine:
states:
- UNASSIGNED
- DIAGNOSING
- WAITING_PARTS
- REPAIRING
transitions:
- source: UNASSIGNED, target: DIAGNOSING
MyBatis-Plus增强功能应用:
sql复制CREATE TABLE `work_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`vessel_id` bigint NOT NULL COMMENT '船舶ID',
`fault_code` varchar(32) NOT NULL COMMENT '故障代码',
`priority` tinyint NOT NULL DEFAULT 3 COMMENT '1-CRITICAL 2-HIGH 3-MEDIUM 4-LOW',
`downtime_cost` decimal(12,2) COMMENT '停机损失(元/小时)',
`current_state` varchar(20) DEFAULT 'UNASSIGNED',
PRIMARY KEY (`id`),
KEY `idx_vessel` (`vessel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `maintenance_knowledge` (
`id` bigint NOT NULL,
`fault_phenomenon` varchar(200) NOT NULL,
`root_cause` text,
`solution` text,
`vector_embedding` blob COMMENT '知识向量',
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_phenomenon` (`fault_phenomenon`)
) ENGINE=InnoDB;
查询优化:
xml复制<cache eviction="LRU" flushInterval="60000" size="1024"/>
分库分表策略:
数据归档方案:
java复制@Scheduled(cron = "0 0 3 * * ?")
public void archiveOldOrders() {
// 归档一年前的工单
}
状态机设计采用Spring StateMachine:
java复制@Configuration
@EnableStateMachine
public class WorkOrderStateMachineConfig {
@Bean
public StateMachine<WorkOrderState, WorkOrderEvent> stateMachine() {
StateMachineBuilder.Builder<WorkOrderState, WorkOrderEvent> builder = StateMachineBuilder.builder();
builder.configureStates()
.withStates()
.initial(WorkOrderState.UNASSIGNED)
.states(EnumSet.allOf(WorkOrderState.class));
builder.configureTransitions()
.withExternal()
.source(WorkOrderState.UNASSIGNED)
.target(WorkOrderState.DIAGNOSING)
.event(WorkOrderEvent.ASSIGN);
return builder.build();
}
}
基于知识图谱的推荐算法:
java复制public List<SparePart> recommendParts(Long workOrderId) {
WorkOrder order = workOrderMapper.selectById(workOrderId);
List<String> keywords = nlpService.extractKeywords(order.getDescription());
return knowledgeGraphMapper.selectRelatedParts(
keywords,
order.getEquipmentType()
);
}
Docker Compose编排:
yaml复制version: '3'
services:
app:
image: ship-maintenance:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
Prometheus监控指标暴露:
java复制@Bean
MeterRegistryCustomizer<PrometheusMeterRegistry> configureMetrics() {
return registry -> registry.config().commonTags("application", "ship-maintenance");
}
关键监控项:
Vue3组合式API的陷阱:
MyBatis批量插入优化:
java复制@Insert("<script>" +
"INSERT INTO spare_part_usage (order_id, part_id) VALUES " +
"<foreach collection='list' item='item' separator=','>(#{item.orderId}, #{item.partId})</foreach>" +
"</script>")
void batchInsert(@Param("list") List<SparePartUsage> usages);
Spring事务失效场景:
前端性能优化:
物联网集成:
移动端适配:
数据分析扩展:
sql复制-- 故障根本原因分析
WITH RECURSIVE cause_tree AS (
SELECT id, root_cause FROM maintenance_knowledge WHERE fault_code = 'ENG-001'
UNION ALL
SELECT k.id, k.root_cause
FROM maintenance_knowledge k JOIN cause_tree ct
ON k.id = ct.related_cause_id
)
SELECT * FROM cause_tree;
这套系统在实际部署中验证了技术选型的合理性。Vue3的响应式系统完美支撑了复杂工单状态管理,SpringBoot+MyBatis的组合则保证了后端服务的高可用。特别提醒:船舶维保业务具有强领域特性,开发前建议至少进行2周的业务调研,准确理解轮机长、机务主管等不同角色的工作流程。