From ea195957f51830066fa1bb9ec3eec086dcb05bb7 Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期二, 27 五月 2025 09:57:10 +0800
Subject: [PATCH] 调度建议快照

---
 src/views/model/sche/suggest/suggestOperationRecord.vue |    2 
 src/views/model/sche/suggest/suggestSnapshot.vue        |  243 +++++++++++++++++++++---------------------------
 2 files changed, 108 insertions(+), 137 deletions(-)

diff --git a/src/views/model/sche/suggest/suggestOperationRecord.vue b/src/views/model/sche/suggest/suggestOperationRecord.vue
index e666add..f09ddea 100644
--- a/src/views/model/sche/suggest/suggestOperationRecord.vue
+++ b/src/views/model/sche/suggest/suggestOperationRecord.vue
@@ -121,7 +121,7 @@
   /** 快照 */
   const suggestSnapshotRef = ref()
   const openSnapshot = (id?: string) => {
-    suggestSnapshotRef.value.openSnapshot(id)
+    suggestSnapshotRef.value.open(id)
   }
 
   /** 打开弹窗 */
diff --git a/src/views/model/sche/suggest/suggestSnapshot.vue b/src/views/model/sche/suggest/suggestSnapshot.vue
index 31ea85d..fc2f607 100644
--- a/src/views/model/sche/suggest/suggestSnapshot.vue
+++ b/src/views/model/sche/suggest/suggestSnapshot.vue
@@ -5,26 +5,23 @@
     width="80%"
     v-model="visible"
   >
-    <div class="flex-container">
-        <el-tag
-          v-for="item in dataList"
-          :key="item.dataCode"
-          class="data-tag"
-          :type="selectedData.includes(item.dataCode) ? '' : 'info'"
-          @click="toggleDataSelection(item)"
-        >
-          {{ item.dataName }}
-        </el-tag>
-      </div>
-      <div class="right-panel">
-        <div
-          v-for="chart in charts"
-          :key="chart.id"
-          class="chart-container"
-          ref="chartDom"
-          v-loading="loading"
-        ></div>
-      </div>
+    <el-checkbox-group v-model="selectedData" @change="refreshCharts">
+      <el-checkbox
+        v-for="item in dataList"
+        :label="item.dataNo"
+        :key="item.dataNo"
+      >
+        {{ item.dataName }}
+      </el-checkbox>
+    </el-checkbox-group>
+
+    <div
+      v-for="(chart, index) in charts"
+      :key="chart.id"
+      class="chart-container"
+      :ref="el => chartDoms[index] = el"
+      v-loading="loading"
+    ></div>
   </el-dialog>
 </template>
 
@@ -33,78 +30,104 @@
   import * as echarts from 'echarts'
   import * as suggestSnapshotApi from '@/api/model/sche/suggest/suggestSnapshotRecord';
 
-  const message = useMessage()
+  const { message } = useMessage()
   const visible = ref(false)
   const dataList = ref([])
   const selectedData = ref([])
   const charts = ref([])
+  const chartDoms = ref([])
   const chartInstances = ref([])
   const loading = ref(false)
 
-  const dataForm = reactive({
-    id: "",
-  })
 
-  /** 打开弹窗 */
   const open = async (id: string) => {
     visible.value = true
-    dataForm.id = id
-    await getDataList()
+    await getDataList(id)
   }
 
   defineExpose({ open })
 
   /** 获取数据列表 */
