houzhongjian
2024-11-27 fd13b0017518273406ee1a9906c07d079e4a9ac4
提交 | 用户 | 时间
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,
226   predictFreq: 3,
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 /** 查询列表 */
261 const getList = async () => {
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,
372           smooth: true,
373           lineStyle: {
374             width: 2
375           }
376         });
377       }
378       if (chartCheckArray.indexOf('T+N') !== -1) {
32396c 379         let legendName = dataView.resultName + '(T+N)';
f3edfb 380         seriesData.push({
381           name: legendName,
382           data: dataView.preDataN || [],
383           type: 'line',
384           yAxisIndex: yAxisIndex,
385           showSymbol: false,
386           smooth: true,
387           lineStyle: {
388             width: 2
389           }
390         });
391       }
392       if (chartCheckArray.indexOf('T+L') !== -1) {
32396c 393         let legendName = dataView.resultName + '(T+L)';
f3edfb 394         legendData.push(legendName);
395         seriesData.push({
396           name: legendName,
397           data: dataView.preDataL || [],
398           type: 'line',
399           showSymbol: false,
400           connectNulls: true,
401           yAxisIndex: yAxisIndex,
402           smooth: true,
403           lineStyle: {
404             width: 2
405           }
406         });
407       }
408       if (chartCheckArray.indexOf('当时') !== -1) {
32396c 409         let legendName = dataView.resultName + '(当时)';
f3edfb 410         legendData.push(legendName);
411         seriesData.push({
412           name: legendName,
413           data: dataView.curData || [],
414           type: 'line',
415           yAxisIndex: yAxisIndex,
416           showSymbol: false,
417           smooth: true,
418           lineStyle: {
419             width: 2
420           }
421         });
422       }
423       if (chartCheckArray.indexOf('调整值') !== -1) {
32396c 424         let legendName = dataView.resultName + '(调整值)';
f3edfb 425         legendData.push(legendName);
426         seriesData.push({
427           name: legendName,
428           data: dataView.adjData || [],
429           type: 'line',
430           yAxisIndex: yAxisIndex,
431           showSymbol: false,
432           connectNulls: true,
433           smooth: true,
434           lineStyle: {
435             width: 2,
436             type: 'dashed'
437           }
438         });
439       }
d7fad0 440     }
f3edfb 441     //如果最大值相差不大,改成一致大小
442     if (yMaxArr.length > 1) {
443       let max = Math.max.apply(null, yMaxArr);
444       let min = Math.min.apply(null, yMaxArr);
445       if (Math.abs((max - min) / max) <= 0.2) {
446         for (let i = 0; i < yAxisData.length; i++) {
447           yAxisData[i].max = max;
448         }
449       }
d7fad0 450     }
f3edfb 451     myChart = echarts.init(dataAnalysisChart.value);
452     let option = {
453       title: {
454         text: ''
455       },
456       tooltip: {
457         trigger: 'axis'
458       },
459       legend: {
460         show: true,
461         data: legendData,
462         top: 10
463       },
464       grid: {
465         top: '20%',
466         left: '3%',
467         right: '6%',
468         bottom: '3%',
469         containLabel: true
470       },
471       xAxis: {
472         type: 'category',
473         boundaryGap: false,
474         data: xAxisData
475       },
476       yAxis: formData.value.isMultipleY ? yAxisData : {
477         type: 'value',
478         splitLine: {show: false},
479         axisLine: {show: true}
480       },
481       dataZoom: [
482         {
483           type: 'inside',
484           start: 0,
485           end: 100
486         },
487         {
488           start: 0,
489           end: 10
490         }
491       ],
492       series: seriesData
d7fad0 493     }
f3edfb 494     myChart.clear()
495     myChart.setOption(option)
496   } finally {
497     loading1.value = false
d7fad0 498   }
f3edfb 499 }
500
501 onMounted(() => {
33a088 502   resetForm()
f3edfb 503   getPreItemTree()
504 })
505
506 async function getPreItemTree() {
507   treeData.value = await McsApi.getPredictItemTree()
508 }
509
510 function leftSearchDataByRange() {
511   let mins = getRangeMins();
512   let startTime = formData.value.startTime;
513   let endTime = formData.value.endTime;
514   let predictTime = formData.value.predictTime;
515   if (predictTime) {
516     predictTime = getYMDHMS(new Date(predictTime) - 1000 * 60 * mins);
517     formData.value.predictTime = predictTime;
518   }
519   if (startTime) {
520     startTime = getYMDHMS(new Date(startTime) - 1000 * 60 * mins);
521     formData.value.startTime = startTime;
522   }
523   if (endTime) {
524     endTime = getYMDHMS(new Date(endTime) - 1000 * 60 * mins);
525     formData.value.endTime = endTime;
526   }
527   getList();
528 }
529
530 function getRangeMins() {
531   let result: string | number = 0;
532   if (formData.value.startTime && formData.value.endTime) {
533     let startStamp = new Date(formData.value.startTime).getTime();
534     let endStamp = new Date(formData.value.endTime).getTime();
535     let queryStep = ((endStamp - startStamp) / (1000 * 60)).toFixed(0);
536     result = queryStep >= 0 ? queryStep : 0;
537   }
538   return result;
539 }
540
541 function onCheckTree(data, checked, indeterminate) {
542   formData.value.checkedItemData = [];
543   if (checked.checkedNodes) {
544     formData.value.checkedItemData = [...checked.checkedNodes]
545   }
546   debounce(getList, 1000);
547 }
548
549 function debounce(func, wait) {
550   let args = [];
551   if (timer.value) {
552     clearTimeout(timer.value);
553   }
554   timer.value = setTimeout(() => {
555     func.apply(this, args);
556     timer.value = null;
557   }, wait)
558 }
559
560 function calItemBaseVale() {
561   if (!calRateForm.value.calItem) {
562     calRateForm.value.itemPreMax = 0;
563     calRateForm.value.itemPreMin = 0;
564     calRateForm.value.itemPreAvg = 0;
565     calRateForm.value.preCumulant = 0;
566     calRateForm.value.itemMax = 0;
567     calRateForm.value.itemMin = 0;
568     calRateForm.value.itemAvg = 0;
569     calRateForm.value.realCumulant = 0;
570   } else {
33a088 571     let dataView = itemDataObject.value[calRateForm.value.calItem]
f3edfb 572     calRateForm.value.itemPreMax = dataView.preMax;
573     calRateForm.value.itemPreMin = dataView.preMin;
574     calRateForm.value.itemPreAvg = dataView.preAvg;
575     calRateForm.value.preCumulant = dataView.preCumulant;
576     calRateForm.value.itemMax = dataView.hisMax;
577     calRateForm.value.itemMin = dataView.hisMin;
578     calRateForm.value.itemAvg = dataView.hisAvg;
579     calRateForm.value.realCumulant = dataView.hisCumulant;
580   }
581 }
582
583 function calAccuracyRate() {
584   this.$refs['calRateForm'].validate((valid) => {
585     if (!valid) {
586       return false
587     }
588     let dataView = itemDataObject[calRateForm.value.calItem]
589     let seriesReaData = dataView.realData;
590     let seriesPreData = dataView.preDataL;
591     if (seriesReaData == null || seriesPreData == null ||
592       seriesReaData.length === 0 || seriesPreData.length === 0) {
593       loading2.value = false;
594       return;
595     }
596     let predictValueMap = {};
597     seriesPreData.forEach(function (item) {
598       predictValueMap[item[0]] = item[1];
599     })
600     let pointValueMap = {};
601     seriesReaData.forEach(function (item) {
602       pointValueMap[item[0]] = item[1];
603     })
604     let inDeviation = Number(calRateForm.value.IN_DEVIATION);
605     let outDeviation = Number(calRateForm.value.OUT_DEVIATION);
606     if (inDeviation === 0 && outDeviation === 0) {
607       loading2.value = false;
608       return;
609     }
610     let inDeviationCount = 0;
611     let outDeviationCount = 0;
612     let totalCount = 0;
613     for (let key in predictValueMap) {
614       let predictValue = predictValueMap[key];
615       let pointValue = pointValueMap[key];
616       if (pointValue == null || "" === pointValue || predictValue == null || "" === predictValue) {
617         continue;
618       }
619       let deviationAbs = (predictValue - pointValue) >= 0 ? (predictValue - pointValue) : (predictValue - pointValue) * -1;
620       if (deviationAbs < inDeviation) {
621         inDeviationCount = inDeviationCount + 1;
622       }
623       if (deviationAbs > outDeviation) {
624         outDeviationCount = outDeviationCount + 1;
625       }
626       totalCount = totalCount + 1;
627     }
628
629     let rateIn = (inDeviationCount / totalCount * 100).toFixed(2);
630     let rateOut = (outDeviationCount / totalCount * 100).toFixed(2);
631     calRateForm.value.IN_ACCURACY_RATE = Number(rateIn);
632     calRateForm.value.OUT_ACCURACY_RATE = Number(rateOut);
633     loading2.value = false;
634   })
635 }
636
637 function rightSearchDataByRange() {
638   let mins = getRangeMins();
639   let startTime = formData.value.startTime;
640   let endTime = formData.value.endTime;
641   let predictTime = formData.value.predictTime;
642   if (predictTime) {
643     predictTime = getYMDHMS(new Date(predictTime) - 0 + 1000 * 60 * mins);
644     formData.value.predictTime = predictTime;
645   }
646   if (startTime) {
647     startTime = getYMDHMS(new Date(startTime) - 0 + 1000 * 60 * mins);
648     formData.value.startTime = startTime;
649   }
650   if (endTime) {
651     endTime = getYMDHMS(new Date(endTime) - 0 + 1000 * 60 * mins);
652     formData.value.endTime = endTime;
653   }
654   getList();
655 }
d7fad0 656
33a088 657 /** 重置表单 */
658 const resetForm = () => {
659   formData.value = {
660     rangeDate: '',
661     startTime: '',
662     endTime: '',
663     predictTime: '',
664     predictTimeStr: '',
665     startTimeStr: '',
666     endTimeStr: '',
667     predictTimeStamp: 0,
668     startTimeStamp: 0,
669     endTimeStamp: 0,
670     currentStamp: '',
671     currentStamp60: '',
672     predictStamp: '',
673     chartCheck: ['T+L', '真实值'],
674     chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
675     checkedItemData: [],
676     backItem: '',
677     backValue: 0,
678     backCoe: 1,
679     preCumulant: 0,
680     realCumulant: 0,
681     queryStep: 2,
682     isMultipleYRadio: '单坐标轴',
683     isMultipleY: false,
684     predictFreq: 3,
685   }
686   calRateForm.value = {
687     calItem: undefined,
688     IN_DEVIATION: 0,
689     OUT_DEVIATION: 0,
690     IN_ACCURACY_RATE: 0,
691     OUT_ACCURACY_RATE: 0,
692     itemAvg: 0,
693     itemMax: 0,
694     itemMin: 0,
695     itemPreAvg: 0,
696     itemPreMax: 0,
697     itemPreMin: 0,
698     preCumulant: 0,
699     realCumulant: 0
700   }
701   calRateFormRef.value?.resetFields()
702 }
d7fad0 703 </script>
J 704 <style scoped>
f3edfb 705 .el-form-item {
706   margin-bottom: 0 !important;
707 }
d7fad0 708
f3edfb 709 .his-body-chart {
710   height: 100%;
711   border: 1px solid lightgray;
712   padding: 10px;
713 }
d7fad0 714
f3edfb 715 .his-body-tree {
716   height: 100%;
717   border: 1px solid lightgray;
718   padding: 10px;
719 }
d7fad0 720
f3edfb 721 .his-body-right {
722   width: 80%;
723   height: 100%;
724   padding-top: 10px;
725 }
d7fad0 726
f3edfb 727 .his-body-left {
728   width: 20%;
729   height: 100%;
730   padding: 10px 10px 0 0;
731 }
d7fad0 732
f3edfb 733 .his-body {
734   width: 100%;
735   height: calc(calc(100vh - 68px - 38px - 160px));
736   display: flex;
737   flex-direction: row;
738   justify-content: flex-start;
739   align-content: flex-start;
740 }
d7fad0 741 </style>