浏览代码

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

vothin 3 年之前
父节点
当前提交
4a280f7c66

+ 1 - 1
public/domain.js

@@ -2,6 +2,6 @@ const domain = {
   serverUrl: 'http://8.129.220.143:8005',
   DeviceUrl: 'http://8.129.220.143:8006',
   apiMode: 'dev',
-  uiVersion: 1 // 1 医院版,2 月子中心
+  uiVersion: 3 // 1 医院版,2 月子中心版,3养老院
 }
 

+ 40 - 0
src/components/AgGridCellRender/ButtonCellRenderList.vue

@@ -0,0 +1,40 @@
+<template>
+  <div>
+    <el-button-group v-if="show">
+      <el-button v-for="(item, index) in buttonList" :key="index" :type="item.buttonType" :size="item.buttonSize" :disabled="item.disabled" @click="buttonClick(index)">{{ item.label }}</el-button>
+    </el-button-group>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ButtonCellRender',
+  data() {
+    return {
+      buttonType: 'primary',
+      buttonSize: 'mini',
+      label: 'button',
+      disabled: false,
+      show: true,
+      buttonList: []
+    }
+  },
+  beforeMount() {
+  },
+  mounted() {
+    const _this = this
+    _this.buttonList = this.params.list
+  },
+  methods: {
+    buttonClick(index) {
+      if (typeof this.buttonList[index].onClick === 'function') {
+        this.buttonList[index].onClick(this.params.node.data)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 8 - 0
src/layout/components/Sidebar/index.vue

@@ -52,3 +52,11 @@ export default {
   }
 }
 </script>
+<style>
+  .scrollbar-wrapper{
+    height: 95%;
+  }
+  #app .sidebar-container .el-scrollbar{
+    height: 95%;
+  }
+</style>

+ 6 - 5
src/router/index.js

@@ -166,8 +166,8 @@ export const partRoutes = [
     children: [
       {
         path: 'index',
-        component: () => uiVersion === 1 ? import('@/views/customer/patientManagement') : import('@/views/customer/customerManagement'),
-        name: uiVersion === 1 ? 'patientManagement' : 'customerManager',
+        component: () => uiVersion === 1 ? import('@/views/customer/patientManagement') : uiVersion === 2 ? import('@/views/customer/customerManagement') : import('@/views/customer/elderlyCareManagement'),
+        name: uiVersion === 1 ? 'patientManagement' : uiVersion === 2 ? 'customerManager' : 'elderlyCareManager',
         meta: { title: uiVersion === 1 ? '病人管理' : '用户管理', icon: 'el-icon-s-custom', noCache: true }
       }
     ]
@@ -197,7 +197,8 @@ export const partRoutes = [
         name: 'nurse_watch',
         meta: { title: '移动设备', icon: 'el-icon-watch', noCache: true }
       }
-    ]
+    ],
+    hidden: uiVersion !== 2
   },
   {
     path: '/ncs-sos-device',
@@ -224,7 +225,7 @@ export const partRoutes = [
         meta: { title: '对讲频道', icon: 'el-icon-mobile-phone', noCache: true }
       }
     ],
-    hidden: uiVersion === 1
+    hidden: uiVersion !== 2
   },
   {
     path: '/remark',
@@ -352,7 +353,7 @@ export const partRoutes = [
         meta: { title: '看板设置', icon: 'el-icon-data-board', noCache: true }
       }
     ],