-  const getDataList = async () => {
+  const getDataList = async (id: string) => {
     try {
-      const res = await suggestSnapshotApi.getList(dataForm.id)
+      const res = await suggestSnapshotApi.getList(id)
       dataList.value = res
+      selectedData.value = [] // 清空已选项
     } catch (error) {
       console.error(error)
       message.error('获取数据列表失败')
     }
   }
 
-  /** 切换数据选择 */
-  const toggleDataSelection = (item) => {
-    const index = selectedData.value.indexOf(item.dataCode)
-    if (index === -1) {
-      selectedData.value.push(item.dataCode)
-    } else {
-      selectedData.value.splice(index, 1)
-    }
-    refreshCharts()
-  }
-
   /** 刷新图表 */
   const refreshCharts = async () => {
     if (selectedData.value.length === 0) {
+      destroyCharts()
       charts.value = []
       return
     }
 
     loading.value = true
     try {
-      const params = {
-        chooseDataList: selectedData.value,
-      }
-      const chartData = await suggestSnapshotApi.getChartList(params)
+      const chartData = await suggestSnapshotApi.getChartList({
+        chooseDataList: selectedData.value
+      })
+      // const chartData =[
+      //   {
+      //     "dataNo": "F0000101228",
+      //     "categories": [
+      //       "2024-02-01T00:00:00",
+      //       "2024-02-01T02:00:00",
+      //       "2024-02-01T04:00:00",
+      //       "2024-02-01T06:00:00",
+      //       "2024-02-01T08:00:00",
+      //       "2024-02-01T10:00:00",
+      //       "2024-02-01T12:00:00",
+      //       "2024-02-01T14:00:00",
+      //       "2024-02-01T16:00:00",
+      //       "2024-02-01T18:00:00"
+      //     ],
+      //     "series": [
+      //       {
+      //         "name": "温度",
+      //         "data": [22.1, 21.8, 21.5, 22.3, 24.5, 26.7, 28.2, 27.9, 25.6, 23.4]
+      //       }
+      //     ]
+      //   },
+      //   {
+      //     "dataNo": "F0000100152",
+      //     "categories": [
+      //       "2024-02-01T00:00:00",
+      //       "2024-02-01T02:00:00",
+      //       "2024-02-01T04:00:00",
+      //       "2024-02-01T06:00:00",
+      //       "2024-02-01T08:00:00",
+      //       "2024-02-01T10:00:00",
+      //       "2024-02-01T12:00:00",
+      //       "2024-02-01T14:00:00",
+      //       "2024-02-01T16:00:00",
+      //       "2024-02-01T18:00:00"
+      //     ],
+      //     "series": [
+      //       {
+      //         "name": "电压",
+      //         "data": [220.1, 219.8, 220.2, 219.9, 220.5, 221.0, 220.8, 220.6, 220.3, 220.0]
+      //       }
+      //     ]
+      //   }
+      // ]
+      destroyCharts()
 
-      // 销毁之前的图表实例
-      chartInstances.value.forEach(instance => instance.dispose())
-      chartInstances.value = []
-
-      // 准备新的图表数据
-      charts.value = selectedData.value.map((code, index) => {
-        const item = dataList.value.find(d => d.dataCode === code)
+      // 生成图表配置数据
+      charts.value = selectedData.value.map(code => {
+        const item = dataList.value.find(d => d.dataNo === code)
         return {
-          id: `chart-${index}`,
+          id: `chart-${code}`,
           name: item?.dataName || code,
-          data: chartData[index] // 假设返回数据是按顺序对应的
+          data: chartData.find((d: any) => d.dataNo === code)
         }
       })
 
-      // 渲染新图表
       await nextTick()
       renderCharts()
     } catch (error) {
@@ -115,105 +138,53 @@
     }
   }
 
-  /** 渲染所有图表 */
-  const renderCharts = () => {
-    const chartContainers = document.querySelectorAll('.chart-container')
+  /** 销毁图表实例 */
+  const destroyCharts = () => {
+    chartInstances.value.forEach(instance => instance?.dispose())
+    chartInstances.value = []
+  }
 
-    chartContainers.forEach((container, index) => {
-      const chart = echarts.init(container)
+  /** 渲染图表 */
+  const renderCharts = () => {
+    chartInstances.value = chartDoms.value.map((dom, index) => {
+      if (!dom) return null
+      const chart = echarts.init(dom)
       const chartInfo = charts.value[index]
+
+      if (!chartInfo) return chart
 
       const option = {
         title: {
           text: chartInfo.name,
-          top: 0,
-          left: "1%",
-          textStyle: {
-            fontSize: 14,
-          },
+          textStyle: { fontSize: 14 }
         },
-        tooltip: {
-          trigger: "axis",
-          axisPointer: {
-            type: "line",
-            lineStyle: {
-              color: "#cccccc",
-              width: "1",
-              type: "dashed",
-            },
-          },
-        },
-        legend: {
-          show: false,
-          top: 10,
-        },
-        grid: {
-          top: 30,
-          left: "3%",
-          right: "5%",
-          bottom: 10,
-          containLabel: true,
-        },
+        tooltip: { trigger: 'axis' },
+        grid: { top: 30, left: '3%', right: '5%', bottom: 20 },
         xAxis: {
-          type: "category",
-          boundaryGap: false,
-          data: chartInfo.data.categories,
+          type: 'category',
+          data: chartInfo.data?.categories || []
         },
-        yAxis: {
-          type: "value",
-        },
-        dataZoom: [
-          {
-            type: "inside",
-          },
-        ],
+        yAxis: { type: 'value' },
+        dataZoom: [{ type: 'inside' }],
         series: [{
-          name: chartInfo.name,
-          type: "line",
-          data: chartInfo.data.series[0].data,
-          showSymbol: true,
-          smooth: false,
-          lineStyle: {
-            normal: {
-              color: "#5B8FF9",
-              width: 1,
-            },
-          },
-        }],
+          type: 'line',
+          data: chartInfo.data?.series?.[0]?.data || [],
+          lineStyle: { color: '#5B8FF9', width: 1 }
+        }]
       }
 
       chart.setOption(option)
-      chartInstances.value.push(chart)
-    })
+      return chart
+    }).filter(Boolean) as echarts.ECharts[]
   }
 </script>
 
 <style scoped>
-  .flex-container {
-    display: flex;
-    height: 600px;
-  }
-
-  .left-panel {
-    width: 250px;
-    padding-right: 20px;
-    border-right: 1px solid #eee;
-    overflow-y: auto;
-  }
-
-  .right-panel {
-    flex: 1;
-    padding-left: 20px;
-    overflow-y: auto;
-  }
-
-  .data-tag {
-    margin: 5px;
-    cursor: pointer;
-  }
-
   .chart-container {
-    height: 300px;
-    margin-bottom: 20px;
+    height: 400px;
+    margin: 20px 0;
+    border: 1px solid #eee;
+    border-radius: 4px;
+    padding: 10px;
   }
 </style>

--
Gitblit v1.9.3