Quellcode durchsuchen

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

* 'master' of http://git.wdklian.com/allen/ncs_ui:
  增加二维码模块,增加用户的二维码,将多语音i18n独立到全局,开发多个页面的语言文件
  增加科室设置的中英文
  增加分机自动呼叫开关
  新增养老版用户体征数据显示,修改用户体征数据显示错误的问题,将机构负责人修改成角色无法修改,修复语音播放开关错误的问题,增加交互记录的类型,增加总控护士主机APP更新,修改报警设备的搜索逻辑,优化部分文字和大小的问题
  在科室设置中增加批量刷新设备(主要批量增加测试用户后设备刷新问题)
wuyunfeng vor 3 Jahren
Ursprung
Commit
75697fb334

+ 1 - 1
languages/en.js

@@ -57,7 +57,7 @@ module.exports = {
     sureDeleteBed: 'are you sure to delete the bed',
     room: 'room',
     bed: 'bed',
-    nowOrganization: 'now organization',
+    newOrganization: 'new organization',
     partName: 'the part name',
     inputPartName: 'please enter the part name',
     adminMember: 'administrator account',

+ 341 - 11
languages/zh-CN.js

@@ -1,7 +1,7 @@
 module.exports = {
   action: {
     home: '首页',
-    add: '添加',
+    add: '新增',
     edit: '编辑',
     more: '更多',
     delete: '删除',
@@ -9,10 +9,25 @@ module.exports = {
     waring: '警告',
     yes: '确定',
     cancel: '取消',
+    back: '返回',
+    handle: '操作',
+    cancelHandle: '取消操作!',
+    handleSuccess: '操作成功',
+    saveEdit: '保存修改',
+    saveSettings: '保存设置',
+    deleteSettings: '清空设置',
     deleted: '已删除!',
+    deleteList: '批量删除',
+    sureDelete: '删除操作后数据不可复原,您确定要删除此数据?',
+    allDelete: '确定要清空吗?',
+    allDeleteSuccess: '清空成功!',
+    cancelDelete: '已取消删除',
+    pleaseChoiceDelete: '请先勾选需要删除的数据',
+    fromError: '表单填写有误,请检查!',
     editSuccess: '修改成功!',
-    addSuccess: '添加成功!',
+    addSuccess: '新增成功!',
     createSuccess: '创建成功!',
+    save: '保存',
     saveSuccess: '保存成功!',
     notDevelopedYet: '暂未开发',
     keywords: '请输入搜索关键字',
@@ -24,7 +39,52 @@ module.exports = {
     name: '名称',
     fullName: '全称',
     type: '类型',
-    alias: '别名'
+    alias: '别名',
+    tips: '提示',
+    time: '小时',
+    minute: '分钟',
+    second: '秒',
+    choice: '请选择',
+    choiceAll: '全选',
+    colour: '颜色',
+    getMsg: '收到消息:',
+    sureInitialize: '您确定要初始化吗?'
+  },
+  member: {
+    face: '头像',
+    faceImg: '上传头像图片只能是 JPG、PNG、GIF 格式!',
+    faceSize: '上传头像图片大小不能超过 2MB!',
+    faceError1: '图片宽度必须在100~500之间,宽高比为1:1!',
+    faceError2: '请上传宽高比为1:1的图片',
+    faceError3: '图片高度必须在100~500之间!',
+    uname: '登录名',
+    inputUname: '请输入用户名',
+    unameInputMsg: '长度在 2 到 20 个字符',
+    password: '密码',
+    inputPassword: '请输入密码!',
+    passwordInputMsg: '密码格式有误,密码只能包含字母数字和!#$%^&*.~,字符,长度为6-20位',
+    nickname: '真实姓名',
+    inputNickname: '请输入真实姓名',
+    nicknameInputMsg: '长度在 2 到 20 个字符',
+    mobile: '手机号码',
+    inputMobile: '请输入手机号码!',
+    mobileInputMsg: '手机格式格式有误',
+    sex: '性别',
+    man: '男',
+    woman: '女',
+    unknown: '未知',
+    IDCard: '身份证号',
+    birthday: '生日',
+    choiceBirthday: '选择日期',
+    address: '详细地址',
+    addressInputMsg: '最长50个字符',
+    homeAddress: '家庭住址',
+    inputHomeAddress: '请输入家庭住址',
+    disableClerk: '你确定要禁用此用户?',
+    disabled: '已禁用!',
+    disableCancel: '已取消禁用',
+    deleteMember: '你确定要删除此用户信息?',
+    cannotDeleteAdmin: '不能删除机构负责人'
   },
   home: {
     todayTask: '今日任务',
@@ -61,7 +121,7 @@ module.exports = {
     sureDeleteBed: '确定删除床位',
     room: '房',
     bed: '床',
-    nowOrganization: '新建组织',
+    newOrganization: '新建组织',
     partName: '科室名称',
     inputPartName: '请输入科室名称',
     adminMember: '管理员账号',
@@ -72,36 +132,306 @@ module.exports = {
   deviceManage: {
     deviceManage: '设备管理',
     deviceAdd: '新增设备',
+    deviceEdit: '修改设备',
     deviceType: '设备类型',
+    choiceDeviceType: '请选择设备类型',
     deviceName: '设备别名',
+    inputDeviceName: '请输入设备别名',
     status: '设备状态',
+    deviceStatus: '是否启用',
+    choiceDeviceStatus: '启用设备',
     statusTure: '启用',
     statusFalse: '未启用',
     connect: '连接状态',
     connectTrue: '在线',
     connectFalse: '离线',
     frameFullName: '部署位置',
-    ethMac: '以太网MAC地址',
-    ethIp: '以太网IP地址',
+    frameName: '设备位置',
+    choiceFrameName: '请选择安装位置',
+    ethMac: '有线MAC地址',
+    inputEthMac: '请输入有线MAC地址',
+    inputTrueEthMac: '请输入正确的MAC地址',
+    ethIp: '有线IP地址',
+    inputEthIp: '请输入IP地址',
     ethIpPort: '通讯端口',
     model: '设备型号',
+    inputModel: '请输入设备型号',
     code: '出厂编号',
+    inputCode: '请输入出厂编号',
     softVer: '软件版本',
+    inputSoftVer: '请输入软件版本号',
     hardVer: '硬件版本',
+    inputHardVer: '请输入硬件版本号',
     wifiMac: '无线MAC地址',
+    inputWifiMac: '请输入无线MAC地址',
     wifiIp: '无线IP地址',
+    inputWifiIp: '请输入无线IP地址',
+    wifiHostname: 'WIFI热点',
+    inputWifiHostname: '请输入WIFI热点名称',
+    wifiPassword: 'WIFI密码',
+    inputPassword: '请输入WIFI热点密码',
     sipId: 'SIP账号',
-    updateTime: '更新时间'
+    updateTime: '更新时间',
+    phoneNumber: '设备电话号码',
+    inputPhoneNumber: '请输入设备电话号码',
+    priority: '设备优先级',
+    backupId: '后备设备ID',
+    roleName: '适用角色',
+    choiceRoleName: '请选择适用人',
+    transAudio: '上属总线转换盒',
+    choiceTransAudio: '请选择总线转换盒',
+    transRs485: '上属485转换盒',
+    re485SipId: '485地址',
+    inputRe485SipId: '请输入485地址',
+    sosDeviceSetting: '报警设备模式',
+    sosDeviceSettingStatusFalse: '不开启',
+    sosDeviceSettingControlModel: '疫情防控模式',
+    sosDeviceSettingElderlyModel: '关爱老人模式',
+    sosDeviceSettingTime: '报警时间',
+    sosDeviceSettingUnit: '报警时间单位',
+    ledResolutionRatio: '点阵屏规格',
+    ledVoice: '语音播放',
+    ledVoiceStatus: '启用语音',
+    ledFontSize: '字体大小',
+    webSocketSuccess: 'WebSocket连接成功',
+    webSocketError: 'WebSocket连接发生错误'
+  },
+  clerkManage: {
+    clerkEdit: '编辑成员信息',
+    role: '角色',
+    choiceRole: '请选择角色',
+    clerkList: '小组成员',
+    admin: '机构负责人'
+  },
+  customerManage: {
+    customerAdd: '入住登记',
+    customerInfo: '用户信息',
+    baseInfo: '基本信息',
+    named: '用户姓名',
+    inputNamed: '请输入姓名',
+    cardNo: '入住编号',
+    inputCardNo: '请输入病人编号',
+    age: '年龄',
+    inputAge: '请输入年龄',
+    ageUnit: '年龄单位',
+    choiceAgeUnit: '请选择年龄单位',
+    year: '岁',
+    month: '月',
+    day: '天',
+    inDate: '入住日期',
+    outDate: '离开时间',
+    choiceDate: '选择日期',
+    to: '至',
+    today: '至今',
+    idType: '证件类型',
+    id: '证件',
+    idCard: '身份证',
+    noIdCard: '暂无证件',
+    null: '暂无',
+    passport: '护照',
+    servicemanCard: '军人证',
+    idNo: '证件号码',
+    inputIdNo: '请输入证件号',
+    nickname: '昵称',
+    inputNickname: '请输入用户其他称呼',
+    frame: '入住床位',
+    choiceFrame: '请选择床位',
+    illnessDesc: '用户情况简述',
+    patientIllnessDesc: '病况描述',
+    inputIllnessDesc: '请输入文本内容,长度2~50',
+    advice: '医嘱',
+    inputAdvice: '请输入文本内容,长度2~50',
+    doctor: '责任医生',
+    choiceDoctor: '请选择医生',
+    nurse: '责任护士',
+    choiceNurse: '请选择护士',
+    worker: '责任护工',
+    choiceWorker: '请选择护工',
+    customerRelative: '用户亲属',
+    sureDeleteRelative: '你确定要删除此病人亲属信息?',
+    customerRelativeTrueName: '亲属姓名',
+    inputCustomerRelativeTrueName: '请输入亲属姓名',
+    relativeName: '关系',
+    inputRelativeName: '请输入亲属关系 如:朋友',
+    vital: '体征',
+    remark: '备注',
+    remarks: '备注内容:',
+    inputRemarks: '请输入备注内容',
+    remarkTime: '时间:',
+    remarkName: '备注人:',
+    content: '内容',
+    inputContent: '\'请输入文本内容,长度300\'',
+    uploader: '附件',
+    uploaderImg: '上传附件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!',
+    uploaderSize: '上传附件大小不能超过 5MB!',
+    addRemark: '添加备注',
+    outBed: '退床',
+    sureOutBed: '确定退床吗?',
+    outBedSuccess: '退床成功!',
+    changeBed: '换床',
+    changeBedSuccess: '',
+    oldBed: '当前床位',
+    newBed: '换到床位',
+    choiceNewBed: '请选择床位',
+    getEmptyBed: '获取空床位:',
+    message: '的信息',
+    customerStatus: '当前状态',
+    customerStatusTrue: '入住中',
+    customerStatusFalse: '已离开'
+  },
+  watch: {
+    deviceKeywords: '请输入设备别名或设备标识码',
+    dateKeywords: '选择日期进行搜索',
+    huanBan: '换班',
+    binding: '绑定',
+    noBinding: '未绑定 ',
+    ethMac: '设备标识码',
+    initializeDevice: '初始化设备',
+    watchFrame: '管理空间',
+    watchDeviceFrame: '移动设备管辖空间',
+    place: '位置',
+    placeInfo: '位置信息',
+    getNewPlace: '获取最新位置',
+    inputName: '请输入名称',
+    deviceMember: '绑定人',
+    choiceNurse: '请选择护士',
+    doNothing: '未做任何改变',
+    nurseManageFrame: '护士组长管理空间是其管辖护士的管理空间',
+    choiceFrame: '请选择床位!',
+    you: '您于',
+    in: '在',
+    nearby: '附近',
+    notCovered: '当前不在信标范围内',
+  },
+  partInfo: {
+    partInfo: '系统设置',
+    baseInfo: '基本信息',
+    shopName: '组织简称',
+    inputShopName: '输入组织简称',
+    shopFullName: '组织全称',
+    inputShopFullName: '输入组织全称',
+    hisCode: 'HIS系统标识',
+    inputHisCode: '请输入HIS系统标识',
+    shopType: '组织类型',
+    choiceShopType: '请选择组织类型',
+    hospital: '医院',
+    part: '科室',
+    organization: '组织',
+    shopMemberName: '管理员账号',
+    inputShopMemberName: '请输入管理员账号',
+    shopParentId: '所属组织',
+    choiceShopParentId: '请选择上级组织',
+    dayInfo: '白天参数设置',
+    dayStart: '白天开始时间',
+    nightInfo: '夜晚参数设置',
+    nightStart: '夜晚开始时间',
+    dayOrNightVol: '主机通话音量',
+    dayOrNightDoorVol: '门口机通话音量',
+    dayOrNightTransferBoxVol: '转换盒通话音量',
+    dayOrNightLight: '分机液晶屏亮度',
+    dayOrNightRingTimes: '呼叫响铃次数',
+    dayOrNightBedVol: '分机通话音量',
+    dayOrNightRingVol: '主机系统音量',
+    dayOrNightNurseLed: '分机护理灯亮度',
+    dayOrNightTransferBoxSystemVol: '转换盒系统音量',
+    otherInfo: '其它参数',
+    sleepSecondsBed: '分机息屏时间',
+    sleepSecondsDoor: '门口机息屏时间',
+    sleepSecondsNurse: '护士主机息屏时间',
+    sipOvertime: '语音呼叫超时',
+    transferDuration: '护士转接时长',
+    transferDurationLeader: '护士组长转接时长',
+    nurseKeyVal: '护士主机转接时长',
+    autoAccept: '分机开启自动接听',
+    openAutoAccept: '开启自动接听',
+    communicationModeBed: '分机通讯方式',
+    communicationModeNurse: '护士主机通讯方式',
+    communicationModeMobile: '移动设备通讯方式',
+    networkCall: '网络电话',
+    mobileCall: '移动电话',
+    fixedCall: '固定电话',
+    customizeRoleCallFirst: '自定义呼叫角色1',
+    customizeRoleCallSecond: '自定义呼叫角色2',
+    doctorTitle: '模拟分机医生标题',
+    nurseTitle: '模拟分机护士标题',
+    display: '显示',
+    onDisplay: '不显示',
+    upSeconds: '腕表上传定位间隔',
+    saveSettings: '保存设置',
+    initializeSystem: '初始化系统',
+    initialize485Device: '初始化485设备',
+    addTestMemberList: '批量添加测试用户',
+    devicesRef: '设备批量刷新',
+    sureAddTestMemberList: '确定需要批量增加测试用户吗?',
+    startAdd: '开始创建',
+    sureDevicesRef: '确定需要批量刷新设备吗?'
   },
   tab: {
     home: '首页',
     frameManage: '空间位置',
     deviceManage: '所有设备',
     clerkManage: '员工管理',
-    memberManage: '用户管理',
-    mobileDeviceManage: '移动设备'
+    patientManage: '病人管理',
+    customerManage: '用户管理',
+    mobileDeviceManage: '移动设备',
+    sosDeviceSettingManage: '报警设备',
+    channelManage: '对讲频道',
+    remarkManage: '便签管理',
+    taskManage: '任务管理',
+    interactionHistory: '交互历史',
+    frameGroupManage: '区域管理',
+    frameGroupEdit: '编辑区域信息',
+    watchFrameManage: '移动设备空间',
+    broadcastManage: '广播设置',
+    broadcastEdit: '编辑广播信息',
+    nurseConfig: '护理参数',
+    boardManage: '看板设置',
+    eventManage: '按钮事件管理',
+    interactionChars: '交互统计',
+    partSetting: '机构设置',
+    allClerk: '所有员工',
+    allCustomer: '所有用户',
+    allDevice: '所有设备',
+    errorLog: '错误日志',
+    systemConfig: '系统参数',
+    shopSetting: '系统设置',
+    menuManage: '菜单管理',
+    organization: '组织机构',
+    roleManage: '角色管理'
+  },
+  deviceType: {
+    NURSE_HOST: '护士主机',
+    DOCTOR_HOST: '医生主机',
+    DOOR_DEVICE: '门口机',
+    DIGIT_BED_DEVICE: '床位分机',
+    LCD_SCREEN: 'LCD走廊屏',
+    LED_SCREEN: 'LED点阵屏',
+    NURSE_WATCH: '护士移动',
+    WORKER_WATCH: '护工移动',
+    USER_WATCH: '用户移动',
+    CELL_PHONE: '手机App',
+    TRANSFER_DEVICE: '总线转换盒',
+    SIMULATE_BED_DEVICE: '模拟分机',
+    SIMULATE_EMERGENCY_BUTTON: '模拟紧急按钮',
+    SIMULATE_DOOR_LIGHT: '模拟门灯',
+    REMOTE_CONTROL: '遥控器',
+    BEACON: '信标',
+    INFORMATION_BOARD: '信息看版',
+    ENTRANCE_GUARD: '门禁设备',
+    VISITATION: '探视机',
+    RS485_TRANSFER: '485转换盒',
+    EMERGENCY_BUTTON: '紧急按钮',
+    RS485_DOOR: '485门口分机',
+    ALARM_BODY_INDUCTIVE: '红外报警器',
+    ALARM_WATER_OVERFLOW: '用水监控器',
+    ALARM_HOUSEHOLD_GAS: '家用燃起报警器',
+    ALARM_HOUSEHOLD_SMOKE: '家用烟雾报警器',
+    ALARM_BUTTON_SOS: '一键报警器',
+    DOOR_LOCK: '门磁传感器'
   },
-  error: {
-    fromError: '表单填写有误,请检查!'
+  sosDeviceSettingType: {
+    NOT_START: '不启动',
+    EPIDEMIC_PATTERN: '疫情防控模式',
+    CARING_PATTERN: '关爱老人模式'
   }
 }

+ 2 - 1
package.json

@@ -50,6 +50,7 @@
     "vue-draggable-resizable": "^2.3.0",
     "vue-i18n": "^8.26.1",
     "vue-property-decorator": "^9.1.2",
+    "vue-qr": "^3.2.4",
     "vue-router": "3.0.2",
     "vue-seamless-scroll": "^1.1.23",
     "vue-splitpane": "1.0.4",
@@ -71,7 +72,7 @@
     "chokidar": "2.1.5",
     "connect": "3.6.6",
     "eslint": "^5.16.0",
-    "eslint-plugin-vue": "^7.1.0",
+    "eslint-plugin-vue": "^7.20.0",
     "html-webpack-plugin": "3.2.0",
     "husky": "1.3.1",
     "js-cookie": "2.2.0",

+ 6 - 0
src/api/initialize.js

@@ -12,3 +12,9 @@ export function init485Device(partId) {
     method: 'GET'
   })
 }
+export function initDeviceList(partId) {
+  return request({
+    url: `/initialize/init_device_list/${partId}`,
+    method: 'GET'
+  })
+}

+ 3 - 8
src/layout/components/Navbar.vue

@@ -68,7 +68,7 @@ import SizeSelect from '@/components/SizeSelect'
 import Search from '@/components/HeaderSearch'
 import avator from '@/assets/avatar.jpeg'
 import * as API_Part from '@/api/calling-part'
-import Cookies from 'js-cookie'
+import Storage from '@/utils/storage'
 export default {
   components: {
     Breadcrumb,
@@ -140,13 +140,8 @@ export default {
       } else if (value === 'en') {
         this.$i18n.locale = 'en'
       }
-      // 在选择了显示的语言后,将配置保存到Cookie中
-      Cookies.set('DefaultLanguage', value, //
-        { //
-          // expires: '30m' // 默认cookie有效时间为30分钟
-          expires: 1
-        }
-      )
+      // 在选择了显示的语言后,将配置保存到缓存里
+      Storage.setItem('DefaultLanguage', value)
       // location.reload()
       this.$router.go(0)
     }

+ 2 - 13
src/main.js

@@ -6,10 +6,8 @@ import 'normalize.css/normalize.css' // a modern alternative to CSS resets
 
 import Element from 'element-ui'
 import './styles/element-variables.scss'
-import locale from 'element-ui/lib/locale'
 import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
 import zhLang from 'element-ui/lib/locale/lang/zh-CN'
-import VueI18n from 'vue-i18n'
 import 'ag-grid-community/dist/styles/ag-grid.css'
 import 'ag-grid-community/dist/styles/ag-theme-alpine.css'
 import '@/styles/index.scss' // global css
@@ -30,6 +28,8 @@ import mixin from './utils/mixin'
 import Components from './components'
 import vcolorpicker from 'vcolorpicker'
 import scroll from 'vue-seamless-scroll/src'
+
+import i18n from './utils/i18n'
 /**
  * If you don't want to use mock-server
  * you want to use MockJs for mock api
@@ -57,7 +57,6 @@ Vue.use(Element, {
   size: Cookies.get('size') || 'medium' // set element-ui default size
   // locale: enLang // 如果使用中文,无需设置,请删除
 })
-Vue.use(VueI18n)
 Vue.use(Element, { zhLang })
 
 // register global utility filters
@@ -67,16 +66,6 @@ Object.keys(filters).forEach(key => {
 
 Vue.config.productionTip = false
 
-const i18n = new VueI18n({
-  locale: Cookies.get('DefaultLanguage') == null ? 'zh' : Cookies.get('DefaultLanguage'), // 语言标识,默认汉语,先去cookie查找,如果存在并有效,cookie值即为默认语言类型;否则默认为中文简体
-  messages: {
-    'zh': Object.assign(require('../languages/zh-CN'), zhLang),
-    'en': Object.assign(require('../languages/en'), enLang)
-    // 'zh': require('./languages/zh-CN'),
-    // 'en': require('./languages/en')
-  }
-})
-locale.i18n((key, value) => i18n.t(key, value))
 new Vue({
   el: '#app',
   i18n, // 将VueI18n挂载到vue实例上

+ 38 - 38
src/router/index.js

@@ -1,8 +1,8 @@
 import Vue from 'vue'
 import Router from 'vue-router'
+import i18n from '@/utils/i18n'
 // eslint-disable-next-line no-unused-vars
 // import { uiVersion } from 'domain'
-
 Vue.use(Router)
 
 /* Layout */
@@ -82,7 +82,7 @@ export const constantRoutes = [
         path: 'dashboard',
         component: () => import('@/views/dashboard/index'),
         name: 'Dashboard',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
+        meta: { title: i18n.t('tab.home'), icon: 'dashboard', affix: true }
       }
     ]
   },
@@ -115,7 +115,7 @@ export const partRoutes = [
         path: 'frameTreeView',
         component: () => import('@/views/hospitalFrame/frameTreeView'),
         name: 'hospitalFrame',
-        meta: { title: '空间位置', icon: 'tree', noCache: true }
+        meta: { title: i18n.t('tab.frameManage'), icon: 'tree', noCache: true }
       }
     ]
   },
@@ -129,7 +129,7 @@ export const partRoutes = [
         // component: () => import('@/views/ncs-device/index'),
         component: () => import('@/views/ncs-device/deviceManagement'),
         name: 'CallingDevice',
-        meta: { title: '设备管理', icon: 'component', noCache: true }
+        meta: { title: i18n.t('tab.deviceManage'), icon: 'component', noCache: true }
       }
     ]
   },
@@ -142,7 +142,7 @@ export const partRoutes = [
         path: 'clerkList',
         component: () => import('@/views/ncs-clerk/clerkManagement'),
         name: 'clerkList',
-        meta: { title: '员工管理', icon: 'peoples', noCache: true }
+        meta: { title: i18n.t('tab.clerkManage'), icon: 'peoples', noCache: true }
       }
     ]
   },
@@ -168,7 +168,7 @@ export const partRoutes = [
         path: 'index',
         component: () => uiVersion === 1 ? import('@/views/customer/patientManagement') : uiVersion === 2 ? import('@/views/customer/customerManagement') : import('@/views/customer/elderlyCareManagement'),
         name: uiVersion === 1 ? 'patientManagement' : uiVersion === 2 ? 'customerManager' : 'elderlyCareManager',
-        meta: { title: uiVersion === 1 ? '病人管理' : '用户管理', icon: 'el-icon-s-custom', noCache: true }
+        meta: { title: uiVersion === 1 ? i18n.t('tab.patientManage') : i18n.t('tab.customerManage'), icon: 'el-icon-s-custom', noCache: true }
       }
     ]
   },
