Browse Source

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

# Conflicts:
#	languages/en.js
#	languages/es.js
#	languages/ru-RU.js
#	languages/zh-CN.js
wuyunfeng 9 months ago
parent
commit
7b8d0316a2

File diff suppressed because it is too large
+ 1 - 1
dist/index.html


+ 5 - 1
languages/en.js

@@ -1679,7 +1679,11 @@ module.exports = {
     broadcastEnable: 'Activate the broadcasting function',
     learn: 'Learn',
     learnAll: 'Learn All',
-    deleteAll: 'Delete All'
+    deleteAll: 'Delete All',
+    deviceFunction: 'Device Function',
+    deviceButtonFunctionStr: 'Device Button Function',
+    selectKey: 'Please select a key',
+    voiceCancel: 'Cancel Call'
   },
   wu20240928: {
     editImage: 'Edit image',

+ 6 - 2
languages/es.js

@@ -1401,7 +1401,7 @@ module.exports = {
     expire: 'Fecha de vencimiento',
     face: 'Foto de reconocimiento facial',
     chooseImage: 'Elegir imagen',
-    syncToDevice: 'Sincronizar con el dispositivo',
+    syncToDevice: 'Sincronizar con el dispositivo'
   },
   boardTitle: {
     add: 'Añadir panel de visualización de información',
@@ -1679,7 +1679,11 @@ module.exports = {
     broadcastEnable: 'Activar la función de transmisión',
     learn: 'Aprender',
     learnAll: 'Aprender Todo',
-    deleteAll: 'Borrar Todo'
+    deleteAll: 'Borrar Todo',
+    deviceFunction: 'Función del dispositivo',
+    deviceButtonFunctionStr: 'Función del botón del dispositivo',
+    selectKey: 'Por favor, seleccione una clave',
+    voiceCancel: 'Cancelar llamada'
   },
   wu20240928: {
     editImage: 'Editar imagen',

+ 12 - 8
languages/ru-RU.js

@@ -1678,15 +1678,19 @@ module.exports = {
     broadcastEnable: 'Активировать функцию трансляции',
     learn: 'Изучать',
     learnAll: 'Изучать все',
-    deleteAll: 'Удалить все'
+    deleteAll: 'Удалить все',
+    deviceFunction: 'Функция устройства',
+    deviceButtonFunctionStr: 'Функция кнопки устройства',
+    selectKey: 'Пожалуйста, выберите ключ',
+    voiceCancel: 'Отменить вызов'
   },
   wu20240928: {
-    editImage: 'Edit image',
-    preview: 'Preview',
-    reload: 'Reload',
-    comfirm: 'Confirm',
-    cancel: 'Cancel',
-    incorrectFormat: 'Not an image format file',
-    fileSizeLimit: 'Please upload an image less than {size}M'
+    editImage: 'Редактировать изображение',
+    preview: 'Предварительный просмотр',
+    reload: 'Перезагрузить',
+    comfirm: 'Подтвердить',
+    cancel: 'Отменить',
+    incorrectFormat: 'Файл не в формате изображения',
+    fileSizeLimit: 'Пожалуйста, загрузите изображение меньше {size}M'
   }
 }

+ 15 - 11
languages/zh-CN.js

@@ -1029,16 +1029,16 @@ module.exports = {
     clerkNameHiddenOnDoor: '门口机员工姓名隐藏',
     hidden: '开启隐藏',
     channelImHistoryStoreDays: '频道留言保留天数',
-    recordEnabled: '开启录音录像功能',
-    recordAble: '开启录音录像功能',
-    screenLight: '开启按钮亮屏并触发功能',
-    roomCallBed: '开启门口机呼叫床位按钮',
-    boolAllDoorStatus: '开启所有门口机呼显示',
+    recordEnabled: '录音录像功能',
+    recordAble: '录音录像功能',
+    screenLight: '按钮亮屏并触发功能',
+    roomCallBed: '门口机呼叫床位按钮',
+    boolAllDoorStatus: '所有门口机呼显示',
     boolDooLightAlwaysOn: '门灯是否常亮',
     convenientServiceEnabled: '便民服务',
     ledServiceEnabled: '服务端控制点阵屏',
-    autoPositionEnabled: '开启自动定位',
-    boolDisplayNcTitle: '开启护理标题显示'
+    autoPositionEnabled: '自动定位',
+    boolDisplayNcTitle: '护理标题显示'
   },
   role: {
     roleName: '角色名称',
@@ -1677,12 +1677,16 @@ module.exports = {
     PTT: '一键通'
   },
   zy20240611: {
-    boolTransfer: '开启托管界面',
-    hostDeviceLock: '开启护士主机刷卡权限',
-    broadcastEnable: '开启广播功能',
+    boolTransfer: '托管界面',
+    hostDeviceLock: '护士主机刷卡权限',
+    broadcastEnable: '广播功能',
     learn: '学习',
     learnAll: '全部学习',
-    deleteAll: '全部删除'
+    deleteAll: '全部删除',
+    deviceFunction: '设备功能',
+    deviceButtonFunctionStr: '设备按钮功能',
+    selectKey: '请选择键值',
+    voiceCancel: '取消呼叫'
   },
   wu20240928: {
     editImage: '编辑图片',

+ 3 - 3
public/domain.js

@@ -1,7 +1,7 @@
 const domain = {
-  serverUrl: 'http://8.129.220.143:8005',
-  DeviceUrl: 'http://8.129.220.143:8006',
-  mediaUrl: 'http://8.129.220.143:8004',
+  serverUrl: 'http://192.168.1.40:8005',
+  DeviceUrl: 'http://192.168.1.40:8006',
+  mediaUrl: 'http://192.168.1.40:8004',
   OnlineSystemUrl: 'http://api.base.wdklian.com',
   gateWayUrl:'http://8.129.220.143:8014',
   fileServer: 'http://8.129.220.143:8012',

+ 9 - 0
src/api/ncs_event.js

@@ -47,3 +47,12 @@ export function updateRoleId(params) {
     data: params
   })
 }
+
+/** 批量修改roleId */
+export function getEventListByPartId(part_id) {
+  return request({
+    url: `/ncs/event/get_event_list_by_part_id/${part_id}`,
+    method: 'get',
+    loading: false
+  })
+}

File diff suppressed because it is too large
+ 6 - 6
src/utils/domain.js


+ 10 - 0
src/utils/enum/DeviceButtonTypeEnum.js

@@ -0,0 +1,10 @@
+import createEnum from '@/utils/enum/createEnum'
+import i18n from '@/utils/i18n'
+
+export const DEVICE_BUTTON_TYPE = createEnum(
+  {
+    SOS: ['SOS', i18n.t('tcpType.SOS')],
+    VOICE: ['VOICE', i18n.t('tcpType.VOICE')],
+    EVENT: ['EVENT', i18n.t('tcpType.EVENT')]
+  }
+)

+ 18 - 0
src/utils/enum/SerialKeyTypeEnum.js

@@ -0,0 +1,18 @@
+import createEnum from '@/utils/enum/createEnum'
+
+export const SERIAL_KEY_TYPE = createEnum(
+  {
+    PanelKey1: ['KEY5', 'KEY5'],
+    PanelKey2: ['KEY>', 'KEY>'],
+    PanelKey3: ['KEY7', 'KEY7'],
+    PanelKey4: ['KEY;', 'KEY;'],
+    PanelKey5: ['KEY<', 'KEY<'],
+    HandleKey1: ['KEY6', 'KEY6'],
+    HandleKey2: ['KEY?', 'KEY?'],
+    HandleKey3: ['KEY=', 'KEY='],
+    FourHandleKey0: ['HANDKEY00', 'HANDKEY00'],
+    FourHandleKey1: ['HANDKEY10', 'HANDKEY10'],
+    FourHandleKey2: ['HANDKEY20', 'HANDKEY20'],
+    FourHandleKey3: ['HANDKEY30', 'HANDKEY30']
+  }
+)

+ 2 - 2
src/utils/enum/createEnum.js

@@ -18,7 +18,7 @@ export default function createEnum(definition) {
     const [value, desc] = definition[enumName]
     strToValueMap[enumName] = value
     numToDescMap[value] = desc
-    keyValueMap.push({key:desc, value: value})
+    keyValueMap.push({ key: desc, value: value })
   }
   return {
     ...strToValueMap,
@@ -32,7 +32,7 @@ export default function createEnum(definition) {
       return numToDescMap
     },
     getKeyValueList() {
-      return keyValueMap;
+      return keyValueMap
     }
   }
 }

+ 11 - 11
src/views/customer/myMapHtml.vue

@@ -184,17 +184,17 @@ export default {
           this.dataList.forEach(item => {
             markers.push({lng: item.longitude, lat: item.latitude})
           })
-          const geoCoder = new BMap.Geocoder()
-          // 利用坐标获取地址的详细信息
-          geoCoder.getLocation(e.point, (res) => {
-            console.log(res)
-            if (res.surroundingPois[0]) {
-              this.myContent = res.surroundingPois[0].title + '附近'
-            } else {
-              this.myContent = res.address + '附近'
-            }
-            console.log('地址为' + this.myContent)
-          })
+          // const geoCoder = new BMap.Geocoder()
+          // // 利用坐标获取地址的详细信息
+          // geoCoder.getLocation(e.point, (res) => {
+          //   console.log(res)
+          //   if (res.surroundingPois[0]) {
+          //     this.myContent = res.surroundingPois[0].title + '附近'
+          //   } else {
+          //     this.myContent = res.address + '附近'
+          //   }
+          //   console.log('地址为' + this.myContent)
+          // })
           this.markers = markers
           this.center = this.markers[0]
         }

+ 240 - 124
src/views/ncs-orginazition/components/partInfoEdit.vue

@@ -376,9 +376,105 @@
             </el-col>
           </el-row>
 
+          <el-row>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.doctorTitle')">
+                <el-input v-model="formmodel.doctor_title" :label="this.$t('partInfo.doctorTitle')" :maxlength="15" >
+                  <el-select v-model="formmodel.doctor_valid" slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option :label="this.$t('partInfo.display')" :value="1"></el-option>
+                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0"></el-option>
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.nurseTitle')">
+                <el-input v-model="formmodel.nurse_title" :label="this.$t('partInfo.nurseTitle')" :maxlength="15" >
+                  <el-select v-model="formmodel.nurse_valid" slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option :label="this.$t('partInfo.display')" :value="1" />
+                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.doorNurseTitle')">
+                <el-input v-model="formmodel.door_nurse_title" :label="this.$t('partInfo.doorNurseTitle')" :maxlength="15" >
+                  <el-select v-model="formmodel.door_nurse_valid" slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option :label="this.$t('partInfo.display')" :value="1"></el-option>
+                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0"></el-option>
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.doorNursingTitle')">
+                <el-input v-model="formmodel.door_nursing_title" :label="this.$t('partInfo.doorNursingTitle')" :maxlength="15" >
+                  <el-select v-model="formmodel.door_nursing_valid" slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option :label="this.$t('partInfo.display')" :value="1" />
+                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.upSeconds')">
+                <el-input-number v-model="formmodel.up_seconds" :min="1" :max="300" :label="this.$t('partInfo.upSeconds')" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.customizeHospitalCallFirst')">
+                <el-input v-model="formmodel.customize_hospital_call_first_name" :label="this.$t('partInfo.customizeHospitalCallFirstName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
+                  <el-select v-model="formmodel.customize_hospital_call_first" filterable slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.customizeHospitalCallSecond')">
+                <el-input v-model="formmodel.customize_hospital_call_second_name" :label="this.$t('partInfo.customizeHospitalCallSecondName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
+                  <el-select v-model="formmodel.customize_hospital_call_second" filterable slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.customizeHospitalCallThird')">
+                <el-input v-model="formmodel.customize_hospital_call_third_name" :label="this.$t('partInfo.customizeHospitalCallThirdName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
+                  <el-select v-model="formmodel.customize_hospital_call_third" filterable slot="prepend" :placeholder="this.$t('action.choice')">
+                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
+                  </el-select>
+                </el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
 
           <el-row>
             <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.iotProductId')">
+                <el-input v-model="formmodel.iot_product_id" clearable :maxlength="20" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.iotProductKey')">
+                <el-input v-model="formmodel.iot_product_key" clearable :maxlength="100" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </fieldset>
+
+
+        <fieldset class="margin-top-sm">
+          <legend>{{ this.$t('zy20240611.deviceFunction') }}</legend>
+          <el-row>
+            <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.nursingColorRgb')">
                 <!--                <colorPicker v-model="formmodel.nursing_color_rgb" />-->
                 <el-input v-model="formmodel.nursing_color_rgb" />
@@ -397,26 +493,26 @@
           <el-row>
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.autoAccept')" prop="auto_accept">
-                <el-checkbox v-model="formmodel.auto_accept" :true-label="1" :false-label="0">{{ this.$t('partInfo.openAutoAccept') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.auto_accept" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
 
 
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.unmannedCall')" prop="empty_bed_call_enabled">
-                <el-checkbox v-model="formmodel.empty_bed_call_enabled" :true-label="1" :false-label="0">{{ this.$t('partInfo.openUnmannedCall') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.empty_bed_call_enabled" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
 
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.eventForward')" prop="event_forward">
-                <el-checkbox v-model="formmodel.event_forward" :true-label="1" :false-label="0">{{ this.$t('partInfo.openEventForward') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.event_forward" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
 
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.recordEnabled')" prop="record_enabled">
-                <el-checkbox v-model="formmodel.record_enabled" :true-label="1" :false-label="0">{{ this.$t('partInfo.recordAble') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.record_enabled" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
           </el-row>
@@ -462,13 +558,13 @@
           <el-row>
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.screenLight')" prop="screen_light">
-                <el-checkbox v-model="formmodel.screen_light" :true-label="1" :false-label="0">{{ this.$t('partInfo.screenLight') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.screen_light" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
 
             <el-col :span="8">
               <el-form-item :label="this.$t('partInfo.roomCallBed')" prop="room_call_bed">
-                <el-checkbox v-model="formmodel.room_call_bed" :true-label="1" :false-label="0">{{ this.$t('partInfo.roomCallBed') }}</el-checkbox>
+                <el-checkbox v-model="formmodel.room_call_bed" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
 
@@ -525,6 +621,12 @@
                 <el-checkbox v-model="formmodel.broadcast_enable" :true-label="1" :false-label="0">{{ this.$t('action.enabled') }}</el-checkbox>
               </el-form-item>
             </el-col>
+
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.boardShowEmptyBed')" prop="board_show_empty_bed">
+                <el-checkbox v-model="formmodel.board_show_empty_bed">{{ this.$t('action.enabled') }}</el-checkbox>
+              </el-form-item>
+            </el-col>
           </el-row>
 
           <el-row>
@@ -547,14 +649,14 @@
               </el-form-item>
             </el-col>
 
-          <el-col :span="8">
-            <el-form-item :label="this.$t('partInfo.communicationModeMobile')" prop="communication_mode_mobile">
-              <el-radio-group v-model="formmodel.communication_mode_mobile">
-                <el-radio :label="1">{{ this.$t('partInfo.networkCall') }}</el-radio>
-                <el-radio :label="2">{{ this.$t('partInfo.mobileCall') }}</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
+            <el-col :span="8">
+              <el-form-item :label="this.$t('partInfo.communicationModeMobile')" prop="communication_mode_mobile">
+                <el-radio-group v-model="formmodel.communication_mode_mobile">
+                  <el-radio :label="1">{{ this.$t('partInfo.networkCall') }}</el-radio>
+                  <el-radio :label="2">{{ this.$t('partInfo.mobileCall') }}</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
           </el-row>
           <el-row>
             <el-form-item :label="this.$t('partInfo.customizeRoleCallFirst')" prop="customize_role_call_first">
@@ -564,7 +666,7 @@
                                                             formmodel.customize_role_call_third===item.role_id ||
                                                             formmodel.customize_role_call_fourth===item.role_id ||
                                                             formmodel.customize_role_call_fifth===item.role_id "
-                          v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
+                          v-for="(item,index) in partRoles" :key="index" v-if="item.role_type !== 'NURSE'">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
@@ -573,11 +675,11 @@
             <el-form-item :label="this.$t('partInfo.customizeRoleCallSecond')" prop="customize_role_call_second">
               <el-radio-group v-model="formmodel.customize_role_call_second">
                 <el-radio :label="0">{{ this.$t('partInfo.onDisplay') }}</el-radio>
-                 <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
+                <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
                                                             formmodel.customize_role_call_third===item.role_id ||
                                                             formmodel.customize_role_call_fourth===item.role_id ||
                                                             formmodel.customize_role_call_fifth===item.role_id "
-                           v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
+                          v-for="(item,index) in partRoles" :key="index" v-if="item.role_type !== 'NURSE'">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
@@ -587,11 +689,11 @@
             <el-form-item :label="this.$t('partInfo.customizeRoleCallThird')" prop="customize_role_call_third">
               <el-radio-group v-model="formmodel.customize_role_call_third">
                 <el-radio :label="0">{{ this.$t('partInfo.onDisplay') }}</el-radio>
-                 <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
+                <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
                                                             formmodel.customize_role_call_second===item.role_id ||
                                                             formmodel.customize_role_call_fourth===item.role_id ||
                                                             formmodel.customize_role_call_fifth===item.role_id "
-                           v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
+                          v-for="(item,index) in partRoles" :key="index" v-if="item.role_type !== 'NURSE'">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
@@ -601,115 +703,28 @@
             <el-form-item :label="this.$t('partInfo.customizeRoleCallFourth')" prop="customize_role_call_fourth">
               <el-radio-group v-model="formmodel.customize_role_call_fourth">
                 <el-radio :label="0">{{ this.$t('partInfo.onDisplay') }}</el-radio>
-                 <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
+                <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
                                                             formmodel.customize_role_call_second===item.role_id ||
                                                             formmodel.customize_role_call_third===item.role_id ||
                                                             formmodel.customize_role_call_fifth===item.role_id "
-                           v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
+                          v-for="(item,index) in partRoles" :key="index" v-if="item.role_type !== 'NURSE'">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
 
-
           <el-row>
             <el-form-item :label="this.$t('partInfo.customizeRoleCallFifth')" prop="customize_role_call_fifth">
               <el-radio-group v-model="formmodel.customize_role_call_fifth">
                 <el-radio :label="0">{{ this.$t('partInfo.onDisplay') }}</el-radio>
-                 <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
+                <el-radio :label="item.role_id" :disabled="formmodel.customize_role_call_first===item.role_id ||
                                                             formmodel.customize_role_call_second===item.role_id ||
                                                             formmodel.customize_role_call_third===item.role_id ||
                                                             formmodel.customize_role_call_fourth===item.role_id "
-                           v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
+                          v-for="(item,index) in partRoles" :key="index" v-if="item.role_type !== 'NURSE'">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
 
-          <el-row>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.customizeHospitalCallFirst')">
-                <el-input v-model="formmodel.customize_hospital_call_first_name" :label="this.$t('partInfo.customizeHospitalCallFirstName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
-                  <el-select v-model="formmodel.customize_hospital_call_first" filterable slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.customizeHospitalCallSecond')">
-                <el-input v-model="formmodel.customize_hospital_call_second_name" :label="this.$t('partInfo.customizeHospitalCallSecondName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
-                  <el-select v-model="formmodel.customize_hospital_call_second" filterable slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.customizeHospitalCallThird')">
-                <el-input v-model="formmodel.customize_hospital_call_third_name" :label="this.$t('partInfo.customizeHospitalCallThirdName')" :maxlength="15" :placeholder="this.$t('partInfo.inputName')">
-                  <el-select v-model="formmodel.customize_hospital_call_third" filterable slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option v-for="(item,index) in otherHostDevice" :key="index" :label="item.name" :value="item.id" />
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.doctorTitle')">
-                <el-input v-model="formmodel.doctor_title" :label="this.$t('partInfo.doctorTitle')" :maxlength="15" >
-                  <el-select v-model="formmodel.doctor_valid" slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option :label="this.$t('partInfo.display')" :value="1"></el-option>
-                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0"></el-option>
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.nurseTitle')">
-                <el-input v-model="formmodel.nurse_title" :label="this.$t('partInfo.nurseTitle')" :maxlength="15" >
-                  <el-select v-model="formmodel.nurse_valid" slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option :label="this.$t('partInfo.display')" :value="1" />
-                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0" />
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.doorNurseTitle')">
-                <el-input v-model="formmodel.door_nurse_title" :label="this.$t('partInfo.doorNurseTitle')" :maxlength="15" >
-                  <el-select v-model="formmodel.door_nurse_valid" slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option :label="this.$t('partInfo.display')" :value="1"></el-option>
-                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0"></el-option>
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.doorNursingTitle')">
-                <el-input v-model="formmodel.door_nursing_title" :label="this.$t('partInfo.doorNursingTitle')" :maxlength="15" >
-                  <el-select v-model="formmodel.door_nursing_valid" slot="prepend" :placeholder="this.$t('action.choice')">
-                    <el-option :label="this.$t('partInfo.display')" :value="1" />
-                    <el-option :label="this.$t('partInfo.onDisplay')" :value="0" />
-                  </el-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.upSeconds')">
-                <el-input-number v-model="formmodel.up_seconds" :min="1" :max="300" :label="this.$t('partInfo.upSeconds')" />
-              </el-form-item>
-
-            </el-col>
-            <el-col :span="8">
-              <el-form-item  prop="board_show_empty_bed">
-                <el-checkbox v-model="formmodel.board_show_empty_bed">{{ this.$t('partInfo.boardShowEmptyBed') }}</el-checkbox>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
           <el-row v-if="isShow">
             <el-col :span="8">
               <el-form-item :label="this.$t('zy20240205.linuxSerial1')" prop="linux_serial1">
@@ -766,17 +781,31 @@
             </el-col>
           </el-row>
 
-          <el-row>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.iotProductId')">
-                <el-input v-model="formmodel.iot_product_id" clearable :maxlength="20" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item :label="this.$t('partInfo.iotProductKey')">
-                <el-input v-model="formmodel.iot_product_key" clearable :maxlength="100" />
-              </el-form-item>
-            </el-col>
+          <el-row v-if="isShow">
+            <el-form-item :label="deviceButtonFunctionStr"
+                          v-for="(item, index) in deviceButtonParamsTemp" :key="'u' + index">
+              <el-col :span="6" style="margin: auto">
+                <el-select v-model="item.key" :maxlength="50" :placeholder="selectKey" clearable>
+                  <el-option v-for="(keyItem, keyIndex) in serialKeyTypeTransfer" :key="keyIndex" :label="keyItem.key" :value="keyItem.value" :disabled="isDeviceButtonDisabled(keyItem, keyIndex)"/>
+                </el-select>
+              </el-col>
+              <el-col :span="6" style="margin: auto">
+                <el-select v-model="item.type" :maxlength="50" :placeholder="selectTcpType" clearable @change="handleChange(index)">
+                  <el-option v-for="(keyItem, keyIndex) in deviceButtonTypeTransfer" :key="keyIndex" :label="keyItem.key" :value="keyItem.value"/>
+                </el-select>
+              </el-col>
+              <el-col :span="6" style="margin: auto">
+                <el-select v-model="item.value" :maxlength="50" :placeholder="selectTcpType" clearable>
+                  <el-option v-if="item.type === deviceButtonType.SOS" v-for="(keyItem, keyIndex) in deviceButtonSosTransfer" :key="keyIndex" :label="keyItem.key" :value="keyItem.value"/>
+                  <el-option v-else-if="item.type === deviceButtonType.VOICE" v-for="(keyItem, keyIndex) in deviceButtonVoiceTransfer" :key="keyIndex" :label="keyItem.key" :value="keyItem.value"/>
+                  <el-option v-else-if="item.type === deviceButtonType.EVENT" v-for="(keyItem, keyIndex) in deviceButtonEventTransfer" :key="keyIndex" :label="keyItem.key" :value="keyItem.value"/>
+                </el-select>
+              </el-col>
+              <el-col :span="3" style="margin: auto">
+                <el-button v-if="index === 0" type="primary" @click="addDeviceButton(deviceButtonParamsTemp)"> {{ addStr }} </el-button>
+                <el-button v-else type="danger" @click="delDeviceButton(deviceButtonParamsTemp, index)"> {{ delStr }} </el-button>
+              </el-col>
+            </el-form-item>
           </el-row>
 
           <el-row>
@@ -811,8 +840,6 @@
               </el-form-item>
             </el-col>
           </el-row>
-
-
         </fieldset>
 
         <el-form-item align="center" class="margin-top-sm">
@@ -839,6 +866,12 @@ import * as API_Device from '@/api/ncs_device'
 import * as API_Excel from "@/api/ncs_excel";
 import moment from  'moment'
 import {SERIAL_TYPE} from "@/utils/enum/SerialTypeEnum";
+import {DEVICE_TYPE} from "@/utils/enum/DeviceTypeEnum";
+import {SERIAL_KEY_TYPE} from "@/utils/enum/SerialKeyTypeEnum";
+import {DEVICE_BUTTON_TYPE} from "@/utils/enum/DeviceButtonTypeEnum";
+import i18n from "@/utils/i18n";
+import * as API_event from "@/api/ncs_event";
+import {getEventListByPartId} from "@/api/ncs_event";
 const serverUrl = domain.serverUrl
 const DeviceUrl = domain.DeviceUrl
 export default {
@@ -865,6 +898,7 @@ export default {
       isShow: false,
       isDisabled: false,
       partRoles: [],
+      partEvents: [],
       systemConfig: {},
       formmodelAdmin: {},
       noMember: true,
@@ -874,6 +908,22 @@ export default {
       excelUploadUrl: DeviceUrl + '/ncs/excel/upload/' + this.partId,
       excelUploadDemo: serverUrl + '/upload/excel/demo/excel_demo.xlsx',
       serialType: SERIAL_TYPE.getKeyValueList(),
+      deviceButtonFunctionStr: this.$t('zy20240611.deviceButtonFunctionStr'),
+      selectKey: this.$t('zy20240611.selectKey'),
+      selectTcpType: this.$t('action.choiceType'),
+      addStr: this.$t('action.add'),
+      delStr: this.$t('action.delete'),
+      deviceButtonParamsTemp: [{
+        key: '',
+        type: '',
+        value: ''
+      }],
+      serialKeyTypeTransfer: SERIAL_KEY_TYPE.getKeyValueList(),
+      deviceButtonTypeTransfer: DEVICE_BUTTON_TYPE.getKeyValueList(),
+      deviceButtonType: DEVICE_BUTTON_TYPE,
+      deviceButtonSosTransfer: [{ key : this.$t('tcpType.SOS'), value : 'SOS'}],
+      deviceButtonEventTransfer: [],
+      deviceButtonVoiceTransfer: []
     }
   },
   async mounted() {
@@ -881,7 +931,8 @@ export default {
     // this.nurseLevel0Config = await API_Nurse.getNurseConfigs(this.partId, 0)
     this.getPartInfo()
     this.getParents()
-    this.getRoles({ page_size: 200, page_no: 1, fixedCondition: ' shop_id = -1 and role_name<>"护士"', sort: ' role_id', dir: 'desc' })
+    this.getRoles({ page_size: 200, page_no: 1, fixedCondition: ' shop_id = -1', sort: ' role_id', dir: 'desc' })
+    this.getEvents(this.partId)
     this.getOtherHostDevice(this.partId)
     console.log(this.excelUploadUrl)
   },
@@ -980,6 +1031,7 @@ export default {
           // this.formmodel.door_nursing_title = res.door_nursing_title
           // this.formmodel.door_nursing_valid = res.door_nursing_valid
           this.formmodel.up_seconds = res.up_seconds
+          this.deviceButtonParamsTemp = this.strToParamsTemp(res.device_button_function)
           API_SystemConfig.getConfig('groupHostTransferSeconds').then(r => {
             this.systemConfig = r
           })
@@ -1006,6 +1058,18 @@ export default {
       // 获取角色
       API_Clerk.getRoles(param).then(response => {
         this.partRoles = response.data
+        this.partRoles.forEach(p => {
+          this.deviceButtonVoiceTransfer.push({ key : p.role_name, value : p.role_type })
+        })
+        this.deviceButtonVoiceTransfer.push({ key : this.$t('zy20240611.voiceCancel'), value : 'CANCEL' })
+      })
+    },
+    getEvents(part_id) {
+      API_event.getEventListByPartId(part_id).then(response => {
+        this.partEvents = response
+        this.partEvents.forEach(p => {
+          this.deviceButtonEventTransfer.push({ key : p.name, value : p.id })
+        })
       })
     },
     onSubmit() {
@@ -1032,6 +1096,7 @@ export default {
           if (this.formmodel.qr_url) {
             this.imageUrl = this.formmodel.qr_url
           }
+          this.formmodel.device_button_function = this.paramsTempToStr(this.deviceButtonParamsTemp)
           console.log(this.formmodel)
           API_Part.editPartSetting(this.formmodel, this.partId).then(res => {
             this.$message.success(this.$t('action.saveSuccess'))
@@ -1198,6 +1263,57 @@ export default {
         return false
       }
       return true
+    },
+    addDeviceButton(paramsTemp){
+      paramsTemp.push({
+        key: '',
+        type: '',
+        value: ''
+      })
+    },
+    delDeviceButton(paramsTemp, index) {
+      paramsTemp.splice(index, 1)
+    },
+    isDeviceButtonDisabled(option, currentIndex) {
+      const selectedArr = this.deviceButtonParamsTemp.map(item => item.key)
+      selectedArr.splice(currentIndex, 1)
+      return selectedArr.includes(option.value)
+    },
+    paramsTempToStr(paramsTemp) {
+      let _paramsTemp = []
+      if (paramsTemp.length !== 0) {
+        for (let i = 0; i < paramsTemp.length; i++) {
+          if (paramsTemp[i].key !== '' && paramsTemp[i].value !== '' && paramsTemp[i].type !== '') {
+            _paramsTemp.push(paramsTemp[i])
+          }
+        }
+      }
+      if (_paramsTemp.length !== 0) {
+        return JSON.stringify(_paramsTemp);
+      }
+      return undefined;
+    },
+    strToParamsTemp(str) {
+      if (str === '' || str === null) {
+        return  [{
+          key: '',
+          type: '',
+          value: ''
+        }]
+      }
+      else {
+        try {
+          let jsonStr = str
+          jsonStr = jsonStr.replace(/&gt;/g, '>').replace(/&lt;/g, '<');
+          return JSON.parse(jsonStr)
+        } catch (e) {
+          console.error("Parsing error:", e);
+          // 处理错误或设置错误状态
+        }
+      }
+    },
+    handleChange(index) {
+      this.deviceButtonParamsTemp[index].value = ''
     }
   }
 }