From 23beab5084d97f25fb40ee57055436a1c84757f1 Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期一, 04 十一月 2024 08:28:17 +0800
Subject: [PATCH] 计划数据

---
 src/api/data/plan/item/index.ts        |   19 ++-
 src/views/data/plan/item/ItemChart.vue |  225 +++++++++++++++++++++++++++++++++++++++++++++
 src/views/data/plan/item/index.vue     |   45 ++++++--
 3 files changed, 271 insertions(+), 18 deletions(-)

diff --git a/src/api/data/plan/item/index.ts b/src/api/data/plan/item/index.ts
index 897a453..e42e999 100644
--- a/src/api/data/plan/item/index.ts
+++ b/src/api/data/plan/item/index.ts
@@ -17,6 +17,12 @@
   itemCategory: string
 }
 
+export interface PlanChartReqVO {
+  itemNos?: [],
+  start?: Date,
+  end?: Date,
+}
+
 // 查询列表
 export const getItemPage = (params: PageParam) => {
   return request.get({ url: '/data/plan-item/page', params })
@@ -47,9 +53,12 @@
   return request.get({ url: '/data/plan-item/getList', params})
 }
 
-export const validateAsNumber = (rule, value, callback) => {
-  const regex = /^(\-|\+)?\d+(\.\d+)?$/;
-  if (!regex.test(value)) {
-    callback(new Error('请输入数字!'));
-  }
+// 查询Plan图表
+export const getPlanChart = (data: PlanChartReqVO) => {
+  return request.post({ url: '/data/api/query-plans/chart', data })
+}
+
+// 导出Plan值
+export const exportPlanValue = (data: PlanChartReqVO) => {
+  return request.post({ url: '/data/api/export-plan/history-value', data })
 }
diff --git a/src/views/data/plan/item/ItemChart.vue b/src/views/data/plan/item/ItemChart.vue
new file mode 100644
index 0000000..bb6d993
--- /dev/null
+++ b/src/views/data/plan/item/ItemChart.vue
@@ -0,0 +1,225 @@
+<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>
+        <el-date-picker
+          v-model="dataForm.startTime"
+          type="datetime"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          placeholder="选择日期时间"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-date-picker
+          v-model="dataForm.endTime"
+          type="datetime"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          placeholder="选择日期时间"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="getDataList()">查询</el-button>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['data:point:export']"
+        >
+          <Icon icon="ep:download" />导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+    <div ref="chartDomPlan" class="result-chart"></div>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import {ref} from 'vue';
+import * as echarts from 'echarts';
+import * as ItemApi from '@/api/data/plan/item'
+import download from "@/utils/download";
+const message = useMessage() // 消息弹窗
+const visible = ref(false);
+const chartDomPlan = ref(null);
+let myChart = null;
+const dataForm = ref({
+  id: "",
+  itemNo: "",
+  itemName: "",
+  startTime: getYMDHMS(),
+  endTime: undefined,
+});
+const queryParams = reactive({
+  itemNos: [],
+  start: undefined,
+  end: undefined,
+})
+function getYMDHMS() {
+  let timestamp = new Date().getTime();
+  let time = new Date(timestamp - 1000 * 60 * 60 * 3);
+  let year = time.getFullYear();
+  let month = (time.getMonth() + 1).toString();
+  let date = time.getDate().toString();
+  let hours = time.getHours().toString();
+  let minute = time.getMinutes().toString();
+
+  if (month < 10) {
+    month = "0" + month;
+  }
+  if (date < 10) {
+    date = "0" + date;
+  }
+  if (hours < 10) {
+    hours = "0" + hours;
+  }
+  if (minute < 10) {
+    minute = "0" + minute;
+  }
+
+  return (
+    year +
+    "-" +
+    month +
+    "-" +
+    date +
+    " " +
+    hours +
+    ":" +
+    minute +
+    ":" +
+    "00"
+  );
+}
+/** 打开弹窗 */
+const open = async (row: object) => {
+  visible.value = true
+  dataForm.value.id = row.id;
+  dataForm.value.itemNo = row.itemNo;
+  dataForm.value.itemName = row.itemName;
+  dataForm.value.startTime = getYMDHMS();
+  dataForm.value.endTime = "";
+  getDataList();
+}
+
+defineExpose({open}) // 提供 open 方法,用于打开弹窗
+
+async function getDataList() {
+  visible.value = true;
+  if (dataForm.value.id) {
+    try {
+      queryParams.itemNos=[dataForm.value.itemNo];
+      queryParams.start = dataForm.value.startTime;
+      queryParams.end = dataForm.value.endTime;
+      const data = await ItemApi.getPlanChart(queryParams)
+      let seriesData = []
+      data.series.forEach(item => {
+        seriesData.push({
+          name: item.name,
+          type: "line",
+          data: item.data,
+          showSymbol: true,
+          smooth: false,
+          lineStyle: {
+            normal: {
+              color: "#5B8FF9",
+              width: 1,
+            },
+          },
+        });
+      })
+
+      myChart = echarts.init(chartDomPlan.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: data.categories,
+        },
+        yAxis: {
+          type: "value",
+        },
+        dataZoom: [
+          {
+            type: "inside",
+          },
+        ],
+        series: seriesData,
+      };
+      myChart.setOption(option);
+    } catch (error) {
+      console.error(error)
+    }
+  }
+}
+/** 导出按钮操作 */
+const exportLoading = ref(false)
+const handleExport = async () => {
+  queryParams.itemNos=[dataForm.value.itemNo];
+  queryParams.start = dataForm.value.startTime;
+  queryParams.end = dataForm.value.endTime;
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await ItemApi.exportPlanValue(queryParams)
+    download.excel(data, dataForm.value.itemName +'.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+</script>
+<style>
+.el-select {
+  width: 100%;
+}
+
+.result-chart {
+  height: 500px;
+}
+</style>
diff --git a/src/views/data/plan/item/index.vue b/src/views/data/plan/item/index.vue
index daa9a45..cc85952 100644
--- a/src/views/data/plan/item/index.vue
+++ b/src/views/data/plan/item/index.vue
@@ -4,11 +4,13 @@
     <el-form ref="queryFormRef" :inline="true" :model="queryParams" class="-mb-15px"
              label-width="68px">
       <el-form-item label="计划编码" prop="itemNo">
-        <el-input v-model="queryParams.itemNo" class="!w-200px" clearable placeholder="请输入计划编码"
+        <el-input v-model="queryParams.itemNo" class="!w-200px" clearable
+                  placeholder="请输入计划编码"
                   @keyup.enter="handleQuery"/>
       </el-form-item>
       <el-form-item label="计划名称" prop="itemName">
-        <el-input v-model="queryParams.itemName" class="!w-200px" clearable placeholder="请输入计划名称"
+        <el-input v-model="queryParams.itemName" class="!w-200px" clearable
+                  placeholder="请输入计划名称"
                   @keyup.enter="handleQuery"/>
       </el-form-item>
       <el-form-item>
@@ -36,12 +38,16 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
-      <el-table-column prop="itemNo" label="计划编码" header-align="center" align="center" min-width="80"/>
-      <el-table-column prop="itemName" label="计划名称" header-align="center" align="center" min-width="120"/>
-      <el-table-column prop="itemCategoryName" label="计划分类" header-align="center" align="center" min-width="100"/>
-      <el-table-column prop="timeGranularity" label="时间粒度" header-align="center" align="center" min-width="40">
+      <el-table-column prop="itemNo" label="计划编码" header-align="center" align="center"
+                       min-width="80"/>
+      <el-table-column prop="itemName" label="计划名称" header-align="center" align="center"
+                       min-width="120"/>
+      <el-table-column prop="itemCategoryName" label="计划分类" header-align="center" align="center"
+                       min-width="100"/>
+      <el-table-column prop="timeGranularity" label="时间粒度" header-align="center" align="center"
+                       min-width="40">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.TIME_GRANULARITY" :value="scope.row.timeGranularity" />
+          <dict-tag :type="DICT_TYPE.TIME_GRANULARITY" :value="scope.row.timeGranularity"/>
         </template>
       </el-table-column>
       <el-table-column
@@ -58,6 +64,8 @@
             type="primary"
             @click="openForm('update', scope.row.id)">
             修改
+          </el-button>
+          <el-button link size="mini" type="primary" @click="chartHandle(scope.row)">数据
           </el-button>
           <el-button
             v-hasPermi="['data:ind-item:delete']"
@@ -79,21 +87,25 @@
   </ContentWrap>
 
   <!-- 表单弹窗:添加/修改 -->
-  <ItemForm ref="formRef" @success="getList" />
+  <ItemForm ref="formRef" @success="getList"/>
+
+  <!-- 表单弹窗:计划数据 -->
+  <ItemChart ref="chartView"/>
 </template>
 
 <script lang="ts" setup>
-import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from '@/utils/dict'
+import {dateFormatter} from '@/utils/formatTime'
 import ItemForm from './ItemForm.vue'
 import download from '@/utils/download'
 import * as ItemApi from '@/api/data/plan/item'
 import * as CategoryApi from "@/api/data/plan/category";
+import ItemChart from "./ItemChart.vue";
 
-defineOptions({ name: 'PlanItem' })
+defineOptions({name: 'PlanItem'})
 
 const message = useMessage() // 消息弹窗
-const { t } = useI18n() // 国际化
+const {t} = useI18n() // 国际化
 const dataCategoryList = ref([] as CategoryApi.IndItemCategoryVO[])
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
@@ -127,6 +139,12 @@
   getList()
 }
 
+/** 查看数据操作 */
+const chartView = ref()
+const chartHandle = (raw: object) => {
+  chartView.value.open(raw)
+}
+
 /** 重置按钮操作 */
 const resetQuery = () => {
   queryFormRef.value.resetFields()
@@ -149,7 +167,8 @@
     message.success(t('common.delSuccess'))
     // 刷新列表
     await getList()
-  } catch {}
+  } catch {
+  }
 }
 
 /** 初始化 **/

--
Gitblit v1.9.3