Browse Source

Merge branch 'master' of http://git.wdklian.com/allen/ncs_ui

# Conflicts:
#	src/views/ncs-device/watch_location.vue
vothin 3 years ago
parent
commit
5e1cc33823

+ 1 - 2
src/views/ncs-chars/index.vue

@@ -503,7 +503,6 @@ export default {
       let secondTime = endTime//将传入的秒的值转化为Number
       let min = 0// 初始化分
       let h =0// 初始化小时
-      let result=''
       if(secondTime>60){//如果秒数大于60,将秒数转换成整数
         min=parseInt(secondTime/60)//获取分钟,除以60取整数,得到整数分钟
         secondTime=parseInt(secondTime%60)//获取秒数,秒数取佘,得到整数秒数
@@ -515,7 +514,7 @@ export default {
           return min +'分' + secondTime + '秒'
         }
       } else {
-        return secondTime + '秒'
+        return secondTime + '秒'``
       }
     }
   }

+ 293 - 0
src/views/ncs-device/watch_location(空间节点版).vue

@@ -0,0 +1,293 @@
+<template>
+  <div class="app-container">
+    <div class="block">
+      <el-date-picker
+          v-model="queryTime"
+          type="date"
+          placeholder="选择日期进行搜索"
+          value-format="yyyy-MM-dd">
+      </el-date-picker>
+      <el-button type="primary" plain style="margin-left: 30px" v-loading.fullscreen.lock="fullscreenLoading" @click="getNewLocation">获取最新位置</el-button>
+      <el-tag v-if="myTitle" style="margin-left: 20px;" type="warning">{{ myTitle }}</el-tag>
+    </div>
+    <div>
+      <el-row>
+        <el-col :span="6" v-for="(item, index) in frames" :key="index">
+          <el-card :id="'myFrame'+item.id" shadow="never" class="myClass">
+            <div>
+              <svg-icon :id="'myIcon' + item.id" icon-class="footmark" class-name="footmark" style="font-size: 30px;display: none" />
+              <svg-icon icon-class="sickroom" style="font-size: 40px;padding-right: 20px" />{{ item.full_name }}
+            </div>
+            <div style="float:right">
+              <span :id="'myText' + item.id" ></span>
+            </div>
+
+          </el-card>
+        </el-col>
+      </el-row>
+    </div>
+    <div v-if="locationList.length > 0" style="margin-top: 20px;">
+      <el-card>
+        <div v-for="(item, index) in locationList" :key="index" class="text item">
+          <i class="el-icon-user-solid"></i> 您于 <el-tag><i class="el-icon-time"></i>{{ formatterCreateTime(item.create_time )}}</el-tag> 在
+          <el-tag type="success"><i class="el-icon-location-outline"></i>{{ item.full_name }}</el-tag>附近
+        </div>
+      </el-card>
+    </div>
+    <!--翻页-->
+    <el-pagination
+        v-if="pageData"
+        slot="pagination"
+        :current-page="pageData.page_no"
+        :page-sizes="[20, 50, 100, 200]"
+        :page-size="pageData.page_size"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="pageData.data_total"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import * as API_DeviceLocation from '@/api/ncs_device_location'
+import { unixToDate } from '@/utils/Foundation'
+import { getListByDeviceId } from '@/api/ncs_hospitalFrame'
+import { DeviceUrl } from '@/utils/domain'
+export default {
+  name: 'Index',
+  props: {
+    deviceId: {
+      type: Number,
+      default: 0
+    },
+    isShow: {
+      type: Boolean,
+      default: false
+    }
+  },
+
+  data: function() {
+    return {
+      frames: [],
+      locationList: [],
+      params: {
+        page_size: 20,
+        page_no: 1,
+        fixedCondition: ' device_id = ' + this.deviceId,
+        sort: 'create_time',
+        dir: 'desc'
+      },
+      tableData: [],
+      pageData: [],
+      deviceList: [],
+      clearList: [],
+      queryTime: null,
+      websock: null,
+      fullscreenLoading: false,
+      myTitle: ''
+    }
+  },
+  watch: {
+    isShow: function () {
+      if (this.isShow) {
+        this.sx()
+      } else {
+        this.websocketclose()
+      }
+    },
+    queryTime: function () {
+      if (this.queryTime) {
+        this.params.query_time = this.queryTime
+      } else {
+        delete this.params.query_time
+      }
+      this.clearStyle()
+      this.API_GetList()
+    }
+  },
+  mounted() {
+    this.API_Frames()
+    this.initWebSocket()
+  },
+  methods: {
+    API_Frames() {
+      const _this = this
+      getListByDeviceId(this.$store.getters.partId).then(res => {
+        _this.frames = res
+        _this.API_GetList()
+      })
+    },
+    API_GetList() {
+      const _this = this
+      API_DeviceLocation.getPage(this.params).then(res => {
+        _this.tableData = [...res.data]
+        _this.pageData = {
+          page_no: res.page_no,
+          page_size: res.page_size,
+          data_total: res.data_total
+        }
+        _this.locationList = []
+        if (_this.tableData.length > 0) {
+          _this.changeStyle()
+        }
+      })
+    },
+    changeStyle() {
+      const _this = this
+      let myId = ''
+      const time = Date.parse(new Date()) / 1000
+      if (time - this.tableData[0].create_time > 60) {
+        _this.myTitle = '当前不在信标范围内'
+      }
+      this.tableData.reverse()
+      for (let i = 0; i< _this.tableData.length; i++) {
+        (function (t, data) {   // 注意这里是形参
+          setTimeout(function () {
+            if (myId) {
+              document.getElementById(myId).style = 'background: #d3dce6'
+            }
+            document.getElementById('myFrame'+data.frame_id).style = 'color: white;background: #3DCB0A'
+            document.getElementById('myIcon'+data.frame_id).style.display='inline'
+            _this.$notify({
+              title: data.full_name,
+              message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+              position: 'bottom-right',
+              showClose: false,
+              duration: 2500
+            })
+            myId = 'myFrame'+data.frame_id
+            _this.locationList.unshift(data)
+            let text = document.getElementById('myText'+data.frame_id)
+            if (text.innerText) {
+              text.innerText = text.innerText + '、'+ (i+1)
+            } else {
+              text.innerText = (i+1)
+            }
+            // document.getElementById('myText'+data.frame_id).innerText = i+1+1
+            if (_this.clearList.find(p => p === data.frame_id) == null) {
+              _this.clearList.push(data.frame_id)
+            }
+
+          }, 250 * t);	// 还是每秒执行一次,不是累加的
+        })(i, _this.tableData[i])   // 注意这里是实参,这里把要用的参数传进去
+      }
+    },
+    sx() {
+      this.queryTime = null
+      this.params ={
+        page_size: 20,
+        page_no: 1,
+        fixedCondition: ' device_id = ' + this.deviceId,
+        sort: 'create_time',
+        dir: 'desc'
+      }
+      this.myTitle = ''
+      this.frames = []
+      this.locationList = []
+      this.initWebSocket()
+      this.API_Frames()
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.clearStyle()
+      this.API_GetList()
+    },
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.clearStyle()
+      this.API_GetList()
+    },
+    clearStyle() {
+      this.clearList.forEach(item => {
+        document.getElementById('myFrame'+item).style = ''
+        document.getElementById('myIcon'+item).style.display='none'
+        document.getElementById('myText'+item).innerText = ''
+      })
+    },
+    formatterCreateTime(data) {
+      return unixToDate(data)
+    },
+    getNewLocation() {
+      this.fullscreenLoading = true
+      const _this = this
+      setTimeout(() => {
+        if (_this.fullscreenLoading)
+          _this.fullscreenLoading = false
+      }, 30000)
+      this.websock.send(this.deviceId)
+    },
+    initWebSocket: function() {
+      const stockbase = DeviceUrl.replace('http', 'ws')
+      this.websock = new WebSocket(stockbase + '/web-socket/device_location/' + this.deviceId)
+      this.websock.onopen = this.websocketonopen
+      this.websock.onerror = this.websocketonerror
+      this.websock.onmessage = this.websocketonmessage
+      this.websock.onclose = this.websocketclose
+    },
+    websocketonopen: function() {
+      console.log('WebSocket连接成功')
+    },
+    websocketonerror: function(e) {
+      console.log('WebSocket连接发生错误')
+    },
+    websocketonmessage: function(e) {
+      console.log('收到消息:', e.data)
+      const data = JSON.parse(e.data)
+      if (data.frame_id) {
+        this.myTitle = ''
+        this.fullscreenLoading = false
+        let size = this.tableData.length
+        if (size > 0) {
+          document.getElementById('myFrame'+this.tableData[(size - 1)].frame_id).style = 'background: #d3dce6'
+        }
+        document.getElementById('myFrame'+data.frame_id).style = 'color: white;background: #3DCB0A'
+        document.getElementById('myIcon'+data.frame_id).style.display='inline'
+        this.$notify({
+          title: data.full_name,
+          message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+          showClose: false,
+          offset: 100
+        })
+        let text = document.getElementById('myText'+data.frame_id)
+        if (text.innerText) {
+          text.innerText = text.innerText + '、'+ (size+1)
+        } else {
+          text.innerText = (i+1)
+        }
+        this.tableData.push(data)
+        this.locationList.unshift(data)
+        if (this.clearList.find(p => p === data.frame_id) == null) {
+          this.clearList.push(data.frame_id)
+        }
+      }
+
+    },
+    websocketclose: function(e) {
+      console.log('socket连接关闭connection closed (' + e + ')')
+    }
+  }
+}
+</script>
+
+<style scoped type="text/scss">
+.el-row {
+  margin-bottom: 20px;
+&:last-child {
+   margin-bottom: 0;
+ }
+}
+.el-col {
+  border-radius: 30px;
+  padding: 20px;
+}
+.text {
+  font-size: 14px;
+}
+
+.item {
+  margin-bottom: 18px;
+}
+</style>

