From e8dd9ebcac7edb33ec935520e9b9ca4ceb865cd0 Mon Sep 17 00:00:00 2001
From: houzhongjian <houzhongyi@126.com>
Date: 星期五, 15 十一月 2024 16:49:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/model/pre/item/MmPredictItemForm.vue  |   30 
 src/api/data/plan/item/index.ts                 |    2 
 /dev/null                                       |  149 -----
 src/views/model/pre/item/MmPredictItemChart.vue |  143 +++-
 src/api/model/sche/model/index.ts               |   21 
 src/api/model/pre/dm/index.ts                   |    2 
 src/api/model/mcs/index.ts                      |   26 
 src/views/data/point/DaPointChart.vue           |  265 ++++----
 src/views/model/pre/analysis/index.vue          | 1099 +++++++++++++++++++------------------
 9 files changed, 875 insertions(+), 862 deletions(-)

diff --git a/src/api/data/plan/item/index.ts b/src/api/data/plan/item/index.ts
index e42e999..eec13e9 100644
--- a/src/api/data/plan/item/index.ts
+++ b/src/api/data/plan/item/index.ts
@@ -50,7 +50,7 @@
 
 //获取下拉集合
 export const getItemList = (params: PageParam) => {
-  return request.get({ url: '/data/plan-item/getList', params})
+  return request.get({ url: '/data/plan-item/list', params})
 }
 
 // 查询Plan图表
diff --git a/src/api/model/mcs/index.ts b/src/api/model/mcs/index.ts
new file mode 100644
index 0000000..503dcf4
--- /dev/null
+++ b/src/api/model/mcs/index.ts
@@ -0,0 +1,26 @@
+import request from '@/config/axios'
+
+export interface PreDataBarLineReqVO {
+  outIds: string[],
+  predictTime: string,
+  startTime: string,
+  endTime: string
+}
+
+export interface PreDataItemChartReqVO {
+  itemId: string,
+  startTime: string,
+  endTime: string
+}
+
+export const getPredictItemTree = () => {
+  return request.get({ url: '/model/api/mcs/predict-item/tree'})
+}
+
+export const getPreDataCharts = (data: PreDataBarLineReqVO) => {
+  return request.post({ url: '/model/api/mcs/predict-data/charts', data })
+}
+
+export const getPreDataItemChart = (data: PreDataItemChartReqVO) => {
+  return request.post({ url: '/model/api/mcs/predict-data/item-chart', data })
+}
diff --git a/src/api/model/pre/dm/index.ts b/src/api/model/pre/dm/index.ts
index aa652b6..69e13c3 100644
--- a/src/api/model/pre/dm/index.ts
+++ b/src/api/model/pre/dm/index.ts
@@ -1,7 +1,7 @@
 import request from '@/config/axios'
 
 export interface DmModuleVO {
-  id: string
+  id: string,
   modulename: string,
   moduletype: string,
   cycle: string
diff --git a/src/api/model/pre/result/index.ts b/src/api/model/pre/result/index.ts
deleted file mode 100644
index 5561e94..0000000
--- a/src/api/model/pre/result/index.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import request from '@/config/axios'
-
-export interface MmResultTableVO {
-  id: string
-  tablename: string,
-}
-
-export interface MmResultTablePageReqVO extends PageParam {
-  tablename?: string
-}
-
-// 查询MmResultTable列表
-export const getMmResultTablePage = (params: MmResultTablePageReqVO) => {
-  return request.get({ url: '/model/pre/result-table/page', params })
-}
-
-// 查询MmResultTable详情
-export const getMmResultTable = (id: number) => {
-  return request.get({ url: `/model/pre/result-table/get/${id}`})
-}
-
-// 新增MmResultTable
-export const createMmResultTable = (data: MmResultTableVO) => {
-  return request.post({ url: '/model/pre/result-table/create', data })
-}
-
-// 修改MmResultTable
-export const updateMmResultTable = (data: MmResultTableVO) => {
-  return request.put({ url: '/model/pre/result-table/update', data })
-}
-
-// 删除MmResultTable
-export const deleteMmResultTable = (id: number) => {
-  return request.delete({ url: '/model/pre/result-table/delete?id=' + id })
-}
-
-
-// 查询getResulttableList详情
-export const getResulttableList = () => {
-  return request.get({ url: `/model/pre/result-table/list`})
-}
-
-// 查询getResulttableList详情
-export const getResultstridList = () => {
-  return request.get({ url: `/model/pre/model-resultstr/list`})
-}
diff --git a/src/api/model/sche/model/index.ts b/src/api/model/sche/model/index.ts
index 3c5b8bc..8863d31 100644
--- a/src/api/model/sche/model/index.ts
+++ b/src/api/model/sche/model/index.ts
@@ -1,7 +1,9 @@
 import request from '@/config/axios'
 import * as DataPointApi from '@/api/data/da/point'
 import * as PredictItemApi from '@/api/model/pre/item'
+import * as PlanItemApi from '@/api/data/plan/item'
 import {CommonEnabled} from "@/utils/constants";
+import {getItemList, ItemVO} from "@/api/data/plan/item";
 
 export interface ScheduleModelVO {
   id: string
@@ -100,8 +102,25 @@
       )
     })
   }
+
+  const planItemList = ref([] as PlanItemApi.ItemVO)
+  planItemList.value = await PlanItemApi.getItemList({
+  })
+  const planList = []
+  if (planItemList.value) {
+    planItemList.value.forEach(item => {
+      planList.push(
+        {
+          id: item.id,
+          name:  item.itemName
+        }
+      )
+    })
+  }
+
   return {
     'DATAPOINT':pointList,
-    'PREDICTITEM': itemList
+    'PREDICTITEM': itemList,
+    'PLAN': planList,
   }
 }
diff --git a/src/views/data/point/DaPointChart.vue b/src/views/data/point/DaPointChart.vue
index e496d98..4fbed39 100644
--- a/src/views/data/point/DaPointChart.vue
+++ b/src/views/data/point/DaPointChart.vue
@@ -41,7 +41,8 @@
           :loading="exportLoading"
           v-hasPermi="['data:point:export']"
         >
-          <Icon icon="ep:download" />导出
+          <Icon icon="ep:download"/>
+          导出
         </el-button>
       </el-form-item>
     </el-form>
@@ -50,143 +51,147 @@
 </template>
 
 <script lang="ts" setup>
-  import {ref} from 'vue';
-  import * as echarts from 'echarts';
-  import * as DaPoint from '@/api/data/da/point/daPointChart'
-  import {getYMDHM0} from "@/utils/dateUtil"
-  import download from "@/utils/download";
-  const message = useMessage() // 消息弹窗
-  const visible = ref(false);
-  const chartDom = ref(null);
-  let myChart = null;
-  const chartParams = reactive({
-    codes:[],
-    startDate : undefined,
-    endDate: undefined,
-  })
-  const dataForm = ref({
-    id: "",
-    pointNo: "",
-    pointName: "",
-    pointTypeName: "",
-    startTime: getYMDHM0(new Date() - 60 * 60 * 1000),
-    endTime: "",
-  });
+import {ref} from 'vue';
+import * as echarts from 'echarts';
+import * as DaPoint from '@/api/data/da/point/daPointChart'
+import {getYMDHM0} from "@/utils/dateUtil"
+import download from "@/utils/download";
 
-  /** 打开弹窗 */
-  const open = async (row: object) => {
-    visible.value = true
-    dataForm.value.id = row.id;
-    dataForm.value.pointNo = row.pointNo;
-    dataForm.value.pointName = row.pointName;
-    getDataList();
-  }
+const message = useMessage() // 消息弹窗
+const visible = ref(false);
+const chartDom = ref(null);
+let myChart = null;
+const chartParams = reactive({
+  codes: [],
+  pointNo: undefined,
+  startDate: undefined,
+  endDate: undefined,
+})
+const dataForm = ref({
+  id: "",
+  pointNo: "",
+  pointName: "",
+  pointTypeName: "",
+  startTime: getYMDHM0(new Date() - 60 * 60 * 1000),
+  endTime: "",
+});
 
-  defineExpose({open}) // 提供 open 方法,用于打开弹窗
+/** 打开弹窗 */
+const open = async (row: object) => {
+  visible.value = true
+  dataForm.value.id = row.id;
+  dataForm.value.pointNo = row.pointNo;
+  dataForm.value.pointName = row.pointName;
+  getDataList();
+}
 
