Просмотр исходного кода

1、485增加自定义医生、护士标题、及显示;
2、信标定位相关开发

wennn 3 лет назад
Родитель
Сommit
1a66aad75c

+ 10 - 0
src/api/ncs_device_location.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+export function getPage(params) {
+  return request({
+    url: `/ncs/device_location/page`,
+    method: 'POST',
+    loading: true,
+    data: params
+  })
+}

+ 8 - 0
src/api/ncs_hospitalFrame.js

@@ -141,4 +141,12 @@ export function qingkong(id) {
     method: 'DELETE',
     loading: true
   })
+}
+// 查询设备(信标)所在的空间
+export function getListByDeviceId(id) {
+  return request({
+    url: `/ncs/frame/getListByDeviceId/${id}`,
+    method: 'GET',
+    loading: false
+  })
 }

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
src/icons/svg/footmark.svg


+ 32 - 2
src/views/ncs-device/nurse_watch.vue

@@ -58,6 +58,11 @@
         </el-tab-pane>
       </el-tabs>
     </el-dialog>
+
+<!--    位置信息-->
+    <el-dialog title="位置信息" :visible.sync="locationShow" width="70%">
+      <watch-location :device-id="deviceId" :is-show="locationShow"></watch-location>
+    </el-dialog>
   </div>
 </template>
 
@@ -70,10 +75,11 @@ import * as clerk_API from '@/api/ncs_clerk'
 import ButtonCellRender from '@/components/AgGridCellRender/ButtonCellRender'
 import RadioFilter from '@/components/AgGridCustomFilter/RadioFilter'
 import nurseWatchFrame from '@/views/hospitalFrame/nurse_watch_frame'
+import watchLocation from '@/views/ncs-device/watch_location'
 
 export default {
   name: 'Index',
-  components: { ButtonCellRender, RadioFilter, nurseWatchFrame },
+  components: { ButtonCellRender, RadioFilter, nurseWatchFrame, watchLocation },
   data: function() {
     return {
       /** 表格数据 */
@@ -119,7 +125,9 @@ export default {
       role_name: '',
       activeName: 'huan-ban',
       member_id: null,
-      onlineDevice: []
+      onlineDevice: [],
+      locationShow: false,
+      deviceId: null
     }
   },
   computed: {
@@ -212,6 +220,24 @@ export default {
         minWidth: 100,
         resizable: false,
         sortable: false
+      },
+      {
+        headerName: '位置', field: 'shop_id',
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: param => {
+          return {
+            onClick: this.getLocation,
+            label: '位置',
+            buttonType: 'warning',
+            buttonSize: 'mini'
+          }
+        },
+        filter: false,
+        pinned: 'right',
+        lockPinned: true,
+        minWidth: 100,
+        resizable: false,
+        sortable: false
       }
       // {
       //   headerName: '管理', field: 'shop_id',
@@ -558,6 +584,10 @@ export default {
       } else {
         return '<span style="color:gray;">离线</span>'
       }
+    },
+    getLocation(row) {
+      this.deviceId = row.id
+      this.locationShow = true
     }
   }
 }

+ 233 - 0
src/views/ncs-device/watch_location.vue

@@ -0,0 +1,233 @@
+<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" @click="getNewLocation">获取最新位置</el-button>
+    </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">
+            <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 }}
+          </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'
+      },
+      tableData: [],
+      pageData: [],
+      deviceList: [],
+      clearList: [],
+      queryTime: null,
+      websock: null
+    }
+  },
+  watch: {
+    isShow: function () {
+      if (this.isShow) {
+        this.sx()
+      } else {
+        console.log('我关闭了。。。')
+        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.changeStyle()
+      })
+    },
+    changeStyle() {
+      const _this = this
+      this.locationList = []
+      let myId = ''
+      for (let i = 0; i< _this.tableData.length; i++) {
+        (function (t, data) {   // 注意这里是形参
+          setTimeout(function () {
+            if (myId) {
+              document.getElementById(myId).style = 'background: #d3dce6'
+            }
+            // console.log(document.getElementById('myFrame'+data.frame_id))
+            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: 1000
+            })
+            myId = 'myFrame'+data.frame_id
+            _this.locationList.unshift(data)
+            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'
+      }
+      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'
+      })
+    },
+    formatterCreateTime(data) {
+      return unixToDate(data)
+    },
+    getNewLocation() {
+      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连接成功')
+      this.$message.success('连接成功')
+    },
+    websocketonerror: function(e) {
+      console.log('WebSocket连接发生错误')
+    },
+    websocketonmessage: function(e) {
+      console.log('收到消息:', e.data)
+    },
+    websocketclose: function(e) {
+      console.log('socket连接关闭connection closed (' + e.code + ')')
+    }
+  }
+}
+</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>

+ 35 - 1
src/views/ncs-orginazition/components/partInfoEdit.vue

@@ -299,6 +299,33 @@
               </el-radio-group>
             </el-form-item>
           </el-row>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="模拟分机医生标题">
+                <el-input v-model="formmodel.doctor_title" label="模拟分机医生标题" :maxlength="15" >
+                  <el-select v-model="formmodel.doctor_valid" slot="prepend" placeholder="请选择">
+                    <el-option label="显示" :value="1"></el-option>
+                    <el-option label="不显示" :value="0"></el-option>
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="模拟分机护士标题">
+                <el-input v-model="formmodel.nurse_title" label="模拟分机医生标题" :maxlength="15" >
+                  <el-select v-model="formmodel.nurse_valid" slot="prepend" placeholder="请选择">
+                    <el-option label="显示" :value="1" />
+                    <el-option label="不显示" :value="0" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="腕表上传定位间隔">
+                <el-input-number v-model="formmodel.up_seconds" :min="1" :max="300" label="腕表上传定位间隔" />
+              </el-form-item>
+            </el-col>
+          </el-row>
 
         </fieldset>
 
@@ -402,7 +429,11 @@ export default {
               this.nightStart = new Date('2020-11-11 ' + this.formmodel.night_start)
             }
           }
-
+          this.formmodel.doctor_title = res.doctor_title
+          this.formmodel.doctor_valid = res.doctor_valid
+          this.formmodel.nurse_title = res.nurse_title
+          this.formmodel.nurse_valid = res.nurse_valid
+          this.formmodel.up_seconds = res.up_seconds
           // // 处理护理等级颜色
           // this.$nextTick(() => {
           //   const specialNurseCfg = this.nurseLevel0Config.find(p => p.id === this.formmodel.part_special_care)
@@ -504,4 +535,7 @@ fieldset {
 .margin-top-sm {
   margin-top: 20px
 }
+.el-input .el-select {
+  width: 100px;
+}
 </style>