+ 26 - 24
src/views/ncs-device/watch_location.vue

@@ -12,11 +12,11 @@
     </div>
     <div>
       <el-row>
-        <el-col :span="6" v-for="(item, index) in frames" :key="index">
+        <el-col :span="6" v-for="(item, index) in beaconDevices" :key="index">
           <el-card :id="'myFrame'+item.id" shadow="never" class="myClass">
             <div>
               <svg-icon :id="'myIcon' + item.id" icon-class="footmark" class-name="footmark" style="font-size: 30px;display: none" />
-              <svg-icon icon-class="sickroom" style="font-size: 40px;padding-right: 20px" />{{ item.full_name }}
+              <svg-icon icon-class="sickroom" style="font-size: 40px;padding-right: 20px" />{{ item.name }}
             </div>
             <div style="float:right">
               <span :id="'myText' + item.id" ></span>
@@ -55,6 +55,8 @@ import { unixToDate } from '@/utils/Foundation'
 import { getListByDeviceId } from '@/api/ncs_hospitalFrame'
 // import {DeviceUrl} from "@/utils/domain"
 const DeviceUrl = domain.DeviceUrl
+import { getDeviceByType } from '@/api/ncs_device'
+import { DEVICE_TYPE } from '@/utils/enum/DeviceTypeEnum'
 export default {
   name: 'Index',
   props: {
@@ -70,7 +72,7 @@ export default {
 
   data: function() {
     return {
-      frames: [],
+      beaconDevices: [],
       locationList: [],
       params: {
         page_size: 20,
@@ -108,14 +110,14 @@ export default {
     }
   },
   mounted() {
-    this.API_Frames()
+    this.API_Devices()
     this.initWebSocket()
   },
   methods: {
-    API_Frames() {
+    API_Devices() {
       const _this = this
-      getListByDeviceId(this.$store.getters.partId).then(res => {
-        _this.frames = res
+      getDeviceByType(this.$store.getters.partId, DEVICE_TYPE.BEACON).then(res => {
+        _this.beaconDevices = res
         _this.API_GetList()
       })
     },
@@ -128,6 +130,7 @@ export default {
           page_size: res.page_size,
           data_total: res.data_total
         }
+        _this.locationList = []
         if (_this.tableData.length > 0) {
           _this.changeStyle()
         }
@@ -135,7 +138,6 @@ export default {
     },
     changeStyle() {
       const _this = this
-      this.locationList = []
       let myId = ''
       const time = Date.parse(new Date()) / 1000
       if (time - this.tableData[0].create_time > 60) {
@@ -148,8 +150,8 @@ export default {
             if (myId) {
               document.getElementById(myId).style = 'background: #d3dce6'
             }
-            document.getElementById('myFrame'+data.frame_id).style = 'color: white;background: #3DCB0A'
-            document.getElementById('myIcon'+data.frame_id).style.display='inline'
+            document.getElementById('myFrame'+data.beacon_device_id).style = 'color: white;background: #3DCB0A'
+            document.getElementById('myIcon'+data.beacon_device_id).style.display='inline'
             _this.$notify({
               title: data.full_name,
               message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
@@ -157,17 +159,17 @@ export default {
               showClose: false,
               duration: 2500
             })
-            myId = 'myFrame'+data.frame_id
+            myId = 'myFrame'+data.beacon_device_id
             _this.locationList.unshift(data)
-            let text = document.getElementById('myText'+data.frame_id)
+            let text = document.getElementById('myText'+data.beacon_device_id)
             if (text.innerText) {
               text.innerText = text.innerText + '、'+ (i+1)
             } else {
               text.innerText = (i+1)
             }
-            // document.getElementById('myText'+data.frame_id).innerText = i+1+1
-            if (_this.clearList.find(p => p === data.frame_id) == null) {
-              _this.clearList.push(data.frame_id)
+            // document.getElementById('myText'+data.beacon_device_id).innerText = i+1+1
+            if (_this.clearList.find(p => p === data.beacon_device_id) == null) {
+              _this.clearList.push(data.beacon_device_id)
             }
 
           }, 250 * t);	// 还是每秒执行一次,不是累加的
@@ -184,10 +186,10 @@ export default {
         dir: 'desc'
       }
       this.myTitle = ''
-      this.frames = []
+      this.beaconDevices = []
       this.locationList = []
       this.initWebSocket()
-      this.API_Frames()
+      this.API_Devices()
     },
     /** 分页大小发生改变 */
     handlePageSizeChange(size) {
@@ -237,22 +239,22 @@ export default {
     websocketonmessage: function(e) {
       console.log('收到消息:', e.data)
       const data = JSON.parse(e.data)
-      if (data.frame_id) {
+      if (data.beacon_device_id) {
         this.myTitle = ''
         this.fullscreenLoading = false
         let size = this.tableData.length
         if (size > 0) {
-          document.getElementById('myFrame'+this.tableData[(size - 1)].frame_id).style = 'background: #d3dce6'
+          document.getElementById('myFrame'+this.tableData[(size - 1)].beacon_device_id).style = 'background: #d3dce6'
         }
-        document.getElementById('myFrame'+data.frame_id).style = 'color: white;background: #3DCB0A'
-        document.getElementById('myIcon'+data.frame_id).style.display='inline'
+        document.getElementById('myFrame'+data.beacon_device_id).style = 'color: white;background: #3DCB0A'
+        document.getElementById('myIcon'+data.beacon_device_id).style.display='inline'
         this.$notify({
           title: data.full_name,
           message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
           showClose: false,
           offset: 100
         })
-        let text = document.getElementById('myText'+data.frame_id)
+        let text = document.getElementById('myText'+data.beacon_device_id)
         if (text.innerText) {
           text.innerText = text.innerText + '、'+ (size+1)
         } else {
@@ -260,8 +262,8 @@ export default {
         }
         this.tableData.push(data)
         this.locationList.unshift(data)
-        if (this.clearList.find(p => p === data.frame_id) == null) {
-          this.clearList.push(data.frame_id)
+        if (this.clearList.find(p => p === data.beacon_device_id) == null) {
+          this.clearList.push(data.beacon_device_id)
         }
       }
 

+ 1 - 1
src/views/ncs-remark/index.vue

@@ -45,7 +45,7 @@
                 @current-change="handlePageCurrentChange"
         />
 
-        <el-dialog title="添加用户备注" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
+        <el-dialog title="添加便签" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
             <el-form :rules="rules" ref="editForm" label-width="140px">
                 <el-form-item label="内容" prop="content">
                     <el-input