@@ -195,7 +195,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-device/nurse_watch'),
         name: 'nurse_watch',
-        meta: { title: '移动设备', icon: 'el-icon-watch', noCache: true }
+        meta: { title: i18n.t('tab.mobileDeviceManage'), icon: 'el-icon-watch', noCache: true }
       }
     ],
     hidden: uiVersion === 1
@@ -208,8 +208,8 @@ export const partRoutes = [
       {
         path: 'index',
         component: () => import('@/views/ncs-sos-device-setting/sos_device_setting'),
-        name: 'nurse_watch',
-        meta: { title: '报警设备', icon: 'el-icon-s-help', noCache: true }
+        name: 'sos-device-setting',
+        meta: { title: i18n.t('tab.sosDeviceSettingManage'), icon: 'el-icon-s-help', noCache: true }
       }
     ]
   },
@@ -222,7 +222,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-channel/index'),
         name: 'ncsChannel',
-        meta: { title: '对讲频道', icon: 'el-icon-mobile-phone', noCache: true }
+        meta: { title: i18n.t('tab.channelManage'), icon: 'el-icon-mobile-phone', noCache: true }
       }
     ],
     hidden: uiVersion !== 2
@@ -236,7 +236,7 @@ export const partRoutes = [
         path: 'remark',
         component: () => import('@/views/ncs-remark/index'),
         name: 'remarkList',
-        meta: { title: '便签管理', icon: 'el-icon-s-order', noCache: true }
+        meta: { title: i18n.t('tab.remarkManage'), icon: 'el-icon-s-order', noCache: true }
       }
     ]
   },
@@ -249,7 +249,7 @@ export const partRoutes = [
         path: 'task',
         component: () => import('@/views/ncs-task/index'),
         name: 'taskList',
-        meta: { title: '任务管理', icon: 'table', noCache: true }
+        meta: { title: i18n.t('tab.taskManage'), icon: 'table', noCache: true }
       }
     ]
   },
@@ -262,7 +262,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-interaction/index'),
         name: 'CallingList',
-        meta: { title: '交互历史', icon: 'list', noCache: true }
+        meta: { title: i18n.t('tab.interactionHistory'), icon: 'list', noCache: true }
       }
     ]
   },
@@ -289,20 +289,20 @@ export const partRoutes = [
         path: '/frameGroup/index',
         component: () => import('@/views/hospitalFrame/frameGroup'),
         name: 'frameGroup',
-        meta: { title: '区域管理', icon: 'area', noCache: true }
+        meta: { title: i18n.t('tab.frameGroupManage'), icon: 'area', noCache: true }
       },
       {
         path: '/frameGroup/edit/:id?',
         component: () => import('@/views/hospitalFrame/frameGroupEdit'),
         name: 'frameGroupEdit',
-        meta: { title: '编辑区域信息', icon: 'area', noCache: true },
+        meta: { title: i18n.t('tab.frameGroupEdit'), icon: 'area', noCache: true },
         hidden: true
       },
       {
         path: 'nurse_watch_frame/:id?',
         component: () => import('@/views/hospitalFrame/nurse_watch_frame'),
         name: 'nurseWatchFrame',
-        meta: { title: '移动设备空间', icon: 'area', noCache: true },
+        meta: { title: i18n.t('tab.watchFrameManage'), icon: 'area', noCache: true },
         hidden: true
       }
     ]
@@ -316,13 +316,13 @@ export const partRoutes = [
         path: '/broadcast/index',
         component: () => import('@/views/ncs-broadcast/index'),
         name: 'Broadcast',
-        meta: { title: '广播设置', icon: 'el-icon-headset', noCache: true }
+        meta: { title: i18n.t('tab.broadcastManage'), icon: 'el-icon-headset', noCache: true }
       },
       {
         path: '/broadcast/edit/:id?',
         component: () => import('@/views/ncs-broadcast/broadcastEdit'),
         name: 'broadcastEdit',
-        meta: { title: '编辑广播信息', icon: 'area', noCache: true },
+        meta: { title: i18n.t('tab.broadcastEdit'), icon: 'area', noCache: true },
         hidden: true
       }
     ],
@@ -337,7 +337,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-nurse-config/index'),
         name: 'NcsNurseConfig',
-        meta: { title: '护理参数', icon: 'care1', noCache: true }
+        meta: { title: i18n.t('tab.nurseConfig'), icon: 'care1', noCache: true }
       }
     ],
     hidden: uiVersion !== 1
@@ -350,7 +350,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/calling-board/index'),
         name: 'CallingBoard',
-        meta: { title: '看板设置', icon: 'el-icon-data-board', noCache: true }
+        meta: { title: i18n.t('tab.boardManage'), icon: 'el-icon-data-board', noCache: true }
       }
     ],
     hidden: uiVersion === 2
@@ -364,7 +364,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-event/index'),
         name: 'eventList',
-        meta: { title: '按钮事件管理', icon: 'el-icon-notebook-2', noCache: true }
+        meta: { title: i18n.t('tab.eventManage'), icon: 'el-icon-notebook-2', noCache: true }
       }
     ],
     hidden: uiVersion === 1
@@ -391,7 +391,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-chars/index'),
         name: 'interactionChars',
-        meta: { title: '交互统计', icon: 'el-icon-pie-chart', noCache: true }
+        meta: { title: i18n.t('tab.interactionChars'), icon: 'el-icon-pie-chart', noCache: true }
       }
     ]
   },
@@ -404,7 +404,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/calling-setting/index'),
         name: 'CallingSetting',
-        meta: { title: '系统设置', icon: 'el-icon-s-tools', noCache: true }
+        meta: { title: i18n.t('tab.partSetting'), icon: 'el-icon-s-tools', noCache: true }
       }
     ]
   },
@@ -420,7 +420,7 @@ export const hospitalRoutes = [
         path: 'index',
         component: () => import('@/views/hospital/ncs_frame/frameTreeView'),
         name: 'hospital_frameTreeView',
-        meta: { title: '空间管理', icon: 'tree', noCache: true }
+        meta: { title: i18n.t('tab.frameManage'), icon: 'tree', noCache: true }
       }
     ]
   },
@@ -434,7 +434,7 @@ export const hospitalRoutes = [
         // component: () => import('@/views/hospital/ncs_device/deviceManager'),
         component: () => import('@/views/hospital/deviceManagement'),
         name: 'hospital_deviceList',
-        meta: { title: '设备管理', icon: 'component', noCache: true }
+        meta: { title: i18n.t('tab.deviceManage'), icon: 'component', noCache: true }
       }
     ]
   },
@@ -447,7 +447,7 @@ export const hospitalRoutes = [
         path: 'index',
         component: () => import('@/views/hospital/clerkManager'),
         name: 'hospital_clerkList',
-        meta: { title: '员工管理', icon: 'peoples', noCache: true }
+        meta: { title: i18n.t('tab.clerkManage'), icon: 'peoples', noCache: true }
       }
     ]
   },
@@ -460,7 +460,7 @@ export const hospitalRoutes = [
         path: 'index',
         component: () => import('@/views/hospital/customerManagement'),
         name: 'hospital_customerList',
-        meta: { title: '用户管理', icon: 'el-icon-s-custom', noCache: true }
+        meta: { title: i18n.t('tab.customerManage'), icon: 'el-icon-s-custom', noCache: true }
         // component: () => uiVersion === 1 ? import('@/views/customer/patientManagement') : import('@/views/customer/customerManagement'),
         // name: uiVersion === 1 ? 'hospital_patientList' : 'hospital_customerList',
         // meta: { title: uiVersion === 1 ? '病人管理' : '用户管理', icon: 'el-icon-s-custom', noCache: true }
@@ -479,7 +479,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/hospitalFrame/frameTreeView-admin'),
         name: 'CallingFrameTreeViewAdmin',
-        meta: { title: '空间管理', icon: 'tree', noCache: true }
+        meta: { title: i18n.t('tab.frameManage'), icon: 'tree', noCache: true }
       }
     ]
   },
@@ -492,7 +492,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-clerk/clerk-admin'),
         name: 'CallingClerkAdmin',
-        meta: { title: '所有员工', icon: 'peoples', noCache: true }
+        meta: { title: i18n.t('tab.allClerk'), icon: 'peoples', noCache: true }
       }
     ]
   },
@@ -505,7 +505,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/customer/customer-admin'),
         name: 'CallingCustomerAdmin',
-        meta: { title: '所有用户', icon: 'el-icon-s-custom', noCache: true }
+        meta: { title: i18n.t('tab.allCustomer'), icon: 'el-icon-s-custom', noCache: true }
         // component: () => uiVersion === 1 ? import('@/views/customer/patientManagement') : import('@/views/customer/customerManagement'),
         // name: uiVersion === 1 ? 'hospital_patientList' : 'hospital_customerList',
         // meta: { title: uiVersion === 1 ? '病人管理' : '用户管理', icon: 'el-icon-s-custom', noCache: true }
@@ -521,7 +521,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-device/device-admin'),
         name: 'CallingDeviceAdmin',
-        meta: { title: '所有设备', icon: 'component', noCache: true }
+        meta: { title: i18n.t('tab.allDevice'), icon: 'component', noCache: true }
       }
     ]
   },
@@ -534,7 +534,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/calling-ncError/index'),
         name: 'CallingNcError',
-        meta: { title: '错误日志', icon: 'bug', noCache: true }
+        meta: { title: i18n.t('tab.errorLog'), icon: 'bug', noCache: true }
       }
     ]
   },
@@ -547,7 +547,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-system-config/index'),
         name: 'NcsSystemConfig',
-        meta: { title: '系统参数', icon: 'nested', noCache: true }
+        meta: { title: i18n.t('tab.systemConfig'), icon: 'nested', noCache: true }
       }
     ]
   },
@@ -559,7 +559,7 @@ export const adminRoutes = [
         path: 'index/:id?',
         component: () => import('@/views/ncs-orginazition/partInfoSetting'),
         name: 'partInfoSetting',
-        meta: { title: '科室设置', icon: 'nested', noCache: true },
+        meta: { title: i18n.t('tab.shopSetting'), icon: 'nested', noCache: true },
         hidden: true
       }
     ]
@@ -572,7 +572,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-menu/menuManager'),
         name: 'menuSetting',
-        meta: { title: '菜单管理', icon: 'function', noCache: true }
+        meta: { title: i18n.t('tab.menuManage'), icon: 'function', noCache: true }
       }
     ]
   },
@@ -583,8 +583,8 @@ export const adminRoutes = [
       {
         path: 'index',
         component: () => import('@/views/ncs-orginazition/index'),
-        name: 'orginazition',
-        meta: { title: '组织机构', icon: 'tree', noCache: true }
+        name: 'organization',
+        meta: { title: i18n.t('tab.organization'), icon: 'tree', noCache: true }
       }
     ]
   },
@@ -596,7 +596,7 @@ export const adminRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-auth/superadmin/defaultRoleManager'),
         name: 'rolemanager',
-        meta: { title: '角色功能', icon: 'authen', noCache: true }
+        meta: { title: i18n.t('tab.roleManage'), icon: 'authen', noCache: true }
       }
     ]
   },

+ 29 - 28
src/utils/enum/DeviceTypeEnum.js

@@ -1,34 +1,35 @@
 import createEnum from '@/utils/enum/createEnum'
+import i18n from '@/utils/i18n'
 
 export const DEVICE_TYPE = createEnum(
   {
-    NURSE_HOST: [1, '护士主机'],
-    DOCTOR_HOST: [2, '医生主机'],
-    DOOR_DEVICE: [3, '门口机'],
-    DIGIT_BED_DEVICE: [4, '床位分机'],
-    LCD_SCREEN: [5, 'LCD走廊屏'],
-    LED_SCREEN: [6, 'LED点阵屏'],
-    NURSE_WATCH: [7, '护士移动'],
-    WORKER_WATCH: [8, '护工移动'],
-    USER_WATCH: [9, '用户移动'],
-    CELL_PHONE: [10, '手机App'],
-    TRANSFER_DEVICE: [11, '总线转换盒'],
-    SIMULATE_BED_DEVICE: [12, '模拟分机'],
-    SIMULATE_EMERGENCY_BUTTON: [13, '模拟紧急按钮'],
-    SIMULATE_DOOR_LIGHT: [14, '模拟门灯'],
-    REMOTE_CONTROL: [15, '遥控器'],
-    BEACON: [16, '信标'],
-    INFORMATION_BOARD: [17, '信息看版'],
-    ENTRANCE_GUARD: [18, '门禁设备'],
-    VISITATION: [19, '探视机'],
-    RS485_TRANSFER: [20, '485转换盒'],
-    EMERGENCY_BUTTON: [21, '紧急按钮'],
-    RS485_DOOR: [22, '485门口分机'],
-    ALARM_BODY_INDUCTIVE: [23, '红外报警器'],
-    ALARM_WATER_OVERFLOW: [24, '用水监控器'],
-    ALARM_HOUSEHOLD_GAS: [25, '家用燃起报警器'],
-    ALARM_HOUSEHOLD_SMOKE: [26, '家用烟雾报警器'],
-    ALARM_BUTTON_SOS: [27, '一键报警器'],
-    DOOR_LOCK: [30, '门磁传感器']
+    NURSE_HOST: [1, i18n.t('deviceType.NURSE_HOST')],
+    DOCTOR_HOST: [2, i18n.t('deviceType.DOCTOR_HOST')],
+    DOOR_DEVICE: [3, i18n.t('deviceType.DOOR_DEVICE')],
+    DIGIT_BED_DEVICE: [4, i18n.t('deviceType.DIGIT_BED_DEVICE')],
+    LCD_SCREEN: [5, i18n.t('deviceType.LCD_SCREEN')],
+    LED_SCREEN: [6, i18n.t('deviceType.LED_SCREEN')],
+    NURSE_WATCH: [7, i18n.t('deviceType.NURSE_WATCH')],
+    WORKER_WATCH: [8, i18n.t('deviceType.WORKER_WATCH')],
+    USER_WATCH: [9, i18n.t('deviceType.USER_WATCH')],
+    CELL_PHONE: [10, i18n.t('deviceType.CELL_PHONE')],
+    TRANSFER_DEVICE: [11, i18n.t('deviceType.TRANSFER_DEVICE')],
+    SIMULATE_BED_DEVICE: [12, i18n.t('deviceType.SIMULATE_BED_DEVICE')],
+    SIMULATE_EMERGENCY_BUTTON: [13, i18n.t('deviceType.SIMULATE_EMERGENCY_BUTTON')],
+    SIMULATE_DOOR_LIGHT: [14, i18n.t('deviceType.SIMULATE_DOOR_LIGHT')],
+    REMOTE_CONTROL: [15, i18n.t('deviceType.REMOTE_CONTROL')],
+    BEACON: [16, i18n.t('deviceType.BEACON')],
+    INFORMATION_BOARD: [17, i18n.t('deviceType.INFORMATION_BOARD')],
+    ENTRANCE_GUARD: [18, i18n.t('deviceType.ENTRANCE_GUARD')],
+    VISITATION: [19, i18n.t('deviceType.VISITATION')],
+    RS485_TRANSFER: [20, i18n.t('deviceType.RS485_TRANSFER')],
+    EMERGENCY_BUTTON: [21, i18n.t('deviceType.EMERGENCY_BUTTON')],
+    RS485_DOOR: [22, i18n.t('deviceType.RS485_DOOR')],
+    ALARM_BODY_INDUCTIVE: [23, i18n.t('deviceType.ALARM_BODY_INDUCTIVE')],
+    ALARM_WATER_OVERFLOW: [24, i18n.t('deviceType.ALARM_WATER_OVERFLOW')],
+    ALARM_HOUSEHOLD_GAS: [25, i18n.t('deviceType.ALARM_HOUSEHOLD_GAS')],
+    ALARM_HOUSEHOLD_SMOKE: [26, i18n.t('deviceType.ALARM_HOUSEHOLD_SMOKE')],
+    ALARM_BUTTON_SOS: [27, i18n.t('deviceType.ALARM_BUTTON_SOS')],
+    DOOR_LOCK: [30, i18n.t('deviceType.DOOR_LOCK')]
   }
 )

+ 4 - 3
src/utils/enum/SosDeviceSettingTypeEnum.js

@@ -1,9 +1,10 @@
 import createEnum from '@/utils/enum/createEnum'
+import i18n from '@/utils/i18n'
 
 export const SOS_DEVICE_SETTING_TYPE = createEnum(
   {
-    NOT_START: [0, '不启动'],
-    EPIDEMIC_PATTERN: [1, '疫情防控模式'],
-    CARING_PATTERN: [2, '关爱老人模式']
+    NOT_START: [0, i18n.t('sosDeviceSettingType.NOT_START')],
+    EPIDEMIC_PATTERN: [1, i18n.t('sosDeviceSettingType.EPIDEMIC_PATTERN')],
+    CARING_PATTERN: [2, i18n.t('sosDeviceSettingType.CARING_PATTERN')]
   }
 )

+ 3 - 0
src/utils/enum/createEnum.js

@@ -25,6 +25,9 @@ export default function createEnum(definition) {
     },
     getDescFromValue(value) {
       return numToDescMap[value] || ''
+    },
+    getValueList() {
+      return numToDescMap
     }
   }
 }

+ 21 - 0
src/utils/i18n.js

@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
+import zhLang from 'element-ui/lib/locale/lang/zh-CN'
+import VueI18n from 'vue-i18n'
+import locale from 'element-ui/lib/locale'
+import Storage from '@/utils/storage'
+Vue.use(VueI18n)
+// 创建vue-i18n实例i18n
+const i18n = new VueI18n({
+  // 设置默认语言
+  // locale: 'zh', // 语言标识
+  locale: Storage.getItem('DefaultLanguage') == null ? 'zh' : Storage.getItem('DefaultLanguage'),
+  // 添加多语言(每一个语言标示对应一个语言文件)
+  messages: {
+    'zh': Object.assign(require('../../languages/zh-CN'), zhLang),
+    'en': Object.assign(require('../../languages/en'), enLang)
+  }
+})
+locale.i18n((key, value) => i18n.t(key, value))
+// 暴露i18n
+export default i18n

Datei-Diff unterdrückt, da er zu groß ist
+ 253 - 226
src/views/customer/components/customerManager.vue


+ 202 - 166
src/views/customer/components/patientManager.vue

@@ -19,11 +19,11 @@
             <!--        @rowDoubleClicked="getList"-->
             <div slot="toolbar" class="inner-toolbar">
                 <div class="toolbar-search">
-                    <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch"/>
+                    <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch"/>
                 </div>
                 <div class="toolbar-btns">
-                    <el-button type="primary" size="mini" :disabled="!isEmptyFrame" @click="handleAdd">入院登记</el-button>
-                    <el-button type="danger" size="mini" @click="batchDelete">批量删除</el-button>
+                    <el-button type="primary" size="mini" :disabled="!isEmptyFrame" @click="handleAdd">{{ this.$t('customerManage.customerAdd') }}</el-button>
+                    <el-button type="danger" size="mini" @click="batchDelete">{{ this.$t('action.deleteList') }}</el-button>
                 </div>
             </div>
             <el-pagination
@@ -40,21 +40,21 @@
         </ag-grid-layout>
 
         <!-- 用户信息 -->
-        <el-dialog :visible.sync="customerFormVisible" title="用户信息" class="customer-dialog">
+        <el-dialog :visible.sync="customerFormVisible" :title="this.$t('customerManage.customerInfo')" class="customer-dialog">
             <el-tabs v-model="activeName" type="border-card" tab-position="bottom" width="50%" @tab-click="handleClick">
-                <el-tab-pane label="基本信息" name="customerBaseInfo">
+                <el-tab-pane :label="this.$t('customerManage.baseInfo')" name="customerBaseInfo">
                     <div style="height: 720px">
                         <el-form ref="editForm" :model="formmodel" :rules="rules" label-width="120px">
                             <el-row>
                                 <el-col :span="12">
-                                    <el-form-item label="用户姓名" prop="named">
-                                        <el-input v-model="formmodel.named" clearable placeholder="请输入姓名"
+                                    <el-form-item :label="this.$t('customerManage.named')" prop="named">
+                                        <el-input v-model="formmodel.named" clearable :placeholder="this.$t('customerManage.inputNamed')"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="入住编号">
-                                        <el-input v-model="formmodel.card_no" clearable placeholder="请输入病人编号"
+                                    <el-form-item :label="this.$t('customerManage.cardNo')">
+                                        <el-input v-model="formmodel.card_no" clearable :placeholder="this.$t('customerManage.inputCardNo')"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
@@ -62,20 +62,20 @@
 
                             <el-row>
                                 <el-col :span="12">
-                                    <el-form-item label="性别" class="form-item-sex">
-                                        <el-radio v-model="formmodel.sex" :label="0"></el-radio>
-                                        <el-radio v-model="formmodel.sex" :label="1"></el-radio>
+                                    <el-form-item :label="this.$t('member.sex')" class="form-item-sex">
+                                        <el-radio v-model="formmodel.sex" :label="0">{{ this.$t('member.woman') }}</el-radio>
+                                        <el-radio v-model="formmodel.sex" :label="1">{{ this.$t('member.man') }}</el-radio>
                                         <!--                    <el-radio v-model="formmodel.sex" :label="2">未知</el-radio>-->
                                     </el-form-item>
                                 </el-col>
 
                                 <el-col :span="12">
-                                    <el-form-item label="年龄" prop="age">
-                                        <el-input v-model="formmodel.age" clearable :maxlength="4" placeholder="请输入年龄">
-                                            <el-select slot="append" v-model="formmodel.age_unit" placeholder="请选择年龄单位">
-                                                <el-option label="岁" value="岁"/>
-                                                <el-option label="月" value="月"/>
-                                                <el-option label="天" value="天"/>
+                                    <el-form-item :label="this.$t('customerManage.age')" prop="age">
+                                        <el-input v-model="formmodel.age" clearable :maxlength="4" :placeholder="this.$t('customerManage.inputAge')">
+                                            <el-select slot="append" v-model="formmodel.age_unit" :placeholder="this.$t('customerManage.choiceAgeUnit')">
+                                                <el-option :label="this.$t('customerManage.year')" value="岁"/>
+                                                <el-option :label="this.$t('customerManage.month')" value="月"/>
+                                                <el-option :label="this.$t('customerManage.day')" value="天"/>
                                             </el-select>
                                         </el-input>
                                     </el-form-item>
@@ -83,54 +83,54 @@
                             </el-row>
                             <el-row>
                                 <el-col :span="12">
-                                    <el-form-item label="手机号码" prop="mobile">
-                                        <el-input v-model="formmodel.mobile" clearable placeholder="请输入手机号码"
+                                    <el-form-item :label="this.$t('member.mobile')" prop="mobile">
+                                        <el-input v-model="formmodel.mobile" clearable :placeholder="this.$t('member.inputMobile')"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="家庭住址" prop="address">
+                                    <el-form-item :label="this.$t('member.homeAddress')" prop="address">
                                         <el-input v-model="formmodel.address" clearable :maxlength="20"
-                                                  placeholder="请输入家庭住址"/>
+                                                  :placeholder="this.$t('member.inputHomeAddress')"/>
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="生日" prop="birthday">
+                                    <el-form-item :label="this.$t('member.birthday')" prop="birthday">
                                         <el-date-picker
                                                 v-model="formmodel.birthday"
                                                 type="date"
                                                 :editable="false"
                                                 value-format="timestamp"
-                                                placeholder="选择日期"
+                                                :placeholder="this.$t('member.choiceBirthday')"
                                                 :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}"
                                                 @change="birthdayChange"
                                         />
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="入住日期" prop="in_date">
+                                    <el-form-item :label="this.$t('customerManage.inDate')" prop="in_date">
                                         <el-date-picker
                                                 v-model="formmodel.in_date"
                                                 type="date"
                                                 :editable="false"
                                                 value-format="timestamp"
                                                 :default-value="new Date()"
-                                                placeholder="选择日期"
+                                                :placeholder="this.$t('customerManage.choiceDate')"
                                                 :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}"
                                         />
                                     </el-form-item>
                                 </el-col>
 
                                 <el-col :span="12">
