77 lines
2.2 KiB
TypeScript
77 lines
2.2 KiB
TypeScript
/**
|
||
* 获取电站节点图表数据API
|
||
* 根据节点ID和图表类型获取应力或温度历史数据
|
||
*/
|
||
|
||
export default defineEventHandler(async (event) => {
|
||
try {
|
||
const query = getQuery(event)
|
||
|
||
// 获取必需参数
|
||
const nodeId = query.nodeId as string
|
||
const chartType = query.type as 'stress' | 'temp'
|
||
|
||
if (!nodeId) {
|
||
throw createError({
|
||
statusCode: 400,
|
||
statusMessage: '缺少必要参数: nodeId',
|
||
})
|
||
}
|
||
|
||
if (!chartType || !['stress', 'temp'].includes(chartType)) {
|
||
throw createError({
|
||
statusCode: 400,
|
||
statusMessage: '缺少必要参数: type (必须为 stress 或 temp)',
|
||
})
|
||
}
|
||
|
||
// 模拟数据生成(基于数据库结构)
|
||
// 实际项目中这里应该连接真实数据库查询
|
||
const dates = []
|
||
const values = []
|
||
const now = new Date()
|
||
|
||
// 生成最近30天的数据
|
||
for (let i = 0; i < 30; i++) {
|
||
const date = new Date(now.getTime() - (29 - i) * 24 * 60 * 60 * 1000)
|
||
dates.push(date.toISOString().split('T')[0])
|
||
|
||
if (chartType === 'stress') {
|
||
// 应力数据:100-150 MPa,模拟真实应力变化
|
||
const baseStress = 120 + Math.sin(i * 0.2) * 10
|
||
const randomVariation = (Math.random() - 0.5) * 20
|
||
values.push(Math.round((baseStress + randomVariation) * 10) / 10)
|
||
} else {
|
||
// 温度数据:560-580°C,模拟真实温度变化
|
||
const baseTemp = 570 + Math.sin(i * 0.15) * 5
|
||
const randomVariation = (Math.random() - 0.5) * 10
|
||
values.push(Math.round((baseTemp + randomVariation) * 10) / 10)
|
||
}
|
||
}
|
||
|
||
// 返回图表数据
|
||
const result = {
|
||
dates,
|
||
values,
|
||
unit: chartType === 'stress' ? 'MPa' : '°C',
|
||
name: chartType === 'stress' ? '历史应力 (Stress)' : '历史温度 (Temp)',
|
||
nodeId,
|
||
chartType,
|
||
}
|
||
|
||
return {
|
||
success: true,
|
||
data: result,
|
||
message: '成功获取图表数据',
|
||
timestamp: new Date().toISOString(),
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('获取图表数据失败:', error)
|
||
|
||
throw createError({
|
||
statusCode: error.statusCode || 500,
|
||
statusMessage: error.message || '获取图表数据失败',
|
||
})
|
||
}
|
||
}) |