From 3babafdbc9a43745ab2191f81f70e7ad5d9e985e Mon Sep 17 00:00:00 2001
From: Jay <csj123456>
Date: 星期五, 14 二月 2025 14:59:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/model/pre/item/MmPredictItemForm.vue          |  158 ++++++++++++++---
 src/views/model/pre/item/MmPredictItemChart.vue         |   49 +++++
 src/api/model/pre/item/index.ts                         |    5 
 src/api/model/sche/model/index.ts                       |    3 
 src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue |    8 
 src/views/data/point/DaPointValue.vue                   |    4 
 src/views/model/pre/analysis/index.vue                  |  306 ++++++++++++++++++++++++---------
 7 files changed, 407 insertions(+), 126 deletions(-)

diff --git a/src/api/model/pre/item/index.ts b/src/api/model/pre/item/index.ts
index 73a7683..9a498ee 100644
--- a/src/api/model/pre/item/index.ts
+++ b/src/api/model/pre/item/index.ts
@@ -17,7 +17,10 @@
     predictphase: string,
     workchecked: number,
     unittransfactor: string,
-    saveindex: string
+    saveindex: string,
+    iscumulant: number,
+    cumuldivisor: number,
+    cumulpoint: string
   },
   dmModuleItem: {
     id: string,
diff --git a/src/api/model/sche/model/index.ts b/src/api/model/sche/model/index.ts
index b2b130f..51a9ce7 100644
--- a/src/api/model/sche/model/index.ts
+++ b/src/api/model/sche/model/index.ts
@@ -5,6 +5,7 @@
 import {CommonEnabled} from "@/utils/constants";
 import {getItemList, ItemVO} from "@/api/data/plan/item";
 import * as ItemApi from '@/api/data/ind/item/item'
+import {getPointSimpleList} from "@/api/data/da/point";
 
 export interface ScheduleModelVO {
   id: string
@@ -75,7 +76,7 @@
 export const getModelParamList = async (id) => {
 
   const dataPointList = ref([] as DataPointApi.DaPointVO)
-  dataPointList.value = await DataPointApi.getPointList({})
+  dataPointList.value = await DataPointApi.getPointSimpleList({})
   const pointList = []
   if (dataPointList.value) {
     dataPointList.value.forEach(item => {
diff --git a/src/views/data/point/DaPointValue.vue b/src/views/data/point/DaPointValue.vue
index b44c43e..671ede7 100644
--- a/src/views/data/point/DaPointValue.vue
+++ b/src/views/data/point/DaPointValue.vue
@@ -42,9 +42,9 @@
     <ContentWrap v-if="dataForm.pointType === 'CALCULATE'">
       <el-table border stripe v-loading="tableLoading" :data="list">
         <el-table-column type="index" header-align="center" align="center" fixed="left" width="50"/>
-        <el-table-column fixed label="测点编码" header-align="center" align="left" min-width="130" prop="pointNo" />
+        <el-table-column fixed label="测点编码" header-align="center" align="left" min-width="150" prop="pointNo" />
         <el-table-column fixed label="测点名称" header-align="center" align="left" min-width="240" prop="pointName" />
-        <el-table-column fixed label="当前值" header-align="center" align="left" min-width="240" prop="currentValue" />
+        <el-table-column fixed label="当前值" header-align="center" align="left" min-width="150" prop="currentValue" />
       </el-table>
       <!-- 分页 -->
       <Pagination
diff --git a/src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue b/src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue
index b1dc8f5..c84a693 100644
--- a/src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue
+++ b/src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue
@@ -55,8 +55,8 @@
     </el-table>
     <!-- 分页 -->
     <Pagination
-      v-model:limit="queryParams.limit"
-      v-model:page="queryParams.page"
+      v-model:limit="queryParams.pageSize"
+      v-model:page="queryParams.pageNo"
       :total="total"
       @pagination="getList"
     />
@@ -72,8 +72,8 @@
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 字典表格数据
 const queryParams = reactive({
-  page: 1,
-  limit: 10,
+  pageNo: 1,
+  pageSize: 10,
   configId: undefined,
   title: undefined,
   content: undefined,
diff --git a/src/views/model/pre/analysis/index.vue b/src/views/model/pre/analysis/index.vue
index 87ba5d9..dea20fd 100644
--- a/src/views/model/pre/analysis/index.vue
+++ b/src/views/model/pre/analysis/index.vue
@@ -1,7 +1,7 @@
 <template>
   <el-card shadow="never" class="aui-card--fill">
     <div class="mod-his__index">
-      <el-form :inline="true" :model="formData" label-width="80px">
+      <el-form :inline="true" :model="formData" label-width="70px">
         <el-form-item label="开始时间">
           <el-date-picker
             v-model="formData.startTime"
@@ -33,13 +33,25 @@
         </el-form-item>
         <el-form-item>
           <el-button-group>
-            <el-button type="primary" plain :icon="ArrowLeft"
+            <el-button type="primary" plain :icon="DArrowLeft"
                        :loading="loading1" @click="leftSearchDataByRange()"/>
             <el-button type="primary" plain :icon="Search"
                        :loading="loading1" @click="getList()">查询
             </el-button>
-            <el-button type="primary" plain :icon="ArrowRight"
+            <el-button type="primary" plain :icon="DArrowRight"
                        :loading="loading1" @click="rightSearchDataByRange()"/>
+          </el-button-group>
+        </el-form-item>
+        <el-form-item>
+          <el-button-group>
+            <el-button type="primary" plain :icon="CaretLeft"
+                       @click="playChart(true)"/>
+            <el-button type="primary" plain :icon="VideoPlay" v-if="!isPlay"
+                       @click="playHandle('play')"/>
+            <el-button type="primary" plain :icon="VideoPause" v-if="isPlay"
+                       @click="playHandle('pause')"/>
+            <el-button type="primary" plain :icon="CaretRight"
+                       @click="playChart(false)"/>
           </el-button-group>
         </el-form-item>
 
@@ -154,7 +166,7 @@
               </el-form>
               <el-form :inline="true" :model="formData" label-width="100px">
                 <el-row>
-                  <el-col :span="12">
+                  <el-col :span="16">
                     <el-form-item label="数据类型">
                       <el-checkbox-group v-model="formData.chartCheck" @change="changeChartCheck">
                         <el-checkbox v-for="item in formData.chartOptions" :label="item"
@@ -187,7 +199,7 @@
 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'
+import {Search, DArrowLeft, DArrowRight, VideoPlay, VideoPause, CaretLeft, CaretRight} from '@element-plus/icons-vue'
 
 defineOptions({name: 'AnalysisformData'})
 
@@ -213,7 +225,7 @@
   currentStamp60: '',
   predictStamp: '',
   chartCheck: ['T+L', '真实值'],
-  chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
+  chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值', '预测累计', '真实累计'],
   checkedItemData: [],
   backItem: '',
   backValue: 0,
@@ -228,8 +240,8 @@
 const calRateFormRef = ref()
 const calRateForm = ref({
   calItem: undefined,
-  IN_DEVIATION: 0,
-  OUT_DEVIATION: 0,
+  IN_DEVIATION: 10,
+  OUT_DEVIATION: 50,
   IN_ACCURACY_RATE: 0,
   OUT_ACCURACY_RATE: 0,
   itemAvg: 0,
@@ -250,6 +262,7 @@
 const itemDataObject = ref()
 const timer = ref()
 let myChart = null;
+const isPlay = ref(false)
 
 const formRules = reactive({
   calItem: [{required: true, message: '预测项不能为空', trigger: 'blur'}],
@@ -258,7 +271,7 @@
 })
 
 /** 查询列表 */
-const getList = async () => {
+const getList = async (isClear = true) => {
   loading1.value = true
   try {
     if (!formData.value.chartCheck) {
@@ -284,6 +297,22 @@
     formData.value.endTime = data.endTime
 
     let xAxisData = data.categories;
+    let defaultYAxis = [
+      {
+        type: 'value',
+        name: "累计值",
+        splitLine: {show: false},
+        axisLine: {show: true},
+        position: 'right'
+      },
+      {
+        type: 'value',
+        name: "",
+        splitLine: {show: false},
+        axisLine: {show: true},
+        position: 'left'
+      }
+    ];
     let yAxisData = [];
     let offset = 0;
     let yAxisIndex = 0;
@@ -314,12 +343,27 @@
       },
     });
     itemDataObject.value = {}
+    yAxisData.push({
+      type: 'value',
+      name: "累计值",
+      position: 'right',
+      splitLine: {
+        show: false
+      },
+      axisLine: {
+        show: true,
+        lineStyle: {}
+      },
+      axisLabel: {
+        formatter: '{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;
+      yAxisIndex = (formData.value.isMultipleY ? i : 0) + 1;
       let yMax = maxValue;
       if (maxValue < 0) {
         maxValue = 1;
@@ -369,7 +413,7 @@
           type: 'line',
           yAxisIndex: yAxisIndex,
           showSymbol: false,
-          smooth: true,
+          smooth: false,
           lineStyle: {
             width: 2
           }
@@ -377,13 +421,14 @@
       }
       if (chartCheckArray.indexOf('T+N') !== -1) {
         let legendName = dataView.resultName + '(T+N)';
+        legendData.push(legendName);
         seriesData.push({
           name: legendName,
           data: dataView.preDataN || [],
           type: 'line',
           yAxisIndex: yAxisIndex,
           showSymbol: false,
-          smooth: true,
+          smooth: false,
           lineStyle: {
             width: 2
           }
@@ -399,7 +444,7 @@
           showSymbol: false,
           connectNulls: true,
           yAxisIndex: yAxisIndex,
-          smooth: true,
+          smooth: false,
           lineStyle: {
             width: 2
           }
@@ -413,10 +458,10 @@
           data: dataView.curData || [],
           type: 'line',
           yAxisIndex: yAxisIndex,
-          showSymbol: false,
-          smooth: true,
+          showSymbol: true,
+          smooth: false,
           lineStyle: {
-            width: 2
+            width: 3
           }
         });
       }
@@ -430,7 +475,51 @@
           yAxisIndex: yAxisIndex,
           showSymbol: false,
           connectNulls: true,
-          smooth: true,
+          smooth: false,
+          lineStyle: {
+            width: 2,
+            type: 'dashed'
+          }
+        });
+      }
+
+      if (chartCheckArray.indexOf('预测累计') !== -1) {
+        let legendName = dataView.resultName + '(预测累计)';
+        legendData.push(legendName);
+        let seriesLeiJiData = []
+        if (dataView.cumulantPreData) {
+          seriesLeiJiData = dataView.cumulantPreData
+        }
+        seriesData.push({
+          name: legendName,
+          data: seriesLeiJiData,
+          type: 'line',
+          yAxisIndex: 0,
+          showSymbol: false,
+          connectNulls: true,
+          smooth: false,
+          lineStyle: {
+            width: 2,
+            type: 'dashed'
+          }
+        });
+      }
+
+      if (chartCheckArray.indexOf('真实累计') !== -1) {
+        let legendName = dataView.resultName + '(真实累计)';
+        legendData.push(legendName);
+        let seriesLeiJiData = []
+        if (dataView.cumulantRealData) {
+          seriesLeiJiData = dataView.cumulantRealData
+        }
+        seriesData.push({
+          name: legendName,
+          data: seriesLeiJiData,
+          type: 'line',
+          yAxisIndex: 0,
+          showSymbol: false,
+          connectNulls: true,
+          smooth: false,
           lineStyle: {
             width: 2,
             type: 'dashed'
@@ -448,6 +537,7 @@
         }
       }
     }
+
     myChart = echarts.init(dataAnalysisChart.value);
     let option = {
       title: {
@@ -473,11 +563,7 @@
         boundaryGap: false,
         data: xAxisData
       },
-      yAxis: formData.value.isMultipleY ? yAxisData : {
-        type: 'value',
-        splitLine: {show: false},
-        axisLine: {show: true}
-      },
+      yAxis: formData.value.isMultipleY ? yAxisData : defaultYAxis,
       dataZoom: [
         {
           type: 'inside',
@@ -491,11 +577,15 @@
       ],
       series: seriesData
     }
-    myChart.clear()
+    if (isClear) {
+      myChart.clear()
+    }
     myChart.setOption(option)
   } finally {
     loading1.value = false
   }
+
+  calItemBaseVale()
 }
 
 onMounted(() => {
@@ -507,24 +597,67 @@
   treeData.value = await McsApi.getPredictItemTree()
 }
 
+function changeChartCheck(value) {
+  getList(true)
+}
+
+function onChangeMultipleY() {
+  getList(true)
+}
+
+function playChart(isBack = false) {
+  let mins = isBack ? formData.value.predictFreq * -1 : formData.value.predictFreq
+  let startTime = formData.value.startTime;
+  let endTime = formData.value.endTime;
+  let predictTime = formData.value.predictTime;
+  if (predictTime) {
+    predictTime = getYMDHMS(new Date(predictTime).getTime() + 1000 * 60 * mins);
+    formData.value.predictTime = predictTime;
+  }
+  if (startTime) {
+    startTime = getYMDHMS(new Date(startTime).getTime() + 1000 * 60 * mins);
+    formData.value.startTime = startTime;
+  }
+  if (endTime) {
+    endTime = getYMDHMS(new Date(endTime).getTime() + 1000 * 60 * mins);
+    formData.value.endTime = endTime;
+  }
+  getList(false);
+}
+
+function playHandle(type) {
+  isPlay.value = 'play' === type
+  let doPlay = setInterval(function () {
+    if (isPlay.value) {
+      playChart()
+    } else {
+      clearInterval(doPlay);
+    }
+    if (new Date().getTime() - new Date(formData.value.predictTime).getTime() < 1000 * 60 ) {
+      isPlay.value = false
+      clearInterval(doPlay);
+    }
+  }, 1000)
+}
+
 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);
+    predictTime = getYMDHMS(new Date(predictTime).getTime() - 1000 * 60 * mins);
     formData.value.predictTime = predictTime;
   }
   if (startTime) {
-    startTime = getYMDHMS(new Date(startTime) - 1000 * 60 * mins);
+    startTime = getYMDHMS(new Date(startTime).getTime() - 1000 * 60 * mins);
     formData.value.startTime = startTime;
   }
   if (endTime) {
-    endTime = getYMDHMS(new Date(endTime) - 1000 * 60 * mins);
+    endTime = getYMDHMS(new Date(endTime).getTime() - 1000 * 60 * mins);
     formData.value.endTime = endTime;
   }
-  getList();
+  getList(false);
 }
 
 function getRangeMins() {
@@ -541,7 +674,13 @@
 function onCheckTree(data, checked, indeterminate) {
   formData.value.checkedItemData = [];
   if (checked.checkedNodes) {
-    formData.value.checkedItemData = [...checked.checkedNodes]
+    let cns = [...checked.checkedNodes]
+    for (let i = 0; i < cns.length; i++) {
+      if (cns[i].id.indexOf('-') !== -1) {
+        continue
+      }
+      formData.value.checkedItemData.push(cns[i])
+    }
   }
   debounce(getList, 1000);
 }
@@ -578,60 +717,59 @@
     calRateForm.value.itemAvg = dataView.hisAvg;
     calRateForm.value.realCumulant = dataView.hisCumulant;
   }
+  calAccuracyRate()
 }
 
 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;
-    }
+  const valid = calRateFormRef.value.validate()
+  if (!valid) return
 
-    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);
+  let dataView = itemDataObject.value[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() {
@@ -640,18 +778,18 @@
   let endTime = formData.value.endTime;
   let predictTime = formData.value.predictTime;
   if (predictTime) {
-    predictTime = getYMDHMS(new Date(predictTime) - 0 + 1000 * 60 * mins);
+    predictTime = getYMDHMS(new Date(predictTime).getTime() + 1000 * 60 * mins);
     formData.value.predictTime = predictTime;
   }
   if (startTime) {
-    startTime = getYMDHMS(new Date(startTime) - 0 + 1000 * 60 * mins);
+    startTime = getYMDHMS(new Date(startTime).getTime() + 1000 * 60 * mins);
     formData.value.startTime = startTime;
   }
   if (endTime) {
-    endTime = getYMDHMS(new Date(endTime) - 0 + 1000 * 60 * mins);
+    endTime = getYMDHMS(new Date(endTime).getTime() + 1000 * 60 * mins);
     formData.value.endTime = endTime;
   }
-  getList();
+  getList(false);
 }
 
 /** 重置表单 */
@@ -671,7 +809,7 @@
     currentStamp60: '',
     predictStamp: '',
     chartCheck: ['T+L', '真实值'],
-    chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值'],
+    chartOptions: ['T+N', 'T+L', '当时', '真实值', '调整值', '预测累计', '真实累计'],
     checkedItemData: [],
     backItem: '',
     backValue: 0,
@@ -681,12 +819,12 @@
     queryStep: 2,
     isMultipleYRadio: '单坐标轴',
     isMultipleY: false,
-    predictFreq: 3,
+    predictFreq: 2,
   }
   calRateForm.value = {
     calItem: undefined,
-    IN_DEVIATION: 0,
-    OUT_DEVIATION: 0,
+    IN_DEVIATION: 10,
+    OUT_DEVIATION: 50,
     IN_ACCURACY_RATE: 0,
     OUT_ACCURACY_RATE: 0,
     itemAvg: 0,
diff --git a/src/views/model/pre/item/MmPredictItemChart.vue b/src/views/model/pre/item/MmPredictItemChart.vue
index 4d24c06..824de21 100644
--- a/src/views/model/pre/item/MmPredictItemChart.vue
+++ b/src/views/model/pre/item/MmPredictItemChart.vue
@@ -167,6 +167,39 @@
               },
             },
           })
+          //累计点
+          if(viewData.cumulantRealData) {
+            legendData.push(key + "累计:" + '真实值')
+            seriesData.push({
+              name: key + "累计:" + '真实值',
+              type: "line",
+              data: viewData.cumulantRealData,
+              showSymbol: false,
+              smooth: false,
+              lineStyle: {
+                normal: {
+                  width: 1,
+                },
+              },
+              yAxisIndex: 1
+            })
+          }
+          if(viewData.cumulantPreData) {
+            legendData.push(key + "累计:" + '预测值')
+            seriesData.push({
+              name: key + "累计:" + '预测值',
+              type: "line",
+              data: viewData.cumulantPreData,
+              showSymbol: false,
+              smooth: false,
+              lineStyle: {
+                normal: {
+                  width: 1,
+                },
+              },
+              yAxisIndex: 1
+            })
+          }
         })
       }
 
