From f84c0f2de793be5dac3bda0e952afe14c625f596 Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期四, 26 六月 2025 16:35:28 +0800
Subject: [PATCH] ai模型绑定

---
 src/views/model/sche/suggest/suggestSnapshot.vue |  179 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 128 insertions(+), 51 deletions(-)

diff --git a/src/views/model/sche/suggest/suggestSnapshot.vue b/src/views/model/sche/suggest/suggestSnapshot.vue
index 741bea6..801a654 100644
--- a/src/views/model/sche/suggest/suggestSnapshot.vue
+++ b/src/views/model/sche/suggest/suggestSnapshot.vue
@@ -8,18 +8,18 @@
     <el-checkbox-group v-model="selectedData" @change="refreshCharts">
       <el-checkbox
         v-for="item in dataList"
-        :label="item.dataNo"
-        :key="item.dataNo"
+        :label="item.dataName"
+        :key="item.dataName"
       >
         {{ item.dataName }}
       </el-checkbox>
     </el-checkbox-group>
 
     <div
-      v-for="(chart, index) in charts"
+      v-for="chart in charts"
       :key="chart.id"
       class="chart-container"
-      :ref="el => chartDoms[index] = el"
+      :ref="el => chartDoms[chart.id] = el"
       v-loading="loading"
     ></div>
   </el-dialog>
@@ -34,25 +34,26 @@
   const visible = ref(false)
   const dataList = ref([])
   const selectedData = ref([])
-  const charts = ref([])
-  const chartDoms = ref([])
+  const charts = ref()
+  const chartDoms = ref({})
   const chartInstances = ref([])
   const loading = ref(false)
 
 