-  async function getDataList() {
-    visible.value = true;
-    if (dataForm.value.id) {
-      try {
-        chartParams.codes=[dataForm.value.pointNo];
-        chartParams.startDate = dataForm.value.startTime;
-        chartParams.endDate = dataForm.value.endTime;
-        const data = await DaPoint.getPointDaChart(chartParams)
-        let seriesData = []
-        data.series.forEach(item => {
-          seriesData.push({
-            name: item.name,
-            type: "line",
-            data: item.data,
-            showSymbol: true,
-            smooth: false,
-            lineStyle: {
-              normal: {
-                color: "#5B8FF9",
-                width: 1,
-              },
-            },
-          });
-        })
+defineExpose({open}) // 提供 open 方法,用于打开弹窗
 
-        myChart = echarts.init(chartDom.value);
-        const option = {
-          title: {
-            text: dataForm.value.pointName,
-            top: 0,
-            left: "1%",
-            textStyle: {
-              fontSize: 14,
-            },
-          },
-          tooltip: {
-            trigger: "axis",
-            axisPointer: {
-              type: "line",
-              lineStyle: {
-                color: "#cccccc",
-                width: "1",
-                type: "dashed",
-              },
-            },
-          },
-          legend: {
-            show: false,
-            top: 10,
-          },
-          grid: {
-            top: 30,
-            left: "3%",
-            right: "5%",
-            bottom: 10,
-            containLabel: true,
-          },
-          xAxis: {
-            type: "category",
-            boundaryGap: false,
-            data: data.categories,
-          },
-          yAxis: {
-            type: "value",
-          },
-          dataZoom: [
-            {
-              type: "inside",
-            },
-          ],
-          series: seriesData,
-        };
-        myChart.setOption(option);
-      } catch (error) {
-        console.error(error)
-      }
-    }
-  }
-  /** 导出按钮操作 */
-  const exportLoading = ref(false)
-  const handleExport = async () => {
-    chartParams.codes=[dataForm.value.pointNo];
-    chartParams.startDate = dataForm.value.startTime;
-    chartParams.endDate = dataForm.value.endTime;
+async function getDataList() {
+  visible.value = true;
+  if (dataForm.value.id) {
     try {
-      // 导出的二次确认
-      await message.exportConfirm()
-      // 发起导出
-      exportLoading.value = true
-      const data = await DaPoint.exportDaPointValue(chartParams)
-      download.excel(data, dataForm.value.pointName +'.xls')
-    } catch {
-    } finally {
-      exportLoading.value = false
+      chartParams.codes = [dataForm.value.pointNo];
+      chartParams.startDate = dataForm.value.startTime;
+      chartParams.endDate = dataForm.value.endTime;
+      const data = await DaPoint.getPointDaChart(chartParams)
+      let seriesData = []
+      data.series.forEach(item => {
+        seriesData.push({
+          name: item.name,
+          type: "line",
+          data: item.data,
+          showSymbol: true,
+          smooth: false,
+          lineStyle: {
+            normal: {
+              color: "#5B8FF9",
+              width: 1,
+            },
+          },
+        });
+      })
+
+      myChart = echarts.init(chartDom.value);
+      const option = {
+        title: {
+          text: dataForm.value.pointName,
+          top: 0,
+          left: "1%",
+          textStyle: {
+            fontSize: 14,
+          },
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "line",
+            lineStyle: {
+              color: "#cccccc",
+              width: "1",
+              type: "dashed",
+            },
+          },
+        },
+        legend: {
+          show: false,
+          top: 10,
+        },
+        grid: {
+          top: 30,
+          left: "3%",
+          right: "5%",
+          bottom: 10,
+          containLabel: true,
+        },
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          data: data.categories,
+        },
+        yAxis: {
+          type: "value",
+        },
+        dataZoom: [
+          {
+            type: "inside",
+          },
+        ],
+        series: seriesData,
+      };
+      myChart.setOption(option);
+    } catch (error) {
+      console.error(error)
     }
   }