-                                    <el-form-item label="证件类型">
-                                        <el-radio v-model="formmodel.id_type" label="身份证">身份证</el-radio>
-                                        <el-radio v-model="formmodel.id_type" label="护照">护照</el-radio>
-                                        <el-radio v-model="formmodel.id_type" label="军人证">军人证</el-radio>
+                                    <el-form-item :label="this.$t('customerManage.idType')">
+                                        <el-radio v-model="formmodel.id_type" label="身份证">{{ this.$t('customerManage.idCard') }}</el-radio>
+                                        <el-radio v-model="formmodel.id_type" label="护照">{{ this.$t('customerManage.passport') }}</el-radio>
+                                        <el-radio v-model="formmodel.id_type" label="军人证">{{ this.$t('customerManage.servicemanCard') }}</el-radio>
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="证件号码">
-                                        <el-input v-model="formmodel.id_no" clearable placeholder="请输入证件号"
+                                    <el-form-item :label="this.$t('customerManage.idNo')">
+                                        <el-input v-model="formmodel.id_no" clearable :placeholder="this.$t('customerManage.inputIdNo')"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
@@ -140,34 +140,34 @@
                                 <el-col :span="16">
                                     <el-row>
                                         <el-col :span="12">
-                                            <el-form-item label="昵称" prop="nickname">
-                                                <el-input v-model="formmodel.nickname" clearable placeholder="请输入用户其他称呼"
+                                            <el-form-item :label="this.$t('customerManage.nickname')" prop="nickname">
+                                                <el-input v-model="formmodel.nickname" clearable :placeholder="this.$t('customerManage.inputNickname')"
                                                           :maxlength="20"/>
                                             </el-form-item>
                                         </el-col>
                                         <el-col :span="12">
-                                            <el-form-item label="入住床位" prop="frame_id">
+                                            <el-form-item :label="this.$t('customerManage.frame')" prop="frame_id">
                                                 <el-select v-model="formmodel.frame_id" :disabled="bedSelectabled"
-                                                           placeholder="请选择床位">
+                                                           :placeholder="this.$t('customerManage.choiceFrame')">
                                                     <el-option v-for="(item,index) in emptyBeds" :key="index"
                                                                :label="item.full_name" :value="item.id"/>
                                                 </el-select>
                                             </el-form-item>
                                         </el-col>
                                     </el-row>
-                                    <el-form-item label="病况描述">
+                                    <el-form-item :label="this.$t('customerManage.patientIllnessDesc')">
                                         <el-input
                                                 v-model="formmodel.illness_desc"
                                                 type="textarea"
                                                 :autosize="{ minRows: 2, maxRows: 4}"
                                                 :minlength="2"
                                                 :maxlength="50"
-                                                :placeholder="'请输入文本内容,长度2~50'"
+                                                :placeholder="this.$t('customerManage.inputIllnessDesc')"
                                         />
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="8">
-                                    <el-form-item label="头像">
+                                    <el-form-item :label="this.$t('member.face')">
                                         <el-upload
                                                 class="avatar-uploader"
                                                 :action="`${uploadServer}/ncs/upload/uploadFile?scene=avatar`"
@@ -183,22 +183,22 @@
                             </el-row>
 
                           <el-row>
-                            <el-form-item label="医嘱">
+                            <el-form-item :label="this.$t('customerManage.advice')">
                               <el-input
                                   v-model="formmodel.advice"
                                   type="textarea"
                                   :autosize="{ minRows: 2, maxRows: 4}"
                                   :minlength="2"
                                   :maxlength="50"
-                                  :placeholder="'请输入文本内容,长度2~50'"
+                                  :placeholder="this.$t('customerManage.inputAdvice')"
                               />
                             </el-form-item>
                           </el-row>
 
                             <el-row>
                                 <el-col :span="8">
-                                    <el-form-item label="责任医生">
-                                        <el-select v-model="formmodel.doctor_id" placeholder="请选择医生" clearable
+                                    <el-form-item :label="this.$t('customerManage.doctor')">
+                                        <el-select v-model="formmodel.doctor_id" :placeholder="this.$t('customerManage.choiceDoctor')" clearable
                                                    @change="doctorChange(1)">
                                             <el-option v-for="(item,index) in doctors" :key="index"
                                                        :label="item.clerk_name" :value="item.clerk_id"/>
@@ -206,8 +206,8 @@
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="8">
-                                    <el-form-item label="责任护士">
-                                        <el-select v-model="formmodel.nurse_id" placeholder="请选择护士" clearable
+                                    <el-form-item :label="this.$t('customerManage.nurse')">
+                                        <el-select v-model="formmodel.nurse_id" :placeholder="this.$t('customerManage.choiceNurse')" clearable
                                                    @change="doctorChange(2)">
                                             <el-option v-for="(item,index) in nurses" :key="index"
                                                        :label="item.clerk_name" :value="item.clerk_id"/>
@@ -215,8 +215,8 @@
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="8">
-                                    <el-form-item label="责任护工">
-                                        <el-select v-model="formmodel.worker_id" placeholder="请选择护工" clearable
+                                    <el-form-item :label="this.$t('customerManage.worker')">
+                                        <el-select v-model="formmodel.worker_id" :placeholder="this.$t('customerManage.choiceWorker')" clearable
                                                    @change="doctorChange(3)">
                                             <el-option v-for="(item,index) in workers" :key="index"
                                                        :label="item.clerk_name" :value="item.clerk_id"/>
@@ -229,27 +229,39 @@
                                 <el-col v-for="(item, index) in nurseconfigSelection" :key="index" :span="8">
                                     <el-form-item :label="item.config.config_name">
                                         <el-select :ref="'patient_nurse_'+item.config.id" v-model="item.selected_id"
-                                                   :placeholder="'请选择'+item.config.config_name" clearable
+                                                   :placeholder="this.$t('action.choice')+item.config.config_name" clearable
                                                    @change="(val)=>{changeNurseData(val,item.config.id,index)}">
                                             <el-option v-for="(t,i) in item.options" :key="i" :label="t.option_name"
                                                        :value="t.id">
                                                 <span style="float: left">{{ t.option_name }}</span>
-                                                <span :style="'float: right; background-color: #'+t.color_rgb+';color: #'+t.color_rgb">颜色</span>
+                                                <span :style="'float: right; background-color: #'+t.color_rgb+';color: #'+t.color_rgb">{{ this.$t('action.colour') }}</span>
                                             </el-option>
                                         </el-select>
                                     </el-form-item>
                                 </el-col>
                             </el-row>
 
+
+                            <el-row>
+                              <el-col :span="24" :offset="8">
+                                <vue-qr
+                                    v-if="formmodel.member_id"
+                                    :text="qrCode(formmodel.member_id)"
+                                    :size="150"
+                                    :correctLevel="0"
+                                ></vue-qr>
+                              </el-col>
+                            </el-row>
+
                             <el-form-item>
                                 <el-button type="primary" :disabled="isDisabled" class="save"
-                                           @click="handlerSubmit('editForm')">保存
+                                           @click="handlerSubmit('editForm')">{{ this.$t('action.save') }}
                                 </el-button>
                             </el-form-item>
                         </el-form>
                     </div>
                 </el-tab-pane>
-                <el-tab-pane v-if="formmodel.id" label="用户亲属" name="customerRelative">
+                <el-tab-pane v-if="formmodel.id" :label="this.$t('customerManage.customerRelative')" name="customerRelative">
                     <div style="height: 450px">
                         <!--            <customer-relative :member-id="memberId" />-->
                         <el-table
@@ -260,31 +272,31 @@
                         >
                             <el-table-column
                                     prop="true_name"
-                                    label="亲属姓名"
+                                    :label="this.$t('customerManage.customerRelativeTrueName')"
                                     width="180"
                             />
                             <el-table-column
                                     prop="sex"
-                                    label="性别"
+                                    :label="this.$t('member.sex')"
                                     width="180"
                                     :formatter="formatterSex"
                             />
                             <el-table-column
                                     prop="relative_name"
-                                    label="关系"
+                                    :label="this.$t('customerManage.relativeName')"
                                     width="180"
                             />
                             <el-table-column
                                     prop="mobile"
-                                    label="手机号码"
+                                    :label="this.$t('member.mobile')"
                             />
                             <el-table-column
-                                    label="操作"
+                                    :label="this.$t('action.handle')"
                                     width="100"
                             >
                                 <template slot-scope="scope">
                                     <el-button type="danger" size="mini"
-                                               @click="handlerDeleteRelative(scope.row.member_id)">删除
+                                               @click="handlerDeleteRelative(scope.row.member_id)">{{ this.$t('action.delete') }}
                                     </el-button>
                                 </template>
                             </el-table-column>
@@ -294,35 +306,35 @@
                                  label-width="120px" style="margin-top:20px">
                             <el-row>
                                 <el-col :span="12">
-                                    <el-form-item label="姓名" prop="true_name">
-                                        <el-input v-model="relativeFormModel.true_name" clearable placeholder="请输入姓名"
+                                    <el-form-item :label="this.$t('customerManage.customerRelativeTrueName')" prop="true_name">
+                                        <el-input v-model="relativeFormModel.true_name" clearable :placeholder="请输入姓名"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="亲属关系" prop="relative_name">
+                                    <el-form-item :label="this.$t('customerManage.relativeName')" prop="relative_name">
                                         <el-input v-model="relativeFormModel.relative_name" clearable
-                                                  placeholder="请输入亲属关系 如:朋友" :maxlength="20"/>
+                                                  :placeholder="this.$t('customerManage.inputRelativeName')" :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
                             </el-row>
                             <el-row>
                                 <el-col :span="12">
-                                    <el-form-item label="性别" class="form-item-sex">
-                                        <el-radio v-model="relativeFormModel.sex" :label="0"></el-radio>
-                                        <el-radio v-model="relativeFormModel.sex" :label="1"></el-radio>
+                                    <el-form-item :label="this.$t('member.sex')" class="form-item-sex">
+                                        <el-radio v-model="relativeFormModel.sex" :label="0">{{ this.$t('member.woman') }}</el-radio>
+                                        <el-radio v-model="relativeFormModel.sex" :label="1">{{ this.$t('member.man') }</el-radio>
                                         <!--                    <el-radio v-model="relativeFormModel.sex" :label="2">未知</el-radio>-->
                                     </el-form-item>
                                 </el-col>
                                 <el-col :span="12">
-                                    <el-form-item label="手机号码" prop="mobile">
-                                        <el-input v-model="relativeFormModel.mobile" clearable placeholder="请输入手机号码"
+                                    <el-form-item :label="this.$t('member.mobile')" prop="mobile">
+                                        <el-input v-model="relativeFormModel.mobile" clearable :placeholder="this.$t('member.inputMobile')"
                                                   :maxlength="20"/>
                                     </el-form-item>
                                 </el-col>
                             </el-row>
                             <el-form-item>
-                                <el-button type="primary" @click="addRelative">添加</el-button>
+                                <el-button type="primary" @click="addRelative">{{ this.$t('action.add') }}</el-button>
                             </el-form-item>
                         </el-form>
 
@@ -330,16 +342,16 @@
 
                 </el-tab-pane>
 
-                <el-tab-pane v-if="formmodel.id" label="体征" name="customer-vital-sign">
-                    <vital-sign-log :member-id="formmodel.id+''" :active-name="'vital_signs1'"/>
+                <el-tab-pane v-if="formmodel.id" :label="this.$t('customerManage.vital')" name="customer-vital-sign">
+                    <vital-sign-log :member-id="formmodel.member_id+''" :active-name="'vital_signs1'"/>
                 </el-tab-pane>
 
-                <el-tab-pane v-if="formmodel.id" label="备注" name="customerRemark">
+                <el-tab-pane v-if="formmodel.id" :label="this.$t('customerManage.remark')" name="customerRemark">
                     <div style="height: 450px;display: flex;flex-direction: column;">
                         <div style="height: 350px;overflow-y: auto;box-sizing:border-box;box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);margin:5px -10px">
                             <el-card v-for="(item, index) in remarks" :key="index" style="margin-bottom: 10px">
                                 <div>
-                                    <span style="margin-left: 20px;font-weight:bold">备注内容:</span><span
+                                    <span style="margin-left: 20px;font-weight:bold">{{ customerRemarks }}</span><span
                                         style="line-height:1.5">{{ item.content }}</span>
                                 </div>
                                 <div style="margin: 10px">
@@ -351,9 +363,9 @@
                                     </div>
                                     <div style="float: right">
                                         <p>
-                                            <span style="font-weight:bold">时间:</span>{{ item.create_time |
+                                            <span style="font-weight:bold">{{ customerRemarkTime }}</span>{{ item.create_time |
                                             unixDateFilter }}
-                                            <span style="font-weight:bold;margin-left: 10px;">备注人:</span>{{
+                                            <span style="font-weight:bold;margin-left: 10px;">{{ customerRemarkName }}</span>{{
                                             item.create_name }}
                                         </p>
                                     </div>
@@ -367,7 +379,7 @@
                                      style="margin-right: 10px">
                                 <el-row>
                                     <el-col :span="16">
-                                        <el-form-item label="内容" prop="content">
+                                        <el-form-item :label="this.$t('customerManage.content')" prop="content">
                                             <el-input
                                                     v-model="remarkFormModel.content"
                                                     type="textarea"
@@ -375,12 +387,12 @@
                                                     :minlength="2"
                                                     :maxlength="300"
                                                     show-word-limit
-                                                    :placeholder="'请输入文本内容,长度300'"
+                                                    :placeholder="this.$t('customerManage.inputContent')"
                                             />
                                         </el-form-item>
                                     </el-col>
                                     <el-col :span="8">
-                                        <el-form-item label="附件" style="margin-bottom: 0">
+                                        <el-form-item :label="this.$t('customerManage.uploader')" style="margin-bottom: 0">
                                             <el-upload
                                                     v-if="!attachFilePath"
                                                     class="attach-uploader"
@@ -396,7 +408,7 @@
                                     </el-col>
                                 </el-row>
                                 <el-form-item>
-                                    <el-button type="primary" @click="addRemark">添加备注</el-button>
+                                    <el-button type="primary" @click="addRemark">{{ this.$t('customerManage.addRemark') }}</el-button>
                                 </el-form-item>
                             </el-form>
                         </div>
@@ -407,18 +419,18 @@
         </el-dialog>
         <!-- 用户信息 -->
         <!-- 用户换床-->
-        <el-dialog :visible.sync="changeBedFormVisible" title="用户换床">
+        <el-dialog :visible.sync="changeBedFormVisible" :title="this.$t('customerManage.changeBed')">
             <el-form ref="changeBedForm" :model="changeBedFormModel" :rules="changeBedRules" label-width="120px">
                 <el-row>
                     <el-col :span="12">
-                        <el-form-item label="用户姓名" prop="named">
-                            <el-input v-model="changeBedFormModel.named" clearable placeholder="请输入姓名" readonly
+                        <el-form-item :label="this.$t('customerManage.named')" prop="named">
+                            <el-input v-model="changeBedFormModel.named" clearable :placeholder="this.$t('customerManage.inputNamed')" readonly
                                       :maxlength="20"/>
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="入住编号">
-                            <el-input v-model="changeBedFormModel.card_no" clearable placeholder="请输入病人编号" readonly
+                        <el-form-item :label="this.$t('customerManage.cardNo')">
+                            <el-input v-model="changeBedFormModel.card_no" clearable :placeholder="this.$t('customerManage.inputCardNo')" readonly
                                       :maxlength="20"/>
                         </el-form-item>
                     </el-col>
@@ -426,22 +438,22 @@
 
                 <el-row>
                     <el-col :span="12">
-                        <el-form-item label="性别" class="form-item-sex">
-                            <el-radio v-model="changeBedFormModel.sex" :label="0" disabled></el-radio>
-                            <el-radio v-model="changeBedFormModel.sex" :label="1" disabled></el-radio>
+                        <el-form-item :label="this.$t('member.sex')" class="form-item-sex">
+                            <el-radio v-model="changeBedFormModel.sex" :label="0" disabled>{{ this.$t('member.woman') }}</el-radio>
+                            <el-radio v-model="changeBedFormModel.sex" :label="1" disabled>{{ this.$t('member.man') }}</el-radio>
                             <!--              <el-radio v-model="changeBedFormModel.sex" :label="2" disabled>未知</el-radio>-->
                         </el-form-item>
                     </el-col>
 
                     <el-col :span="12">
-                        <el-form-item label="年龄" prop="age">
+                        <el-form-item :label="this.$t('customerManage.age')" prop="age">
                             <el-input v-model="changeBedFormModel.age" clearable :maxlength="4" readonly
-                                      placeholder="请输入年龄">
+                                      :placeholder="this.$t('customerManage.inputAge')">
                                 <el-select slot="append" v-model="changeBedFormModel.age_unit" disabled
-                                           placeholder="请选择年龄单位">
-                                    <el-option label="岁" value="岁"/>
-                                    <el-option label="月" value="月"/>
-                                    <el-option label="天" value="年"/>
+                                           :placeholder="this.$t('customerManage.choiceAgeUnit')">
+                                    <el-option :label="this.$t('customerManage.year')" value="岁"/>
+                                    <el-option :label="this.$t('customerManage.month')" value="月"/>
+                                    <el-option :label="this.$t('customerManage.day')" value="年"/>
                                 </el-select>
                             </el-input>
                         </el-form-item>
@@ -450,13 +462,13 @@
                 </el-row>
                 <el-row>
                     <el-col :span="12">
-                        <el-form-item label="当前床位" prop="nickname">
+                        <el-form-item :label="this.$t('customerManage.oldBed')" prop="nickname">
                             <el-input v-model="changeBedFormModel.current_bed" clearable readonly :maxlength="20"/>
                         </el-form-item>
                     </el-col>
                     <el-col :span="12">
-                        <el-form-item label="换到床位" prop="frame_id">
-                            <el-select v-model="changeBedFormModel.frame_id" clearable filterable placeholder="请选择床位">
+                        <el-form-item :label="this.$t('customerManage.newBed')" prop="frame_id">
+                            <el-select v-model="changeBedFormModel.frame_id" clearable filterable :placeholder="this.$t('customerManage.choiceNewBed')">
                                 <el-option v-for="(item,index) in emptyBeds" :key="index" :label="item.full_name"
                                            :value="item.id"/>
                             </el-select>
@@ -466,7 +478,7 @@
                 </el-row>
 
                 <el-form-item>
-                    <el-button type="primary" class="save" @click="handleChangeBedSubmit('changeBedForm')">确定
+                    <el-button type="primary" class="save" @click="handleChangeBedSubmit('changeBedForm')">{{ this.$t('action.yes') }}
                     </el-button>
                 </el-form-item>
             </el-form>
@@ -492,10 +504,13 @@
     import * as API_Clerk from '@/api/ncs_clerk'
     import * as API_NurseConfig from '@/api/ncs_nurse_config'
     import vitalSignLog from '@/views/vital-sign/log'
+    import vueQr from "vue-qr";
+    import avator from "@/assets/avatar.jpeg";
+    import {FRAME_TYPE} from "@/utils/enum/FrameTypeEnum";
     const serverUrl = domain.serverUrl
     export default {
         name: 'PatientManager',
-        components: {ButtonCellRender, ListFilter, RadioFilter, vitalSignLog},
+        components: {ButtonCellRender, ListFilter, RadioFilter, vitalSignLog, vueQr },
         filters: {
             unixDateFilter(val) {
                 return unixToDate(val)
@@ -544,6 +559,9 @@
                 isDisabled: false,
                 /** 备注 */
                 remarks: [],
+                customerRemarks: this.$t('customerManage.remarks'),
+                customerRemarkTime: this.$t('customerManage.remarkTime'),
+                customerRemarkName: this.$t('customerManage.remarkName'),
                 remarkParams: {
                     page_size: 100,
                     page_no: 1,
@@ -555,7 +573,7 @@
                     content: ''
                 },
                 remarkRules: {
-                    content: [{required: true, message: '请输入备注内容', trigger: 'blur'}]
+                    content: [{required: true, message: this.$t('customerManage.inputRemarks'), trigger: 'blur'}]
                 },
                 attachFilePath: null,
                 /** 亲属表单 **/
@@ -574,8 +592,8 @@
                     fixedCondition: Object.keys(this.frame).length === 0 ? 'part_id=' + this.$store.getters.partId : 'part_id=' + this.$store.getters.partId + ' and relative_id =' + this.formmodel.member_id
                 },
                 relativeRules: {
-                    true_name: [{required: true, message: '请输入姓名', trigger: 'blur'}],
-                    relative_name: [{required: true, message: '请输入亲属关系', trigger: 'blur'}],
+                    true_name: [{required: true, message: this.$t('customerManage.inputRemarks'), trigger: 'blur'}],
+                    relative_name: [{required: true, message: this.$t('customerManage.inputRelativeName'), trigger: 'blur'}],
                     mobile: [
                         {
                             validator: (rule, value, callback) => {
@@ -583,7 +601,7 @@
                                     callback()
                                 }
                                 if (!RegExp.mobile.test(value)) {
-                                    callback(new Error('手机格式有误!'))
+                                    callback(new Error(this.$t('member.mobileInputMsg')))
                                 } else {
                                     callback()
                                 }
@@ -595,7 +613,7 @@
                 changeBedFormVisible: false,
                 changeBedFormModel: {},
                 changeBedRules: {
-                    frame_id: [{required: true, message: '请选择床位!', trigger: 'blur'}]
+                    frame_id: [{required: true, message: this.$t('customerManage.choiceFrame'), trigger: 'blur'}]
                 },
                 /** 空床位 **/
                 emptyBeds: [],
@@ -603,17 +621,17 @@
                 isEmptyFrame: true,
                 rules: {
                     named: [
-                        this.MixinRequired('请输入用户姓名!')
+                        this.MixinRequired(this.$t('customerManage.inputNamed'))
                     ],
                     age: [
-                        {required: true, message: '请输入年龄', trigger: 'blur'}
+                        {required: true, message: this.$t('customerManage.inputAge'), trigger: 'blur'}
                     ],
                     mobile: [
-                        this.MixinRequired('请输入手机号!'),
+                        this.MixinRequired(this.$t('member.inputMobile')),
                         {
                             validator: (rule, value, callback) => {
                                 if (!RegExp.mobile.test(value)) {
-                                    callback(new Error('手机格式有误!'))
+                                    callback(new Error(this.$t('member.mobileInputMsg')))
                                 } else {
                                     callback()
                                 }
@@ -621,7 +639,7 @@
                         }
                     ],
                     frame_id: [
-                        {required: Object.keys(this.frame).length === 0, message: '请选床位!', trigger: 'blur'} // 没有传入frame 属性,必须选择床位
+                        {required: Object.keys(this.frame).length === 0, message: this.$t('customerManage.choiceFrame'), trigger: 'blur'} // 没有传入frame 属性,必须选择床位
                     ]
                 },
                 doctors: [],
@@ -630,12 +648,12 @@
                 nurseData: [],
                 nurseconfigSelection: [],
                 sexTransfer: [
-                    {key: '男', value: 1, color: 'green'},
-                    {key: '女', value: 0, color: 'red'}
+                    {key: this.$t('member.man'), value: 1, color: 'green'},
+                    {key: this.$t('member.woman'), value: 0, color: 'red'}
                 ],
                 customerStatusTransfer: [
-                    {key: '入住中', value: 0, color: 'green'},
-                    {key: '已离开', value: 1, color: 'red'}
+                    {key: this.$t('customerManage.customerStatusTrue'), value: 0, color: 'green'},
+                    {key: this.$t('customerManage.customerStatusFalse'), value: 1, color: 'red'}
                 ]
             }
         },
@@ -650,7 +668,22 @@
         },
         watch: {
             frame(val, oldvalue) {
-                this.params.fixedCondition = Object.keys(this.frame).length === 0 ? 'part_id=' + this.$store.getters.partId : 'part_id=' + this.$store.getters.partId + ' and frame_id =' + this.frame.id
+                // this.params.fixedCondition = Object.keys(this.frame).length === 0 ? 'part_id=' + this.$store.getters.partId : 'part_id=' + this.$store.getters.partId + ' and frame_id =' + this.frame.id
+                if (val.type === FRAME_TYPE.PART) { // 科室
+                  this.params.fixedCondition = ' part_id =' + this.frame.part_id
+                } else if (val.type === FRAME_TYPE.ROOM) { // 房间
+                  const ids = []
+                  this.frame.children.forEach(item => {
+                    ids.push(item.id)
+                  })
+                  if (ids.length > 0) {
+                    this.params.fixedCondition = ' frame_id in (' + ids + ')'
+                  } else {
+                    this.params.fixedCondition = ' frame_id = ' + this.frame.id
+                  }
+                } else {
+                  this.params.fixedCondition = ' frame_id = ' + this.frame.id
+                }
                 this.getList()
                 this.infoChanged()
             }
@@ -669,10 +702,10 @@
                     valueGetter: this.hashValueGetter
                 },
                 {headerName: 'ID', field: 'id', sortable: true, filter: 'agNumberColumnFilter', width: 100},
-                {headerName: '用户姓名', field: 'named', sortable: true, filter: 'agTextColumnFilter', width: 160},
-                {headerName: '昵称', field: 'nickname', sortable: true, filter: 'agTextColumnFilter', width: 130},
+                {headerName: this.$t('customerManage.named'), field: 'named', sortable: true, filter: 'agTextColumnFilter', width: 160},
+                {headerName: this.$t('customerManage.nickname'), field: 'nickname', sortable: true, filter: 'agTextColumnFilter', width: 130},
                 {
-                    headerName: '当前状态', field: 'status', sortable: true, filterFramework: 'RadioFilter', width: 130,
+                    headerName: this.$t('customerManage.customerStatus'), field: 'status', sortable: true, filterFramework: 'RadioFilter', width: 130,
                     filterParams: {
                         listData: this.customerStatusTransfer
                     },
@@ -682,7 +715,7 @@
                 // lockPinned = true 不能拖动然后固定
                 // resizeable 单元个大小是否可以调整
                 {
-                    headerName: '性别', field: 'sex', sortable: true, filterFramework: 'RadioFilter', width: 130,
+                    headerName: this.$t('member.sex'), field: 'sex', sortable: true, filterFramework: 'RadioFilter', width: 130,
                     filterParams: {
                         listData: this.sexTransfer
                     },
@@ -690,7 +723,7 @@
                 },
 
                 {
-                    headerName: '生日',
+                    headerName: this.$t('member.birthday'),
                     field: 'birthday',
                     sortable: true,
                     filter: 'agDateColumnFilter',
@@ -703,20 +736,20 @@
                     }
                 },
                 {
-                    headerName: '年龄', field: 'age', sortable: true, filter: 'agNumberColumnFilter', width: 130
+                    headerName: this.$t('customerManage.age'), field: 'age', sortable: true, filter: 'agNumberColumnFilter', width: 130
                 },
                 {
-                    headerName: '年龄单位', field: 'age_unit', sortable: true, filter: 'agTextColumnFilter', width: 130
+                    headerName: this.$t('customerManage.ageUnit'), field: 'age_unit', sortable: true, filter: 'agTextColumnFilter', width: 130
                 },
-                {headerName: '入住编号', field: 'card_no', sortable: true, filter: 'agTextColumnFilter'},
-                {headerName: '身份证件类型', field: 'id_type', sortable: true, filter: 'agTextColumnFilter'},
-                {headerName: '证件号码', field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', width: 160},
-                {headerName: '入住床位', field: 'full_name', sortable: true, filter: 'agTextColumnFilter'},
-                {headerName: '手机号码', field: 'mobile', sortable: true, filter: 'agTextColumnFilter'},
-                {headerName: '家庭住址', field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260},
+                {headerName: this.$t('customerManage.cardNo'), field: 'card_no', sortable: true, filter: 'agTextColumnFilter'},
+                {headerName: this.$t('customerManage.idType'), field: 'id_type', sortable: true, filter: 'agTextColumnFilter'},
+                {headerName: this.$t('customerManage.idNo'), field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', width: 160},
+                {headerName: this.$t('customerManage.frame'), field: 'full_name', sortable: true, filter: 'agTextColumnFilter'},
+                {headerName: this.$t('member.mobile'), field: 'mobile', sortable: true, filter: 'agTextColumnFilter'},
+                {headerName: this.$t('customerManage.homeAddress'), field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260},
 
                 {
-                    headerName: '入住时间',
+                    headerName: this.$t('customerManage.inDate'),
                     field: 'in_date',
                     sortable: true,
                     filter: 'agDateColumnFilter',
@@ -729,7 +762,7 @@
                     }
                 },
                 {
-                    headerName: '离开时间',
+                    headerName: this.$t('customerManage.outDate'),
                     field: 'out_date',
                     sortable: true,
                     filter: 'agDateColumnFilter',
@@ -742,11 +775,11 @@
                     }
                 },
                 {
-                    headerName: '编辑', field: 'id',
+                    headerName: this.$t('action.edit'), field: 'id',
                     cellRendererFramework: 'ButtonCellRender',
                     cellRendererParams: {
                         onClick: this.handleEdit,
-                        label: '编辑',
+                        label: this.$t('action.edit'),
                         buttonType: 'primary',
                         buttonSize: 'mini'
                     },
@@ -758,12 +791,12 @@
                     sortable: false
                 },
                 {
-                    headerName: '退床', field: 'id',
+                    headerName: this.$t('customerManage.outBed'), field: 'id',
                     cellRendererFramework: 'ButtonCellRender',
                     cellRendererParams: param => {
                         return {
                             onClick: this.handleOut,
-                            label: '退床',
+                            label: this.$t('customerManage.outBed'),
                             buttonType: 'warning',
                             buttonSize: 'mini',
                             disabled: param.data['status'] !== 0
@@ -777,12 +810,12 @@
                     sortable: false
                 },
                 {
-                    headerName: '换床', field: 'id',
+                    headerName: this.$t('customerManage.changeBed'), field: 'id',
                     cellRendererFramework: 'ButtonCellRender',
                     cellRendererParams: param => {
                         return {
                             onClick: this.handleChangeBed,
-                            label: '换床',
+                            label: this.$t('customerManage.changeBed'),
                             buttonType: 'success',
                             buttonSize: 'mini',
                             disabled: param.data['status'] !== 0
@@ -796,12 +829,12 @@
                     sortable: false
                 },
                 {
-                    headerName: '删除', field: 'shop_id',
+                    headerName: this.$t('action.delete'), field: 'shop_id',
                     cellRendererFramework: 'ButtonCellRender',
                     cellRendererParams: param => {
                         return {
                             onClick: this.deleteSingle,
-                            label: '删除',
+                            label: this.$t('action.delete'),
                             buttonType: 'danger',
                             buttonSize: 'mini',
                             disabled: param.data['member_name'] === 'superadmin'
@@ -874,7 +907,7 @@
                         this.emptyBeds = [...res]
                         resolve()
                     }).catch(err => {
-                        this.$message.error('获取空床位:' + err.message)
+                        this.$message.error(this.$t('customerManage.getEmptyBed') + err.message)
                         reject()
                     })
                 })
@@ -981,7 +1014,7 @@
                 if (item) {
                     return '<span style="color:' + item.color + ';">' + item.key + '</span>'
                 } else {
-                    return '未知'
+                    return this.$t('member.unknown')
                 }
             },
             /** 状态格式化 **/
@@ -991,7 +1024,7 @@
                 if (item) {
                     return '<span style="color:' + item.color + ';">' + item.key + '</span>'
                 } else {
-                    return '未知'
+                    return this.$t('member.unknown')
                 }
             },
             /** 格式化时间函数 */
@@ -1076,10 +1109,10 @@
                 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 格式!')
+                    this.$message.error(this.$t('member.faceImg'))
                 }
                 if (!isLt2M) {
-                    this.$message.error('上传头像图片大小不能超过 2MB!')
+                    this.$message.error(this.$t('member.faceSize'))
                 }
                 return isImg && isLt2M
             },
@@ -1104,7 +1137,7 @@
                         this.formmodel.list = list
                         if (!this.formmodel.id) {
                             API_Customer.addAll(this.formmodel).then(res => {
-                                this.$message.success('添加成功!')
+                                this.$message.success(this.$t('action.addSuccess'))
                                 this.customerFormVisible = false
                                 this.isDisabled = false
                                 this.getList()
@@ -1115,7 +1148,7 @@
                             })
                         } else {
                             API_Customer.updateAll(this.formmodel).then(res => {
-                                this.$message.success('修改成功!')
+                                this.$message.success(this.$t('action.editSuccess'))
                                 this.customerFormVisible = false
                                 this.getList()
                                 this.isDisabled = false
@@ -1126,7 +1159,7 @@
                             })
                         }
                     } else {
-                        this.$message.error('表单填写有误,请检查!')
+                        this.$message.error(this.$t('action.fromError'))
                         return false
                     }
                 })
@@ -1138,10 +1171,10 @@
             },
             /** 单条数据删除处理 */
             handlerDelete(ids) {
-                const test = '你确定要删除此用户信息?'
-                this.$confirm(test, '警告', {
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
+                const test = this.$t('member.deleteMember')
+                this.$confirm(test, this.$t('action.waring'), {
+                    confirmButtonText: this.$t('action.yes'),
+                    cancelButtonText: this.$t('action.cancel'),
                     type: 'warning'
                 }).then(() => {
                     API_Customer.remove(ids).then(
@@ -1156,7 +1189,7 @@
                         })
                     })
                 }).catch(() => {
-                    this.$message.info('取消删除!')
+                    this.$message.info(this.$t('action.cancelDelete'))
                 })
             },
 
@@ -1198,18 +1231,18 @@
                     ...row,
                     status: 1
                 }
-                this.$confirm('确定退床吗?', '警告', {
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
+                this.$confirm(this.$t('customerManage.sureOutBed'), this.$t('action.waring'), {
+                    confirmButtonText: this.$t('action.yes'),
+                    cancelButtonText: this.$t('action.cancel'),
                     type: 'warning'
                 }).then(() => {
                     API_Customer.updateAll(this.formmodel).then(res => {
-                        this.$message.success('退床成功!')
+                        this.$message.success(this.$t('customerManage.outBedSuccess'))
                         this.getList()
                         this.infoChanged()
                     })
                 }).catch(err => {
-                    this.$message.info('取消操作!')
+                    this.$message.info(this.$t('action.cancelHandle'))
                 })
             },
             /** 换床 **/
@@ -1226,13 +1259,13 @@
                 this.$refs[formName].validate(valid => {
                     if (valid) {
                         API_Customer.updateAll(this.changeBedFormModel).then(res => {
-                            this.$message.success('换床成功!')
+                            this.$message.success(this.$t('customerManage.changeBedSuccess'))
                             this.getList()
                             this.infoChanged()
                             this.changeBedFormVisible = false
                         })
                     } else {
-                        this.$message.error('表单填写有误,请检查!')
+                        this.$message.error(this.$t('action.fromError'))
                         return false
                     }
                 })
@@ -1261,13 +1294,13 @@
                         }
 
                         API_Remark.save(data).then(res => {
-                            this.$message.success('添加成功!')
+                            this.$message.success(this.$t('action.addSuccess'))
                             this.remarkFormModel = {}
                             this.attachFilePath = null
                             this.getRemarks()
                         })
                     } else {
-                        this.$message.error('表单填写有误,请检查!')
+                        this.$message.error(this.$t('action.fromError'))
                         return false
                     }
                 })
