|
@ -38,7 +38,7 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 固定的设备颜色映射,确保颜色一致性 |
|
|
// 固定的设备颜色映射,确保颜色一致性 |
|
|
const getDeviceColor = (deviceId) => { |
|
|
const getDeviceColor = (deviceDesc) => { |
|
|
const colorMap = { |
|
|
const colorMap = { |
|
|
target1: "#52c41a", // 绿色 |
|
|
target1: "#52c41a", // 绿色 |
|
|
target2: "#faad14", // 橙色 |
|
|
target2: "#faad14", // 橙色 |
|
@ -52,7 +52,7 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
target10: "#1890ff", // 蓝色 |
|
|
target10: "#1890ff", // 蓝色 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
return colorMap[deviceId] || "#1890ff"; |
|
|
return colorMap[deviceDesc] || "#1890ff"; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// 数据采样函数 - 每秒采样一次,最多保留25个数据点 |
|
|
// 数据采样函数 - 每秒采样一次,最多保留25个数据点 |
|
@ -118,6 +118,18 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
|
|
|
|
|
|
// 初始化可见目标状态 |
|
|
// 初始化可见目标状态 |
|
|
const { deviceIds } = sampleData(tableData); |
|
|
const { deviceIds } = sampleData(tableData); |
|
|
|
|
|
|
|
|
|
|
|
// 获取 deviceId 到 desc 的映射 |
|
|
|
|
|
const deviceDescMap = useMemo(() => { |
|
|
|
|
|
const map = {}; |
|
|
|
|
|
tableData.forEach(item => { |
|
|
|
|
|
if (item.deviceId && item.desc) { |
|
|
|
|
|
map[item.deviceId] = item.desc; |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
return map; |
|
|
|
|
|
}, [tableData]); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
if (deviceIds.length > 0) { |
|
|
if (deviceIds.length > 0) { |
|
|
const initialVisible = {}; |
|
|
const initialVisible = {}; |
|
@ -203,11 +215,12 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
: null; |
|
|
: null; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const deviceDesc = deviceDescMap[deviceId] || deviceId; |
|
|
return { |
|
|
return { |
|
|
label: deviceId, |
|
|
label: deviceId, |
|
|
data: data, |
|
|
data: data, |
|
|
borderColor: getDeviceColor(deviceId), |
|
|
borderColor: getDeviceColor(deviceDesc), |
|
|
backgroundColor: getDeviceColor(deviceId) + "20", |
|
|
backgroundColor: getDeviceColor(deviceDesc) + "20", |
|
|
borderWidth: 2, |
|
|
borderWidth: 2, |
|
|
pointRadius: 3, |
|
|
pointRadius: 3, |
|
|
pointHoverRadius: 5, |
|
|
pointHoverRadius: 5, |
|
@ -245,11 +258,12 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
: null; |
|
|
: null; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const deviceDesc = deviceDescMap[deviceId] || deviceId; |
|
|
return { |
|
|
return { |
|
|
label: deviceId, |
|
|
label: deviceId, |
|
|
data: data, |
|
|
data: data, |
|
|
borderColor: getDeviceColor(deviceId), |
|
|
borderColor: getDeviceColor(deviceDesc), |
|
|
backgroundColor: getDeviceColor(deviceId) + "20", |
|
|
backgroundColor: getDeviceColor(deviceDesc) + "20", |
|
|
borderWidth: 2, |
|
|
borderWidth: 2, |
|
|
pointRadius: 3, |
|
|
pointRadius: 3, |
|
|
pointHoverRadius: 5, |
|
|
pointHoverRadius: 5, |
|
@ -266,8 +280,8 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
} |
|
|
} |
|
|
}, [tableData, visibleTargets]); |
|
|
}, [tableData, visibleTargets]); |
|
|
|
|
|
|
|
|
// Chart.js配置选项 |
|
|
// Chart.js配置选项 - 移到组件内部以访问 deviceDescMap |
|
|
const chartOptions = { |
|
|
const chartOptions = useMemo(() => ({ |
|
|
responsive: true, |
|
|
responsive: true, |
|
|
maintainAspectRatio: false, |
|
|
maintainAspectRatio: false, |
|
|
interaction: { |
|
|
interaction: { |
|
@ -282,6 +296,17 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
filter: function (tooltipItem) { |
|
|
filter: function (tooltipItem) { |
|
|
return tooltipItem.parsed.y !== null; |
|
|
return tooltipItem.parsed.y !== null; |
|
|
}, |
|
|
}, |
|
|
|
|
|
callbacks: { |
|
|
|
|
|
title: function(context) { |
|
|
|
|
|
return context[0].label; // 显示时间 |
|
|
|
|
|
}, |
|
|
|
|
|
label: function(context) { |
|
|
|
|
|
const deviceId = context.dataset.label; |
|
|
|
|
|
const deviceDesc = deviceDescMap[deviceId] || deviceId; |
|
|
|
|
|
const value = context.parsed.y; |
|
|
|
|
|
return `${deviceDesc}: ${value}`; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
scales: { |
|
|
scales: { |
|
@ -323,10 +348,10 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
tension: 0, |
|
|
tension: 0, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}; |
|
|
}), [deviceDescMap]); |
|
|
|
|
|
|
|
|
// X轴图表配置 |
|
|
// X轴图表配置 |
|
|
const xChartOptions = { |
|
|
const xChartOptions = useMemo(() => ({ |
|
|
...chartOptions, |
|
|
...chartOptions, |
|
|
plugins: { |
|
|
plugins: { |
|
|
...chartOptions.plugins, |
|
|
...chartOptions.plugins, |
|
@ -348,10 +373,10 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}; |
|
|
}), [chartOptions]); |
|
|
|
|
|
|
|
|
// Y轴图表配置 |
|
|
// Y轴图表配置 |
|
|
const yChartOptions = { |
|
|
const yChartOptions = useMemo(() => ({ |
|
|
...chartOptions, |
|
|
...chartOptions, |
|
|
plugins: { |
|
|
plugins: { |
|
|
...chartOptions.plugins, |
|
|
...chartOptions.plugins, |
|
@ -373,7 +398,7 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}; |
|
|
}), [chartOptions]); |
|
|
|
|
|
|
|
|
// 如果没有数据,显示空状态 |
|
|
// 如果没有数据,显示空状态 |
|
|
if (!tableData || tableData.length === 0) { |
|
|
if (!tableData || tableData.length === 0) { |
|
@ -451,19 +476,19 @@ const RealtimeCharts = ({ tableData, lastUpdateTime }) => { |
|
|
> |
|
|
> |
|
|
全部隐藏 |
|
|
全部隐藏 |
|
|
</Button> |
|
|
</Button> |
|
|
{deviceIds.map(deviceId => ( |
|
|
{deviceIds.map((deviceId,index) => ( |
|
|
<Button |
|
|
<Button |
|
|
key={deviceId} |
|
|
key={deviceId} |
|
|
size="small" |
|
|
size="small" |
|
|
type={visibleTargets[deviceId] ? "primary" : "default"} |
|
|
type={visibleTargets[deviceId] ? "primary" : "default"} |
|
|
style={{ |
|
|
style={{ |
|
|
borderColor: getDeviceColor(deviceId), |
|
|
borderColor: getDeviceColor(deviceDescMap[deviceId] || deviceId), |
|
|
color: visibleTargets[deviceId] ? "#fff" : getDeviceColor(deviceId), |
|
|
color: visibleTargets[deviceId] ? "#fff" : getDeviceColor(deviceDescMap[deviceId] || deviceId), |
|
|
backgroundColor: visibleTargets[deviceId] ? getDeviceColor(deviceId) : "#fff" |
|
|
backgroundColor: visibleTargets[deviceId] ? getDeviceColor(deviceDescMap[deviceId] || deviceId) : "#fff" |
|
|
}} |
|
|
}} |
|
|
onClick={() => toggleTargetVisibility(deviceId)} |
|
|
onClick={() => toggleTargetVisibility(deviceId)} |
|
|
> |
|
|
> |
|
|
{deviceId} |
|
|
{deviceDescMap[deviceId] || deviceId} |
|
|
</Button> |
|
|
</Button> |
|
|
))} |
|
|
))} |
|
|
</Space> |
|
|
</Space> |
|
|