Browse Source

开发设备菜单

vothin 2 years ago
parent
commit
50d922560f

+ 29 - 7
languages/en.js

@@ -68,6 +68,7 @@ module.exports = {
     name: 'Name',
     name: 'Name',
     fullName: 'Full name',
     fullName: 'Full name',
     type: 'Type',
     type: 'Type',
+    choiceType: 'Please select a type',
     alias: 'Alias',
     alias: 'Alias',
     tips: 'Tips',
     tips: 'Tips',
     time: 'Hour',
     time: 'Hour',
@@ -219,7 +220,10 @@ module.exports = {
     closeWatchSos: 'Turn off the watch sedentary alarm',
     closeWatchSos: 'Turn off the watch sedentary alarm',
     openWatchSos: 'Turn on the alarm for long sitting',
     openWatchSos: 'Turn on the alarm for long sitting',
     opendebug: 'Debug',
     opendebug: 'Debug',
-    reboot: 'Reboot'
+    inputName: 'Please enter a name',
+    reboot: 'Reboot',
+    count: 'Number of statistics',
+    system: 'System'
   },
   },
   member: {
   member: {
     face: 'Avatar',
     face: 'Avatar',
@@ -262,7 +266,7 @@ module.exports = {
     deleteMember: 'Are you sure you want to delete this user information?',
     deleteMember: 'Are you sure you want to delete this user information?',
     cannotDeleteAdmin: 'Cannot delete the person in charge of the organization',
     cannotDeleteAdmin: 'Cannot delete the person in charge of the organization',
     leaderName: 'Leader Name',
     leaderName: 'Leader Name',
-    passNo:'Employee No'
+    passNo: 'Employee No'
   },
   },
   home: {
   home: {
     todayTask: "Today's task",
     todayTask: "Today's task",
@@ -380,6 +384,8 @@ module.exports = {
     transRs485: 'Upper 485 conversion box',
     transRs485: 'Upper 485 conversion box',
     re485SipId: '485 address',
     re485SipId: '485 address',
     inputRe485SipId: 'Please enter the 485 address',
     inputRe485SipId: 'Please enter the 485 address',
+    powerControlAddress: 'Power version address',
+    controlLineNumber: 'Interface line',
     sosDeviceSettingType: 'Alarm mode',
     sosDeviceSettingType: 'Alarm mode',
     sosDeviceSettingStatusFalse: 'Not enabled',
     sosDeviceSettingStatusFalse: 'Not enabled',
     sosDeviceSettingControlModel: 'Epidemic Prevention and Control Mode',
     sosDeviceSettingControlModel: 'Epidemic Prevention and Control Mode',
@@ -419,6 +425,20 @@ module.exports = {
     roomNoDevice: 'The room was not equipped',
     roomNoDevice: 'The room was not equipped',
     bedNoDevice: 'The bed was not equipped'
     bedNoDevice: 'The bed was not equipped'
   },
   },
+  deviceMenuManage: {
+    add: 'Add Device Menu',
+    name: 'Ribbon Name',
+    active: 'Enable',
+    unActive: 'Not enabled',
+    actived: 'Enable or not',
+    inputUrl: 'Please enter the URL address',
+    inputActName: 'Please enter the activity page address',
+    urlTemplate: 'Parameters of URL',
+    inputTemplate: 'Please enter a parameter name',
+    inputTemplateValue: 'Please enter parameter values',
+    actIntent: 'Parameters of Activity',
+    inputActIntent: 'Please enter the parameters for the activity'
+  },
   clerkManage: {
   clerkManage: {
     clerkEdit: 'Edit member information',
     clerkEdit: 'Edit member information',
     choiceClerk: 'Please select an employee',
     choiceClerk: 'Please select an employee',
@@ -984,9 +1004,11 @@ module.exports = {
     frameManage: 'Space position',
     frameManage: 'Space position',
     deviceManage: 'All devices',
     deviceManage: 'All devices',
     clerkManage: 'Employee management',
     clerkManage: 'Employee management',
+    clerkCalendar: 'Employee clock in calendar',
     patientManage: 'Patient management',
     patientManage: 'Patient management',
     customerManage: 'User Management',
     customerManage: 'User Management',
     customerQrCode: 'User QR code',
     customerQrCode: 'User QR code',
+    customerAdvice: 'Doctor\'s advice',
     mobileDeviceManage: 'Mobile Device',
     mobileDeviceManage: 'Mobile Device',
     userLocationManage: 'User Device',
     userLocationManage: 'User Device',
     sosDeviceSettingManage: 'Alarm device',
     sosDeviceSettingManage: 'Alarm device',
@@ -1007,8 +1029,8 @@ module.exports = {
     interactionChars: 'Interaction statistics',
     interactionChars: 'Interaction statistics',
     partSetting: 'Organization settings',
     partSetting: 'Organization settings',
     functionRoleMapping: 'Component Permissions',
     functionRoleMapping: 'Component Permissions',
-    countdownConfig:'Countdown Component Configuration',
-    screentip:'ScreenTip Component Configuration',
+    countdownConfig: 'Countdown Component Configuration',
+    screentip: 'ScreenTip Component Configuration',
     bedsideInteration: 'Interaction components',
     bedsideInteration: 'Interaction components',
     interactionChain: 'Interaction Accept Order',
     interactionChain: 'Interaction Accept Order',
     allClerk: 'All employees',
     allClerk: 'All employees',
@@ -1027,7 +1049,8 @@ module.exports = {
     entraceguardUser: 'Passage setting',
     entraceguardUser: 'Passage setting',
     customBoardManage: 'Custom Board Screen',
     customBoardManage: 'Custom Board Screen',
     customBoardDesigner: 'Designer Board Screen',
     customBoardDesigner: 'Designer Board Screen',
-    staffManageFrames: 'Staff Serve Structure'
+    staffManageFrames: 'Staff Serve Structure',
+    deviceMenuManager: 'Device Menu'
   },
   },
   deviceType: {
   deviceType: {
     NURSE_HOST: 'Nurse Host',
     NURSE_HOST: 'Nurse Host',
@@ -1140,7 +1163,6 @@ module.exports = {
     ChooseDate: 'Choose Date',
     ChooseDate: 'Choose Date',
     SleepData: 'Sleep Data'
     SleepData: 'Sleep Data'
   },
   },
-
   interactionChain: {
   interactionChain: {
     ActionType: 'Interaction Type',
     ActionType: 'Interaction Type',
     FirstRole: 'The First Acceptor',
     FirstRole: 'The First Acceptor',
@@ -1165,13 +1187,13 @@ module.exports = {
     configurateRight: ']'
     configurateRight: ']'
   },
   },
   functions: {
   functions: {
+    function: 'Small components',
     SIGN_IN: 'Sign in',
     SIGN_IN: 'Sign in',
     MANAGE_BED: 'Manage Bed',
     MANAGE_BED: 'Manage Bed',
     POSITION_COMPONENT: 'Locate',
     POSITION_COMPONENT: 'Locate',
     COUNTDOWN_COMPONENT: 'Countdown',
     COUNTDOWN_COMPONENT: 'Countdown',
     ROOMCHECK_COMPONENT: 'Room patrol',
     ROOMCHECK_COMPONENT: 'Room patrol',
     SCREEN_TIP_SET_COMPONENT: 'Set screen prompt',
     SCREEN_TIP_SET_COMPONENT: 'Set screen prompt',
-    SIGN_IN:'Sign In',
     nfcCalender: 'Calendar records',
     nfcCalender: 'Calendar records',
     nfcInteraction: 'Small component statistics',
     nfcInteraction: 'Small component statistics',
     nfcPosition: 'Positioning trajectory',
     nfcPosition: 'Positioning trajectory',

+ 29 - 10
languages/es.js

@@ -68,6 +68,7 @@ module.exports = {
     name: 'nombre',
     name: 'nombre',
     fullName: 'Nombre completo',
     fullName: 'Nombre completo',
     type: 'Tipo',
     type: 'Tipo',
+    choiceType: 'Por favor, elija el tipo',
     alias: 'Alias',
     alias: 'Alias',
     tips: 'Consejos',
     tips: 'Consejos',
     time: 'Hora',
     time: 'Hora',
@@ -219,7 +220,10 @@ module.exports = {
     closeWatchSos: 'Apague la alarma de sedentarismo del reloj',
     closeWatchSos: 'Apague la alarma de sedentarismo del reloj',
     openWatchSos: 'Sentarse durante mucho tiempo y encender la alarma',
     openWatchSos: 'Sentarse durante mucho tiempo y encender la alarma',
     opendebug: 'depuración',
     opendebug: 'depuración',
-    reboot: 'reiniciar'
+    inputName: 'Por favor, introduzca el nombre',
+    reboot: 'reiniciar',
+    count: 'Estadísticas',
+    system: 'Sistema'
   },
   },
   member: {
   member: {
     face: 'Avatar',
     face: 'Avatar',
@@ -262,9 +266,7 @@ module.exports = {
     deleteMember: '¿Está seguro de que desea eliminar esta información de usuario?',
     deleteMember: '¿Está seguro de que desea eliminar esta información de usuario?',
     cantDeleteAdmin: 'No se puede eliminar al responsable de la organización',
     cantDeleteAdmin: 'No se puede eliminar al responsable de la organización',
     leaderName: 'Nombre del líder',
     leaderName: 'Nombre del líder',
-    cannotDeleteAdmin: 'No se puede eliminar al responsable de la organización',
-    passNo:'Número de empleado'
-
+    passNo: 'Número de empleado'
   },
   },
   home: {
   home: {
     todayTask: 'Tarea de hoy',
     todayTask: 'Tarea de hoy',
@@ -382,6 +384,8 @@ module.exports = {
     transRs485: 'Cuadro de conversión 485 superior',
     transRs485: 'Cuadro de conversión 485 superior',
     re485SipId: '485 dirección',
     re485SipId: '485 dirección',
     inputRe485SipId: 'Ingrese la dirección 485',
     inputRe485SipId: 'Ingrese la dirección 485',
+    powerControlAddress: 'Dirección de la versión de alimentación',
+    controlLineNumber: 'Línea de interfaz',
     sosDeviceSettingType: 'Modo de alarma',
     sosDeviceSettingType: 'Modo de alarma',
     sosDeviceSettingStatusFalse: 'No habilitado',
     sosDeviceSettingStatusFalse: 'No habilitado',
     sosDeviceSettingControlModel: 'Modo de control y prevención de epidemias',
     sosDeviceSettingControlModel: 'Modo de control y prevención de epidemias',
@@ -421,6 +425,20 @@ module.exports = {
     roomNoDevice: 'La habitación no estaba equipada',
     roomNoDevice: 'La habitación no estaba equipada',
     bedNoDevice: 'La cama no estaba equipada'
     bedNoDevice: 'La cama no estaba equipada'
   },
   },
+  deviceMenuManage: {
+    add: 'Añadir menú de dispositivos',
+    name: 'Nombre de la zona funcional',
+    active: 'Habilitar',
+    unActive: 'No habilitado',
+    actived: 'Si habilitar',
+    inputUrl: 'Por favor, introduzca la dirección URL',
+    inputActName: 'Introduzca la dirección de la página de actividad',
+    urlTemplate: 'Parámetros de la URL',
+    inputTemplate: 'Introduzca el nombre del parámetro',
+    inputTemplateValue: 'Introduzca el valor del parámetro',
+    actIntent: 'Parámetros de la actividad',
+    inputActIntent: 'Introduzca los parámetros de la actividad'
+  },
   clerkManage: {
   clerkManage: {
     clerkEdit: 'Editar información del miembro',
     clerkEdit: 'Editar información del miembro',
     choiceClerk: 'Por favor, elija un empleado',
     choiceClerk: 'Por favor, elija un empleado',
@@ -986,9 +1004,11 @@ module.exports = {
     frameManage: 'Posición espacial',
     frameManage: 'Posición espacial',
     deviceManage: 'Todos los dispositivos',
     deviceManage: 'Todos los dispositivos',
     clerkManage: 'Gestión de empleados',
     clerkManage: 'Gestión de empleados',
+    clerkCalendar: 'Calendario de tarjetas de empleados',
     patientManage: 'Gestión de pacientes',
     patientManage: 'Gestión de pacientes',
     customerManage: 'Administración de usuarios',
     customerManage: 'Administración de usuarios',
     customerQrCode: 'Código QR de usuario',
     customerQrCode: 'Código QR de usuario',
+    customerAdvice: 'Consejo Médico',
     mobileDeviceManage: 'Dispositivo móvil',
     mobileDeviceManage: 'Dispositivo móvil',
     userLocationManage: 'Dispositivos de usuario',
     userLocationManage: 'Dispositivos de usuario',
     sosDeviceSettingManage: 'Dispositivo de alarma',
     sosDeviceSettingManage: 'Dispositivo de alarma',
@@ -1009,8 +1029,8 @@ module.exports = {
     interactionChars: 'Interacción Estadísticas',
     interactionChars: 'Interacción Estadísticas',
     partSetting: 'Organización construir',
     partSetting: 'Organización construir',
     functionRoleMapping: 'Permisos de componentes',
     functionRoleMapping: 'Permisos de componentes',
-    countdownConfig:'Configuración del componente de cuenta atrás',
-    screentip:'Configuración del componente de recordatorio de pantalla',
+    countdownConfig: 'Configuración del componente de cuenta atrás',
+    screentip: 'Configuración del componente de recordatorio de pantalla',
     bedsideInteration: 'Componentes interactivos',
     bedsideInteration: 'Componentes interactivos',
     interactionChain: 'Aceptar órdenes de forma interactiva',
     interactionChain: 'Aceptar órdenes de forma interactiva',
     allClerk: 'Todos los empleados',
     allClerk: 'Todos los empleados',
@@ -1029,8 +1049,8 @@ module.exports = {
     entraceguardUser: 'Configuración de paso',
     entraceguardUser: 'Configuración de paso',
     customBoardManage: 'Pantalla de tablero personalizada',
     customBoardManage: 'Pantalla de tablero personalizada',
     customBoardDesigner: 'Pantalla del tablero de diseño',
     customBoardDesigner: 'Pantalla del tablero de diseño',
-    staffManageFrames: 'Estructura del servicio al personal'
-
+    staffManageFrames: 'Estructura del servicio al personal',
+    deviceMenuManager: 'Menú del dispositivo'
   },
   },
   deviceType: {
   deviceType: {
     NURSE_HOST: 'Enfermera anfitriona',
     NURSE_HOST: 'Enfermera anfitriona',
@@ -1167,13 +1187,13 @@ module.exports = {
     configurateRight: ']'
     configurateRight: ']'
   },
   },
   functions: {
   functions: {
+    function: 'Componentes pequeños',
     SIGN_IN: 'Firmar',
     SIGN_IN: 'Firmar',
     MANAGE_BED: 'Gestión de camas',
     MANAGE_BED: 'Gestión de camas',
     POSITION_COMPONENT: 'location',
     POSITION_COMPONENT: 'location',
     COUNTDOWN_COMPONENT: 'cuenta atrás',
     COUNTDOWN_COMPONENT: 'cuenta atrás',
     ROOMCHECK_COMPONENT: 'patrulla de casas',
     ROOMCHECK_COMPONENT: 'patrulla de casas',
     SCREEN_TIP_SET_COMPONENT: 'configurar el recordatorio de pantalla',
     SCREEN_TIP_SET_COMPONENT: 'configurar el recordatorio de pantalla',
-    SIGN_IN:'Firmar',
     nfcCalender: 'Registro del calendario',
     nfcCalender: 'Registro del calendario',
     nfcInteraction: 'Estadísticas de componentes pequeños',
     nfcInteraction: 'Estadísticas de componentes pequeños',
     nfcPosition: 'Trayectoria de posicionamiento',
     nfcPosition: 'Trayectoria de posicionamiento',
@@ -1187,7 +1207,6 @@ module.exports = {
     addNewTimeItem: 'añadir elemento de tiempo',
     addNewTimeItem: 'añadir elemento de tiempo',
     numberRequired: 'se debe introducir el número',
     numberRequired: 'se debe introducir el número',
     errorTip: 'el tiempo, el minuto y el segundo deben tener al menos uno mayor que 0'
     errorTip: 'el tiempo, el minuto y el segundo deben tener al menos uno mayor que 0'
-
   },
   },
   screenTip: {
   screenTip: {
     tipAdd: 'nuevo recordatorio',
     tipAdd: 'nuevo recordatorio',

+ 170 - 56
languages/ru-RU.js

@@ -68,6 +68,7 @@ module.exports = {
     name: 'Имя',
     name: 'Имя',
     fullName: 'Полное имя',
     fullName: 'Полное имя',
     type: 'Тип',
     type: 'Тип',
+    choiceType: 'Выберите тип',
     alias: 'Псевдоним',
     alias: 'Псевдоним',
     tips: 'Советы',
     tips: 'Советы',
     time: 'Час',
     time: 'Час',
@@ -215,8 +216,14 @@ module.exports = {
     inputParamName: 'Введите имя параметра',
     inputParamName: 'Введите имя параметра',
     inputParamValue: 'Введите значение параметра',
     inputParamValue: 'Введите значение параметра',
     addParam: 'Дополнительные параметры',
     addParam: 'Дополнительные параметры',
+    openWatchSosInfo: 'Если часы выключены, часы больше не будут вызывать сигнализацию',
+    closeWatchSos: 'Закройте часы и будьте бдительны.',
+    openWatchSos: 'Включите часы и будьте бдительны.',
     opendebug: 'Отладка',
     opendebug: 'Отладка',
-    reboot: 'Перезагрузка'
+    inputName: 'Введите имя',
+    reboot: 'Перезагрузка',
+    count: 'Статистика',
+    system: 'Системы'
   },
   },
   member: {
   member: {
     face: 'Аватар',
     face: 'Аватар',
@@ -259,7 +266,7 @@ module.exports = {
     deleteMember: 'Вы уверены, что хотите удалить эту информацию о пользователе?',
     deleteMember: 'Вы уверены, что хотите удалить эту информацию о пользователе?',
     cannotDeleteAdmin: 'Невозможно удалить человека, ответственного за организацию',
     cannotDeleteAdmin: 'Невозможно удалить человека, ответственного за организацию',
     leaderName: 'Старший сотрудник',
     leaderName: 'Старший сотрудник',
-    passNo:'Номер работника'
+    passNo: 'Номер работника'
   },
   },
   home: {
   home: {
     TodayTask: 'Сегодняшняя задача',
     TodayTask: 'Сегодняшняя задача',
@@ -377,6 +384,8 @@ module.exports = {
     transRs485: 'Верхний блок преобразования 485',
     transRs485: 'Верхний блок преобразования 485',
     re485SipId: 'Адрес 485',
     re485SipId: 'Адрес 485',
     inputRe485SipId: 'Пожалуйста, введите адрес 485',
     inputRe485SipId: 'Пожалуйста, введите адрес 485',
+    powerControlAddress: 'Адрес версии источника питания',
+    controlLineNumber: 'Интерфейсная линия',
     sosDeviceSettingType: 'Режим тревоги',
     sosDeviceSettingType: 'Режим тревоги',
     sosDeviceSettingStatusFalse: 'Не включено',
     sosDeviceSettingStatusFalse: 'Не включено',
     sosDeviceSettingControlModel: 'Режим профилактики и контроля эпидемий',
     sosDeviceSettingControlModel: 'Режим профилактики и контроля эпидемий',
@@ -384,6 +393,8 @@ module.exports = {
     sosDeviceSettingTime: 'Время будильника',
     sosDeviceSettingTime: 'Время будильника',
     sosDeviceSettingUnit: 'Единица времени будильника',
     sosDeviceSettingUnit: 'Единица времени будильника',
     sosDeviceSettingEdit: 'Изменить будильник устройства',
     sosDeviceSettingEdit: 'Изменить будильник устройства',
+    sosMonitoringTime: 'Время мониторинга',
+    allDay: 'Весь день',
     ledResolutionRatio: 'Спецификация экрана коридора',
     ledResolutionRatio: 'Спецификация экрана коридора',
     ledVoice: 'Воспроизведение голоса',
     ledVoice: 'Воспроизведение голоса',
     ledVoiceStatus: 'Включить голос',
     ledVoiceStatus: 'Включить голос',
@@ -414,6 +425,20 @@ module.exports = {
     roomNoDevice: 'Помещение не было оборудовано',
     roomNoDevice: 'Помещение не было оборудовано',
     bedNoDevice: 'Кровать не оборудована'
     bedNoDevice: 'Кровать не оборудована'
   },
   },
+  deviceMenuManage: {
+    add: 'Добавить меню устройства',
+    name: 'Название функциональной области',
+    active: 'Включить',
+    unActive: 'Не включается',
+    actived: 'Включено',
+    inputUrl: 'Введите адрес URL',
+    inputActName: 'Введите адрес страницы Activity',
+    urlTemplate: 'Параметры URL',
+    inputTemplate: 'Введите имя параметра',
+    inputTemplateValue: 'Введите значение параметра',
+    actIntent: 'Параметры активности',
+    inputActIntent: 'Введите параметры активности'
+  },
   clerkManage: {
   clerkManage: {
     clerkEdit: 'Редактировать информацию об участнике',
     clerkEdit: 'Редактировать информацию об участнике',
     choiceClerk: 'Пожалуйста, выберите сотрудника',
     choiceClerk: 'Пожалуйста, выберите сотрудника',
@@ -522,7 +547,10 @@ module.exports = {
     customerStatus: 'Текущий статус',
     customerStatus: 'Текущий статус',
     customerStatusTrue: 'Регистрация',
     customerStatusTrue: 'Регистрация',
     customerStatusFalse: 'Оставлено',
     customerStatusFalse: 'Оставлено',
-    footprint: 'Отпечаток'
+    footprint: 'Отпечаток',
+    babyName: 'Имя ребенка',
+    babySex: 'Пол ребенка',
+    babyBirthday: 'День рождения ребенка'
   },
   },
   vital: {
   vital: {
     customerVital: 'Журнал пользователя',
     customerVital: 'Журнал пользователя',
@@ -612,6 +640,7 @@ module.exports = {
     actionTime: 'Количество взаимодействий',
     actionTime: 'Количество взаимодействий',
     actionTime2: 'Количество звонков',
     actionTime2: 'Количество звонков',
     success: 'Успех',
     success: 'Успех',
+    excelFileMsg: 'Excel file will be exported. Do you want to continue?',
     successInteraction: 'Ответ на взаимодействие',
     successInteraction: 'Ответ на взаимодействие',
     successInteraction2: 'Вызов был подключен',
     successInteraction2: 'Вызов был подключен',
     unSuccessInteraction: 'Незавершенное взаимодействие',
     unSuccessInteraction: 'Незавершенное взаимодействие',
@@ -732,7 +761,8 @@ module.exports = {
     inputOptionName: 'Пожалуйста, введите название предмета ухода',
     inputOptionName: 'Пожалуйста, введите название предмета ухода',
     optionColor: 'Цвет лампы ухода',
     optionColor: 'Цвет лампы ухода',
     colorRgb: 'Идентификатор цвета',
     colorRgb: 'Идентификатор цвета',
-    basic: 'Основная информация по уходу'
+    basic: 'Основная информация по уходу',
+    boolCritical: 'Critical Illness Identification'
   },
   },
   board: {
   board: {
     boardSet: 'Установить информационную доску',
     boardSet: 'Установить информационную доску',
@@ -931,7 +961,8 @@ module.exports = {
     recordEnabled: 'Включение функции записи аудио и видео',
     recordEnabled: 'Включение функции записи аудио и видео',
     recordAble: 'Включение функции записи аудио и видео',
     recordAble: 'Включение функции записи аудио и видео',
     screenLight: 'Включите экран и запустите эту функцию.',
     screenLight: 'Включите экран и запустите эту функцию.',
-    roomCallBed: 'Открыть клапан. Машина вызывает кровать.'
+    roomCallBed: 'Открыть клапан. Машина вызывает кровать.',
+    boolAllDoorStatus: 'Откройте все двери.'
   },
   },
   role: {
   role: {
     roleName: 'Имя роли',
     roleName: 'Имя роли',
@@ -944,16 +975,40 @@ module.exports = {
     roleEvent: 'Ролевое событие',
     roleEvent: 'Ролевое событие',
     roleDelete: 'Удалить роль',
     roleDelete: 'Удалить роль',
     roleEdit: 'Редактировать событие роли',
     roleEdit: 'Редактировать событие роли',
-    onChoiceRole: 'Роль не выбрана!'
+    onChoiceRole: 'Роль не выбрана!',
+    leaderRole: 'Роль начальника',
+    leaderRolePlaceholder: 'Выберите высшую роль.',
+    roleEnum: 'Тип роли',
+    roleEnumPlaceholder: 'Выберите тип роли'
+  },
+  his: {
+    hisPart: '科室查询',
+    hisPartKeyval: '科室his主键',
+    hisPartName: '科室名称',
+    summary: '科室简介',
+    tel: '科室电话',
+    hisError: 'his错误',
+    hisPatient: '入住人',
+    hisPatientKeyval: '入住人his主键',
+    hisPatientInfo: '查询信息',
+    hisClerk: '工作人员',
+    hisClerkKeyval: '工作人员his主键',
+    hisDockerKeyval: '责任医生his主键',
+    hisNurseKeyval: '责任护士his主键',
+    passNo: '门禁卡',
+    hisNurseConfig: '护理项',
+    hisNurseOptionsKeyval: '护理项分类his主键'
   },
   },
   tab: {
   tab: {
     home: 'Дом',
     home: 'Дом',
     frameManage: 'Позиция в пространстве',
     frameManage: 'Позиция в пространстве',
     deviceManage: 'Все устройства',
     deviceManage: 'Все устройства',
     clerkManage: 'Управление сотрудниками',
     clerkManage: 'Управление сотрудниками',
+    clerkCalendar: 'Календарь сотрудников.',
     patientManage: 'Управление пациентами',
     patientManage: 'Управление пациентами',
     customerManage: 'Управление пользователями',
     customerManage: 'Управление пользователями',
     customerQrCode: 'QR-код пользователя',
     customerQrCode: 'QR-код пользователя',
+    customerAdvice: 'Приказ врача',
     mobileDeviceManage: 'Мобильное устройство',
     mobileDeviceManage: 'Мобильное устройство',
     userLocationManage: 'Местоположение пользователя',
     userLocationManage: 'Местоположение пользователя',
     sosDeviceSettingManage: 'Тревожное устройство',
     sosDeviceSettingManage: 'Тревожное устройство',
@@ -970,13 +1025,14 @@ module.exports = {
     nurseConfig: 'Параметры ухода',
     nurseConfig: 'Параметры ухода',
     boardManage: 'Настройки информационной доски',
     boardManage: 'Настройки информационной доски',
     eventManage: 'Управление событиями кнопки',
     eventManage: 'Управление событиями кнопки',
+    hisManage: 'Его запрос',
     interactionChars: 'Статистика взаимодействия',
     interactionChars: 'Статистика взаимодействия',
+    partSetting: '机构设置',
+    interactionChain: 'Интерактивный порядок приема',
     functionRoleMapping: 'Права компонентов',
     functionRoleMapping: 'Права компонентов',
     countdownConfig: 'Настройка компонентов обратного отсчета',
     countdownConfig: 'Настройка компонентов обратного отсчета',
     screentip: 'Настройка компонентов подсказок экрана',
     screentip: 'Настройка компонентов подсказок экрана',
-    bedsideInteration:'Компонент взаимодействия',
-    interactionChain: 'Интерактивный порядок приема',
-    partSetting: 'Настройки организации',
+    bedsideInteration: 'Компонент взаимодействия',
     allClerk: 'Все сотрудники',
     allClerk: 'Все сотрудники',
     allCustomer: 'Все пользователи',
     allCustomer: 'Все пользователи',
     allDevice: 'Все устройства',
     allDevice: 'Все устройства',
@@ -992,7 +1048,9 @@ module.exports = {
     ledDevice: 'Светодиодные устройства',
     ledDevice: 'Светодиодные устройства',
     entraceguardUser: 'Параметры прохода',
     entraceguardUser: 'Параметры прохода',
     customBoardManage: 'Настройка экрана панели',
     customBoardManage: 'Настройка экрана панели',
-    customBoardDesigner: 'Экран панели'
+    customBoardDesigner: 'Экран панели',
+    staffManageFrames: 'Параметры управления пространством',
+    deviceMenuManager: 'Меню Устройства'
   },
   },
   deviceType: {
   deviceType: {
     NURSE_HOST: 'Устройство медсестры',
     NURSE_HOST: 'Устройство медсестры',
@@ -1012,7 +1070,6 @@ module.exports = {
     REMOTE_CONTROL: 'Удаленное управление',
     REMOTE_CONTROL: 'Удаленное управление',
     BEACON: 'Маяки',
     BEACON: 'Маяки',
     INFORMATION_BOARD: 'Информационная доска',
     INFORMATION_BOARD: 'Информационная доска',
-    screentip: 'Настройка компонентов подсказок экрана',
     ENTRANCE_GUARD: 'Устройство контроля доступа',
     ENTRANCE_GUARD: 'Устройство контроля доступа',
     VISITATION: 'Машина посетителя',
     VISITATION: 'Машина посетителя',
     RS485_TRANSFER: 'Коробка преобразования 485',
     RS485_TRANSFER: 'Коробка преобразования 485',
@@ -1032,7 +1089,12 @@ module.exports = {
     BREASTPLATE: 'Значок',
     BREASTPLATE: 'Значок',
     OWON_X5_GATEWAY: 'Шлюз OWONX5',
     OWON_X5_GATEWAY: 'Шлюз OWONX5',
     FALL_DETECTION_RADAR: 'Радар предотвращения падения',
     FALL_DETECTION_RADAR: 'Радар предотвращения падения',
-    HUMAN_DETECTION_RADAR: 'Радар мониторинга сна'
+    HUMAN_DETECTION_RADAR: 'Радар мониторинга сна',
+    ALARM_INFUSION: 'Инфузионная сигнализация',
+    ELECTRONIC_FENCE: 'Электронное ограждение',
+    S433_DOOR_LAMP: '433 Беспроводные фонари',
+    S433_TRANSFER_BOX: '433 Беспроводная коробка',
+    S433_RECEIVER: '433 Приемник'
   },
   },
   vitalSignsDeviceType: {
   vitalSignsDeviceType: {
     BLOOD_SUGAR: 'Измеритель сахара в крови',
     BLOOD_SUGAR: 'Измеритель сахара в крови',
@@ -1101,65 +1163,42 @@ module.exports = {
     ChooseDate: 'дата',
     ChooseDate: 'дата',
     SleepData: 'Данные о спящем режиме'
     SleepData: 'Данные о спящем режиме'
   },
   },
-  errorType: {
-    REFRESH_TOKEN_FAILED: 'обновление Token завершилось',
-    TOKEN_FAILED: 'В данный момент',
-    USER_NULL: 'счёта нет!',
-    USER_DISABLE: 'текущий номер счета отключен, свяжитесь с администратором',
-    PASSWORD_ERROR: 'неправильно набран пароль!',
-    LOGIN_FAILED: 'ваш текущий профиль не позволяет десантировать систему!',
-    LOGOUT: 'Пользователь вышел из десанта',
-    MEMBER_NULL: 'текущий пользователь не существует!',
-    MEMBER_ADD_FAILED: 'Невозможно добавить идентификатор пользователя',
-    MEMBER_FAILED: 'Ошибка идентификации пользователя, не существует пользователя',
-    MOBILE_OCCUPY: 'номер мобильного телефона занято',
-    MEMBER_NAME_OCCUPY: 'текущий пользователь зарегистрирован',
-    CHANNEL_FAILED: 'Ошибка канала Id, не существует канала',
-    CHANNEL_SUBSCRIBE_MEMBER_NULL: 'отсутствует пользователь, не может подписаться',
-    CHANNEL_MEMBER_FAILED: 'не существует пользователя, не может подписаться на пользователя не принадлежит какому - либо учреждению, не может подписаться на него',
-    CHANNEL_NULL: 'не существует канала, не может подписаться',
-    FRAME_HOSPITAL_NULL: 'больница не существует',
-    FRAME_PART_NULL: 'узел класса не существует, аргументы неверны!',
-    FRAME_ADD_FAILED: 'узел класса не существует, аргументы неверны!  конечный номер меньше, чем начальный номер комнаты, параметры неверны!',
-    CUSTOMER_INFO_NULL: 'информации о больном не существует',
-    CLOUD_ADDRESS_NULL: 'не задан путь к облачности',
-    CLOUD_SAVE_FAILED: 'Невозможно сохранить облака',
-    SHOP_NULL: 'никакой ткани!',
-    SHOP_DAYTIME_ERROR: 'Неверный формат начала дня, выберите снова!',
-    SHOP_NIGHTTIME_ERROR: 'Формат ночного времени начала неправильный, пожалуйста, выберите еще раз!',
-    ADMIN_PASSWORD_ERROR: 'аккаунт Администратора уже существует, но пароль не соответствует!  используйте другой номер счета или введите правильный пароль.',
-    DEVICE_MAC_REPEAT: 'повторение адреса устройства MAC',
-    DEVICE_ADD_FAILED: 'текущее пространство уже существует, но не может быть зарегистрировано несколько аварийных кнопок',
-    DEVICE_FRAME_FAILED: 'тип устройства и тип пространственной структуры не совпадают!',
-    DATA_NULL: 'данные не найдены',
-    PARAM_ERROR: 'Неверный аргумент!',
-    PRIMARY_KEY_NULL: 'ошибка параметров, основной ключ Секции пустой!',
-    ROLE_NULL: 'Эта роль не существует',
-    ROLE_NAME_OCCUPY: 'повторение имён ролей',
-    ROLE_DELETE_FAILED: 'Эта роль используется, не может быть удалена!',
-    LICENSE_ERROR: 'ошибка авторизации серийных номеров после продажи',
-    LICENSE_EXPIRE: 'срок действия разрешения истекает после продажи',
-    LICENSE_FAILED: 'Неверный Авторизация после продажи',
-    FILE_UPLOAD_FAILED: 'каталог без профиля!'
+  interactionChain: {
+    ActionType: 'Тип взаимодействия',
+    FirstRole: 'Первыми получили роль',
+    SpreadRoleNamePath: 'Интерактивный прием последовательности ролей',
+    AddInteractionSpreadPath: 'Добавить интерактивный порядок получения',
+    EditInteractionSpreadPath: 'Изменить порядок интерактивного получения',
+    AllRoles: 'Все роли',
+    AcceptRoles: 'Роль получения',
+    NoticeSequence: 'Следите за порядком.',
+    SearchPlaceHolder: 'Введите имя персонажа',
+    Customer: 'Клиенты',
+    NURSE_HOST: 'Хозяин медсестры',
+    AcceptSequence: 'Порядок получения',
+    chooseActionTypeTip: 'Выберите тип взаимодействия',
+    chooseRoleSquence: 'Выберите порядок получения ролей',
+    sketchMap: 'Схема процесса интерактивного приема',
+    whilstFalse: 'Отправка по порядку',
+    whilstTrue: 'Отправить одновременно'
   },
   },
   functionRoleMapping: {
   functionRoleMapping: {
-    configurateLeft: 'Настроить обладание [',
-    configurateRight: ']Функциональные роли '
+    configurateLeft: 'Настроить обладание',
+    configurateRight: ']Функциональные роли'
   },
   },
   functions: {
   functions: {
+    function: 'Небольшие компоненты',
     SIGN_IN: 'Подписаться',
     SIGN_IN: 'Подписаться',
     MANAGE_BED: 'Управление койками',
     MANAGE_BED: 'Управление койками',
     POSITION_COMPONENT: 'Месторасположение',
     POSITION_COMPONENT: 'Месторасположение',
     COUNTDOWN_COMPONENT: 'Обратный отсчет',
     COUNTDOWN_COMPONENT: 'Обратный отсчет',
     ROOMCHECK_COMPONENT: 'Патрульный дом',
     ROOMCHECK_COMPONENT: 'Патрульный дом',
     SCREEN_TIP_SET_COMPONENT: 'Настройка подсказок экрана',
     SCREEN_TIP_SET_COMPONENT: 'Настройка подсказок экрана',
-    SIGN_IN:'Подписаться',
     nfcCalender: 'Календарь',
     nfcCalender: 'Календарь',
     nfcInteraction: 'Статистика малых компонентов',
     nfcInteraction: 'Статистика малых компонентов',
     nfcPosition: 'траектория траэтория наведения',
     nfcPosition: 'траектория траэтория наведения',
     currently: ' В настоящее время ',
     currently: ' В настоящее время ',
     notRecords: 'В настоящее время нет доступных записей'
     notRecords: 'В настоящее время нет доступных записей'
-
   },
   },
   countdownConfig: {
   countdownConfig: {
     countDownItmes: 'Проект обратного отсчета',
     countDownItmes: 'Проект обратного отсчета',
@@ -1190,6 +1229,61 @@ module.exports = {
     textSizeRequired: 'Размер текста должен быть заполнен',
     textSizeRequired: 'Размер текста должен быть заполнен',
     numberRequired: 'Необходимо ввести числа'
     numberRequired: 'Необходимо ввести числа'
   },
   },
+  clerkFrameManage: {
+    employeeView: 'Персонал',
+    frameView: 'Пространство',
+    multiClerkView: 'Многопользовательское пространство',
+    managedFrames: 'Управляемое пространство',
+    notManagedFrames: 'Неуправляемое пространство',
+    settableEmployee: 'Можно создать персонал',
+    settedEmployee: 'Созданы сотрудники',
+    allEmployee: 'Все сотрудники',
+    phoneAcceptorLabel: 'Телефонный получатель',
+    phoneAcceptorTipsLeft: 'При наличии других ролей и',
+    phoneAcceptorTipsMid: 'Управление пространственным дублированием',
+    phoneAcceptorTipsRight: 'Обычные телефонные звонки.'
+  },
+  errorType: {
+    REFRESH_TOKEN_FAILED: 'обновление Token завершилось',
+    TOKEN_FAILED: 'В данный момент',
+    USER_NULL: 'счёта нет!',
+    USER_DISABLE: 'текущий номер счета отключен, свяжитесь с администратором',
+    PASSWORD_ERROR: 'неправильно набран пароль!',
+    LOGIN_FAILED: 'ваш текущий профиль не позволяет десантировать систему!',
+    LOGOUT: 'Пользователь вышел из десанта',
+    MEMBER_NULL: 'текущий пользователь не существует!',
+    MEMBER_ADD_FAILED: 'Невозможно добавить идентификатор пользователя',
+    MEMBER_FAILED: 'Ошибка идентификации пользователя, не существует пользователя',
+    MOBILE_OCCUPY: 'номер мобильного телефона занято',
+    MEMBER_NAME_OCCUPY: 'текущий пользователь зарегистрирован',
+    CHANNEL_FAILED: 'Ошибка канала Id, не существует канала',
+    CHANNEL_SUBSCRIBE_MEMBER_NULL: 'отсутствует пользователь, не может подписаться',
+    CHANNEL_MEMBER_FAILED: 'не существует пользователя, не может подписаться на пользователя не принадлежит какому - либо учреждению, не может подписаться на него',
+    CHANNEL_NULL: 'не существует канала, не может подписаться',
+    FRAME_HOSPITAL_NULL: 'больница не существует',
+    FRAME_PART_NULL: 'узел класса не существует, аргументы неверны!',
+    FRAME_ADD_FAILED: 'узел класса не существует, аргументы неверны!  конечный номер меньше, чем начальный номер комнаты, параметры неверны!',
+    CUSTOMER_INFO_NULL: 'информации о больном не существует',
+    CLOUD_ADDRESS_NULL: 'не задан путь к облачности',
+    CLOUD_SAVE_FAILED: 'Невозможно сохранить облака',
+    SHOP_NULL: 'никакой ткани!',
+    SHOP_DAYTIME_ERROR: 'Неверный формат начала дня, выберите снова!',
+    SHOP_NIGHTTIME_ERROR: 'Формат ночного времени начала неправильный, пожалуйста, выберите еще раз!',
+    ADMIN_PASSWORD_ERROR: 'аккаунт Администратора уже существует, но пароль не соответствует!  используйте другой номер счета или введите правильный пароль.',
+    DEVICE_MAC_REPEAT: 'повторение адреса устройства MAC',
+    DEVICE_ADD_FAILED: 'текущее пространство уже существует, но не может быть зарегистрировано несколько аварийных кнопок',
+    DEVICE_FRAME_FAILED: 'тип устройства и тип пространственной структуры не совпадают!',
+    DATA_NULL: 'данные не найдены',
+    PARAM_ERROR: 'Неверный аргумент!',
+    PRIMARY_KEY_NULL: 'ошибка параметров, основной ключ Секции пустой!',
+    ROLE_NULL: 'Эта роль не существует',
+    ROLE_NAME_OCCUPY: 'повторение имён ролей',
+    ROLE_DELETE_FAILED: 'Эта роль используется, не может быть удалена!',
+    LICENSE_ERROR: 'ошибка авторизации серийных номеров после продажи',
+    LICENSE_EXPIRE: 'срок действия разрешения истекает после продажи',
+    LICENSE_FAILED: 'Неверный Авторизация после продажи',
+    FILE_UPLOAD_FAILED: 'каталог без профиля!'
+  },
   entraceguardUser: {
   entraceguardUser: {
     named: 'Имя пользователя',
     named: 'Имя пользователя',
     idNo: 'Номер удостоверения личности',
     idNo: 'Номер удостоверения личности',
@@ -1210,5 +1304,25 @@ module.exports = {
     titleRequire: 'Заголовок экрана не может быть пустым',
     titleRequire: 'Заголовок экрана не может быть пустым',
     createTitle: 'Дополнительный экран панели',
     createTitle: 'Дополнительный экран панели',
     editTitle: 'Изменить панель сообщений'
     editTitle: 'Изменить панель сообщений'
+  },
+  s433Led: {
+    s433Led: 'Беспроводной экран',
+    model: 'Модель',
+    inspectionTime: 'Время проверки',
+    screenGinseng: 'Женьшень экрана',
+    customData: 'Пользовательские данные',
+    duBug: 'Отладка',
+    clearDisplay: 'Очистить дисплей',
+    helloWord: 'Здравствуй, мир.',
+    batchTx: 'Массовая отправка',
+    wait: 'Ожидание отправки',
+    waitingForReturn: 'Отправить успешно в ожидании возвращения',
+    return: 'Вернуться к завершенному процессу',
+    failInSend: 'Ошибка отправки',
+    returnTimeout: 'Время ожидания возвращения',
+    send: 'Отправить',
+    noOnline: 'Коммутатор не в сети',
+    add433Box: 'Пожалуйста, добавьте конвертер 433.',
+    volumeControl: 'Регулирование громкости'
   }
   }
 }
 }

+ 24 - 6
languages/zh-CN.js

@@ -68,6 +68,7 @@ module.exports = {
     name: '名称',
     name: '名称',
     fullName: '全称',
     fullName: '全称',
     type: '类型',
     type: '类型',
+    choiceType: '请选择类型',
     alias: '别名',
     alias: '别名',
     tips: '提示',
     tips: '提示',
     time: '小时',
     time: '小时',
@@ -219,7 +220,10 @@ module.exports = {
     closeWatchSos: '关闭手表久坐报警',
     closeWatchSos: '关闭手表久坐报警',
     openWatchSos: '开启手表久坐报警',
     openWatchSos: '开启手表久坐报警',
     opendebug: '调试',
     opendebug: '调试',
-    reboot: '重启'
+    inputName: '请输入名称',
+    reboot: '重启',
+    count: '统计次数',
+    system: '系统'
   },
   },
   member: {
   member: {
     face: '头像',
     face: '头像',
@@ -262,7 +266,7 @@ module.exports = {
     deleteMember: '你确定要删除此用户信息?',
     deleteMember: '你确定要删除此用户信息?',
     cannotDeleteAdmin: '不能删除机构负责人',
     cannotDeleteAdmin: '不能删除机构负责人',
     leaderName: '上级职员',
     leaderName: '上级职员',
-    passNo:'工号/职工卡号'
+    passNo: '工号/职工卡号'
   },
   },
   home: {
   home: {
     todayTask: '今日任务',
     todayTask: '今日任务',
@@ -421,6 +425,20 @@ module.exports = {
     roomNoDevice: '房间没有设备',
     roomNoDevice: '房间没有设备',
     bedNoDevice: '床位没有设备'
     bedNoDevice: '床位没有设备'
   },
   },
+  deviceMenuManage: {
+    add: '添加设备菜单',
+    name: '功能区名称',
+    active: '启用',
+    unActive: '不启动',
+    actived: '是否启用',
+    inputUrl: '请输入URL地址',
+    inputActName: '请输入Activity页面地址',
+    urlTemplate: 'URL的参数',
+    inputTemplate: '请输入参数名',
+    inputTemplateValue: '请输入参数值',
+    actIntent: 'Activity的参数',
+    inputActIntent: '请输入Activity的参数'
+  },
   clerkManage: {
   clerkManage: {
     clerkEdit: '编辑成员信息',
     clerkEdit: '编辑成员信息',
     choiceClerk: '请选择员工',
     choiceClerk: '请选择员工',
@@ -986,6 +1004,7 @@ module.exports = {
     frameManage: '空间位置',
     frameManage: '空间位置',
     deviceManage: '所有设备',
     deviceManage: '所有设备',
     clerkManage: '员工管理',
     clerkManage: '员工管理',
+    clerkCalendar: '员工打卡日历',
     patientManage: '入住人员管理',
     patientManage: '入住人员管理',
     customerManage: '用户管理',
     customerManage: '用户管理',
     customerQrCode: '用户二维码',
     customerQrCode: '用户二维码',
@@ -1030,7 +1049,8 @@ module.exports = {
     entraceguardUser: '用户通行设置',
     entraceguardUser: '用户通行设置',
     customBoardManage: '信息看板设计',
     customBoardManage: '信息看板设计',
     customBoardDesigner: '看板屏设计',
     customBoardDesigner: '看板屏设计',
-    staffManageFrames: '空间管理设置'
+    staffManageFrames: '空间管理设置',
+    deviceMenuManager: '设备菜单'
   },
   },
   deviceType: {
   deviceType: {
     NURSE_HOST: '护士主机',
     NURSE_HOST: '护士主机',
@@ -1143,7 +1163,6 @@ module.exports = {
     ChooseDate: '日期',
     ChooseDate: '日期',
     SleepData: '睡眠数据'
     SleepData: '睡眠数据'
   },
   },
-
   interactionChain: {
   interactionChain: {
     ActionType: '交互类型',
     ActionType: '交互类型',
     FirstRole: '最先接收角色',
     FirstRole: '最先接收角色',
@@ -1168,14 +1187,13 @@ module.exports = {
     configurateRight: ']功能的角色'
     configurateRight: ']功能的角色'
   },
   },
   functions: {
   functions: {
+    function: '小组件',
     SIGN_IN: '签到',
     SIGN_IN: '签到',
     MANAGE_BED: '管理床位',
     MANAGE_BED: '管理床位',
     POSITION_COMPONENT: '定位',
     POSITION_COMPONENT: '定位',
     COUNTDOWN_COMPONENT: '倒计时',
     COUNTDOWN_COMPONENT: '倒计时',
     ROOMCHECK_COMPONENT: '巡房',
     ROOMCHECK_COMPONENT: '巡房',
     SCREEN_TIP_SET_COMPONENT: '设置屏幕提示语',
     SCREEN_TIP_SET_COMPONENT: '设置屏幕提示语',
-    SIGN_IN:'签到',
-
     nfcCalender: '日历记录',
     nfcCalender: '日历记录',
     nfcInteraction: '小组件统计',
     nfcInteraction: '小组件统计',
     nfcPosition: '定位轨迹',
     nfcPosition: '定位轨迹',

+ 41 - 0
src/api/ncs_device_menu.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+export function getList(params) {
+  return request({
+    url: '/ncs/device_menu/page',
+    method: 'POST',
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function getListByPartId(params) {
+  return request({
+    url: '/ncs/device_menu/list_by_part_id',
+    method: 'POST',
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+export function remove(id) {
+  return request({
+    url: `/ncs/device_menu/${id}`,
+    method: 'DELETE',
+    loading: true
+  })
+}
+/** 修改 */
+export function update(id, params) {
+  return request({
+    url: `/ncs/device_menu/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+/** 新增 */
+export function add(params) {
+  return request({
+    url: '/ncs/device_menu',
+    method: 'POST',
+    loading: true,
+    data: params
+  })
+}

+ 2 - 2
src/api/ncs_hospitalFrame.js

@@ -106,9 +106,9 @@ export function getFramesPartId(part_id) {
   })
   })
 }
 }
 
 
-export function getAllFrames(part_id) {
+export function getAllFrames() {
   return request({
   return request({
-    url: `/ncs/frame/all_frames/${part_id}`,
+    url: `/ncs/frame/all_frames`,
     method: 'GET',
     method: 'GET',
     loading: false
     loading: false
   })
   })

+ 41 - 25
src/router/index.js

@@ -161,6 +161,12 @@ export const partRoutes = [
         name: 'BoardTitle',
         name: 'BoardTitle',
         meta: { title: i18n.t('tab.customBoardManage'), icon: 'designer', noCache: true },
         meta: { title: i18n.t('tab.customBoardManage'), icon: 'designer', noCache: true },
         hidden: uiVersion === 2
         hidden: uiVersion === 2
+      },
+      {
+        path: 'device-menu',
+        component: () => import('@/views/ncs-device-menu/index'),
+        name: 'DeviceMenu',
+        meta: { title: i18n.t('tab.deviceMenuManager'), icon: 'el-icon-menu', noCache: true }
       }
       }
     ]
     ]
   },
   },
@@ -182,25 +188,20 @@ export const partRoutes = [
     path: '/ncs-clerk',
     path: '/ncs-clerk',
     component: Layout,
     component: Layout,
     redirect: '/ncs-clerk/clerkList',
     redirect: '/ncs-clerk/clerkList',
+    name: 'part-clerk',
+    meta: { title: i18n.t('tab.clerkManage'), icon: 'peoples', noCache: true },
     children: [
     children: [
       {
       {
         path: 'clerkList',
         path: 'clerkList',
         component: () => import('@/views/ncs-clerk/clerkManagement'),
         component: () => import('@/views/ncs-clerk/clerkManagement'),
         name: 'clerkList',
         name: 'clerkList',
-        meta: { title: i18n.t('tab.clerkManage'), icon: 'peoples', noCache: true }
-      }
-    ]
-  },
-  {
-    path: '/nfc-interaction',
-    component: Layout,
-    redirect: '/nfc-interaction',
-    children: [
+        meta: { title: i18n.t('tab.clerkManage'), icon: 'el-icon-user-solid', noCache: true }
+      },
       {
       {
         path: 'nfcInteractionList',
         path: 'nfcInteractionList',
         component: () => import('@/views/nfc-interaction/index'),
         component: () => import('@/views/nfc-interaction/index'),
         name: 'nfcInteractionList',
         name: 'nfcInteractionList',
-        meta: { title: '员工打卡日历', icon: 'peoples', noCache: true }
+        meta: { title: i18n.t('tab.clerkCalendar'), icon: 'el-icon-date', noCache: true }
       }
       }
     ]
     ]
   },
   },
@@ -495,7 +496,7 @@ export const partRoutes = [
     children: [
     children: [
       {
       {
         path: 'index/:id?',
         path: 'index/:id?',
-        component: () => import('@/views/custom-infoboard/infoboard-designer'),//自定义看板 component: () => import('@/views/custom-infoboard/infoboard-designer'),资阳 component: () => import('@/views/custom-infoboard/screen-designer')
+        component: () => import('@/views/custom-infoboard/infoboard-designer'), // 自定义看板 component: () => import('@/views/custom-infoboard/infoboard-designer'),资阳 component: () => import('@/views/custom-infoboard/screen-designer')
         name: 'BoardDesigner',
         name: 'BoardDesigner',
         meta: { title: i18n.t('tab.customBoardDesigner'), icon: 'el-icon-data-board', noCache: true }
         meta: { title: i18n.t('tab.customBoardDesigner'), icon: 'el-icon-data-board', noCache: true }
       }
       }
@@ -514,8 +515,7 @@ export const partRoutes = [
         name: 'eventList',
         name: 'eventList',
         meta: { title: i18n.t('tab.eventManage'), icon: 'el-icon-notebook-2', noCache: true }
         meta: { title: i18n.t('tab.eventManage'), icon: 'el-icon-notebook-2', noCache: true }
       }
       }
-    ],
-    hidden: uiVersion === 1
+    ]
   },
   },
   // {
   // {
   //   path: '/calling-deviceregisterparams',
   //   path: '/calling-deviceregisterparams',
@@ -754,12 +754,28 @@ export const adminRoutes = [
     path: '/admin/ncs-device',
     path: '/admin/ncs-device',
     component: Layout,
     component: Layout,
     redirect: '/ncs-device/device-admin',
     redirect: '/ncs-device/device-admin',
+    meta: {
+      title: i18n.t('deviceManage.deviceManage'),
+      icon: 'devices'
+    },
     children: [
     children: [
       {
       {
         path: 'index',
         path: 'index',
         component: () => import('@/views/ncs-device/device-admin'),
         component: () => import('@/views/ncs-device/device-admin'),
         name: 'CallingDeviceAdmin',
         name: 'CallingDeviceAdmin',
         meta: { title: i18n.t('tab.allDevice'), icon: 'component', noCache: true }
         meta: { title: i18n.t('tab.allDevice'), icon: 'component', noCache: true }
+      },
+      {
+        path: 'device-menu',
+        component: () => import('@/views/ncs-device-menu/deviceMenuManagement'),
+        name: 'DeviceMenu',
+        meta: { title: i18n.t('tab.deviceMenuManager'), icon: 'el-icon-menu', noCache: true }
+      },
+      {
+        path: 'linux-version',
+        component: () => import('@/views/ncs-linux-version/linuxVersionSetting'),
+        name: 'linuxVersion',
+        meta: { title: i18n.t('tab.linuxVersion'), icon: 'nested', noCache: true }
       }
       }
     ]
     ]
   },
   },
@@ -897,18 +913,18 @@ export const adminRoutes = [
       }
       }
     ]
     ]
   },
   },
-  {
-    path: '/ncs-linux-version',
-    component: Layout,
-    children: [
-      {
-        path: 'index',
-        component: () => import('@/views/ncs-linux-version/linuxVersionSetting'),
-        name: 'linuxVersion',
-        meta: { title: i18n.t('tab.linuxVersion'), icon: 'nested', noCache: true }
-      }
-    ]
-  },
+  // {
+  //   path: '/ncs-linux-version',
+  //   component: Layout,
+  //   children: [
+  //     {
+  //       path: 'index',
+  //       component: () => import('@/views/ncs-linux-version/linuxVersionSetting'),
+  //       name: 'linuxVersion',
+  //       meta: { title: i18n.t('tab.linuxVersion'), icon: 'nested', noCache: true }
+  //     }
+  //   ]
+  // },
   {
   {
     path: '/device-frame',
     path: '/device-frame',
     component: Layout,
     component: Layout,

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

@@ -0,0 +1,10 @@
+import createEnum from '@/utils/enum/createEnum'
+import i18n from '@/utils/i18n'
+
+export const DEVICE_MENU_TYPE = createEnum(
+  {
+    SYS: ['SYS', i18n.t('action.system')],
+    URL: ['URL', 'url'],
+    ACT: ['ACT', 'activity']
+  }
+)

+ 1 - 1
src/views/customer/components/customerManager.vue

@@ -1575,7 +1575,7 @@ export default {
     },
     },
     getPartFrame(partId) {
     getPartFrame(partId) {
       if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
       if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
-        API_Frame.getAllFrames(partId).then(res => {
+        API_Frame.getAllFrames().then(res => {
           this.partFrames = [...res]
           this.partFrames = [...res]
         })
         })
       } else {
       } else {

+ 1 - 1
src/views/customer/components/patientManager.vue

@@ -1703,7 +1703,7 @@
           },
           },
           getPartFrame(partId) {
           getPartFrame(partId) {
             if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
             if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
-              API_Frame.getAllFrames(partId).then(res => {
+              API_Frame.getAllFrames().then(res => {
                 this.partFrames = [...res]
                 this.partFrames = [...res]
               })
               })
             } else {
             } else {

+ 23 - 0
src/views/ncs-device-menu/deviceMenuManagement.vue

@@ -0,0 +1,23 @@
+<template>
+  <div>
+    <device-menu-manager :frame="frame" :part_view="false" />
+  </div>
+
+</template>
+
+<script>
+import deviceMenuManager from './index'
+export default {
+  name: "deviceMenuManagement",
+  components: { deviceMenuManager },
+  data() {
+    return {
+      frame: {}
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 696 - 0
src/views/ncs-device-menu/index.vue

@@ -0,0 +1,696 @@
+<template>
+  <div>
+
+    <ag-grid-layout
+        toolbar
+        :table-height="tableHeight"
+        theme="ag-theme-alpine"
+        :column-defs="columnDefs"
+        :row-data="rowData"
+        :locale-text="localeText"
+        :grid-options="gridOptions"
+        :default-col-def="defaultColDef"
+        :animate-rows="true"
+        :row-selection="rowSelection"
+        :enable-cell-change-flash="true"
+        @filterChanged="filterModifed"
+        @sortChanged="gridSortChange"
+    >
+      <!--        @rowDoubleClicked="getList"-->
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
+        </div>
+        <div class="toolbar-btns">
+          <el-button type="primary" size="mini" @click="handleAdd">{{ this.$t('action.add') }}</el-button>
+          <el-button type="danger" size="mini" @click="batchDelete">{{ this.$t('action.deleteList') }}</el-button>
+        </div>
+      </div>
+      <el-pagination
+          v-if="pageData"
+          slot="pagination"
+          :current-page="pageData.page_no"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="pageData.page_size"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="pageData.data_total"
+          @size-change="handlePageSizeChange"
+          @current-change="handlePageCurrentChange"
+      />
+    </ag-grid-layout>
+
+
+    <el-dialog :title.sync="formtitle" :visible.sync="formshow" width="40%">
+      <div>
+        <el-form ref="editform" :rules="rules" label-width="120px" :model="formmodel">
+          <el-form-item :label="this.$t('deviceMenuManage.name')" prop="name">
+            <el-input v-model="formmodel.name" :placeholder="this.$t('action.inputName')" :maxlength="20" />
+          </el-form-item>
+          <el-form-item :label="this.$t('deviceManage.deviceType')" prop="device_type">
+            <el-select v-model="formmodel.device_type"
+                       :placeholder="this.$t('deviceManage.choiceDeviceType')"
+                       filterable clearable>
+              <el-option v-for="(item,index) in deviceTypeTransfer" :key="index" :label="item.key" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item :label="this.$t('action.type')" prop="type">
+            <el-select v-model="formmodel.type"
+                       :placeholder="this.$t('action.choiceType')"
+                       filterable clearable>
+              <el-option v-for="(item,index) in deviceMenuTypeTransfer" :key="index" :label="item.key" :value="item.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item :label="this.$t('deviceManage.roleName')" prop="role_id">
+            <el-select v-model="formmodel.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>
+          <el-form-item label="URL" prop="url">
+            <el-input v-model="formmodel.url" :placeholder="this.$t('deviceMenuManage.inputUrl')" />
+          </el-form-item>
+<!--          <el-form-item :label="this.$t('deviceMenuManage.urlTemplate')" prop="url_params_temp">-->
+<!--            <el-input v-model="formmodel.url_params_temp" :placeholder="this.$t('deviceMenuManage.inputUrlTemplate')" :maxlength="20" />-->
+<!--          </el-form-item>-->
+
+          <el-form-item :label="urlTemplateStr"
+                        v-for="(item, index) in formmodelUrlParamsTemp" :key="'u' + index">
+            <el-col :span="10" style="margin: 0 10px 0 0">
+              <el-input v-model="item.parameter" :maxlength="20" :placeholder="inputTemplateStr"/>
+            </el-col>
+            <el-col :span="10" style="margin: 0 10px 0 0">
+              <el-input v-model="item.value" :maxlength="20" :placeholder="inputTemplateValueStr"/>
+            </el-col>
+            <el-col :span="3" style="margin: auto">
+              <el-button v-if="index === 0" type="primary" @click="addInput(formmodelUrlParamsTemp)"> {{ addStr }} </el-button>
+              <el-button v-else type="danger" @click="delInput(formmodelUrlParamsTemp, index)"> {{ delStr }} </el-button>
+            </el-col>
+
+          </el-form-item>
+
+          <el-form-item label="Activity" prop="act_name">
+            <el-input v-model="formmodel.act_name" :placeholder="this.$t('deviceMenuManage.inputActName')"/>
+          </el-form-item>
+<!--          <el-form-item :label="this.$t('deviceMenuManage.actIntent')" prop="act_intent">-->
+<!--            <el-input v-model="formmodel.act_intent" :placeholder="this.$t('deviceMenuManage.inputActIntent')" :maxlength="20" />-->
+<!--          </el-form-item>-->
+
+          <el-form-item :label="actIntentStr"
+                        v-for="(item, index) in formmodelActIntent" :key="'a' + index">
+            <el-col :span="10" style="margin: 0 10px 0 0">
+              <el-input v-model="item.parameter" :maxlength="20" :placeholder="inputTemplateStr"/>
+            </el-col>
+            <el-col :span="10" style="margin: 0 10px 0 0">
+              <el-input v-model="item.value" :maxlength="20" :placeholder="inputTemplateValueStr"/>
+            </el-col>
+            <el-col :span="3" style="margin: auto">
+              <el-button v-if="index === 0" type="primary" @click="addInput(formmodelActIntent)"> {{ addStr }} </el-button>
+              <el-button v-else type="danger" @click="delInput(formmodelActIntent, index)"> {{ delStr }} </el-button>
+            </el-col>
+
+          </el-form-item>
+          <el-form-item :label="this.$t('action.sort')" prop="index">
+            <el-input-number v-model="formmodel.nindex" :min="1"  :placeholder="this.$t('action.sort')"  />
+          </el-form-item>
+
+          <el-form-item :label="this.$t('deviceMenuManage.actived')" prop="actived">
+            <el-checkbox v-model="formmodel.actived" :true-label="1" :false-label="0">{{ this.$t('deviceMenuManage.active') }}</el-checkbox>
+          </el-form-item>
+
+          <el-form-item :label="this.$t('event.icon')">
+            <el-upload
+                class="avatar-uploader"
+                :action="`${uploadurl}?scene=avatar`"
+                :show-file-list="false"
+                :on-success="uploaded"
+                :before-upload="handleShopLogoBefore"
+            >
+              <img v-if="imageUrl" :src="imageUrl" class="avatar">
+              <i v-else class="el-icon-plus avatar-uploader-icon" />
+            </el-upload>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="formshow = false">{{ this.$t('action.cancel') }}</el-button>
+        <el-button type="primary" @click="handlerFormSubmit('editform')">{{ this.$t('action.yes') }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+
+</template>
+
+<script>
+import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
+import ImageViewer from 'element-ui/packages/image/src/image-viewer'
+import {AG_GRID_LOCALE_CN} from "@/utils/AgGridVueLocaleCn";
+import * as API_DeviceMenu from "@/api/ncs_device_menu";
+import {DEVICE_TYPE} from "@/utils/enum/DeviceTypeEnum";
+import {DEVICE_MENU_TYPE} from "@/utils/enum/DeviceMenuTypeEnum";
+import * as clerk_API from "@/api/ncs_clerk";
+import {ROLE_TYPE} from "@/utils/enum/RoleTypeEnum";
+
+const serverUrl = domain.serverUrl
+
+export default {
+  name: "index",
+  components: { ButtonCellRender, ImageViewer },
+  props: {
+    frame: {
+      type: Object,
+      default: () => {}
+    },
+    part_view: { // 是否为科室视图
+      type: Boolean,
+      default: true
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1
+      },
+      /** 新建组织弹出参数 **/
+      formtitle: this.$t('deviceMenuManage.add'),
+      formshow: false,
+      formmodel: {
+        nindex: 1,
+        actived: 1,
+        url_params_temp: '',
+        act_intent: ''
+      },
+      formmodelUrlParamsTemp: [{
+        parameter: '',
+        value: ''
+      }],
+      formmodelActIntent: [{
+        parameter: '',
+        value: ''
+      }],
+      /** ag-grid参数 **/
+      pageData: [],
+      loading: false,
+      shopVisible: false,
+      columnDefs: null,
+      rowData: null,
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      filterState: null,
+      rowSelection: null,
+      frameworkComponents: null,
+      rules: {
+        name: [
+          { required: true, message: this.$t('action.inputName'), trigger: 'blur' }
+        ],
+        type: [
+          { required: true, message: this.$t('action.choiceType'), trigger: 'blur' }
+        ],
+      },
+      /** 设备类型转换数组 **/
+      deviceTypeTransfer:  DEVICE_TYPE.getKeyValueList(),
+      deviceMenuTypeTransfer: DEVICE_MENU_TYPE.getKeyValueList(),
+      rolesOptions: [],
+      uploadurl: serverUrl + '/ncs/upload/uploadFile',
+      imageUrl: '',
+      urlTemplateStr: this.$t('deviceMenuManage.urlTemplate'),
+      inputTemplateStr: this.$t('deviceMenuManage.inputTemplate'),
+      inputTemplateValueStr: this.$t('deviceMenuManage.inputTemplateValue'),
+      actIntentStr: this.$t('deviceMenuManage.actIntent'),
+      addStr: this.$t('action.add'),
+      delStr: this.$t('action.delete')
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 130
+    }
+
+  },
+  beforeMount() {
+    this.gridOptions = {}
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 100,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: 'ID', field: 'id', sortable: true, filter: 'agNumberColumnFilter', width: 130 },
+      {
+        headerName: this.$t('deviceMenuManage.name'), field: 'name', sortable: true, filter: 'agTextColumnFilter', width: 150
+      },
+      {
+        headerName: this.$t('deviceMenuManage.actived'), field: 'actived', sortable: true, filter: 'agTextColumnFilter', width: 150, valueFormatter: this.formatterActived
+      },
+      {
+        headerName: this.$t('deviceManage.deviceType'), field: 'device_type', sortable: true, filter: 'agTextColumnFilter', width: 150, valueFormatter: this.formatterDeviceType
+      },
+
+      {
+        headerName: this.$t('action.type'), field: 'type', sortable: true, filter: 'agTextColumnFilter', width: 150, valueFormatter: this.formatterDeviceMenuType
+      },
+      {
+        headerName: this.$t('deviceManage.roleName'), field: 'role_name', sortable: true, filter: 'agTextColumnFilter', flex: 1
+      },
+      {
+        headerName: 'URL', field: 'url', sortable: true, filter: 'agTextColumnFilter', flex: 1
+      },
+      {
+        headerName: this.$t('deviceMenuManage.urlTemplate'), field: 'url_params_temp', sortable: true, filter: 'agTextColumnFilter', flex: 1, valueFormatter: this.formatterUnEscape
+      },
+      {
+        headerName: 'Activity', field: 'act_name', sortable: true, filter: 'agTextColumnFilter', flex: 1
+      },
+      {
+        headerName: this.$t('deviceMenuManage.actIntent'), field: 'act_intent', sortable: true, filter: 'agTextColumnFilter', flex: 1, valueFormatter: this.formatterUnEscape
+      },
+      {
+        headerName: this.$t('action.edit'),
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: {
+          onClick: this.handlerEdit,
+          label: this.$t('action.edit'),
+          buttonType: 'primary',
+          buttonSize: 'mini'
+        },
+        filter: false,
+        pinned: 'right',
+        lockPinned: true,
+        width: 100,
+        resizable: false,
+        sortable: false
+      },
+      {
+        headerName: this.$t('action.delete'),
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: param => {
+          return {
+            onClick: this.deleteSingle,
+            label: this.$t('action.delete'),
+            buttonType: 'danger',
+            buttonSize: 'mini'
+          }
+        },
+        pinned: 'right',
+        lockPinned: true,
+        width: 100,
+        resizable: false,
+        filter: false,
+        sortable: false
+      }
+    ]
+    this.defaultColDef = {
+      sortable: true,
+      resizable: true,
+      comparator: this.dateCustomComparator,
+      filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        textCustomComparator: this.textCustomComparator,
+        comparator: this.dateCustomComparator
+      }
+    }
+    this.rowSelection = 'multiple'
+  },
+  mounted() {
+    window.onresize = this.windowResize
+    this.gridApi = this.gridOptions.api
+    this.getList()
+  },
+  methods: {
+    windowResize() {
+      this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      this.gridApi.showLoadingOverlay()
+      this.gridApi.sizeColumnsToFit()
+      if (this.part_view) {
+        this.params.fixedCondition = " part_id = " + this.$store.getters.partId
+        this.getDeviceMenuList(this.params)
+      } else {
+        this.params.fixedCondition = " part_id is null"
+        this.getDeviceMenuList(this.params)
+      }
+    },
+    getDeviceMenuList(params) {
+      API_DeviceMenu.getList(params).then(response => {
+        this.loading = false
+        this.rowData = response.data
+        console.log(response.data)
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+        this.$nextTick(() => {
+          const node = this.gridApi.getDisplayedRowAtIndex(0)
+          if (node !== null && node !== undefined) {
+            node.setSelected(true)
+          }
+        })
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+    /** 处理搜索 */
+    handlerSearch(keywords) {
+      this.params.query = keywords
+      this.getList()
+    },
+    filterModifed(param) {
+      const model = param.api.getFilterModel()
+      this.params.filter = JSON.stringify(model)
+      this.getList()
+    },
+    gridSortChange(param) {
+      const columnState = param.columnApi.getColumnState()
+      // 排序状态
+      const sortState = columnState.filter(function(s) {
+        return s.sort != null
+      }).map(function(s) {
+        return {
+          colId: s.colId,
+          sort: s.sort,
+          sortIndex: s.sortIndex
+        }
+      }).sort(function(a, b) {
+        return a.sortIndex - b.sortIndex
+      })
+      if (sortState.length > 0) {
+        if (sortState.length === 1) {
+          this.params.sort = sortState[0].colId
+          this.params.dir = sortState[0].sort
+        } else {
+          let sortstring = ''
+          sortState.forEach(function(item) {
+            sortstring += item.colId + ' ' + item.sort + ','
+          })
+          this.params.sort = sortstring.substring(0, sortstring.length - 1)
+          this.params.dir = ' '
+        }
+      } else {
+        delete this.params.sort
+        delete this.params.dir
+      }
+      this.getList()
+    },
+    handleAdd: function() {
+      this.getRoles({
+        page_size: 200,
+        page_no: 1,
+        fixedCondition: ' shop_id = -1',
+        sort: ' role_id',
+        dir: 'desc'
+      })
+      this.formmodelUrlParamsTemp = [{
+        parameter: '',
+        value: ''
+      }]
+      this.formmodelActIntent = [{
+        parameter: '',
+        value: ''
+      }]
+      if (this.$refs.editform) {
+        this.$refs.editform.resetFields()
+      }
+      this.imageUrl = null
+      this.editflag = 0
+      this.formshow = true
+    },
+    handlerEdit: function(row) {
+      this.getRoles({
+        page_size: 200,
+        page_no: 1,
+        fixedCondition: ' shop_id = -1',
+        sort: ' role_id',
+        dir: 'desc'
+      })
+      this.formmodel = Object.assign({}, row)
+      this.imageUrl = row.icon_src
+      this.formmodelUrlParamsTemp = this.strToParamsTemp(this.formmodel.url_params_temp)
+      this.formmodelActIntent = this.strToParamsTemp(this.formmodel.act_intent)
+      this.editflag = 1
+      this.formshow = true
+    },
+    /** 新增 提交表单 */
+    handlerFormSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (this.part_view) {
+          this.formmodel.part_id = this.$store.getters.partId
+        }
+        this.formmodel.role_name = ROLE_TYPE.getDescFromValue(this.formmodel.role_id)
+        this.formmodel.url_params_temp = this.paramsTempToStr(this.formmodelUrlParamsTemp)
+        this.formmodel.act_intent = this.paramsTempToStr(this.formmodelActIntent)
+        if (valid) {
+          const params = this.MixinClone(this.formmodel)
+          if (this.imageUrl) {
+            params.icon_src = this.imageUrl
+          }
+          /** 新增 */
+          if (this.editflag === 0) {
+            API_DeviceMenu.add(params).then(res => {
+              this.formshow = false
+              this.$message.success(this.$t('action.saveSuccess'))
+              this.getList()
+              this.imageUrl = null
+            })
+          } else {
+            /** 修改 */
+            API_DeviceMenu.update(params.id, params).then(res => {
+              this.formshow = false
+              this.$message.success(this.$t('action.editSuccess'))
+              this.getList()
+              this.imageUrl = null
+            })
+          }
+        }
+      })
+    },
+    /** 图片上传之前的校验 */
+    handleShopLogoBefore(file) {
+      return new Promise((resolve, reject) => {
+        const isImg = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif'
+        const isLt2M = file.size / 1024 / 1024 < 2
+
+        if (!isImg) {
+          this.$message.error(this.$t('action.uploaderImg2'))
+          reject()
+        }
+        if (!isLt2M) {
+          this.$message.error(this.$t('action.uploaderSize2'))
+          reject()
+        }
+        const reader = new FileReader()
+        reader.onload = (event) => {
+          const image = new Image()
+          image.onload = () => {
+            const width = image.width
+            const height = image.height
+            if (width > 500 || width < 100) {
+              this.$message.error(this.$t('action.uploaderImgMsg'))
+              reject()
+            }
+            if (width !== height) {
+              this.$message.error(this.$t('action.uploaderImgMsg2'))
+              reject()
+            }
+            if (height > 500 || height < 100) {
+              this.$message.error(this.$t('action.uploaderImgMsg3'))
+              reject()
+            }
+            resolve()
+          }
+          image.src = event.target.result
+        }
+        reader.readAsDataURL(file)
+      })
+    },
+
+    /** 上传成功后的钩子 更换图片 置空存储数组*/
+    uploaded(res) {
+      this.imageUrl = serverUrl + '/' + res
+      this.formmodel.icon_src = this.imageUrl
+    },
+    /** 选择行变化时,记录选中的行数据 */
+    selectFun(val) {
+      this.multipleSelection = val
+    },
+    deleteSingle(row) {
+      this.handlerDelete(row.id)
+    },
+    /** 批量数据删除处理(删除选中的行) */
+    batchDelete: function() {
+      const rows = this.gridApi.getSelectedRows()
+      if (rows.length === 0) {
+        this.$message({ type: 'info', message: this.$t('member.pleaseChoiceDelete') })
+        return
+      }
+      const ids = []
+      rows.forEach(function(item) {
+        ids.push(item.id)
+      })
+      this.handlerDelete(ids.join(','))
+    },
+    /** 单条数据删除处理 */
+    handlerDelete(ids) {
+      this.$confirm(this.$t('action.sureDelete'), this.$t('action.waring'), {
+        confirmButtonText: this.$t('action.yes'),
+        cancelButtonText: this.$t('action.cancel'),
+        type: 'warning'
+      }).then(() => {
+        API_DeviceMenu.remove(ids).then(
+            response => {
+              this.getList()
+              this.$message({
+                type: 'success',
+                message: this.$t('action.deleted')
+              })
+            }
+        ).catch(response => {
+          this.$message({
+            type: 'info',
+            message: response.message
+          })
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: this.$t('action.cancelDelete')
+        })
+      })
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    getRoles(param) {
+      // 获取角色
+      clerk_API.getRoles(param).then(response => {
+        this.rolesOptions = response.data
+      })
+    },
+    formatterActived(row) {
+      if (row.data.actived === 1) {
+        return this.$t('deviceMenuManage.active')
+      } else {
+        return this.$t('deviceMenuManage.unActive')
+      }
+    },
+    formatterDeviceMenuType(param){
+      return DEVICE_MENU_TYPE.getDesc(param.value)
+    },
+    formatterDeviceType(param){
+      return DEVICE_TYPE.getDescFromValue(param.value)
+    },
+    formatterUnEscape(param){
+      return param.value.replace(/&amp;/g, "&")
+    },
+    addInput(paramsTemp){
+      paramsTemp.push({
+        parameter: '',
+        value: ''
+      })
+    },
+    delInput(paramsTemp, index) {
+      paramsTemp.splice(index, 1)
+    },
+    // 将参数项转换成字符串
+    paramsTempToStr(paramsTemp){
+      let paramsTempStr = '';
+      let _paramsTemp = '';
+      if (paramsTemp.length !== 0) {
+        for (let i = 0; i < paramsTemp.length; i++) {
+          if (paramsTemp[i].parameter !== '') {
+            if (i !== 0){
+              paramsTempStr += '&'
+            }
+            _paramsTemp = paramsTemp[i].parameter + '={{' + paramsTemp[i].value + '}}'
+            paramsTempStr += _paramsTemp;
+          }
+        }
+      }
+      return paramsTempStr
+    },
+    // 将字符串转换成参数项
+    strToParamsTemp(str){
+      const paramsTemp = []
+      let _parameter = ''
+      let _value = ''
+      if (str !== '') {
+        let _str = str.split('&amp;')
+        for (let i = 0; i < _str.length; i++) {
+          _parameter = _str[i].split('=')[0]
+          _value = _str[i].split('{{')[1].split('}}')[0]
+          paramsTemp.push({ parameter: _parameter, value: _value })
+        }
+      }
+      if (paramsTemp.length !== 0) {
+        return paramsTemp
+      } else {
+        return [{
+          parameter: '',
+          value: ''
+        }]
+      }
+    },
+  }
+}
+</script>
+
+<style type="text/scss" scoped>
+
+  .inner-toolbar {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: nowrap;
+    width: 100%;
+    justify-content: space-between;
+    align-items: center;
+  }
+  /deep/ .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+
+  /deep/ .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+
+  /deep/ .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    text-align: center;
+  }
+
+  /deep/ .avatar {
+    width: 100px;
+    height: 100px;
+    display: block;
+  }
+</style>

+ 1 - 1
src/views/ncs-device/components/deviceManager.vue

@@ -854,7 +854,7 @@
             },
             },
             getTypeFrame(partId) {
             getTypeFrame(partId) {
                 if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
                 if (this.shop.shop_type === "0" && this.shop.parent_id === -1) {
-                    API_Frame.getAllFrames(partId).then(res => {
+                    API_Frame.getAllFrames().then(res => {
                         this.partFrames = [...res]
                         this.partFrames = [...res]
                     })
                     })
                 } else {
                 } else {

+ 3 - 3
src/views/ncs-event/index.vue

@@ -252,7 +252,7 @@ export default {
     this.rowSelection = 'multiple'
     this.rowSelection = 'multiple'
   },
   },
   mounted() {
   mounted() {
-    window.on
+    window.onresize = this.windowResize
     this.gridApi = this.gridOptions.api
     this.gridApi = this.gridOptions.api
     this.getList()
     this.getList()
   },
   },
@@ -351,7 +351,7 @@ export default {
           if (this.editflag === 0) {
           if (this.editflag === 0) {
             API_event.add(params).then(res => {
             API_event.add(params).then(res => {
               this.formshow = false
               this.formshow = false
-              this.$message.info(res)
+              this.$message.success(res)
               this.getList()
               this.getList()
               this.imageUrl = null
               this.imageUrl = null
             })
             })
@@ -359,7 +359,7 @@ export default {
             /** 修改 */
             /** 修改 */
             API_event.update(params.id, params).then(res => {
             API_event.update(params.id, params).then(res => {
               this.formshow = false
               this.formshow = false
-              this.$message.info(res)
+              this.$message.success(res)
               this.getList()
               this.getList()
               this.imageUrl = null
               this.imageUrl = null
             })
             })

+ 2 - 2
src/views/nfc-interaction/index.vue

@@ -6,11 +6,11 @@
         <nfc-calender/>
         <nfc-calender/>
       </el-tab-pane>
       </el-tab-pane>
 
 
-      <el-tab-pane label="小组件统计" name="nfcInteraction">
+      <el-tab-pane :label="this.$t('functions.nfcInteraction')" name="nfcInteraction">
         <nfc-interaction/>
         <nfc-interaction/>
       </el-tab-pane>
       </el-tab-pane>
 
 
-      <el-tab-pane label="定位轨迹" name="nfcPosition">
+      <el-tab-pane :label="this.$t('functions.nfcPosition')" name="nfcPosition">
         <nfc-position/>
         <nfc-position/>
       </el-tab-pane>
       </el-tab-pane>
     </el-tabs>
     </el-tabs>

+ 2 - 1
src/views/nfc-interaction/nfcCalender.vue

@@ -64,6 +64,7 @@ import {unixToDate} from "@/utils/Foundation";
 import * as API_Clerk from "@/api/ncs_clerk";
 import * as API_Clerk from "@/api/ncs_clerk";
 import {getClerksByShopId} from "@/api/ncs_clerk";
 import {getClerksByShopId} from "@/api/ncs_clerk";
 import log from "@/views/vital-sign/log";
 import log from "@/views/vital-sign/log";
+import {ROLE_TYPE} from "@/utils/enum/RoleTypeEnum";
 export default {
 export default {
   name: "nfc-calender",
   name: "nfc-calender",
   // clerkId: {
   // clerkId: {
@@ -124,7 +125,7 @@ export default {
     getClerkList() {
     getClerkList() {
       this.loading = true
       this.loading = true
       API_Clerk.getClerksByShopId(this.$store.getters.partId).then(res => {
       API_Clerk.getClerksByShopId(this.$store.getters.partId).then(res => {
-        this.clerkList = res
+        this.clerkList = res.filter(i => i.role_id !== ROLE_TYPE.ADMINISTRATORS && i.role_id !== ROLE_TYPE.PRINCIPAL);
         this.param.clerk_id = this.clerkList[0].clerk_id
         this.param.clerk_id = this.clerkList[0].clerk_id
         this.calendarOnClick(this.value)
         this.calendarOnClick(this.value)
         this.loading = false
         this.loading = false

+ 2 - 2
src/views/nfc-interaction/nfcInteraction.vue

@@ -52,8 +52,8 @@
         <el-row style="margin: 20px 20px 0 20px" :gutter="30">
         <el-row style="margin: 20px 20px 0 20px" :gutter="30">
           <el-col :span="12">
           <el-col :span="12">
             <el-table :data="functionTable" border stripe style="width: 100%">
             <el-table :data="functionTable" border stripe style="width: 100%">
-              <el-table-column prop="item" label="小组件"/>
-              <el-table-column prop="value" label="统计次数"/>
+              <el-table-column prop="item" :label="this.$t('action.count')"/>
+              <el-table-column prop="value" :label="this.$t('functions.function')"/>
             </el-table>
             </el-table>
           </el-col>
           </el-col>