-  const open = async (id: string) => {
+  const open = async (suggestId: string) => {
     visible.value = true
-    await getDataList(id)
+    await getDataList(suggestId)
   }
 
   defineExpose({ open })
 
   /** 获取数据列表 */
-  const getDataList = async (id: string) => {
+  const getDataList = async (suggestId: string) => {
     try {
-      const res = await suggestSnapshotApi.getList(id)
+      const res = await suggestSnapshotApi.getList(suggestId)
       dataList.value = res
       selectedData.value = [] // 清空已选项
+      refreshCharts()
     } catch (error) {
       console.error(error)
       message.error('获取数据列表失败')
@@ -70,52 +71,20 @@
     loading.value = true
     try {
       const selectedDataList = selectedData.value.map(code =>
-        dataList.value.find(d => d.dataNo === code)
+        dataList.value.find(d => d.dataName === code)
       ).filter(Boolean) // 过滤无效项
       const chartData = await suggestSnapshotApi.getChartList(
         selectedDataList
       )
-      // const chartData = [
-      //   {
-      //     "dataNo": "F0000101228",
-      //     "dataList": [
-      //       ["2024-02-01 00:00:00", 220.1],
-      //       ["2024-02-01 01:00:00", 219.8],
-      //       ["2024-02-01 02:00:00", 220.2],
-      //       ["2024-02-01 03:00:00", 219.9],
-      //       ["2024-02-01 04:00:00", 220.5],
-      //       ["2024-02-01 05:00:00", 221.0],
-      //       ["2024-02-01 06:00:00", 220.8],
-      //       ["2024-02-01 07:00:00", 220.6],
-      //       ["2024-02-01 08:00:00", 220.3],
-      //       ["2024-02-01 09:00:00", 220.0]
-      //     ]
-      //   },
-      //   {
-      //     "dataNo": "F0000100152",
-      //     "dataList": [
-      //       ["2024-02-01 00:00:00", 220.1],
-      //       ["2024-02-01 01:00:00", 219.8],
-      //       ["2024-02-01 02:00:00", 220.2],
-      //       ["2024-02-01 03:00:00", 219.9],
-      //       ["2024-02-01 04:00:00", 220.5],
-      //       ["2024-02-01 05:00:00", 221.0],
-      //       ["2024-02-01 06:00:00", 220.8],
-      //       ["2024-02-01 07:00:00", 220.6],
-      //       ["2024-02-01 08:00:00", 220.3],
-      //       ["2024-02-01 09:00:00", 220.0]
-      //     ]
-      //   }
-      // ];
       destroyCharts()
 
       // 生成图表配置数据
       charts.value = selectedData.value.map(code => {
-        const item = dataList.value.find(d => d.dataNo === code)
+        const item = dataList.value.find(d => d.dataName === code)
         return {
           id: `chart-${code}`,
           name: item?.dataName || code,
-          data: chartData.find((d: any) => d.dataNo === code)
+          data: chartData.find((d: any) => d.dataName === code)
         }
       })
 
@@ -137,12 +106,104 @@
 
   /** 渲染图表 */
   const renderCharts = () => {
-    chartInstances.value = chartDoms.value.map((dom, index) => {
+    chartInstances.value = charts.value.map((chartInfo, index) => {
+      const dom = chartDoms.value[chartInfo.id]
       if (!dom) return null
       const chart = echarts.init(dom)
-      const chartInfo = charts.value[index]
 
       if (!chartInfo) return chart
+
+      const markLineData = []
+
+      if (chartInfo.data?.limitH !== null) {
+        markLineData.push({
+          yAxis: chartInfo.data?.limitH, // 上限
+          label: {
+            show: true,
+            formatter: '上限',
+            position: 'insideStartTop',
+            color: '#FF9A3D'
+          },
+          lineStyle: {
+            color: '#FF9A3D',
+            type: 'dashed'
+          },
+        })
+      }
+      if (chartInfo.data?.limitL !== null) {
+        markLineData.push({
+          yAxis: chartInfo.data?.limitL, // 下限
+          label: {
+            show: true,
+            formatter: '下限',
+            position: 'insideStartBottom',
+            color: '#00C2FF'
+          },
+          lineStyle: {
+            color: '#00C2FF',
+            type: 'dashed'
+          },
+        })
+      }
+      if (chartInfo.data?.scheduleTime !== null) {
+        markLineData.push({
+          xAxis: chartInfo.data?.scheduleTime, // 真实数据分割线
+          label: {
+            show: true,
+            formatter: '建\n议\n时\n间',
+            position: 'insideEndBottom',
+            color: '#5DFF9E',
+            rotate: 0
+          },
+          lineStyle: {
+            color: '#5DFF9E',
+          },
+        })
+      }
+      // 采纳
+      if (chartInfo.data?.status === 1) {
+        markLineData.push({
+          xAxis: chartInfo.data?.handleTime,
+          label: {
+            show: true,
+            formatter: '采\n纳\n时\n间',
+            position: 'insideEndBottom',
+            color: '#2196F3',
+            rotate: 0
+          },
+          lineStyle: {
+            color: '#2196F3',
+          },
+        })
+      }
+      // 忽略
+      if (chartInfo.data?.status === 2) {
+        markLineData.push({
+          xAxis: chartInfo.data?.handleTime,
+          label: {
+            show: true,
+            formatter: '忽\n略\n时\n间',
+            position: 'insideEndBottom',
+            color: '#999999',
+            rotate: 0
+          },
+          lineStyle: {
+            color: '#999999',
+          },
+        })
+      }
+
+      // 冲顶触底时间
+      if (chartInfo.data?.overLimitTimes?.length > 0) {
+        chartInfo.data?.overLimitTimes.forEach(overLimitTime => {
+          markLineData.push({
+            xAxis: overLimitTime,
+            lineStyle: {
+              color: '#ff0000',
+            },
+          })
+        })
+      }
 
       const option = {
         title: {
@@ -150,20 +211,36 @@
           textStyle: { fontSize: 14 }
         },
         tooltip: { trigger: 'axis' },
-        grid: { top: 30, left: '3%', right: '5%', bottom: 20 },
+        grid: { top: '10%', left: '3%', right: '5%', bottom: 20 },
         xAxis: {type: 'category'},
-        yAxis: { type: 'value' },
+        yAxis: { type: 'value',
+          max: (value) => chartInfo.data?.limitH && value.max < chartInfo.data.limitH ? chartInfo.data?.limitH : null,
+          min: (value) => chartInfo.data?.limitL && value.min > chartInfo.data.limitL ? chartInfo.data?.limitL : null,
+        },
         dataZoom: [{ type: 'inside' }],
         series: [{
           type: 'line',
           data: chartInfo.data?.dataList || [],
-          lineStyle: { color: '#5B8FF9', width: 1 }
+          lineStyle: { color: '#5B8FF9', width: 1 },
+          markLine: {
+            silent: true,
+            symbol: ['none', 'none'],
+            lineStyle: {
+              type: 'solid',
+              width: 1,
+              color: '#95E6FF',
+            },
+            label: {
+              show: false,
+            },
+            data: markLineData,
+          },
         }]
       }
 
       chart.setOption(option)
       return chart
-    }).filter(Boolean) as echarts.ECharts[]
+    })
   }
 </script>
 

--
Gitblit v1.9.3