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