Jay
2025-02-19 331bbbc6604426763876ef55403b6f60cc22bf04
新增指标查询历史值功能
已修改6个文件
已添加1个文件
253 ■■■■■ 文件已修改
src/api/data/ind/item/item.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/dict.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/ind/item/AtomIndDefineForm.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/ind/item/CalIndDefineForm.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/ind/item/DerIndDefineForm.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/ind/item/IndHistoryChart.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/data/ind/item/index.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/data/ind/item/item.ts
@@ -27,6 +27,11 @@
  itemCategory: string
}
export type IndValueParam = {
  itemNo: string
  startDate: string
  endTime: string
}
// 查询列表
export const getItemPage = (params: PageParam) => {
@@ -68,3 +73,7 @@
export const getItemCurrentData = (itemNo: string) => {
  return request.get({ url: '/data/api/query-ind/default-value?itemNo=' + itemNo})
}
export const getItemValueData = (params: IndValueParam) => {
  return request.get({ url: '/data/ind-item-value/getList', params})
}
src/utils/dict.ts
@@ -187,5 +187,6 @@
  CAMERA_BRAND = 'camera_brand',
  CAPTURE_TYPE = 'capture_type',
  MODEL_RESULT_TYPE = 'model_result_type',
  DATA_QUALITY = 'data_quality'
  DATA_QUALITY = 'data_quality',
  SOLIDIFY_FLAG = 'ind_solidify_flag'
}
src/views/data/ind/item/AtomIndDefineForm.vue
@@ -59,6 +59,22 @@
            <el-input v-model="formData.unit"/>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="固化标识" prop="solidifyFlag">
            <el-select v-model="formData.solidifyFlag"
                       clearable
                       filterable
                       allow-create
                       placeholder="请选择">
              <el-option
                v-for="dict in getStrDictOptions(DICT_TYPE.SOLIDIFY_FLAG)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
