潘志宝
2025-02-11 f9ae47c20537fec55350e1fba1668870dd53b4cb
提交 | 用户 | 时间
d7fad0 1 <template>
J 2   <el-card shadow="never" class="aui-card--fill">
3     <div class="mod-his__index">
4       <el-form :inline="true" :model="formData" label-width="80px">
5         <el-form-item label="开始时间">
6           <el-date-picker
f3edfb 7             v-model="formData.startTime"
8             type="datetime"
33a088 9             format="YYYY-MM-DD HH:mm:00"
10             value-format="YYYY-MM-DD HH:mm:00"
f3edfb 11             placeholder="选择日期时间"/>
d7fad0 12         </el-form-item>
J 13         <el-form-item label="结束时间">
14           <el-date-picker
f3edfb 15             v-model="formData.endTime"
16             type="datetime"
33a088 17             format="YYYY-MM-DD HH:mm:00"
18             value-format="YYYY-MM-DD HH:mm:00"
f3edfb 19             placeholder="选择日期时间"/>
d7fad0 20         </el-form-item>
J 21         <el-form-item label="预测时间">
22           <el-date-picker
f3edfb 23             v-model="formData.predictTime"
24             type="datetime"
33a088 25             format="YYYY-MM-DD HH:mm:00"
26             value-format="YYYY-MM-DD HH:mm:00"
f3edfb 27             placeholder="选择日期时间"/>
d7fad0 28         </el-form-item>
J 29         <el-form-item label="预测频率">
f3edfb 30           <el-input-number v-model="formData.predictFreq" controls-position="right"
31                            :min="1"
d7fad0 32                            :max="10"/>
J 33         </el-form-item>
34         <el-form-item>
35           <el-button-group>
f3edfb 36             <el-button type="primary" plain :icon="ArrowLeft"
33a088 37                        :loading="loading1" @click="leftSearchDataByRange()"/>
f3edfb 38             <el-button type="primary" plain :icon="Search"
33a088 39                        :loading="loading1" @click="getList()">查询
f3edfb 40             </el-button>
41             <el-button type="primary" plain :icon="ArrowRight"
33a088 42                        :loading="loading1" @click="rightSearchDataByRange()"/>
d7fad0 43           </el-button-group>
J 44         </el-form-item>
45
46         <div class="his-body">
47           <div class="his-body-left">
48             <div class="his-body-tree">
49               <el-tree
f3edfb 50                 :data="treeData"
51                 show-checkbox
52                 node-key="id"
53                 ref="tree"
54                 highlight-current
55                 :props="defaultProps"
56                 @check="onCheckTree"/>
d7fad0 57             </div>
J 58           </div>
59           <div class="his-body-right">
60             <div class="his-body-chart">
33a088 61               <el-form :inline="true" :model="calRateForm" :rules="formRules" ref="calRateFormRef"
f3edfb 62                        label-width="108px">
d7fad0 63                 <el-row>
f3edfb 64                   <el-col :span="6">
d7fad0 65                     <el-form-item label="预测项" prop="calItem" style="width: 90%">
33a088 66                       <el-select size="small" v-model="calRateForm.calItem"
67                                  @change="calItemBaseVale"
f3edfb 68                                  placeholder="请选择">
d7fad0 69                         <el-option
33a088 70                           v-for="itemOut in formData.checkedItemData"
71                           :key="itemOut.id"
72                           :label="itemOut.label"
73                           :value="itemOut.id"/>
d7fad0 74                       </el-select>
J 75                     </el-form-item>
76                   </el-col>
77                   <el-col :span="6">
78                     <el-form-item label="精准度偏差" prop="IN_DEVIATION">
f3edfb 79                       <el-input-number size="small" v-model="calRateForm.IN_DEVIATION"
80                                        controls-position="right" :min="1"
d7fad0 81                                        :max="10"/>
J 82                     </el-form-item>
83                   </el-col>
84                   <el-col :span="6">
85                     <el-form-item label="不可信率偏差" prop="OUT_DEVIATION">
f3edfb 86                       <el-input-number size="small" v-model="calRateForm.OUT_DEVIATION"
87                                        controls-position="right"
d7fad0 88                                        :min="1"
J 89                                        :max="20"/>
90                     </el-form-item>
91                   </el-col>
92                   <el-col :span="4">
93                     <el-form-item>
f3edfb 94                       <el-button size="small" type="primary" plain :loading="loading2"
95                                  @click="calAccuracyRate">计算精准度
d7fad0 96                       </el-button>
J 97                     </el-form-item>
98                   </el-col>
99                 </el-row>
100                 <el-row>
101                   <el-col :span="4">
102                     <el-form-item label="精准度:">
f3edfb 103                       {{ calRateForm.IN_ACCURACY_RATE }}%
d7fad0 104                     </el-form-item>
J 105                   </el-col>
106                   <el-col :span="4">
107                     <el-form-item label="预测平均值:">
f3edfb 108                       {{ calRateForm.itemPreAvg }}
d7fad0 109                     </el-form-item>
J 110                   </el-col>
111                   <el-col :span="4">
112                     <el-form-item label="预测最大值:">
f3edfb 113                       {{ calRateForm.itemPreMax }}
d7fad0 114                     </el-form-item>
J 115                   </el-col>
116                   <el-col :span="4">
117                     <el-form-item label="预测最小值:">
f3edfb 118                       {{ calRateForm.itemPreMin }}
d7fad0 119                     </el-form-item>
J 120                   </el-col>
121                   <el-col :span="4">
122                     <el-form-item label="预测累积量:">
f3edfb 123                       {{ calRateForm.preCumulant }}
d7fad0 124                     </el-form-item>
J 125                   </el-col>
126                 </el-row>
127                 <el-row>
128                   <el-col :span="4">
129                     <el-form-item label="不可信率:">
f3edfb 130                       {{ calRateForm.OUT_ACCURACY_RATE }}%
d7fad0 131                     </el-form-item>
J 132                   </el-col>
133                   <el-col :span="4">
134                     <el-form-item label="真实平均值:">
f3edfb 135                       {{ calRateForm.itemAvg }}
d7fad0 136                     </el-form-item>
J 137                   </el-col>
138                   <el-col :span="4">
139                     <el-form-item label="真实最大值:">
f3edfb 140                       {{ calRateForm.itemMax }}
d7fad0 141                     </el-form-item>
J 142                   </el-col>
143                   <el-col :span="4">
144                     <el-form-item label="真实最小值:">
f3edfb 145                       {{ calRateForm.itemMin }}
d7fad0 146                     </el-form-item>
J 147                   </el-col>
148                   <el-col :span="4">
149                     <el-form-item label="真实累积量:">
f3edfb 150                       {{ calRateForm.realCumulant }}
d7fad0 151                     </el-form-item>
J 152                   </el-col>
153                 </el-row>
154               </el-form>
155               <el-form :inline="true" :model="formData" label-width="100px">
156                 <el-row>
157                   <el-col :span="12">
158                     <el-form-item label="数据类型">
159                       <el-checkbox-group v-model="formData.chartCheck" @change="changeChartCheck">
f3edfb 160                         <el-checkbox v-for="item in formData.chartOptions" :label="item"
161                                      :key="item">{{ item }}
d7fad0 162                         </el-checkbox>
J 163                       </el-checkbox-group>
164                     </el-form-item>
165                   </el-col>
166                   <el-col :span="6">
167                     <el-form-item>
f3edfb 168                       <el-radio v-model="formData.isMultipleY" :label="false"
169                                 @input="onChangeMultipleY">单坐标轴
170                       </el-radio>
171                       <el-radio v-model="formData.isMultipleY" :label="true"
172                                 @input="onChangeMultipleY">多坐标轴
173                       </el-radio>
d7fad0 174                     </el-form-item>
J 175                   </el-col>
176                 </el-row>
177               </el-form>
f3edfb 178               <div ref="dataAnalysisChart" style="height: 500px;"></div>
d7fad0 179             </div>
J 180           </div>
181         </div>
182       </el-form>
183     </div>
184   </el-card>
185 </template>
186 <script lang="ts" setup>
f3edfb 187 import {getYMDHMS} from "@/utils/dateUtil"
188 import * as McsApi from '@/api/model/mcs'
189 import * as echarts from "echarts";
190 import {Search, ArrowLeft, ArrowRight,} from '@element-plus/icons-vue'
d7fad0 191
f3edfb 192 defineOptions({name: 'AnalysisformData'})
d7fad0 193
f3edfb 194 const message = useMessage() // 消息弹窗
195 const {t} = useI18n() // 国际化
196 const dataAnalysisChart = ref(null);
197 const loading1 = ref(false) // 列表的加载中
198 const loading2 = ref(false) // 列表的加载中
199 const total = ref(0) // 列表的总页数
200 const list = ref([]) // 字典表格数据
201 let formData = ref({
202   rangeDate: '',
203   startTime: '',
204   endTime: '',
205   predictTime: '',
206   predictTimeStr: '',
207   startTimeStr: '',
208   endTimeStr: '',
209   predictTimeStamp: 0,
210   startTimeStamp: 0,
211   endTimeStamp: 0,
212   currentStamp: '',
213   currentStamp60: '',
214   predictStamp: '',
215   chartCheck: ['T+L', '真实值'],
216   chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
217   checkedItemData: [],
218   backItem: '',
219   backValue: 0,
220   backCoe: 1,
221   preCumulant: 0,
222   realCumulant: 0,
223   queryStep: 2,
224   isMultipleYRadio: '单坐标轴',
225   isMultipleY: false,
adf924 226   predictFreq: 2,
f3edfb 227 })
33a088 228 const calRateFormRef = ref()
229 const calRateForm = ref({
230   calItem: undefined,
f3edfb 231   IN_DEVIATION: 0,
232   OUT_DEVIATION: 0,
233   IN_ACCURACY_RATE: 0,
234   OUT_ACCURACY_RATE: 0,
235   itemAvg: 0,
236   itemMax: 0,
237   itemMin: 0,
238   itemPreAvg: 0,
239   itemPreMax: 0,
240   itemPreMin: 0,
241   preCumulant: 0,
242   realCumulant: 0
243 })
244 let itemData = ref({
245   currentTreeList: [],
246   chart: {},
247   option: {}
248 })
249 const treeData = ref([])
250 const itemDataObject = ref()
251 const timer = ref()
252 let myChart = null;
f26b8f 253
f3edfb 254 const formRules = reactive({
255   calItem: [{required: true, message: '预测项不能为空', trigger: 'blur'}],
256   IN_DEVIATION: [{required: true, message: '精准度偏差不能为空', trigger: 'blur'}],
257   OUT_DEVIATION: [{required: true, message: '不可信率偏差不能为空', trigger: 'blur'}],
258 })
d7fad0 259
f3edfb 260 /** 查询列表 */
f9ae47 261 const getList = async (isClear = true) => {
f3edfb 262   loading1.value = true
263   try {
264     if (!formData.value.chartCheck) {
265       formData.value.chartCheck = ['真实值']
d7fad0 266     }
f3edfb 267     let chartCheckArray = formData.value.chartCheck;
268     if (!formData.value.checkedItemData || formData.value.checkedItemData.length == 0) {
269       itemData.value.option = {};
270       return;
d7fad0 271     }
f3edfb 272     let outIds = formData.value.checkedItemData.map(item => {
273       return item.id
d7fad0 274     })
f3edfb 275     const params = reactive({
276       outIds: outIds,
277       predictTime: formData.value.predictTime,
278       startTime: formData.value.startTime,
279       endTime: formData.value.endTime
280     })
281     const data = await McsApi.getPreDataCharts(params)
282     formData.value.predictTime = data.predictTime;
283     formData.value.startTime = data.startTime
284     formData.value.endTime = data.endTime
d7fad0 285
f3edfb 286     let xAxisData = data.categories;
287     let yAxisData = [];
288     let offset = 0;
289     let yAxisIndex = 0;
290     let legendData = [];
291     let yMaxArr = [];
292     let seriesData = [];
293     seriesData.push({
294       name: '',
295       data: [null],
296       type: 'line',
297       smooth: true,
298       color: 'green',
299       markLine: {
300         silent: true,
301         lineStyle: {
302           color: '#32a487',
303           width: 2
304         },
305         data: [{
306           xAxis: formData.value.predictTime
307         }],
308         label: {
309           normal: {
310             formatter: formData.value.predictTime
311           }
312         },
313         symbol: ['circle', 'none'],
314       },
315     });
316     itemDataObject.value = {}
317     for (let i = 0; i < data.dataViewList.length; i++) {
318       let dataView = data.dataViewList[i]
319       itemDataObject.value[dataView.outId] = dataView;
320       let maxValue = dataView.maxValue;
321       let minValue = dataView.minValue;
322       yAxisIndex = formData.value.isMultipleY ? i : 0;
323       let yMax = maxValue;
324       if (maxValue < 0) {
325         maxValue = 1;
326       } else if (maxValue < 10) {
327         yMax = (Math.ceil(maxValue * 11) / 10).toFixed(1);
328       } else if (maxValue < 100) {
329         yMax = (Math.ceil(maxValue * 1.1 / 5) * 5);
330       } else {
331         yMax = (Math.ceil(maxValue * 1.1 / 10) * 10);
332       }
333       yMaxArr.push(yMax);
334       let yMin = minValue;
335       if (minValue >= 0) {
336         yMin = 0;
337       } else if (minValue > -10) {
338         yMin = (Math.floor(minValue * 11) / 10).toFixed(1);
339       } else if (minValue > -100) {
340         yMin = (Math.floor(minValue * 1.1 / 5) * 5);
341       } else {
342         yMin = (Math.floor(minValue * 1.1 / 10) * 10);
343       }
344       yAxisData.push({
345         type: 'value',
346         name: "",
347         min: yMin,
348         max: yMax,
349         position: 'left',
350         offset: offset,
351         splitLine: {
352           show: false
353         },
354         axisLine: {
355           show: true,
356           lineStyle: {}
357         },
358         axisLabel: {
359           formatter: '{value}'
360         }
361       })
362       offset = offset + 40
363       if (chartCheckArray.indexOf('真实值') !== -1) {
32396c 364         let legendName = dataView.resultName + '(真实)';
f3edfb 365         legendData.push(legendName);
366         seriesData.push({
367           name: legendName,
368           data: dataView.realData || [],
369           type: 'line',
370           yAxisIndex: yAxisIndex,
371           showSymbol: false,
f9ae47 372           smooth: false,
f3edfb 373           lineStyle: {
374             width: 2
375           }
376         });
377       }
378       if (chartCheckArray.indexOf('T+N') !== -1) {
32396c 379         let legendName = dataView.resultName + '(T+N)';
f9ae47 380         legendData.push(legendName);
f3edfb 381         seriesData.push({
382           name: legendName,
383           data: dataView.preDataN || [],
384           type: 'line',
385           yAxisIndex: yAxisIndex,
386           showSymbol: false,
f9ae47 387           smooth: false,
f3edfb 388           lineStyle: {
389             width: 2
390           }
391         });
392       }
393       if (chartCheckArray.indexOf('T+L') !== -1) {
32396c 394         let legendName = dataView.resultName + '(T+L)';
f3edfb 395         legendData.push(legendName);
396         seriesData.push({
397           name: legendName,
398           data: dataView.preDataL || [],
399           type: 'line',
400           showSymbol: false,
401           connectNulls: true,
402           yAxisIndex: yAxisIndex,
f9ae47 403           smooth: false,
f3edfb 404           lineStyle: {
405             width: 2
406           }
407         });
408       }
409       if (chartCheckArray.indexOf('当时') !== -1) {
32396c 410         let legendName = dataView.resultName + '(当时)';
f3edfb 411         legendData.push(legendName);
412         seriesData.push({
413           name: legendName,
414           data: dataView.curData || [],
415           type: 'line',
416           yAxisIndex: yAxisIndex,
f9ae47 417           showSymbol: true,
418           smooth: false,
f3edfb 419           lineStyle: {
f9ae47 420             width: 3
f3edfb 421           }
422         });
423       }
424       if (chartCheckArray.indexOf('调整值') !== -1) {
32396c 425         let legendName = dataView.resultName + '(调整值)';
f3edfb 426         legendData.push(legendName);
427         seriesData.push({
428           name: legendName,
429           data: dataView.adjData || [],
430           type: 'line',
431           yAxisIndex: yAxisIndex,
432           showSymbol: false,
433           connectNulls: true,
f9ae47 434           smooth: false,
f3edfb 435           lineStyle: {
436             width: 2,
437             type: 'dashed'
438           }
439         });
440       }
d7fad0 441     }
f3edfb 442     //如果最大值相差不大,改成一致大小
443     if (yMaxArr.length > 1) {
444       let max = Math.max.apply(null, yMaxArr);
445       let min = Math.min.apply(null, yMaxArr);
446       if (Math.abs((max - min) / max) <= 0.2) {
447         for (let i = 0; i < yAxisData.length; i++) {
448           yAxisData[i].max = max;
449         }
450       }
d7fad0 451     }
f3edfb 452     myChart = echarts.init(dataAnalysisChart.value);
453     let option = {
454       title: {
455         text: ''
456       },
457       tooltip: {
458         trigger: 'axis'
459       },
460       legend: {
461         show: true,
462         data: legendData,
463         top: 10
464       },
465       grid: {
466         top: '20%',
467         left: '3%',
468         right: '6%',
469         bottom: '3%',
470         containLabel: true
471       },
472       xAxis: {
473         type: 'category',
474         boundaryGap: false,
475         data: xAxisData
476       },
477       yAxis: formData.value.isMultipleY ? yAxisData : {
478         type: 'value',
479         splitLine: {show: false},
480         axisLine: {show: true}
481       },
482       dataZoom: [
483         {
484           type: 'inside',
485           start: 0,
486           end: 100
487         },
488         {
489           start: 0,
490           end: 10
491         }
492       ],
493       series: seriesData
d7fad0 494     }
f9ae47 495     if (isClear) {
496       myChart.clear()
497     }
f3edfb 498     myChart.setOption(option)
499   } finally {
500     loading1.value = false
d7fad0 501   }
f3edfb 502 }
503
504 onMounted(() => {
33a088 505   resetForm()
f3edfb 506   getPreItemTree()
507 })
508
509 async function getPreItemTree() {
510   treeData.value = await McsApi.getPredictItemTree()
f9ae47 511 }
512
513 function changeChartCheck(value) {
514   getList(true)
f3edfb 515 }
516
517 function leftSearchDataByRange() {
518   let mins = getRangeMins();
519   let startTime = formData.value.startTime;
520   let endTime = formData.value.endTime;
521   let predictTime = formData.value.predictTime;
522   if (predictTime) {
523     predictTime = getYMDHMS(new Date(predictTime) - 1000 * 60 * mins);
524     formData.value.predictTime = predictTime;
525   }
526   if (startTime) {
527     startTime = getYMDHMS(new Date(startTime) - 1000 * 60 * mins);
528     formData.value.startTime = startTime;
529   }
530   if (endTime) {
531     endTime = getYMDHMS(new Date(endTime) - 1000 * 60 * mins);
532     formData.value.endTime = endTime;
533   }
f9ae47 534   getList(false);
f3edfb 535 }
536
537 function getRangeMins() {
538   let result: string | number = 0;
539   if (formData.value.startTime && formData.value.endTime) {
540     let startStamp = new Date(formData.value.startTime).getTime();
541     let endStamp = new Date(formData.value.endTime).getTime();
542     let queryStep = ((endStamp - startStamp) / (1000 * 60)).toFixed(0);
543     result = queryStep >= 0 ? queryStep : 0;
544   }
545   return result;
546 }
547
548 function onCheckTree(data, checked, indeterminate) {
549   formData.value.checkedItemData = [];
550   if (checked.checkedNodes) {
551     formData.value.checkedItemData = [...checked.checkedNodes]
552   }
553   debounce(getList, 1000);
554 }
555
556 function debounce(func, wait) {
557   let args = [];
558   if (timer.value) {
559     clearTimeout(timer.value);
560   }
561   timer.value = setTimeout(() => {
562     func.apply(this, args);
563     timer.value = null;
564   }, wait)
565 }
566
567 function calItemBaseVale() {
568   if (!calRateForm.value.calItem) {
569     calRateForm.value.itemPreMax = 0;
570     calRateForm.value.itemPreMin = 0;
571     calRateForm.value.itemPreAvg = 0;
572     calRateForm.value.preCumulant = 0;
573     calRateForm.value.itemMax = 0;
574     calRateForm.value.itemMin = 0;
575     calRateForm.value.itemAvg = 0;
576     calRateForm.value.realCumulant = 0;
577   } else {
33a088 578     let dataView = itemDataObject.value[calRateForm.value.calItem]
f3edfb 579     calRateForm.value.itemPreMax = dataView.preMax;
580     calRateForm.value.itemPreMin = dataView.preMin;
581     calRateForm.value.itemPreAvg = dataView.preAvg;
582     calRateForm.value.preCumulant = dataView.preCumulant;
583     calRateForm.value.itemMax = dataView.hisMax;
584     calRateForm.value.itemMin = dataView.hisMin;
585     calRateForm.value.itemAvg = dataView.hisAvg;
586     calRateForm.value.realCumulant = dataView.hisCumulant;
587   }
588 }
589
590 function calAccuracyRate() {
591   this.$refs['calRateForm'].validate((valid) => {
592     if (!valid) {
593       return false
594     }
595     let dataView = itemDataObject[calRateForm.value.calItem]
596     let seriesReaData = dataView.realData;
597     let seriesPreData = dataView.preDataL;
598     if (seriesReaData == null || seriesPreData == null ||
599       seriesReaData.length === 0 || seriesPreData.length === 0) {
600       loading2.value = false;
601       return;
602     }
603     let predictValueMap = {};
604     seriesPreData.forEach(function (item) {
605       predictValueMap[item[0]] = item[1];
606     })
607     let pointValueMap = {};
608     seriesReaData.forEach(function (item) {
609       pointValueMap[item[0]] = item[1];
610     })
611     let inDeviation = Number(calRateForm.value.IN_DEVIATION);
612     let outDeviation = Number(calRateForm.value.OUT_DEVIATION);
613     if (inDeviation === 0 && outDeviation === 0) {
614       loading2.value = false;
615       return;
616     }
617     let inDeviationCount = 0;
618     let outDeviationCount = 0;
619     let totalCount = 0;
620     for (let key in predictValueMap) {
621       let predictValue = predictValueMap[key];
622       let pointValue = pointValueMap[key];
623       if (pointValue == null || "" === pointValue || predictValue == null || "" === predictValue) {
624         continue;
625       }
626       let deviationAbs = (predictValue - pointValue) >= 0 ? (predictValue - pointValue) : (predictValue - pointValue) * -1;
627       if (deviationAbs < inDeviation) {
628         inDeviationCount = inDeviationCount + 1;
629       }
630       if (deviationAbs > outDeviation) {
631         outDeviationCount = outDeviationCount + 1;
632       }
633       totalCount = totalCount + 1;
634     }
635
636     let rateIn = (inDeviationCount / totalCount * 100).toFixed(2);
637     let rateOut = (outDeviationCount / totalCount * 100).toFixed(2);
638     calRateForm.value.IN_ACCURACY_RATE = Number(rateIn);
639     calRateForm.value.OUT_ACCURACY_RATE = Number(rateOut);
640     loading2.value = false;
641   })
642 }
643
644 function rightSearchDataByRange() {
645   let mins = getRangeMins();
646   let startTime = formData.value.startTime;
647   let endTime = formData.value.endTime;
648   let predictTime = formData.value.predictTime;
649   if (predictTime) {
650     predictTime = getYMDHMS(new Date(predictTime) - 0 + 1000 * 60 * mins);
651     formData.value.predictTime = predictTime;
652   }
653   if (startTime) {
654     startTime = getYMDHMS(new Date(startTime) - 0 + 1000 * 60 * mins);
655     formData.value.startTime = startTime;
656   }
657   if (endTime) {
658     endTime = getYMDHMS(new Date(endTime) - 0 + 1000 * 60 * mins);
659     formData.value.endTime = endTime;
660   }
f9ae47 661   getList(false);
f3edfb 662 }
d7fad0 663
33a088 664 /** 重置表单 */
665 const resetForm = () => {
666   formData.value = {
667     rangeDate: '',
668     startTime: '',
669     endTime: '',
670     predictTime: '',
671     predictTimeStr: '',
672     startTimeStr: '',
673     endTimeStr: '',
674     predictTimeStamp: 0,
675     startTimeStamp: 0,
676     endTimeStamp: 0,
677     currentStamp: '',
678     currentStamp60: '',
679     predictStamp: '',
680     chartCheck: ['T+L', '真实值'],
681     chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
682     checkedItemData: [],
683     backItem: '',
684     backValue: 0,
685     backCoe: 1,
686     preCumulant: 0,
687     realCumulant: 0,
688     queryStep: 2,
689     isMultipleYRadio: '单坐标轴',
690     isMultipleY: false,
f9ae47 691     predictFreq: 2,
33a088 692   }
693   calRateForm.value = {
694     calItem: undefined,
695     IN_DEVIATION: 0,
696     OUT_DEVIATION: 0,
697     IN_ACCURACY_RATE: 0,
698     OUT_ACCURACY_RATE: 0,
699     itemAvg: 0,
700     itemMax: 0,
701     itemMin: 0,
702     itemPreAvg: 0,
703     itemPreMax: 0,
704     itemPreMin: 0,
705     preCumulant: 0,
706     realCumulant: 0
707   }
708   calRateFormRef.value?.resetFields()
709 }
d7fad0 710 </script>
J 711 <style scoped>
f3edfb 712 .el-form-item {
713   margin-bottom: 0 !important;
714 }
d7fad0 715
f3edfb 716 .his-body-chart {
717   height: 100%;
718   border: 1px solid lightgray;
719   padding: 10px;
720 }
d7fad0 721
f3edfb 722 .his-body-tree {
723   height: 100%;
724   border: 1px solid lightgray;
725   padding: 10px;
726 }
d7fad0 727
f3edfb 728 .his-body-right {
729   width: 80%;
730   height: 100%;
731   padding-top: 10px;
732 }
d7fad0 733
f3edfb 734 .his-body-left {
735   width: 20%;
736   height: 100%;
737   padding: 10px 10px 0 0;
738 }
d7fad0 739
f3edfb 740 .his-body {
741   width: 100%;
742   height: calc(calc(100vh - 68px - 38px - 160px));
743   display: flex;
744   flex-direction: row;
745   justify-content: flex-start;
746   align-content: flex-start;
747 }
d7fad0 748 </style>