-    hidden: uiVersion !== 1
+    hidden: uiVersion === 2
   },
   {
     path: '/ncs-event',

+ 185 - 99
src/views/customer/components/customerManager.vue

@@ -416,6 +416,52 @@
       </el-form>
     </el-dialog>
     <!-- 用户换床-->
+
+    <el-dialog :visible.sync="detailsVisible" :title="formmodel.named + '的信息'" class="customer-dialog">
+      <el-descriptions class="margin-top" :column="2" border  style="padding: 20px">
+<!--        <template slot="extra">-->
+<!--          <el-button type="primary" size="small">操作</el-button>-->
+<!--        </template>-->
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-user"></i>用户姓名</template>{{ formmodel.named }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-user-solid"></i>昵称</template>{{ formmodel.nickname }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-help"></i>入住编号</template>{{ formmodel.card_no }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-smoking"></i>入住床位</template>{{ formmodel.frame_id }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-time"></i>入住日期</template>{{ formatterDate({ data: { in_date: formmodel.in_date, out_date: formmodel.out_date } }) }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-attract"></i>性别</template>{{ formatterSex(formmodel) }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-star-off"></i>年龄</template>{{formmodel.age}}{{formmodel.age_unit}}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-bank-card"></i>证件</template>
+          <span v-if="formmodel.id_no">{{ formmodel.id_type }}  {{ formmodel.id_no }}</span>
+          <span v-else>暂无</span>
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-present"></i>生日</template>{{ unixDateFormatter2({ value: formmodel.birthday}) }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"><i class="el-icon-mobile-phone"></i>手机号码</template>{{ formmodel.mobile }}
+        </el-descriptions-item>
+        <el-descriptions-item :span="2">
+          <template slot="label"><i class="el-icon-office-building"></i>家庭住址</template>{{ formmodel.address }}
+        </el-descriptions-item>
+        <el-descriptions-item :span="3">
+          <template slot="label"><i class="el-icon-document"></i>病况描述</template>{{ formmodel.illness_desc }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-dialog>
   </div>
 
 </template>
@@ -424,6 +470,7 @@
 // 月子中心版,没有责任医生,责任护士,责任护工选项 也没有护理项参数
 import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
 import ButtonCellRender from '@/components/AgGridCellRender/ButtonCellRender'
+import ButtonCellRenderList from '@/components/AgGridCellRender/ButtonCellRenderList'
 import ListFilter from '@/components/AgGridCustomFilter/ListFilter'
 import RadioFilter from '@/components/AgGridCustomFilter/RadioFilter'
 import * as API_Customer from '@/api/ncs_customer'
@@ -436,7 +483,7 @@ import * as API_User from '@/api/user'
 import { FRAME_TYPE } from '@/utils/enum/FrameTypeEnum'
 export default {
   name: 'CustomerManager',
-  components: { ButtonCellRender, ListFilter, RadioFilter },
+  components: { ButtonCellRenderList, ButtonCellRender, ListFilter, RadioFilter },
   filters: {
     unixDateFilter(val) {
       return unixToDate(val)
@@ -591,7 +638,8 @@ export default {
       customerStatusTransfer: [
         { key: '入住中', value: 0, color: 'green' },
         { key: '已离开', value: 1, color: 'red' }
-      ]
+      ],
+      detailsVisible: false
     }
   },
   computed: {
@@ -625,7 +673,14 @@ export default {
     }
   },
   beforeMount() {
+    const _this = this
     this.gridOptions = {
+      onCellDoubleClicked: function (row) {
+        _this.formmodel = {
+          ...row.data
+        }
+        _this.detailsVisible = true
+      }
     }
     this.columnDefs = [
       {
@@ -634,7 +689,7 @@ export default {
         headerCheckboxSelectionFilteredOnly: true,
         checkboxSelection: true,
         sortable: false, filter: false,
-        width: 80,
+        width: 50,
         resizable: false,
         valueGetter: this.hashValueGetter
       },
@@ -655,100 +710,122 @@ export default {
           listData: this.sexTransfer
         },
         cellRenderer: this.sexRenderer },
-
-      { headerName: '生日', field: 'birthday', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
-        comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
-          const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
-          return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
-        }
-      }},
-      { headerName: '年龄', field: 'age', sortable: true, filter: 'agNumberColumnFilter', width: 130
-      },
-      { headerName: '年龄单位', field: 'age_unit', sortable: true, filter: 'agTextColumnFilter', width: 130
+      { headerName: '年龄', field: 'age', sortable: true, filter: 'agNumberColumnFilter', width: 130, valueFormatter: this.sexFormatter
       },
-      { headerName: '入住编号', field: 'card_no', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '身份证件类型', field: 'id_type', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '证件号码', field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', width: 160 },
+      // { headerName: '生日', field: 'birthday', sortable: true, filter: 'agDateColumnFilter', width: 130, valueFormatter: this.unixDateFormatter2, filterParams: {
+      //     comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
+      //       const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
+      //       return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
+      //     }
+      //   }},
+      // { headerName: '入住编号', field: 'card_no', sortable: true, filter: 'agTextColumnFilter' },
+      // { headerName: '身份证件类型', field: 'id_type', sortable: true, filter: 'agTextColumnFilter' },
+      // { headerName: '证件', field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', valueFormatter: this.idNoFormatter },
       { headerName: '手机号码', field: 'mobile', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '家庭住址', field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260 },
+      // { headerName: '家庭住址', field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260 },
 
-      { headerName: '入住时间', field: 'in_date', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
+      { headerName: '入住时间', field: 'in_date', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.formatterDate, filterParams: {
         comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
           const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
           return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
         }
       }},
-      { headerName: '离开时间', field: 'out_date', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
-        comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
-          const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
-          return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
-        }
-      }},
-      { headerName: '编辑', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
-        cellRendererParams: {
-          onClick: this.handleEdit,
-          label: '编辑',
-          buttonType: 'primary',
-          buttonSize: 'mini'
-        },
-        filter: false,
-        pinned: 'right',
-        lockPinned: true,
-        width: 80,
-        resizable: false,
-        sortable: false },
-      { headerName: '退床', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
-        cellRendererParams: param => {
-          return {
-            onClick: this.handleOut,
-            label: '退床',
-            buttonType: 'warning',
-            buttonSize: 'mini',
-            disabled: param.data['status'] !== 0
-          }
-        },
-        filter: false,
-        pinned: 'right',
-        lockPinned: true,
-        width: 80,
-        resizable: false,
-        sortable: false },
-      { headerName: '换床', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
+      // { headerName: '离开时间', field: 'out_date', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
+      //   comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
+      //     const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
+      //     return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
+      //   }
+      // }},
+      { headerName: '操作', field: 'id',
+        cellRendererFramework: 'ButtonCellRenderList',
         cellRendererParams: param => {
           return {
-            onClick: this.handleChangeBed,
-            label: '换床',
-            buttonType: 'success',
-            buttonSize: 'mini',
-            disabled: param.data['status'] !== 0
-          }
+            list: [
+              {
+                onClick: this.handleEdit,
+                label: '编辑',
+                buttonType: 'primary',
+                buttonSize: 'mini'
+              },
+              {
+                onClick: this.handleOut,
+                label: '退床',
+                buttonType: 'warning',
+                buttonSize: 'mini',
+                disabled: param.data['status'] !== 0
+              },
+              {
+                onClick: this.handleChangeBed,
+                label: '换床',
+                buttonType: 'success',
+                buttonSize: 'mini',
+                disabled: param.data['status'] !== 0
+              },{
+                onClick: this.deleteSingle,
+                label: '删除',
+                buttonType: 'danger',
+                buttonSize: 'mini',
+                disabled: param.data['member_name'] === 'superadmin'
+              }
+          ]}
         },
         filter: false,
         pinned: 'right',
         lockPinned: true,
-        width: 80,
+        minWidth: 260,
         resizable: false,
         sortable: false },
-      { headerName: '删除', field: 'shop_id',
-        cellRendererFramework: 'ButtonCellRender',
-        cellRendererParams: param => {
-          return {
-            onClick: this.deleteSingle,
-            label: '删除',
-            buttonType: 'danger',
-            buttonSize: 'mini',
-            disabled: param.data['member_name'] === 'superadmin'
-          }
-        },
-        pinned: 'right',
-        lockPinned: true,
-        width: 80,
-        resizable: false,
-        filter: false,
-        sortable: false }
+      // { headerName: '退床', field: 'id',
+      //   cellRendererFramework: 'ButtonCellRender',
+      //   cellRendererParams: param => {
+      //     return {
+      //       onClick: this.handleOut,
+      //       label: '退床',
+      //       buttonType: 'warning',
+      //       buttonSize: 'mini',
+      //       disabled: param.data['status'] !== 0
+      //     }
+      //   },
+      //   filter: false,
+      //   pinned: 'right',
+      //   lockPinned: true,
+      //   width: 80,
+      //   resizable: false,
+      //   sortable: false },
+      // { headerName: '换床', field: 'id',
+      //   cellRendererFramework: 'ButtonCellRender',
+      //   cellRendererParams: param => {
+      //     return {
+      //       onClick: this.handleChangeBed,
+      //       label: '换床',
+      //       buttonType: 'success',
+      //       buttonSize: 'mini',
+      //       disabled: param.data['status'] !== 0
+      //     }
+      //   },
+      //   filter: false,
+      //   pinned: 'right',
+      //   lockPinned: true,
+      //   width: 80,
+      //   resizable: false,
+      //   sortable: false },
+      // { headerName: '删除', field: 'shop_id',
+      //   cellRendererFramework: 'ButtonCellRender',
+      //   cellRendererParams: param => {
+      //     return {
+      //       onClick: this.deleteSingle,
+      //       label: '删除',
+      //       buttonType: 'danger',
+      //       buttonSize: 'mini',
+      //       disabled: param.data['member_name'] === 'superadmin'
+      //     }
+      //   },
+      //   pinned: 'right',
+      //   lockPinned: true,
+      //   width: 80,
+      //   resizable: false,
+      //   filter: false,
+      //   sortable: false }
     ]
     this.defaultColDef = {
       // filter: 'agTextColumnFilter',
@@ -776,23 +853,6 @@ export default {
       ]
     })
     this.getEmptyBeds()
-    // var column = this.gridColumnApi.getColumn('id')
-    // const _this = this
-    // column.addEventListener('sortChanged', function(event) {
-    //   console.log(event)
-    //   // _this.rowData = []
-    //   if (event.column.sort !== null && event.column.sort !== '') {
-    //     _this.params.sort = event.column.colId
-    //     _this.params.dir = event.column.sort
-    //   } else {
-    //     delete _this.params.sort
-    //     delete _this.params.dir
-    //   }
-    //   _this.getList()
-    //   // event.columnApi.applyColumnState({ defaultState: { sort: null }})
-    //   // console.log('Column visibility changed', event)
-    // })
-    // this.getList()
   },
   methods: {
     windowResize() {
@@ -927,6 +987,31 @@ export default {
       if (!param.value) return ''
       return unix2Date(param.value * 1000)
     },
+    unixDateFormatter2(param) {
+      if (!param.value) return ''
+      return unix2Date(param.value * 1000, 'yyyy-MM-dd')
+    },
+    sexFormatter(param) {
+      return param.value + param.data.age_unit
+    },
+    idNoFormatter(param) {
+      if (param.value) {
+        return param.data.id_type + ':' +  param.value
+      } else {
+        return '暂无证件'
+      }
+    },
+    formatterDate(param) {
+      let date = unixToDate(param.data.in_date, 'yyyy-MM-dd')
+      if (param.data.out_date) {
+        date += '至' + unixToDate(param.data.out_date, 'yyyy-MM-dd')
+      } else {
+        if (param.data.in_date) {
+          date += '至今'
+        }
+      }
+      return date
+    },
     handleClick() {
 
     },
@@ -1252,7 +1337,7 @@ export default {
         })
       })
     },
-    formatterSex(row, column, cellValue) {
+    formatterSex(row) {
       if (row.sex === 1) {
         return '男'
       } else if (row.sex === 0) {
@@ -1291,6 +1376,7 @@ export default {
     async deleteMembers(ids) {
       API_User.remove(ids)
     }
+
   }
 }
 </script>

文件差异内容过多而无法显示
+ 1526 - 0
src/views/customer/components/elderlyCareManager.vue


+ 22 - 0
src/views/customer/elderlyCareManagement.vue

@@ -0,0 +1,22 @@
+<template>
+    <div>
+        <elderly-care-manager :frame="frame" />
+    </div>
+</template>
+
+<script>
+    import elderlyCareManager from "./components/elderlyCareManager"
+    export default {
+        name: "ElderlyCareManagement",
+        components: { elderlyCareManager },
+        data() {
+            return {
+                frame: {}
+            }
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 5 - 2
src/views/hospitalFrame/frameTreeView.vue

@@ -67,6 +67,7 @@
             <keep-alive>
               <customer-manager v-if="uiVersion===2" :frame="selectedNode" @saved="handleCustomerChange" />
               <patient-manager v-if="uiVersion===1" :frame="selectedNode" @saved="handleCustomerChange" />
+              <elderly-care-manager v-if="uiVersion===3" :frame="selectedNode" @saved="handleCustomerChange" />
             </keep-alive>
           </el-tab-pane>
           <el-tab-pane :label="this.$t('frameManage.deviceList')" name="deviceList">
@@ -195,11 +196,13 @@ import * as API_FrameGroup from '@/api/ncs_frameGroup'
 import CustomerManager from '../customer/components/customerManager'
 import DeviceManager from '../ncs-device/components/deviceManager'
 import PatientManager from '../customer/components/patientManager'
-import { uiVersion } from '@/utils/domain'
+// import { uiVersion } from '@/utils/domain'
 import { FRAME_TYPE } from '@/utils/enum/FrameTypeEnum'
+import ElderlyCareManager from "../customer/components/elderlyCareManager"
+const uiVersion = domain.uiVersion
 export default {
   name: 'FrameTreeView',
-  components: { PatientManager, DeviceManager, CustomerManager },
+  components: {ElderlyCareManager, PatientManager, DeviceManager, CustomerManager },
   data() {
     return {
       treeData: [],

+ 73 - 13
src/views/ncs-device/watch_location.vue

@@ -4,17 +4,24 @@
       <el-date-picker
           v-model="queryTime"
           type="date"
-          placeholder="选择日期"
+          placeholder="选择日期进行搜索"
           value-format="yyyy-MM-dd">
       </el-date-picker>
-      <el-button type="primary" plain style="margin-left: 30px" @click="getNewLocation">获取最新位置</el-button>
+      <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">
-            <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>
+              <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>
@@ -68,14 +75,17 @@ export default {
         page_size: 20,
         page_no: 1,
         fixedCondition: ' device_id = ' + this.deviceId,
-        sort: 'create_time'
+        sort: 'create_time',
+        dir: 'desc'
       },
       tableData: [],
       pageData: [],
       deviceList: [],
       clearList: [],
       queryTime: null,
-      websock: null
+      websock: null,
+      fullscreenLoading: false,
+      myTitle: ''
     }
   },
   watch: {
@@ -83,7 +93,6 @@ export default {
       if (this.isShow) {
         this.sx()
       } else {
-        console.log('我关闭了。。。')
         this.websocketclose()
       }
     },
@@ -118,20 +127,26 @@ export default {
           page_size: res.page_size,
           data_total: res.data_total
         }
-        _this.changeStyle()
+        if (_this.tableData.length > 0) {
+          _this.changeStyle()
+        }
       })
     },
     changeStyle() {
       const _this = this
       this.locationList = []
       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'
             }
-            // 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({
@@ -139,13 +154,21 @@ export default {
               message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
               position: 'bottom-right',
               showClose: false,
-              // duration: 1000
+              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])   // 注意这里是实参,这里把要用的参数传进去
       }
@@ -156,8 +179,10 @@ export default {
         page_size: 20,
         page_no: 1,
         fixedCondition: ' device_id = ' + this.deviceId,
-        sort: 'create_time'
+        sort: 'create_time',
+        dir: 'desc'
       }
+      this.myTitle = ''
       this.frames = []
       this.locationList = []
       this.initWebSocket()
@@ -179,12 +204,19 @@ export default {
       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() {
@@ -197,16 +229,44 @@ export default {
     },
     websocketonopen: function() {
       console.log('WebSocket连接成功')
-      this.$message.success('连接成功')
     },
     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.code + ')')
+      console.log('socket连接关闭connection closed (' + e + ')')
     }
   }
 }

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