@@ -1287,11 +1320,11 @@
                     const isImg = extension === 'jpeg' || extension === 'png' || extension === 'jpg' || extension === 'txt' || extension === 'doc' || extension === 'docx' || extension === 'xls' || extension === 'xlsx'
                     const isLt5M = file.size / 1024 / 1024 < 5
                     if (!isImg) {
-                        this.$message.error('上传附件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!')
+                        this.$message.error(this.$t('customerManage.uploaderImg'))
                         reject()
                     }
                     if (!isLt5M) {
-                        this.$message.error('上传附件大小不能超过 5MB!')
+                        this.$message.error(this.$t('customerManage.uploaderSize'))
                         reject()
                     }
                     resolve()
@@ -1325,10 +1358,10 @@
             },
             /** 单条数据删除处理 */
             handlerDeleteRelative(ids) {
-                const test = '你确定要删除此病人亲属信息?'
-                this.$confirm(test, '警告', {
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
+                const test = this.$t('customerManage.sureDeleteRelative')
+                this.$confirm(test, this.$t('action.waring'), {
+                    confirmButtonText: this.$t('action.yes'),
+                    cancelButtonText: this.$t('action.cancel'),
                     type: 'warning'
                 }).then(() => {
                     API_User.remove(ids).then(
@@ -1345,11 +1378,11 @@
             },
             formatterSex(row, column, cellValue) {
                 if (row.sex === 1) {
-                    return '男'
+                    return this.$t('member.man')
                 } else if (row.sex === 0) {
-                    return '女'
+                    return this.$t('member.woman')
                 } else {
-                    return '未知'
+                    return this.$t('member.unknown')
                 }
             },
             /** 信息变化后操作,如床位状态改变,传入的空间结构变化了 **/
@@ -1451,7 +1484,7 @@
             batchDelete: function () {
                 const rows = this.gridApi.getSelectedRows()
                 if (rows.length === 0) {
-                    this.$message({type: 'info', message: '请先勾选需要删除的数据'})
+                    this.$message({type: 'info', message: this.$t('member.pleaseChoiceDelete')})
                     return
                 }
                 const ids = []
@@ -1465,6 +1498,9 @@
             },
             async deleteMembers(ids) {
                 API_User.remove(ids)
+            },
+            qrCode(member_id){
+              return 'http://m.wdklian.com/care/apk/care.user?type=USER_LOGIN&uid=' + member_id
             }
         }
     }

+ 1 - 1
src/views/hospital/ncs_frame/frameTreeView.vue

@@ -360,7 +360,7 @@ export default {
       kcCount: 82,
       bcCount: 56,
       /** 新建组织弹出参数 **/
-      formtitle: this.$t('frameManage.nowOrganization'),
+      formtitle: this.$t('frameManage.newOrganization'),
       formshow: false,
       formmodel: {},
       isShop: true

+ 1 - 1
src/views/hospitalFrame/frameTreeView-admin.vue

@@ -384,7 +384,7 @@ export default {
             })
           }
         } else {
-          this.$message.error(this.$t('error.fromError') + '')
+          this.$message.error(this.$t('action.fromError'))
           return false
         }
       })

+ 1 - 1
src/views/hospitalFrame/frameTreeView.vue

@@ -373,7 +373,7 @@ export default {
             })
           }
         } else {
-          this.$message.error(this.$t('error.fromError') + '')
+          this.$message.error(this.$t('action.fromError'))
           return false
         }
       })

+ 17 - 15
src/views/hospitalFrame/nurse_watch_frame.vue

@@ -3,14 +3,15 @@
     <el-card style="margin: 15px">
       <el-form ref="editform" label-width="80px">
         <fieldset class="margin-top-sm">
-          <legend>移动设备管辖空间</legend>
+          <legend>{{ watchDeviceFrame }}</legend>
           <el-row v-if="rooms.length > 1" :gutter="20" type="flex">
             <el-col v-for="(item,index) in rooms" :key="index" :xs="8" :sm="8" :md="6" :lg="6" :xl="6">
               <el-card class="box-card">
                 <div v-if="roleName !== '护士组长'" slot="header" class="clearfix">
                   <el-checkbox v-if="uiVersion === 1" v-model="item.checked" @change="handleCheckboxChanged(item)"><svg-icon icon-class="sickroom" style="color: #9aaabf;margin-right: 5px" /><span>{{ item.name }}</span></el-checkbox>
                   <span v-if="uiVersion !== 1"><svg-icon icon-class="sickroom" style="color: #9aaabf;margin-right: 5px" /><span>{{ item.name }}</span></span>
-                  <el-checkbox v-model="item.allCkeck" style="float: right" :indeterminate="item.indeterminate" @change="(checked)=>{handleCheckAll(checked,item)}">全选</el-checkbox>
+                  <el-checkbox v-model="item.allCkeck" style="float: right" :indeterminate="item.indeterminate" @change="(checked)=>{handleCheckAll(checked,item)}">
+                    {{ this.$t('action.choiceAll') }}</el-checkbox>
                 </div>
                 <div v-for="(bed,_index) in item.children" :key="_index" class="text item">
                   <el-checkbox  v-if="roleName !== '护士组长'" v-model="bed.checked" @change="handleCheckboxChanged(item)"><svg-icon icon-class="bed" style="color: #9aaabf;margin-right: 5px" />
@@ -32,7 +33,7 @@
                 <div v-if="roleName !== '护士组长'" style="margin: 10px;">
                   <el-checkbox v-if="uiVersion === 1" v-model="rooms[0].checked" @change="handleCheckboxChanged(rooms[0])"><svg-icon icon-class="sickroom" style="color: #9aaabf;margin-right: 5px" /><span>{{ rooms[0].name }}</span></el-checkbox>
                   <span v-if="uiVersion !== 1"><svg-icon icon-class="sickroom" style="color: #9aaabf;margin-right: 5px" /><span>{{ rooms[0].name }}</span></span>
-                  <el-checkbox v-model="rooms[0].allCkeck" style="margin-left: 30px;" :indeterminate="rooms[0].indeterminate" @change="(checked)=>{handleCheckAll(checked,rooms[0])}">全选</el-checkbox>
+                  <el-checkbox v-model="rooms[0].allCkeck" style="margin-left: 30px;" :indeterminate="rooms[0].indeterminate" @change="(checked)=>{handleCheckAll(checked,rooms[0])}">{{ this.$t('action.choiceAll') }}</el-checkbox>
                 </div>
                 <el-row>
                   <el-col v-for="(bed,_index) in rooms[0].children" :key="_index" :xs="8" :sm="8" :md="6" :lg="6" :xl="6">
@@ -53,12 +54,12 @@
           </el-row>
         </fieldset>
         <el-form-item v-if="roleName !== '护士组长'" align="center" class="margin-top-sm">
-          <el-button type="success" @click="onSubmit">保存设置</el-button>
-          <el-button type="primary" @click="onQK">清空设置</el-button>
-          <el-button @click="back">返回</el-button>
+          <el-button type="success" @click="onSubmit">{{ this.$t('action.choiceAll') }}</el-button>
+          <el-button type="primary" @click="onQK">{{ this.$t('action.deleteSettings') }}</el-button>
+          <el-button @click="back">{{ this.$t('action.back') }}</el-button>
         </el-form-item>
         <el-form-item v-else>
-          <div style="text-align:center;color: #13ce66">护士组长管理空间是其管辖护士的管理空间</div>
+          <div style="text-align:center;color: #13ce66">{{ this.$t('watch.nurseManageFrame') }}</div>
         </el-form-item>
       </el-form>
     </el-card>
