潘志宝
2024-11-15 f3edfbd978785007a3dce8f9ea62ac6800512efe
数据分析
已修改2个文件
123 ■■■■ 文件已修改
src/api/model/mcs/index.ts 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/pre/analysis/index.vue 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/model/mcs/index.ts
@@ -1,7 +1,7 @@
import request from '@/config/axios'
export interface PreDataBarLineReqVO {
  queryIds: string[],
  outIds: string[],
  predictTime: string,
  startTime: string,
  endTime: string
@@ -13,6 +13,9 @@
  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 })
src/views/model/pre/analysis/index.vue
@@ -4,36 +4,35 @@
      <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="选择日期时间"/>
        </el-form-item>
        <el-form-item label="结束时间">
          <el-date-picker
              size="mini"
              v-model="formData.endTime"
              type="datetime"
              placeholder="选择日期时间"/>
        </el-form-item>
        <el-form-item label="预测时间">
          <el-date-picker
              size="mini"
              v-model="formData.predictTime"
              type="datetime"
              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"
            <el-button 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"
            <el-button type="primary" plain :icon="Search"
                       v-loading="loading1" @click="getList()">查询
            </el-button>
            <el-button type="primary" plain :icon="ArrowRight"
                       v-loading="loading1" @click="rightSearchDataByRange()"/>
          </el-button-group>
        </el-form-item>
@@ -53,11 +52,13 @@
          </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="calRateForm"
                       label-width="108px">
                <el-row>
                  <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"
@@ -68,20 +69,23 @@
                  </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>
@@ -146,20 +150,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>
@@ -169,29 +178,21 @@
</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 McsApi from '@/api/model/mcs'
  import * as echarts from "echarts";
  import { onMounted, ref } from 'vue';
  import { Search, ArrowLeft, ArrowRight,} from '@element-plus/icons-vue'
import {getPreDataCharts, getPredictItemTree} from "@/api/model/mcs";
  defineOptions({name: 'AnalysisformData'})
  const message = useMessage() // 消息弹窗
  const { t } = useI18n() // 国际化
  const dataCategoryList = ref([] as CategoryApi.IndItemCategoryVO[])
const dataAnalysisChart = ref(null);
  const loading1 = ref(false) // 列表的加载中
  const loading2 = ref(false) // 列表的加载中
  const total = ref(0) // 列表的总页数
  const list = ref([]) // 字典表格数据
  const queryParams = reactive({
    pageNo: 1,
    pageSize: 10,
    itemno: '',
    itemname: '',
  })
  let formData = ref({
    rangeDate: '',
    startTime: '',
@@ -239,22 +240,21 @@
    chart: {},
    option: {}
  })
  const chartContainer = ref(null);
  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 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 = ['真实值']
      }
@@ -263,24 +263,21 @@
        itemData.value.option = {};
        return;
      }
      let itemIdList = formData.value.checkedItemData.map(item => {
    let outIds = formData.value.checkedItemData.map(item => {
        return item.id
      })
      const params = ref({
        itemIds: itemIdList.join(','),
    const params = reactive({
      outIds: outIds,
        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
    const data = await McsApi.getPreDataCharts(params)
    formData.value.predictTime = data.predictTime;
    formData.value.startTime = data.startTime
    formData.value.endTime = data.endTime
      let xAxisData = res.data.categories;
    let xAxisData = data.categories;
      let yAxisData = [];
      let offset = 0;
      let yAxisIndex = 0;
@@ -311,9 +308,9 @@
        },
      });
      itemDataObject.value = {}
      for (let i = 0; i < res.data.dataViewList.length; i++) {
        let dataView = res.data.dataViewList[i]
        itemDataObject.value.dataView.itemId = dataView;
    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;
@@ -358,7 +355,7 @@
        })
        offset = offset + 40
        if (chartCheckArray.indexOf('真实值') !== -1) {
          let legendName = dataView.itemName + '(真实)';
        let legendName = dataView.resultstr + '(真实)';
          legendData.push(legendName);
          seriesData.push({
            name: legendName,
@@ -368,12 +365,12 @@
            showSymbol: false,
            smooth: true,
            lineStyle: {
              width: 3
            width: 2
            }
          });
        }
        if (chartCheckArray.indexOf('T+N') !== -1) {
          let legendName = dataView.itemName + '(T+N)';
        let legendName = dataView.resultstr + '(T+N)';
          seriesData.push({
            name: legendName,
            data: dataView.preDataN || [],
@@ -382,12 +379,12 @@
            showSymbol: false,
            smooth: true,
            lineStyle: {
              width: 3
            width: 2
            }
          });
        }
        if (chartCheckArray.indexOf('T+L') !== -1) {
          let legendName = dataView.itemName + '(T+L)';
        let legendName = dataView.resultstr + '(T+L)';
          legendData.push(legendName);
          seriesData.push({
            name: legendName,
@@ -398,12 +395,12 @@
            yAxisIndex: yAxisIndex,
            smooth: true,
            lineStyle: {
              width: 3
            width: 2
            }
          });
        }
        if (chartCheckArray.indexOf('当时') !== -1) {
          let legendName = dataView.itemName + '(当时)';
        let legendName = dataView.resultstr + '(当时)';
          legendData.push(legendName);
          seriesData.push({
            name: legendName,
@@ -413,12 +410,12 @@
            showSymbol: false,
            smooth: true,
            lineStyle: {
              width: 3
            width: 2
            }
          });
        }
        if (chartCheckArray.indexOf('调整值') !== -1) {
          let legendName = dataView.itemName + '(调整值)';
        let legendName = dataView.resultstr + '(调整值)';
          legendData.push(legendName);
          seriesData.push({
            name: legendName,
@@ -429,7 +426,7 @@
            connectNulls: true,
            smooth: true,
            lineStyle: {
              width: 3,
            width: 2,
              type: 'dashed'
            }
          });
@@ -445,6 +442,7 @@
          }
        }
      }
    myChart = echarts.init(dataAnalysisChart.value);
      let option = {
        title: {
          text: ''
@@ -458,7 +456,7 @@
          top: 10
        },
        grid: {
          top: 50,
        top: '20%',
          left: '3%',
          right: '6%',
          bottom: '3%',
@@ -487,7 +485,8 @@
        ],
        series: seriesData
      }
      //chart.setOption(option)
    myChart.clear()
    myChart.setOption(option)
    } finally {
      loading1.value = false
    }
@@ -499,7 +498,7 @@
  })
  async function getPreItemTree() {
    treeData.value = await MmPredictItem.getMmPredictItemTree()
  treeData.value = await McsApi.getPredictItemTree()
  }
  function leftSearchDataByRange() {
@@ -538,8 +537,7 @@
    if (checked.checkedNodes) {
      formData.value.checkedItemData = [...checked.checkedNodes]
    }
    //myChart.clear()
    debounce(getList(), 1000);
  debounce(getList, 1000);
  }
  function debounce(func, wait) {