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