Jay
2025-02-14 3babafdbc9a43745ab2191f81f70e7ad5d9e985e
Merge remote-tracking branch 'origin/master'
已修改7个文件
533 ■■■■ 文件已修改
src/api/model/pre/item/index.ts 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/model/sche/model/index.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/point/DaPointValue.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/pre/alarm/MmPredictAlarmMessageForm.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/pre/analysis/index.vue 306 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/pre/item/MmPredictItemChart.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/pre/item/MmPredictItemForm.vue 158 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,
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 => {
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
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,
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,
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",
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()
}