liriming
2025-03-03 8bb7160c9c4fd7ce5893ee673647b13cc35410ae
提交 | 用户 | 时间
e7b6da 1 <template>
2   <el-dialog
da47a3 3     title="预测数据"
e7b6da 4     :close-on-click-modal="false"
5     width="50%"
932c3a 6     @close="dialogClose"
e7b6da 7     v-model="visible"
8   >
9     <el-form
10       :inline="true"
11       :model="dataForm"
12       @keydown.enter="getDataList()"
13     >
14       <el-form-item label="开始时间">
15         <el-date-picker
16           v-model="dataForm.startTime"
17           format="YYYY-MM-DD HH:mm:00"
18           value-format="YYYY-MM-DD HH:mm:00"
19           type="datetime"
20           :clearable="false"
21           placeholder="选择日期时间"/>
22       </el-form-item>
23       <el-form-item label="结束时间">
24         <el-date-picker
25           v-model="dataForm.endTime"
26           format="YYYY-MM-DD HH:mm:00"
27           value-format="YYYY-MM-DD HH:mm:00"
28           type="datetime"
29           :clearable="false"
30           placeholder="选择日期时间"/>
31       </el-form-item>
32       <el-form-item>
33         <el-button @click="getDataList()">查询</el-button>
34       </el-form-item>
35       <el-form-item>
36         <el-button
37           type="success"
38           plain
39           @click="handleExport"
40           :loading="exportLoading"
41         >
da47a3 42           <Icon icon="ep:download"/>
43           导出
e7b6da 44         </el-button>
45       </el-form-item>
46     </el-form>
da47a3 47     <div ref="chartDomPre" class="result-chart"></div>
e7b6da 48   </el-dialog>
49 </template>
50
51 <script lang="ts" setup>
52 import {ref} from 'vue';
53 import * as echarts from 'echarts';
da47a3 54 import * as McsApi from '@/api/model/mcs'
e7b6da 55 import {getYMDHM0} from "@/utils/dateUtil"
56 import download from "@/utils/download";
da47a3 57
e7b6da 58 const message = useMessage() // 消息弹窗
59 const visible = ref(false);
290730 60 const chartDomPre = ref();
D 61 let myChart = undefined;
e7b6da 62 const chartParams = reactive({
da47a3 63   itemId: undefined,
64   startTime: undefined,
65   endTime: undefined,
e7b6da 66 })
67 const dataForm = ref({
68   id: "",
da47a3 69   itemName: "",
e7b6da 70   startTime: getYMDHM0(new Date() - 60 * 60 * 1000),
da47a3 71   endTime: getYMDHM0(new Date() + 60 * 60 * 1000),
e7b6da 72 });
73
74 /** 打开弹窗 */
75 const open = async (row: object) => {
76   visible.value = true
da47a3 77   resetForm()
e7b6da 78   dataForm.value.id = row.id;
da47a3 79   dataForm.value.itemName = row.itemname;
80   if (row.id) {
932c3a 81     nextTick(() => {
D 82       myChart = echarts.init(chartDomPre.value);
83     });
da47a3 84     getDataList();
932c3a 85   }
D 86 }
87
88 const dialogClose = () => {
89   if (myChart) {
90     myChart.dispose(); // 组件卸载时销毁实例
da47a3 91   }
e7b6da 92 }
93
94 defineExpose({open}) // 提供 open 方法,用于打开弹窗
95
96 async function getDataList() {
97   visible.value = true;
98   if (dataForm.value.id) {
99     try {
da47a3 100       chartParams.itemId = dataForm.value.id;
101       chartParams.startTime = dataForm.value.startTime;
102       chartParams.endTime = dataForm.value.endTime;
103       const data = await McsApi.getPreDataItemChart(chartParams)
104       let legendData = []
932c3a 105       // if (data.legend && data.legend.length > 0) {
D 106       //   data.legend.forEach(item => {
107       //     legendData.push(item + ":" + '真实值')
108       //     legendData.push(item + ":" + '预测值')
109       //   })
110       // }
da47a3 111
e7b6da 112       let seriesData = []
67b64e 113       if (data.predictTime) {
e7b6da 114         seriesData.push({
da47a3 115           name: '',
116           data: [null],
117           type: 'line',
118           smooth: true,
119           color: 'green',
120           markLine: {
121             silent: true,
122             lineStyle: {
123               color: '#32a487',
124               width: 2
e7b6da 125             },
da47a3 126             data: [{
67b64e 127               xAxis: data.predictTime
da47a3 128             }],
129             label: {
130               normal: {
67b64e 131                 formatter: data.predictTime
da47a3 132               }
133             },
134             symbol: ['circle', 'none'],
e7b6da 135           },
136         });
da47a3 137       }
e7b6da 138
da47a3 139       if (data.viewMap) {
140         Object.keys(data.viewMap).forEach(key => {
141           let viewData = data.viewMap[key]
290730 142           if(viewData.realData) {
932c3a 143             legendData.push(key + ":" + '真实值')
290730 144             seriesData.push({
D 145               name: key + ":" + '真实值',
146               type: "line",
147               data: viewData.realData,
148               showSymbol: false,
149               smooth: false,
150               lineStyle: {
151                 normal: {
152                   width: 1,
153                 },
da47a3 154               },
290730 155             })
D 156           }
932c3a 157           legendData.push(key + ":" + '预测值')
da47a3 158           seriesData.push({
159             name: key + ":" + '预测值',
160             type: "line",
161             data: viewData.preDataN,
162             showSymbol: false,
163             smooth: false,
164             lineStyle: {
165               normal: {
166                 width: 1,
167               },
168             },
169           })
22bcd6 170           //累计点
D 171           if(viewData.cumulantRealData) {
172             legendData.push(key + "累计:" + '真实值')
173             seriesData.push({
174               name: key + "累计:" + '真实值',
175               type: "line",
176               data: viewData.cumulantRealData,
177               showSymbol: false,
178               smooth: false,
179               lineStyle: {
180                 normal: {
181                   width: 1,
182                 },
183               },
0359df 184               yAxisIndex: 1
22bcd6 185             })
D 186           }
187           if(viewData.cumulantPreData) {
188             legendData.push(key + "累计:" + '预测值')
189             seriesData.push({
190               name: key + "累计:" + '预测值',
191               type: "line",
192               data: viewData.cumulantPreData,
193               showSymbol: false,
194               smooth: false,
195               lineStyle: {
196                 normal: {
197                   width: 1,
198                 },
199               },
0359df 200               yAxisIndex: 1
22bcd6 201             })
D 202           }
da47a3 203         })
204       }
205
e7b6da 206       const option = {
207         title: {
da47a3 208           text: dataForm.value.itemName,
e7b6da 209           top: 0,
210           left: "1%",
211           textStyle: {
212             fontSize: 14,
213           },
214         },
215         tooltip: {
216           trigger: "axis",
217           axisPointer: {
218             type: "line",
219             lineStyle: {
220               color: "#cccccc",
221               width: "1",
222               type: "dashed",
223             },
224           },
225         },
226         legend: {
da47a3 227           show: true,
228           top: 20,
229           data: legendData
e7b6da 230         },
231         grid: {
da47a3 232           top: "20%",
e7b6da 233           left: "3%",
234           right: "5%",
235           bottom: 10,
236           containLabel: true,
237         },
238         xAxis: {
239           type: "category",
240           boundaryGap: false,
241           data: data.categories,
242         },
0359df 243         yAxis: [
D 244           {
245             type: "value",
246             name: '预测值/真实值'
247           },
248           {
249             type: "value",
250             splitLine: {
251               show: false
252             },
253             name: '累计值'
254           }
255         ],
e7b6da 256         dataZoom: [
257           {
258             type: "inside",
259           },
260         ],
261         series: seriesData,
262       };
263       myChart.setOption(option);
264     } catch (error) {
265       console.error(error)
266     }
267   }
268 }
da47a3 269
e7b6da 270 /** 导出按钮操作 */
271 const exportLoading = ref(false)
272 const handleExport = async () => {
da47a3 273   chartParams.itemId = dataForm.value.id;
1e376e 274   chartParams.startTime = dataForm.value.startTime?dataForm.value.startTime:"";
D 275   chartParams.endTime = dataForm.value.endTime?dataForm.value.endTime:"";
e7b6da 276   try {
277     // 导出的二次确认
278     await message.exportConfirm()
279     // 发起导出
280     exportLoading.value = true
1e376e 281     const data = await McsApi.exportPredictValue(chartParams)
D 282     download.excel(data, dataForm.value.itemName + '.xls')
e7b6da 283   } catch {
284   } finally {
285     exportLoading.value = false
286   }
287 }
da47a3 288
289 /** 重置表单 */
290 const resetForm = () => {
291   dataForm.value = {
292     id: undefined,
293     itemName: undefined,
294     startTime: undefined,
295     endTime: undefined
296   }
297 }
e7b6da 298 </script>
299 <style>
300 .el-select {
301   width: 100%;
302 }
303
304 .result-chart {
305   height: 500px;
306 }
307 </style>