Browse Source

代码提交

cxs 4 months ago
parent
commit
e43c0aa13c

+ 1 - 1
src/api/modules/allData.ts

@@ -8,7 +8,7 @@ import http from "@/api";
  */
 // 获取自动站基本信息
 export const getPlatformList = (params: {}) => {
-  return http.post<ResPage<any>>(PORT1 + `/queryasinfo`, params);
+  return http.post<ResPage<any>>(PORT1 + `/queryasinfo`, params,{ loading: false });
 };
 
 

+ 3 - 4
src/views/alarm/allData/index.vue

@@ -238,8 +238,8 @@ const resetQuery = () => {
  * @return void
  * */
 const handleSizeChange = (val: number) => {
-  console.log("=====");
-  console.log(val);
+  pageable.value.pageSize = val
+  getList();
 };
 
 /**
@@ -249,8 +249,7 @@ const handleSizeChange = (val: number) => {
  * */
 const handleCurrentChange = (val: number) => {
   pageable.value.pageNum = val
-  console.log("=====1");
-  console.log(val);
+  getList();
 };
 
 const processTableData = ref([]);

+ 3 - 6
src/views/alarm/singleDevice/index.vue

@@ -232,7 +232,8 @@
 
 <script setup lang="ts">
 import { getPlatformList, getStaitemList, getYallSensorList} from "@/api/modules/allData";
-
+import {onMounted, reactive, ref} from "vue";
+import {Platform} from "@/api/interface";
 const pageable = ref<any>({
   data_type: true,
   time_order: 0,
@@ -332,9 +333,6 @@ const toggleSelection=(item)=> {
   }
 }
 
-
-
-
 const dialog = reactive<any>({
   visible: false,
   title: ''
@@ -356,8 +354,7 @@ const handleSetting = () => {
   dialog.visible = true;
 }
 
-import {onMounted, reactive, ref} from "vue";
-import {Platform} from "@/api/interface";
+
 
 const queryParams = ref({
   name: "1"

+ 489 - 114
src/views/query/deviceHealth/index.vue

@@ -4,55 +4,109 @@
       <!-- 表格头部 操作按钮 -->
       <div class="table-header">
         <div class="header-button-lf">
-          <el-form :model="queryParams" label-width="auto" :inline="true">
+          <el-form :model="pageable" label-width="auto" :inline="true">
             <el-form-item label="自动站:">
-              <el-checkbox v-model="queryParams.isStand" label="多站"/>
-              <el-select v-model="queryParams.name" filterable placeholder="请选择" clearable style="width: 200px;margin-left: 10px">
-                <el-option label="站1" value="1" />
-                <el-option label="站2" value="2" />
+              <el-checkbox v-model="isStand" label="多站"/>
+
+              <!--多站选择-->
+              <el-select v-if="isStand" v-model="pageable.as_code_list"  multiple collapse-tags   filterable placeholder="请搜索自动站" remote reserve-keyword clearable  style="width: 200px;margin: 0 10px">
+                <el-option
+                  v-for="item in platformList"
+                  :key="item.as_code"
+                  :label="item.as_code +' '+item.as_name"
+                  :value="item.as_code"
+                />
+                <template #prefix>
+                  <el-icon class="el-input__icon"><search /></el-icon>
+                </template>
               </el-select>
-            </el-form-item>
-            <el-form-item label="观测时间:" v-if="queryParams.isStand">
-              <el-date-picker
-                v-model="queryParams.time"
-                type="datetime"
-                placeholder="请选择"
-                format="YYYY-MM-DD HH:mm"
-              />
-            </el-form-item>
-            <el-form-item label="观测时间:" v-if="!queryParams.isStand">
-              <el-switch
-                v-model="queryParams.hot"
-                inline-prompt
-                active-text="正点"
-                size="default"
-                inactive-text="分钟"
-              />
-
-              <span class="form-item__label">日界:</span>
-              <el-switch
-                v-model="queryParams.points"
-                inline-prompt
-                active-text="0点"
-                size="default"
-                inactive-text="18点"
-              />
-
-              <el-date-picker
-                v-if="queryParams.hot"
-                style="margin-left: 10px"
-                v-model="queryParams.time"
-                type="date"
-                placeholder="请选择"
-              />
-              <el-date-picker
-                v-if="!queryParams.hot"
-                style="margin-left: 10px"
-                v-model="queryParams.time"
-                type="datetime"
-                placeholder="请选择"
-                format="YYYY-MM-DD HH:mm"
-              />
+              <el-form-item label="观测时间:" v-if="isStand">
+                <el-switch
+                  v-model="hot"
+                  inline-prompt
+                  active-text="正点"
+                  size="default"
+                  inactive-text="分钟"
+                  @change="changeHot"
+                />
+                <el-date-picker
+                  v-if="hot"
+                  v-model="multiTime"
+                  style="margin-left: 10px"
+                  type="datetime"
+                  popper-class="tpc"
+                  format="YYYY-MM-DD HH"
+                  placeholder="选择日期时间"
+                  @change="changeMultiTime"
+                >
+                </el-date-picker>
+
+                <el-date-picker
+                  v-if="!hot"
+                  v-model="multiTime"
+                  style="margin-left: 10px"
+                  type="datetime"
+                  @change="changeMultiTime"
+                  format="YYYY-MM-DD HH:mm"
+                  placeholder="选择日期时间">
+                </el-date-picker>
+              </el-form-item>
+
+              <!--单站选择-->
+              <el-select v-if="!isStand"  v-model="as_code_list"  @change="changeAslist" collapse-tags   filterable placeholder="请搜索自动站"  remote reserve-keyword clearable  style="width: 200px;padding: 0px 10px">
+                <el-option
+                  v-for="item in platformList"
+                  :key="item.as_code"
+                  :label="item.as_code +' '+item.as_name"
+                  :value="item.as_code"
+                />
+                <template #prefix>
+                  <el-icon class="el-input__icon"><search /></el-icon>
+                </template>
+              </el-select>
+
+              <el-form-item label="观测时间:" v-if="!isStand">
+                <el-switch
+                  v-model="hot"
+                  inline-prompt
+                  active-text="正点"
+                  size="default"
+                  inactive-text="分钟"
+                  @change="changeHot"
+                />
+
+                <span class="form-item__label">日界:</span>
+                <el-switch
+                  v-model="points"
+                  inline-prompt
+                  active-text="0点"
+                  size="default"
+                  inactive-text="18点"
+                  @change="changePoints"
+                />
+
+                <el-date-picker
+                  style="margin-left: 10px"
+                  v-model="singleTime"
+                  type="daterange"
+                  range-separator="至"
+                  start-placeholder="开始时间"
+                  end-placeholder="结束时间"
+                  @change="changeTime"
+                />
+              </el-form-item>
+
+              <el-form-item v-if="!hot" label="数据密度:">
+                <el-select v-model="pageable.time_space" style="width: 240px"  filterable placeholder="请选择" clearable>
+                  <el-option
+                    v-for="item in timeSpaceList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+
             </el-form-item>
             <el-form-item>
               <el-button type="primary" @click="handleQuery"> 查询 </el-button>
@@ -70,11 +124,16 @@
       <el-table stripe ref="tableRef" :border="true" :data="processTableData"  size="small" @sort-change="handleSortChange">
         <el-table-column align="left" label="序号" width="80px" :show-overflow-tooltip="true" >
           <template #default="scope">
-            {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
+            {{ (pageable.pageNum - 1) * pageable.pageSize + scope.$index + 1 }}
           </template>
         </el-table-column>
         <template v-for="item in columns" :key="item">
           <el-table-column v-bind="item" :align="item.align ?? 'left'" :reserve-selection="item.type == 'selection'" :sortable="item.sortable" :show-overflow-tooltip="true" >
+            <template #default="scope">
+              <template v-if="item.prop === 'data_time_i'">
+                {{formatDate(scope.row.data_time_i)}}
+              </template>
+            </template>
           </el-table-column>
         </template>
         <!-- 无数据 -->
@@ -96,27 +155,38 @@
         <el-tabs tab-position="left" class="demo-tabs" style="height: 100%;flex-grow: 1">
           <el-tab-pane label="组件">
             <div class="container-tag">
-              <div class="item-tag">预处理</div>
-              <div class="item-tag-active">通信模块</div>
-              <div class="item-tag-active">通信模块</div>
-              <div class="item-tag-active">通信模块</div>
-              <div class="item-tag-active">通信模块</div>
+              <template v-for="item in sensorList" :key="item.se_type"  >
+                <div v-if="item.se_state===0"  :class="item.isSelected?'item-tag-active':'item-tag'" @click="toggleSelection(item)" >{{item.se_name}}</div>
+              </template>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="自动">
+            <div class="container-tag">
+              <template v-for="item in sensorList" :key="item.se_type"  >
+                <div v-if="item.se_state===1"  :class="item.isSelected?'item-tag-active':'item-tag'" @click="toggleSelection(item)" >{{item.se_name}}</div>
+              </template>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="人工">
+            <div class="container-tag">
+              <template v-for="item in sensorList" :key="item.se_type"  >
+                <div v-if="item.se_state===2"  :class="item.isSelected?'item-tag-active':'item-tag'" @click="toggleSelection(item)" >{{item.se_name}}</div>
+              </template>
             </div>
           </el-tab-pane>
-          <el-tab-pane label="自动">自动</el-tab-pane>
-          <el-tab-pane label="人工">人工</el-tab-pane>
         </el-tabs>
         <div class="selected-list-box">
           <div class="disposition-title" style="margin-top: 0px">已选设备</div>
           <div class="selected-list-c">
-            <div class="selected-item-tag-active">通信模块</div>
-            <div class="selected-item-tag">通信模块</div>
+            <template v-for="(item,index) in copiedCustomizeColumns" :key="item.se_type">
+              <div  :class="selectedItemIndex===index?'selected-item-tag-active':'selected-item-tag'" @click="changeSelected(index)">{{item.se_name}}</div>
+            </template>
           </div>
           <div class="button-container">
-            <el-button type="primary" plain class="top-left">上移</el-button>
-            <el-button type="primary" plain class="top-right">下移</el-button>
-            <el-button type="primary" plain class="bottom-left">移除</el-button>
-            <el-button type="primary" plain class="bottom-right">清空</el-button>
+            <el-button type="primary" plain class="top-left" @click="changeMoveUp">上移</el-button>
+            <el-button type="primary" plain class="top-right" @click="changeMoveDown">下移</el-button>
+            <el-button type="primary" plain class="bottom-left" @click="changeRemove">移除</el-button>
+            <el-button type="primary" plain class="bottom-right" @click="changeCleared">清空</el-button>
           </div>
         </div>
       </div>
@@ -132,58 +202,363 @@
 
 <script setup lang="ts" name="useProTable">
 import Pagination from "@/components/ProTable/components/Pagination.vue";
-import { ref, reactive } from "vue";
+import {ref, reactive, onMounted} from "vue";
 import { ColumnProps } from "@/components/ProTable/interface";
+import {getPlatformList, getStaitemList, getYallSensorList} from "@/api/modules/allData";
+import {Platform} from "@/api/interface";
+import {ElNotification} from "element-plus";
+
+
+const isStand =ref(true)
+const as_code_list = ref(undefined);
+const hot = ref(true);
+const points =ref(true);
+const singleTime =ref(undefined)
+const multiTime =ref(undefined)
+
+const pageable = ref<any>({
+  time_space:60,
+  begin_time: undefined,
+  end_time: undefined,
+  data_type: false,
+  time_order: 0,
+  as_code_list:[],
+  state_list: [
+    "STATE_PART",
+    "STATE_SENSOR",
+    "STATE_ARTIFICIAL"
+  ],
+  pageNum: 1,
+  pageSize: 24
+});
+
+
+const changeHot =(row)=>{
+  console.log(row)
+  if(row){
+    pageable.value.time_space = 60
+  }else {
+    pageable.value.time_space = 1
+  }
+}
+
+const changeMultiTime =(time)=>{
+  if(time){
+    const timeStamp = new Date(time).getTime();
+    console.log(timeStamp)
+    pageable.value.begin_time = timeStamp/1000
+    pageable.value.end_time = timeStamp/1000
+  }else {
+    pageable.value.begin_time = undefined
+    pageable.value.end_time = undefined
+  }
+
+}
+
+const timeSpaceList= [
+  {
+    value: 1,
+    label: '1分钟',
+  },
+  {
+    value: 5,
+    label: '5分钟',
+  },
+  {
+    value: 10,
+    label: '10分钟',
+  }
+]
+
+const changePoints=(row)=>{
+  singleTime.value =undefined
+  pageable.value.begin_time = undefined
+  pageable.value.end_time = undefined
+
+}
+const changeTime =(time)=> {
+  const [start, end] = time;
+
+  const startTime2 = new Date(start).getTime();
+  const endTime2= new Date(end).getTime();
+  if (points) {
+    //0点
+    const startTime = startTime2 + 60 * 1000; // 添加1分钟(60秒)
+    const endTime = endTime2 + 24 * 60 * 60 * 1000; // 添加一天(24小时)
+    pageable.value.begin_time = startTime / 1000
+    pageable.value.end_time = endTime / 1000
+  } else {
+    //18点
+    const startTimeStamp = startTime2 + 18 * 60 * 60 * 1000 + 60 * 1000;// 添加18小时和1分钟(18*60*60秒+60秒)
+    const endTimeStamp = endTime2 + 18 * 60 * 60 * 1000 + 60 * 1000;// 添加18小时和1分钟(18*60*60秒+60秒)
+    pageable.value.begin_time = startTimeStamp / 1000
+    pageable.value.end_time = endTimeStamp / 1000
+  }
+}
+
+
+const changeAslist =(row)=>{
+  if(row){
+    pageable.value.as_code_list = [row]
+  }else {
+    pageable.value.as_code_list = []
+  }
+
+}
+
+const processTableData = ref([]);
+
+const sensorList =ref<any>([])
+// 被选中当条数据下标
+const selectedItemIndex = ref(0)
+let customizeColumns= ref<any>([
+  {
+    se_type: 0,
+    se_name: "预处理器",
+    data_item: "",
+    se_state: 0,
+    data_r_table: "",
+    data_h_table: "",
+    data_value: "",
+    isSelected: false
+  }
+])
+
+const changeMoveUp = () =>{
+//上移
+  if (selectedItemIndex.value > 0) {
+    const temp = copiedCustomizeColumns.value[selectedItemIndex.value - 1]
+    copiedCustomizeColumns.value[selectedItemIndex.value - 1] = copiedCustomizeColumns.value[selectedItemIndex.value]
+    copiedCustomizeColumns.value[selectedItemIndex.value] = temp
+    selectedItemIndex.value--
+  }
+}
+
+const changeMoveDown = ()=>{
+//下移
+  if (selectedItemIndex.value < copiedCustomizeColumns.value.length - 1) {
+    const temp = copiedCustomizeColumns.value[selectedItemIndex.value + 1]
+    copiedCustomizeColumns.value[selectedItemIndex.value + 1] = copiedCustomizeColumns.value[selectedItemIndex.value]
+    copiedCustomizeColumns.value[selectedItemIndex.value] = temp
+    selectedItemIndex.value++
+  }
+}
+
+const changeRemove= ()=>{
+  //删除数据
+  if (copiedCustomizeColumns.value.length > 0) {
+    const custom=  copiedCustomizeColumns.value[selectedItemIndex.value];
+    const se_type = custom.se_type
+    for (let i = 0; i < sensorList.value.length; i++) {
+      if (sensorList.value[i].se_type === se_type) {
+        sensorList.value[i].isSelected = false;
+      }
+    }
+    copiedCustomizeColumns.value.splice(selectedItemIndex.value, 1)
+    if (selectedItemIndex.value === copiedCustomizeColumns.value.length) {
+      selectedItemIndex.value--
+    }
+
+  }
+}
+
+const changeCleared=()=>{
+  //清空所有数据
+  selectedItemIndex.value = 0
+  copiedCustomizeColumns.value = []
+  for (let i = 0; i < sensorList.value.length; i++) {
+    sensorList.value[i].isSelected = false;
+  }
+}
+
+const changeSelected = (index) =>{
+  selectedItemIndex.value = index
+}
+
+//操作 自定义部分表头
+const copiedCustomizeColumns = ref<any>([...customizeColumns.value]);
+
+// 要素的选中和取消
+const toggleSelection=(item)=> {
+  item.isSelected=!item.isSelected
+  if(item.isSelected){
+    //添加
+    copiedCustomizeColumns.value.push(item)
+  }else {
+    //删除
+    copiedCustomizeColumns.value= copiedCustomizeColumns.value.filter(column => column.se_type !== item.se_type);
+  }
+}
+
 const dialog = reactive<any>({
   visible: false,
   title: ''
 });
 
 const handleSetting = () => {
+  copiedCustomizeColumns.value = [...customizeColumns.value]
+  sensorList.value.forEach(element => {
+    const column = copiedCustomizeColumns.value.find(col => col.se_type === element.se_type);
+    if (column) {
+      element.isSelected = true;
+    } else {
+      element.isSelected = false;
+    }
+  });
+
+
   dialog.title = "列表字段设置"
   dialog.visible = true;
 }
 
-const handleSortChange = ({ column, prop, order }) =>{
-  // 在这里发送请求到服务器端进行远程排序
-  console.log('column:', column)
-  console.log('prop:', prop)
-  console.log('order:', order)
-}
+
+
+const getSensorList = async () => {
+  const { data } = await getYallSensorList();
+  sensorList.value = data.list
+};
+
 
 const submitForm = () => {
+  dialog.visible = false;
+  customizeColumns.value = [...copiedCustomizeColumns.value]
+  updateColumns()
+  saveCustomizeColumns()
+}
 
+const updateColumns = () => {
+  const column = [
+    { prop: "as_name", label: "站名", width: 100 },
+    { prop: "as_code", label: "站号", width: 100 },
+    { prop: "data_time_i", label: "观测时间", width: 100 }
+  ];
+
+  console.log(customizeColumns.value)
+  const newColumns = customizeColumns.value.map(item => ({
+    prop: item.se_type,
+    label: item.se_name,
+    width: calculateTextLengthInPixels(item.se_name)
+  }));
+
+  columns = [...column, ...newColumns];
+
+  // pageable.value.data_items = [...customizeColumns.value];
+  getList()
+}
+
+
+// 大概计算字符串长度
+function calculateTextLengthInPixels(text) {
+  return (text.length * 14)+30;
+}
+
+const changeCodeList =(value)=>{
+  if(value){
+    pageable.value.as_code_list = [value]
+  }else {
+    pageable.value.as_code_list= []
+  }
+  getList()
 }
 
+
 const cancel = () => {
   dialog.visible = false;
 }
 
-const pageable = ref<any>({
-  pageNum: 1,
-  pageSize: 24,
-  total: 1
-});
+onMounted(() => {
+  loadCustomizeColumns()
+  updateColumns()
+  getPlatforms()
+  getSensorList()
+})
+
+// 保存customizeColumns数组到localStorage
+function saveCustomizeColumns() {
+  const jsonString = JSON.stringify(customizeColumns.value);
+  localStorage.setItem('singleDevice', jsonString);
+}
+
+// 从localStorage中获取customizeColumns数组
+function loadCustomizeColumns() {
+  const jsonString = localStorage.getItem('singleDevice');
+  if (jsonString) {
+    customizeColumns.value = JSON.parse(jsonString);
+  }
+}
+
+
+const platformList =ref<any>([])
+// 查询自动站列表
+const queryas = ref<Platform>({
+  pageSize: 10000,
+  pageNum: 1
+})
+
+const getPlatforms = async () => {
+  const { data } = await getPlatformList(queryas.value);
+  platformList.value = data.list
+};
+
+
+const getList = async () => {
+  const { data } = await getStaitemList(pageable.value);
+  processTableData.value = data.list
+  pageable.value.total = data.total
+};
+
+
+
+const handleSortChange = ({ column, prop, order }) =>{
+  // 在这里发送请求到服务器端进行远程排序
+  console.log('column:', column)
+  console.log('prop:', prop)
+  console.log('order:', order)
+}
 
-const queryParams = ref({
-  isStand:true,
-  points: true,
-  name: '',
-  time:'',
-  hot:true,
-  pageNum: 1,
-  pageSize: 20,
-  total: 1
-});
 
 // 查询功能
 const handleQuery = () => {
-  queryParams.value.pageNum = 1;
+  if(isStand.value){
+    //多站
+    pageable.value.pageNum = 1;
+    getList();
+  }else {
+    //单站
+    if(!pageable.value.as_code_list){
+      ElNotification({
+        title: "错误",
+        message: "请选择台站",
+        type: "error",
+        duration: 3000
+      });
+      return
+    }
+    pageable.value.pageNum = 1;
+    getList();
+  }
+
+
 };
 
-//搜索功能
+//重置功能
 const resetQuery = () => {
-  queryParams.value.pageNum = 1;
+  pageable.value = {
+    time_space:60,
+    begin_time: undefined,
+    end_time: undefined,
+    data_type: false,
+    time_order: 1,
+    as_code_list:[],
+    state_list: [
+      "STATE_PART",
+      "STATE_SENSOR",
+      "STATE_ARTIFICIAL"
+    ],
+    pageNum: 1,
+    pageSize: 24
+  }
+  getList();
 };
 
 /**
@@ -192,7 +567,8 @@ const resetQuery = () => {
  * @return void
  * */
 const handleSizeChange = (val: number) => {
-  console.log(val);
+  pageable.value.pageSize = val
+  getList();
 };
 
 /**
@@ -201,34 +577,33 @@ const handleSizeChange = (val: number) => {
  * @return void
  * */
 const handleCurrentChange = (val: number) => {
-  console.log(val);
+  pageable.value.pageNum = val
+  getList();
 };
 
-const processTableData = ref([
-  {
-    id: "681913747276782417",
-    a: "固定站2",
-    b: "M1001",
-    d: "2024-09-02",
-    e: "0.2",
-    f: "150",
-    g: "不确定",
-    h: "",
-    i: "",
-    j: "不确定"
-  }
-]);
-
 // 表格配置项
-const columns = reactive<ColumnProps[]>([
-  { prop: "a", label: "站名" },
-  { prop: "b", label: "站号" },
-  { prop: "d", label: "观测时间",sortable: true },
-  { prop: "e", label: "超声风传感器" },
-  { prop: "f", label: "气温传感器" },
-  { prop: "g", label: "湿度传感器" },
-  { prop: "h", label: "气压传感器" },
-  { prop: "i", label: "称重式降水传感器" },
-  { prop: "j", label: "翻斗雨量传感器" }
-]);
+let columns = reactive<ColumnProps[]>([]);
+
+
+function  timeDefault() {
+  var date = new Date();
+  var s1 = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + (date.getDate());
+  return s1;
+}
+
+function formatDate(timestamp) {
+  const date = new Date(timestamp * 1000); // 将时间戳转换为毫秒
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, '0');
+  const day = String(date.getDate()).padStart(2, '0');
+  const hours = String(date.getHours()).padStart(2, '0');
+  const minutes = String(date.getMinutes()).padStart(2, '0');
+  return `${year}-${month}-${day} ${hours}:${minutes}`;
+}
 </script>
+
+<style>
+.tpc .el-time-spinner__wrapper {
+  width:100% !important;
+}
+</style>

+ 12 - 2
src/views/query/queryObservationData/index.vue

@@ -419,8 +419,18 @@ const handleQuery = () => {
 
 //重置功能
 const resetQuery = () => {
-  pageable.value.pageNum = 1;
-  pageable.value.as_code_list = undefined
+  pageable.value = {
+    data_type: false,
+    time_order: 0,
+    time_space:60,
+    begin_time:undefined,
+    end_time: undefined,
+    as_code_list:[],
+    data_items:[],
+    pageNum: 1,
+    pageSize: 20,
+    total: 0
+  }
   getList();
 };