浏览代码

架构改造及医院结构、设备管理开发

WenNingning 4 年之前
父节点
当前提交
a6c28d777a

+ 14 - 16
package-lock.json

@@ -5169,7 +5169,8 @@
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "optional": true
     },
     "consolidate": {
       "version": "0.15.1",
@@ -6865,10 +6866,6 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "dev": true
     },
-    "eve": {
-      "version": "git://github.com/adobe-webplatform/eve.git#eef80ed8d188423c2272746fb8ae5cc8dad84cb1",
-      "from": "git://github.com/adobe-webplatform/eve.git#eef80ed"
-    },
     "event-pubsub": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz",
@@ -7740,7 +7737,8 @@
         "ansi-regex": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
@@ -7766,6 +7764,7 @@
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
           "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -11985,7 +11984,8 @@
     "npm-normalize-package-bin": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+      "optional": true
     },
     "npm-packlist": {
       "version": "1.4.8",
@@ -12745,7 +12745,8 @@
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
       "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
+      "dev": true,
+      "optional": true
     },
     "pify": {
       "version": "4.0.1",
@@ -13881,13 +13882,6 @@
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true
     },
-    "raphael": {
-      "version": "git+https://github.com/nhn/raphael.git#78a6ed3ec269f33b6457b0ec66f8c3d1f2ed70e0",
-      "from": "git+https://github.com/nhn/raphael.git#2.2.0-c",
-      "requires": {
-        "eve": "git://github.com/adobe-webplatform/eve.git#eef80ed8d188423c2272746fb8ae5cc8dad84cb1"
-      }
-    },
     "raw-body": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@@ -16107,6 +16101,7 @@
           "version": "2.9.0",
           "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
           "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -16485,10 +16480,13 @@
       "integrity": "sha512-DUJIutBG/tOdvJnGCo1PcBhFyGBWsY8VIMdXe3WRtGXynMwOcC5cojYpULf3qFJ4Jj1Riv3/kbF6Ygmi+BpjCw==",
       "requires": {
         "core-js": "^3.6.4",
-        "raphael": "git+https://github.com/nhn/raphael.git#78a6ed3ec269f33b6457b0ec66f8c3d1f2ed70e0",
         "tui-code-snippet": "^2.3.1"
       },
       "dependencies": {
+        "raphael": {
+          "version": "git+https://github.com/nhn/raphael.git#78a6ed3ec269f33b6457b0ec66f8c3d1f2ed70e0",
+          "from": "git+https://github.com/nhn/raphael.git#78a6ed3ec269f33b6457b0ec66f8c3d1f2ed70e0"
+        },
         "tui-code-snippet": {
           "version": "2.3.2",
           "resolved": "https://registry.npmjs.org/tui-code-snippet/-/tui-code-snippet-2.3.2.tgz",

+ 14 - 14
src/api/calling-device.js

@@ -6,7 +6,7 @@
 import request from '@/utils/request'
 export function getList(params) {
   return request({
-    url: '/mgr/device/page',
+    url: '/ncs/device/page',
     method: 'POST',
     loading: true,
     data: params,
@@ -17,7 +17,7 @@ export function getList(params) {
 /** 新增设备 */
 export function add(params) {
   return request({
-    url: '/mgr/device',
+    url: '/ncs/device',
     method: 'POST',
     loading: true,
     data: params
@@ -27,7 +27,7 @@ export function add(params) {
 /** 新增虚拟设备 */
 export function addVirtualDevice(params) {
   return request({
-    url: '/mgr/virtualdevice',
+    url: '/ncs/virtualdevice',
     method: 'POST',
     loading: true,
     data: params
@@ -38,7 +38,7 @@ export function addVirtualDevice(params) {
 export function remove(params) {
   const ids = params.toString()
   return request({
-    url: `/mgr/device/${ids}`,
+    url: `/ncs/device/${ids}`,
     method: 'DELETE',
     loading: true,
     data: params
@@ -48,7 +48,7 @@ export function remove(params) {
 /** 更新设备 */
 export function update(id, params) {
   return request({
-    url: `/mgr/device/${id}`,
+    url: `/ncs/device/${id}`,
     method: 'put',
     data: params
   })
@@ -57,7 +57,7 @@ export function update(id, params) {
 /** 查询单个设备 */
 export function get(id, params) {
   return request({
-    url: `/mgr/device/${id}`,
+    url: `/ncs/device/${id}`,
     method: 'get',
     loading: false,
     params
@@ -67,7 +67,7 @@ export function get(id, params) {
 /** 查询某类设备 */
 export function getDeviceByType(partid, type) {
   return request({
-    url: `/mgr/device/${partid}/${type}`,
+    url: `/ncs/device/${partid}/${type}`,
     method: 'get',
     loading: false
   })
@@ -75,7 +75,7 @@ export function getDeviceByType(partid, type) {
 /** 查询某个主机下的某类设备 */
 export function getSubDevices(hostid, type) {
   return request({
-    url: `/mgr/subdevice/${hostid}/${type}`,
+    url: `/ncs/subdevice/${hostid}/${type}`,
     method: 'get',
     loading: false
   })
@@ -83,7 +83,7 @@ export function getSubDevices(hostid, type) {
 /** 获取DHCP服务器下一个可分配地址 */
 export function getNextIP() {
   return request({
-    url: '/mgr/device/getnextip',
+    url: '/ncs/device/getnextip',
     method: 'get',
     loading: false
   })
@@ -92,7 +92,7 @@ export function getNextIP() {
 /** 获取APP版本更新信息 */
 export function getAPPVersion(params) {
   return request({
-    url: '/mgr/getappversion',
+    url: '/ncs/getappversion',
     method: 'get',
     loading: false,
     params
@@ -101,7 +101,7 @@ export function getAPPVersion(params) {
 /** 设置APP版本更新信息 **/
 export function setAPPVersion(params) {
   return request({
-    url: '/mgr/setappversion',
+    url: '/ncs/setappversion',
     method: 'post',
     loading: false,
     data: params
@@ -130,7 +130,7 @@ export function saveBoard(params) {
 /** 写入分机测试数据 */
 export function addTestData() {
   return request({
-    url: '/mgr/testdata',
+    url: '/ncs/testdata',
     method: 'POST',
     loading: true
   })
@@ -139,7 +139,7 @@ export function addTestData() {
 /** 擦除分机测试数据 */
 export function deleteTestData() {
   return request({
-    url: '/mgr/testdata',
+    url: '/ncs/testdata',
     method: 'DELETE',
     loading: true
   })
@@ -148,7 +148,7 @@ export function deleteTestData() {
 /** 更新设备排序,按房号,床号,排序,护士主机可按顺序显示 */
 export function updateDeviceIndex() {
   return request({
-    url: '/mgr/updatedeviceindex',
+    url: '/ncs/updatedeviceindex',
     method: 'POST',
     loading: true
   })

+ 53 - 0
src/api/hospitalFrame.js

@@ -0,0 +1,53 @@
+
+import request from '@/utils/request'
+/**
+ * 医院结构相关API
+ */
+/**
+ * 获取医院结构列表
+ */
+export function getHospitalFrameList(id) {
+  return request({
+    url: `/ncs/frame/${id}`,
+    method: 'GET',
+    loading: false,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+/** 新增医院结构 */
+export function addHospitalFrame(params) {
+  // params = JSON.parse(JSON.stringify(params))
+  return request({
+    url: '/ncs/frame',
+    method: 'POST',
+    loading: true,
+    data: params
+  })
+}
+/** 删除医院结构 */
+export function deleteHospitalFrame(params) {
+  const ids = params.toString()
+  return request({
+    url: `/ncs/frame/${ids}`,
+    method: 'DELETE',
+    loading: true,
+    data: params
+  })
+}
+/** 更新医院结构信息 */
+export function updateHospitalFrame(id, params) {
+  return request({
+    url: `/ncs/frame/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+export function getFrameWithPatientAndDeviceVO() {
+  return request({
+    url: '/care/hospital_frame/frame_with_patient_and_device',
+    method: 'get',
+    loading: true
+  })
+}
+

+ 3 - 3
src/api/user.js

@@ -2,9 +2,9 @@ import request from '@/utils/request'
 
 export function login(data) {
   return request({
-    url: '/mgr/login',
-    method: 'post',
-    data
+    url: '/Mgr/login',
+    method: 'get',
+    params: data
   })
 }
 

+ 13 - 0
src/router/index.js

@@ -100,6 +100,19 @@ export const partRoutes = [
     ]
   },
   {
+    path: '/hospitalFrame',
+    component: Layout,
+    redirect: '/hospitalFrame/hospitalFrame',
+    children: [
+      {
+        path: 'hospitalFrame',
+        component: () => import('@/views/hospitalFrame/hospitalFrame'),
+        name: 'CallingDevice',
+        meta: { title: '医院结构', icon: 'component', noCache: true }
+      }
+    ]
+  },
+  {
     path: '/calling-staff',
     component: Layout,
     redirect: '/calling-staff/index',

+ 10 - 10
src/store/modules/user.js

@@ -1,9 +1,10 @@
-import { login, logout } from '@/api/user'
+import {login} from '@/api/user'
 import * as API_Part from '@/api/calling-part'
 import * as Auth from '@/utils/auth'
-import router, { resetRouter } from '@/router'
+import router, {resetRouter} from '@/router'
 
 import uuidv1 from 'uuid/v1'
+import store from "@/store";
 
 const state = {
   token: Auth.getToken(),
@@ -57,15 +58,14 @@ const actions = {
   login({ commit, dispatch }, userInfo) {
     const { username, password } = userInfo
     return new Promise((resolve, reject) => {
-      login({ username: username.trim(), password: password.trim() }).then(response => {
-        const data = response
-        if (data.substring(data.lastIndexOf(',') + 1) !== 'OK!') {
-          reject('用户名或密码错误')
-          return
-        }
-        commit('SET_PARTID', data.substring(0, data.lastIndexOf(',')))
+      // console.log('后台未做登录,先不登录')
+      // commit('SET_PARTID', 1)
+      // commit('SET_NAME', username)
+      // resolve()
+      login({ username: username.trim(), password: password.trim(), uuid: store.getters.uuid }).then(response => {
+        commit('SET_PARTID', response.last_login_shopid)
         commit('SET_NAME', username)
-        dispatch('getInfo')
+        // dispatch('getInfo')
         resolve()
       }).catch(error => {
         reject(error)

+ 399 - 0
src/views/calling-device/deviceInfo.vue

@@ -0,0 +1,399 @@
+<template>
+  <div>
+    <en-table-layout
+      toolbar
+      @selection-change="selectFun"
+      @sort-change="tableSort"
+      pagination
+      :tableData="tableData"
+      :height="600"
+      :loading="loading"
+      :default-sort="{prop: 'id', order: 'ascending'}"
+    >
+      <!--工具栏-->
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search @search="handlerSearch" placeholder="请输入搜索关键字"/>
+        </div>
+        <div class="toolbar-btns">
+          <el-button type="primary" @click="handleAddDeviceInfo">新增</el-button>
+           <el-button type="danger" @click="batchDelete">批量删除</el-button>
+        </div>
+      </div>
+      <!--表头-->
+      <template slot="table-columns">
+        <el-table-column
+          type="selection"
+          width="55">
+        </el-table-column>
+
+        <el-table-column prop="code" sortable="custom" label="出厂编号">
+        </el-table-column>
+        <el-table-column prop="name" sortable="custom" label="设备名称">
+        </el-table-column>
+        <el-table-column prop="model" sortable="custom" label="设备型号">
+        </el-table-column>
+        <el-table-column prop="uart_address" sortable="custom" label="串口地址">
+        </el-table-column>
+
+
+        <el-table-column label="操作" width="240">
+          <template slot-scope="scope">
+            <el-button type="success" size="mini" @click="handlerEdit(scope.$index,scope.row)">
+              查看
+            </el-button>
+            <el-button type="danger" size="mini" @click="handlerDelete(scope.row.id)">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+
+
+      </template>
+
+      <!--翻页-->
+      <el-pagination
+        slot="pagination"
+        v-if="pageData"
+        :current-page="pageData.page_no"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageData.page_size"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="pageData.data_total">
+      </el-pagination>
+    </en-table-layout>
+
+    <el-dialog
+      title="编辑设备信息"
+      :visible.sync="dialogAddDeviceInfoVisible"
+      :append-to-body="true"
+      width="80%"
+    >
+      <deviceInfo-edit :formmodel="currentRow" @saved="finished"></deviceInfo-edit>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  // import * as DeviceInfo_API from '@/api/device'
+  // import DeviceInfoEdit from './deviceInfoEdit'
+
+  export default {
+    name: 'deviceInfo',
+    components: { DeviceInfoEdit },
+    props: {
+      frameId: {
+        type: Number,
+        default: 0
+      }
+    },
+    data: function() {
+      return {
+        imageUrl: '',
+        /** 列表loading状态 */
+        loading: false,
+        /** 列表参数 */
+        params: {
+          page_size: 10,
+          page_no: 1,
+          sort: 'id',
+          dir: 'asc'
+        },
+        currentRow: {},
+        doctor_age: '',
+        /** 列表数据 */
+        tableData: [],
+        pageData: [],
+        /** 添加设备信息弹出框指示 */
+        dialogAddDeviceInfoVisible: false,
+        /** 添加设备信息 表单数据 */
+        addDeviceInfoForm: {},
+        /** 选中行数据 */
+        multipleSelection: [],
+        /** 添加设备信息 表单规则 */
+        addDeviceInfoRules: {
+          name: [
+            this.MixinRequired('请输入设备信息名'),
+            { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
+          ]
+        },
+        /** 选择医院结构 */
+        editHospitalFrameDialogVisible: false,
+        chooseHospitalFrameForm: {},
+        chooseHospitalFrameFormRules: {
+          frame_id: [this.MixinRequired('医院结构必须选择!')]
+        },
+        /** 选择使用者 */
+        editHumanDialogVisible: false,
+        chooseHumanForm: {},
+        chooseHumanFormRules: {
+          human_id: [this.MixinRequired('使用者必须选择!')]
+        },
+        deviceModels: []
+      }
+    },
+    mounted() {
+      this.GET_List()
+      console.log(this.frameId)
+    },
+    activated() {
+      this.GET_List()
+    },
+    watch: {
+      frameId: function() {
+        this.GET_List()
+      }
+    },
+    methods: {
+      /** 选择行变化时,记录选中的行数据 */
+      selectFun(val) {
+        this.multipleSelection = val
+      },
+      /** 加载设备信息列表 */
+      GET_List() {
+        this.loading = true
+
+        if (this.frameId > 0) {
+          this.params.fixedCondition = ' frame_id=' + this.frameId
+        } else {
+          this.params.fixedCondition = ' part_id=' + this.$store.getters.partId + ' and frame_id=' + this.frameId
+        }
+
+        // DeviceInfo_API.getDeviceInfoList(this.params).then(response => {
+        //   this.loading = false
+        //   this.tableData = response.data
+        //   this.pageData = {
+        //     page_no: response.page_no,
+        //     page_size: response.page_size,
+        //     data_total: response.data_total
+        //   }
+        // }).catch(() => {
+        //   this.loading = false
+        // })
+
+        // DeviceInfo_API.getDeviceModelBySeries('风尚版').then(res => {
+        //   this.deviceModels = res
+        // })
+      },
+      /** 处理搜索 **/
+      handlerSearch(keywords) {
+        this.params.query = keywords
+        this.GET_List()
+      },
+      /** 表头排序 **/
+      tableSort(column) {
+        if (column.order !== null) {
+          this.params.sort = column.prop
+          this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+        } else {
+          this.params.sort = null
+          this.params.dir = null
+        }
+        this.GET_List()
+      },
+      /** 单条数据删除处理 */
+      handlerDelete(ids) {
+        this.$confirm('你确定要删除此设备信息?', '警告', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          // DeviceInfo_API.deleteDeviceInfo(ids).then(
+          //   response => {
+          //     this.GET_List()
+          //     this.$message({
+          //       type: 'success',
+          //       message: '已删除!'
+          //     })
+          //   }
+          // ).catch(response => {
+          //   this.$message({
+          //     type: 'info',
+          //     message: response.message
+          //   })
+          // })
+        }).catch((response) => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+      },
+      /** 批量数据删除处理(删除选中的行) */
+      batchDelete: function() {
+        if (this.multipleSelection.length === 0) {
+          this.$alert('没有选择任何记录!', '系统提示', {
+            confirmButtonText: '确定',
+            callback: action => {
+
+            }
+          })
+        } else {
+          const ids = []
+          this.multipleSelection.forEach(function(item) {
+            ids.push(item.id)
+          })
+
+          this.handlerDelete(ids.join(','))
+        }
+      },
+
+      /** 性别格式化 */
+      formatterSex(row, column, cellValue) {
+        return row.sex === 1 ? '男' : '女'
+      },
+      /** 提交添加设备信息表单 */
+      submitAddDeviceInfoForm(formName) {
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            const params = this.MixinClone(this.addDeviceInfoForm)
+            // DeviceInfo_API.addDeviceInfo(params).then(response => {
+            //   this.dialogAddDeviceInfoVisible = false
+            //   this.$message.success('添加成功!')
+            //   this.GET_List()
+            // })
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+            return false
+          }
+        })
+      },
+      /** 添加设备信息 */
+      handleAddDeviceInfo() {
+        this.currentRow = { type: 1 }
+        // if (this.frameId > 0) {
+        this.currentRow.frame_id = this.frameId
+        // }
+        this.dialogAddDeviceInfoVisible = true
+      },
+      /** 编辑设备信息 */
+      handlerEdit(index, row) {
+        // this.$router.push({ name: 'deviceInfoEdit', params: { id: row.id, callback: this.GET_List() }})
+        this.currentRow = { ...row }
+        // console.log('row', this.currentRow)
+        this.dialogAddDeviceInfoVisible = true
+      },
+      /** 分页大小发生改变 */
+      handlePageSizeChange(size) {
+        this.params.page_size = size
+        this.GET_List()
+      },
+
+      /** 分页页数发生改变 */
+      handlePageCurrentChange(page) {
+        this.params.page_no = page
+        this.GET_List()
+      },
+      finished() {
+        this.dialogAddDeviceInfoVisible = false
+        this.GET_List()
+      },
+      /** 选择医院结构按钮*/
+      handleAddHospitalFrame() {
+        this.editHospitalFrameDialogVisible = true
+      },
+      editchooseHospitalFrameForm() {
+        this.$refs['chooseHospitalFrameForm'].validate((valid, error) => {
+          if (valid) {
+            this.addDeviceInfoForm.frame_id = this.chooseHospitalFrameForm.frame_id
+            this.addDeviceInfoForm.frame_name = this.chooseHospitalFrameForm.frame_name
+            this.editHospitalFrameDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择使用者按钮*/
+      handleAddHuman() {
+        this.editHumanDialogVisible = true
+      },
+      editchooseHumanForm() {
+        this.$refs['chooseHumanForm'].validate((valid, error) => {
+          if (valid) {
+            this.addDeviceInfoForm.human_id = this.chooseHumanForm.human_id
+            this.addDeviceInfoForm.human_name = this.chooseHumanForm.human_name
+            this.editHumanDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      }
+    }
+  }
+</script>
+
+<style type="text/scss" scoped>
+
+  .show-pwd {
+    position: absolute;
+    top: 0;
+    right: 10px;
+    cursor: pointer;
+  }
+
+  .formwrap /deep/ .el-tabs__content {
+    overflow: visible !important;
+  }
+
+  .formwrap /deep/ .app-address-title {
+    height: 32px !important;
+    line-height: 32px !important;
+  }
+
+  .formwrap /deep/ .app-address {
+    width: 100% !important;
+  }
+
+  /deep/ div.toolbar {
+    height: 70px;
+    padding: 20px 0;
+  }
+
+  /deep/ .el-date-editor {
+    width: 100%;
+  }
+
+  /deep/ .el-table {
+    width: 100%;
+    overflow-x: scroll;
+
+    & td:not(.is-left) {
+      text-align: center;
+    }
+  }
+
+  .el-tag + .el-tag {
+    margin-left: 10px;
+    margin-bottom: 10px;
+  }
+
+  /deep/ .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+
+  /deep/ .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+
+  /deep/ .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 110px;
+    height: 110px;
+    line-height: 110px;
+    text-align: center;
+  }
+
+  /deep/ .avatar {
+    width: 110px;
+    height: 110px;
+    display: block;
+  }
+
+</style>

+ 651 - 0
src/views/calling-device/deviceInfoEdit.vue

@@ -0,0 +1,651 @@
+<template>
+  <div class="formwrap">
+
+    <el-form :model="formmodel" :rules="rules" ref="editForm" label-width="150px">
+
+      <el-card>
+        <h4>必须信息</h4>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="设备型号" prop="model">
+              <el-select v-model="formmodel.model" placeholder="请选择设备型号" @change="deviceModelsChange">
+                <el-option v-for="item in deviceModels" :key="item.id" :label="item.code" :value="item.code">{{item.code}} ({{item.name}})</el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="设备名称" prop="name">
+              <el-input v-model="formmodel.name" placeholder="设备名称" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="空间类型" prop="frame_type">
+              <el-select v-model="formmodel.frame_type" placeholder="请选择" disabled>
+                <el-option label="床位" :value="2"/>
+                <el-option label="房间" :value="1"/>
+                <el-option label="科室" :value="0"/>
+                <el-option label="其它" :value="3"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="出厂编号" prop="code">
+              <el-input v-model="formmodel.code" clearable placeholder="请输入编号" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="串口地址" prop="uart_address">
+              <el-input v-model="formmodel.uart_address" clearable placeholder="请输入串口地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="7">
+            <el-form-item label="具体位置" prop="frame_name">
+              <el-select placeholder="请选择具体位置" v-model="formmodel.frame_id" @change="frameChange($event)" disabled="">
+                <el-option
+                  v-for="item in frames"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id">
+                  <div v-if="item.type===1" class="el-col-lg-offset-4">{{item.name}} 房</div>
+                  <div v-if="item.type===2" class="el-col-lg-offset-8">{{item.name}} 床</div>
+                  <div v-else class="el-col-lg-offset-1">{{item.name}}</div>
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="1">
+            <div style="line-height:32px;">&nbsp;{{frameName}}</div>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <el-card style="margin-top:15px;">
+        <h4>其它信息</h4>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="软件版本" prop="soft_ver">
+              <el-input v-model="formmodel.soft_ver" clearable placeholder="请输入软件版本" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="硬件版本" prop="hard_ver">
+              <el-input v-model="formmodel.hard_ver" clearable placeholder="请输入硬件版本" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="以太网卡MAC地址" prop="eth_mac">
+              <el-input v-model="formmodel.eth_mac" clearable placeholder="请输入以太网卡MAC地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="以太网卡IP地址" prop="eth_ip">
+              <el-input v-model="formmodel.eth_ip" clearable placeholder="请输入硬件以太网卡IP地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="WIFI网卡MAC地址" prop="wifi_mac">
+              <el-input v-model="formmodel.wifi_mac" clearable placeholder="请输入WIFI网卡MAC地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="WIFI网卡IP地址" prop="wifi_ip">
+              <el-input v-model="formmodel.wifi_ip" clearable placeholder="请输入WIFI网卡IP地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="WIFI热点名称" prop="wifi_hostname">
+              <el-input v-model="formmodel.wifi_hostname" clearable placeholder="请输入WIFI热点名称" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="启用状态">
+              <el-radio v-model="formmodel.status" :label="false">未启用</el-radio>
+              <el-radio v-model="formmodel.status" :label="true">已启用</el-radio>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="病房号名称" prop="room_num">
+              <el-input v-model="formmodel.room_num" clearable placeholder="请输入病房号名称" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="门口机ID号" prop="room_id">
+              <el-input v-model="formmodel.room_id" clearable placeholder="请输入门口机ID号" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="床位号" prop="bed_num">
+              <el-input v-model="formmodel.bed_num" readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="床位别名" prop="bed_name">
+              <el-input v-model="formmodel.bed_name" readonly></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="使用者类型">
+              <el-radio v-model="formmodel.human_type" :label="0">未使用</el-radio>
+              <el-radio v-model="formmodel.human_type" :label="1">病人</el-radio>
+              <el-radio v-model="formmodel.human_type" :label="2">医生</el-radio>
+              <el-radio v-model="formmodel.human_type" :label="3">护士</el-radio>
+              <el-radio v-model="formmodel.human_type" :label="4">护工</el-radio>
+              <el-radio v-model="formmodel.human_type" :label="5">其它</el-radio>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row v-if="formmodel.human_type===1 || formmodel.human_type===2 || formmodel.human_type===3 || formmodel.human_type===4">
+          <el-col :span="12">
+            <el-form-item label="使用者名称" prop="human_name">
+              <el-input v-model="formmodel.human_name" clearable readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-button size="mini" type="primary" icon="el-icon-circle-plus-outline" @click="handleAddHuman">选择使用者</el-button>
+
+          <el-dialog
+            title="选择使用者"
+            :visible.sync="editHumanDialogVisible"
+            width="500px"
+            :modal="false"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+          >
+            <el-form :model="chooseHumanForm" :rules="chooseHumanFormRules" ref="chooseHumanForm" label-width="120px">
+              <el-form-item label="使用者列表" prop="human_id" >
+                <pop-grid-select v-if="formmodel.human_type===2 ||formmodel.human_type===3 ||formmodel.human_type===4" server-url="/care/employee/page" readonly title="选择使用者"
+                                 v-model="chooseHumanForm"
+                                 :base-url="baseurl"
+                                 method="post"
+                                 store-field="human_name"
+                                 :columns="[{prop:'type',label:'类型',align:'center',filter:'employeeTypeFormat'},{prop:'name',label:'名称',align:'center'},{prop:'sex',label:'性别',align:'center',filter:'employeeSexFormat'},{prop:'age',label:'年龄',align:'center'},{prop:'face',element:'img',label:'头像',align:'center'}]"
+                                 :filter-param="{page_size:10}"
+                                 :fields-mapping="[{source:'id',target:'human_id'},{source:'name',target:'human_name'}]"
+
+                ></pop-grid-select>
+                <pop-grid-select server-url="/care/patient_info/page" v-if="formmodel.human_type===1" readonly title="选择使用者"
+                                 v-model="chooseHumanForm"
+                                 :base-url="baseurl"
+                                 method="post"
+                                 store-field="human_name"
+                                 :columns="[{prop:'name',label:'病人姓名',align:'center'},{prop:'sex',label:'性别',align:'center',filter:'patienSexFormat'},{prop:'mobile',label:'联系电话',align:'center'},{prop:'age',label:'年龄',align:'center'},{prop:'idcard',label:'身份证号',align:'center'}]"
+                                 :filter-param="{page_size:10}"
+                                 :fields-mapping="[{source:'id',target:'human_id'},{source:'name',target:'human_name'}]"
+
+                ></pop-grid-select>
+              </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+        <el-button @click="editHumanDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="editchooseHumanForm">确 定</el-button>
+      </span>
+          </el-dialog>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="SIP服务器IP地址" prop="sip_ip">
+              <el-input v-model="formmodel.sip_ip" clearable placeholder="请输入SIP服务器IP地址" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="SIP账号" prop="sip_id">
+              <el-input v-model="formmodel.sip_id" clearable placeholder="请输入SIP账号" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="SIP密码" prop="sip_password">
+              <el-input type="password" v-model="formmodel.sip_password" clearable placeholder="请输入SIP密码" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="SIP账号状态">
+              <el-radio v-model="formmodel.sip_status" :label="true">可以使用</el-radio>
+              <el-radio v-model="formmodel.sip_status" :label="false">暂停使用</el-radio>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="SIP是否在线">
+              <el-radio v-model="formmodel.online" :label="true">在线</el-radio>
+              <el-radio v-model="formmodel.online" :label="false">离线</el-radio>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="SIP呼叫清单" prop="sip_calllist">
+              <el-input
+                type="textarea"
+                :autosize="{ minRows: 2, maxRows: 4}"
+                :minlength="2"
+                :maxlength="20"
+                :placeholder="'请输入文本内容,长度2~100'"
+                v-model="formmodel.sip_calllist">
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="被管理的主机ID号" prop="sip_hosting_id">
+              <el-input v-model="formmodel.sip_hosting_id" clearable placeholder="请输入被管理的主机ID号" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="SIP主机名称" prop="sip_hosting_name">
+              <el-input v-model="formmodel.sip_hosting_name" clearable placeholder="请输入SIP主机名称" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="设备相关数据" prop="ir_cfg">
+              <el-input v-model="formmodel.ir_cfg" clearable placeholder="请输入设备相关数据" :maxlength="50"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="0号区域" prop="zone0">
+              <el-input-number v-model="formmodel.zone0" placeholder="0号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="1号区域" prop="zone1">
+              <el-input-number v-model="formmodel.zone1" placeholder="1号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="2号区域" prop="zone2">
+              <el-input-number v-model="formmodel.zone2" placeholder="2号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="3号区域" prop="zone3">
+              <el-input-number v-model="formmodel.zone3" placeholder="3号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="4号区域" prop="zone4">
+              <el-input-number v-model="formmodel.zone4" placeholder="4号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="5号区域" prop="zone5">
+              <el-input-number v-model="formmodel.zone5" placeholder="5号区域" size="small" type="number" :controls="false" :maxlength="50">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <el-form-item style="margin-top:15px;">
+        <el-button type="primary" @click="handlerSubmit('editForm')" class="save">保存修改</el-button>
+      </el-form-item>
+
+
+    </el-form>
+
+  </div>
+
+</template>
+
+<script>
+  import { UE } from '@/components'
+  // import * as DeviceInfo_API from '@/api/deviceInfo'
+  import * as RegExp from '@/utils/RegExp'
+  // import * as HospitalFrame_API from '@/api/hospitalFrame'
+
+  export default {
+    name: 'deviceInfoEdit',
+    components: {
+      [UE.name]: UE
+    },
+    props: {
+      formmodel: {
+        type: Object,
+        default: () => ({})
+      }
+    },
+    data: function() {
+      return {
+        id: this.$route.params.id,
+        imageUrl: '',
+        uploadurl: '/uploaders/uploadFile',
+        usertags: [],
+        /** 输入校验 */
+        rules: {
+          name: [
+            this.MixinRequired('请输入别名!'),
+            { min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' },
+            {
+              validator: (rule, value, callback) => {
+                if (!RegExp.userName.test(value)) {
+                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ],
+          code: [{
+            required: true, message: '请输入出厂编号', trigger: 'blur'
+          }],
+          type: [{
+            required: true, message: '请选择类型', trigger: 'blur'
+          }],
+          model: [{
+            required: true, message: '请输入设备型号', trigger: 'blur'
+          }]
+        },
+        /** 选择医院结构 */
+        frames: [],
+        editHospitalFrameDialogVisible: false,
+        chooseHospitalFrameForm: {},
+        chooseHospitalFrameFormRules: {
+          frame_id: [this.MixinRequired('医院结构必须选择!')]
+        },
+        /** 选择使用者 */
+        editHumanDialogVisible: false,
+        chooseHumanForm: {},
+        chooseHumanFormRules: {
+          human_id: [this.MixinRequired('使用者必须选择!')]
+        },
+
+        frameName: '',
+        deviceModels: []
+      }
+    },
+    mounted() {
+      // console.log(this.formmodel)
+      this.getFrames()
+    },
+    activated() {
+    },
+    watch: {
+      'formmodel': function(newval) {
+        this.getFrameName(this.formmodel.frame_type)
+      }
+    },
+    methods: {
+      getFrameName(type) {
+        switch (type) {
+          case 0:
+            this.frameName = '科室'
+            break
+          case 1:
+            this.frameName = '房'
+            break
+          case 2:
+            this.frameName = '床'
+            break
+          default:
+            this.frameName = ''
+            break
+        }
+      },
+      getFrames() {
+        const params = { page_size: 10000, page_no: 1 }
+        // HospitalFrame_API.getHospitalFrameList(params).then(response => {
+        //   if (response.data) {
+        //     this.frames.push({
+        //       id: -1,
+        //       type: 0,
+        //       name: '科室'
+        //     })
+        //     response.data.forEach(item => {
+        //       this.frames.push(item)
+        //       if (item.has_children) {
+        //         item.children.forEach(subItem => {
+        //           this.frames.push(subItem)
+        //         })
+        //       }
+        //     })
+        //
+        //     if (!this.formmodel.frame_id) {
+        //       return
+        //     }
+        //   }
+        // })
+
+        // DeviceInfo_API.getDeviceModelBySeries('风尚版').then(res => {
+        //   this.deviceModels = res
+        //   this.getFrameName(this.formmodel.frame_type)
+        // })
+      },
+      deviceModelsChange(e) {
+        let deviceModel = this.deviceModels.find(item => {
+          return item.code === e
+        })
+        this.formmodel.frame_type = Number.parseInt(deviceModel.frame_type)
+        this.formmodel.name = deviceModel.name
+        this.getFrameName(deviceModel.frame_type)
+      },
+      frameChange(e) {
+        let frameItems = this.frames.find(item => {
+          return item.id === e
+        })
+        if (frameItems) {
+          if (frameItems.type === -1) {
+            this.frameName = '科室'
+          } else if (frameItems.type === 1) {
+            this.frameName = '房'
+          } else if (frameItems.type === 2) {
+            this.frameName = '床'
+          }
+        }
+      },
+      /** 保存按钮处理事件 */
+      handlerSubmit(formName) {
+        this.$refs[formName].validate(valid => {
+          if (valid) {
+            const params = this.MixinClone(this.formmodel)
+            if (params.id) {
+              // DeviceInfo_API.updateDeviceInfo(params.id, params).then(response => {
+              //   this.$message.success('修改成功!')
+              //   this.$emit('saved')
+              // })
+            } else {
+              params.part_id = this.$store.getters.partId
+              params.frame_id = this.formmodel.frame_id
+              // DeviceInfo_API.addDeviceInfo(params).then(response => {
+              //   this.$message.success('添加成功!')
+              //   this.$emit('saved')
+              // })
+            }
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+            return false
+          }
+        })
+      },
+      /** 图片上传之前的校验 */
+      handleShopLogoBefore(file) {
+        return new Promise((resolve, reject) => {
+          const isImg = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif'
+          const isLt2M = file.size / 1024 / 1024 < 2
+
+          if (!isImg) {
+            this.$message.error('上传头像图片只能是 JPG、PNG、GIF 格式!')
+            reject()
+          }
+          if (!isLt2M) {
+            this.$message.error('上传头像图片大小不能超过 2MB!')
+            reject()
+          }
+
+          let reader = new FileReader()
+          reader.onload = (event) => {
+            let image = new Image()
+            image.onload = () => {
+              let width = image.width
+              let height = image.height
+              if (width > 500 || width < 100) {
+                this.$message.error('图片宽度必须在100~500之间,宽高比为1:1!')
+                reject()
+              }
+              if (width !== height) {
+                this.$message.error('请上传宽高比为1:1的图片')
+                reject()
+              }
+              if (height > 500 || height < 100) {
+                this.$message.error('图片高度必须在100~500之间!')
+                reject()
+              }
+              resolve()
+            }
+            image.src = event.target.result
+          }
+          reader.readAsDataURL(file)
+        })
+      },
+
+      /** 上传成功后的钩子 更换图片 置空存储数组*/
+      uploaded(response) {
+        this.imageUrl = response.url
+        this.formmodel.face = response.url
+      },
+      /** 选择医院结构按钮*/
+      handleAddHospitalFrame() {
+        this.editHospitalFrameDialogVisible = true
+      },
+      editchooseHospitalFrameForm() {
+        this.$refs['chooseHospitalFrameForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.frame_id = this.chooseHospitalFrameForm.frame_id
+            this.formmodel.frame_name = this.chooseHospitalFrameForm.frame_name
+            this.editHospitalFrameDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择使用者按钮*/
+      handleAddHuman() {
+        this.editHumanDialogVisible = true
+      },
+      editchooseHumanForm() {
+        this.$refs['chooseHumanForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.human_id = this.chooseHumanForm.human_id
+            this.formmodel.human_name = this.chooseHumanForm.human_name
+            this.editHumanDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      }
+    }
+  }
+</script>
+
+<style type="text/scss" scoped>
+
+
+  .formwrap /deep/ .el-tabs__content {
+    overflow: visible !important;
+  }
+
+  .formwrap /deep/ .app-address-title {
+    height: 32px !important;
+    line-height: 32px !important;
+  }
+
+  .formwrap /deep/ .app-address {
+    width: 100% !important;
+  }
+
+
+  .el-select {
+    width: 100%;
+  }
+
+  .el-date-editor {
+    width: 100%;
+  }
+
+  .formwrap {
+    border: 1px solid #ebebeb;
+    border-radius: 3px;
+    background: #fff;
+    padding: 24px;
+    min-height: 700px;
+  }
+
+  .app-address {
+    margin-top: 4px;
+    z-index: 1;
+  }
+
+  .area-tip {
+    color: #666;
+    margin-left: 10px;
+  }
+
+  /deep/ .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+
+  /deep/ .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+
+  /deep/ .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 200px;
+    height: 200px;
+    line-height: 200px;
+    text-align: center;
+  }
+
+  /deep/ .avatar {
+    width: 200px;
+    height: 200px;
+    display: block;
+  }
+
+</style>

+ 85 - 347
src/views/calling-device/index.vue

@@ -23,11 +23,6 @@
             style="margin-right: 20px;"
             @change="editLockChange"
           />
-          <el-button v-if="editLock" type="success" @click="initTest">写入测试数据</el-button>
-          <el-button v-if="editLock" type="danger" @click="deleteTest">擦除测试数据</el-button>
-          <el-button v-if="editLock" type="success" icon="el-icon-mobile-phone" @click="addVirtualDevice(3)">添加虚拟门口机</el-button>
-          <el-button v-if="editLock" type="warning" icon="el-icon-coin" @click="addVirtualDevice(13)">添加虚拟紧急按钮</el-button>
-          <el-button v-if="editLock" type="info" @click="appointRoom">设定门口机自动注册</el-button>
           <el-button v-if="editLock" type="primary" @click="handlerAdd">新增设备</el-button>
           <el-button v-if="editLock" type="danger" @click="batchDelete">批量删除</el-button>
         </div>
@@ -42,28 +37,23 @@
 
         <el-table-column prop="id" sortable="custom" label="ID" width="100" align="center" />
         <el-table-column prop="device_type" sortable="custom" label="设备类型" width="160" align="center" :formatter="formatterDeviceType" />
-        <el-table-column prop="device_name" sortable="custom" label="设备别名" width="160" align="center" />
-        <el-table-column prop="device_room_num" sortable="custom" label="安装病房号" width="160" align="center" />
-        <el-table-column prop="device_bed_num" sortable="custom" label="安装床号" width="160" align="center" />
-        <el-table-column prop="device_hosting_id" sortable="custom" label="上级设备名称" width="160" align="center" :formatter="formatterHosting" />
-        <el-table-column prop="device_status" sortable="custom" label="设备状态" width="120" align="center" :formatter="formatterStatus">
+        <el-table-column prop="name" sortable="custom" label="设备别名" width="160" align="center" />
+        <el-table-column prop="status" sortable="custom" label="设备状态" width="120" align="center" :formatter="formatterStatus">
           <template slot-scope="scope">
-            <span :class="scope.row.device_status===1?'green-text':'red-text'">{{ scope.row.device_status===1?'已启用':'未启用' }}</span>
+            <span :class="scope.row.status===1?'green-text':'red-text'">{{ scope.row.status===1?'已启用':'未启用' }}</span>
           </template>
         </el-table-column>
-
-        <el-table-column prop="device_eth_mac" sortable="custom" label="有线物理地址" width="160" align="center" />
-        <el-table-column prop="device_eth_ip" sortable="custom" label="有线IP地址" width="160" align="center" />
-        <el-table-column prop="device_model" sortable="custom" label="设备型号" width="160" align="center" />
-
-        <el-table-column prop="device_sn" sortable="custom" label="出厂编号" width="160" align="center" />
-        <el-table-column prop="device_soft_ver" sortable="custom" label="软件版本" width="160" align="center" />
-        <el-table-column prop="device_hard_ver" sortable="custom" label="硬件版本" width="160" align="center" />
-        <el-table-column prop="device_wifi_mac" sortable="custom" label="WIFI物理地址" width="160" align="center" />
-        <el-table-column prop="device_wifi_ip" sortable="custom" label="WIFIIP地址" width="160" align="center" />
-
-        <el-table-column prop="device_sip_id" sortable="custom" label="SIP账号" width="160" align="center" />
-        <el-table-column prop="device_datetime" sortable="custom" label="最后修改时间" width="160" align="center" />
+        <el-table-column prop="eth_mac" sortable="custom" label="有线物理地址" width="160" align="center" />
+        <el-table-column prop="eth_ip" sortable="custom" label="有线IP地址" width="160" align="center" />
+        <el-table-column prop="model" sortable="custom" label="设备型号" width="160" align="center" />
+        <el-table-column prop="code" sortable="custom" label="出厂编号" width="160" align="center" />
+        <el-table-column prop="soft_ver" sortable="custom" label="软件版本" width="160" align="center" />
+        <el-table-column prop="hard_ver" sortable="custom" label="硬件版本" width="160" align="center" />
+        <el-table-column prop="wifi_mac" sortable="custom" label="WIFI物理地址" width="160" align="center" />
+        <el-table-column prop="wifi_ip" sortable="custom" label="WIFIIP地址" width="160" align="center" />
+
+        <el-table-column prop="sip_id" sortable="custom" label="SIP账号" width="160" align="center" />
+        <el-table-column prop="update_time" sortable="custom" label="最后修改时间" width="160" align="center" />
         <el-table-column
           v-if="editLock"
           label="操作"
@@ -98,7 +88,7 @@
       />
     </en-table-layout>
 
-    <el-dialog :title.sync="formtitle" :visible.sync="formshow" width="50%">
+    <el-dialog :title.sync="formtitle" :visible.sync="formshow" width="70%">
       <div>
         <el-form ref="editform" :rules="rules" label-width="120px" :model="formmodel">
           <el-row>
@@ -119,117 +109,82 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="设备别名" prop="device_name">
-                <el-input v-model="formmodel.device_name" clearable :maxlength="20" placeholder="请输入设备别名" />
+              <el-form-item label="设备别名" prop="name">
+                <el-input v-model="formmodel.name" clearable :maxlength="20" placeholder="请输入设备别名" />
               </el-form-item>
             </el-col>
           </el-row>
-
           <el-row>
             <el-col :span="12">
-              <el-form-item label="出厂编号" prop="device_sn">
-                <el-input v-model="formmodel.device_sn" clearable placeholder="请输入出厂编号" />
+              <el-form-item label="出厂编号" prop="code">
+                <el-input v-model="formmodel.code" clearable placeholder="请输入出厂编号" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="设备型号" prop="device_model">
-                <el-input v-model="formmodel.device_model" clearable placeholder="请输入设备型号" />
+              <el-form-item label="设备型号" prop="model">
+                <el-input v-model="formmodel.model" clearable placeholder="请输入设备型号" />
               </el-form-item>
             </el-col>
           </el-row>
 
           <el-row>
             <el-col :span="12">
-              <el-form-item label="有线物理地址" prop="device_eth_mac">
-                <el-input v-model="formmodel.device_eth_mac" clearable placeholder="请输入物理MAC地址" />
+              <el-form-item label="有线物理地址" prop="eth_mac">
+                <el-input v-model="formmodel.eth_mac" clearable placeholder="请输入物理MAC地址" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="有线IP地址" prop="device_eth_ip">
-                <el-input v-model="formmodel.device_eth_ip" clearable :readonly="deviceEthIPReadonly" placeholder="请输入IP地址" />
+              <el-form-item label="有线IP地址" prop="eth_ip">
+                <el-input v-model="formmodel.eth_ip" clearable :readonly="deviceEthIPReadonly" placeholder="请输入IP地址" />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="WIFI物理地址" prop="device_wifi_mac">
-                <el-input v-model="formmodel.device_wifi_mac" clearable placeholder="请输入WIFI MAC地址" readonly />
+              <el-form-item label="WIFI物理地址" prop="wifi_mac">
+                <el-input v-model="formmodel.wifi_mac" clearable placeholder="请输入WIFI MAC地址" readonly />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="WIFIIP地址" prop="device_wifi_ip">
-                <el-input v-model="formmodel.device_wifi_ip" clearable placeholder="请输入WIFI IP地址" readonly />
+              <el-form-item label="WIFIIP地址" prop="wifi_ip">
+                <el-input v-model="formmodel.wifi_ip" clearable placeholder="请输入WIFI IP地址" readonly />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="软件版本" prop="device_soft_ver">
-                <el-input v-model="formmodel.device_soft_ver" clearable placeholder="请输入软件版本号" />
+              <el-form-item label="软件版本" prop="soft_ver">
+                <el-input v-model="formmodel.soft_ver" clearable placeholder="请输入软件版本号" />
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="硬件版本" prop="device_hard_ver">
-                <el-input v-model="formmodel.device_hard_ver" clearable placeholder="请输入硬件版本号" />
+              <el-form-item label="硬件版本" prop="hard_ver">
+                <el-input v-model="formmodel.hard_ver" clearable placeholder="请输入硬件版本号" />
               </el-form-item>
             </el-col>
           </el-row>
 
           <el-row>
             <el-col :span="12">
-              <el-form-item label="上级设备" prop="device_hosting_id">
-                <el-select v-model="formmodel.device_hosting_id" placeholder="请选择上级设备" :disabled="deviceHostingDisabled" clearable @change="hostDeviceChange">
-                  <el-option v-for="(item,index) in hostDevices" :key="index" :label="item.device_name" :value="item.id+''" />
-                </el-select>
+              <el-form-item label="WIFI热点">
+                <el-input v-model="formmodel.wifi_hostname" :readonly="wifiHostReadonly" clearable placeholder="请输入WIFI热点名称" />
               </el-form-item>
-
             </el-col>
             <el-col :span="12">
-              <el-form-item label="床位号" prop="device_bed_num">
-                <el-input v-model="formmodel.device_bed_num" :readonly="bedNameReadonly" clearable placeholder="请输入床位号" />
+              <el-form-item label="WIFI密码">
+                <el-input v-model="formmodel.wifi_password" :readonly="wifiHostReadonly" clearable placeholder="请输入WIFI热点密码" />
               </el-form-item>
             </el-col>
           </el-row>
 
           <el-row>
             <el-col :span="12">
-              <el-form-item label="安装病房名称" prop="device_room_id">
-                <el-select v-model="formmodel.device_room_id" :allow-create="roomNumAllowCreate" :filterable="roomNumAllowCreate" placeholder="请选择病房门口机" :disabled="roomNumDisabled" clearable @change="deviceRoomChange">
-                  <el-option v-for="(item,index) in doorDevices" :key="index" :label="item.device_room_num" :value="item.id" :disabled="roomOptionDisabed" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item v-if="false" label="WIFI热点" prop="device_wifi_hostname">
-                <el-input v-model="formmodel.device_wifi_hostname" :readonly="wifiHostReadonly" clearable placeholder="请输入WIFI热点名称" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="12">
-              <el-form-item label="" prop="device_status">
-                <el-checkbox v-model="formmodel.device_status" :true-label="1" :false-label="0">启用设备</el-checkbox>
+              <el-form-item label="" prop="status">
+                <el-checkbox v-model="formmodel.status" :true-label="1" :false-label="0">启用设备</el-checkbox>
               </el-form-item>
             </el-col>
             <el-col :span="12" />
           </el-row>
-
-          <div class="dashed">
-            <el-row>
-              <el-col :span="24">
-                <el-form-item label="分区配置">
-                  <el-checkbox v-model="formmodel.device_zone0" :true-label="1" :false-label="0">全局广播</el-checkbox>
-                  <el-checkbox v-model="formmodel.device_zone1" :true-label="1" :false-label="0">定时广播分区1</el-checkbox>
-                  <el-checkbox v-model="formmodel.device_zone2" :true-label="1" :false-label="0">定时广播分区2</el-checkbox>
-                  <el-checkbox v-model="formmodel.device_zone3" :true-label="1" :false-label="0">定时广播分区3</el-checkbox>
-                  <el-checkbox v-model="formmodel.device_zone4" :true-label="1" :false-label="0">定时广播分区4</el-checkbox>
-                  <el-checkbox v-model="formmodel.device_zone5" :true-label="1" :false-label="0">定时广播分区5</el-checkbox>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </div>
-
         </el-form>
 
       </div>
@@ -253,39 +208,11 @@
       </div>
     </el-dialog>
 
-    <el-dialog title="自动注册门口机环境设定" :visible.sync="appointRoomShow" width="30%">
-      <div>
-
-        <el-form ref="editformAppointRoom" :rules="rulesAppointRoom" label-width="120px" :model="formmodelAppointRoom">
-          <el-form-item label="" prop="room_appointed">
-            <el-checkbox v-model="formmodelAppointRoom.room_appointed" :true-label="1" :false-label="0" @change="roomAppointChange">是否开启指定房间注册</el-checkbox>
-          </el-form-item>
-          <el-form-item label="护士主机" prop="appoint_host_id">
-            <el-select v-model="formmodelAppointRoom.appoint_host_id" default-first-option placeholder="请选择护士主机" clearable @change="hostDeviceChange">
-              <el-option v-for="(item,index) in hostDevices" :key="index" :label="item.device_name" :value="item.id" />
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="选定门口机" prop="appoint_room_id">
-            <el-select v-model="formmodelAppointRoom.appoint_room_id" placeholder="请选择病房门口机" clearable @change="deviceRoomChange">
-              <el-option v-for="(item,index) in doorDevices" :key="index" :label="item.device_name+'---房号:'+item.device_room_num" :value="item.id" />
-            </el-select>
-          </el-form-item>
-        </el-form>
-      </div>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="appointRoomShow = false">取 消</el-button>
-        <el-button type="primary" @click.native.prevent="onSubmit">确 定</el-button>
-      </div>
-    </el-dialog>
-
   </div>
 </template>
 
 <script>
 import * as API_Device from '@/api/calling-device'
-import { runtimeUrl } from '@/utils/domain'
-import * as API_DeviceRegisterParams from '@/api/calling-deviceRegisterParams'
 export default {
 
   name: 'Index',
@@ -297,7 +224,7 @@ export default {
       createform: {},
       /** 表单数据 */
       formmodel: {
-        device_eth_ip: null
+        eth_ip: null
       },
       formmodel1: {
         manager_password: null
@@ -308,35 +235,25 @@ export default {
       formtitle: '新增设备',
       formshow: false, // 编辑表单显示开关
       formshow1: false,
-      appointRoomShow: false, // 自动注册时,选定门口机编辑窗口,编辑自动注册参数,选定门口机后将后续分机注册到该门口机下
       /** 表单校验 */
       rules: {
         device_type: [
           { required: true, message: '设备类型必须选择', trigger: 'blur' }
         ],
-        device_name: [
+        name: [
           { required: true, message: '设备别名必须填写', trigger: 'blur' }
         ],
-        device_sn: [
+        code: [
           { required: true, message: '设备出厂编号必须填写', trigger: 'blur' }
         ],
-        device_model: [
+        model: [
           { required: true, message: '设备型号必须填写', trigger: 'blur' }
         ],
-        device_hosting_id: [
-          { required: true, message: '上级设备必须选择', trigger: 'blur' }
-        ],
-        device_eth_mac: [
+        eth_mac: [
           { required: true, message: '设备有线MC地址必须填写', trigger: 'blur' }
         ],
-        device_eth_ip: [
+        eth_ip: [
           { required: true, message: '设备有线IP地址必须填写', trigger: 'blur' }
-        ],
-        device_room_id: [
-          { required: false, message: '安装病房必须选择', trigger: 'blur' }
-        ],
-        device_bed_num: [
-          { required: false, message: '床位号必须填写', trigger: 'blur' }
         ]
       },
       rulesAppointRoom: {
@@ -351,7 +268,7 @@ export default {
       params: {
         page_size: 20,
         page_no: 1,
-        fixedCondition: 'PARTID=' + this.$store.getters.partId,
+        fixedCondition: 'part_id=' + this.$store.getters.partId,
         sort: 'id',
         dir: 'desc'
       },
@@ -362,8 +279,6 @@ export default {
       multipleSelection: [],
       /** 表单提交指示 0 代表新增 1代表修改 */
       editflag: 0,
-      /** 护士主机可选项 */
-      hostDevices: [],
       /** 门口机可选项 病房号 */
       doorDevices: [],
       /** 房间号禁用 **/
@@ -392,73 +307,22 @@ export default {
     }
   },
   async mounted() {
-    this.getHostDevices(-1)
     this.getList()
-    this.initWebSocket()
   },
   methods: {
-
-    initWebSocket: function() {
-      var stockbase = runtimeUrl.replace('http', 'ws')
-      this.websock = new WebSocket(stockbase + '/deviceautoregister/' + this.$store.getters.uuid)
-      this.websock.onopen = this.websocketonopen
-      this.websock.onerror = this.websocketonerror
-      this.websock.onmessage = this.websocketonmessage
-      this.websock.onclose = this.websocketclose
-    },
-    websocketonopen: function() {
-      this.$message.success('WebStocket 连接成功,可开始自动注册设备。')
-      console.log('WebSocket连接成功')
-    },
-    websocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
-    },
-    websocketonmessage: function(e) {
-      const registerDevice = JSON.parse(e.data)
-      console.log(registerDevice)
-      if (registerDevice.code && registerDevice.code === 'success') {
-        this.$message({
-          type: 'success',
-          message: '设备注册成功![' + registerDevice.device_eth_mac + ']',
-          duration: 2000
-        })
-        this.getList()
-      } else {
-        this.$message({
-          type: 'error',
-          message: registerDevice.message,
-          duration: 2000
-        })
-      }
-      this.formmodel = { ...this.formmodel, ...registerDevice }
-      this.setFormStatus(this.formmodel.device_type)
-    },
-    websocketclose: function(e) {
-      console.log('connection closed (' + e.code + ')')
-    },
-
     /** 新增按钮 */
     async handlerAdd() {
-      this.nextIp = await API_Device.getNextIP()
+      // this.nextIp = await API_Device.getNextIP()
       this.deviceTypeDisabled = false
       this.formmodel = {
-        device_soft_ver: 'SV1.0',
-        device_hard_ver: 'HV1.0',
-        device_eth_mac: null,
-        device_eth_ip: this.nextIp,
-        device_wifi_mac: 'FF:FF:FF:FF:FF:FF',
-        device_wifi_ip: ' ',
-        device_room_num: ' ',
-        device_room_id: null,
-        device_zone0: 1,
-        device_zone1: 1,
-        device_zone2: 1,
-        device_zone3: 1,
-        device_zone4: 1,
-        device_zone5: 1,
-        device_human_type: 0,
-        device_status: 1,
-        device_hosting_id: null
+        part_id: this.$store.getters.partId,
+        soft_ver: 'SV1.0',
+        hard_ver: 'HV1.0',
+        eth_mac: null,
+        eth_ip: this.nextIp,
+        wifi_mac: 'FF:FF:FF:FF:FF:FF',
+        wifi_ip: ' ',
+        status: 1
       }
       if (this.$refs.editform) {
         this.$refs.editform.resetFields()
@@ -474,12 +338,6 @@ export default {
       }
       this.formmodel = { ...row }
       this.setFormStatus(this.formmodel.device_type)
-      /** 加载可用的门口机设备 */
-      if (this.formmodel.device_hosting_id !== null && this.formmodel.device_hosting_id !== '') {
-        await this.getDoorDevice()
-      } else {
-        this.doorDevices = []
-      }
       this.editflag = 1
       this.formtitle = '修改设备'
       this.formshow = true
@@ -659,107 +517,70 @@ export default {
         this.formmodel.device_room_num = value
       }
     },
-    /** 上级设备切换时 更新设备门口机可选择项 */
-    async hostDeviceChange(value) {
-      this.formmodel.device_room_id = '' // 清空已选择 安装病房
-      if (value !== '') {
-        const parentDevice = this.hostDevices.find(p => p.id === Number(value))
-        if (parentDevice.device_type === 1) {
-          this.doorDevices = await API_Device.getSubDevices(value, 3)
-        } else {
-          this.doorDevices = await API_Device.getSubDevices(value, 13)
-        }
-      } else {
-        this.doorDevices = []
-      }
-    },
     deviceTypeChange(value) {
-      this.rules.device_eth_mac[0].required = true
-      this.rules.device_eth_ip[0].required = true
-      this.rules.device_hosting_id[0].required = true // 上级设备 必选:护士主机不选
-      this.rules.device_room_id[0].required = false
-      this.rules.device_bed_num[0].required = false // 床位号必填
-      this.rules.device_sn[0].required = true // 设备出厂编号 ,总线转换盒不需要填写
+      this.rules.eth_mac[0].required = true
+      this.rules.eth_ip[0].required = true
+      this.rules.code[0].required = true // 设备出厂编号 ,总线转换盒不需要填写
       this.deviceHostingDisabled = false // 上级设备选择,默认启用:护士主机禁用
       this.roomNumDisabled = false // 房间号选择禁用:护士主机 医生主机 门口机
       this.bedNameReadonly = false // 床位号默认不用填写,例外:
       this.roomNumAllowCreate = false // 房间名称选择器是否可以创建条目:门口机设备需开启,门口机作为房其他设备的房间信息获取来源,需要自行填写。
       this.roomOptionDisabed = false // 房间名称选择器条目是否禁用,门口机类型需要禁用
       this.deviceEthIPReadonly = false // ip 地址只读
-      this.formmodel.device_eth_ip = this.nextIp
-      this.formmodel.device_eth_mac = null
+      this.formmodel.eth_ip = this.nextIp
+      this.formmodel.eth_mac = null
       this.wifiHostReadonly = true
-      this.formmodel.device_hosting_id = '' // 清空已选择上级设备
-      this.formmodel.device_room_id = '' // 清空已选择 安装病房
       if (value === 1) { // 护士主机
-        this.rules.device_hosting_id[0].required = false // 无需选择上级设备
         this.roomNumDisabled = true
         this.bedNameReadonly = true
         this.deviceHostingDisabled = true
       } else if (value === 2) {
         this.roomNumDisabled = true
         this.bedNameReadonly = true
-        this.getHostDevices(1)
       } else if (value === 3) {
         this.bedNameReadonly = true
         this.roomNumAllowCreate = true // 门口机需要填写房间名称
         this.roomOptionDisabed = true
         this.wifiHostReadonly = false
-        this.rules.device_room_id[0].required = true
-        this.getHostDevices(1)
       } else if (value === 4) { // 病床分机
-        this.rules.device_room_id[0].required = true // 安装房间必须选择
-        this.rules.device_bed_num[0].required = true // 床位必须填写
-        this.getHostDevices(1)
       } else if (value === 6) {
         this.roomNumDisabled = true
         this.bedNameReadonly = true
       } else if (value === 11) {
-        this.rules.device_sn[0].required = false
+        this.rules.code[0].required = false
         this.roomNumDisabled = true
         this.bedNameReadonly = true
-        this.getHostDevices(1)
       } else if (value === 12) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
-        this.formmodel.device_eth_ip = null
-        this.formmodel.device_eth_mac = '1000'
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
+        this.formmodel.eth_ip = null
+        this.formmodel.eth_mac = '1000'
         this.deviceEthIPReadonly = true
-        this.rules.device_room_id[0].required = true // 安装房间必须选择
-        this.rules.device_bed_num[0].required = true
-        this.getHostDevices(11)
       } else if (value === 13) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
-        this.formmodel.device_eth_ip = null
-        this.formmodel.device_eth_mac = '3000'
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
+        this.formmodel.eth_ip = null
+        this.formmodel.eth_mac = '3000'
         this.deviceEthIPReadonly = true
         this.bedNameReadonly = true
-        this.getHostDevices(11)
       } else if (value === 14) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
-        this.formmodel.device_eth_ip = null
-        this.formmodel.device_eth_mac = '2000'
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
+        this.formmodel.eth_ip = null
+        this.formmodel.eth_mac = '2000'
         this.deviceEthIPReadonly = true
         this.bedNameReadonly = true
-        this.getHostDevices(11)
       } else if (value === 16) {
-        this.rules.device_eth_mac[0].required = true
-        this.rules.device_sn[0].required = false
-        this.rules.device_room_id[0].required = true // 安装房间必须选择
+        this.rules.eth_mac[0].required = true
+        this.rules.code[0].required = false
         this.deviceEthIPReadonly = true
-        this.getHostDevices(1)
       }
     },
     setFormStatus(value) {
       this.deviceTypeDisabled = true // 不允许修改设备类型
-      this.rules.device_eth_mac[0].required = true
-      this.rules.device_eth_ip[0].required = true
-      this.rules.device_hosting_id[0].required = true // 上级设备 必选:护士主机不选
-      this.rules.device_room_id[0].required = false
-      this.rules.device_bed_num[0].required = false // 床位号必填
-      this.rules.device_sn[0].required = true // 设备出厂编号 ,总线转换盒不需要填写
+      this.rules.eth_mac[0].required = true
+      this.rules.eth_ip[0].required = true
+      this.rules.code[0].required = true // 设备出厂编号 ,总线转换盒不需要填写
       this.deviceHostingDisabled = false // 上级设备选择,默认启用:护士主机禁用
       this.roomNumDisabled = false // 房间号选择禁用:护士主机 医生主机 门口机
       this.bedNameReadonly = false // 床位号默认不用填写,例外:
@@ -768,93 +589,41 @@ export default {
       this.deviceEthIPReadonly = false // ip 地址只读
       this.wifiHostReadonly = true
       if (value === 1) { // 护士主机
-        this.rules.device_hosting_id[0].required = false // 无需选择上级设备
         this.roomNumDisabled = true
         this.bedNameReadonly = true
         this.deviceHostingDisabled = true
-        this.getHostDevices(1)
       } else if (value === 2) {
         this.roomNumDisabled = true
         this.bedNameReadonly = true
-        this.getHostDevices(1)
       } else if (value === 3) {
         this.bedNameReadonly = true
         this.roomNumAllowCreate = true // 门口机需要填写房间名称
         this.roomOptionDisabed = true
         this.wifiHostReadonly = false
-        this.getHostDevices(1)
       } else if (value === 4) { // 病床分机
-        this.rules.device_room_id[0].required = true // 安装房间必须选择
-        this.rules.device_bed_num[0].required = true // 床位必须填写
-        this.getHostDevices(1)
       } else if (value === 6) {
         this.roomNumDisabled = true
         this.bedNameReadonly = true
-        this.getHostDevices(1)
       } else if (value === 11) {
-        this.rules.device_sn[0].required = false
+        this.rules.code[0].required = false
         this.roomNumDisabled = true
         this.bedNameReadonly = true
-        this.getHostDevices(1)
       } else if (value === 12) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
         this.deviceEthIPReadonly = true
-        this.rules.device_room_id[0].required = true // 安装房间必须选择
-        this.rules.device_bed_num[0].required = true
-        this.getHostDevices(11)
       } else if (value === 13) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
         this.deviceEthIPReadonly = true
         this.bedNameReadonly = true
-        this.getHostDevices(11)
       } else if (value === 14) {
-        this.rules.device_eth_mac[0].required = false
-        this.rules.device_eth_ip[0].required = false
+        this.rules.eth_mac[0].required = false
+        this.rules.eth_ip[0].required = false
         this.deviceEthIPReadonly = true
         this.bedNameReadonly = true
-        this.getHostDevices(11)
-      }
-    },
-    async getDoorDevice() {
-      const simulate = await API_Device.getSubDevices(this.formmodel.device_hosting_id, 13)
-      const digtal = await API_Device.getSubDevices(this.formmodel.device_hosting_id, 3)
-      this.doorDevices = [...simulate, ...digtal]
-    },
-    async getHostDevices(type) {
-      const nurseHosts = await API_Device.getDeviceByType(this.$store.getters.partId, 1)
-      const transfers = await API_Device.getDeviceByType(this.$store.getters.partId, 11)
-      if (type === 1) {
-        this.hostDevices = [...nurseHosts]
-      } else if (type === 11) {
-        this.hostDevices = [...transfers]
-      } else {
-        this.hostDevices = [...nurseHosts, ...transfers]
       }
     },
-    addVirtualDevice(type) {
-      const param = {
-        partid: this.$store.getters.partId,
-        devicetype: type
-      }
-      API_Device.addVirtualDevice(param).then(res => {
-        this.getList()
-      })
-    },
-    /** 设备初始化测试数据,为病床分机写入测试住院信息,测试通话 功能*/
-    initTest() {
-      API_Device.addTestData().then(res => {
-        this.getList()
-        this.$message.success('写入数据成功!')
-      })
-    },
-    deleteTest() {
-      API_Device.deleteTestData().then(res => {
-        this.$message.success('擦除数据成功!')
-        this.getList()
-      })
-    },
     editLockChange(val) {
       if (val) {
         this.formshow1 = true
@@ -872,37 +641,6 @@ export default {
         this.$message.error('密码错误!')
       }
     },
-    async appointRoom() {
-      const registparam = await API_DeviceRegisterParams.get()
-      if (registparam === '') {
-        this.formmodelAppointRoom = {}
-      } else {
-        this.formmodelAppointRoom = { ...registparam }
-      }
-      if (this.formmodelAppointRoom.device_register_part_id === undefined) {
-        this.$message.error('请先设定自动注册参数!')
-        return false
-      } else if (this.formmodelAppointRoom.device_register_part_id !== Number(this.$store.getters.partId)) {
-        this.$message.error('设备自动注册的科室与当前科室不一致,请更改设置!')
-        return false
-      }
-      this.appointRoomShow = true
-    },
-    /** 更新自动注册参数 */
-    onSubmit() {
-      this.$refs['editformAppointRoom'].validate((valid) => {
-        if (valid) {
-          API_DeviceRegisterParams.update(this.formmodelAppointRoom).then(res => {
-            this.$message.success('保存成功!')
-            this.appointRoomShow = false
-          }).catch(err => {
-            this.$message.error(err.message)
-          })
-        } else {
-          this.$message.error('表单填写错误,请检查!')
-        }
-      })
-    },
     roomAppointChange(val) {
       if (val === 1) {
         this.rulesAppointRoom.appoint_host_id[0].required = true

+ 779 - 0
src/views/customer/customerEdit.vue

@@ -0,0 +1,779 @@
+<template>
+  <div class="formwrap">
+
+    <el-form :model="formmodel" :rules="rules" ref="editForm" label-width="140px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="病人姓名" prop="name">
+            <el-input v-model="formmodel.name" clearable placeholder="请输入姓名" :maxlength="20"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="床位" prop="frame_name">
+            <el-select placeholder="请选择床位" v-model="formmodel.frame_id">
+              <el-option-group
+                v-for="group in frameBeds"
+                :key="group.name"
+                :label="group.name+' 房'">
+                <el-option
+                  v-for="item in group.children"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id">
+                  <div class="el-col-lg-offset-1">{{item.name}} 床</div>
+                </el-option>
+              </el-option-group>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="性别" class="form-item-sex">
+            <el-radio v-model="formmodel.sex" :label="1" checked>男</el-radio>
+            <el-radio v-model="formmodel.sex" :label="2">女</el-radio>
+            <el-radio v-model="formmodel.sex" :label="3">未知</el-radio>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item label="年龄" prop="age">
+            <el-input placeholder="请输入年龄" size="small" type="number"  :controls="false" :min="1"
+                             :max="150" v-model="formmodel.age">
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="年龄单位">
+            <el-radio v-model="formmodel.age_unit" :label="0" checked>岁</el-radio>
+            <el-radio v-model="formmodel.age_unit" :label="1">月</el-radio>
+            <el-radio v-model="formmodel.age_unit" :label="2">天</el-radio>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="责任医生" prop="doctor_id">
+            <el-select placeholder="请选择医生" clearable v-model="formmodel.doctor_id" @change="doctorChange">
+              <el-option :label="item.name" :key="index" v-for="(item,index) in doctors" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="责任护士" prop="nurse_id">
+            <el-select placeholder="请选择护士" clearable v-model="formmodel.nurse_id" @change="doctorChange">
+              <el-option :label="item.name" :key="index" v-for="(item,index) in nurses" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="责任护工" prop="aide_id">
+            <el-select placeholder="请选择护工" clearable v-model="formmodel.aide_id" @change="doctorChange">
+              <el-option :label="item.name" :key="index" v-for="(item,index) in aides" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="护理等级" prop="grade_level">
+            <el-select placeholder="请选择护理等级" clearable v-model="formmodel.grade_level">
+              <el-option :label="item.value" :key="index" v-for="(item,index) in gradeLevels" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="16">
+          <el-form-item label="在院状态">
+            <el-radio v-model="formmodel.status" :label="1" checked>在院</el-radio>
+            <el-radio v-model="formmodel.status" :label="0">已出院</el-radio>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="剂量级别" prop="dosage_level">
+            <el-select placeholder="请选择剂量级别" clearable v-model="formmodel.dosage_level">
+              <el-option :label="item.value" :key="index" v-for="(item,index) in dosageLevels" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="饮食级别" prop="diet_level">
+            <el-select placeholder="请选择饮食级别" clearable v-model="formmodel.diet_level">
+              <el-option :label="item.value" :key="index" v-for="(item,index) in dietLevels" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="隔离级别" prop="insulate_level">
+            <el-select placeholder="请选择隔离级别" clearable v-model="formmodel.insulate_level">
+              <el-option :label="item.value" :key="index" v-for="(item,index) in insulateLevels" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="过敏级别" prop="alleray_level">
+            <el-select placeholder="请选择过敏级别" clearable v-model="formmodel.alleray_level">
+              <el-option :label="item.value" :key="index" v-for="(item,index) in allerayLevels" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-card style="maring:15px">
+        <h4>其它信息</h4>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="身份证号" prop="idcard">
+              <el-input v-model="formmodel.idcard" clearable :maxlength="20"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="生日" prop="birthday">
+              <el-date-picker
+                v-model="formmodel.birthday"
+                type="date"
+                :editable="false"
+                value-format="timestamp"
+                placeholder="选择生日"
+                :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="病人住院流水号" prop="his_phoc_id">
+              <el-input v-model="formmodel.his_phoc_id" clearable :maxlength="30"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="病人住院号" prop="his_id">
+              <el-input v-model="formmodel.his_id" clearable :maxlength="30"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="医疗卡号" prop="card_id">
+              <el-input v-model="formmodel.card_id" clearable :maxlength="30"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="过院次数" prop="intimes">
+              <el-input-number v-model="formmodel.intimes" placeholder="请输入过院次数" size="small" type="number" :controls="false" :maxlength="20">
+              </el-input-number>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="入院日期" prop="in_date">
+              <el-date-picker
+                v-model="formmodel.in_date"
+                type="date"
+                :editable="false"
+                value-format="timestamp"
+                placeholder="选择入院日期"
+                :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="出院日期" prop="out_date">
+              <el-date-picker
+                v-model="formmodel.out_date"
+                type="date"
+                :editable="false"
+                value-format="timestamp"
+                placeholder="选择出院日期"
+                :picker-options="{disabledDate(time) { return time.getTime() < Date.now() }}">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="姓名拼音首码" prop="name_py">
+              <el-input v-model="formmodel.name_py" clearable :maxlength="10" readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="联系电话" prop="mobile">
+              <el-input v-model="formmodel.mobile" :maxlength="11"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+
+        <el-row>
+          <el-col :span="16">
+            <el-form-item label="病况描述" prop="illness_description">
+              <el-input
+                type="textarea"
+                :autosize="{ minRows: 2, maxRows: 4}"
+                :minlength="2"
+                :maxlength="20"
+                :placeholder="'请输入文本内容,长度2~20'"
+                v-model="formmodel.illness_description">
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        </el-row>
+          <el-col :span="16">
+            <el-form-item label="家庭地址" prop="address">
+              <el-input
+                type="textarea"
+                :autosize="{ minRows: 2, maxRows: 4}"
+                :minlength="2"
+                :maxlength="20"
+                :placeholder="'请输入文本内容,长度2~20'"
+                v-model="formmodel.address">
+              </el-input>
+            </el-form-item>
+          </el-col>
+      </el-card>
+
+      <el-form-item style="margin-top:15px;">
+        <el-button type="primary" @click="handlerSubmit('editForm')" class="save">保存修改</el-button>
+      </el-form-item>
+    </el-form>
+
+  </div>
+
+</template>
+
+<script>
+  import { UE } from '@/components'
+  // import * as PatientInfo_API from '@/api/patientInfo'
+  // import * as Employee_API from '@/api/employee'
+  // import * as NurseConfig_API from '@/api/nurseConfig'
+  // import * as HospitalFrame_API from '@/api/hospitalFrame'
+  import * as RegExp from '@/utils/RegExp'
+
+  export default {
+    name: 'patientInfoEdit',
+    components: {
+      [UE.name]: UE
+    },
+    props: {
+      formmodel: {
+        type: Object,
+        default: () => ({})
+      }
+    },
+    data: function() {
+      return {
+        id: this.$route.params.id,
+        imageUrl: '',
+        uploadurl: '/uploaders/uploadFile',
+        usertags: [],
+        /** 输入校验 */
+        rules: {
+          name: [
+            this.MixinRequired('请输入真实姓名!'),
+            { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
+            {
+              validator: (rule, value, callback) => {
+                if (!RegExp.userName.test(value)) {
+                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ],
+          age: [{
+            required: true, message: '请输入年龄', trigger: 'blur'
+          }],
+          age_unit: [{
+            required: true, message: '请选择年龄单位', trigger: 'blur'
+          }],
+          // birthday: [{
+          //   required: true, message: '请选择生日', trigger: 'blur'
+          // }],
+          // his_phoc_id: [{
+          //   required: true, message: '请输入病人住院流水号', trigger: 'blur'
+          // }],
+          // his_id: [{
+          //   required: true, message: '请输入病人住院号', trigger: 'blur'
+          // }],
+          // card_id: [{
+          //   required: true, message: '请输入医疗卡号', trigger: 'blur'
+          // }],
+          // intimes: [{
+          //   required: true, message: '请输入过院次数', trigger: 'blur'
+          // }],
+          // illness_description: [{
+          //   required: true, message: '请输入病况描述', trigger: 'blur'
+          // }],
+          // address: [{
+          //   required: true, message: '请输入家庭地址', trigger: 'blur'
+          // }],
+          mobile: [
+            // this.MixinRequired('联系电话不能为空!'),
+            {
+              validator: (rule, value, callback) => {
+                if (!value) {
+                  callback()
+                }
+                if (!RegExp.mobile.test(value)) {
+                  callback(new Error('联系电话格式不正确!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ],
+          idcard: [
+            // this.MixinRequired('身份证不能为空!'),
+            {
+              validator: (rule, value, callback) => {
+                if (!value) {
+                  callback()
+                }
+                if (!RegExp.IDCard.test(value)) {
+                  callback(new Error('身份证格式不正确!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ]
+        },
+        /** 选择医院结构 */
+        frameBeds: [],
+        editFrameDialogVisible: false,
+        chooseFrameForm: {},
+        chooseFrameFormRules: {
+          frame_id: [this.MixinRequired('医院结构必须选择!')]
+        },
+        /** 选择设备 */
+        editDeviceDialogVisible: false,
+        chooseDeviceForm: {},
+        chooseDeviceFormRules: {
+          device_id: [this.MixinRequired('设备必须选择!')]
+        },
+        /** 选择医生 */
+        doctors: [],
+        editDoctorDialogVisible: false,
+        chooseDoctorForm: {},
+        chooseDoctorFormRules: {
+          doctor_id: [this.MixinRequired('医生必须选择!')]
+        },
+        /** 选择护士 */
+        nurses: [],
+        editNurseDialogVisible: false,
+        chooseNurseForm: {},
+        chooseNurseFormRules: {
+          nurse_id: [this.MixinRequired('医生必须选择!')]
+        },
+        /** 选择护工 */
+        aides: [],
+        editAideDialogVisible: false,
+        chooseAideForm: {},
+        chooseAideFormRules: {
+          aide_id: [this.MixinRequired('医生必须选择!')]
+        },
+        /** 选择护理等级配置 */
+        gradeLevels: [],
+        editGradeLevelDialogVisible: false,
+        chooseGradeLevelForm: {},
+        chooseGradeLevelFormRules: {
+          grade_level: [this.MixinRequired('护理等级配置必须选择!')]
+        },
+        /** 选择剂量级别配置 */
+        dosageLevels: [],
+        editDosageLevelDialogVisible: false,
+        chooseDosageLevelForm: {},
+        chooseDosageLevelFormRules: {
+          dosage_level: [this.MixinRequired('剂量级别配置必须选择!')]
+        },
+        /** 选择饮食级别配置 */
+        dietLevels: [],
+        editDietLevelDialogVisible: false,
+        chooseDietLevelForm: {},
+        chooseDietLevelFormRules: {
+          diet_level: [this.MixinRequired('饮食级别配置必须选择!')]
+        },
+        /** 选择隔离级别配置 */
+        insulateLevels: [],
+        editInsulateLevelDialogVisible: false,
+        chooseInsulateLevelForm: {},
+        chooseInsulateLevelFormRules: {
+          insulate_level: [this.MixinRequired('隔离级别配置必须选择!')]
+        },
+        /** 选择过敏级别配置 */
+        allerayLevels: [],
+        editAllerayLevelDialogVisible: false,
+        chooseAllerayLevelForm: {},
+        chooseAllerayLevelFormRules: {
+          alleray_level: [this.MixinRequired('过敏级别配置必须选择!')]
+        }
+      }
+    },
+    mounted() {
+      console.log(this.formmodel)
+      this.getEmployees()
+      this.getNurseConfigs()
+      this.getFrameBeds()
+    },
+    activated() {
+    },
+    watch: {
+      'formmodel': function(newval) {
+        console.log(newval)
+      }
+    },
+
+    methods: {
+      getEmployees() {
+        const params = { page_size: 10000, page_no: 1 }
+        // Employee_API.getEmployeeList(params).then(response => {
+        //   if (response.data) {
+        //     this.doctors = response.data.filter((item) => {
+        //       return item.type === 0
+        //     })
+        //     this.nurses = response.data.filter((item) => {
+        //       return item.type === 1
+        //     })
+        //     this.aides = response.data.filter((item) => {
+        //       return item.type === 2
+        //     })
+        //   }
+        // })
+      },
+      getNurseConfigs() {
+        const params = { page_size: 10000, page_no: 1 }
+        // NurseConfig_API.getNurseConfigList(params).then(response => {
+        //   if (response.data) {
+        //     this.gradeLevels = response.data.filter(item => {
+        //       return item.nurse_level === 0
+        //     })
+        //     this.dosageLevels = response.data.filter(item => {
+        //       return item.nurse_level === 1
+        //     })
+        //     this.dietLevels = response.data.filter(item => {
+        //       return item.nurse_level === 2
+        //     })
+        //     this.insulateLevels = response.data.filter(item => {
+        //       return item.nurse_level === 3
+        //     })
+        //     this.allerayLevels = response.data.filter(item => {
+        //       return item.nurse_level === 4
+        //     })
+        //   }
+        // })
+      },
+      getFrameBeds() {
+        const params = { page_size: 10000, page_no: 1 }
+        // HospitalFrame_API.getHospitalFrameList(params).then(response => {
+        //   if (response.data) {
+        //     this.frameBeds = response.data
+        //   }
+        // })
+      },
+      doctorChange(item) {
+        console.log(item)
+      },
+      /** 保存按钮处理事件 */
+      handlerSubmit(formName) {
+        this.$refs[formName].validate(valid => {
+          if (valid) {
+            const params = this.MixinClone(this.formmodel)
+            if (params.id) {
+              // PatientInfo_API.updatePatientInfo(params.id, params).then(response => {
+              //   this.$message.success('修改成功!')
+              //   this.$emit('saved')
+              // })
+            } else {
+              // PatientInfo_API.addPatientInfo(params).then(response => {
+              //   this.$message.success('添加成功!')
+              //   this.$emit('saved')
+              // })
+            }
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+            return false
+          }
+        })
+      },
+      /** 图片上传之前的校验 */
+      handleShopLogoBefore(file) {
+        return new Promise((resolve, reject) => {
+          const isImg = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif'
+          const isLt2M = file.size / 1024 / 1024 < 2
+
+          if (!isImg) {
+            this.$message.error('上传头像图片只能是 JPG、PNG、GIF 格式!')
+            reject()
+          }
+          if (!isLt2M) {
+            this.$message.error('上传头像图片大小不能超过 2MB!')
+            reject()
+          }
+
+          let reader = new FileReader()
+          reader.onload = (event) => {
+            let image = new Image()
+            image.onload = () => {
+              let width = image.width
+              let height = image.height
+              if (width > 500 || width < 100) {
+                this.$message.error('图片宽度必须在100~500之间,宽高比为1:1!')
+                reject()
+              }
+              if (width !== height) {
+                this.$message.error('请上传宽高比为1:1的图片')
+                reject()
+              }
+              if (height > 500 || height < 100) {
+                this.$message.error('图片高度必须在100~500之间!')
+                reject()
+              }
+              resolve()
+            }
+            image.src = event.target.result
+          }
+          reader.readAsDataURL(file)
+        })
+      },
+
+      /** 上传成功后的钩子 更换图片 置空存储数组*/
+      uploaded(response) {
+        this.imageUrl = response.url
+        this.formmodel.face = response.url
+      },
+      /** 选择医院结构按钮*/
+      handleAddFrame() {
+        this.editFrameDialogVisible = true
+      },
+      editchooseFrameForm() {
+        this.$refs['chooseFrameForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.frame_id = this.chooseFrameForm.frame_id
+            this.formmodel.frame_name = this.chooseFrameForm.frame_name
+            this.editFrameDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择设备按钮*/
+      handleAddDevice() {
+        this.editDeviceDialogVisible = true
+      },
+      editchooseDeviceForm() {
+        this.$refs['chooseDeviceForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.device_id = this.chooseDeviceForm.device_id
+            this.formmodel.device_code = this.chooseDeviceForm.device_code
+            this.editDeviceDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+
+      /** 选择医生按钮*/
+      handleAddDoctor() {
+        this.editDoctorDialogVisible = true
+      },
+      editchooseDoctorForm() {
+        this.$refs['chooseDoctorForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.doctor_id = this.chooseDoctorForm.doctor_id
+            this.formmodel.doctor_name = this.chooseDoctorForm.doctor_name
+            this.editDoctorDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择护士按钮*/
+      handleAddNurse() {
+        this.editNurseDialogVisible = true
+      },
+      editchooseNurseForm() {
+        this.$refs['chooseNurseForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.nurse_id = this.chooseNurseForm.nurse_id
+            this.formmodel.nurse_name = this.chooseNurseForm.nurse_name
+            this.editNurseDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择护工按钮*/
+      handleAddAide() {
+        this.editAideDialogVisible = true
+      },
+      editchooseAideForm() {
+        this.$refs['chooseAideForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.aide_id = this.chooseAideForm.aide_id
+            this.formmodel.aide_name = this.chooseAideForm.aide_name
+            this.editAideDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择护理等级配置按钮*/
+      handleAddGradeLevel() {
+        this.editGradeLevelDialogVisible = true
+      },
+      editchooseGradeLevelForm() {
+        this.$refs['chooseGradeLevelForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.grade_level = this.chooseGradeLevelForm.grade_level
+            this.formmodel.grade_level_name = this.chooseGradeLevelForm.grade_level_name
+            this.editGradeLevelDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择剂量级别配置按钮*/
+      handleAddDosageLevel() {
+        this.editDosageLevelDialogVisible = true
+      },
+      editchooseDosageLevelForm() {
+        this.$refs['chooseDosageLevelForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.dosage_level = this.chooseDosageLevelForm.dosage_level
+            this.formmodel.dosage_level_name = this.chooseDosageLevelForm.dosage_level_name
+            this.editDosageLevelDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择饮食级别配置按钮*/
+      handleAddDietLevel() {
+        this.editDietLevelDialogVisible = true
+      },
+      editchooseDietLevelForm() {
+        this.$refs['chooseDietLevelForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.diet_level = this.chooseDietLevelForm.diet_level
+            this.formmodel.diet_level_name = this.chooseDietLevelForm.diet_level_name
+            this.editDietLevelDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择隔离级别配置按钮*/
+      handleAddInsulateLevel() {
+        this.editInsulateLevelDialogVisible = true
+      },
+      editchooseInsulateLevelForm() {
+        this.$refs['chooseInsulateLevelForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.insulate_level = this.chooseInsulateLevelForm.insulate_level
+            this.formmodel.insulate_level_name = this.chooseInsulateLevelForm.insulate_level_name
+            this.editInsulateLevelDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      },
+      /** 选择过敏级别配置按钮*/
+      handleAddAllerayLevel() {
+        this.editAllerayLevelDialogVisible = true
+      },
+      editchooseAllerayLevelForm() {
+        this.$refs['chooseAllerayLevelForm'].validate((valid, error) => {
+          if (valid) {
+            this.formmodel.alleray_level = this.chooseAllerayLevelForm.alleray_level
+            this.formmodel.alleray_level_name = this.chooseAllerayLevelForm.alleray_level_name
+            this.editAllerayLevelDialogVisible = false
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+          }
+        })
+      }
+    }
+  }
+</script>
+
+<style type="text/scss" scoped>
+
+
+  .formwrap /deep/ .el-tabs__content {
+    overflow: visible !important;
+  }
+
+  .formwrap /deep/ .app-address-title {
+    height: 32px !important;
+    line-height: 32px !important;
+  }
+
+  .formwrap /deep/ .app-address {
+    width: 100% !important;
+  }
+
+
+  .el-select {
+    width: 100%;
+  }
+
+  .el-date-editor {
+    width: 100%;
+  }
+
+  .formwrap {
+    border: 1px solid #ebebeb;
+    border-radius: 3px;
+    background: #fff;
+    padding: 24px;
+    min-height: 700px;
+  }
+
+  .app-address {
+    margin-top: 4px;
+    z-index: 1;
+  }
+
+  .area-tip {
+    color: #666;
+    margin-left: 10px;
+  }
+
+  /deep/ .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+
+  /deep/ .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+
+  /deep/ .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 200px;
+    height: 200px;
+    line-height: 200px;
+    text-align: center;
+  }
+
+  /deep/ .avatar {
+    width: 200px;
+    height: 200px;
+    display: block;
+  }
+
+</style>

+ 449 - 0
src/views/hospitalFrame/hospitalFrame.vue

@@ -0,0 +1,449 @@
+<template>
+  <div>
+    <div id="add-new-group">
+      <i class="add-btn" @click="frameAddVisible = true">+</i>
+      <div v-show="frameAddVisible" class="add-div">
+        <span class="add-div-title">房间</span>
+        <input v-model="frameName">
+        <el-button type="text" size="mini" @click="handleAddRoom">保存</el-button>
+        <el-button type="text" size="mini" @click="frameAddVisible = false">取消</el-button>
+      </div>
+    </div>
+    <div id="params-container" v-if="hospital_frame">
+      <el-card>
+        <div slot="header" class="clearfix">
+          <span><i class="el-icon-school"></i>科室</span>
+        </div>
+        <div>
+          <el-button type="text" class="add-params-btn" @click="handlePartDevice"><i class="el-icon-cpu"></i> 查看设备 [{{hospital_frame.device_count}}]</el-button>
+        </div>
+      </el-card>
+      <el-card v-if="hospital_frame.frame_room_vos" v-for="(item,index) in hospital_frame.frame_room_vos" :key="index">
+        <div slot="header" class="clearfix" v-if="item.frame_room!=null">
+          <span><i class="el-icon-house"></i> {{ item.frame_room.name }} 房</span>
+          <el-dropdown trigger="click" @command="handleGroupCommand" style="float: right">
+            <span class="el-dropdown-link">操作<i class="el-icon-arrow-down el-icon--right"></i></span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item :command="{type: 'edit', frame: item.frame_room}">编辑</el-dropdown-item>
+              <el-dropdown-item :command="{type: 'delete', frame: item.frame_room}">删除</el-dropdown-item>
+              <el-dropdown-item :command="{type: 'device', frame: item.frame_room}" divided><i class="el-icon-cpu"></i> 设备 {{item.device_count}}</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+        <template v-if="item.frame_bed_vos && item.frame_bed_vos.length > 0">
+          <div v-for="(subItem, i) in item.frame_bed_vos" :key="i" class="param-item">
+            <span><i class="el-icon-s-flag"></i> {{ subItem.frame_bed.name }} 床</span>
+            <span v-if="subItem.customer_member_id">
+          <el-button size="mini" plain round @click="handleEditPatient(subItem.customer_member_id)"><i class="el-icon-user"></i> {{ subItem.customer_name}}</el-button>
+        </span>
+            <span v-else>
+          <el-button size="mini" type="success" plain round @click="handleAddPatient(subItem.frame_bed)"><i class="el-icon-circle-plus-outline"></i> 病人</el-button>
+        </span>
+            <span>
+          <el-dropdown size="mini" @command="handleGroupCommand">
+            <span class="el-dropdown-link">操作<i class="el-icon-arrow-down el-icon--right"></i></span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item :command="{type: 'edit', frame: subItem.frame_bed}">编辑</el-dropdown-item>
+              <el-dropdown-item :command="{type: 'delete', frame: subItem.frame_bed}" style="color: #F56C6C">删除</el-dropdown-item>
+              <el-dropdown-item :command="{type: 'device', frame: subItem.frame_bed}" divided><i class="el-icon-cpu"></i> 设备 {{subItem.device_count.length}}
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </span>
+          </div>
+          <el-button type="text" class="add-params-btn" @click="handleAddFrame(item.frame_room.id)"><i class="el-icon-circle-plus"></i> 添加床位</el-button>
+        </template>
+        <template v-else>
+          <div class="param-item empty">暂无数据...</div>
+          <el-button type="text" class="add-params-btn" @click="handleAddFrame(item.frame_room.id)"><i class="el-icon-circle-plus"></i> 添加床位</el-button>
+        </template>
+      </el-card>
+    </div>
+
+
+
+
+<!--    <el-dialog-->
+<!--      title="病人信息"-->
+<!--      :visible.sync="dialogPatientVisible"-->
+<!--      width="85%"-->
+<!--    >-->
+<!--      <customer-edit :formmodel="patientInfo" @saved="handlePatientFinished"></customer-edit>-->
+<!--    </el-dialog>-->
+
+    <el-dialog title="科室结构" :visible.sync="dialogFrameVisible" width="500px">
+      <el-form :model="frameInfo" :rules="rules" ref="editForm" label-width="110px">
+        <el-row>
+          <el-col :span="24">
+            <!--医院结构名称-->
+            <el-form-item label="名称" prop="name">
+              <el-input v-model="frameInfo.name" :maxlength="20">
+                <template slot="append">{{frameInfo.type === 4?"房":"床"}}</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <!--医院结构别名-->
+            <el-form-item label="别名" prop="alias">
+              <el-input v-model="frameInfo.alias" :maxlength="20"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row hidden>
+          <el-col :span="12">
+            <el-form-item label="类型">
+              <el-radio v-model="frameInfo.type" :label="1">病房</el-radio>
+              <el-radio v-model="frameInfo.type" :label="2">床位</el-radio>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-form-item>
+          <el-button type="primary" @click="handlerSubmit('editForm')" class="save">保存修改</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+
+<!--    <el-drawer-->
+<!--      title="设备"-->
+<!--      :visible.sync="deviceVisible"-->
+<!--      :append-to-body="true"-->
+<!--      size="50%"-->
+<!--      >-->
+<!--      <device-info :frame-id="frameId"></device-info>-->
+<!--    </el-drawer>-->
+  </div>
+</template>
+
+<script>
+  import * as HospitalFrame_API from '@/api/hospitalFrame'
+  import * as RegExp from "@/utils/RegExp";
+  // import customerEdit from '@/views/customer/customerEdit'
+  // import DeviceInfo from '@/views/calling-device/deviceInfo'
+
+  export default {
+    name: 'hospitalFrame',
+    // components: { DeviceInfo, HospitalFrameEdit, customerEdit },
+    data: function() {
+      return {
+        hospital_frame: null,
+        frameAddVisible: false,
+        frameName: '',
+        dialogPatientVisible: false,
+        patientInfo: {},
+        dialogFrameVisible: false,
+        frameInfo: {},
+        deviceVisible: false,
+        frameId: 0,
+        rules: {
+          name: [
+            this.MixinRequired('请输入名称!'),
+            { min: 1, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
+            {
+              validator: (rule, value, callback) => {
+                if (!RegExp.userName.test(value)) {
+                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ],
+          alias: [
+            { min: 1, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
+            {
+              validator: (rule, value, callback) => {
+                if (!value) {
+                  callback()
+                }
+                if (!RegExp.userName.test(value)) {
+                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
+                } else {
+                  callback()
+                }
+              }
+            }
+          ]
+        },
+      }
+    },
+    activated() {
+      this.GET_All()
+    },
+    mounted() {
+      this.GET_All()
+    },
+    watch: {
+      deviceVisible: function(newData) {
+        console.log(newData)
+        if (!newData) {
+          this.GET_All()
+        }
+      }
+    },
+    methods: {
+      GET_All() {
+        HospitalFrame_API.getHospitalFrameList(this.$store.getters.partId).then(response => {
+          if (response) {
+            console.log(response)
+            this.hospital_frame = response
+          }
+        }).catch(response => {
+          this.$message({
+            type: 'info',
+            message: response.message
+          })
+        })
+      },
+      /** 下拉触发 */
+      handleGroupCommand(object) {
+        switch (object.type) {
+          case 'edit':
+            this.handelEditFrame(object.frame)
+            break
+          case 'delete':
+            this.handlerDeleteFrame(object.frame.id)
+            break
+          case 'device':
+            this.frameId = object.frame.frame.id
+            console.log('hos ' + this.frameId)
+            this.openDeviceList()
+            break
+        }
+      },
+      handleAddBed(roomFrame) {
+      },
+      handleAddPatient(bedFrame) {
+        this.patientInfo = { sex: 1, age_unit: 0, frame_id: bedFrame.id }
+        this.dialogPatientVisible = true
+      },
+      handlePatientFinished() {
+        this.dialogPatientVisible = false
+        this.GET_All()
+      },
+      handleEditPatient(patient) {
+        this.dialogPatientVisible = true
+        this.patientInfo = patient
+      },
+      // frame handle
+      handleAddRoom() {
+        let parent_id = null
+        if (this.hospital_frame) {
+          parent_id = this.hospital_frame.frame_part.id
+        }
+        const params = { type: 4, name: this.frameName, part_id: this.$store.getters.partId, parent_id: parent_id}
+        HospitalFrame_API.addHospitalFrame(params).then(response => {
+          this.$message.success('添加成功!')
+          this.GET_All()
+        })
+      },
+      handleAddFrame(id) { // 新增床位
+        this.frameInfo = {}
+        this.frameInfo = { parent_id: id, type: 5 }
+        this.dialogFrameVisible = true
+      },
+      handelEditFrame(frame) {
+        this.frameInfo = { id: frame.id, type: frame.type, name: frame.name, alias: frame.alias }
+        this.dialogFrameVisible = true
+      },
+      handleFrameFinished() {
+        this.dialogFrameVisible = false
+        this.GET_All()
+      },
+      /** 单条数据删除处理 */
+      handlerDeleteFrame(ids) {
+        this.$confirm('确定要删除此结构及其所有下级吗?', '警告', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          HospitalFrame_API.deleteHospitalFrame(ids).then(response => {
+            this.$message({
+              type: 'success',
+              message: '已删除!'
+            })
+            this.GET_All()
+          }).catch(response => {
+            this.$message({
+              type: 'info',
+              message: response.message
+            })
+          })
+        })
+      },
+
+      // --------------------设备管理
+      handlePartDevice() {
+        this.frameId = -1
+        this.openDeviceList()
+      },
+      openDeviceList() {
+        this.deviceVisible = true
+      },
+      handlerSubmit(formName) {
+        this.$refs[formName].validate(valid => {
+          if (valid) {
+            const params = this.MixinClone(this.frameInfo)
+            if (params.id) {
+              HospitalFrame_API.updateHospitalFrame(params.id, params).then(response => {
+                this.$message.success('修改成功!')
+                this.handleFrameFinished()
+              })
+            } else {
+              if (!params.part_id) {
+                params.part_id = this.$store.getters.partId
+              }
+              HospitalFrame_API.addHospitalFrame(params).then(response => {
+                this.$message.success('添加成功!')
+                this.handleFrameFinished()
+              })
+            }
+          } else {
+            this.$message.error('表单填写有误,请检查!')
+            return false
+          }
+        })
+      }
+
+    }
+  }
+</script>
+
+<style type="text/scss" lang="scss" scoped>
+  #params-container {
+    display: flex;
+    flex-wrap: wrap;
+    position: relative;
+    background-color: #fff;
+    padding: 10px;
+    min-height: 150px;
+
+    .el-card {
+      min-width: 350px;
+      max-width: 500px;
+      min-height: 100px;
+      margin: 10px;
+      overflow: hidden;
+    }
+
+    .el-card__header {
+      padding: 10px 15px;
+      background-color: #f5f7fa;
+    }
+
+    .el-card__body {
+      padding: 10px !important;
+    }
+
+    .el-dropdown-link {
+      cursor: pointer;
+      color: #409eff
+    }
+
+    .el-icon-arrow-down {
+      font-size: 12px
+    }
+  }
+
+  #add-new-group {
+    position: absolute;
+    left: 10px;
+    top: 10px;
+    z-index: 10;
+    min-width: 30px;
+    height: 30px;
+    background: #475669;
+    border-radius: 50%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    transition: background-color .3s ease;
+
+    &:hover {
+      background-color: rgb(192, 204, 218);
+      cursor: pointer;
+
+      .add-btn {
+        color: rgb(71, 86, 105)
+      }
+    }
+
+    .add-btn {
+      display: block;
+      width: 30px;
+      text-align: center;
+      font-size: 30px;
+      font-weight: bold;
+      color: white;
+      margin-top: -7px;
+    }
+
+    .add-div {
+      display: flex;
+      background: #324057;
+      align-items: center;
+      justify-content: space-around;
+      min-width: 330px;
+      height: 40px;
+      position: absolute;
+      top: -5px;
+      left: 50px;
+      padding: 2px 5px;
+      color: #F9FAFC;
+      box-shadow: 0 0 10px 0 #303133;
+
+      .add-div-title {
+        font-size: 12px
+      }
+    }
+  }
+
+  .add-params-btn {
+    width: 100%;
+  }
+
+  .el-tag + .el-tag {
+    margin-left: 10px;
+  }
+
+  .button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+
+  .input-new-tag {
+    width: 90px;
+    margin-left: 10px;
+    vertical-align: bottom;
+  }
+
+  .el-checkbox + .el-checkbox {
+    margin-left: 20px
+  }
+
+  .el-button + .el-button {
+    margin-left: 0
+  }
+
+  .param-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 7px;
+    background-color: #f5f7fa;
+    font-size: 14px;
+
+    &.empty {
+      background-color: #fff
+    }
+  }
+
+  .line {
+    line-height: 32px;
+  }
+</style>