@@ -207,9 +240,19 @@
           boundaryGap: false,
           data: data.categories,
         },
-        yAxis: {
-          type: "value",
-        },
+        yAxis: [
+          {
+            type: "value",
+            name: '预测值/真实值'
+          },
+          {
+            type: "value",
+            splitLine: {
+              show: false
+            },
+            name: '累计值'
+          }
+        ],
         dataZoom: [
           {
             type: "inside",
diff --git a/src/views/model/pre/item/MmPredictItemForm.vue b/src/views/model/pre/item/MmPredictItemForm.vue
index 288bcba..52eae1e 100644
--- a/src/views/model/pre/item/MmPredictItemForm.vue
+++ b/src/views/model/pre/item/MmPredictItemForm.vue
@@ -1,5 +1,5 @@
 <template>
-  <Dialog v-model="dialogVisible" :title="dialogTitle" width="60%">
+  <Dialog v-model="dialogVisible" :title="dialogTitle" width="75%">
     <el-form
       ref="formRef"
       v-loading="formLoading"
@@ -101,30 +101,69 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row v-if="dataForm.itemtypename === 'MergeItem'">
-        <el-col :span="12">
-          <el-form-item label="预测长度" prop="mmPredictItem.predictlength">
-            <el-input
-              v-model="dataForm.mmPredictItem.predictlength" placeholder="预测长度"
-              maxlength="5"/>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="真实数据点">
-            <el-select
-              v-model="dataForm.pointId"
-              filterable
-              clearable
-              placeholder="请选择">
-              <el-option
-                v-for="item in pointList"
-                :key="item.id"
-                :label="item.pointName"
-                :value="item.id"/>
-            </el-select>
-          </el-form-item>
-        </el-col>
-      </el-row>
+      <div v-if="dataForm.itemtypename === 'MergeItem'">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="预测长度" prop="mmPredictItem.predictlength">
+              <el-input
+                v-model="dataForm.mmPredictItem.predictlength" placeholder="预测长度"
+                maxlength="5"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="真实数据点">
+              <el-select
+                v-model="dataForm.pointId"
+                filterable
+                clearable
+                placeholder="请选择">
+                <el-option
+                  v-for="item in pointList"
+                  :key="item.id"
+                  :label="item.pointName"
+                  :value="item.id"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-divider content-position="left">累计配置</el-divider>
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="是否累计" prop="iscumulant">
+              <el-select v-model="dataForm.iscumulant" placeholder="请选择" @change="(value) => iscumulantChange(dataForm)">
+                <el-option
+                  v-for="dict in getIntDictOptions(DICT_TYPE.COM_IS_INT)"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="累计除数" prop="cumuldivisor">
+              <el-input-number v-model="dataForm.cumuldivisor" style="width: 100%" :disabled="dataForm.iscumulant !== 1"
+                :min="1" :max="60"
+                :controls="false"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="累计测点">
+              <el-select
+                v-model="dataForm.cumulpoint" :disabled="dataForm.iscumulant !== 1"
+                filterable
+                clearable
+                placeholder="请选择">
+                <el-option
+                  v-for="item in pointList.filter(e => e.pointType === 'CUMULATE')"
+                  :key="item.id"
+                  :label="item.pointName"
+                  :value="item.id"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </div>
       <el-divider content-position="left" v-if="dataForm.itemtypename === 'NormalItem'">模型信息
       </el-divider>
       <el-row :gutter="8" v-if="dataForm.itemtypename === 'NormalItem'">
@@ -268,6 +307,41 @@
               placeholder="请选择">
               <el-option
                 v-for="item in pointList"
+                :key="item.id"
+                :label="item.pointName"
+                :value="item.id"/>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否累计" align="center" width="150px">
+          <template #default="scope">
+            <el-select v-model="scope.row.iscumulant" placeholder="请选择" @change="(value) => iscumulantChange(scope.row)">
+              <el-option
+                v-for="dict in getIntDictOptions(DICT_TYPE.COM_IS_INT)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="累计除数" align="center" width="100px">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.cumuldivisor" style="width: 100%"
+              :min="1" :max="60" :disabled="scope.row.iscumulant !== 1"
+              :controls="false"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="累计数据点" align="center">
+          <template #default="scope">
+            <el-select
+              v-model="scope.row.cumulpoint"
+              :disabled="scope.row.iscumulant !== 1"
+              filterable
+              clearable
+              placeholder="请选择">
+              <el-option
+                v-for="item in pointList.filter(e => e.pointType === 'CUMULATE')"
                 :key="item.id"
                 :label="item.pointName"
                 :value="item.id"/>
@@ -471,6 +545,7 @@
 import * as DaPoint from '@/api/data/da/point'
 import {useUpload} from '@/api/model/pre/item'
 import * as ScheduleModelApi from '@/api/model/sche/model'
+import {getPointSimpleList} from "@/api/data/da/point";
 
 const {uploadUrl, httpRequest} = useUpload()
 
@@ -517,7 +592,7 @@
     predictphase: undefined,
     workchecked: 0,
     unittransfactor: undefined,
-    saveindex: undefined
+    saveindex: undefined,
   },
   dmModuleItem: {
     id: undefined,
@@ -557,7 +632,10 @@
   },
   mmModelArithSettingsList: [],
   mmModelParamList: [],
-  pointId: undefined
+  pointId: undefined,
+  iscumulant: 0,
+  cumuldivisor: undefined,
+  cumulpoint: undefined,
 })
 const formRules = reactive({
   'mmPredictItem.itemname': [{required: true, message: '预测项名不能为空', trigger: 'blur'}],
@@ -573,6 +651,7 @@
     trigger: 'blur'
   }],
   'mmPredictItem.status': [{required: true, message: '是否启用不能为空', trigger: 'blur'}],