@@ -25,7 +25,7 @@
           <el-row>
             <el-col :span="8">
               <el-form-item label="组织类型" prop="shop_type">
-                <el-select v-model="formmodel.shop_type" placeholder="请选择组织类型" clearable>
+                <el-select v-model="formmodel.shop_type" placeholder="请选择组织类型" disabled clearable>
                   <el-option label="医院" value="6" />
                   <el-option label="科室" value="5" />
                   <el-option label="机构" value="0" />

+ 30 - 45
src/views/ncs-task/index.vue

@@ -106,12 +106,12 @@ import * as API_task from '@/api/ncs_task'
 import { unix2Date, unixToDate } from '@/utils/Foundation'
 import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
 import Tooltip from '../../components/Tooltip/Tooltip'
-import ButtonCellRender from '@/components/AgGridCellRender/ButtonCellRender'
+import ButtonCellRenderList from '@/components/AgGridCellRender/ButtonCellRenderList'
 import { serverUrl } from '@/utils/domain'
 import { param } from '@/utils'
 export default {
   name: 'Index',
-  components: { Tooltip, ButtonCellRender },
+  components: { Tooltip, ButtonCellRenderList },
   data: function() {
     return {
       /** 表格数据 */
@@ -181,8 +181,8 @@ export default {
           content: 'task_content'
         }
       },
-      { headerName: '计划任务时间', field: 'task_plan_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 170 },
-      { headerName: '实际任务时间', field: 'task_do_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 170 },
+      { headerName: '计划任务时间', field: 'task_plan_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
+      { headerName: '实际任务时间', field: 'task_do_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
       { headerName: '任务状态', field: 'task_success', filter: false, cellRenderer: this.formatterStasus, minWidth: 100 },
       // { headerName: '任务结果', field: 'task_result', sortable: true, filter: false, width: 220,
       //     cellRendererFramework: 'Tooltip',
@@ -192,55 +192,39 @@ export default {
       // },
       { headerName: '任务操作人', field: 'task_do_name', sortable: true, filter: true, minWidth: 120 },
       { headerName: '创建人', field: 'create_name', valueFormatter: this.formatterName, sortable: true, filter: true, minWidth: 120 },
-      { headerName: '操作任务', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
+      { headerName: '操作', field: 'id',
+        cellRendererFramework: 'ButtonCellRenderList',
         cellRendererParams: param => {
           return {
-            onClick: this.handlerEdit,
-            label: '操作任务',
-            buttonType: 'primary',
-            buttonSize: 'mini',
-            show: param.data['task_do_time'] === null
+            list: [
+              {
+                onClick: this.handlerEdit,
+                label: '操作任务',
+                buttonType: 'primary',
+                buttonSize: 'mini',
+                disabled: param.data['task_do_time'] !== null
+              },
+              {
+                onClick: this.xzfj,
+                label: '下载附件',
+                buttonType: 'success',
+                buttonSize: 'mini',
+                disabled: param.data['file_path'] === '' || param.data['file_path'] === null
+              },
+              {
+                onClick: this.deleteSingle,
+                label: '删除',
+                buttonType: 'danger',
+                buttonSize: 'mini'
+              }
+            ]
           }
         },
         filter: false,
         pinned: 'right',
         lockPinned: true,
-        width: 100,
+        minWidth: 260,
         resizable: false,
-        sortable: false },
-      { headerName: '附件', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
-        cellRendererParams: param => {
-          return {
-            onClick: this.xzfj,
-            label: '下载',
-            buttonType: 'success',
-            buttonSize: 'mini',
-            show: param.data['file_path'] !== '' && param.data['file_path'] !== null
-          }
-        },
-        filter: false,
-        pinned: 'right',
-        lockPinned: true,
-        width: 100,
-        resizable: false,
-        sortable: false },
-      { headerName: '删除', field: 'id',
-        cellRendererFramework: 'ButtonCellRender',
-        cellRendererParams: param => {
-          return {
-            onClick: this.deleteSingle,
-            label: '删除',
-            buttonType: 'danger',
-            buttonSize: 'mini'
-          }
-        },
-        pinned: 'right',
-        lockPinned: true,
-        width: 100,
-        resizable: false,
-        filter: false,
         sortable: false }
     ]
     this.defaultColDef = {
@@ -513,6 +497,7 @@ export default {
       this.getList()
     },
     xzfj(row) {
+      console.log('row.file_path===', row.file_path)
       window.open(row.file_path)
     }
   }