@@ -143,6 +159,7 @@
    timeRange: '',
    timeGranularity: '',
    remark: '',
    solidifyFlag: '',
    atomItem:{
      dataSource:'',
      dataSet: '',
src/views/data/ind/item/CalIndDefineForm.vue
@@ -44,21 +44,37 @@
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="8">
        <el-col :span="6">
          <el-form-item label="指标精度" prop="precision">
            <el-input v-model="formData.precision"/>
          </el-form-item>
        </el-col>
        <el-col :span="8">
        <el-col :span="6">
          <el-form-item label="转换系数" prop="coefficient">
            <el-input v-model="formData.coefficient"/>
          </el-form-item>
        </el-col>
        <el-col :span="8">
        <el-col :span="6">
          <el-form-item label="数量单位" prop="unit">
            <el-input v-model="formData.unit"/>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="固化标识" prop="solidifyFlag">
            <el-select v-model="formData.solidifyFlag"
                       clearable
                       filterable
                       allow-create
                       placeholder="请选择">
              <el-option
                v-for="dict in getStrDictOptions(DICT_TYPE.SOLIDIFY_FLAG)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
src/views/data/ind/item/DerIndDefineForm.vue
@@ -80,6 +80,22 @@
            <el-input v-model="formData.unit"/>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="固化标识" prop="solidifyFlag">
            <el-select v-model="formData.solidifyFlag"
                       clearable
                       filterable
                       allow-create
                       placeholder="请选择">
              <el-option
                v-for="dict in getStrDictOptions(DICT_TYPE.SOLIDIFY_FLAG)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="6">
src/views/data/ind/item/IndHistoryChart.vue
对比新文件
@@ -0,0 +1,169 @@
<template>
  <el-dialog
    title="历史值"
    :close-on-click-modal="false"
    width="50%"
    v-model="visible"
  >
    <el-form
      :inline="true"
      :model="dataForm"
      @keydown.enter="getDataList()"
    >
      <el-form-item label="开始时间">
        <el-date-picker
          size="mini"
          v-model="dataForm.startTime"
          format="YYYY-MM-DD HH:mm:00"
          value-format="YYYY-MM-DD HH:mm:00"
          type="datetime"
          :clearable="false"
          placeholder="选择日期时间"/>
      </el-form-item>
      <el-form-item label="结束时间">
        <el-date-picker
          size="mini"
          v-model="dataForm.endTime"
          format="YYYY-MM-DD HH:mm:00"
          value-format="YYYY-MM-DD HH:mm:00"
          type="datetime"
          :clearable="false"
          placeholder="选择日期时间"/>
      </el-form-item>
      <el-form-item>
        <el-button @click="getDataList()">查询</el-button>
      </el-form-item>
    </el-form>
    <div ref="chartDom" class="result-chart" v-loading="loading"></div>
  </el-dialog>
</template>
<script lang="ts" setup>
import {ref} from 'vue';
import * as echarts from 'echarts';
import * as ItemApi from '@/api/data/ind/item/item'
import {getYMDHM0} from "@/utils/dateUtil"
import download from "@/utils/download";
const message = useMessage() // 消息弹窗
const visible = ref(false);
const chartDom = ref(null);
let myChart = null;
const chartParams = reactive({
  itemNo: undefined,
  startTime: undefined,
  endTime: undefined,
})
const dataForm = ref({
  id: "",
  itemNo: "",
  itemName: "",
  startTime: getYMDHM0(new Date() - 60 * 60 * 1000),
  endTime: "",
});
/** 打开弹窗 */
const open = async (row: object) => {
  visible.value = true
  dataForm.value.id = row.id;
  dataForm.value.itemNo = row.itemNo;
  dataForm.value.itemName = row.itemName;
  getDataList();
}
defineExpose({open}) // 提供 open 方法,用于打开弹窗
const loading = ref(false)
async function getDataList() {
  visible.value = true;
  loading.value = true
  if (dataForm.value.id) {
    try {
      chartParams.itemNo = dataForm.value.itemNo;
      chartParams.startTime = dataForm.value.startTime;
      chartParams.endTime = dataForm.value.endTime;
      const result = await ItemApi.getItemValueData(chartParams)
      loading.value = false
      let xData = result.map(obj => obj['dataTime']);
      let yData = result.map(obj => obj['dataValue']);
      let data = xData.map((x, index) => [x, yData[index]]);
      let seriesData = []
      seriesData.push({
        name: dataForm.value.itemName,
        type: "line",
        data: data,
        showSymbol: true,
        smooth: false,
        lineStyle: {
          normal: {
            color: "#5B8FF9",
            width: 1,
          },
        },
      });
      myChart = echarts.init(chartDom.value);
      const option = {
        title: {
          text: dataForm.value.itemName,
          top: 0,
          left: "1%",
          textStyle: {
            fontSize: 14,
          },
        },
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "line",
            lineStyle: {
              color: "#cccccc",
              width: "1",
              type: "dashed",
            },
          },
        },
        legend: {
          show: false,
          top: 10,
        },
        grid: {
          top: 30,
          left: "3%",
          right: "5%",
          bottom: 10,
          containLabel: true,
        },
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: xData,
        },
        yAxis: {
          type: "value",
        },
        dataZoom: [
          {
            type: "inside",
          },
        ],
        series: seriesData,
      };
      myChart.setOption(option);
    } catch (error) {
      console.error(error)
    }
  }
}
</script>
<style>
.el-select {
  width: 100%;
}
.result-chart {
  height: 500px;
}
</style>
src/views/data/ind/item/index.vue
@@ -91,11 +91,16 @@
                修改
              </el-button>
              <el-button
                v-hasPermi="['data:ind-item:update']"
                link
                type="primary"
                @click="getCurrentData(scope.row.itemNo)">
                当前值
              </el-button>
              <el-button
                link
                type="primary"
                @click="getHistoryData(scope.row)">
                历史值
              </el-button>
              <el-button
                v-hasPermi="['data:ind-item:delete']"
@@ -124,7 +129,8 @@
  <DerIndDefineForm ref="derFormRef" @success="getList" />
  <CalIndDefineForm ref="calFormRef" @success="getList" />
  <SelectItemType ref="itemTypeSel"/>
  <IndCurrentData ref="indCurrentData" />
  <IndCurrentData ref="indCurrentData"/>
  <IndHistoryChart ref="indHistoryChart"/>
</template>
<script lang="ts" setup>
@@ -139,6 +145,7 @@
  import * as ItemApi from '@/api/data/ind/item/item'
  import * as CategoryApi from "@/api/data/ind/category";
  import IndCurrentData from './IndCurrentData.vue'
  import IndHistoryChart from './IndHistoryChart.vue'
  import {handleTree} from "@/utils/tree";
@@ -219,11 +226,15 @@
    }
  }
  const indCurrentData = ref()
  const getCurrentData = (itemNo: string) => {
    indCurrentData.value.open(itemNo)
  }
  const indHistoryChart = ref()
  const getHistoryData = (raw: object) => {
    indHistoryChart.value.open(raw)
  }
  /** 删除按钮操作 */
  const handleDelete = async (id: number) => {
    try {