船舶监造行业正经历从传统纸质化向数字化管理的转型浪潮。过去三年接触过的7家船厂中,有5家仍在使用Excel表格和纸质单据跟踪建造进度,经常出现数据滞后、版本混乱的问题。最典型的案例是某3000吨级散货船因图纸版本未及时同步,导致分段合拢时出现20cm误差,直接造成60万元返工损失。
这套前后端分离的船舶监造系统正是为解决这类行业痛点而生。系统实现了从钢板切割到试航交付的全流程数字化管控,核心价值体现在三个维度:
技术选型上采用SpringBoot+Vue的经典组合,这是经过多个工业级项目验证的稳妥方案。去年为某海工平台开发的类似系统,在300+并发用户压力测试下,SpringBoot后端仍能保持800ms内的平均响应时间。
后端技术矩阵:
前端工程化方案:
船舶监造业务最大的挑战在于处理多层级的BOM结构。我们采用改良版的闭包表(Closure Table)存储船舶分段关系:
sql复制CREATE TABLE `ship_comp_closure` (
`ancestor` INT NOT NULL COMMENT '父节点ID',
`descendant` INT NOT NULL COMMENT '子节点ID',
`depth` INT NOT NULL COMMENT '层级深度',
`is_del` TINYINT DEFAULT 0 COMMENT '逻辑删除标记',
PRIMARY KEY (`ancestor`,`descendant`),
KEY `idx_descendant` (`descendant`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
这种设计使得查询某分段的所有子部件仅需单条SQL:
sql复制SELECT c.* FROM component c
JOIN ship_comp_closure s ON c.id = s.descendant
WHERE s.ancestor = #{segmentId}
船舶监造的甘特图需要特殊处理分段搭载的"浮动时间"。前端采用Gantt-elastic组件改造:
javascript复制const customTimeCalculator = (task) => {
// 浮动时间=标准工期*船型系数(散货船1.2/油轮1.5)
const shipTypeFactor = currentShip.type === 'BULKER' ? 1.2 : 1.5
return task.duration * shipTypeFactor
}
后端接口返回的数据结构包含三个时间维度:
json复制{
"plannedStart": "2023-08-01",
"hardDeadline": "2023-08-20",
"floatDays": 5
}
系统集成了Python版OpenCV进行焊缝X光片的智能分析:
python复制def detect_weld_defects(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 使用改进的Canny算法检测裂纹
edges = cv2.Canny(img, 50, 150, apertureSize=3, L2gradient=True)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
return [c for c in contours if cv2.contourArea(c) > 10]
检测结果自动生成符合GL船级社规范的报告模板,关键字段包括:
船舶厂区网络环境特殊,需特别注意:
nginx复制server {
listen 443 ssl;
ssl_certificate /etc/nginx/certs/shipyard.crt;
ssl_certificate_key /etc/nginx/certs/shipyard.key;
# 禁用不安全的TLS协议
ssl_protocols TLSv1.2 TLSv1.3;
}
bash复制# 只允许MES系统IP访问8080端口
iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
使用Docker-compose实现一键部署:
yaml复制version: '3.8'
services:
app:
image: shipbuilder:1.2
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
volumes:
- /mnt/nas/ship_drawings:/app/drawings
deploy:
resources:
limits:
cpus: '2'
memory: 4G
关键提示:必须挂载NAS存储卷,船舶图纸单文件常超过500MB
现象:超过200MB的3D模型上传到80%失败
解决方案:
javascript复制const chunkSize = 50 * 1024 * 1024 // 50MB
this.uploader.options.chunkSize = chunkSize
nginx复制client_max_body_size 1024M;
client_body_temp_path /var/tmp/nginx 1 2;
现象:多个验船师同时签署同一份报告时丢失签名
处理流程:
java复制@Update("UPDATE survey_report SET sign=#{sign}, version=version+1
WHERE id=#{id} AND version=#{version}")
int updateWithVersion(Report report);
javascript复制error.response.status === 409 && location.reload()
原始递归查询耗时4.2秒,优化方案:
full_path存储所有父节点ID:code复制"1,5,12" 表示当前节点的父链
java复制@Cacheable(value = "shipTree", key = "#shipId")
public List<Segment> getFullTree(Long shipId) {
// 数据库查询
}
优化后平均响应时间降至380ms
处理10万+行质检记录时,采用流式导出:
java复制try (SXSSFWorkbook workbook = new SXSSFWorkbook(100)) {
Sheet sheet = workbook.createSheet();
dataList.forEach(item -> {
Row row = sheet.createRow(rowNum++);
// 使用SAX方式写入
});
}
配合JVM参数:
code复制-XX:+UseG1GC -XX:MaxGCPauseMillis=200
船舶监造系统常需要对接特定设备,推荐扩展方案:
python复制import snap7
plc = snap7.client.Client()
plc.connect('192.168.1.50', 0, 1)
# 读取焊接电流值
current = plc.db_read(1, 0, 2)
css复制/* 船厂现场强光环境下增强对比度 */
@media (light-level: washed) {
.form-control {
background-color: #fff !important;
color: #000 !important;
}
}