From 50bf2b134dff8f56d72e4ffe934540d8b1b2f519 Mon Sep 17 00:00:00 2001
From: quanyawei <401863037@qq.com>
Date: Fri, 01 Mar 2024 09:57:28 +0800
Subject: [PATCH] fix:手持设备

---
 src/components/formTypeComponets/dialog/index.vue             |   91 ++++++++
 src/components/formTypeComponets/radioGroupCompones/index.vue |   79 +++++++
 src/views/hand/index.vue                                      |  439 +++++++++++++++++++++++++++++++++++++++
 src/router/dynamicRouter.js                                   |    8 
 4 files changed, 617 insertions(+), 0 deletions(-)

diff --git a/src/components/formTypeComponets/dialog/index.vue b/src/components/formTypeComponets/dialog/index.vue
new file mode 100644
index 0000000..b298c4b
--- /dev/null
+++ b/src/components/formTypeComponets/dialog/index.vue
@@ -0,0 +1,91 @@
+<template>
+  <el-dialog
+    :title="title"
+    top="10vh"
+    center
+    :visible.sync="visible"
+    :width="width"
+    :destroy-on-close="true"
+    @close="close()"
+  >
+    <div>
+      <slot
+        class="body"
+        name="body"
+      >
+        ������������body
+      </slot>
+    </div>
+    <div
+      slot="footer"
+      class="dialog-footer"
+    >
+      <el-button
+        v-if="isShowCloseBut"
+        @click="close()"
+      >
+        ������
+      </el-button>
+      <el-button
+        v-if="isShowSumbitBut"
+        type="primary"
+        @click="close()"
+      >
+        ��� ���
+      </el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    width: {
+      type: String,
+      default: '30%'
+    },
+    title: {
+      type: String,
+      default: 'title'
+    },
+    isShowCloseBut: {
+      type: Boolean,
+      default: true
+    },
+    isShowSumbitBut: {
+      type: Boolean,
+      default: true
+    },
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      visible: false
+    }
+  },
+  computed: {},
+  watch: {},
+  created () {
+    console.log('this.dialogVisible', this.dialogVisible)
+    this.visible = this.dialogVisible
+  },
+  mounted () {
+
+  },
+  methods: {
+    close () {
+      this.visible = false
+      this.$emit('update:dialogVisible', false)
+    },
+    handleClose () {
+
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+</style>
diff --git a/src/components/formTypeComponets/radioGroupCompones/index.vue b/src/components/formTypeComponets/radioGroupCompones/index.vue
new file mode 100644
index 0000000..3928cec
--- /dev/null
+++ b/src/components/formTypeComponets/radioGroupCompones/index.vue
@@ -0,0 +1,79 @@
+<template>
+  <el-radio-group
+    v-model="radio"
+    :size="size"
+    @input="changeRadio"
+  >
+    <el-radio-button
+      v-for="(item,index) in radioData"
+      :key="index"
+      :label="item.label"
+    />
+  </el-radio-group>
+</template>
+
+<script>
+import dayjs from 'dayjs'
+import _ from 'lodash'
+export default {
+  components: {},
+  props: {
+    type: {
+      type: String,
+      default: 'timeDate'
+    },
+    radioSelect: {
+      type: String,
+      default: ''
+    },
+    radioData: {
+      type: Array,
+      default: null
+    //   { label: '������', value: 'today', type: 'day', num: '0' },
+    //     { label: '������', value: 'yesterday', type: 'day', num: '1', },
+    //     { label: '���3���', value: 'week', type: 'day', num: '3', },
+    //     { label: '���1������', value: 'month', type: 'month', num: '1', },
+    //     { label: '���3������', value: 'threeMonth', type: 'month', num: '3', },
+    },
+    size: {
+      type: String,
+      default: 'medium'
+    }
+  },
+  data () {
+    return {
+      radio: ''
+    }
+  },
+  computed: {},
+  watch: {
+    radioSelect (newVal) {
+      console.log('newval', newVal)
+      this.radio = newVal
+    }
+  },
+  created () {
+    this.radio = this.radioSelect
+    this.changeRadio(this.radio)
+  },
+  mounted () {
+
+  },
+  methods: {
+    changeRadio (e) {
+      let data = _.find(this.radioData, ['label', e])
+      if (this.type === 'timeDate') {
+        const endTime = dayjs().format('YYYY-MM-DD HH:mm')
+        const startTime = data.num === '0' ? dayjs().startOf('day').format('YYYY-MM-DD HH:mm') : dayjs().subtract(data.num, data.type).format('YYYY-MM-DD HH:mm')
+        data.startTime = startTime
+        data.endTime = endTime
+      }
+      console.log('data', data)
+      this.$emit('changeRadio', data)
+    }
+  }
+}
+</script>
+<style scoped>
+
+</style>
diff --git a/src/router/dynamicRouter.js b/src/router/dynamicRouter.js
index 933f131..d794134 100644
--- a/src/router/dynamicRouter.js
+++ b/src/router/dynamicRouter.js
@@ -107,6 +107,12 @@
   component: () => import('@/views/govReport/index'),
   meta: { title: '���������������������������', icon: 'example' }
 }
+const hand = {
+  path: 'report/hand',
+  name: 'hand',
+  component: () => import('@/views/hand/index'),
+  meta: { title: '������������', icon: 'example' }
+}
 // ������������������������
 const airQualityReportDisplay = {
   path: 'report/airQualityReportDisplay',
@@ -240,6 +246,7 @@
   showMpData: showMpData,
   staffManagement: staffManagement,
   showGovHourData: showGovHourData,
+  hand: hand,
   cityAirRank: cityAirRank,
   levelStatistic: levelStatistic,
   onlineRate: onlineRate,
@@ -276,6 +283,7 @@
 
 // ������������������
 export function routerMenus() {
+  console.log('user.menus', JSON.parse(store.state.user.menus))
   const routersMenu = JSON.parse(store.state.user.menus)
   // ��������������������������������� ���������������������������
   console.log('routersMenu', routersMenu)
diff --git a/src/views/hand/index.vue b/src/views/hand/index.vue
new file mode 100644
index 0000000..383e697
--- /dev/null
+++ b/src/views/hand/index.vue
@@ -0,0 +1,439 @@
+<template>
+  <div class="contenet">
+    <div class="searchBox">
+      <el-form
+        :inline="true"
+        :model="formInline"
+        class="demo-form-inline"
+      >
+        <div>
+          <el-form-item label="������������:">
+            <el-select
+              v-model="formInline.mac"
+              size="medium"
+              placeholder="������������"
+            >
+              <el-option
+                v-for="item in handList"
+                :key="item.id"
+                :label="item.mac"
+                :value="item.mac"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="������������:">
+            <el-input
+              v-model="formInline.name"
+              size="medium"
+              placeholder="������������"
+            />
+          </el-form-item>
+          <el-form-item>
+            <radioGroupComponent
+              :radio-data="radioGrouplist"
+              :radio-select="radio"
+              @changeRadio="changeRadio"
+            />
+          </el-form-item>
+          <el-form-item label="������������:">
+            <el-date-picker
+              v-model="value"
+              size="medium"
+              type="datetimerange"
+              start-placeholder="������������"
+              end-placeholder="������������"
+              :default-time="['00:00:00']"
+              @change="sendPicker"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              size="medium"
+              @click="onSubmit"
+            >
+              ������
+            </el-button>
+          </el-form-item>
+        </div>
+      </el-form>
+    </div>
+    <div>
+      <el-table
+        :data="tableData"
+        border
+        size="mini"
+        max-height="680"
+        style="width: 100%"
+        :header-cell-style="{
+          color: '#101111', fontSize: '16px'
+        }"
+        :cell-style="{ color: '#101111', fontSize: '16px'}"
+      >
+        <el-table-column
+          type="index"
+          label="������"
+          width="60px"
+          align="center"
+        />
+        <el-table-column
+          prop="mac"
+          align="center"
+          label="���������"
+          width="180"
+        />
+        <el-table-column
+          prop="name"
+          align="center"
+          width="200px"
+          label="������������"
+        />
+        <el-table-column
+          prop="address"
+          align="center"
+          label="������������"
+        />
+        <el-table-column
+          prop="startTime"
+          align="center"
+          width="200px"
+          label="������������"
+        />
+        <el-table-column
+          prop="endTime"
+          align="center"
+          label="������������"
+          width="200px"
+        />
+        <el-table-column
+          width="60px"
+          align="center"
+          label="������"
+        >
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              size="medium"
+              @click="showDetail(scope.row)"
+            >
+              ������
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="pagina">
+        <el-pagination
+          background
+          :current-page="pagination.currentPage"
+          :page-sizes="pagination.pageSizes"
+          :page-size="pagination.pageSize"
+          :total="pagination.totalCount"
+          layout="total, sizes, prev, pager, next, jumper"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </div>
+    <div>
+      <diaLog
+        v-if="isVisible"
+        :dialog-visible.sync="isVisible"
+        :title="`������������`"
+        :width="`90%`"
+        :is-show-sumbit-but="false"
+      >
+        <template #body>
+          <div>
+            <div class="devaiceDetailTitle">
+              <p>���������������{{ selectRow.name }}</p>
+              <p>���������������{{ selectRow.address }}</p>
+              <p>������������������{{ selectRow.longitude }},{{ selectRow.latitude }}</p>
+            </div>
+            <div class="typeBox">
+              <div class="tapChart">
+                <p
+                  :class="{pClick: tapName === 'hour'}"
+                  @click="changeTap('hour')"
+                >
+                  ������
+                </p>
+                <p
+                  :class="{pClick: tapName === 'minutely'}"
+                  @click="changeTap('minutely')"
+                >
+                  5������
+                </p>
+              </div>
+              <div>
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="handleExport"
+                >
+                  ������
+                </el-button>
+              </div>
+            </div>
+            <div>
+              <el-table
+                :data="rowDetailDate"
+                border
+                size="mini"
+                max-height="480"
+                style="width: 100%"
+                :header-cell-style="{
+                  color: '#101111', fontSize: '16px'
+                }"
+                :cell-style="{ color: '#101111', fontSize: '16px',padding: '10px 0'}"
+              >
+                <el-table-column
+                  type="index"
+                  label="������"
+                  width="60px"
+                  align="center"
+                />
+                <el-table-column
+                  prop="time"
+                  align="center"
+                  label="������"
+                  width="180"
+                >
+                  <template slot-scope="scope">
+                    {{ scope.row.time | timeFormat }}
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  v-for="(item,index) in tableColumnData"
+                  :key="index"
+                  :prop="item.prop"
+                  align="center"
+                  :label="item.label + item.unit"
+                />
+              </el-table>
+            </div>
+          </div>
+        </template>
+      </diaLog>
+    </div>
+  </div>
+</template>
+
+<script>
+import dayjs from 'dayjs'
+import radioGroupComponent from '@/components/formTypeComponets/radioGroupCompones/index.vue'
+import diaLog from '@/components/formTypeComponets/dialog/index.vue'
+export default {
+  components: {
+    radioGroupComponent,
+    diaLog
+  },
+  filters: {
+    timeFormat (time) {
+      return dayjs(time).format('YYYY-MM-DD HH:mm:ss')
+    }
+  },
+  data () {
+    return {
+      formInline: {
+        mac: '',
+        name: '',
+        startTime: '',
+        endTime: ''
+      },
+      tableColumnData: [
+        { prop: 'a34004', label: 'PM2.5', unit: 'ug/m��' },
+        { prop: 'a34002', label: 'PM10', unit: 'ug/m��' },
+        { prop: 'a21004', label: '���������������', unit: 'ug/m��' },
+        { prop: 'a21026', label: '������������', unit: 'ug/m��' },
+        { prop: 'a21005', label: '������������', unit: 'mg/m��' },
+        { prop: 'a01006', label: '������', unit: 'hpa' },
+        { prop: 'a01001', label: '������', unit: '���' },
+        { prop: 'a01002', label: '������', unit: '%' },
+        { prop: 'a99054', label: 'TVOC', unit: 'ug/m��' },
+        { prop: 'a31001', label: '������', unit: 'mg/m��' },
+        { prop: 'a21028', label: '���������', unit: 'ppm' },
+        { prop: 'a21001', label: '������', unit: 'ug/m��' },
+      ],
+      handList: [],
+      radio: '������',
+      tapName: 'hour',
+      value: '',
+      radioGrouplist: [
+        { label: '������', value: 'today', type: 'day', num: '0' },
+        { label: '������', value: 'yesterday', type: 'day', num: '1', },
+        { label: '���3���', value: 'week', type: 'day', num: '3', },
+        { label: '���1������', value: 'month', type: 'month', num: '1', },
+        { label: '���3������', value: 'threeMonth', type: 'month', num: '3', },
+      ],
+      tableData: [],
+      rowDetailDate: [],
+      pagination: {
+        currentPage: 1,
+        // ������������������������������������������(���������������������������)
+        totalCount: 0,
+        // ������������������������������
+        pageSizes: [10, 30, 60, 100],
+        // ������������������������������������������
+        pageSize: 10
+      },
+      isVisible: false,
+      selectRow: {}
+    }
+  },
+  created () {
+    this.$request({
+      url: '/hand/check',
+      method: 'get'
+    }).then(res => {
+      if (res.code === 0) {
+        this.handList = res.data
+      } else {
+        this.$message.error(res.message)
+      }
+    })
+  },
+  methods: {
+    handleExport () {
+      this.$request({
+        url: 'hand/unitExel',
+        method: 'get',
+        responseType: 'blob',
+        params: {
+          mac: this.selectRow.mac,
+          startTime: this.selectRow.startTime,
+          endTime: this.selectRow.endTime,
+          type: this.tapName
+        }
+      }).then(res => {
+        this.getOutExcel('������������������.xlsx', res)
+      })
+    },
+    getOutExcel (fileName, res) {
+      const blob = new Blob([res], { type: 'application/x-xls' })
+      if (window.navigator.msSaveOrOpenBlob) {
+        // ������ IE & EDGE
+        navigator.msSaveBlob(blob, fileName)
+      } else {
+        var link = document.createElement('a')
+        // ������������������������URL������
+        const url = window.URL || window.webkitURL || window.moxURL
+        // ������������������
+        link.href = url.createObjectURL(blob)
+        // ������������������
+        link.download = fileName
+        // ������������������
+        link.click()
+        // ������������������������
+        url.revokeObjectURL(link.href)
+      }
+    },
+    changeRadio (e) {
+      this.formInline.startTime = e.startTime
+      this.formInline.endTime = e.endTime
+      this.radio = e.label
+      this.value = ''
+    },
+    sendPicker (e) {
+      this.radio = ''
+      console.log(' this.radio', this.radio)
+      this.formInline.startTime = dayjs(e[0]).format('YYYY-MM-DD HH:mm:ss')
+      this.formInline.endTime = dayjs(e[1]).format('YYYY-MM-DD HH:mm:ss')
+    },
+    showDetail (row) {
+      this.selectRow = row
+      this.tapName = 'hour'
+      console.log('row', row)
+      this.changeTimeType()
+    },
+    changeTimeType () {
+      this.$request({
+        url: '/hand/details',
+        method: 'get',
+        params: {
+          mac: this.selectRow.mac,
+          startTime: this.selectRow.startTime,
+          endTime: this.selectRow.endTime,
+          type: this.tapName
+        }
+      }).then(res => {
+        if (res.code === 0) {
+          console.log('res', res)
+          this.isVisible = true
+          this.rowDetailDate = res.data
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    onSubmit () {
+      this.$request({
+        url: '/hand/page',
+        method: 'post',
+        data: {
+          ...this.formInline,
+          page: this.pagination
+        }
+      }).then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data.list
+          this.pagination.totalCount = res.data.page.totalNum
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    changeTap (val) {
+      this.tapName = val
+      this.changeTimeType()
+    },
+    // ������
+    handleSizeChange (val) {
+      this.pagination.pageSize = val
+      this.pagination.currentPage = 1
+      this.onSubmit()
+    },
+    handleCurrentChange (val) {
+      this.pagination.currentPage = val
+      this.onSubmit()
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.contenet{
+  padding: 10px;
+}
+.searchBox{
+  /deep/.el-form-item{
+    margin-bottom: 10px;
+  }
+}
+.pagina{
+  margin-top: 10px;
+}
+.devaiceDetailTitle{
+  p{
+    display: inline-block;
+    margin-right: 10px;
+    font-size: 18px;
+  }
+}
+.tapChart{
+ p{
+   display: inline-block;
+   margin-right: 10px;
+   cursor: pointer;
+   padding-bottom: 5px;
+ }
+ .pClick{
+  color: #409EFF;
+  border-bottom: #409EFF 3px solid;
+ }
+}
+.typeBox{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+ }
+</style>

--
Gitblit v1.8.0