+  'iscumulant': [{required: true, message: '是否累计不能为空', trigger: 'blur'}],
   'dmModuleItem.moduleid': [{required: true, message: '管网不能为空', trigger: 'blur'}],
   'dmModuleItem.itemorder': [{required: true, message: '排序不能为空', trigger: 'blur'}],
   'mmPredictItem.predictlength': [{required: true, message: '预测长度不能为空', trigger: 'blur'}],
@@ -610,7 +689,7 @@
   mpkProjectList.value = await ProjectApi.list()
 
   // 获取数据点列表
-  pointNoList.value = await DaPoint.getPointList(queryParams)
+  pointNoList.value = await DaPoint.getPointSimpleList(queryParams)
   if (pointNoList.value.length > 0) {
     pointList.value = []
     pointNoList.value.forEach(function (value) {
@@ -639,6 +718,13 @@
   if (!formRef) return
   const valid = await formRef.value.validate()
   if (!valid) return
+  //校验累计配置
+  if (dataForm.value.iscumulant === 1) {
+    if (dataForm.value.cumuldivisor == undefined) {
+      message.error("累计除数不为空")
+      return
+    }
+  }
   //校验模型输出
   if (dataForm.value.itemtypename === 'NormalItem') {
     if (dataForm.value.mmItemOutputList == undefined || dataForm.value.mmItemOutputList.length <= 0) {
@@ -648,7 +734,10 @@
 
     let flag = false
     dataForm.value.mmItemOutputList.forEach(e => {
-      if (e.resultstr == undefined || e.resultstr === '' || e.resultType == undefined || e.resultType === '' || (e.resultType === 2 && (e.resultIndex == undefined || e.resultIndex === ''))) {
+      if (e.resultstr == undefined || e.resultstr === '' || e.resultType == undefined || e.resultType === ''
+        || (e.resultType === 2 && (e.resultIndex == undefined || e.resultIndex === ''))
+        || (e.iscumulant === 1 && e.cumuldivisor == undefined)
+      ) {
         message.error("模型输出数据异常")
         flag = true
         return
@@ -896,6 +985,10 @@
     row.resultIndex = 0
   }
 }
+function iscumulantChange(row) {
+  row.cumuldivisor = undefined
+  row.cumulpoint = undefined
+}
 
 function orderRow(rows) {
   let modelparamorder = 0
@@ -956,7 +1049,7 @@
       predictphase: '',
       workchecked: 0,
       unittransfactor: '',
-      saveindex: ''
+      saveindex: '',
     },
     dmModuleItem: {
       id: '',
@@ -992,7 +1085,10 @@
       itemid: '',
       expression: '',
       num: ''
-    }
+    },
+    iscumulant: 0,
+    cumuldivisor: undefined,
+    cumulpoint: '',
   }
   formRef.value?.resetFields()
 }

--
Gitblit v1.9.3