+}
+
+/** 导出按钮操作 */
+const exportLoading = ref(false)
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await DaPoint.exportDaPointValue({
+      pointNo: dataForm.value.pointNo,
+      start: dataForm.value.startTime,
+      end: dataForm.value.endTime
+    })
+    download.excel(data, dataForm.value.pointName + '.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
 </script>
 <style>
-  .el-select {
-    width: 100%;
-  }
+.el-select {
+  width: 100%;
+}
 
-  .result-chart {
-    height: 500px;
-  }
+.result-chart {
+  height: 500px;
+}
 </style>
diff --git a/src/views/model/pre/analysis/index.vue b/src/views/model/pre/analysis/index.vue
index b21627a..b0939c3 100644
--- a/src/views/model/pre/analysis/index.vue
+++ b/src/views/model/pre/analysis/index.vue
@@ -4,37 +4,42 @@
       <el-form :inline="true" :model="formData" label-width="80px">
         <el-form-item label="开始时间">
           <el-date-picker
-              size="mini"
-              v-model="formData.startTime"
-              type="datetime"
-              placeholder="选择日期时间"/>
+            v-model="formData.startTime"
+            type="datetime"
+            format="YYYY-MM-DD HH:mm:00"
+            value-format="YYYY-MM-DD HH:mm:00"
+            placeholder="选择日期时间"/>
         </el-form-item>
         <el-form-item label="结束时间">
           <el-date-picker
-              size="mini"
-              v-model="formData.endTime"
-              type="datetime"
-              placeholder="选择日期时间"/>
+            v-model="formData.endTime"
+            type="datetime"
+            format="YYYY-MM-DD HH:mm:00"
+            value-format="YYYY-MM-DD HH:mm:00"
+            placeholder="选择日期时间"/>
         </el-form-item>
         <el-form-item label="预测时间">
           <el-date-picker
-              size="mini"
-              v-model="formData.predictTime"
-              type="datetime"
-              placeholder="选择日期时间"/>
+            v-model="formData.predictTime"
+            type="datetime"
+            format="YYYY-MM-DD HH:mm:00"
+            value-format="YYYY-MM-DD HH:mm:00"
+            placeholder="选择日期时间"/>
         </el-form-item>
         <el-form-item label="预测频率">
-          <el-input-number size="mini" v-model="formData.predictFreq" controls-position="right" :min="1"
+          <el-input-number v-model="formData.predictFreq" controls-position="right"
+                           :min="1"
                            :max="10"/>
         </el-form-item>
         <el-form-item>
           <el-button-group>
-            <el-button size="mini" type="primary" plain :icon="ArrowLeft"
-                       v-loading="loading1" @click="leftSearchDataByRange()"/>
-            <el-button size="mini" type="primary" plain :icon="Search"
-                       v-loading="loading1" @click="getList()">查询</el-button>
-            <el-button size="mini" type="primary" plain :icon="ArrowRight"
-                       v-loading="loading1" @click="rightSearchDataByRange()"/>
+            <el-button type="primary" plain :icon="ArrowLeft"
+                       :loading="loading1" @click="leftSearchDataByRange()"/>
+            <el-button type="primary" plain :icon="Search"
+                       :loading="loading1" @click="getList()">查询
+            </el-button>
+            <el-button type="primary" plain :icon="ArrowRight"
+                       :loading="loading1" @click="rightSearchDataByRange()"/>
           </el-button-group>
         </el-form-item>
 
@@ -42,46 +47,52 @@
           <div class="his-body-left">
             <div class="his-body-tree">
               <el-tree
-                  :data="treeData"
-                  show-checkbox
-                  node-key="id"
-                  ref="tree"
-                  highlight-current
-                  :props="defaultProps"
-                  @check="onCheckTree"/>
+                :data="treeData"
+                show-checkbox
+                node-key="id"
+                ref="tree"
+                highlight-current
+                :props="defaultProps"
+                @check="onCheckTree"/>
             </div>
           </div>
           <div class="his-body-right">
             <div class="his-body-chart">
-              <el-form :inline="true" :model="calRateForm" :rules="formRules" ref="calRateForm" label-width="108px">
+              <el-form :inline="true" :model="calRateForm" :rules="formRules" ref="calRateFormRef"
+                       label-width="108px">
                 <el-row>
-                  <el-col :span="6" >
+                  <el-col :span="6">
                     <el-form-item label="预测项" prop="calItem" style="width: 90%">
-                      <el-select v-model="calRateForm.calItem" @change="calItemBaseVale" placeholder="请选择">
+                      <el-select size="small" v-model="calRateForm.calItem"
+                                 @change="calItemBaseVale"
+                                 placeholder="请选择">
                         <el-option
-                            v-for="item in formData.checkedItemData"
-                            :key="item.id"
-                            :label="item.label"
-                            :value="item.id"/>
+                          v-for="itemOut in formData.checkedItemData"
+                          :key="itemOut.id"
+                          :label="itemOut.label"
+                          :value="itemOut.id"/>
                       </el-select>
                     </el-form-item>
                   </el-col>
                   <el-col :span="6">
                     <el-form-item label="精准度偏差" prop="IN_DEVIATION">
-                      <el-input-number size="mini" v-model="calRateForm.IN_DEVIATION" controls-position="right" :min="1"
+                      <el-input-number size="small" v-model="calRateForm.IN_DEVIATION"
+                                       controls-position="right" :min="1"
                                        :max="10"/>
                     </el-form-item>
                   </el-col>
                   <el-col :span="6">
                     <el-form-item label="不可信率偏差" prop="OUT_DEVIATION">
-                      <el-input-number size="mini" v-model="calRateForm.OUT_DEVIATION" controls-position="right"
+                      <el-input-number size="small" v-model="calRateForm.OUT_DEVIATION"
+                                       controls-position="right"
                                        :min="1"
                                        :max="20"/>
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item>
-                      <el-button size="mini" type="primary" plain :loading="loading2" @click="calAccuracyRate">计算精准度
+                      <el-button size="small" type="primary" plain :loading="loading2"
+                                 @click="calAccuracyRate">计算精准度
                       </el-button>
                     </el-form-item>
                   </el-col>
@@ -89,54 +100,54 @@
                 <el-row>
                   <el-col :span="4">
                     <el-form-item label="精准度:">
-                      {{calRateForm.IN_ACCURACY_RATE}}%
+                      {{ calRateForm.IN_ACCURACY_RATE }}%
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="预测平均值:">
-                      {{calRateForm.itemPreAvg}}
+                      {{ calRateForm.itemPreAvg }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="预测最大值:">
-                      {{calRateForm.itemPreMax}}
+                      {{ calRateForm.itemPreMax }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="预测最小值:">
-                      {{calRateForm.itemPreMin}}
+                      {{ calRateForm.itemPreMin }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="预测累积量:">
-                      {{calRateForm.preCumulant}}
+                      {{ calRateForm.preCumulant }}
                     </el-form-item>
                   </el-col>
                 </el-row>
                 <el-row>
                   <el-col :span="4">
                     <el-form-item label="不可信率:">
-                      {{calRateForm.OUT_ACCURACY_RATE}}%
+                      {{ calRateForm.OUT_ACCURACY_RATE }}%
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="真实平均值:">
-                      {{calRateForm.itemAvg}}
+                      {{ calRateForm.itemAvg }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="真实最大值:">
-                      {{calRateForm.itemMax}}
+                      {{ calRateForm.itemMax }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="真实最小值:">
-                      {{calRateForm.itemMin}}
+                      {{ calRateForm.itemMin }}
                     </el-form-item>
                   </el-col>
                   <el-col :span="4">
                     <el-form-item label="真实累积量:">
-                      {{calRateForm.realCumulant}}
+                      {{ calRateForm.realCumulant }}
                     </el-form-item>
                   </el-col>
                 </el-row>
@@ -146,20 +157,25 @@
                   <el-col :span="12">
                     <el-form-item label="数据类型">
                       <el-checkbox-group v-model="formData.chartCheck" @change="changeChartCheck">
-                        <el-checkbox v-for="item in formData.chartOptions" :label="item" :key="item">{{item}}
+                        <el-checkbox v-for="item in formData.chartOptions" :label="item"
+                                     :key="item">{{ item }}
                         </el-checkbox>
                       </el-checkbox-group>
                     </el-form-item>
                   </el-col>
                   <el-col :span="6">
                     <el-form-item>
-                      <el-radio v-model="formData.isMultipleY" :label="false" @input="onChangeMultipleY">单坐标轴</el-radio>
-                      <el-radio v-model="formData.isMultipleY" :label="true" @input="onChangeMultipleY">多坐标轴</el-radio>
+                      <el-radio v-model="formData.isMultipleY" :label="false"
+                                @input="onChangeMultipleY">单坐标轴
+                      </el-radio>
+                      <el-radio v-model="formData.isMultipleY" :label="true"
+                                @input="onChangeMultipleY">多坐标轴
+                      </el-radio>
                     </el-form-item>
                   </el-col>
                 </el-row>
               </el-form>
-              <div id="data-analysis" style="height: 500px;"></div>
+              <div ref="dataAnalysisChart" style="height: 500px;"></div>
             </div>
           </div>
         </div>
@@ -168,31 +184,479 @@
   </el-card>
 </template>
 <script lang="ts" setup>
-  import {getYMDHMS} from "@/utils/dateUtil"
-  import * as CategoryApi from "@/api/data/ind/category";
-  import * as DmModule from '@/api/model/pre/dm'
-  import * as ItemApi from "@/api/data/ind/item/item";
-  import * as MmPredictItem from '@/api/model/pre/item'
-  import * as echarts from "echarts";
-  import { onMounted, ref } from 'vue';
-  import { Search, ArrowLeft, ArrowRight,} from '@element-plus/icons-vue'
+import {getYMDHMS} from "@/utils/dateUtil"
+import * as McsApi from '@/api/model/mcs'
+import * as echarts from "echarts";
+import {Search, ArrowLeft, ArrowRight,} from '@element-plus/icons-vue'
 
-  defineOptions({name: 'AnalysisformData'})
+defineOptions({name: 'AnalysisformData'})
 
-  const message = useMessage() // 消息弹窗
-  const { t } = useI18n() // 国际化
-  const dataCategoryList = ref([] as CategoryApi.IndItemCategoryVO[])
-  const loading1 = ref(false) // 列表的加载中
-  const loading2 = ref(false) // 列表的加载中
-  const total = ref(0) // 列表的总页数
-  const list = ref([]) // 字典表格数据
-  const queryParams = reactive({
-    pageNo: 1,
-    pageSize: 10,
-    itemno: '',
-    itemname: '',
+const message = useMessage() // 消息弹窗
+const {t} = useI18n() // 国际化
+const dataAnalysisChart = ref(null);
+const loading1 = ref(false) // 列表的加载中
+const loading2 = ref(false) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 字典表格数据
+let formData = ref({
+  rangeDate: '',
+  startTime: '',
+  endTime: '',
+  predictTime: '',
+  predictTimeStr: '',
+  startTimeStr: '',
+  endTimeStr: '',
+  predictTimeStamp: 0,
+  startTimeStamp: 0,
+  endTimeStamp: 0,
+  currentStamp: '',
+  currentStamp60: '',
+  predictStamp: '',
+  chartCheck: ['T+L', '真实值'],
+  chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
+  checkedItemData: [],
+  backItem: '',
+  backValue: 0,
+  backCoe: 1,
+  preCumulant: 0,
+  realCumulant: 0,
+  queryStep: 2,
+  isMultipleYRadio: '单坐标轴',
+  isMultipleY: false,
+  predictFreq: 3,
+})
+const calRateFormRef = ref()
+const calRateForm = ref({
+  calItem: undefined,
+  IN_DEVIATION: 0,
+  OUT_DEVIATION: 0,
+  IN_ACCURACY_RATE: 0,
+  OUT_ACCURACY_RATE: 0,
+  itemAvg: 0,
+  itemMax: 0,
+  itemMin: 0,
+  itemPreAvg: 0,
+  itemPreMax: 0,
+  itemPreMin: 0,
+  preCumulant: 0,
+  realCumulant: 0
+})
+let itemData = ref({
+  currentTreeList: [],
+  chart: {},
+  option: {}
+})
+const treeData = ref([])
+const itemDataObject = ref()
+const timer = ref()
+let myChart = null;
+
+const formRules = reactive({
+  calItem: [{required: true, message: '预测项不能为空', trigger: 'blur'}],
+  IN_DEVIATION: [{required: true, message: '精准度偏差不能为空', trigger: 'blur'}],
+  OUT_DEVIATION: [{required: true, message: '不可信率偏差不能为空', trigger: 'blur'}],
+})
+
+/** 查询列表 */
+const getList = async () => {
+  loading1.value = true
+  try {
+    if (!formData.value.chartCheck) {
+      formData.value.chartCheck = ['真实值']
+    }
+    let chartCheckArray = formData.value.chartCheck;
+    if (!formData.value.checkedItemData || formData.value.checkedItemData.length == 0) {
+      itemData.value.option = {};
+      return;
+    }
+    let outIds = formData.value.checkedItemData.map(item => {
+      return item.id
+    })
+    const params = reactive({
+      outIds: outIds,
+      predictTime: formData.value.predictTime,
+      startTime: formData.value.startTime,
+      endTime: formData.value.endTime
+    })
+    const data = await McsApi.getPreDataCharts(params)
+    formData.value.predictTime = data.predictTime;
+    formData.value.startTime = data.startTime
+    formData.value.endTime = data.endTime
+
+    let xAxisData = data.categories;
+    let yAxisData = [];
+    let offset = 0;
+    let yAxisIndex = 0;
+    let legendData = [];
+    let yMaxArr = [];
+    let seriesData = [];
+    seriesData.push({
+      name: '',
+      data: [null],
+      type: 'line',
+      smooth: true,
+      color: 'green',
+      markLine: {
+        silent: true,
+        lineStyle: {
+          color: '#32a487',
+          width: 2
+        },
+        data: [{
+          xAxis: formData.value.predictTime
+        }],
+        label: {
+          normal: {
+            formatter: formData.value.predictTime
+          }
+        },
+        symbol: ['circle', 'none'],
+      },
+    });
+    itemDataObject.value = {}
+    for (let i = 0; i < data.dataViewList.length; i++) {
+      let dataView = data.dataViewList[i]
+      itemDataObject.value[dataView.outId] = dataView;
+      let maxValue = dataView.maxValue;
+      let minValue = dataView.minValue;
+      yAxisIndex = formData.value.isMultipleY ? i : 0;
+      let yMax = maxValue;
+      if (maxValue < 0) {
+        maxValue = 1;
+      } else if (maxValue < 10) {
+        yMax = (Math.ceil(maxValue * 11) / 10).toFixed(1);
+      } else if (maxValue < 100) {
+        yMax = (Math.ceil(maxValue * 1.1 / 5) * 5);
+      } else {
+        yMax = (Math.ceil(maxValue * 1.1 / 10) * 10);
+      }
+      yMaxArr.push(yMax);
+      let yMin = minValue;
+      if (minValue >= 0) {
+        yMin = 0;
+      } else if (minValue > -10) {
+        yMin = (Math.floor(minValue * 11) / 10).toFixed(1);
+      } else if (minValue > -100) {
+        yMin = (Math.floor(minValue * 1.1 / 5) * 5);
+      } else {
+        yMin = (Math.floor(minValue * 1.1 / 10) * 10);
+      }
+      yAxisData.push({
+        type: 'value',
+        name: "",
+        min: yMin,
+        max: yMax,
+        position: 'left',
+        offset: offset,
+        splitLine: {
+          show: false
+        },
+        axisLine: {
+          show: true,
+          lineStyle: {}
+        },
+        axisLabel: {
+          formatter: '{value}'
+        }
+      })
+      offset = offset + 40
+      if (chartCheckArray.indexOf('真实值') !== -1) {
+        let legendName = dataView.resultstr + '(真实)';
+        legendData.push(legendName);
+        seriesData.push({
+          name: legendName,
+          data: dataView.realData || [],
+          type: 'line',
+          yAxisIndex: yAxisIndex,
+          showSymbol: false,
+          smooth: true,
+          lineStyle: {
+            width: 2
+          }
+        });
+      }
+      if (chartCheckArray.indexOf('T+N') !== -1) {
+        let legendName = dataView.resultstr + '(T+N)';
+        seriesData.push({
+          name: legendName,
+          data: dataView.preDataN || [],
+          type: 'line',
+          yAxisIndex: yAxisIndex,
+          showSymbol: false,
+          smooth: true,
+          lineStyle: {
+            width: 2
+          }
+        });
+      }
+      if (chartCheckArray.indexOf('T+L') !== -1) {
+        let legendName = dataView.resultstr + '(T+L)';
+        legendData.push(legendName);
+        seriesData.push({
+          name: legendName,
+          data: dataView.preDataL || [],
+          type: 'line',
+          showSymbol: false,
+          connectNulls: true,
+          yAxisIndex: yAxisIndex,
+          smooth: true,
+          lineStyle: {
+            width: 2
+          }
+        });
+      }
+      if (chartCheckArray.indexOf('当时') !== -1) {
+        let legendName = dataView.resultstr + '(当时)';
+        legendData.push(legendName);
+        seriesData.push({
+          name: legendName,
+          data: dataView.curData || [],
+          type: 'line',
+          yAxisIndex: yAxisIndex,
+          showSymbol: false,
+          smooth: true,
+          lineStyle: {
+            width: 2
+          }
+        });
+      }
+      if (chartCheckArray.indexOf('调整值') !== -1) {
+        let legendName = dataView.resultstr + '(调整值)';
+        legendData.push(legendName);
+        seriesData.push({
+          name: legendName,
+          data: dataView.adjData || [],
+          type: 'line',
+          yAxisIndex: yAxisIndex,
+          showSymbol: false,
+          connectNulls: true,
+          smooth: true,
+          lineStyle: {
+            width: 2,
+            type: 'dashed'
+          }
+        });
+      }
+    }
+    //如果最大值相差不大,改成一致大小
+    if (yMaxArr.length > 1) {
+      let max = Math.max.apply(null, yMaxArr);
+      let min = Math.min.apply(null, yMaxArr);
+      if (Math.abs((max - min) / max) <= 0.2) {
+        for (let i = 0; i < yAxisData.length; i++) {
+          yAxisData[i].max = max;
+        }
+      }
+    }
+    myChart = echarts.init(dataAnalysisChart.value);
+    let option = {
+      title: {
+        text: ''
+      },
+      tooltip: {
+        trigger: 'axis'
+      },
+      legend: {
+        show: true,
+        data: legendData,
+        top: 10
+      },
+      grid: {
+        top: '20%',
+        left: '3%',
+        right: '6%',
+        bottom: '3%',
+        containLabel: true
+      },
+      xAxis: {
+        type: 'category',
+        boundaryGap: false,
+        data: xAxisData
+      },
+      yAxis: formData.value.isMultipleY ? yAxisData : {
+        type: 'value',
+        splitLine: {show: false},
+        axisLine: {show: true}
+      },
+      dataZoom: [
+        {
+          type: 'inside',
+          start: 0,
+          end: 100
+        },
+        {
+          start: 0,
+          end: 10
+        }
+      ],
+      series: seriesData
+    }
+    myChart.clear()
+    myChart.setOption(option)
+  } finally {
+    loading1.value = false
+  }
+}
+
+onMounted(() => {
+  resetForm()
+  getPreItemTree()
+})
+
+async function getPreItemTree() {
+  treeData.value = await McsApi.getPredictItemTree()
+}
+
+function leftSearchDataByRange() {
+  let mins = getRangeMins();
+  let startTime = formData.value.startTime;
+  let endTime = formData.value.endTime;
+  let predictTime = formData.value.predictTime;
+  if (predictTime) {
+    predictTime = getYMDHMS(new Date(predictTime) - 1000 * 60 * mins);
+    formData.value.predictTime = predictTime;
+  }
+  if (startTime) {
+    startTime = getYMDHMS(new Date(startTime) - 1000 * 60 * mins);
+    formData.value.startTime = startTime;
+  }
+  if (endTime) {
+    endTime = getYMDHMS(new Date(endTime) - 1000 * 60 * mins);
+    formData.value.endTime = endTime;
+  }
+  getList();
+}
+
+function getRangeMins() {
+  let result: string | number = 0;
+  if (formData.value.startTime && formData.value.endTime) {
+    let startStamp = new Date(formData.value.startTime).getTime();
+    let endStamp = new Date(formData.value.endTime).getTime();
+    let queryStep = ((endStamp - startStamp) / (1000 * 60)).toFixed(0);
+    result = queryStep >= 0 ? queryStep : 0;
+  }
+  return result;
+}
+
+function onCheckTree(data, checked, indeterminate) {
+  formData.value.checkedItemData = [];
+  if (checked.checkedNodes) {
+    formData.value.checkedItemData = [...checked.checkedNodes]
+  }
+  debounce(getList, 1000);
+}
+
+function debounce(func, wait) {
+  let args = [];
+  if (timer.value) {
+    clearTimeout(timer.value);
+  }
+  timer.value = setTimeout(() => {
+    func.apply(this, args);
+    timer.value = null;
+  }, wait)
+}
+
+function calItemBaseVale() {
+  if (!calRateForm.value.calItem) {
+    calRateForm.value.itemPreMax = 0;
+    calRateForm.value.itemPreMin = 0;
+    calRateForm.value.itemPreAvg = 0;
+    calRateForm.value.preCumulant = 0;
+    calRateForm.value.itemMax = 0;
+    calRateForm.value.itemMin = 0;
+    calRateForm.value.itemAvg = 0;
+    calRateForm.value.realCumulant = 0;
+  } else {
+    let dataView = itemDataObject.value[calRateForm.value.calItem]
+    calRateForm.value.itemPreMax = dataView.preMax;
+    calRateForm.value.itemPreMin = dataView.preMin;
+    calRateForm.value.itemPreAvg = dataView.preAvg;
+    calRateForm.value.preCumulant = dataView.preCumulant;
+    calRateForm.value.itemMax = dataView.hisMax;
+    calRateForm.value.itemMin = dataView.hisMin;
+    calRateForm.value.itemAvg = dataView.hisAvg;
+    calRateForm.value.realCumulant = dataView.hisCumulant;
+  }
+}
+
+function calAccuracyRate() {
+  this.$refs['calRateForm'].validate((valid) => {
+    if (!valid) {
+      return false
+    }
+    let dataView = itemDataObject[calRateForm.value.calItem]
+    let seriesReaData = dataView.realData;
+    let seriesPreData = dataView.preDataL;
+    if (seriesReaData == null || seriesPreData == null ||
+      seriesReaData.length === 0 || seriesPreData.length === 0) {
+      loading2.value = false;
+      return;
+    }
+    let predictValueMap = {};
+    seriesPreData.forEach(function (item) {
+      predictValueMap[item[0]] = item[1];
+    })
+    let pointValueMap = {};
+    seriesReaData.forEach(function (item) {
+      pointValueMap[item[0]] = item[1];
+    })
+    let inDeviation = Number(calRateForm.value.IN_DEVIATION);
+    let outDeviation = Number(calRateForm.value.OUT_DEVIATION);
+    if (inDeviation === 0 && outDeviation === 0) {
+      loading2.value = false;
+      return;
+    }
+    let inDeviationCount = 0;
+    let outDeviationCount = 0;
+    let totalCount = 0;
+    for (let key in predictValueMap) {
+      let predictValue = predictValueMap[key];
+      let pointValue = pointValueMap[key];
+      if (pointValue == null || "" === pointValue || predictValue == null || "" === predictValue) {
+        continue;
+      }
+      let deviationAbs = (predictValue - pointValue) >= 0 ? (predictValue - pointValue) : (predictValue - pointValue) * -1;
+      if (deviationAbs < inDeviation) {
+        inDeviationCount = inDeviationCount + 1;
+      }
+      if (deviationAbs > outDeviation) {
+        outDeviationCount = outDeviationCount + 1;
+      }
+      totalCount = totalCount + 1;
+    }
+
+    let rateIn = (inDeviationCount / totalCount * 100).toFixed(2);
+    let rateOut = (outDeviationCount / totalCount * 100).toFixed(2);
+    calRateForm.value.IN_ACCURACY_RATE = Number(rateIn);
+    calRateForm.value.OUT_ACCURACY_RATE = Number(rateOut);
+    loading2.value = false;
   })
-  let formData = ref({
+}
+
+function rightSearchDataByRange() {
+  let mins = getRangeMins();
+  let startTime = formData.value.startTime;
+  let endTime = formData.value.endTime;
+  let predictTime = formData.value.predictTime;
+  if (predictTime) {
+    predictTime = getYMDHMS(new Date(predictTime) - 0 + 1000 * 60 * mins);
+    formData.value.predictTime = predictTime;
+  }
+  if (startTime) {
+    startTime = getYMDHMS(new Date(startTime) - 0 + 1000 * 60 * mins);
+    formData.value.startTime = startTime;
+  }
+  if (endTime) {
+    endTime = getYMDHMS(new Date(endTime) - 0 + 1000 * 60 * mins);
+    formData.value.endTime = endTime;
+  }
+  getList();
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
     rangeDate: '',
     startTime: '',
     endTime: '',
@@ -218,9 +682,9 @@
     isMultipleYRadio: '单坐标轴',
     isMultipleY: false,
     predictFreq: 3,
-  })
-  let calRateForm = ref({
-    calItem: '',
+  }
+  calRateForm.value = {
+    calItem: undefined,
     IN_DEVIATION: 0,
     OUT_DEVIATION: 0,
     IN_ACCURACY_RATE: 0,
@@ -231,462 +695,47 @@
     itemPreAvg: 0,
     itemPreMax: 0,
     itemPreMin: 0,
-    preCumulant:0,
-    realCumulant:0
-  })
-  let itemData = ref({
-    currentTreeList: [],
-    chart: {},
-    option: {}
-  })
-  const chartContainer = ref(null);
-  const treeData = ref([])
-  const itemDataObject = ref()
-  const timer = ref()
-
-  const formRules = reactive({
-    calItem: [{required: true, message: '预测项不能为空', trigger: 'blur'}],
-    IN_DEVIATION: [{required: true, message: '精准度偏差不能为空', trigger: 'blur'}],
-    OUT_DEVIATION: [{required: true, message: '不可信率偏差不能为空', trigger: 'blur'}],
-  })
-  //const myChart = echarts.init(document.getElementById("data-analysis"));
-  /** 查询列表 */
-  const getList = async () => {
-    loading1.value = true
-    try {
-      const data = formData.value
-      if (!formData.value.chartCheck) {
-        formData.value.chartCheck = ['真实值']
-      }
-      let chartCheckArray = formData.value.chartCheck;
-      if (!formData.value.checkedItemData || formData.value.checkedItemData.length == 0) {
-        itemData.value.option = {};
-        return;
-      }
-      let itemIdList = formData.value.checkedItemData.map(item => {
-        return item.id
-      })
-      const params = ref({
-        itemIds: itemIdList.join(','),
-        predictTime: formData.value.predictTime,
-        startTime: formData.value.startTime,
-        endTime: formData.value.endTime
-      })
-      const res = await MmPredictItem.getViewCharts(params)
-      if (res.code !== 0) {
-        return message.error(res.msg)
-      }
-      formData.value.predictTime = res.data.predictTime;
-      formData.value.startTime = res.data.startTime
-      formData.value.endTime = res.data.endTime
-
-      let xAxisData = res.data.categories;
-      let yAxisData = [];
-      let offset = 0;
-      let yAxisIndex = 0;
-      let legendData = [];
-      let yMaxArr = [];
-      let seriesData = [];
-      seriesData.push({
-        name: '',
-        data: [null],
-        type: 'line',
-        smooth: true,
-        color: 'green',
-        markLine: {
-          silent: true,
-          lineStyle: {
-            color: '#32a487',
-            width: 2
-          },
-          data: [{
-            xAxis: formData.value.predictTime
-          }],
-          label: {
-            normal: {
-              formatter: formData.value.predictTime
-            }
-          },
-          symbol: ['circle', 'none'],
-        },
-      });
-      itemDataObject.value = {}
-      for (let i = 0; i < res.data.dataViewList.length; i++) {
-        let dataView = res.data.dataViewList[i]
-        itemDataObject.value.dataView.itemId = dataView;
-        let maxValue = dataView.maxValue;
-        let minValue = dataView.minValue;
-        yAxisIndex = formData.value.isMultipleY ? i : 0;
-        let yMax = maxValue;
-        if (maxValue < 0) {
-          maxValue = 1;
-        } else if (maxValue < 10) {
-          yMax = (Math.ceil(maxValue * 11) / 10).toFixed(1);
-        } else if (maxValue < 100) {
-          yMax = (Math.ceil(maxValue * 1.1 / 5) * 5);
-        } else {
-          yMax = (Math.ceil(maxValue * 1.1 / 10) * 10);
-        }
-        yMaxArr.push(yMax);
-        let yMin = minValue;
-        if (minValue >= 0) {
-          yMin = 0;
-        } else if (minValue > -10) {
-          yMin = (Math.floor(minValue * 11) / 10).toFixed(1);
-        } else if (minValue > -100) {
-          yMin = (Math.floor(minValue * 1.1 / 5) * 5);
-        } else {
-          yMin = (Math.floor(minValue * 1.1 / 10) * 10);
-        }
-        yAxisData.push({
-          type: 'value',
-          name: "",
-          min: yMin,
-          max: yMax,
-          position: 'left',
-          offset: offset,
-          splitLine: {
-            show: false
-          },
-          axisLine: {
-            show: true,
-            lineStyle: {}
-          },
-          axisLabel: {
-            formatter: '{value}'
-          }
-        })
-        offset = offset + 40
-        if (chartCheckArray.indexOf('真实值') !== -1) {
-          let legendName = dataView.itemName + '(真实)';
-          legendData.push(legendName);
-          seriesData.push({
-            name: legendName,
-            data: dataView.realData || [],
-            type: 'line',
-            yAxisIndex: yAxisIndex,
-            showSymbol: false,
-            smooth: true,
-            lineStyle: {
-              width: 3
-            }
-          });
-        }
-        if (chartCheckArray.indexOf('T+N') !== -1) {
-          let legendName = dataView.itemName + '(T+N)';
-          seriesData.push({
-            name: legendName,
-            data: dataView.preDataN || [],
-            type: 'line',
-            yAxisIndex: yAxisIndex,
-            showSymbol: false,
-            smooth: true,
-            lineStyle: {
-              width: 3
-            }
-          });
-        }
-        if (chartCheckArray.indexOf('T+L') !== -1) {
-          let legendName = dataView.itemName + '(T+L)';
-          legendData.push(legendName);
-          seriesData.push({
-            name: legendName,
-            data: dataView.preDataL || [],
-            type: 'line',
-            showSymbol: false,
-            connectNulls: true,
-            yAxisIndex: yAxisIndex,
-            smooth: true,
-            lineStyle: {
-              width: 3
-            }
-          });
-        }
-        if (chartCheckArray.indexOf('当时') !== -1) {
-          let legendName = dataView.itemName + '(当时)';
-          legendData.push(legendName);
-          seriesData.push({
-            name: legendName,
-            data: dataView.curData || [],
-            type: 'line',
-            yAxisIndex: yAxisIndex,
-            showSymbol: false,
-            smooth: true,
-            lineStyle: {
-              width: 3
-            }
-          });
-        }
-        if (chartCheckArray.indexOf('调整值') !== -1) {
-          let legendName = dataView.itemName + '(调整值)';
-          legendData.push(legendName);
-          seriesData.push({
-            name: legendName,
-            data: dataView.adjData || [],
-            type: 'line',
-            yAxisIndex: yAxisIndex,
-            showSymbol: false,
-            connectNulls: true,
-            smooth: true,
-            lineStyle: {
-              width: 3,
-              type: 'dashed'
-            }
-          });
-        }
-      }
-      //如果最大值相差不大,改成一致大小
-      if (yMaxArr.length > 1) {
-        let max = Math.max.apply(null, yMaxArr);
-        let min = Math.min.apply(null, yMaxArr);
-        if (Math.abs((max - min) / max) <= 0.2) {
-          for (let i = 0; i < yAxisData.length; i++) {
-            yAxisData[i].max = max;
-          }
-        }
-      }
-      let option = {
-        title: {
-          text: ''
-        },
-        tooltip: {
-          trigger: 'axis'
-        },
-        legend: {
-          show: true,
-          data: legendData,
-          top: 10
-        },
-        grid: {
-          top: 50,
-          left: '3%',
-          right: '6%',
-          bottom: '3%',
-          containLabel: true
-        },
-        xAxis: {
-          type: 'category',
-          boundaryGap: false,
-          data: xAxisData
-        },
-        yAxis: formData.value.isMultipleY ? yAxisData : {
-          type: 'value',
-          splitLine: {show: false},
-          axisLine: {show: true}
-        },
-        dataZoom: [
-          {
-            type: 'inside',
-            start: 0,
-            end: 100
-          },
-          {
-            start: 0,
-            end: 10
-          }
-        ],
-        series: seriesData
-      }
-      //chart.setOption(option)
-    } finally {
-      loading1.value = false
-    }
+    preCumulant: 0,
+    realCumulant: 0
   }
-
-  onMounted(() => {
-    getPreItemTree()
-    getList()
-  })
-
-  async function getPreItemTree() {
-    treeData.value = await MmPredictItem.getMmPredictItemTree()
-  }
-
-  function leftSearchDataByRange() {
-    let mins = getRangeMins();
-    let startTime = formData.value.startTime;
-    let endTime = formData.value.endTime;
-    let predictTime = formData.value.predictTime;
-    if (predictTime) {
-      predictTime = getYMDHMS(new Date(predictTime) - 1000 * 60 * mins);
-      formData.value.predictTime = predictTime;
-    }
-    if (startTime) {
-      startTime = getYMDHMS(new Date(startTime) - 1000 * 60 * mins);
-      formData.value.startTime = startTime;
-    }
-    if (endTime) {
-      endTime = getYMDHMS(new Date(endTime) - 1000 * 60 * mins);
-      formData.value.endTime = endTime;
-    }
-    getList();
-  }
-
-  function getRangeMins () {
-    let result: string | number = 0;
-    if(formData.value.startTime && formData.value.endTime) {
-      let startStamp = new Date(formData.value.startTime).getTime();
-      let endStamp = new Date(formData.value.endTime).getTime();
-      let queryStep = ((endStamp - startStamp) / (1000 * 60)).toFixed(0);
-      result = queryStep >= 0 ? queryStep : 0;
-    }
-    return result;
-  }
-
-  function onCheckTree(data, checked, indeterminate) {
-    formData.value.checkedItemData = [];
-    if (checked.checkedNodes) {
-      formData.value.checkedItemData = [...checked.checkedNodes]
-    }
-    //myChart.clear()
-    debounce(getList(), 1000);
-  }
-
-  function debounce(func, wait) {
-    let args = [];
-    if (timer.value) {
-      clearTimeout(timer.value);
-    }
-    timer.value = setTimeout(() => {
-      func.apply(this, args);
-      timer.value = null;
-    }, wait)
-  }
-
-  function calItemBaseVale() {
-    if (!calRateForm.value.calItem) {
-      calRateForm.value.itemPreMax = 0;
-      calRateForm.value.itemPreMin = 0;
-      calRateForm.value.itemPreAvg = 0;
-      calRateForm.value.preCumulant = 0;
-      calRateForm.value.itemMax = 0;
-      calRateForm.value.itemMin = 0;
-      calRateForm.value.itemAvg = 0;
-      calRateForm.value.realCumulant = 0;
-      return
-    } else {
-      let dataView = itemDataObject[calRateForm.value.calItem]
-      calRateForm.value.itemPreMax = dataView.preMax;
-      calRateForm.value.itemPreMin = dataView.preMin;
-      calRateForm.value.itemPreAvg = dataView.preAvg;
-      calRateForm.value.preCumulant = dataView.preCumulant;
-      calRateForm.value.itemMax = dataView.hisMax;
-      calRateForm.value.itemMin = dataView.hisMin;
-      calRateForm.value.itemAvg = dataView.hisAvg;
-      calRateForm.value.realCumulant = dataView.hisCumulant;
-    }
-  }
-
-  function calAccuracyRate() {
-    this.$refs['calRateForm'].validate((valid) => {
-      if (!valid) {
-        return false
-      }
-      let dataView = itemDataObject[calRateForm.value.calItem]
-      let seriesReaData = dataView.realData;
-      let seriesPreData = dataView.preDataL;
-      if (seriesReaData == null || seriesPreData == null ||
-        seriesReaData.length === 0 || seriesPreData.length === 0) {
-        loading2.value = false;
-        return;
-      }
-      let predictValueMap = {};
-      seriesPreData.forEach(function (item) {
-        predictValueMap[item[0]] = item[1];
-      })
-      let pointValueMap = {};
-      seriesReaData.forEach(function (item) {
-        pointValueMap[item[0]] = item[1];
-      })
-      let inDeviation = Number(calRateForm.value.IN_DEVIATION);
-      let outDeviation = Number(calRateForm.value.OUT_DEVIATION);
-      if (inDeviation === 0 && outDeviation === 0) {
-        loading2.value = false;
-        return;
-      }
-      let inDeviationCount = 0;
-      let outDeviationCount = 0;
-      let totalCount = 0;
-      for (let key in predictValueMap) {
-        let predictValue = predictValueMap[key];
-        let pointValue = pointValueMap[key];
-        if (pointValue == null || "" === pointValue || predictValue == null || "" === predictValue) {
-          continue;
-        }
-        let deviationAbs = (predictValue - pointValue) >= 0 ? (predictValue - pointValue) : (predictValue - pointValue) * -1;
-        if (deviationAbs < inDeviation) {
-          inDeviationCount = inDeviationCount + 1;
-        }
-        if (deviationAbs > outDeviation) {
-          outDeviationCount = outDeviationCount + 1;
-        }
-        totalCount = totalCount + 1;
-      }
-
-      let rateIn = (inDeviationCount / totalCount * 100).toFixed(2);
-      let rateOut = (outDeviationCount / totalCount * 100).toFixed(2);
-      calRateForm.value.IN_ACCURACY_RATE = Number(rateIn);
-      calRateForm.value.OUT_ACCURACY_RATE = Number(rateOut);
-      loading2.value = false;
-    })
-  }
-
-  function rightSearchDataByRange() {
-    let mins = getRangeMins();
-    let startTime = formData.value.startTime;
-    let endTime = formData.value.endTime;
-    let predictTime = formData.value.predictTime;
-    if (predictTime) {
-      predictTime = getYMDHMS(new Date(predictTime) - 0 + 1000 * 60 * mins);
-      formData.value.predictTime = predictTime;
-    }
-    if (startTime) {
-      startTime = getYMDHMS(new Date(startTime) - 0 + 1000 * 60 * mins);
-      formData.value.startTime = startTime;
-    }
-    if (endTime) {
-      endTime = getYMDHMS(new Date(endTime) - 0 + 1000 * 60 * mins);
-      formData.value.endTime = endTime;
-    }
-    getList();
-  }
-
+  calRateFormRef.value?.resetFields()
+}
 </script>
 <style scoped>
-  .el-form-item {
-    margin-bottom: 0 !important;
-  }
+.el-form-item {
+  margin-bottom: 0 !important;
+}
 
-  .his-body-chart {
-    height: 100%;
-    border: 1px solid lightgray;
-    padding: 10px;
-  }
+.his-body-chart {
+  height: 100%;
+  border: 1px solid lightgray;
+  padding: 10px;
+}
 
-  .his-body-tree {
-    height: 100%;
-    border: 1px solid lightgray;
-    padding: 10px;
-  }
+.his-body-tree {
+  height: 100%;
+  border: 1px solid lightgray;
+  padding: 10px;
+}
 
-  .his-body-right {
-    width: 80%;
-    height: 100%;
-    padding-top: 10px;
-  }
+.his-body-right {
+  width: 80%;
+  height: 100%;
+  padding-top: 10px;
+}
 
-  .his-body-left {
-    width: 20%;
-    height: 100%;
-    padding: 10px 10px 0 0;
-  }
+.his-body-left {
+  width: 20%;
+  height: 100%;
+  padding: 10px 10px 0 0;
+}
 
-  .his-body {
-    width: 100%;
-    height: calc(calc(100vh - 68px - 38px - 160px));
-    display: flex;
-    flex-direction: row;
-    justify-content: flex-start;
-    align-content: flex-start;
-  }
+.his-body {
+  width: 100%;
+  height: calc(calc(100vh - 68px - 38px - 160px));
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  align-content: flex-start;
+}
 </style>
diff --git a/src/views/model/pre/item/MmPredictItemChart.vue b/src/views/model/pre/item/MmPredictItemChart.vue
index 215c854..3fd55b5 100644
--- a/src/views/model/pre/item/MmPredictItemChart.vue
+++ b/src/views/model/pre/item/MmPredictItemChart.vue
@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    title="采集值"
+    title="预测数据"
     :close-on-click-modal="false"
     width="50%"
     v-model="visible"
@@ -39,47 +39,48 @@
           plain
           @click="handleExport"
           :loading="exportLoading"
-          v-hasPermi="['data:point:export']"
         >
-          <Icon icon="ep:download" />导出
+          <Icon icon="ep:download"/>
+          导出
         </el-button>
       </el-form-item>
     </el-form>
-    <div ref="chartDom" class="result-chart"></div>
+    <div ref="chartDomPre" class="result-chart"></div>
   </el-dialog>
 </template>
 
 <script lang="ts" setup>
 import {ref} from 'vue';
 import * as echarts from 'echarts';
-import * as DaPoint from '@/api/data/da/point/daPointChart'
+import * as McsApi from '@/api/model/mcs'
 import {getYMDHM0} from "@/utils/dateUtil"
 import download from "@/utils/download";
+
 const message = useMessage() // 消息弹窗
 const visible = ref(false);
-const chartDom = ref(null);
+const chartDomPre = ref(null);
 let myChart = null;
 const chartParams = reactive({
-  codes:[],
-  startDate : undefined,
-  endDate: undefined,
+  itemId: undefined,
+  startTime: undefined,
+  endTime: undefined,
 })
 const dataForm = ref({
   id: "",
-  pointNo: "",
-  pointName: "",
-  pointTypeName: "",
+  itemName: "",
   startTime: getYMDHM0(new Date() - 60 * 60 * 1000),
-  endTime: "",
+  endTime: getYMDHM0(new Date() + 60 * 60 * 1000),
 });
 
 /** 打开弹窗 */
 const open = async (row: object) => {
   visible.value = true
+  resetForm()
   dataForm.value.id = row.id;
-  dataForm.value.pointNo = row.pointNo;
-  dataForm.value.pointName = row.pointName;
-  getDataList();
+  dataForm.value.itemName = row.itemname;
+  if (row.id) {
+    getDataList();
+  }
 }
 
 defineExpose({open}) // 提供 open 方法,用于打开弹窗
@@ -88,31 +89,79 @@
   visible.value = true;
   if (dataForm.value.id) {
     try {
-      chartParams.codes=[dataForm.value.pointNo];
-      chartParams.startDate = dataForm.value.startTime;
-      chartParams.endDate = dataForm.value.endTime;
-      const data = await DaPoint.getPointDaChart(chartParams)
+      chartParams.itemId = dataForm.value.id;
+      chartParams.startTime = dataForm.value.startTime;
+      chartParams.endTime = dataForm.value.endTime;
+      const data = await McsApi.getPreDataItemChart(chartParams)
+      let legendData = []
+      if (data.legend && data.legend.length > 0) {
+        data.legend.forEach(item => {
+          legendData.push(item + ":" + '真实值')
+          legendData.push(item + ":" + '预测值')
+        })
+      }
+
       let seriesData = []
-      data.series.forEach(item => {
+      if (data.lastTime) {
         seriesData.push({
-          name: item.name,
-          type: "line",
-          data: item.data,
-          showSymbol: true,
-          smooth: false,
-          lineStyle: {
-            normal: {
-              color: "#5B8FF9",
-              width: 1,
+          name: '',
+          data: [null],
+          type: 'line',
+          smooth: true,
+          color: 'green',
+          markLine: {
+            silent: true,
+            lineStyle: {
+              color: '#32a487',
+              width: 2
             },
+            data: [{
+              xAxis: data.lastTime
+            }],
+            label: {
+              normal: {
+                formatter: data.lastTime
+              }
+            },
+            symbol: ['circle', 'none'],
           },
         });
-      })
+      }
 
-      myChart = echarts.init(chartDom.value);
+      if (data.viewMap) {
+        Object.keys(data.viewMap).forEach(key => {
+          let viewData = data.viewMap[key]
+          seriesData.push({
+            name: key + ":" + '真实值',
+            type: "line",
+            data: viewData.realData,
+            showSymbol: false,
+            smooth: false,
+            lineStyle: {
+              normal: {
+                width: 1,
+              },
+            },
+          })
+          seriesData.push({
+            name: key + ":" + '预测值',
+            type: "line",
+            data: viewData.preDataN,
+            showSymbol: false,
+            smooth: false,
+            lineStyle: {
+              normal: {
+                width: 1,
+              },
+            },
+          })
+        })
+      }
+
+      myChart = echarts.init(chartDomPre.value);
       const option = {
         title: {
-          text: dataForm.value.pointName,
+          text: dataForm.value.itemName,
           top: 0,
           left: "1%",
           textStyle: {
@@ -131,11 +180,12 @@
           },
         },
         legend: {
-          show: false,
-          top: 10,
+          show: true,
+          top: 20,
+          data: legendData
         },
         grid: {
-          top: 30,
+          top: "20%",
           left: "3%",
           right: "5%",
           bottom: 10,
@@ -162,24 +212,35 @@
     }
   }
 }
+
 /** 导出按钮操作 */
 const exportLoading = ref(false)
 const handleExport = async () => {
-  chartParams.codes=[dataForm.value.pointNo];
-  chartParams.startDate = dataForm.value.startTime;
-  chartParams.endDate = dataForm.value.endTime;
+  chartParams.itemId = dataForm.value.id;
+  chartParams.startTime = dataForm.value.startTime;
+  chartParams.endTime = dataForm.value.endTime;
   try {
     // 导出的二次确认
     await message.exportConfirm()
     // 发起导出
     exportLoading.value = true
-    const data = await DaPoint.exportDaPointValue(chartParams)
-    download.excel(data, dataForm.value.pointName +'.xls')
+    /*const data = await DaPoint.exportDaPointValue(chartParams)
+    download.excel(data, dataForm.value.pointName + '.xls')*/
   } catch {
   } finally {
     exportLoading.value = false
   }
 }
+
+/** 重置表单 */
+const resetForm = () => {
+  dataForm.value = {
+    id: undefined,
+    itemName: undefined,
+    startTime: undefined,
+    endTime: undefined
+  }
+}
 </script>
 <style>
 .el-select {
diff --git a/src/views/model/pre/item/MmPredictItemForm.vue b/src/views/model/pre/item/MmPredictItemForm.vue
index 8a18596..cb01f79 100644
--- a/src/views/model/pre/item/MmPredictItemForm.vue
+++ b/src/views/model/pre/item/MmPredictItemForm.vue
@@ -17,7 +17,8 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="编号" prop="mmPredictItem.itemno">
-            <el-input v-model="dataForm.mmPredictItem.itemno" placeholder="编号" maxlength="50" readonly/>
+            <el-input v-model="dataForm.mmPredictItem.itemno" placeholder="编号" maxlength="50"
+                      readonly/>
           </el-form-item>
         </el-col>
       </el-row>
@@ -210,13 +211,13 @@
         :data="dataForm.mmItemOutputList"
         border
         style="width: 100%; margin-top: 5px;">
-        <el-table-column prop="outputorder" label="排序" align="center" width="80px" />
+        <el-table-column prop="outputorder" label="排序" align="center" width="80px"/>
         <el-table-column label="结果" align="center" width="150px">
           <template #default="scope">
             <el-input v-model="scope.row.resultstr" placeholder="请输入"/>
           </template>
         </el-table-column>
-        <el-table-column label="结果数据类型" align="center"  width="150px">
+        <el-table-column label="结果数据类型" align="center" width="150px">
           <template #default="scope">
             <el-select
               v-model="scope.row.resultType"
@@ -233,7 +234,9 @@
         </el-table-column>
         <el-table-column label="索引" align="center" width="120px">
           <template #default="scope">
-            <el-input-number style="width:100%;hight:100%" :disabled="scope.row.resultType !== 2" v-model="scope.row.resultIndex" :min="0" step-strictly controls-position="right"/>
+            <el-input-number style="width:100%;hight:100%" :disabled="scope.row.resultType !== 2"
+                             v-model="scope.row.resultIndex" :min="0" step-strictly
+                             controls-position="right"/>
           </template>
         </el-table-column>
         <el-table-column label="数据点" align="center">
@@ -290,7 +293,9 @@
         <el-table-column prop="modelparamorder" label="序号" width="60" align="center"/>
         <el-table-column prop="" label="类型" width="200" align="center">
           <template #default="scope">
-            <el-select v-model="scope.row.modelparamtype" placeholder="请选择">
+            <el-select v-model="scope.row.modelparamtype"
+                       @change="changeModelparamtype(scope.row)"
+                       placeholder="请选择">
               <el-option
                 v-for="dict in getStrDictOptions(DICT_TYPE.MODEL_PARAM_TYPE)"
                 :key="dict.value"
@@ -414,12 +419,10 @@
 import * as MmPredictItem from '@/api/model/pre/item'
 import * as MmItemType from '@/api/model/pre/type'
 import * as DmModule from '@/api/model/pre/dm'
-import * as MmResultTable from '@/api/model/pre/result'
 import * as ProjectApi from '@/api/model/mpk/project'
 import * as DaPoint from '@/api/data/da/point'
 import {useUpload} from '@/api/model/pre/item'
 import * as ScheduleModelApi from '@/api/model/sche/model'
-import request from "@/config/axios";
 
 const {uploadUrl, httpRequest} = useUpload()
 
@@ -434,7 +437,6 @@
 const itemTypeList = ref([])
 const itemTypeMap = ref({})
 const moduleList = ref([])
-const resultstridList = ref([])
 const mpkProjectList = ref([])
 const pointNoList = ref([])
 const pointList = ref([])
@@ -553,9 +555,6 @@
 
   // 获取管网列表
   moduleList.value = await DmModule.getModuleList()
-
-  // 获取结果字符串列表
-  resultstridList.value = await MmResultTable.getResultstridList()
 
   // 获取mpk项目列表
   mpkProjectList.value = await ProjectApi.list()
@@ -767,11 +766,11 @@
   dataForm.value.itemtypename = itemTypeMap[value]
 }
 
-function changeModelparamtype(value, row) {
+function changeModelparamtype(row) {
   row.modelparamid = ''
 }
 
-function changeOutputPoint(value,row) {
+function changeOutputPoint(value, row) {
   row.tagname = pointMap[value]
 }
 
@@ -798,10 +797,12 @@
   rows.splice(index, 0, row)
   orderRow(rows)
 }
+
 function addItemOutput(list) {
   list.push({})
   orderItemOutput(list)
 }
+
 function deleteItemOutput(index: string, rows) {
   if (!rows || rows.length === 1) {
     message.error('不能全部删除!')
@@ -810,6 +811,7 @@
   rows.splice(index, 1)
   orderItemOutput(rows)
 }
+
 function orderItemOutput(list) {
   list.sort((a, b) => a.outputorder - b.outputorder);
   let outputorder = 1
@@ -822,7 +824,7 @@
 function resultTypeChange(value, row) {
   if (value === 1) {
     row.resultIndex = undefined
-  }else if (value === 2) {
+  } else if (value === 2) {
     row.resultIndex = 0
   }
 }
diff --git a/src/views/model/pre/result/MmResultTableForm.vue b/src/views/model/pre/result/MmResultTableForm.vue
deleted file mode 100644
index bcb0afa..0000000
--- a/src/views/model/pre/result/MmResultTableForm.vue
+++ /dev/null
@@ -1,96 +0,0 @@
-<template>
-  <Dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
-    <el-form
-      ref="formRef"
-      v-loading="formLoading"
-      :model="formData"
-      :rules="formRules"
-      label-width="120px"
-    >
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="表名" prop="tablename">
-            <el-input v-model="formData.tablename" placeholder="请输入表名"/>
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <template #footer>
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-      <el-button @click="dialogVisible = false">取 消</el-button>
-    </template>
-  </Dialog>
-</template>
-<script lang="ts" setup>
-import * as MmResultTable from '@/api/model/pre/result'
-
-defineOptions({name: 'DataMmResultTableForm'})
-
-const {t} = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
-const dialogVisible = ref(false) // 弹窗的是否展示
-const dialogTitle = ref('') // 弹窗的标题
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
-const formData = ref({
-  id: undefined,
-  tablename: undefined,
-})
-const formRules = reactive({
-  tablename: [{required: true, message: '表名不能为空', trigger: 'blur'}],
-})
-const formRef = ref() // 表单 Ref
-
-/** 打开弹窗 */
-const open = async (type: string, id?: number) => {
-  dialogVisible.value = true
-  dialogTitle.value = t('action.' + type)
-  formType.value = type
-  resetForm()
-  // 修改时,设置数据
-  if (id) {
-    formLoading.value = true
-    try {
-      formData.value = await MmResultTable.getMmResultTable(id)
-    } finally {
-      formLoading.value = false
-    }
-  }
-}
-defineExpose({open}) // 提供 open 方法,用于打开弹窗
-
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-const submitForm = async () => {
-  // 校验表单
-  if (!formRef) return
-  const valid = await formRef.value.validate()
-  if (!valid) return
-  // 提交请求
-  formLoading.value = true
-  try {
-    const data = formData.value as unknown as MmResultTable.MmResultTableVO
-    if (formType.value === 'create') {
-      await MmResultTable.createMmResultTable(data)
-      message.success(t('common.createSuccess'))
-    } else {
-      await MmResultTable.updateMmResultTable(data)
-      message.success(t('common.updateSuccess'))
-    }
-    dialogVisible.value = false
-    // 发送操作成功的事件
-    emit('success')
-  } finally {
-    formLoading.value = false
-  }
-}
-
-/** 重置表单 */
-const resetForm = () => {
-  formData.value = {
-    id: undefined,
-    tablename: undefined,
-  }
-  formRef.value?.resetFields()
-}
-</script>
diff --git a/src/views/model/pre/result/index.vue b/src/views/model/pre/result/index.vue
deleted file mode 100644
index 271e8d6..0000000
--- a/src/views/model/pre/result/index.vue
+++ /dev/null
@@ -1,149 +0,0 @@
-<template>
-  <!-- 搜索 -->
-  <ContentWrap>
-    <el-form
-      class="-mb-15px"
-      :model="queryParams"
-      ref="queryFormRef"
-      :inline="true"
-      label-width="68px"
-    >
-      <el-form-item label="表名" prop="tablename">
-        <el-input
-          v-model="queryParams.tablename"
-          placeholder="请输入表名"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="handleQuery">
-          <Icon icon="ep:search" class="mr-5px" />
-          搜索
-        </el-button>
-        <el-button @click="resetQuery">
-          <Icon icon="ep:refresh" class="mr-5px" />
-          重置
-        </el-button>
-        <el-button
-          type="primary"
-          plain
-          @click="openForm('create')"
-          v-hasPermi="['model:pre-result:create']"
-        >
-          <Icon icon="ep:plus" class="mr-5px" />
-          新增
-        </el-button>
-      </el-form-item>
-    </el-form>
-  </ContentWrap>
-
-  <!-- 列表 -->
-  <ContentWrap>
-    <el-table v-loading="loading" :data="list">
-      <el-table-column label="表名" align="center" prop="tablename" />
-
-      <el-table-column label="操作" align="center" min-width="110" fixed="right">
-        <template #default="scope">
-          <el-button
-            link
-            type="primary"
-            @click="openForm('update', scope.row.id)"
-            v-hasPermi="['model:pre-result:update']"
-          >
-            编辑
-          </el-button>
-          <el-button
-            link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-            v-hasPermi="['model:pre-result:delete']"
-          >
-            删除
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <!-- 分页 -->
-    <Pagination
-      :total="total"
-      v-model:page="queryParams.pageNo"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-  </ContentWrap>
-
-  <!-- 表单弹窗:添加/修改 -->
-  <MmResultTableForm ref="formRef" @success="getList" />
-
-</template>
-<script lang="ts" setup>
-import MmResultTableForm from './MmResultTableForm.vue'
-import * as MmResultTable from '@/api/model/pre/result'
-
-defineOptions({name: 'DataMmResultTable'})
-
-  const message = useMessage() // 消息弹窗
-  const {t} = useI18n() // 国际化
-
-  const loading = ref(true) // 列表的加载中
-  const total = ref(0) // 列表的总页数
-  const list = ref([]) // 列表的数据
-  const queryParams = reactive({
-    pageNo: 1,
-    pageSize: 10,
-    tablename: undefined,
-  })
-  const queryFormRef = ref() // 搜索的表单
-  const exportLoading = ref(false) // 导出的加载中
-
-  /** 查询列表 */
-  const getList = async () => {
-    loading.value = true
-    try {
-      const page = await MmResultTable.getMmResultTablePage(queryParams)
-      list.value = page.list
-      total.value = page.total
-    } finally {
-      loading.value = false
-    }
-  }
-
-  /** 搜索按钮操作 */
-  const handleQuery = () => {
-    queryParams.pageNo = 1
-    getList()
-  }
-
-  /** 重置按钮操作 */
-  const resetQuery = () => {
-    queryFormRef.value.resetFields()
-    handleQuery()
-  }
-
-  /** 添加/修改操作 */
-  const formRef = ref()
-  const openForm = (type: string, id?: number) => {
-    formRef.value.open(type, id)
-  }
-
-  /** 删除按钮操作 */
-  const handleDelete = async (id: number) => {
-    try {
-      // 删除的二次确认
-      await message.delConfirm()
-      // 发起删除
-      await MmResultTable.deleteMmResultTable(id)
-      message.success(t('common.delSuccess'))
-      // 刷新列表
-      await getList()
-    } catch {
-    }
-  }
-
-  /** 初始化 **/
-  onMounted(async () => {
-    await getList()
-  })
-</script>

--
Gitblit v1.9.3