From 8fcb5f96574e96eb6ddb2da8618acea9f51bc224 Mon Sep 17 00:00:00 2001 From: huangjinysf Date: Mon, 29 Dec 2025 00:26:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=BB=B4=E4=BF=AE=E5=88=86=E6=9E=90):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=86=E6=AE=B5NHPP=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增NHPP分析按钮及相关状态变量 - 实现NHPP分析API调用及结果格式化功能 - 调整界面布局,将维修分析标签页移至首位 --- src/views/eq/RepairSummary.vue | 192 +++++++++++++++++++++++++++++++-- 1 file changed, 183 insertions(+), 9 deletions(-) diff --git a/src/views/eq/RepairSummary.vue b/src/views/eq/RepairSummary.vue index 843dd23..a616ea3 100644 --- a/src/views/eq/RepairSummary.vue +++ b/src/views/eq/RepairSummary.vue @@ -113,6 +113,11 @@
+ 分析维修记录 分段Weibull分析 分析维修记录 + type="warning" + @click="analyzeNHPP" + :loading="nhppAnalyzing" + style="margin-left: 10px;" + >分段NHPP分析
+ + + - - + -
@@ -195,6 +208,8 @@ const analyzing = ref(false) const analysisResult = ref('') const weibullAnalyzing = ref(false) const weibullResult = ref('') +const nhppAnalyzing = ref(false) +const nhppResult = ref('') const analysisTab = ref('repairAnalysis') // 监听设备类型变化 @@ -603,6 +618,165 @@ const analyzeWeibull = async () => { } } +// 分段NHPP分析 +const analyzeNHPP = async () => { + if (!selectedEquipmentCode.value) { + nhppResult.value = '请先选择设备。' + return + } + + nhppAnalyzing.value = true + + try { + const params = new URLSearchParams({ + equipment_code: selectedEquipmentCode.value, + breakdown_name_filter: selectedBreakdownName.value || '收线故障', + window_size: '5' + }) + + if (props.dateRange && props.dateRange.start_date) { + params.append('start_date', props.dateRange.start_date) + } + if (props.dateRange && props.dateRange.end_date) { + params.append('end_date', props.dateRange.end_date) + } + + const apiUrl = `${API_CONFIG.BASE_URL}/api/eq-repair/nhpp/analysis?${params.toString()}` + console.log('NHPP分析API URL:', apiUrl) + + const response = await fetch(apiUrl) + const data = await response.json() + + console.log('NHPP分析返回数据:', data) + + if (data.code === 200 && data.data) { + if (data.data.record_count === 0) { + nhppResult.value = `=== 设备 ${selectedEquipmentCode.value} 分段NHPP分析报告 ===\n\n` + + `【分析结果】\n` + + `- 在指定的时间范围内,该设备没有足够的维修记录数据进行分析。\n` + + `- 可能原因:\n` + + ` 1. 该设备在所选日期范围内没有维修记录\n` + + ` 2. 故障记录数据不完整\n` + + `- 建议:\n` + + ` 1. 尝试扩大日期范围\n` + + ` 2. 选择其他设备进行分析\n` + + ` 3. 检查该设备的实际维修记录\n\n` + + `API返回信息: ${JSON.stringify(data.data, null, 2)}` + } else { + nhppResult.value = formatNHPPResult(data.data) + } + } else if (data.detail) { + nhppResult.value = `API错误: ${data.detail}` + } else if (data.message) { + nhppResult.value = `API消息: ${data.message}` + } else { + nhppResult.value = `未能获取到有效的分析结果。\n\n原始响应: ${JSON.stringify(data, null, 2)}` + } + } catch (error) { + console.error('NHPP分析API调用失败:', error) + nhppResult.value = `分析失败: ${error.message}` + } finally { + nhppAnalyzing.value = false + } +} + +// 格式化NHPP分析结果 +const formatNHPPResult = (data) => { + let result = `=== 设备 ${data.equipment_code || selectedEquipmentCode.value} 分段NHPP分析报告 ===\n` + result += `【消息】${data.message || '分析完成'}\n\n` + + result += `【基本统计】\n` + result += `- 设备编号: ${data.equipment_code || 'N/A'}\n` + result += `- 维修记录数: ${data.record_count || 0} 条\n` + result += `- 分析窗口大小: ${data.window_size || 'N/A'}\n` + result += `- 间隔数: ${data.interval_count || 0}\n` + result += `- 平均间隔天数: ${data.avg_interval_days?.toFixed(2) || 'N/A'} 天\n` + result += `- 标准差间隔天数: ${data.std_interval_days?.toFixed(2) || 'N/A'} 天\n` + result += `- 当前运行天数: ${data.current_runtime_days?.toFixed(2) || 'N/A'} 天\n\n` + + result += `【NHPP模型参数】\n` + result += `- 模型类型: ${data.model_type || 'N/A'}\n` + result += `- 形状参数(β): ${data.current_nhpp_beta?.toFixed(4) || 'N/A'}\n` + result += `- 尺度参数(η): ${data.current_nhpp_eta?.toFixed(2) || 'N/A'} 天\n\n` + + if (data.predictions) { + result += `【失效概率预测】\n` + const pred = data.predictions + if (pred['7_days_failure_prob'] !== undefined) { + result += `- 7天失效概率: ${pred['7_days_failure_prob'].toFixed(2)}%\n` + } + if (pred['15_days_failure_prob'] !== undefined) { + result += `- 15天失效概率: ${pred['15_days_failure_prob'].toFixed(2)}%\n` + } + if (pred['30_days_failure_prob'] !== undefined) { + result += `- 30天失效概率: ${pred['30_days_failure_prob'].toFixed(2)}%\n` + } + if (pred['60_days_failure_prob'] !== undefined) { + result += `- 60天失效概率: ${pred['60_days_failure_prob'].toFixed(2)}%\n` + } + if (pred['90_days_failure_prob'] !== undefined) { + result += `- 90天失效概率: ${pred['90_days_failure_prob'].toFixed(2)}%\n` + } + result += `\n` + } + + result += `【分析结论】\n` + + if (data.current_nhpp_beta !== undefined) { + const beta = data.current_nhpp_beta + let trend = '' + let advice = '' + + if (beta < 1) { + trend = '故障率随时间下降(设备处于调试/磨合期)' + advice = '建议:关注早期失效模式,优化初始设置和调试过程' + } else if (beta >= 1 && beta < 1.2) { + trend = '故障率相对稳定(随机失效期)' + advice = '建议:执行计划性维护,保持当前维护策略' + } else { + trend = '故障率随时间上升(磨损失效期)' + advice = '建议:加强预防性维护,考虑关键部件的预防更换' + } + + result += `- 故障趋势: ${trend}\n` + result += `- 维护建议: ${advice}\n` + } + + if (data.current_nhpp_eta !== undefined) { + const eta = data.current_nhpp_eta + result += `- 特征寿命(η): ${eta.toFixed(2)} 天,约 ${(eta / 30).toFixed(1)} 个月\n` + result += ` (NHPP模型下63.2%设备预计在此时间内失效)\n` + } + + if (data.avg_interval_days !== undefined && data.std_interval_days !== undefined) { + result += `- 平均维修间隔: ${data.avg_interval_days.toFixed(2)} 天\n` + + const cv = (data.std_interval_days / data.avg_interval_days * 100).toFixed(1) + result += `- 间隔波动(变异系数): ${cv}%\n` + + if (parseFloat(cv) < 30) { + result += `- 评估: 维修间隔较稳定,维护计划可预测性良好\n` + } else { + result += `- 评估: 维修间隔波动较大,需分析影响维修间隔的因素\n` + } + } + + if (data.current_runtime_days !== undefined && data.current_nhpp_eta !== undefined) { + const runtime = data.current_runtime_days + const eta = data.current_nhpp_eta + const ratio = (runtime / eta * 100).toFixed(1) + result += `\n- 当前累计运行: ${runtime.toFixed(2)} 天 (占特征寿命的 ${ratio}%)\n` + + if (parseFloat(ratio) > 50) { + result += `- 预警: 设备已超过特征寿命50%,建议加强状态监测\n` + } + } + + result += `\n` + + return result +} + // 格式化Weibull分析结果 const formatWeibullResult = (data) => { let result = `=== 设备 ${data.equipment_code || selectedEquipmentCode.value} 分段Weibull分析报告 ===\n`