@@ -104,7 +105,8 @@ export default {
       rooms: [],
       checkList: [],
       checkDate: [],
-      uiVersion: null
+      uiVersion: null,
+      watchDeviceFrame: this.$t('watch.keywords'),
     }
   },
   watch: {
@@ -231,26 +233,26 @@ export default {
         })
       })
       if (data.length === 0) {
-        this.$message.info('请选择床位!')
+        this.$message.info(this.$t('watch.choiceFrame'))
         return
       }
       API_hospitalFrame.updateDeviceFrameManage({ deviceId: this.deviceId, frameIds: data.join(','), delList: otherData }).then(res => {
-        this.$message.success('保存成功!')
+        this.$message.success(this.$t('action.saveSuccess'))
       })
     },
     onQK() {
       const _this = this
-      this.$confirm('确定要清空吗?', '警告', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('action.allDelete'), this.$t('action.waring'), {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
         API_hospitalFrame.qingkong(this.deviceId).then(res => {
-          _this.$message.success('清空成功!')
+          _this.$message.success(this.$t('action.allDeleteSuccess'))
           _this.back()
         })
       }).catch(() => {
-        console.log('取消')
+        console.log(this.$t('action.cancel'))
       })
     },
     back() {

+ 69 - 58
src/views/ncs-clerk/components/clerkList.vue

@@ -16,15 +16,15 @@
     >
       <div slot="toolbar" class="inner-toolbar">
         <div class="toolbar-search">
-          <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch" />
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
         </div>
 <!--        <div class="toolbar-btns">-->
 <!--          <el-button type="primary" @click="handleAddMember">新增</el-button>-->
 <!--          &lt;!&ndash; <el-button type="danger" @click="batchDelete">禁用</el-button>&ndash;&gt;-->
 <!--        </div>-->
         <div class="toolbar-btns">
-          <el-button v-if="part_view" type="primary" size="mini" @click="handleAddMember">新增</el-button>
-          <el-button v-if="part_view" type="danger" size="mini" @click="batchDelete">批量删除</el-button>
+          <el-button v-if="part_view" type="primary" size="mini" @click="handleAddMember">{{ this.$t('action.add') }}</el-button>
+<!--          <el-button v-if="part_view" type="danger" size="mini" @click="batchDelete">批量删除</el-button>-->
         </div>
       </div>
       <el-pagination
@@ -41,7 +41,7 @@
     </ag-grid-layout>
     <!--添加会员 dialog-->
     <el-dialog
-      title="编辑成员信息"
+      :title="this.$t('clerkManage.clerkEdit')"
       :visible.sync="dialogAddMemberVisible"
       width="60%"
       :close-on-click-modal="false"
@@ -50,7 +50,7 @@
       <el-form ref="addMemberForm" :model="addMemberForm" :rules="addMemberRules" label-width="110px" class="formwrap">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="头像">
+            <el-form-item :label="this.$t('member.face')">
               <el-upload
                 class="avatar-uploader"
                 :action="`${uploadurl}?scene=avatar`"
@@ -64,10 +64,10 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="登录名" prop="uname">
+            <el-form-item :label="this.$t('member.uname')" prop="uname">
               <el-input v-model="addMemberForm.uname" :maxlength="20" />
             </el-form-item>
-            <el-form-item label="密码" prop="password">
+            <el-form-item :label="this.$t('member.password')" prop="password">
               <el-input v-model="addMemberForm.password" :type="pwdType" :maxlength="20" />
               <span class="show-pwd" @click="pwdType = pwdType === 'password' ? 'text' : 'password'">
                 <svg-icon :icon-class="pwdType === 'password' ? 'eye' : 'eye-open'" />
@@ -78,12 +78,12 @@
 
         <el-row>
           <el-col :span="12">
-            <el-form-item label="真实姓名" prop="nickname">
+            <el-form-item :label="this.$t('member.nickname')" prop="nickname">
               <el-input v-model="addMemberForm.nickname" :maxlength="20" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="手机号码" prop="mobile">
+            <el-form-item :label="this.$t('member.mobile')" prop="mobile">
               <el-input v-model.number="addMemberForm.mobile" :maxlength="11" />
             </el-form-item>
           </el-col>
@@ -91,14 +91,14 @@
 
         <el-row>
           <el-col :span="12">
-            <el-form-item label="性别" class="form-item-sex">
-              <el-radio v-model="addMemberForm.sex" :label="1"></el-radio>
-              <el-radio v-model="addMemberForm.sex" :label="0"></el-radio>
+            <el-form-item :label="this.$t('member.sex')" class="form-item-sex">
+              <el-radio v-model="addMemberForm.sex" :label="1">{{ this.$t('member.man') }}</el-radio>
+              <el-radio v-model="addMemberForm.sex" :label="0">{{ this.$t('member.woman') }}</el-radio>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <!--固定电话-->
-            <el-form-item label="身份证号">
+            <el-form-item :label="this.$t('member.IDCard')">
               <el-input v-model="addMemberForm.midentity" :maxlength="20" />
             </el-form-item>
           </el-col>
@@ -109,22 +109,23 @@
         <el-row>
           <el-col :span="12">
             <!--生日-->
-            <el-form-item label="生日" prop="birthday">
+            <el-form-item :label="this.$t('member.birthday')" prop="birthday">
               <el-date-picker
                 v-model="addMemberForm.birthday"
                 type="date"
                 :editable="false"
                 value-format="timestamp"
-                placeholder="选择生日"
+                :placeholder="this.$t('member.choiceBirthday')"
                 :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="角色" prop="role_id">
+            <el-form-item :label="this.$t('clerkManage.role')" prop="role_id">
               <el-select
                 v-model="addMemberForm.role_id"
-                placeholder="请选择角色"
+                :placeholder="this.$t('clerkManage.choiceRole')"
+                :disabled="roleTypeDisabled"
                 clearable
               >
 
@@ -141,14 +142,14 @@
         <el-row>
           <el-col :span="24">
             <!--详细地址-->
-            <el-form-item label="详细地址" prop="address">
+            <el-form-item :label="this.$t('member.address')" prop="address">
               <el-input v-model="addMemberForm.address" :maxlength="50" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row v-if="nurseList.length > 0">
           <el-col :span="24">
-            <el-form-item label="小组成员">
+            <el-form-item :label="this.$t('clerkManage.clerkList')">
               <div class="text item">
                 <el-row>
                   <el-checkbox-group v-model="newCheckList">
@@ -175,14 +176,14 @@
         <!--        <el-row>-->
         <!--          <el-col :span="12">-->
         <!--            &lt;!&ndash;地区&ndash;&gt;-->
-        <!--            <el-form-item label="地区" prop="region" class="form-item-region">-->
+        <!--            <el-form-item :label="地区" prop="region" class="form-item-region">-->
         <!--              <en-region-picker :api="MixinRegionApi" @changed="(object) => { addMemberForm.region = object.last_id }"/>-->
         <!--            </el-form-item>-->
         <!--          </el-col>-->
         <!--          <el-col :span="12">-->
 
         <!--            &lt;!&ndash;邮箱&ndash;&gt;-->
-        <!--            <el-form-item label="邮箱" prop="email">-->
+        <!--            <el-form-item :label="邮箱" prop="email">-->
         <!--              <el-input v-model="addMemberForm.email"></el-input>-->
         <!--            </el-form-item>-->
         <!--          </el-col>-->
@@ -190,8 +191,8 @@
 
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button @click="dialogAddMemberVisible = false">取 消</el-button>
-        <el-button type="primary" @click="submitAddMemberForm('addMemberForm')">确 定</el-button>
+        <el-button @click="dialogAddMemberVisible = false">{{ this.$t('action.cancel') }}</el-button>
+        <el-button type="primary" @click="submitAddMemberForm('addMemberForm')">{{ this.$t('action.yes') }}</el-button>
       </div>
     </el-dialog>
 
@@ -211,6 +212,7 @@ import AgGridImg from '@/components/AgGridImg/AgGridImg'
 import ImageViewer from 'element-ui/packages/image/src/image-viewer'
 import RadioFilter from '@/components/AgGridCustomFilter/RadioFilter'
 import * as API_User from "@/api/user";
+import {ROLE_TYPE} from "@/utils/enum/RoleTypeEnum";
 let prevOverflow = ''
 const serverUrl = domain.serverUrl
 export default {
@@ -249,18 +251,22 @@ export default {
       /** 选中行数据 */
       multipleSelection: [],
       rolesOptions: [],
+      /**
+       * 角色选择,如果是机构负责人无法选择
+       */
+      roleTypeDisabled: false,
       /** 添加会员 表单规则 */
       addMemberRules: {
         uname: [
-          this.MixinRequired('请输入用户名'),
-          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
+          this.MixinRequired(this.$t('member.inputUname')),
+          { min: 2, max: 20, message: this.$t('member.unameInputMsg'), trigger: 'blur' }
         ],
         password: [
-          this.MixinRequired('请输入密码!'),
+          this.MixinRequired(this.$t('member.inputPassword')),
           {
             validator: (rule, value, callback) => {
               if (!RegExp.password.test(value)) {
-                callback(new Error('密码格式有误,密码只能包含字母数字和!#$%^&*.~,字符,长度为6-20位'))
+                callback(new Error(this.$t('member.passwordInputMsg')))
               } else {
                 callback()
               }
@@ -269,16 +275,16 @@ export default {
           }
         ],
         nickname: [
-          this.MixinRequired('请输入真实姓名'),
-          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
+          this.MixinRequired(this.$t('member.inputNickname')),
+          { min: 2, max: 20, message: this.$t('member.nicknameInputMsg'), trigger: 'blur' }
         ],
-        role_id: [this.MixinRequired('请选择角色')],
+        role_id: [this.MixinRequired(this.$t('clerkManage.choiceRole'))],
         mobile: [
-          this.MixinRequired('请输入手机号码!'),
+          this.MixinRequired(this.$t('member.inputMobile')),
           {
             validator: (rule, value, callback) => {
               if (!RegExp.mobile.test(value)) {
-                callback(new Error('手机格式格式有误'))
+                callback(new Error(this.$t('member.mobileInputMsg')))
               } else {
                 callback()
               }
@@ -287,7 +293,7 @@ export default {
           }
         ],
         address: [
-          { max: 50, message: '最长50个字符', trigger: 'blur' }]
+          { max: 50, message: this.$t('member.addressInputMsg'), trigger: 'blur' }]
       },
       pwdType: 'password',
       srcList: ['1'],
@@ -300,8 +306,8 @@ export default {
       rowSelection: null,
       showViewer: false,
       sexTransfer: [
-        { key: '男', value: 1 },
-        { key: '女', value: 0 }
+        { key: this.$t('member.man'), value: 1 },
+        { key: this.$t('member.woman'), value: 0 }
       ],
       roleId: null,
       roleZzId: null,
@@ -342,7 +348,7 @@ export default {
         resizable: false,
         valueGetter: this.hashValueGetter
       },
-      { headerName: '头像', field: 'face', sortable: true, filter: false, width: 70,
+      { headerName: this.$t('member.face'), field: 'face', sortable: true, filter: false, width: 70,
         cellRendererFramework: 'AgGridImg',
         cellRendererParams: param => {
           return {
@@ -351,21 +357,21 @@ export default {
           }
         }
       },
-      { headerName: '登录名', field: 'uname', sortable: true, filter: true, minWidth: 170 },
-      { headerName: '真实名字', field: 'clerk_name', sortable: true, filter: true, minWidth: 120 },
-      { headerName: '性别', field: 'sex', sortable: true, valueFormatter: this.formatterSex, width: 100, filterFramework: 'RadioFilter',
+      { headerName: this.$t('member.uname'), field: 'uname', sortable: true, filter: true, minWidth: 170 },
+      { headerName: this.$t('member.nickname'), field: 'clerk_name', sortable: true, filter: true, minWidth: 120 },
+      { headerName: this.$t('member.sex'), field: 'sex', sortable: true, valueFormatter: this.formatterSex, width: 100, filterFramework: 'RadioFilter',
         filterParams: {
           listData: this.sexTransfer
         }
       },
-      { headerName: '手机', field: 'mobile', sortable: true, filter: true, minWidth: 170 },
-      { headerName: '角色', field: 'role_name', sortable: true, filter: false, valueFormatter: this.formatterRole, width: 120 },
-      { headerName: '操作', field: 'id',
+      { headerName: this.$t('member.mobile'), field: 'mobile', sortable: true, filter: true, minWidth: 170 },
+      { headerName: this.$t('clerkManage.role'), field: 'role_name', sortable: true, filter: false, valueFormatter: this.formatterRole, width: 120 },
+      { headerName: this.$t('action.handle'), field: 'id',
         cellRendererFramework: 'ButtonCellRender',
         cellRendererParams: param => {
           return {
             onClick: this.handlerEdit,
-            label: '编辑',
+            label: this.$t('action.edit'),
             buttonType: 'primary',
             buttonSize: 'mini'
           }
@@ -442,9 +448,9 @@ export default {
     },
     /** 单条数据删除处理 */
     handlerDelete(ids) {
-      this.$confirm('你确定要禁用此用户?', '警告', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('member.disableClerk'), this.$t('action.waring'), {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
         clerk_API.remove(ids).then(
@@ -452,7 +458,7 @@ export default {
             this.GET_MemberList()
             this.$message({
               type: 'success',
-              message: '已禁用!'
+              message: this.$t('member.disabled')
             })
           }
         ).catch(response => {
@@ -464,7 +470,7 @@ export default {
       }).catch((response) => {
         this.$message({
           type: 'info',
-          message: '已取消禁用'
+          message: this.$t('member.disableCancel')
         })
       })
     },
@@ -486,7 +492,7 @@ export default {
     batchDelete: function() {
       const rows = this.gridApi.getSelectedRows()
       if (rows.length === 0) {
-        this.$message({ type: 'info', message: '请先勾选需要删除的数据' })
+        this.$message({ type: 'info', message: this.$t('action.pleaseChoiceDelete') })
         return
       }
       const ids = []
@@ -501,7 +507,7 @@ export default {
         uids.push(item.member_id)
       })
       if (isFounder === 1) {
-        this.$message({ type: 'info', message: '不能删除机构负责人' })
+        this.$message({ type: 'info', message: this.$t('action.cannotDeleteAdmin') })
         return
       }
       this.handlerDelete(ids.join(','))
@@ -512,11 +518,11 @@ export default {
     },
     /** 性别格式化 */
     formatterSex(row) {
-      return row.data.sex === 1 ? '男' : row.data.sex === 0 ? '女' : '未知'
+      return row.data.sex === 1 ? this.$t('action.man') : row.data.sex === 0 ? this.$t('action.woman') : this.$t('action.unknown')
     },
     formatterRole(row) {
       if (row.data.founder === 1) {
-        return '机构负责人'
+        return this.$t('clerkManage.admin')
       } else {
         return row.data.role_name
       }
@@ -560,7 +566,7 @@ export default {
             })
           }
         } else {
-          this.$message.error('表单填写有误,请检查!')
+          this.$message.error(this.$t('action.fromError'))
           return false
         }
       })
@@ -572,6 +578,7 @@ export default {
       this.addMemberForm = { sex: 1 }
       this.addMemberRules.password[0].required = true
       this.dialogAddMemberVisible = true
+      this.roleTypeDisabled = false
     },
     /** 编辑用户 */
     handlerEdit(row) {
@@ -579,6 +586,10 @@ export default {
       this.nurseList = []
       if (this.roleZzId && this.roleZzId === row.role_id) { // 只有护士组长才能编辑小组成员
         this.getNurseByRoleId(row.member_id)
+      } else if (row.role_id === ROLE_TYPE.PRINCIPAL) {
+        this.roleTypeDisabled = true
+      } else {
+        this.roleTypeDisabled = false
       }
       this.imageUrl = row.face
       delete this.addMemberForm.password
@@ -643,11 +654,11 @@ export default {
         const isLt2M = file.size / 1024 / 1024 < 2
 
         if (!isImg) {
-          this.$message.error('上传头像图片只能是 JPG、PNG、GIF 格式!')
+          this.$message.error(this.$t('member.faceImg'))
           reject()
         }
         if (!isLt2M) {
-          this.$message.error('上传头像图片大小不能超过 2MB!')
+          this.$message.error(this.$t('member.faceSize'))
           reject()
         }
 
@@ -658,15 +669,15 @@ export default {
             const width = image.width
             const height = image.height
             if (width > 500 || width < 100) {
-              this.$message.error('图片宽度必须在100~500之间,宽高比为1:1!')
+              this.$message.error(this.$t('member.faceError1'))
               reject()
             }
             if (width !== height) {
-              this.$message.error('请上传宽高比为1:1的图片')
+              this.$message.error(this.$t('member.faceError2'))
               reject()
             }
             if (height > 500 || height < 100) {
-              this.$message.error('图片高度必须在100~500之间!')
+              this.$message.error(this.$t('member.faceError3'))
               reject()
             }
             resolve()

+ 159 - 148
src/views/ncs-device/components/deviceManager.vue

@@ -18,11 +18,11 @@
     >
       <div slot="toolbar" class="inner-toolbar">
         <div class="toolbar-search">
-          <en-table-search placeholder="请输入搜索关键字" @search="handlerSearch" />
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
         </div>
         <div class="toolbar-btns">
-          <el-button v-if="part_view" type="primary" size="mini" @click="handleAdd">新增设备</el-button>
-          <el-button v-if="part_view" type="danger" size="mini" @click="batchDelete">批量删除</el-button>
+          <el-button v-if="part_view" type="primary" size="mini" @click="handleAdd">{{ this.$t('deviceManage.deviceAdd') }}</el-button>
+          <el-button v-if="part_view" type="danger" size="mini" @click="batchDelete">{{ this.$t('action.deleteList') }}</el-button>
         </div>
       </div>
       <el-pagination
@@ -43,107 +43,108 @@
       <el-form ref="deviceEditForm" :rules="deviceRules" label-width="120px" :model="deviceModel">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="设备类型" prop="device_type">
-              <el-select v-model="deviceModel.device_type" placeholder="请选择设备类型" :disabled="deviceTypeDisabled" clearable @change="deviceTypeChange">
-                <el-option v-for="(item,index) in deviceTypeTransfer" :key="index" :label="item.key" :value="item.value" />
+            <el-form-item :label="this.$t('deviceManage.deviceType')" prop="device_type">
+              <el-select v-model="deviceModel.device_type" :placeholder="this.$t('deviceManage.choiceDeviceType')" :disabled="deviceTypeDisabled" clearable @change="deviceTypeChange">
+<!--                <el-option v-for="(item,index) in deviceTypeTransfer" :key="index" :label="item.key" :value="item.value" />-->
+                <el-option v-for="(item, index) in Object.keys(deviceTypeEnum)" :key="index" :label="deviceTypeEnum[item]" :value="parseInt(item)" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="设备别名" prop="name">
-              <el-input v-model="deviceModel.name" clearable :maxlength="20" placeholder="请输入设备别名" />
+            <el-form-item :label="this.$t('deviceManage.deviceName')" prop="name">
+              <el-input v-model="deviceModel.name" clearable :maxlength="20" :placeholder="this.$t('deviceManage.inputDeviceName')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="出厂编号" prop="code">
-              <el-input v-model="deviceModel.code" clearable placeholder="请输入出厂编号" />
+            <el-form-item :label="this.$t('deviceManage.code')" prop="code">
+              <el-input v-model="deviceModel.code" clearable :placeholder="this.$t('deviceManage.inputCode')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="设备型号" prop="model">
-              <el-input v-model="deviceModel.model" clearable placeholder="请输入设备型号" />
+            <el-form-item :label="this.$t('deviceManage.model')" prop="model">
+              <el-input v-model="deviceModel.model" clearable :placeholder="this.$t('deviceManage.inputModel')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="有线物理地址" prop="eth_mac">
-              <el-input v-model="deviceModel.eth_mac" clearable placeholder="请输入物理MAC地址" />
+            <el-form-item :label="this.$t('deviceManage.ethMac')" prop="eth_mac">
+              <el-input v-model="deviceModel.eth_mac" clearable :placeholder="this.$t('deviceManage.inputEthMac')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="有线IP地址" prop="eth_ip">
-              <el-input v-model="deviceModel.eth_ip" clearable placeholder="请输入IP地址" />
+            <el-form-item :label="this.$t('deviceManage.ethIp')" prop="eth_ip">
+              <el-input v-model="deviceModel.eth_ip" clearable :placeholder="this.$t('deviceManage.inputEthIp')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="WIFI物理地址" prop="wifi_mac">
-              <el-input v-model="deviceModel.wifi_mac" clearable placeholder="请输入WIFI MAC地址" readonly />
+            <el-form-item :label="this.$t('deviceManage.wifiMac')" prop="wifi_mac">
+              <el-input v-model="deviceModel.wifi_mac" clearable :placeholder="this.$t('deviceManage.inputWifiMac')" readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="WIFIIP地址" prop="wifi_ip">
-              <el-input v-model="deviceModel.wifi_ip" clearable placeholder="请输入WIFI IP地址" readonly />
+            <el-form-item :label="this.$t('deviceManage.wifiIp')" prop="wifi_ip">
+              <el-input v-model="deviceModel.wifi_ip" clearable :placeholder="this.$t('deviceManage.inputWifiIp')" readonly />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="软件版本" prop="soft_ver">
-              <el-input v-model="deviceModel.soft_ver" clearable placeholder="请输入软件版本号" />
+            <el-form-item :label="this.$t('deviceManage.softVer')" prop="soft_ver">
+              <el-input v-model="deviceModel.soft_ver" clearable :placeholder="this.$t('deviceManage.inputSoftVer')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="硬件版本" prop="hard_ver">
-              <el-input v-model="deviceModel.hard_ver" clearable placeholder="请输入硬件版本号" />
+            <el-form-item :label="this.$t('deviceManage.hardVer')" prop="hard_ver">
+              <el-input v-model="deviceModel.hard_ver" clearable :placeholder="this.$t('deviceManage.inputHardVer')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="WIFI热点">
-              <el-input v-model="deviceModel.wifi_hostname" :readonly="true" clearable placeholder="请输入WIFI热点名称" />
+            <el-form-item :label="this.$t('deviceManage.wifiHostname')">
+              <el-input v-model="deviceModel.wifi_hostname" :readonly="true" clearable :placeholder="this.$t('deviceManage.inputWifiHostname')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="WIFI密码">
-              <el-input v-model="deviceModel.wifi_password" :readonly="true" clearable placeholder="请输入WIFI热点密码" />
+            <el-form-item :label="this.$t('deviceManage.wifiPassword')">
+              <el-input v-model="deviceModel.wifi_password" :readonly="true" clearable :placeholder="this.$t('deviceManage.inputPassword')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="设备位置" prop="frame_id">
-              <el-select v-model="deviceModel.frame_id" filterable clearable :disabled="frameSelectabled" placeholder="请选择安装位置">
+            <el-form-item :label="this.$t('deviceManage.frameName')" prop="frame_id">
+              <el-select v-model="deviceModel.frame_id" filterable clearable :disabled="frameSelectabled" :placeholder="this.$t('deviceManage.choiceFrameName')">
                 <el-option v-for="(item,index) in typeFrames" :key="index" :label="item.full_name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="设备电话号码">
-              <el-input v-model="deviceModel.phone_number" clearable placeholder="请输入设备电话号码" />
+            <el-form-item :label="this.$t('deviceManage.phoneNumber')">
+              <el-input v-model="deviceModel.phone_number" clearable :placeholder="this.$t('deviceManage.inputPhoneNumber')" />
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row>
           <el-col :span="12">
-            <el-form-item label="设备优先级">
+            <el-form-item :label="this.$t('deviceManage.priority')">
               <el-input-number v-model="deviceModel.priority" controls-position="right" :min="1" :max="99" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="后备设备ID">
+            <el-form-item :label="this.$t('deviceManage.backupId')">
               <el-input v-model="deviceModel.backup_id" clearable placeholder="" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="是否启用">
-              <el-checkbox v-model="deviceModel.status" :true-label="1" :false-label="0">启用设备</el-checkbox>
+            <el-form-item :label="this.$t('deviceManage.deviceStatus')">
+              <el-checkbox v-model="deviceModel.status" :true-label="1" :false-label="0">{{ this.$t('deviceManage.choiceDeviceStatus') }}</el-checkbox>
               <!--              <el-radio v-model="formmodel.status" :label="1">启用</el-radio>-->
               <!--              <el-radio v-model="formmodel.status" :label="0">不启用</el-radio>-->
             </el-form-item>
@@ -151,8 +152,8 @@
         </el-row>
         <el-row v-if="hasRoleId">
           <el-col :span="12">
-            <el-form-item label="适用角色" prop="role_id">
-              <el-select v-model="deviceModel.role_id" placeholder="适用角色" clearable>
+            <el-form-item :label="this.$t('deviceManage.roleName')" prop="role_id">
+              <el-select v-model="deviceModel.role_id" :placeholder="this.$t('deviceManage.roleName')" clearable>
                 <el-option v-for="item in rolesOptions" :key="item.role_id" :label="item.role_name" :value="item.role_id" />
               </el-select>
             </el-form-item>
@@ -160,15 +161,15 @@
         </el-row>
         <el-row v-if="hasAudioId">
           <el-col :span="12">
-            <el-form-item label="上属总线转换盒" prop="trans_audio_id">
-              <el-select v-model="deviceModel.trans_audio_id" placeholder="上属总线转换盒" clearable>
+            <el-form-item :label="this.$t('deviceManage.transAudio')" prop="trans_audio_id">
+              <el-select v-model="deviceModel.trans_audio_id" :placeholder="this.$t('deviceManage.transAudio')" clearable>
                 <el-option v-for="item in audioOptions" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="上属485转换盒" prop="trans_rs485_id">
-              <el-select v-model="deviceModel.trans_rs485_id" placeholder="上属485转换盒" clearable>
+            <el-form-item :label="this.$t('deviceManage.transRs485')" prop="trans_rs485_id">
+              <el-select v-model="deviceModel.trans_rs485_id" :placeholder="this.$t('deviceManage.transRs485')" clearable>
                 <el-option v-for="item in rs485Options" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
@@ -176,61 +177,64 @@
         </el-row>
         <el-row v-if="hasAudioId">
           <el-col :span="12">
-            <el-form-item label="485地址" prop="sip_id">
-              <el-input v-model="deviceModel.sip_id" clearable placeholder="请输入485地址" />
+            <el-form-item :label="this.$t('deviceManage.re485SipId')" prop="sip_id">
+              <el-input v-model="deviceModel.sip_id" clearable :placeholder="this.$t('deviceManage.inputRe485SipId')" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row v-if="hasSosDeviceSettings">
           <el-col :span="12">
-            <el-form-item label="报警设备模式" prop="type">
-              <el-select v-model="sosDeviceSetting.type" placeholder="报警设备模式" clearable>
-                <el-option v-for="item in sosDeviceSettingsTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+            <el-form-item :label="this.$t('deviceManage.sosDeviceSetting')" prop="type">
+              <el-select v-model="sosDeviceSetting.type" :placeholder="this.$t('deviceManage.sosDeviceSetting')" clearable>
+<!--                <el-option v-for="item in sosDeviceSettingsTypeOptions" :key="item.value" :label="item.label" :value="item.value" /><el-option v-for="(item, index) in Object.keys(sosDeviceSettingEnum)" :key="index" :label="sosDeviceSettingEnum[item]" :value="parseInt(item)" />-->
+                <el-option v-for="(item, index) in Object.keys(sosDeviceSettingEnum)" :key="index" :label="sosDeviceSettingEnum[item]" :value="parseInt(item)" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row v-if="sosDeviceSetting.type === 2">
           <el-col :span="12">
-            <el-form-item label="报警时间" prop="setting_time">
+            <el-form-item :label="this.$t('deviceManage.sosDeviceSettingTime')" prop="setting_time">
               <el-input-number v-model="sosDeviceSetting.setting_time" controls-position="right" :min="0" :max="60" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="报警时间单位" prop="unit">
+            <el-form-item :label="this.$t('deviceManage.sosDeviceSettingUnit')" prop="unit">
               <el-radio-group v-model="sosDeviceSetting.unit" size="mini" prop="unit">
-                <el-radio label="小时">小时</el-radio>
-                <el-radio label="分钟">分钟</el-radio>
-                <el-radio label="秒">秒</el-radio>
+                <el-radio :label="this.$t('action.time')">{{ this.$t('action.time') }}</el-radio>
+                <el-radio :label="this.$t('action.minute')">{{ this.$t('action.minute') }}</el-radio>
+                <el-radio :label="this.$t('action.second')">{{ this.$t('action.second') }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row v-if="isLedDevice">
           <el-col :span="12">
-            <el-form-item label="点阵屏规格" prop="led_resolution_ratio">
-              <el-input v-model="deviceModel.led_resolution_ratio" clearable placeholder="点阵屏规格" />
+            <el-form-item :label="this.$t('deviceManage.ledResolutionRatio')" prop="led_resolution_ratio">
+              <el-input v-model="deviceModel.led_resolution_ratio" clearable :placeholder="this.$t('deviceManage.ledResolutionRatio')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="语音播放" prop="led_voice">
-              <el-radio-group v-model="deviceModel.led_voice" size="mini" prop="unit">
-                <el-radio :label=1>开启语音</el-radio>
-                <el-radio :label=0>关闭语音</el-radio>
-              </el-radio-group>
+            <el-form-item :label="this.$t('deviceManage.ledVoice')" prop="led_voice">
+              <el-checkbox v-model="deviceModel.led_voice" :true-label="1" :false-label="0">
+                {{ this.$t('deviceManage.ledVoiceStatus') }}</el-checkbox>
+<!--              <el-radio-group v-model="deviceModel.led_voice" size="mini" prop="led_voice">-->
+<!--                <el-radio :label=1>开启语音</el-radio>-->
+<!--                <el-radio :label=0>关闭语音</el-radio>-->
+<!--              </el-radio-group>-->
             </el-form-item>
           </el-col>
         </el-row>
         <el-row v-if="isLedDevice">
           <el-col :span="12">
-            <el-form-item label="字体大小" prop="led_font_size">
+            <el-form-item :label="this.$t('deviceManage.ledFontSize')" prop="led_font_size">
               <el-input-number v-model="deviceModel.led_font_size" controls-position="right" :min="0" :max="60" />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="handlerFormSubmit('deviceEditForm')">确 定</el-button>
+        <el-button type="primary" @click="handlerFormSubmit('deviceEditForm')">{{ this.$t('action.yes') }}</el-button>
       </div>
     </el-dialog>
     <!-- 设备编辑弹窗 -->
@@ -250,6 +254,7 @@ import * as clerk_API from '@/api/ncs_clerk'
 // import { DeviceUrl } from '@/utils/domain'
 import { FRAME_TYPE } from '@/utils/enum/FrameTypeEnum'
 import { DEVICE_TYPE } from '@/utils/enum/DeviceTypeEnum'
+import {SOS_DEVICE_SETTING_TYPE} from "@/utils/enum/SosDeviceSettingTypeEnum";
 const DeviceUrl = domain.DeviceUrl
 export default {
   name: 'DeviceManager',
@@ -288,38 +293,38 @@ export default {
       },
       /** device 弹窗 **/
       deviceDialogVisible: false,
-      deviceEditTitle: '添加设备',
+      deviceEditTitle: this.$t('deviceManage.deviceAdd'),
       deviceModel: {},
       deviceTypeDisabled: false,
       deviceRules: {
         name: [
-          this.MixinRequired('请输入设备别名!')
+          this.MixinRequired(this.$t('deviceManage.inputDeviceName'))
         ],
         device_type: [
-          { required: true, message: '请选择设备类型', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.choiceDeviceType'), trigger: 'blur' }
         ],
         code: [
-          { required: true, message: '请输入设备编码', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.inputCode'), trigger: 'blur' }
         ],
         model: [
-          { required: true, message: '请输入设备型号', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.inputModel'), trigger: 'blur' }
         ],
         eth_mac: [
-          { required: true, message: '请输入设备MAC地址', trigger: 'blur' },
+          { required: true, message: this.$t('deviceManage.inputEthMac'), trigger: 'blur' },
           // { pattern: /^([0-9A-Fa-f]{2}:?){6}/gi, message: '请输入正确的MAC地址', trigger: 'blur' }
-          { pattern: null, message: '请输入正确的MAC地址', trigger: 'blur' }
+          { pattern: null, message: this.$t('deviceManage.inputTrueEthMac'), trigger: 'blur' }
         ],
         frame_id: [
-          { required: Object.keys(this.frame).length === 0, message: '请选安装位置!', trigger: 'blur' } // 没有传入frame 属性,必须选择安装位置
+          { required: Object.keys(this.frame).length === 0, message: this.$t('deviceManage.choiceFrameName'), trigger: 'blur' } // 没有传入frame 属性,必须选择安装位置
         ],
         phone_number: [
-          { required: true, message: '请输入设备电话号码', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.phoneNumber'), trigger: 'blur' }
         ],
         role_id: [
-          { required: true, message: '请选择适用人', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.choiceRoleName'), trigger: 'blur' }
         ],
         trans_audio_id: [
-          { required: true, message: '请选择总线转换盒', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.choiceTransAudio'), trigger: 'blur' }
         ],
         // trans_rs485_id: [
         //   { required: true, message: '请选择485转换盒', trigger: 'blur' }
@@ -337,51 +342,52 @@ export default {
         //   { required: true, message: '报警时间单位', trigger: 'blur' }
         // ],
         led_resolution_ratio: [
-          { required: true, message: '点阵屏规格', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.ledResolutionRatio'), trigger: 'blur' }
         ],
         led_voice: [
-          { required: true, message: '点阵屏语音播放', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.ledVoice'), trigger: 'blur' }
         ],
         led_font_size: [
-          { required: true, message: '点阵屏字体大小', trigger: 'blur' }
+          { required: true, message: this.$t('deviceManage.ledFontSize'), trigger: 'blur' }
         ],
       },
       partFrames: [],
       typeFrames: [],
       /** 设备类型转换数组 **/
       deviceTypeTransfer: [
-        { key: '护士主机', value: 1 },
-        { key: '医生主机', value: 2 },
-        { key: '门口机', value: 3 },
-        { key: '床位分机', value: 4 },
-        { key: 'LCD走廊屏', value: 5 },
-        { key: 'LED点阵屏', value: 6 },
-        { key: '移动设备', value: 7 },
+        { key: this.$t('deviceType.NURSE_HOST'), value: 1 },
+        { key: this.$t('deviceType.DOCTOR_HOST'), value: 2 },
+        { key: this.$t('deviceType.DOOR_DEVICE'), value: 3 },
+        { key: this.$t('deviceType.DIGIT_BED_DEVICE'), value: 4 },
+        { key: this.$t('deviceType.LCD_SCREEN'), value: 5 },
+        { key: this.$t('deviceType.LED_SCREEN'), value: 6 },
+        { key: this.$t('deviceType.NURSE_WATCH'), value: 7 },
         // { key: '护工腕表', value: 8 },
-        { key: '病人腕表', value: 9 },
-        { key: '手机App', value: 10 },
-        { key: '总线转换盒', value: 11 },
-        { key: '模拟分机', value: 12 },
-        { key: '模拟紧急按钮', value: 13 },
-        { key: '模拟门灯', value: 14 },
-        { key: '遥控器', value: 15 },
-        { key: '信标', value: 16 },
-        { key: '看板', value: 17 },
-        { key: '门禁设备', value: 18 },
-        { key: '探视机', value: 19 },
-        { key: '485转换盒', value: 20 },
-        { key: '紧急按钮', value: 21 },
-        { key: '485门口机', value: 22 },
-        { key: '红外报警器', value: 23 },
-        { key: '用水监控器', value: 24 },
-        { key: '家用燃起报警器', value: 25 },
-        { key: '家用烟雾报警器', value: 26 },
-        { key: '一键报警器', value: 27 },
-        { key: '门磁传感器', value: 30 }
+        { key: this.$t('deviceType.WORKER_WATCH'), value: 9 },
+        { key: this.$t('deviceType.USER_WATCH'), value: 10 },
+        { key: this.$t('deviceType.CELL_PHONE'), value: 11 },
+        { key: this.$t('deviceType.TRANSFER_DEVICE'), value: 12 },
+        { key: this.$t('deviceType.SIMULATE_BED_DEVICE'), value: 13 },
+        { key: this.$t('deviceType.SIMULATE_EMERGENCY_BUTTON'), value: 14 },
+        { key: this.$t('deviceType.SIMULATE_DOOR_LIGHT'), value: 15 },
+        { key: this.$t('deviceType.REMOTE_CONTROL'), value: 16 },
+        { key: this.$t('deviceType.BEACON'), value: 17 },
+        { key: this.$t('deviceType.INFORMATION_BOARD'), value: 18 },
+        { key: this.$t('deviceType.ENTRANCE_GUARD'), value: 19 },
+        { key: this.$t('deviceType.VISITATION'), value: 20 },
+        { key: this.$t('deviceType.RS485_TRANSFER'), value: 21 },
+        { key: this.$t('deviceType.EMERGENCY_BUTTON'), value: 22 },
+        { key: this.$t('deviceType.RS485_DOOR'), value: 23 },
+        { key: this.$t('deviceType.ALARM_BODY_INDUCTIVE'), value: 24 },
+        { key: this.$t('deviceType.ALARM_WATER_OVERFLOW'), value: 25 },
+        { key: this.$t('deviceType.ALARM_HOUSEHOLD_GAS'), value: 26 },
+        { key: this.$t('deviceType.ALARM_HOUSEHOLD_SMOKE'), value: 27 },
+        { key: this.$t('deviceType.DOOR_LOCK'), value: 30 }
       ],
+      deviceTypeEnum: DEVICE_TYPE.getValueList(),
       deviceStatusTransfer: [
-        { key: '启用', value: 1, color: 'green' },
-        { key: '未启用', value: 0, color: 'red' }
+        { key: this.$t('deviceManage.statusTure'), value: 1, color: 'green' },
+        { key: this.$t('deviceManage.statusFalse'), value: 0, color: 'red' }
       ],
       rolesOptions: [],
       hasRoleId: false,
@@ -402,6 +408,7 @@ export default {
           label: '关爱老人模式'
         }
       ],
+      sosDeviceSettingEnum: SOS_DEVICE_SETTING_TYPE.getValueList(),
       isLedDevice: false,
       websock: null,
       onlineDevice: []
@@ -435,25 +442,26 @@ export default {
         valueGetter: this.hashValueGetter
       },
       { headerName: 'ID', field: 'id', sortable: true, filter: 'agNumberColumnFilter', width: 100 },
-      { headerName: '设备类型', field: 'device_type', sortable: true,
+      { headerName: this.$t('deviceManage.deviceType'), field: 'device_type', sortable: true,
         filterFramework: 'ListFilter', width: 160,
         filterParams: {
-          listData: this.deviceTypeTransfer
+          // listData: this.deviceTypeTransfer
+          listData: DEVICE_TYPE.getValueList()
         },
         valueGetter: this.deviceTypeGetter
       },
       // lockPosition 锁定位置,会在第一列
       // lockPinned = true 不能拖动然后固定
       // resizeable 单元个大小是否可以调整
-      { headerName: '设备别名', field: 'name', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '设备状态', field: 'status', sortable: true,
+      { headerName: this.$t('deviceManage.deviceName'), field: 'name', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.status'), field: 'status', sortable: true,
         filterFramework: 'RadioFilter',
         filterParams: {
           listData: this.deviceStatusTransfer
         },
         cellRenderer: this.deviceStatusFormatter
       },
-      { headerName: '连接状态', field: 'online_state', sortable: false, filter: 'agTextColumnFilter',
+      { headerName: this.$t('deviceManage.connect'), field: 'online_state', sortable: false, filter: 'agTextColumnFilter',
 
         filterParams: {
           textCustomComparator: (filter, value, filterText) => {
@@ -484,29 +492,29 @@ export default {
         },
         cellRenderer: this.onlineStateFormatter
       },
-      { headerName: '部署位置', field: 'full_name', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '设备号码', field: 'phone_number', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '以太网MAC地址', field: 'eth_mac', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '以太网IP地址', field: 'eth_ip', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '通讯端口', field: 'eth_ip_port', sortable: true, filter: 'agNumberColumnFilter' },
-      { headerName: '设备型号', field: 'model', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '出厂编号', field: 'code', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '软件版本', field: 'soft_ver', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '硬件版本', field: 'hard_ver', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '无线MAC地址', field: 'wifi_mac', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '无线IP地址', field: 'wifi_ip', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: 'SIP账号', field: 'sip_id', sortable: true, filter: 'agTextColumnFilter' },
-      { headerName: '更新时间', field: 'update_time', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
+      { headerName: this.$t('deviceManage.frameFullName'), field: 'full_name', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.phoneNumber'), field: 'phone_number', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.ethMac'), field: 'eth_mac', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.ethIp'), field: 'eth_ip', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.ethIpPort'), field: 'eth_ip_port', sortable: true, filter: 'agNumberColumnFilter' },
+      { headerName: this.$t('deviceManage.model'), field: 'model', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.code'), field: 'code', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.softVer'), field: 'soft_ver', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.hardVer'), field: 'hard_ver', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.wifiMac'), field: 'wifi_mac', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.wifiIp'), field: 'wifi_ip', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.sipId'), field: 'sip_id', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('deviceManage.updateTime'), field: 'update_time', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.unixDateFormatter, filterParams: {
         comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
           const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
           return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
         }
       }},
-      { headerName: '编辑', field: 'id',
+      { headerName: this.$t('action.edit'), field: 'id',
         cellRendererFramework: 'ButtonCellRender',
         cellRendererParams: {
           onClick: this.handleEdit,
-          label: '编辑',
+          label: this.$t('action.edit'),
           buttonType: 'primary',
           buttonSize: 'mini'
         },
@@ -516,12 +524,12 @@ export default {
         width: 90,
         resizable: false,
         sortable: false },
-      { headerName: '删除', field: 'id',
+      { headerName: this.$t('action.delete'), field: 'id',
         cellRendererFramework: 'ButtonCellRender',
         cellRendererParams: param => {
           return {
             onClick: this.deleteSingle,
-            label: '删除',
+            label: this.$t('action.delete'),
             buttonType: 'danger',
             buttonSize: 'mini',
             disabled: param.data['member_name'] === 'superadmin'
@@ -584,13 +592,13 @@ export default {
               const mac = this.onlineDevice.filter(p => p.toLowerCase() === item.eth_mac.toLowerCase())[0]
               // console.log('在线设备1', mac)
               if (mac !== undefined && mac !== null) {
-                item['online_state'] = '在线'
+                item['online_state'] = this.$t('deviceManage.connectTrue')
               } else {
-                item['online_state'] = '离线'
+                item['online_state'] = this.$t('deviceManage.connectFalse')
               }
             }
           } else {
-            item['online_state'] = '离线'
+            item['online_state'] = this.$t('deviceManage.connectFalse')
           }
         })
         this.rowData = deviceData
@@ -665,13 +673,14 @@ export default {
     },
     /** 处理搜索 */
     handlerSearch(keywords) {
-      this.params.query = keywords
+      this.params.query = keywordsgridSortChange
       this.getList()
     },
     /** 获取设备类型文字显示,从deviceTypeTransfer 中找出value值对应的key显示出来 */
     deviceTypeGetter(params) {
       const gridVal = params.data.device_type
-      return this.deviceTypeTransfer.filter(p => p.value === gridVal).map(p => p.key)
+      // return this.deviceTypeTransfer.filter(p => p.value === gridVal).map(p => p.key)
+      return DEVICE_TYPE.getDescFromValue(gridVal)
     },
     /** 格式化时间函数 */
     unixDateFormatter(param) {
@@ -690,10 +699,12 @@ export default {
     },
     /** 设备连接状态格式化 **/
     onlineStateFormatter(params) {
-      if (params.value === '在线') {
-        return '<span style="color:green;">在线</span>'
+      if (params.value === this.$t('deviceManage.connectTrue')) {
+        // return '<span style="color:green;">在线</span>'
+        return '<span style="color:green;">' + this.$t('deviceManage.connectTrue') + '</span>'
       } else {
-        return '<span style="color:gray;">离线</span>'
+        // return '<span style="color:gray;">离线</span>'
+        return '<span style="color:gray;">' + this.$t('deviceManage.connectFalse') + '</span>'
       }
     },
     /** 删除设备 **/
@@ -702,9 +713,9 @@ export default {
     },
     /** 删除设备 **/
     handlerDelete(id) {
-      this.$confirm('删除操作后数据不可复原,您确定要删除此数据?', '警告', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('action.sureDelete'),  this.$t('action.waring'), {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
         API_Device.remove(id).then(
@@ -726,7 +737,7 @@ export default {
       }).catch(() => {
         this.$message({
           type: 'info',
-          message: '已取消删除'
+          message: this.$t('action.cancelDelete')
         })
       })
     },
@@ -816,7 +827,7 @@ export default {
       this.hasSosDeviceSettings = false
       this.isLedDevice = false
       this.getDevices(this.$store.getters.partId)
-      this.deviceEditTitle = '添加设备'
+      this.deviceEditTitle = this.$t('deviceManage.deviceAdd')
       this.deviceDialogVisible = true
       this.deviceTypeDisabled = false // 新增设备可以选择设备类型
       this.typeFrames = this.partFrames
@@ -839,7 +850,7 @@ export default {
       this.deviceModel = {
         ...params
       }
-      this.deviceEditTitle = '修改设备'
+      this.deviceEditTitle = this.$t('deviceManage.deviceEdit')
       this.deviceDialogVisible = true
       this.deviceTypeDisabled = true // 修改设备时,不能改变设备类型
     },
@@ -851,14 +862,14 @@ export default {
           /** 新增 */
           if (!this.deviceModel.id) {
              API_Device.add(this.deviceModel).then(r => {
-               this.$message.success('保存成功!')
+               this.$message.success(this.$t('action.saveSuccess'))
                _this.device = r
                this.sosDeviceSetting.device_id = _this.device.id
                this.sosDeviceSetting.part_id = _this.device.part_id
 
                if (this.hasSosDeviceSettings) {
                  API_SosDeviceSetting.add(this.sosDeviceSetting).then(() => {
-                   this.$message.success('保存成功!')
+                   this.$message.success(this.$t('action.saveSuccess'))
                    this.hasSosDeviceSettings = false
                  })
                }
@@ -869,13 +880,13 @@ export default {
           } else {
             /** 修改 */
             API_Device.update(this.deviceModel.id, this.deviceModel).then(() => {
-              this.$message.success('修改成功!')
+              this.$message.success(this.$t('action.editSuccess'))
 
               if (this.hasSosDeviceSettings) {
                 this.sosDeviceSetting.device_id = this.deviceModel.id
                 this.sosDeviceSetting.part_id = this.deviceModel.part_id
                 API_SosDeviceSetting.updateByDeviceId(this.deviceModel.id, this.sosDeviceSetting).then(() => {
-                  this.$message.success('保存成功!')
+                  this.$message.success(this.$t('action.saveSuccess'))
                   this.hasSosDeviceSettings = false
                 })
               }
@@ -928,10 +939,10 @@ export default {
       this.websock.onclose = this.websocketclose
     },
     websocketonopen: function() {
-      console.log('WebSocket连接成功')
+      console.log(this.$t('deviceManage.webSocketSuccess'))
     },
     websocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
+      console.log(this.$t('deviceManage.webSocketError'))
     },
     websocketonmessage: function(e) {
       this.onlineDevice = JSON.parse(e.data)
@@ -939,7 +950,7 @@ export default {
         for (let i = 0; i < this.rowData.length; i++) {
           if (this.rowData[i].eth_mac) {
             const mac = this.onlineDevice.filter(p => p.toLowerCase() === this.rowData[i].eth_mac.toLowerCase())[0]
-            this.rowData[i]['online_state'] = (mac !== undefined && mac !== null) ? '在线' : '离线'
+            this.rowData[i]['online_state'] = (mac !== undefined && mac !== null) ? this.$t('deviceManage.connectTrue') : this.$t('deviceManage.connectFalse')
           }
         }
         const rowData = [...this.rowData]
@@ -952,7 +963,7 @@ export default {
     batchDelete() {
       const rows = this.gridApi.getSelectedRows()
       if (rows.length === 0) {
-        this.$message({ type: 'info', message: '请先勾选需要删除的数据' })
+        this.$message({ type: 'info', message: this.$t('action.pleaseChoiceDelete') })
         return
       }
       const ids = []

+ 48 - 47
src/views/ncs-device/nurse_watch.vue

@@ -17,7 +17,7 @@
       <!--工具栏-->
       <div slot="toolbar" class="inner-toolbar">
         <div class="toolbar-search">
-          <en-table-search placeholder="请输入设备别名或设备标识码" @search="handlerSearch" />
+          <en-table-search :placeholder="this.$t('watch.deviceKeywords')" @search="handlerSearch" />
         </div>
       </div>
       <el-pagination
@@ -33,11 +33,11 @@
       />
     </ag-grid-layout>
     <!--编辑表单-->
-    <el-dialog v-if="formshow" title="编辑" :visible.sync="formshow" width="70%">
+    <el-dialog v-if="formshow" :title="this.$t('action.edit')" :visible.sync="formshow" width="70%">
       <el-tabs v-model="activeName">
-        <el-tab-pane label="换   班" name="huan-ban">
+        <el-tab-pane :label="this.$t('watch.huanBan')" name="huan-ban">
           <el-form label-width="120px" style="min-width: 100%;float:left;">
-            <el-form-item label="设备标识码">
+            <el-form-item :label="this.$t('watch.ethMac')">
               {{ deviceInfo.eth_mac }}
             </el-form-item>
             <el-form-item v-for="(item, index) in nurses" :key="index" :label="item[0]" v-if="item[0] !== '管理员'">
@@ -48,19 +48,19 @@
               </el-radio-group>
             </el-form-item>
             <el-form-item style="margin-top:15px;">
-              <el-button type="success" @click="handlerFormSubmit('editform')">保存修改</el-button>
-              <el-button v-if="member_id" type="primary" @click="xiaban">初始化设备</el-button>
+              <el-button type="success" @click="handlerFormSubmit('editform')">{{ this.$t('action.saveEdit') }}</el-button>
+              <el-button v-if="member_id" type="primary" @click="xiaban">{{ this.$t('watch.initializeDevice') }}</el-button>
             </el-form-item>
           </el-form>
         </el-tab-pane>
-        <el-tab-pane v-if="member_id" label="管理空间" name="watch-frame">
+        <el-tab-pane v-if="member_id" :label="this.$t('watch.watchFrame')" name="watch-frame">
           <nurse-watch-frame :device-id="deviceInfo.id" :role-id="role_id" :role-name="role_name" :member-id="member_id" @fanhui="fanhui" />
         </el-tab-pane>
       </el-tabs>
     </el-dialog>
 
 <!--    位置信息-->
-    <el-dialog title="位置信息" :visible.sync="locationShow" width="70%">
+    <el-dialog :title="this.$t('watch.placeInfo')" :visible.sync="locationShow" width="70%">
       <watch-location :device-id="deviceId" :is-show="locationShow"></watch-location>
     </el-dialog>
   </div>
@@ -90,7 +90,7 @@ export default {
       /** 表单校验 */
       rules: {
         name: [
-          { required: true, message: '请输入名称', trigger: 'blur' }
+          { required: true, message: this.$t('watch.inputName'), trigger: 'blur' }
         ]
       },
       pageData: [],
@@ -117,8 +117,8 @@ export default {
       showViewer: false,
       timer: '',
       deviceStatusTransfer: [
-        { key: '启用', value: 1, color: 'green' },
-        { key: '未启用', value: 0, color: 'red' }
+        { key: this.$t('deviceManage.statusTure'), value: 1, color: 'green' },
+        { key: this.$t('deviceManage.statusFalse'), value: 0, color: 'red' }
       ],
       clerks: [],
       role_id: null,
@@ -145,20 +145,21 @@ export default {
         headerCheckboxSelectionFilteredOnly: true,
         checkboxSelection: true,
         sortable: false,
-        width: 50,
+        width: 80,
         resizable: false,
         valueGetter: this.hashValueGetter
       },
-      { headerName: '设备别名', field: 'name', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: 'ID', field: 'id', sortable: true, filter: 'agNumberColumnFilter', minWidth: 100 },
+      { headerName: this.$t('deviceManage.deviceName'), field: 'name', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: '设备状态', field: 'status', sortable: true, cellRenderer: this.formatterSatus, minWidth: 120, filterFramework: 'RadioFilter',
       //   filterParams: {
       //     listData: this.deviceStatusTransfer
       //   }
       // },
-      { headerName: '绑定人', field: 'member_name', sortable: true, filter: 'agTextColumnFilter', minWidth: 140, valueFormatter: this.formatterName },
+      { headerName: this.$t('watch.deviceMember'), field: 'member_name', sortable: true, filter: 'agTextColumnFilter', minWidth: 140, valueFormatter: this.formatterName },
       // { headerName: '所属位置', field: 'full_name', sortable: true, filter: 'agTextColumnFilter', minWidth: 140 },
-      { headerName: '设备标识码', field: 'eth_mac', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
-      { headerName: '连接状态', field: 'online_state', sortable: false, filter: 'agTextColumnFilter', minWidth: 120,
+      { headerName: this.$t('watch.ethMac'), field: 'eth_mac', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: this.$t('deviceManage.connect'), field: 'online_state', sortable: false, filter: 'agTextColumnFilter', minWidth: 120,
         filterParams: {
           textCustomComparator: (filter, value, filterText) => {
             const filterTextLowerCase = filterText.toLowerCase()
@@ -186,16 +187,16 @@ export default {
         },
         cellRenderer: this.onlineStateFormatter
       },
-      { headerName: '有线IP地址', field: 'eth_ip', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
-      { headerName: '设备型号', field: 'model', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
-      { headerName: '出厂编号', field: 'code', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: this.$t('deviceManage.ethIp'), field: 'eth_ip', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: this.$t('deviceManage.model'), field: 'model', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: this.$t('deviceManage.code'), field: 'code', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: '软件版本', field: 'soft_ver', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: '硬件版本', field: 'hard_ver', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: 'WIFI物理地址', field: 'wifi_mac', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: 'WIFIIP地址', field: 'wifi_ip', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
-      { headerName: 'SIP账号', field: 'sip_id', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
+      { headerName: this.$t('deviceManage.sipId'), field: 'sip_id', sortable: true, filter: 'agTextColumnFilter', minWidth: 150 },
       // { headerName: '最后修改时间', field: 'update_time', sortable: true, valueFormatter: this.formatterDate, minWidth: 170 },
-      { headerName: '更新时间', field: 'update_time', sortable: true, filter: 'agDateColumnFilter', minWidth: 170, valueFormatter: this.formatterDate,
+      { headerName: this.$t('deviceManage.updateTime'), field: 'update_time', sortable: true, filter: 'agDateColumnFilter', minWidth: 170, valueFormatter: this.formatterDate,
         filterParams: {
           comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
             const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
@@ -204,12 +205,12 @@ export default {
         }
       },
       {
-        headerName: '换班', field: 'shop_id',
+        headerName: this.$t('watch.huanBan'), field: 'shop_id',
         cellRendererFramework: 'ButtonCellRender',
         cellRendererParams: param => {
           return {
             onClick: this.huanban,
-            label: param.data['member_id'] === null ? '绑定' : '换班',
+            label: param.data['member_id'] === null ? this.$t('watch.binding') : this.$t('watch.huanBan'),
             buttonType: param.data['member_id'] === null ? 'primary' : 'success',
             buttonSize: 'mini'
           }
@@ -222,12 +223,12 @@ export default {
         sortable: false
       },
       {
-        headerName: '位置', field: 'shop_id',
+        headerName: this.$t('watch.place'), field: 'shop_id',
         cellRendererFramework: 'ButtonCellRender',
         cellRendererParams: param => {
           return {
             onClick: this.getLocation,
-            label: '位置',
+            label: this.$t('watch.place'),
             buttonType: 'warning',
             buttonSize: 'mini'
           }
@@ -295,14 +296,14 @@ export default {
       this.websock.onclose = this.websocketclose
     },
     websocketonopen: function() {
-      console.log('WebSocket连接成功1111111')
-      this.$message.success('连接成功')
+      console.log(this.$t('deviceManage.webSocketSuccess'))
+      // this.$message.success('连接成功')
     },
     websocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
+      console.log(this.$t('deviceManage.webSocketError'))
     },
     websocketonmessage: function(e) {
-      console.log('收到消息:', e.data)
+      console.log(this.$t('action.getMsg'), e.data)
       if (e.data) {
         this.activeName = 'huan-ban'
         this.formshow = true
@@ -315,7 +316,7 @@ export default {
     },
     websocketclose: function(e) {
       const _this = this
-      console.log('socket连接关闭connection closed (' + e.code + ')')
+      console.log('connection closed (' + e.code + ')')
       clearTimeout(_this.timer)
       _this.timer = setTimeout(_this.initWebSocket, 30000)
       // this.$alert('连接已断开,需重新连接', '连接确定', {
@@ -334,10 +335,10 @@ export default {
       this.websock1.onclose = this.deviceOnlineWebsocketclose
     },
     deviceOnlineWebsocketonopen: function() {
-      console.log('WebSocket连接成功')
+      console.log(this.$t('deviceManage.webSocketSuccess'))
     },
     deviceOnlineWebsocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
+      console.log(this.$t('deviceManage.webSocketError'))
     },
     deviceOnlineWebsocketonmessage: function(e) {
       this.onlineDevice = JSON.parse(e.data)
@@ -379,12 +380,12 @@ export default {
             const mac = this.onlineDevice.filter(p => p.toLowerCase() === item.eth_mac.toLowerCase())[0]
             // console.log('在线设备1', mac)
             if (mac !== undefined && mac !== null) {
-              item['online_state'] = '在线'
+              item['online_state'] = this.$t('deviceManage.connectTrue')
             } else {
-              item['online_state'] = '离线'
+              item['online_state'] = this.$t('deviceManage.connectFalse')
             }
           } else {
-            item['online_state'] = '离线'
+            item['online_state'] = this.$t('deviceManage.connectFalse')
           }
         })
         this.tableData = response.data
@@ -406,11 +407,11 @@ export default {
     /** 新增 提交表单 */
     handlerFormSubmit(formName) {
       if (this.deviceInfo.member_id === null || this.deviceInfo.member_id === '') {
-        this.$message.info('请选择护士')
+        this.$message.info(this.$t('watch.choiceNurse'))
         return
       }
       if (this.deviceInfo.member_id === this.member_id) {
-        this.$message.info('未做任何改变')
+        this.$message.info(this.$t('watch.doNothing'))
         return
       }
       const params = this.MixinClone(this.deviceInfo)
@@ -427,9 +428,9 @@ export default {
       _this.getEmployees()
     },
     xiaban() {
-      this.$confirm('您确定要初始化吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('action.sureInitialize'), this.$t('action.tips'), {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
         const params = this.MixinClone(this.deviceInfo)
@@ -447,7 +448,7 @@ export default {
       this.websock.send(JSON.stringify(sendData))
       const _this = this
       setTimeout(function() {
-        _this.$message.success('操作成功')
+        _this.$message.success(this.$t('action.handleSuccess'))
         _this.getList()
       }, 1000)
     },
@@ -477,7 +478,7 @@ export default {
         if (params.value) {
           return params.value
         } else if (params.data.role_name) {
-          return '未绑定 ' + params.data.role_name
+          return this.$t('watch.binding') + params.data.role_name
         }
       }
     },
@@ -522,9 +523,9 @@ export default {
     },
     formatterSatus(param) {
       if (param.value === 1) {
-        return '<span style="color:green">已启用</span>'
+        return '<span style="color:green">' + this.$t('deviceManage.statusTure') + '</span>'
       } else {
-        return '<span style="color:red">未启用</span>'
+        return '<span style="color:red">' + this.$t('deviceManage.statusFalse') + '</span>'
       }
     },
     getEmployees() {
@@ -555,7 +556,7 @@ export default {
       if (row.role_id) {
         this.$router.push({ name: 'nurseWatchFrame', params: { id: row.id, role_id: row.role_id, callback: this.getList() }})
       } else {
-        this.$message.error('请先设置适用人')
+        this.$message.error(this.$t('deviceManage.choiceRoleName'))
       }
     },
     huanban(row) {
@@ -580,9 +581,9 @@ export default {
     /** 设备连接状态格式化 **/
     onlineStateFormatter(params) {
       if (params.value === '在线') {
-        return '<span style="color:green;">在线</span>'
+        return '<span style="color:green;">' + this.$t('deviceManage.connectTrue') + '</span>'
       } else {
-        return '<span style="color:gray;">离线</span>'
+        return '<span style="color:gray;">' + this.$t('deviceManage.connectFalse') + '</span>'
       }
     },
     getLocation(row) {

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

@@ -4,10 +4,11 @@
       <el-date-picker
           v-model="queryTime"
           type="date"
-          placeholder="选择日期进行搜索"
+          :placeholder="this.$t('watch.dateKeywords')"
           value-format="yyyy-MM-dd">
       </el-date-picker>
-      <el-button type="primary" plain style="margin-left: 30px" v-loading.fullscreen.lock="fullscreenLoading" @click="getNewLocation">获取最新位置</el-button>
+      <el-button type="primary" plain style="margin-left: 30px" v-loading.fullscreen.lock="fullscreenLoading" @click="getNewLocation">
+        {{ this.$t('watch.getNewPlace') }}</el-button>
       <el-tag v-if="myTitle" style="margin-left: 20px;" type="warning">{{ myTitle }}</el-tag>
     </div>
     <div>
@@ -29,8 +30,9 @@
     <div v-if="locationList.length > 0" style="margin-top: 20px;">
       <el-card>
         <div v-for="(item, index) in locationList" :key="index" class="text item">
-          <i class="el-icon-user-solid"></i> 您于 <el-tag><i class="el-icon-time"></i>{{ formatterCreateTime(item.create_time )}}</el-tag> 在
-          <el-tag type="success"><i class="el-icon-location-outline"></i>{{ item.full_name }}</el-tag>附近
+          <i class="el-icon-user-solid"></i> {{ this.$t('watch.you') }} <el-tag><i class="el-icon-time"></i>{{ formatterCreateTime(item.create_time )}}</el-tag> 在
+          <el-tag type="success"><i class="el-icon-location-outline"></i>{{ item.full_name }}</el-tag>
+          {{ this.$t('watch.nearby') }}
         </div>
       </el-card>
     </div>
@@ -138,7 +140,7 @@ export default {
       let myId = ''
       const time = Date.parse(new Date()) / 1000
       if (time - this.tableData[0].create_time > 60) {
-        _this.myTitle = '当前不在信标范围内'
+        _this.myTitle = this.$t('watch.notCovered')
       }
       this.tableData.reverse()
       for (let i = 0; i< _this.tableData.length; i++) {
@@ -151,7 +153,7 @@ export default {
             document.getElementById('myIcon'+data.frame_id).style.display='inline'
             _this.$notify({
               title: data.full_name,
-              message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+              message: unixToDate(data.create_time) + this.$t('watch.in') + data.full_name + this.$t('watch.nearby'),
               position: 'bottom-right',
               showClose: false,
               duration: 2500
@@ -228,13 +230,13 @@ export default {
       this.websock.onclose = this.websocketclose
     },
     websocketonopen: function() {
-      console.log('WebSocket连接成功')
+      console.log(this.$t('deviceManage.webSocketSuccess'))
     },
     websocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
+      console.log(this.$t('deviceManage.webSocketError'))
     },
     websocketonmessage: function(e) {
-      console.log('收到消息:', e.data)
+      console.log(this.$t('action.getMsg'), e.data)
       const data = JSON.parse(e.data)
       if (data.frame_id) {
         this.myTitle = ''
@@ -247,7 +249,7 @@ export default {
         document.getElementById('myIcon'+data.frame_id).style.display='inline'
         this.$notify({
           title: data.full_name,
-          message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+          message: unixToDate(data.create_time) + this.$t('watch.in') + data.full_name + this.$t('watch.nearby'),
           showClose: false,
           offset: 100
         })
@@ -266,7 +268,7 @@ export default {
 
     },
     websocketclose: function(e) {
-      console.log('socket连接关闭connection closed (' + e + ')')
+      console.log('connection closed (' + e + ')')
     }
   }
 }

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

@@ -4,10 +4,11 @@
       <el-date-picker
           v-model="queryTime"
           type="date"
-          placeholder="选择日期进行搜索"
+          :placeholder="this.$t('watch.dateKeywords')"
           value-format="yyyy-MM-dd">
       </el-date-picker>
-      <el-button type="primary" plain style="margin-left: 30px" v-loading.fullscreen.lock="fullscreenLoading" @click="getNewLocation">获取最新位置</el-button>
+      <el-button type="primary" plain style="margin-left: 30px" v-loading.fullscreen.lock="fullscreenLoading" @click="getNewLocation">
+        {{ this.$t('watch.getNewPlace') }}</el-button>
       <el-tag v-if="myTitle" style="margin-left: 20px;" type="warning">{{ myTitle }}</el-tag>
     </div>
     <div>
@@ -29,8 +30,9 @@
     <div v-if="locationList.length > 0" style="margin-top: 20px;">
       <el-card>
         <div v-for="(item, index) in locationList" :key="index" class="text item">
-          <i class="el-icon-user-solid"></i> 您于 <el-tag><i class="el-icon-time"></i>{{ formatterCreateTime(item.create_time )}}</el-tag> 在
-          <el-tag type="success"><i class="el-icon-location-outline"></i>{{ item.full_name }}</el-tag>附近
+          <i class="el-icon-user-solid"></i> {{ this.$t('watch.you') }} <el-tag><i class="el-icon-time"></i>{{ formatterCreateTime(item.create_time )}}</el-tag> 在
+          <el-tag type="success"><i class="el-icon-location-outline"></i>{{ item.full_name }}</el-tag>
+          {{ this.$t('watch.nearby') }}
         </div>
       </el-card>
     </div>
@@ -141,7 +143,7 @@ export default {
       let myId = ''
       const time = Date.parse(new Date()) / 1000
       if (time - this.tableData[0].create_time > 60) {
-        _this.myTitle = '当前不在信标范围内'
+        _this.myTitle = this.$t('watch.notCovered')
       }
       this.tableData.reverse()
       for (let i = 0; i< _this.tableData.length; i++) {
@@ -154,7 +156,7 @@ export default {
             document.getElementById('myIcon'+data.beacon_device_id).style.display='inline'
             _this.$notify({
               title: data.full_name,
-              message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+              message: unixToDate(data.create_time) + this.$t('watch.in') + data.full_name + this.$t('watch.nearby'),
               position: 'bottom-right',
               showClose: false,
               duration: 2500
@@ -231,13 +233,13 @@ export default {
       this.websock.onclose = this.websocketclose
     },
     websocketonopen: function() {
-      console.log('WebSocket连接成功')
+      console.log(this.$t('deviceManage.webSocketSuccess'))
     },
     websocketonerror: function(e) {
-      console.log('WebSocket连接发生错误')
+      console.log(this.$t('deviceManage.webSocketError'))
     },
     websocketonmessage: function(e) {
-      console.log('收到消息:', e.data)
+      console.log(this.$t('action.getMsg'), e.data)
       const data = JSON.parse(e.data)
       if (data.beacon_device_id) {
         this.myTitle = ''
@@ -250,7 +252,7 @@ export default {
         document.getElementById('myIcon'+data.beacon_device_id).style.display='inline'
         this.$notify({
           title: data.full_name,
-          message: unixToDate(data.create_time) + '在' + data.full_name + '附近',
+          message: unixToDate(data.create_time) + this.$t('watch.in') + data.full_name + this.$t('watch.nearby'),
           showClose: false,
           offset: 100
         })
@@ -269,7 +271,7 @@ export default {
 
     },
     websocketclose: function(e) {
-      console.log('socket连接关闭connection closed (' + e + ')')
+      console.log('connection closed (' + e + ')')
     }
   }
 }

+ 14 - 1
src/views/ncs-interaction/index.vue

@@ -116,7 +116,10 @@ export default {
       columnApi: null,
       localeText: AG_GRID_LOCALE_CN,
       rowSelection: null,
-      showViewer: false
+      showViewer: false,
+      tcpActionTransfer: [
+        { key: 'TCP反馈', value: 'CALLBACK' }
+      ]
     }
   },
   computed: {
@@ -310,6 +313,10 @@ export default {
           return '语音'
         case 'VIDEO':
           return '视频'
+        case 'SOS':
+          return '紧急呼叫'
+        case 'REINFORCE':
+          return '增援'
         case 'IM':
           return '留言'
         case 'DEVICE':
@@ -318,12 +325,18 @@ export default {
           return '数据'
         case 'EVENT':
           return '事件'
+        case 'SIDE':
+          return '边外信息'
         case 'BROADCAST':
           return '广播'
         case 'TIME':
           return '时间'
         case 'ENTRACEGUARD':
           return '门禁'
+        case 'CHANNELIM':
+          return '频道留言'
+        case 'LOCATION':
+          return '定位'
         default:
           return '未知'
       }

+ 139 - 119
src/views/ncs-orginazition/components/partInfoEdit.vue

@@ -3,43 +3,43 @@
     <el-card style="margin: 15px">
       <el-form ref="editform" :rules="rules" label-width="130px" :model="formmodel">
         <fieldset>
-          <legend>基本信息</legend>
+          <legend>{{ this.$t('partInfo.baseInfo') }}</legend>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="组织简称" prop="shop_name">
-                <el-input v-model="formmodel.shop_name" clearable :maxlength="100" placeholder="请输入组织简称" />
+              <el-form-item :label="this.$t('partInfo.shopName')" prop="shop_name">
+                <el-input v-model="formmodel.shop_name" clearable :maxlength="100" :placeholder="this.$t('partInfo.inputShopName')" />
               </el-form-item>
 
             </el-col>
             <el-col :span="8">
-              <el-form-item label="组织全称" prop="full_name">
-                <el-input v-model="formmodel.full_name" clearable :maxlength="100" placeholder="请输入组织全称" />
+              <el-form-item :label="this.$t('partInfo.shopFullName')" prop="full_name">
+                <el-input v-model="formmodel.full_name" clearable :maxlength="100" :placeholder="this.$t('partInfo.inputShopFullName')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="HIS系统标识" prop="his_code">
-                <el-input v-model="formmodel.his_code" clearable :maxlength="100" placeholder="请输入HIS系统标识" />
+              <el-form-item :label="this.$t('partInfo.hisCode')" prop="his_code">
+                <el-input v-model="formmodel.his_code" clearable :maxlength="100" :placeholder="this.$t('partInfo.inputHisCode')" />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="组织类型" prop="shop_type">
-                <el-select v-model="formmodel.shop_type" placeholder="请选择组织类型" disabled clearable>
-                  <el-option label="医院" value="6" />
-                  <el-option label="科室" value="5" />
-                  <el-option label="机构" value="0" />
+              <el-form-item :label="this.$t('partInfo.shopType')" prop="shop_type">
+                <el-select v-model="formmodel.shop_type" :placeholder="this.$t('partInfo.choiceShopType')" disabled clearable>
+                  <el-option :label="this.$t('partInfo.hospital')" value="6" />
+                  <el-option :label="this.$t('partInfo.part')" value="5" />
+                  <el-option :label="this.$t('partInfo.organization')" value="0" />
                 </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="管理员账号" prop="member_name">
-                <el-input v-model="formmodel.member_name" clearable :maxlength="100" readonly placeholder="请输入管理员账号" />
+              <el-form-item :label="this.$t('partInfo.shopMemberName')" prop="member_name">
+                <el-input v-model="formmodel.member_name" clearable :maxlength="100" readonly :placeholder="this.$t('partInfo.inputShopMemberName')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="所属组织" prop="parent_id">
-                <el-select v-model="formmodel.parent_id" placeholder="请选择上级组织" clearable>
+              <el-form-item :label="this.$t('partInfo.shopParentId')" prop="parent_id">
+                <el-select v-model="formmodel.parent_id" :placeholder="this.$t('partInfo.choiceShopParentId')" clearable>
                   <el-option
                     v-for="(item,index) in parents"
                     :key="index"
@@ -53,46 +53,46 @@
           </el-row>
         </fieldset>
         <fieldset class="margin-top-sm">
-          <legend>白天参数设置</legend>
+          <legend>{{ this.$t('partInfo.dayInfo') }}</legend>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="白天开始时间" prop="dayStart">
+              <el-form-item :label="this.$t('partInfo.dayStart')" prop="dayStart">
                 <el-time-picker
                   v-model="dayStart"
-                  placeholder="白天开始时间"
+                  :placeholder="this.$t('partInfo.dayStart')"
                 />
               </el-form-item>
-              <el-form-item label="主机通话音量" prop="day_vol">
-                <el-input-number v-model="formmodel.day_vol" :min="0" :max="100" label="主机通话音量" />
-                <!--                <el-input-number v-model="formmodel.day_vol" :min="0" :max="2" label="主机叫号参数" />-->
+              <el-form-item :label="this.$t('partInfo.dayOrNightVol')" prop="day_vol">
+                <el-input-number v-model="formmodel.day_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightVol')" />
+                <!--                <el-input-number v-model="formmodel.day_vol" :min="0" :max="2" :label="主机叫号参数" />-->
               </el-form-item>
-              <el-form-item label="门口机通话音量" prop="day_door_vol">
-                <el-input-number v-model="formmodel.day_door_vol" :min="0" :max="100" label="门口机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightDoorVol')" prop="day_door_vol">
+                <el-input-number v-model="formmodel.day_door_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightDoorVol')" />
               </el-form-item>
-              <el-form-item label="转换盒通话音量" prop="day_transfer_box_vol">
-                <el-input-number v-model="formmodel.day_transfer_box_vol" :min="0" :max="100" label="分机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightTransferBoxVol')" prop="day_transfer_box_vol">
+                <el-input-number v-model="formmodel.day_transfer_box_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightTransferBoxVol')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="分机液晶屏亮度" prop="day_light">
-                <el-input-number v-model="formmodel.day_light" :min="0" :max="100" label="分机液晶屏亮度" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightLight')" prop="day_light">
+                <el-input-number v-model="formmodel.day_light" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightLight')" />
               </el-form-item>
-              <el-form-item label="呼叫响铃次数" prop="day_ring_times">
-                <el-input-number v-model="formmodel.day_ring_times" :min="0" :max="10" label="主机叫号次数" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightRingTimes')" prop="day_ring_times">
+                <el-input-number v-model="formmodel.day_ring_times" :min="0" :max="10" :label="this.$t('partInfo.dayOrNightRingTimes')" />
               </el-form-item>
-              <el-form-item label="分机通话音量" prop="day_bed_vol">
-                <el-input-number v-model="formmodel.day_bed_vol" :min="0" :max="100" label="分机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightBedVol')" prop="day_bed_vol">
+                <el-input-number v-model="formmodel.day_bed_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightBedVol')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="主机系统音量" prop="day_ring_vol">
-                <el-input-number v-model="formmodel.day_ring_vol" :min="0" :max="100" label="主机系统音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightRingVol')" prop="day_ring_vol">
+                <el-input-number v-model="formmodel.day_ring_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightRingVol')" />
               </el-form-item>
-              <el-form-item label="分机护理灯亮度" prop="day_nurse_led">
-                <el-input-number v-model="formmodel.day_nurse_led" :min="0" :max="100" label="分机护理灯亮度" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightNurseLed')" prop="day_nurse_led">
+                <el-input-number v-model="formmodel.day_nurse_led" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightNurseLed')" />
               </el-form-item>
-              <el-form-item label="转换盒系统音量" prop="day_transfer_box_system_vol">
-                <el-input-number v-model="formmodel.day_transfer_box_system_vol" :min="0" :max="100" label="转换盒系统音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightTransferBoxSystemVol')" prop="day_transfer_box_system_vol">
+                <el-input-number v-model="formmodel.day_transfer_box_system_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightTransferBoxSystemVol')" />
               </el-form-item>
             </el-col>
           </el-row>
@@ -100,54 +100,54 @@
         </fieldset>
 
         <fieldset class="margin-top-sm">
-          <legend>夜晚参数设置</legend>
+          <legend>{{ this.$t('partInfo.nightInfo') }}</legend>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="夜晚开始时间" prop="nightStart">
+              <el-form-item :label="this.$t('partInfo.nightStart')" prop="nightStart">
                 <el-time-picker
                   v-model="nightStart"
-                  placeholder="夜晚开始时间"
+                  :placeholder="this.$t('partInfo.nightStart')"
                 />
               </el-form-item>
-              <el-form-item label="主机通话音量" prop="night_vol">
-                <el-input-number v-model="formmodel.night_vol" :min="0" :max="100" label="主机通话音量" />
-                <!--                <el-input-number v-model="formmodel.night_vol" :min="0" :max="2" label="主机叫号参数" />-->
+              <el-form-item :label="this.$t('partInfo.dayOrNightVol')" prop="night_vol">
+                <el-input-number v-model="formmodel.night_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightVol')" />
+                <!--                <el-input-number v-model="formmodel.night_vol" :min="0" :max="2" :label="主机叫号参数" />-->
                 <!--                <span class="red-text">0-床号 1-房号 2-房床号</span>-->
               </el-form-item>
-              <el-form-item label="门口机通话音量" prop="night_door_vol">
-                <el-input-number v-model="formmodel.night_door_vol" :min="0" :max="100" label="门口机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightDoorVol')" prop="night_door_vol">
+                <el-input-number v-model="formmodel.night_door_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightDoorVol')" />
               </el-form-item>
-              <el-form-item label="转换盒通话音量" prop="night_transfer_box_vol">
-                <el-input-number v-model="formmodel.night_transfer_box_vol" :min="0" :max="100" label="分机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightTransferBoxVol')" prop="night_transfer_box_vol">
+                <el-input-number v-model="formmodel.night_transfer_box_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightTransferBoxVol')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="分机液晶屏亮度" prop="night_light">
-                <el-input-number v-model="formmodel.night_light" :min="0" :max="100" label="分机液晶屏亮度" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightLight')" prop="night_light">
+                <el-input-number v-model="formmodel.night_light" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightLight')" />
               </el-form-item>
-              <el-form-item label="呼叫响铃次数" prop="night_ring_times">
-                <el-input-number v-model="formmodel.night_ring_times" :min="0" :max="10" label="主机叫号次数" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightRingTimes')" prop="night_ring_times">
+                <el-input-number v-model="formmodel.night_ring_times" :min="0" :max="10" :label="this.$t('partInfo.dayOrNightRingTimes')" />
               </el-form-item>
-              <!--              <el-form-item label="主机通话音量" prop="part_night_vol">-->
-              <!--                <el-input-number v-model="formmodel.part_night_vol" :min="0" :max="100" label="主机通话音量" />-->
+              <!--              <el-form-item :label="this.$t('partInfo.dayAndNightVol')" prop="part_night_vol">-->
+              <!--                <el-input-number v-model="formmodel.part_night_vol" :min="0" :max="100" :label="this.$t('partInfo.dayAndNightVol')" />-->
               <!--              </el-form-item>-->
-              <el-form-item label="分机通话音量" prop="night_bed_vol">
-                <el-input-number v-model="formmodel.night_bed_vol" :min="0" :max="100" label="分机通话音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightBedVol')" prop="night_bed_vol">
+                <el-input-number v-model="formmodel.night_bed_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightBedVol')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="主机系统音量" prop="night_ring_vol">
-                <el-input-number v-model="formmodel.night_ring_vol" :min="0" :max="100" label="主机系统音量" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightRingVol')" prop="night_ring_vol">
+                <el-input-number v-model="formmodel.night_ring_vol" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightRingVol')" />
               </el-form-item>
-              <el-form-item label="分机护理灯亮度" prop="night_nurse_led">
-                <el-input-number v-model="formmodel.night_nurse_led" :min="0" :max="100" label="分机护理灯亮度" />
+              <el-form-item :label="this.$t('partInfo.dayOrNightNurseLed')" prop="night_nurse_led">
+                <el-input-number v-model="formmodel.night_nurse_led" :min="0" :max="100" :label="this.$t('partInfo.dayOrNightNurseLed')" />
               </el-form-item>
-              <el-form-item label="转换盒系统音量" prop="night_transfer_box_system_vol">
+              <el-form-item :label="this.$t('partInfo.dayOrNightTransferBoxSystemVol')" prop="night_transfer_box_system_vol">
                 <el-input-number
                   v-model="formmodel.night_transfer_box_system_vol"
                   :min="0"
                   :max="100"
-                  label="转换盒系统音量"
+                  :label="this.$t('partInfo.dayOrNightTransferBoxSystemVol')"
                 />
               </el-form-item>
             </el-col>
@@ -222,118 +222,122 @@
         <!--        </fieldset>-->
 
         <fieldset class="margin-top-sm">
-          <legend>其它参数</legend>
+          <legend>{{ this.$t('partInfo.otherInfo') }}</legend>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="分机息屏时间" prop="sleep_seconds_bed">
-                <el-input-number v-model="formmodel.sleep_seconds_bed" :min="1" :max="100" label="分机液晶屏息屏时间" />
+              <el-form-item :label="this.$t('partInfo.sleepSecondsBed')" prop="sleep_seconds_bed">
+                <el-input-number v-model="formmodel.sleep_seconds_bed" :min="1" :max="100" :label="this.$t('partInfo.sleepSecondsBed')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="门口机息屏时间" prop="sleep_seconds_door">
-                <el-input-number v-model="formmodel.sleep_seconds_door" :min="1" :max="100" label="门口机液晶屏息屏时间" />
+              <el-form-item :label="this.$t('partInfo.sleepSecondsDoor')" prop="sleep_seconds_door">
+                <el-input-number v-model="formmodel.sleep_seconds_door" :min="1" :max="100" :label="this.$t('partInfo.sleepSecondsDoor')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="护士主机息屏时间" prop="sleep_seconds_nurse">
-                <el-input-number v-model="formmodel.sleep_seconds_nurse" :min="1" :max="100" label="护士主机液晶屏息屏时间" />
+              <el-form-item :label="this.$t('partInfo.sleepSecondsNurse')" prop="sleep_seconds_nurse">
+                <el-input-number v-model="formmodel.sleep_seconds_nurse" :min="1" :max="100" :label="this.$t('partInfo.sleepSecondsNurse')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="语音呼叫超时" prop="sip_overtime">
-                <el-input-number v-model="formmodel.sip_overtime" :min="1" :max="100" label="分机液晶屏息屏时间" />
+              <el-form-item :label="this.$t('partInfo.sipOvertime')" prop="sip_overtime">
+                <el-input-number v-model="formmodel.sip_overtime" :min="1" :max="100" :label="this.$t('partInfo.sipOvertime')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="护士转接时长" prop="transfer_duration">
-                <el-input-number v-model="formmodel.transfer_duration" :min="1" :max="100" label="护士转接时长" />
+              <el-form-item :label="this.$t('partInfo.transferDuration')" prop="transfer_duration">
+                <el-input-number v-model="formmodel.transfer_duration" :min="1" :max="100" :label="this.$t('partInfo.transferDuration')" />
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="护士组长转接时长" prop="transfer_duration_leader">
-                <el-input-number v-model="formmodel.transfer_duration_leader" :min="1" :max="100" label="护士组长转接时长" />
+              <el-form-item :label="this.$t('partInfo.transferDurationLeader')" prop="transfer_duration_leader">
+                <el-input-number v-model="formmodel.transfer_duration_leader" :min="1" :max="100" :label="this.$t('partInfo.transferDurationLeader')" />
               </el-form-item>
             </el-col>
           </el-row>
 
           <el-row>
             <el-col :span="8">
-              <el-form-item label="护士主机转接时长" prop="key_val">
-                <el-input-number v-model="systemConfig.key_val" :min="1" :max="60" label="护士主机转接时长" />
+              <el-form-item :label="this.$t('partInfo.nurseKeyVal')" prop="key_val">
+                <el-input-number v-model="systemConfig.key_val" :min="1" :max="60" :label="this.$t('partInfo.nurseKeyVal')" />
               </el-form-item>
             </el-col>
+
+            <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-form-item>
           </el-row>
 
           <el-row>
             <el-col :span="8">
-              <el-form-item label="分机通讯方式" prop="communication_mode_bed">
+              <el-form-item :label="this.$t('partInfo.communicationModeBed')" prop="communication_mode_bed">
                 <el-radio-group v-model="formmodel.communication_mode_bed">
-                  <el-radio :label="1">网络电话</el-radio>
-                  <el-radio :label="2">移动电话</el-radio>
-                  <el-radio :label="3">固定电话</el-radio>
+                  <el-radio :label="1">{{ this.$t('partInfo.networkCall') }}</el-radio>
+                  <el-radio :label="2">{{ this.$t('partInfo.mobileCall') }}</el-radio>
+                  <el-radio :label="3">{{ this.$t('partInfo.fixedCall') }}</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="护士主机通讯方式" prop="communication_mode_nurse">
+              <el-form-item :label="this.$t('partInfo.communicationModeNurse')" prop="communication_mode_nurse">
                 <el-radio-group v-model="formmodel.communication_mode_nurse">
-                  <el-radio :label="1">网络电话</el-radio>
-                  <el-radio :label="2">移动电话</el-radio>
-                  <el-radio :label="3">固定电话</el-radio>
+                  <el-radio :label="1">{{ this.$t('partInfo.networkCall') }}</el-radio>
+                  <el-radio :label="2">{{ this.$t('partInfo.mobileCall') }}</el-radio>
+                  <el-radio :label="3">{{ this.$t('partInfo.fixedCall') }}</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>
 
           <el-col :span="8">
-            <el-form-item label="移动设备通讯方式" prop="communication_mode_mobile">
+            <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">网络电话</el-radio>
-                <el-radio :label="2">移动电话</el-radio>
+                <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="自定义呼叫角色1" prop="customize_role_call_first">
+            <el-form-item :label="this.$t('partInfo.customizeRoleCallFirst')" prop="customize_role_call_first">
               <el-radio-group v-model="formmodel.customize_role_call_first">
-                <el-radio :label="0">不显示</el-radio>
+                <el-radio :label="0">{{ this.$t('partInfo.onDisplay') }}</el-radio>
                 <el-radio :disabled="formmodel.customize_role_call_second===item.role_id" :label="item.role_id" v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
 
           <el-row>
-            <el-form-item label="自定义呼叫角色2" prop="customize_role_call_second">
+            <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">不显示</el-radio>
+                <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" v-for="(item,index) in partRoles" :key="index">{{item.role_name}}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-row>
           <el-row>
             <el-col :span="8">
-              <el-form-item label="模拟分机医生标题">
-                <el-input v-model="formmodel.doctor_title" label="模拟分机医生标题" :maxlength="15" >
-                  <el-select v-model="formmodel.doctor_valid" slot="prepend" placeholder="请选择">
-                    <el-option label="显示" :value="1"></el-option>
-                    <el-option label="不显示" :value="0"></el-option>
+              <el-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="模拟分机护士标题">
-                <el-input v-model="formmodel.nurse_title" label="模拟分机医生标题" :maxlength="15" >
-                  <el-select v-model="formmodel.nurse_valid" slot="prepend" placeholder="请选择">
-                    <el-option label="显示" :value="1" />
-                    <el-option label="不显示" :value="0" />
+              <el-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="腕表上传定位间隔">
-                <el-input-number v-model="formmodel.up_seconds" :min="1" :max="300" label="腕表上传定位间隔" />
+              <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>
@@ -341,10 +345,11 @@
         </fieldset>
 
         <el-form-item align="center" class="margin-top-sm">
-          <el-button type="success" @click="onSubmit">保存设置</el-button>
-          <el-button v-if="isShow" type="primary" @click="initializeSystem">初始化系统</el-button>
-          <el-button v-if="isShow" type="success" plain :disabled="isDisabled" @click="initialize485Device">初始化485设备</el-button>
-          <el-button v-if="isShow" type="ss" @click="saveList">批量添加测试用户</el-button>
+          <el-button type="success" @click="onSubmit">{{ this.$t('partInfo.saveSettings') }}</el-button>
+          <el-button v-if="isShow" type="primary" @click="initializeSystem">{{ this.$t('partInfo.initializeSystem') }}</el-button>
+          <el-button v-if="isShow" type="success" plain :disabled="isDisabled" @click="initialize485Device">{{ this.$t('partInfo.initialize485Device') }}</el-button>
+          <el-button v-if="isShow" type="ss" @click="saveList">{{ this.$t('partInfo.addTestMemberList') }}</el-button>
+          <el-button v-if="isShow" type="ss" @click="devicesRef">{{ this.$t('partInfo.devicesRef') }}</el-button>
         </el-form-item>
       </el-form>
     </el-card>
@@ -356,7 +361,7 @@
 import * as API_Part from '@/api/ncs_partInfo'
 import { saveListByCustomer } from '@/api/ncs_customer'
 import Storage from '@/utils/storage'
-import { init485Device, initData } from "@/api/initialize";
+import { init485Device, initData, initDeviceList } from '@/api/initialize'
 import * as API_Clerk from '@/api/ncs_clerk'
 import * as API_SystemConfig from '@/api/ncs_systemconfig'
 export default {
@@ -430,8 +435,9 @@ export default {
                 communication_mode_bed: 1,
                 communication_mode_nurse: 1,
                 communication_mode_mobile: 1,
-                customize_role_call_first:0,
-                customize_role_call_second:0
+                customize_role_call_first: 0,
+                customize_role_call_second: 0,
+                auto_accept: 0
               }
             }
           } else {
@@ -485,15 +491,15 @@ export default {
             this.formmodel.night_start = this.nightStart.toLocaleTimeString('chinese', { hour12: false })
           }
           API_Part.editPartSetting(this.formmodel, this.partId).then(res => {
-            this.$message.success('保存成功!')
+            this.$message.success(this.$t('action.saveSuccess') + '')
             if (this.systemConfig.id != null) {
               API_SystemConfig.update(this.systemConfig.id, this.systemConfig).then(res => {
-                this.$message.success('保存成功!')
+                this.$message.success(this.$t('action.saveSuccess') + '')
               })
             }
           })
         } else {
-          this.$message.error('表单填写错误,请检查!')
+          this.$message.error(this.$t('action.fromError'))
         }
       })
     },
@@ -506,17 +512,17 @@ export default {
     // 批量增加测试用户
     saveList() {
       const _this = this
-      this.$confirm('确定需要批量增加测试用户吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('partInfo.sureAddTestMemberList') + '', this.$t('action.tips') + '', {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
-        console.log('开始创建')
+        console.log(this.$t('partInfo.startAdd'))
         saveListByCustomer(_this.partId).then(res => {
           this.$message.success(res.message)
         })
       }).catch(() => {
-        console.log('取消')
+        console.log(this.$t('action.cancel'))
       })
     },
     // 初始化485设备
@@ -541,6 +547,20 @@ export default {
       initData(_this.partId).then(res => {
         _this.$message.info(res.message)
       })
+    },
+    devicesRef() {
+      const _this = this
+      this.$confirm(this.$t('partInfo.sureDevicesRef') + '', this.$t('action.tips') + '', {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
+        type: 'warning'
+      }).then(() => {
+        initDeviceList(_this.partId).then(res => {
+          _this.$message.success(res.message)
+        })
+      }).catch(() => {
+        console.log(this.$t('action.cancel'))
+      })
     }
   }
 }

+ 11 - 9
src/views/ncs-orginazition/index.vue

@@ -169,11 +169,11 @@ export default {
         headerCheckboxSelectionFilteredOnly: true,
         checkboxSelection: true,
         sortable: false, filter: false,
-        width: 100,
+        width: 60,
         resizable: false,
         valueGetter: this.hashValueGetter
       },
-      { headerName: 'ID', field: 'shop_id', sortable: true, filter: 'agNumberColumnFilter' },
+      { headerName: 'ID', field: 'shop_id', sortable: true, filter: 'agNumberColumnFilter', width: 100 },
       { headerName: '组织简称', field: 'shop_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
         debounceMs: 200,
         newRowsAction: 'keep'
@@ -186,15 +186,17 @@ export default {
         debounceMs: 200,
         newRowsAction: 'keep'
       }},
-      { headerName: '组织类型', field: 'shop_type', sortable: true, filter: 'agTextColumnFilter', flex: 1, filterParams: {
-        debounceMs: 200,
-        newRowsAction: 'keep'
-      },
-      cellRenderer: this.shopTypeFormatter
+      { headerName: '组织类型', field: 'shop_type', sortable: true, filter: 'agTextColumnFilter', width: 110,
+        // flex: 1,
+        filterParams: {debounceMs: 200, newRowsAction: 'keep'},
+        cellRenderer: this.shopTypeFormatter
       },
 
-      { headerName: '管理账号', field: 'member_name', sortable: true, filter: 'agTextColumnFilter', flex: 1 },
-      { headerName: '上级组织简称', field: 'parent_name', sortable: true, filter: 'agTextColumnFilter', filterParams: {
+      { headerName: '管理账号', field: 'member_name', sortable: true, filter: 'agTextColumnFilter', width: 130
+        // flex: 1
+      },
+      { headerName: '上级组织简称', field: 'parent_name', sortable: true, filter: 'agTextColumnFilter', width: 200,
+        filterParams: {
         debounceMs: 200,
         newRowsAction: 'keep'
       }

+ 5 - 0
src/views/ncs-orginazition/partInfoSetting.vue

@@ -21,6 +21,11 @@
           <app-version-manager :part-id="part_id" :device-type="101" />
         </keep-alive>
       </el-tab-pane>
+      <el-tab-pane label="总控护士主机APP更新" name="znurse">
+        <keep-alive>
+          <app-version-manager :part-id="part_id" :device-type="201" />
+        </keep-alive>
+      </el-tab-pane>
       <el-tab-pane label="门口机APP更新" name="door">
         <keep-alive>
           <app-version-manager :part-id="part_id" :device-type="3" />

+ 21 - 66
src/views/ncs-sos-device-setting/sos_device_setting.vue

@@ -39,7 +39,8 @@
           <el-col :span="12">
             <el-form-item label="报警设备模式" prop="type">
               <el-select v-model="sosDeviceSettingModel.type" placeholder="报警设备模式" clearable>
-                <el-option v-for="item in sosDeviceSettingsTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+<!--                <el-option v-for="item in sosDeviceSettingsTypeOptions" :key="item.value" :label="item.key" :value="item.value" />-->
+                <el-option v-for="(item, index) in Object.keys(sosDeviceSettingEnum)" :key="index" :label="sosDeviceSettingEnum[item]" :value="parseInt(item)" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -70,6 +71,7 @@
 import { unixToDate } from '@/utils/Foundation'
 import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
 import ButtonCellRender from '@/components/AgGridCellRender/ButtonCellRender'
+import ListFilter from '@/components/AgGridCustomFilter/ListFilter'
 import RadioFilter from '@/components/AgGridCustomFilter/RadioFilter'
 import * as API_SosDeviceSetting from "@/api/ncs_sos_device_settings";
 import {DEVICE_TYPE} from "@/utils/enum/DeviceTypeEnum";
@@ -77,7 +79,7 @@ import {SOS_DEVICE_SETTING_TYPE} from "@/utils/enum/SosDeviceSettingTypeEnum";
 
 export default {
   name: 'Index',
-  components: { ButtonCellRender, RadioFilter},
+  components: { ButtonCellRender, RadioFilter, ListFilter},
   data: function() {
     return {
       /** 表格数据 */
@@ -105,7 +107,7 @@ export default {
       params: {
         page_size: 20,
         page_no: 1,
-        fixedCondition: 'nsds.part_id = ' + this.$store.getters.partId,
+        fixedCondition: 'part_id = ' + this.$store.getters.partId,
         sort: 'id',
         dir: 'desc'
       },
@@ -123,17 +125,11 @@ export default {
       timer: '',
       // sosDeviceSetting: {},
       sosDeviceSettingsTypeOptions: [
-        {
-          value: 0,
-          label: '不开启'
-        }, {
-          value: 1,
-          label: '疫情防控模式'
-        }, {
-          value: 2,
-          label: '关爱老人模式'
-        }
+        { key: '不开启', value: 0},
+        { key: '疫情防控模式', value: 1 },
+        { key: '关爱老人模式', value: 2 }
       ],
+      sosDeviceSettingEnum: SOS_DEVICE_SETTING_TYPE.getValueList(),
     }
   },
   computed: {
@@ -150,32 +146,25 @@ export default {
         headerCheckboxSelection: true,
         headerCheckboxSelectionFilteredOnly: true,
         checkboxSelection: true,
-        sortable: false,
+        sortable: false, filter: false,
         width: 50,
         resizable: false,
         valueGetter: this.hashValueGetter
       },
       { headerName: 'ID', field: 'id', sortable: true, filter: 'agNumberColumnFilter', width: 100 },
-      { headerName: '报警时间', field: 'setting_time', sortable: true,
-        filter: 'ListFilter' , width: 120,
-        valueGetter: this.settingTimeGetter
-      },
-      // { headerName: '单位', field: 'unit', sortable: true, filter: 'agTextColumnFilter' , width: 100 },
+      { headerName: '报警时间', field: 'setting_time', sortable: false, filter: false , width: 120, valueGetter: this.settingTimeGetter},
       { headerName: '报警模式', field: 'type', sortable: true,
-        filter: 'ListFilter' , width: 150,
+        filterFramework: 'ListFilter', width: 150,
+        filterParams: {
+          listData: this.sosDeviceSettingsTypeOptions
+        },
         valueGetter: this.sosDeviceSettingTypeGetter
       },
       { headerName: '设备id', field: 'device_id', sortable: true, filter: 'agNumberColumnFilter' , width: 100 },
-      { headerName: '设备别名', field: 'device_name', sortable: true, filter: 'agTextColumnFilter' , width: 150 },
-      { headerName: '设备类型', field: 'device_type', sortable: true,
-        filterFramework: 'ListFilter', width: 120,
-        // filterParams: {
-        //   listData: DEVICE_TYPE.getDesc
-        // },
-        valueGetter: this.deviceTypeGetter
-      },
-      { headerName: '设备标识码', field: 'device_eth_mac', sortable: true, filter: 'agTextColumnFilter', width: 200  },
-      { headerName: '空间全称', field: 'frame_full_name', sortable: true, filter: 'agTextColumnFilter' , width: 150 },
+      { headerName: '设备别名', field: 'device_name', sortable: false, filter: false , width: 150 },
+      { headerName: '设备类型', field: 'device_type', sortable: false, filter: false, width: 120, valueFormatter: this.deviceTypeGetter},
+      { headerName: '设备标识码', field: 'device_eth_mac', sortable: false, filter: false, width: 200  },
+      { headerName: '空间全称', field: 'frame_full_name', sortable: false, filter: false , width: 150 },
       {
         headerName: '编辑', field: 'id',
         cellRendererFramework: 'ButtonCellRender',
@@ -198,12 +187,10 @@ export default {
     this.defaultColDef = {
       sortable: true,
       resizable: true,
-      comparator: this.testComparator,
+      filter: true,
       filterParams: {
         debounceMs: 200,
         newRowsAction: 'keep',
-        textCustomComparator: this.textCustomComparator,
-        comparator: this.testComparator
       }
     }
     this.rowSelection = 'multiple'
@@ -213,17 +200,7 @@ export default {
     this.gridApi = this.gridOptions.api
     this.getList()
   },
-  beforeDestroy() {
-    clearTimeout(this.timer)
-  },
-  destroyed() {
-    clearTimeout(this.timer)
-  },
   methods: {
-    /** 选择行变化时,记录选中的行数据 */
-    selectFun(val) {
-      this.multipleSelection = val
-    },
     /** 分页大小发生改变 */
     handlePageSizeChange(size) {
       this.params.page_size = size
@@ -259,7 +236,7 @@ export default {
     },
     /** 处理搜索 */
     handlerSearch(keywords) {
-      this.params.query = keywords
+      this.params.filerStr = keywords
       this.getList()
     },
     /** 处理排序 */
@@ -273,20 +250,6 @@ export default {
       }
       this.getList()
     },
-    formatterDate(params) {
-      return unixToDate(params.value)
-    },
-    formatterName(params) {
-      if (params.value && params.data.role_name) {
-        return params.value + ' ' + params.data.role_name
-      } else {
-        if (params.value) {
-          return params.value
-        } else if (params.data.role_name) {
-          return '未绑定 ' + params.data.role_name
-        }
-      }
-    },
     filterModifed(param) {
       const model = param.api.getFilterModel()
       // 连接状态不经过服务器过滤
@@ -326,16 +289,8 @@ export default {
       }
       this.getList()
     },
-    // formatterSatus(param) {
-    //   if (param.value === 1) {
-    //     return '<span style="color:green">已启用</span>'
-    //   } else {
-    //     return '<span style="color:red">未启用</span>'
-    //   }
-    // },
     /** 修改设备报警  **/
     handleEdit(params) {
-      // this.getSosDeviceSetting(params.id)
       this.sosDeviceSettingModel = {
         ...params
       }

+ 2 - 2
src/views/ncs-task/index.vue

@@ -182,8 +182,8 @@ export default {
           content: 'task_content'
         }
       },
-      { headerName: '计划任务时间', field: 'task_plan_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
-      { headerName: '实际任务时间', field: 'task_do_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
+      { headerName: '计划任务执行时间', field: 'task_plan_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
+      { headerName: '实际任务执行时间', field: 'task_do_time', valueFormatter: this.formatterDate, sortable: true, filter: false, minWidth: 180 },
       { headerName: '任务状态', field: 'task_success', filter: false, cellRenderer: this.formatterStasus, minWidth: 100 },
       // { headerName: '任务结果', field: 'task_result', sortable: true, filter: false, width: 220,
       //     cellRendererFramework: 'Tooltip',

+ 1 - 1
src/views/vital-sign/log.vue

@@ -11,7 +11,7 @@
       >
         <div
           :id="`chart${group.id}`"
-          style="height: 600px; width:800px;"
+          style="height: 600px; width:650px;"
         />
       </el-tab-pane>
     </el-tabs>