From 331bbbc6604426763876ef55403b6f60cc22bf04 Mon Sep 17 00:00:00 2001 From: Jay <csj123456> Date: 星期三, 19 二月 2025 14:08:19 +0800 Subject: [PATCH] 新增指标查询历史值功能 --- src/views/data/ind/item/CalIndDefineForm.vue | 22 +++ src/views/data/ind/item/IndHistoryChart.vue | 169 +++++++++++++++++++++++++++++++++ src/api/data/ind/item/item.ts | 9 + src/utils/dict.ts | 3 src/views/data/ind/item/DerIndDefineForm.vue | 16 +++ src/views/data/ind/item/index.vue | 17 ++ src/views/data/ind/item/AtomIndDefineForm.vue | 17 +++ 7 files changed, 246 insertions(+), 7 deletions(-) diff --git a/src/api/data/ind/item/item.ts b/src/api/data/ind/item/item.ts index ed09f65..0bb8833 100644 --- a/src/api/data/ind/item/item.ts +++ b/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}) +} diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 0795004..925a752 100644 --- a/src/utils/dict.ts +++ b/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' } diff --git a/src/views/data/ind/item/AtomIndDefineForm.vue b/src/views/data/ind/item/AtomIndDefineForm.vue index 97f2e34..6368c02 100644 --- a/src/views/data/ind/item/AtomIndDefineForm.vue +++ b/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: '', diff --git a/src/views/data/ind/item/CalIndDefineForm.vue b/src/views/data/ind/item/CalIndDefineForm.vue index 52d78cc..428dc85 100644 --- a/src/views/data/ind/item/CalIndDefineForm.vue +++ b/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"> diff --git a/src/views/data/ind/item/DerIndDefineForm.vue b/src/views/data/ind/item/DerIndDefineForm.vue index dc35975..a4f2b12 100644 --- a/src/views/data/ind/item/DerIndDefineForm.vue +++ b/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"> diff --git a/src/views/data/ind/item/IndHistoryChart.vue b/src/views/data/ind/item/IndHistoryChart.vue new file mode 100644 index 0000000..e41ec10 --- /dev/null +++ b/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> diff --git a/src/views/data/ind/item/index.vue b/src/views/data/ind/item/index.vue index f677122..3a3c9a9 100644 --- a/src/views/data/ind/item/index.vue +++ b/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 { -- Gitblit v1.9.3