feat(维修分析): 添加分段NHPP分析功能

- 新增NHPP分析按钮及相关状态变量
- 实现NHPP分析API调用及结果格式化功能
- 调整界面布局,将维修分析标签页移至首位
master
huangjinysf 2 months ago
parent bc9e8e07c7
commit 8fcb5f9657

@ -113,6 +113,11 @@
<div class="right-panel">
<!-- 分析按钮 -->
<div class="analysis-button-container">
<el-button
type="primary"
@click="analyzeRepairRecords"
:loading="analyzing"
>分析维修记录</el-button>
<el-button
type="success"
@click="analyzeWeibull"
@ -120,13 +125,23 @@
style="margin-left: 10px;"
>分段Weibull分析</el-button>
<el-button
type="primary"
@click="analyzeRepairRecords"
:loading="analyzing"
>分析维修记录</el-button>
type="warning"
@click="analyzeNHPP"
:loading="nhppAnalyzing"
style="margin-left: 10px;"
>分段NHPP分析</el-button>
</div>
<el-tabs type="border-card" v-model="analysisTab">
<el-tab-pane label="维修分析" name="repairAnalysis">
<el-input
v-model="analysisResult"
type="textarea"
:rows="15"
placeholder="点击分析维修记录按钮后,分析结果将显示在这里"
readonly
/>
</el-tab-pane>
<el-tab-pane label="Weibull分析" name="weibullAnalysis">
<el-input
v-model="weibullResult"
@ -136,17 +151,15 @@
readonly
/>
</el-tab-pane>
<el-tab-pane label="维修分析" name="repairAnalysis">
<el-tab-pane label="NHPP分析" name="nhppAnalysis">
<el-input
v-model="analysisResult"
v-model="nhppResult"
type="textarea"
:rows="15"
placeholder="点击分维修记录按钮后,分析结果将显示在这里"
placeholder="点击分段NHPP分析按钮后,分析结果将显示在这里"
readonly
/>
</el-tab-pane>
</el-tabs>
</div>
</div>
@ -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`

Loading…
Cancel
Save