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