|
|
@@ -1,4 +1,194 @@
|
|
|
-<script lang="ts" setup></script>
|
|
|
+<script lang="ts" setup>
|
|
|
+import * as echarts from 'echarts'
|
|
|
+import {
|
|
|
+ ANIMATION,
|
|
|
+ ChartData,
|
|
|
+ CHART_RENDERER,
|
|
|
+ createTooltip,
|
|
|
+ FONT_FAMILY,
|
|
|
+ formatDateLabel,
|
|
|
+ THEME
|
|
|
+} from '@/utils/kb'
|
|
|
+import { IotStatApi } from '@/api/pms/stat'
|
|
|
+
|
|
|
+const chartData = ref<ChartData>({
|
|
|
+ xAxis: [],
|
|
|
+ series: []
|
|
|
+})
|
|
|
+
|
|
|
+const chartRef = ref<HTMLDivElement>()
|
|
|
+let chart: echarts.ECharts | null = null
|
|
|
+
|
|
|
+function formatRate(value: number) {
|
|
|
+ return `${Number(value || 0).toFixed(2)}%`
|
|
|
+}
|
|
|
+
|
|
|
+function getChartOption(data: ChartData): echarts.EChartsOption {
|
|
|
+ const names = data.xAxis || []
|
|
|
+ const values = (data.series?.[0]?.data || []).map((value) => Number(value || 0) * 100)
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...ANIMATION,
|
|
|
+ grid: { ...THEME.grid, top: 40, right: 28, left: 32 },
|
|
|
+ tooltip: createTooltip({
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'shadow',
|
|
|
+ shadowStyle: {
|
|
|
+ color: THEME.split
|
|
|
+ }
|
|
|
+ },
|
|
|
+ valueFormatter(value: number) {
|
|
|
+ return formatRate(value)
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: names,
|
|
|
+ axisLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: THEME.text.regular,
|
|
|
+ fontSize: 14,
|
|
|
+ fontWeight: 500,
|
|
|
+ fontFamily: FONT_FAMILY,
|
|
|
+ formatter(value: string) {
|
|
|
+ return formatDateLabel(value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ name: '设备利用率(%)',
|
|
|
+ min: 0,
|
|
|
+ max: 100,
|
|
|
+ splitNumber: 4,
|
|
|
+ nameTextStyle: {
|
|
|
+ color: THEME.text.regular,
|
|
|
+ fontSize: 13,
|
|
|
+ fontFamily: FONT_FAMILY
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: THEME.text.regular,
|
|
|
+ fontSize: 12,
|
|
|
+ fontFamily: FONT_FAMILY,
|
|
|
+ formatter(value: number) {
|
|
|
+ return `${value}`
|
|
|
+ }
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: THEME.split,
|
|
|
+ type: 'dashed'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: '设备利用率',
|
|
|
+ type: 'bar',
|
|
|
+ data: values,
|
|
|
+ barWidth: 22,
|
|
|
+ showBackground: true,
|
|
|
+ backgroundStyle: {
|
|
|
+ color: THEME.split,
|
|
|
+ borderRadius: 999
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ borderRadius: [12, 12, 0, 0],
|
|
|
+ shadowBlur: 12,
|
|
|
+ shadowColor: THEME.color.green.bg,
|
|
|
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
+ { offset: 0, color: THEME.color.green.light },
|
|
|
+ { offset: 0.5, color: THEME.color.green.mid },
|
|
|
+ { offset: 1, color: THEME.color.green.line }
|
|
|
+ ])
|
|
|
+ },
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ distance: 8,
|
|
|
+ color: THEME.color.green.strong,
|
|
|
+ fontSize: 14,
|
|
|
+ fontWeight: 700,
|
|
|
+ fontFamily: FONT_FAMILY,
|
|
|
+ formatter(params: any) {
|
|
|
+ return formatRate(Number(params.value))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function initChart() {
|
|
|
+ if (!chartRef.value) return
|
|
|
+ if (chart) {
|
|
|
+ chart.dispose()
|
|
|
+ }
|
|
|
+ chart = echarts.init(chartRef.value, undefined, {
|
|
|
+ renderer: CHART_RENDERER
|
|
|
+ })
|
|
|
+ renderChart()
|
|
|
+}
|
|
|
+
|
|
|
+function renderChart() {
|
|
|
+ chart?.setOption(getChartOption(chartData.value), true)
|
|
|
+}
|
|
|
+
|
|
|
+function resizeChart() {
|
|
|
+ chart?.resize()
|
|
|
+}
|
|
|
+
|
|
|
+function destroyChart() {
|
|
|
+ chart?.dispose()
|
|
|
+ chart = null
|
|
|
+}
|
|
|
+
|
|
|
+async function loadChart() {
|
|
|
+ try {
|
|
|
+ const res = await IotStatApi.getRhSevenDayUtilization()
|
|
|
+ chartData.value = {
|
|
|
+ xAxis: res.xAxis || [],
|
|
|
+ series: (res.series || []).map((item) => ({
|
|
|
+ name: item.name,
|
|
|
+ data: item.data || []
|
|
|
+ }))
|
|
|
+ }
|
|
|
+ renderChart()
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取设备利用率失败:', error)
|
|
|
+ chartData.value = {
|
|
|
+ xAxis: [],
|
|
|
+ series: []
|
|
|
+ }
|
|
|
+ renderChart()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ initChart()
|
|
|
+ loadChart()
|
|
|
+ window.addEventListener('resize', resizeChart)
|
|
|
+ window.addEventListener('rhkb:resize', resizeChart)
|
|
|
+})
|
|
|
+
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener('resize', resizeChart)
|
|
|
+ window.removeEventListener('rhkb:resize', resizeChart)
|
|
|
+ destroyChart()
|
|
|
+})
|
|
|
+</script>
|
|
|
|
|
|
<template>
|
|
|
<div class="panel flex flex-col">
|