Pārlūkot izejas kodu

Merge branch 'develop' into temporal/1.3.7-interaction-20221102

# Conflicts:
#	src/views/ncs-interaction/index.vue
vothin 2 gadi atpakaļ
vecāks
revīzija
88e0c165b4
39 mainītis faili ar 3568 papildinājumiem un 2255 dzēšanām
  1. 127 6
      languages/en.js
  2. 129 7
      languages/es.js
  3. 1093 0
      languages/ru-RU.js
  4. 145 23
      languages/zh-CN.js
  5. 91 0
      src/api/ncs_his.js
  6. 20 0
      src/api/ncs_relative.js
  7. BIN
      src/assets/avatar.png
  8. 9 2
      src/layout/components/Navbar.vue
  9. 48 15
      src/router/index.js
  10. 15 1
      src/settings.js
  11. 244 242
      src/utils/AgGridVueLocaleCn.js
  12. 5 4
      src/utils/enum/DeviceTypeEnum.js
  13. 47 0
      src/utils/enum/ErrorEnum.js
  14. 3 1
      src/utils/i18n.js
  15. 10 1
      src/utils/request.js
  16. 48 28
      src/views/customer/components/customerManager.vue
  17. 19 19
      src/views/customer/components/elderlyCareManager.vue
  18. 22 23
      src/views/customer/components/patientManager.vue
  19. 0 612
      src/views/customer/customerEdit.vue
  20. 1 0
      src/views/customer/customerManagement.vue
  21. 0 284
      src/views/customer/customer_relative.vue
  22. 1 0
      src/views/customer/elderlyCareManagement.vue
  23. 0 474
      src/views/customer/list.vue
  24. 1 0
      src/views/customer/patientManagement.vue
  25. 0 460
      src/views/hospitalFrame/hospitalFrame.vue
  26. 14 14
      src/views/login/index.vue
  27. 9 4
      src/views/ncs-chars/index.vue
  28. 3 3
      src/views/ncs-chars/info.vue
  29. 24 1
      src/views/ncs-clerk/components/clerkList.vue
  30. 2 1
      src/views/ncs-device/components/deviceManager.vue
  31. 283 0
      src/views/ncs-his/his-clerk/hisClerkManager.vue
  32. 306 0
      src/views/ncs-his/his-nurse-config/hisNurseConfigManager.vue
  33. 272 0
      src/views/ncs-his/his-part/hisPartManager.vue
  34. 495 0
      src/views/ncs-his/his-patient/hisPatientManage.vue
  35. 48 0
      src/views/ncs-his/hisManagement.vue
  36. 14 10
      src/views/ncs-interaction/index.vue
  37. 15 15
      src/views/ncs-orginazition/components/partInfoEdit.vue
  38. 1 1
      src/views/ncs-orginazition/index.vue
  39. 4 4
      src/views/ncs-remark/index.vue

+ 127 - 6
languages/en.js

@@ -1,12 +1,14 @@
 module.exports = {
   action: {
-    wdklCallingSystem: 'Wreadycare Calling System',
+    wdklCallingSystem: 'System Configuration',
     home: 'Home',
     add: 'Add',
     edit: 'Edit',
     more: 'More',
     delete: 'Delete',
     login: 'Login',
+    usernameMsg: 'Username',
+    passwordMsg: 'Password',
     loginError: 'Your login status has expired, please login again!',
     permissionError: 'Permission Error',
     logout: 'Log out',
@@ -85,9 +87,57 @@ module.exports = {
     times: 'Times',
     choice: 'Please choose',
     choiceAll: 'Select all',
+    choiceAllSearchResults: '(choose all search results)',
+    searchOoo: 'Search...',
+    blanks: '(space)',
+    noMatches: 'No matching results',
+    filterOoo: 'Filter value...',
+    equals: 'equal to',
+    notEqual: 'not equal to',
+    empty: 'Please select a record',
+    lessThan: 'less than',
+    greaterThan: 'greater than',
+    lessThanOrEqual: 'less than or equal to',
+    greaterThanOrEqual: 'greater than or equal to',
+    inRange: 'Range',
+    inRangeStart: 'to',
+    inRangeEnd: 'from',
+    contains: 'contains',
+    notContains: 'does not contain',
+    startsWith: 'starts with',
+    endsWith: 'ends with',
+    andCondition: 'and',
+    orCondition: 'or',
+    applyFilter: 'Apply',
+    resetFilter: 'reset',
+    clearFilter: 'Clear',
+    cancelFilter: 'Cancel',
+    textFilter: 'text filter',
+    numberFilter: 'number filter',
+    dateFilter: 'date filter',
+    setFilter: 'list filter',
+    columns: 'columns',
+    filters: 'filter',
+    loadingOoo: 'Loading...',
+    noRowsToShow: 'No data to show',
+    enabled: 'open',
+    pinColumn: 'fixed column',
+    pinLeft: 'Fixed to the left',
+    pinRight: 'Fixed to the right',
+    noPin: 'not fixed',
+    autosizeThiscolumn: 'Automatically scale this column',
+    autosizeAllColumns: 'Automatically scale all columns',
+    groupBy: 'group',
+    resetColumns: 'Reset column settings',
+    expandAll: 'Expand all',
+    collapseAll: 'Collapse all',
+    copy: 'Copy',
+    copyWithHeaders: 'Copy with headers',
+    paste: 'paste',
     colour: 'Colour',
     searchDateRange: 'Search time period',
-    to: 'to',
+    to: ' to ',
+    of: ' of ',
     index: 'Serial number',
     null: 'None',
     all: 'All',
@@ -150,7 +200,12 @@ module.exports = {
     excelUpload: 'Upload an excel sheet',
     play: 'Play',
     pause: 'Pause',
-    noFile: 'File does not exist, cannot be played'
+    noFile: 'File does not exist, cannot be played',
+    inputMsg: 'Please enter the content!',
+    year: 'year',
+    month: 'month',
+    day: 'day',
+    timeMsg: 'Please select a time range!'
   },
   member: {
     face: 'Avatar',
@@ -443,7 +498,10 @@ module.exports = {
     customerStatus: 'Current status',
     customerStatusTrue: 'Checking in',
     customerStatusFalse: 'Left',
-    footprint: 'Footprint'
+    footprint: 'Footprint',
+    babyName: 'Child name',
+    babySex: 'Child gender',
+    babyBirthday: 'Child\'s birthday'
   },
   vital: {
     customerVital: 'User Log',
@@ -523,6 +581,7 @@ module.exports = {
     actionTime: 'Number of interactions',
     actionTime2: 'Number of calls',
     success: 'Success',
+    excelFileMsg: 'Excel file will be exported. Continue?',
     successInteraction: 'Response to interaction',
     successInteraction2: 'The call has been connected',
     unSuccessInteraction: 'Unfinished interaction',
@@ -557,7 +616,9 @@ module.exports = {
     MaxNum2: 'Maximum on time',
     SumNum: 'Total call time',
     total: 'Total',
-    recordPlay: 'Play the audio recording'
+    recordPlay: 'Play the audio recording',
+    eventStatistics: 'Event Statistics',
+    statisticalTable: 'Statistical table'
   },
   frameGroup: {
     frameGroupAdd: 'New area',
@@ -847,6 +908,24 @@ module.exports = {
     roleEdit: 'Edit role event',
     onChoiceRole: 'No role has been selected!'
   },
+  his: {
+    hisPart: 'Department Query',
+    hisPartKeyval: 'Department His PK',
+    hisPartName: 'Department name',
+    summary: 'Department Profile',
+    tel: 'Department telephone',
+    hisError: 'His error',
+    hisPatient: 'Patient',
+    hisPatientKeyval: 'Patient His primary key',
+    hisPatientInfo: 'Query information',
+    hisClerk: 'Working personnel',
+    hisClerkKeyval: 'Staff his PK',
+    hisDockerKeyval: 'Responsible doctor his PK',
+    hisNurseKeyval: 'Responsible nurse his PK',
+    passNo: 'Entrance guard card',
+    hisNurseConfig: 'Nursing items',
+    hisNurseOptionsKeyval: 'Nursing item classification his PK'
+  },
   tab: {
     home: 'Home',
     frameManage: 'Space position',
@@ -871,6 +950,7 @@ module.exports = {
     nurseConfig: 'Nursing parameters',
     boardManage: 'Information board settings',
     eventManage: 'Button event management',
+    hisManage: 'His query',
     interactionChars: 'Interaction statistics',
     partSetting: 'Organization settings',
     allClerk: 'All employees',
@@ -948,7 +1028,7 @@ module.exports = {
     DEVICE: 'Device',
     DATA: 'Data',
     EVENT: 'Event',
-    SIDE: 'Outside Information',
+    SIDE: 'nursing',
     BROADCAST: 'Broadcast',
     TIME: 'Time',
     ENTRACEGUARD: 'Access Control',
@@ -992,5 +1072,46 @@ module.exports = {
     Times: 'Times',
     ChooseDate: 'Choose Date',
     SleepData: 'Sleep Data'
+  },
+  errorType: {
+    REFRESH_TOKEN_FAILED: 'The current refresh token has expired',
+    TOKEN_FAILED: 'The current token has expired',
+    USER_NULL: 'The account does not exist!',
+    USER_DISABLE: 'The current account has been disabled. Please contact the administrator',
+    PASSWORD_ERROR: 'Account password error!',
+    LOGIN_FAILED: 'Your current identity is not allowed to log in to the system!',
+    LOGOUT: 'El usuario ha dejado de iniciar sesión',
+    MEMBER_NULL: 'The current user does not exist!',
+    MEMBER_ADD_FAILED: 'Failed to add member, non-existent user ID',
+    MEMBER_FAILED: 'User ID error, non-existent user',
+    MOBILE_OCCUPY: 'This mobile number has been occupied',
+    MEMBER_NAME_OCCUPY: 'The current user has already registered',
+    CHANNEL_FAILED: 'Channel Id error, non-existent channel',
+    CHANNEL_SUBSCRIBE_MEMBER_NULL: 'Cannot subscribe to non-existent users',
+    CHANNEL_MEMBER_FAILED: 'Users that do not exist cannot subscribe. Users do not belong to any organization and cannot subscribe',
+    CHANNEL_NULL: 'Cannot subscribe to non-existent channel',
+    FRAME_HOSPITAL_NULL: 'The hospital structure does not exist',
+    FRAME_PART_NULL: 'The department level node does not exist, and the parameter is invalid!',
+    FRAME_ADD_FAILED: 'The department level node does not exist, and the parameter is invalid! The ending room number is less than the starting room number, and the parameter is invalid!',
+    CUSTOMER_INFO_NULL: 'Patient information does not exist',
+    CLOUD_ADDRESS_NULL: 'Cloud path is not set',
+    CLOUD_SAVE_FAILED: 'Failed to save cloud',
+    SHOP_NULL: 'Organization does not exist!',
+    SHOP_DAYTIME_ERROR: 'The format of daytime start time is incorrect, please select again!',
+    SHOP_NIGHTTIME_ERROR: 'The format of night start time is incorrect, please select again!',
+    ADMIN_PASSWORD_ERROR: 'The administrator account has been saved, but the password does not match! Please use another account or enter the correct password.',
+    DEVICE_MAC_REPEAT: 'Duplicate device MAC address',
+    DEVICE_ADD_FAILED: 'There are already emergency buttons in the current space, unable to register multiple emergency buttons',
+    DEVICE_FRAME_FAILED: 'Equipment type and space structure type do not match!',
+    DATA_NULL: 'No data found',
+    PARAM_ERROR: 'Parameter error!',
+    PRIMARY_KEY_NULL: 'Parameter error, department PK value is null!',
+    ROLE_NULL: 'This role does not exist',
+    ROLE_NAME_OCCUPY: 'Duplicate role name',
+    ROLE_DELETE_FAILED: 'This role is in use and cannot be deleted!',
+    LICENSE_ERROR: 'The authorization serial number is wrong, please contact after-sales service',
+    LICENSE_EXPIRE: 'The authorization expires, please contact after-sales service',
+    LICENSE_FAILED: 'Invalid authorization, please contact after-sales service',
+    FILE_UPLOAD_FAILED: 'No file storage directory configured!'
   }
 }

+ 129 - 7
languages/es.js

@@ -1,12 +1,14 @@
 module.exports = {
   action: {
-    wdklCallingSystem: 'Sistema de llamadas Wreadycare',
+    wdklCallingSystem: 'Configuración del sistema',
     home: 'Hogar',
     add: 'Agregar',
     edit: 'Editar',
     more: 'mas',
     delete: 'Eliminar',
     login: 'Iniciar sesión',
+    usernameMsg: 'Nombre de usuario',
+    passwordMsg: 'Palabras clave',
     loginError: 'Su estado de inicio de sesión ha caducado, ¡inicie sesión de nuevo!',
     permissionError: 'Error de permiso',
     logout: 'Cerrar sesión',
@@ -85,9 +87,57 @@ module.exports = {
     times: 'Tiempos',
     choice: 'Por favor elija',
     choiceAll: 'Todos',
+    choiceAllSearchResults: '(elegir todos los resultados de búsqueda)',
+    searchOoo: 'Buscar...',
+    blanks: '(espacio)',
+    noMatches: 'No hay resultados coincidentes',
+    filterOoo: 'Valor de filtro...',
+    equals: 'igual a',
+    notEqual: 'no igual a',
+    empty: 'Seleccione un registro',
+    lessThan: 'menos que',
+    greaterThan: 'mayor que',
+    lessThanOrEqual: 'menor que o igual a',
+    greatThanOrEqual: 'mayor que o igual a',
+    inRange: 'Rango',
+    inRangeStart: 'a',
+    inRangeEnd: 'desde',
+    contains: 'contiene',
+    notContains: 'no contiene',
+    startsWith: 'comienza con',
+    endsWith: 'termina con',
+    andCondition: 'y',
+    orCondition: 'o',
+    applyFilter: 'Aplicar',
+    resetFilter: 'restablecer',
+    clearFilter: 'Borrar',
+    cancelarFiltro: 'Cancelar',
+    textFilter: 'filtro de texto',
+    numberFilter: 'filtro de números',
+    dateFilter: 'filtro de fecha',
+    setFilter: 'filtro de lista',
+    columnas: 'columnas',
+    filters: 'filtro',
+    loadingOoo: 'Cargando...',
+    noRowsToShow: 'No hay datos para mostrar',
+    enabled: 'abierto',
+    pinColumn: 'columna fija',
+    pinLeft: 'Fijo a la izquierda',
+    pinRight: 'Fijo a la derecha',
+    noPin: 'no fijo',
+    autosizeThiscolumn: 'Escalar automáticamente esta columna',
+    autosizeAllColumns: 'Escalar automáticamente todas las columnas',
+    groupBy: 'grupo',
+    resetColumns: 'Restablecer configuración de columna',
+    expandAll: 'Expandir todo',
+    colapsarTodo: 'Contraer todo',
+    copy: 'Copiar',
+    copyWithHeaders: 'Copiar con encabezados',
+    paste: 'pegar',
     colour: 'Color',
     searchDateRange: 'Período de tiempo de búsqueda',
-    to: 'Para',
+    to: ' Para ',
+    of: ' De ',
     index: 'Número de serie',
     null: 'Ninguno',
     all: 'todo',
@@ -150,7 +200,12 @@ module.exports = {
     excelUpload: 'Cargar una hoja de Excel',
     play: 'Jugar',
     pause: 'Pausa',
-    noFile: 'El archivo no existe, no se puede reproducir'
+    noFile: 'El archivo no existe, no se puede reproducir',
+    inputMsg: '¡Por favor, introduzca el contenido!',
+    year: 'Año',
+    month: 'Mes',
+    day: 'Día',
+    timeMsg: '¡Por favor, seleccione el rango de tiempo!'
   },
   member: {
     face: 'Avatar',
@@ -443,7 +498,10 @@ module.exports = {
     customerStatus: 'Estado actual',
     customerStatusTrue: 'Registrándose',
     customerStatusFalse: 'Izquierda',
-    footprint: 'Huella'
+    footprint: 'Huella',
+    babyName: 'Nombre del niño',
+    babySex: 'Sexo del niño',
+    babyBirthday: 'Cumpleaños del niño'
   },
   vital: {
     customerVital: 'Registro de usuario',
@@ -523,6 +581,7 @@ module.exports = {
     actionTime: 'Número de interacciones',
     actionTime2: 'Número de llamadas',
     success: 'Éxito',
+    excelFileMsg: '¿El archivo excel se exportará, desea continuar?',
     SuccessInteraction: 'Respuesta a la interacción',
     SuccessInteraction2: 'La llamada ha sido conectada',
     unSuccessInteraction: 'Interacción sin terminar',
@@ -534,6 +593,7 @@ module.exports = {
     notOperated: 'No responde',
     data: 'Datos de interacción',
     createDate: 'Tiempo de interacción',
+    responseTime: 'Response time',
     fromDevice: 'Dispositivo de inicio',
     toDevice: 'Dispositivo de recepción',
     interactRecord: 'Registro de interacción',
@@ -556,7 +616,9 @@ module.exports = {
     MaxNum2: 'Tiempo máximo',
     SumNum: 'Tiempo total de llamada',
     total: 'Total',
-    recordPlay: 'Reproducir la grabación de audio'
+    recordPlay: 'Reproducir la grabación de audio',
+    eventStatistics: 'Tabla estadística de eventos',
+    statisticalTable: 'Cuadro estadístico'
   },
   frameGroup: {
     frameGroupAdd: 'Nueva área',
@@ -846,6 +908,24 @@ module.exports = {
     roleEdit: 'Editar evento de rol',
     onChoiceRole: '¡No se ha seleccionado ningún rol!'
   },
+  his: {
+    hisPart: 'Consulta de sección',
+    hisPartKeyval: 'Su clave principal',
+    hisPartName: 'Nombre de la sección',
+    summary: 'Introducción a la sección',
+    tel: 'Teléfono de la sección',
+    hisError: 'Su error',
+    hisPatient: 'Paciente',
+    hisPatientKeyval: 'Su llave maestra',
+    hisPatientInfo: 'Información de consulta',
+    hisClerk: 'Personal',
+    hisClerkKeyval: 'Su clave principal para el personal',
+    hisDockerKeyval: 'Su llave maestra',
+    hisNurseKeyval: 'Enfermera responsable su clave principal',
+    passNo: 'Tarjeta de acceso',
+    hisNurseConfig: 'Artículos de enfermería',
+    hisNurseOptionsKeyval: 'Clasificación de elementos de enfermería su clave principal'
+  },
   tab: {
     home: 'Hogar',
     frameManage: 'Posición espacial',
@@ -870,6 +950,7 @@ module.exports = {
     nurseConfig: 'Gestión de enfermería',
     boardManage: 'Paneles informativos',
     eventManage: 'Botón de gestión de eventos',
+    hisManage: 'Su consulta',
     interactionChars: 'Interacción Estadísticas',
     partSetting: 'Organización construir',
     allClerk: 'Todos los empleados',
@@ -936,7 +1017,7 @@ module.exports = {
     EPIDEMIC_PATTERN: 'Modo de prevención de epidemias',
     CARING_PATTERN: 'Modo de cuidado de ancianos'
   },
-  TcpType: {
+  tcpType: {
     CALLCACK: 'Comentarios de TCP',
     VOICE: 'Voz',
     VIDEO: 'Vídeo',
@@ -946,7 +1027,7 @@ module.exports = {
     DEVICE: 'Dispositivo',
     DATA: 'Datos',
     EVENT: 'Evento',
-    SIDE: 'Información Externa',
+    SIDE: 'Enfermería',
     BROADCAST: 'Transmisión',
     TIME: 'tiempo',
     ENTRACEGUARD: 'Control de Acceso',
@@ -990,5 +1071,46 @@ module.exports = {
     Times: 'veces',
     ChooseDate: 'fecha',
     SleepData: 'Datos de sueño'
+  },
+  errorType: {
+    REFRESH_TOKEN_FAILED: 'El token de actualización actual ha expirado',
+    TOKEN_FAILED: 'El Token actual ha caducado',
+    USER_NULL: '¡La cuenta no existe!',
+    USER_DISABLE: 'La cuenta actual está desactivada. Póngase en contacto con su administrador',
+    PASSWORD_ERROR: '¡Contraseña de cuenta incorrecta!',
+    LOGIN_FAILED: '¡Su identidad actual no permite iniciar sesión en el sistema!',
+    LOGOUT: 'El usuario ha dejado de iniciar sesión',
+    MEMBER_NULL: '¡El usuario actual no existe!',
+    MEMBER_ADD_FAILED: 'Fallo al añadir miembros, ID de usuario inexistente',
+    MEMBER_FAILED: 'Error de identificación del usuario, usuario inexistente',
+    MOBILE_OCCUPY: 'El número de teléfono está ocupado.',
+    MEMBER_NAME_OCCUPY: 'El usuario actual ya está registrado',
+    CHANNEL_FAILED: 'Error de identificación del Canal, canal inexistente',
+    CHANNEL_SUBSCRIBE_MEMBER_NULL: 'Usuario inexistente, no se puede suscribir',
+    CHANNEL_MEMBER_FAILED: 'Usuario inexistente, no se puede suscribir a un usuario que no pertenece a ninguna organización, no se puede suscribir',
+    CHANNEL_NULL: 'Canal inexistente, no se puede suscribir',
+    FRAME_HOSPITAL_NULL: 'Estructura hospitalaria inexistente',
+    FRAME_PART_NULL: '¡El nodo departamental no existe, el parámetro no es válido!',
+    FRAME_ADD_FAILED: '¡El nodo departamental no existe, el parámetro no es válido! ¡El número de habitación final es menor que el número de habitación inicial, el parámetro no es válido!',
+    CUSTOMER_INFO_NULL: 'La información del paciente no existe',
+    CLOUD_ADDRESS_NULL: 'Ruta de la nube no establecida',
+    CLOUD_SAVE_FAILED: 'Fallo al guardar la nube',
+    SHOP_NULL: '¡Organización inexistente!',
+    SHOP_DAYTIME_ERROR: '¡El formato de la hora de inicio del día no es correcto, por favor vuelva a seleccionar!',
+    SHOP_NIGHTTIME_ERROR: '¡La hora de inicio de la noche no está formateada correctamente, por favor seleccione de nuevo!',
+    ADMIN_PASSWORD_ERROR: '¡La cuenta del Administrador ha sido guardada, pero la contraseña no coincide! Por favor, use otra cuenta o introduzca la contraseña correcta.',
+    DEVICE_MAC_REPEAT: 'Dirección MAC duplicada del dispositivo',
+    DEVICE_ADD_FAILED: 'El botón de emergencia ya existe en el espacio actual y no se pueden registrar varios botones de emergencia',
+    DEVICE_FRAME_FAILED: '¡El tipo de dispositivo y el tipo de estructura espacial no coinciden!',
+    DATA_NULL: 'No se encontraron datos',
+    PARAM_ERROR: '¡Error de argumento!',
+    PRIMARY_KEY_NULL: '¡Error de parámetro, el valor de la clave principal de la Sección está vacío!',
+    ROLE_NULL: 'Este papel no existe',
+    ROLE_NAME_OCCUPY: 'Duplicar el nombre del papel',
+    ROLE_DELETE_FAILED: '¡Este papel está en uso, no se puede borrar!',
+    LICENSE_ERROR: 'Número de serie de autorización incorrecto, por favor póngase en contacto con post - venta',
+    LICENSE_EXPIRE: 'La autorización expira, por favor póngase en contacto con post - venta',
+    LICENSE_FAILED: 'Autorización inválida, por favor póngase en contacto con post - venta',
+    FILE_UPLOAD_FAILED: '¡Directorio de almacenamiento de archivos no configurado!'
   }
 }

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1093 - 0
languages/ru-RU.js


+ 145 - 23
languages/zh-CN.js

@@ -1,12 +1,14 @@
 module.exports = {
   action: {
-    wdklCallingSystem: '维鼎康联呼叫系统配置中心',
+    wdklCallingSystem: '呼叫系统配置中心',
     home: '首页',
     add: '新增',
     edit: '编辑',
     more: '更多',
     delete: '删除',
     login: '登录',
+    usernameMsg: 'Username',
+    passwordMsg: 'Password',
     loginError: '您的登录状态已失效,请重新登录!',
     permissionError: '权限错误',
     logout: '退出登录',
@@ -60,7 +62,7 @@ module.exports = {
     SynchronizeHISInformation: '同步HIS信息',
     perpetualLicence: '永久授权',
     licenseValidity: '授权有效期至: ',
-    licenseRemainsValid: '授权剩余有效期',
+    licenseRemainsValid: '授权剩余有效期: ',
     getLicense: '天,请联系售后获得授权',
     name: '名称',
     fullName: '全称',
@@ -85,9 +87,57 @@ module.exports = {
     times: '次',
     choice: '请选择',
     choiceAll: '全选',
+    choiceAllSearchResults: ':  选择所有搜索结果',
+    searchOoo: '搜索...',
+    blanks: ':  空格',
+    noMatches: '无匹配结果',
+    filterOoo: '筛选值...',
+    equals: '等于',
+    notEqual: '不等于',
+    empty: '请选择一条记录',
+    lessThan: '小于',
+    greaterThan: '大于',
+    lessThanOrEqual: '小于等于',
+    greaterThanOrEqual: '大于等于',
+    inRange: '范围',
+    inRangeStart: '至',
+    inRangeEnd: '从',
+    contains: '包含',
+    notContains: '不包含',
+    startsWith: '开始于',
+    endsWith: '结束于',
+    andCondition: '且',
+    orCondition: '或',
+    applyFilter: '应用',
+    resetFilter: '重置',
+    clearFilter: '清除',
+    cancelFilter: '取消',
+    textFilter: '文本筛选',
+    numberFilter: '数字筛选',
+    dateFilter: '日期筛选',
+    setFilter: '列表筛选',
+    columns: '列',
+    filters: '筛选器',
+    loadingOoo: '加载中...',
+    noRowsToShow: '无数据显示',
+    enabled: '开启',
+    pinColumn: '固定列',
+    pinLeft: '固定到左边',
+    pinRight: '固定到右边',
+    noPin: '不固定',
+    autosizeThiscolumn: '自动缩放此列',
+    autosizeAllColumns: '自动缩放所有列',
+    groupBy: '分组',
+    resetColumns: '重置列设置',
+    expandAll: '展开所有',
+    collapseAll: '收缩所有',
+    copy: '复制',
+    copyWithHeaders: '连同表头复制',
+    paste: '粘贴',
     colour: '颜色',
     searchDateRange: '搜索时间段',
     to: '至',
+    of: '的',
     index: '序号',
     null: '无',
     all: '全部',
@@ -104,7 +154,7 @@ module.exports = {
     lastWeek: '最近一周',
     lastMonth: '最近一个月',
     lastThreeMonths: '最近三个月',
-    getMsg: '收到消息',
+    getMsg: '收到消息: ',
     sureInitialize: '您确定要初始化吗?',
     dateNull: '暂无数据',
     content: '内容',
@@ -115,8 +165,8 @@ module.exports = {
     uploaderImg2: '上传头像图片只能是 JPG、PNG、GIF 格式!',
     uploaderSize: '上传附件大小不能超过 5MB!',
     uploaderSize2: '上传头像图片大小不能超过 2MB!',
-    uploaderImgMsg: '图片宽度必须在100~500之间,宽高比为11!',
-    uploaderImgMsg2: '请上传宽高比为11的图片',
+    uploaderImgMsg: '图片宽度必须在100~500之间,宽高比为1: 1!',
+    uploaderImgMsg2: '请上传宽高比为1: 1的图片',
     uploaderImgMsg3: '图片高度必须在100~500之间!',
     uploadFile: '上传文件',
     uploadAPK: 'APK/IMG文件上传',
@@ -150,14 +200,19 @@ module.exports = {
     excelUpload: '上传excel表',
     play: '播放',
     pause: '暂停',
-    noFile: '文件不存在,无法播放'
+    noFile: '文件不存在,无法播放',
+    inputMsg: '请输入内容!',
+    year: '年',
+    month: '月',
+    day: '日',
+    timeMsg: '请选择时间范围!'
   },
   member: {
     face: '头像',
     faceImg: '上传头像图片只能是 JPG、PNG、GIF 格式!',
     faceSize: '上传头像图片大小不能超过 2MB!',
-    faceError1: '图片宽度必须在100~500之间,宽高比为11!',
-    faceError2: '请上传宽高比为11的图片',
+    faceError1: '图片宽度必须在100~500之间,宽高比为1: 1!',
+    faceError2: '请上传宽高比为1: 1的图片',
     faceError3: '图片高度必须在100~500之间!',
     uname: '登录名',
     inputUname: '请输入用户名',
@@ -417,14 +472,14 @@ module.exports = {
     customerRelativeTrueName: '亲属姓名',
     inputCustomerRelativeTrueName: '请输入亲属姓名',
     relativeName: '关系',
-    inputRelativeName: '请输入亲属关系 如朋友',
+    inputRelativeName: '请输入亲属关系 如: 朋友',
     choiceRelativeName: '请选择亲属关系',
     vital: '体征',
     remark: '备注',
-    remarks: '备注内容',
+    remarks: '备注内容: ',
     inputRemarks: '请输入备注内容',
-    remarkTime: '时间',
-    remarkName: '备注人',
+    remarkTime: '时间: ',
+    remarkName: '备注人: ',
     addRemark: '添加备注',
     outBed: '退床',
     outBed2: '注销登记',
@@ -438,12 +493,15 @@ module.exports = {
     oldBed: '当前床位',
     newBed: '换到床位',
     choiceNewBed: '请选择床位',
-    getEmptyBed: '获取空床位',
+    getEmptyBed: '获取空床位: ',
     message: '的信息',
     customerStatus: '当前状态',
     customerStatusTrue: '入住中',
     customerStatusFalse: '已离开',
-    footprint: '足迹'
+    footprint: '足迹',
+    babyName: '孩子姓名',
+    babySex: '孩子性别',
+    babyBirthday: '孩子生日'
   },
   vital: {
     customerVital: '用户体征日志',
@@ -490,9 +548,9 @@ module.exports = {
   },
   remark: {
     remarkAdd: '新建便签',
-    remarkContent: '便签内容',
-    remarkCreateTime: '创建时间',
-    remarkCreateName: '创建人'
+    remarkContent: '便签内容: ',
+    remarkCreateTime: '创建时间: ',
+    remarkCreateName: '创建人: '
   },
   task: {
     all: '全部',
@@ -505,7 +563,7 @@ module.exports = {
     failed: '失败',
     noticeAndTask: '通知/任务',
     taskPlanTime: '计划任务执行时间',
-    taskPlanTime2: '计划执行时间',
+    taskPlanTime2: '计划执行时间: ',
     taskToTime: '实际任务执行时间',
     taskToName: '任务操作人',
     doTask: '操作任务',
@@ -523,6 +581,7 @@ module.exports = {
     actionTime: '交互次数',
     actionTime2: '通话次数',
     success: '成功',
+    excelFileMsg: '将导出Excel文件,是否继续?',
     successInteraction: '已响应交互',
     successInteraction2: '已接通通话',
     unSuccessInteraction: '未完成交互',
@@ -542,7 +601,7 @@ module.exports = {
     all: '全部',
     customerAndClerk: '客户与员工',
     clerkAndClerk: '同事与同事',
-    selectData: '查询周期',
+    selectData: '查询周期: ',
     customerCensus: '用户交互统计',
     clerkCensus: '员工交互统计',
     dataCensus: '时间段交互统计',
@@ -557,7 +616,9 @@ module.exports = {
     MaxNum2: '最大接通时间',
     SumNum: '总通话时间',
     total: '总量',
-    recordPlay: '播放录音录像'
+    recordPlay: '播放录音录像',
+    eventStatistics: '事件统计表',
+    statisticalTable: '统计表'
   },
   frameGroup: {
     frameGroupAdd: '新建区域',
@@ -606,7 +667,7 @@ module.exports = {
     broadcastInfo: '广播信息',
     broadcastFile: '广播文件',
     broadcastLoadFailed: '加载广播插件失败',
-    broadPlugInError: '广播插件错误'
+    broadPlugInError: '广播插件错误: '
   },
   event: {
     eventEdit: '编辑按钮事件',
@@ -847,6 +908,24 @@ module.exports = {
     roleEdit: '编辑角色事件',
     onChoiceRole: '没有选中任何角色!'
   },
+  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: {
     home: '首页',
     frameManage: '空间位置',
@@ -871,6 +950,7 @@ module.exports = {
     nurseConfig: '护理参数',
     boardManage: '看板设置',
     eventManage: '按钮事件管理',
+    hisManage: 'his查询',
     interactionChars: '交互统计',
     partSetting: '机构设置',
     allClerk: '所有员工',
@@ -923,7 +1003,8 @@ module.exports = {
     BREASTPLATE: '胸牌',
     OWON_X5_GATEWAY: 'OWONX5网关',
     FALL_DETECTION_RADAR: '防跌倒雷达',
-    HUMAN_DETECTION_RADAR: '睡眠监测雷达'
+    HUMAN_DETECTION_RADAR: '睡眠监测雷达',
+    ALARM_INFUSION: '输液报警器'
   },
   vitalSignsDeviceType: {
     BLOOD_SUGAR: '血糖仪',
@@ -947,7 +1028,7 @@ module.exports = {
     DEVICE: '设备',
     DATA: '数据',
     EVENT: '事件',
-    SIDE: '边外信息',
+    SIDE: '护理',
     BROADCAST: '广播',
     TIME: '时间',
     ENTRACEGUARD: '门禁',
@@ -991,5 +1072,46 @@ module.exports = {
     Times: '次',
     ChooseDate: '日期',
     SleepData: '睡眠数据'
+  },
+  errorType: {
+    REFRESH_TOKEN_FAILED: '当前刷新Token已经失效',
+    TOKEN_FAILED: '当前token已经失效',
+    USER_NULL: '账号不存在!',
+    USER_DISABLE: '当前账号已经禁用,请联系管理员',
+    PASSWORD_ERROR: '账号密码错误!',
+    LOGIN_FAILED: '您的当前身份不允许登陆系统!',
+    LOGOUT: '用户已经退出登陆',
+    MEMBER_NULL: '当前用户不存在!',
+    MEMBER_ADD_FAILED: '添加成员失败,不存在的用户ID',
+    MEMBER_FAILED: '用户id错误,不存在的用户D',
+    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: '未配置文件存放目录!'
   }
 }

+ 91 - 0
src/api/ncs_his.js

@@ -0,0 +1,91 @@
+import request from '@/utils/request'
+const serverUrl = domain.serverUrl
+const url = serverUrl.substring(0, serverUrl.length - 4) + '8009'
+
+// 查询科室列表
+export function getList(params) {
+  return request({
+    url: url + '/hisquery/depart/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+// 根据主键查询科室
+export function getPartByKeyval(keyval) {
+  return request({
+    url: url + `/hisquery/depart/${keyval}`,
+    method: 'GET',
+    loading: false
+  })
+}
+
+// 查询用户列表
+export function getPatientList(params) {
+  return request({
+    url: url + '/hisquery/patient/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+// 查询工作人员列表
+export function getClerkList(params) {
+  return request({
+    url: url + '/hisquery/employee/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+// 根据主键查询工作人员
+export function getClerkByKeyval(keyval) {
+  return request({
+    url: url + `/hisquery/employee/${keyval}`,
+    method: 'GET',
+    loading: false
+  })
+}
+
+// 查询工作人员列表
+export function getNurseConfigList(params) {
+  return request({
+    url: url + '/hisquery/nursecategory/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+// 查询工作人员列表
+export function getNurseOptionsList(params) {
+  return request({
+    url: url + '/hisquery/nurseoptions/page',
+    method: 'POST',
+    loading: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+export function getNurseOptionsByPartKeyval(part_keyval) {
+  return request({
+    url: url + `/hisquery/nurse_options_list/${part_keyval}`,
+    method: 'get'
+  })
+}
+
+export function getPatientNurseMappingByPatientKeyval(patient_keyval) {
+  return request({
+    url: url + `/hisquery/patient_nurse_mapping_list/${patient_keyval}`,
+    method: 'get'
+  })
+}
+

+ 20 - 0
src/api/ncs_relative.js

@@ -0,0 +1,20 @@
+import request from '@/utils/request'
+
+export function getRelativeList(data) {
+    return request({
+        url: '/ncs/relative/page',
+        method: 'POST',
+        params: data,
+        loading: false
+    })
+}
+
+export function removeRelative(params) {
+    const ids = params.toString()
+    return request({
+        url: `/ncs/relative/${ids}`,
+        method: 'DELETE',
+        loading: false,
+        data: params
+    })
+}

BIN
src/assets/avatar.png


+ 9 - 2
src/layout/components/Navbar.vue

@@ -69,7 +69,7 @@ import ErrorLog from '@/components/ErrorLog'
 import Screenfull from '@/components/Screenfull'
 import SizeSelect from '@/components/SizeSelect'
 import Search from '@/components/HeaderSearch'
-import avator from '@/assets/avatar.jpeg'
+import avator from '@/assets/avatar.png'
 import * as API_Part from '@/api/calling-part'
 import Storage from '@/utils/storage'
 export default {
@@ -94,9 +94,14 @@ export default {
         {
           value: 'zh',
           label: '中文简体'
-        },{
+        },
+        {
           value: 'es',
           label: 'Español'
+        },
+        {
+          value: 'ru',
+          label: 'Русский'
         }
       ]
 
@@ -156,6 +161,8 @@ export default {
         this.$i18n.locale = 'en'
       } else if (value === 'es') {
         this.$i18n.locale = 'es'
+      } else if (value === 'ru') {
+        this.$i18n.locale = 'ru'
       }
       // 在选择了显示的语言后,将配置保存到缓存里
       Storage.setItem('DefaultLanguage', value)

+ 48 - 15
src/router/index.js

@@ -224,8 +224,7 @@ export const partRoutes = [
         name: 'user_watch',
         meta: { title: i18n.t('tab.userLocationManage'), icon: 'el-icon-watch', noCache: true }
       }
-    ],
-    hidden: uiVersion === 1
+    ]
   },
   {
     path: '/ncs-sos-device',
@@ -299,19 +298,19 @@ export const partRoutes = [
       }
     ]
   },
-  {
-    path: '/calling-message',
-    component: Layout,
-    redirect: '/calling-message/index',
-    children: [
-      {
-        path: 'index',
-        component: () => import('@/views/calling-message/index'),
-        name: 'CallingMessage',
-        meta: { title: '留言设置', icon: 'email', noCache: true }
-      }
-    ]
-  },
+  // {
+  //   path: '/calling-message',
+  //   component: Layout,
+  //   redirect: '/calling-message/index',
+  //   children: [
+  //     {
+  //       path: 'index',
+  //       component: () => import('@/views/calling-message/index'),
+  //       name: 'CallingMessage',
+  //       meta: { title: '留言设置', icon: 'email', noCache: true }
+  //     }
+  //   ]
+  // },
   {
     path: '',
     component: Layout,
@@ -600,6 +599,40 @@ export const adminRoutes = [
     ]
   },
   {
+    path: '/admin/ncs-his',
+    component: Layout,
+    redirect: '/ncs-his/hisManager',
+    children: [
+      {
+        path: 'index',
+        component: () => import('@/views/ncs-his/hisManagement'),
+        name: 'hisManagement',
+        meta: { title: i18n.t('tab.hisManage'), icon: 'el-icon-search', noCache: true }
+      },
+      {
+        path: 'patientManage/:keyval?',
+        component: () => import('@/views/ncs-his/his-patient/hisPatientManage'),
+        name: 'hisPatientManage',
+        meta: { title: i18n.t('his.hisPatient'), icon: 'el-icon-search', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'clerkManage/:keyval?',
+        component: () => import('@/views/ncs-his/his-clerk/hisClerkManager'),
+        name: 'hisClerkManage',
+        meta: { title: i18n.t('his.hisClerk'), icon: 'el-icon-search', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'nurseConfigManage/:keyval?',
+        component: () => import('@/views/ncs-his/his-nurse-config/hisNurseConfigManager'),
+        name: 'hisNurseConfigManage',
+        meta: { title: i18n.t('his.hisNurseConfig'), icon: 'el-icon-search', noCache: true },
+        hidden: true
+      }
+    ]
+  },
+  {
     path: '/calling-ncError',
     component: Layout,
     redirect: '/calling-ncError/index',

+ 15 - 1
src/settings.js

@@ -1,5 +1,19 @@
+const Cookies = require('js-cookie')
+
+function getTitle() {
+  let lang = Cookies.get('DefaultLanguage')
+
+  if (lang === 'zh') {
+    return '呼叫系统配置中心'
+  } else if (lang === 'en') {
+    return 'System Configuration'
+  } else {
+    return 'Configuración del sistema'
+  }
+}
+
 module.exports = {
-  title: '维鼎康联呼叫中心',
+  title: getTitle(),
 
   /**
    * @type {boolean} true | false

+ 244 - 242
src/utils/AgGridVueLocaleCn.js

@@ -1,267 +1,269 @@
+import i18n from '@/utils/i18n'
+
 export const AG_GRID_LOCALE_CN = {
-    // Set Filter
-    selectAll: '(全选)',
-    selectAllSearchResults: '(选择所有搜索结果)',
-    searchOoo: '搜索...',
-    blanks: '(空格)',
-    noMatches: '无匹配结果',
+  // Set Filter
+  selectAll: i18n.t('action.choiceAll'),
+  selectAllSearchResults: i18n.t('action.choiceAllSearchResults'),
+  searchOoo: i18n.t('action.searchOoo'),
+  blanks: i18n.t('action.blanks'),
+  noMatches: i18n.t('action.noMatches'),
 
-    // Number Filter & Text Filter
-    filterOoo: '筛选值...',
-    equals: '等于',
-    notEqual: '不等于',
-    empty: '请选择一条记录',
+  // Number Filter & Text Filter
+  filterOoo: i18n.t('action.filterOoo'),
+  equals: i18n.t('action.equals'),
+  notEqual: i18n.t('action.notEqual'),
+  empty: i18n.t('action.empty'),
 
-    // Number Filter
-    lessThan: '小于',
-    greaterThan: '大于',
-    lessThanOrEqual: '小于等于',
-    greaterThanOrEqual: '大于等于',
-    inRange: '范围',
-    inRangeStart: '至',
-    inRangeEnd: '从',
+  // Number Filter
+  lessThan: i18n.t('action.lessThan'),
+  greaterThan: i18n.t('action.greaterThan'),
+  lessThanOrEqual: i18n.t('action.lessThanOrEqual'),
+  greaterThanOrEqual: i18n.t('action.greaterThanOrEqual'),
+  inRange: i18n.t('action.inRange'),
+  inRangeStart: i18n.t('action.inRangeStart'),
+  inRangeEnd: i18n.t('action.inRangeEnd'),
 
-    // Text Filter
-    contains: '包含',
-    notContains: '不包含',
-    startsWith: '开始于',
-    endsWith: '结束于',
+  // Text Filter
+  contains: i18n.t('action.contains'),
+  notContains: i18n.t('action.notContains'),
+  startsWith: i18n.t('action.startsWith'),
+  endsWith: i18n.t('action.endsWith'),
 
-    // Date Filter
-    dateFormatOoo: 'yyyy-mm-dd',
+  // Date Filter
+  dateFormatOoo: 'yyyy-mm-dd',
 
-    // Filter Conditions
-    andCondition: '且',
-    orCondition: '或',
+  // Filter Conditions
+  andCondition: i18n.t('action.andCondition'),
+  orCondition: i18n.t('action.orCondition'),
 
-    // Filter Buttons
-    applyFilter: '应用',
-    resetFilter: '重置',
-    clearFilter: '清除',
-    cancelFilter: '取消',
+  // Filter Buttons
+  applyFilter: i18n.t('action.applyFilter'),
+  resetFilter: i18n.t('action.resetFilter'),
+  clearFilter: i18n.t('action.clearFilter'),
+  cancelFilter: i18n.t('action.cancelFilter'),
 
-    // Filter Titles
-    textFilter: '文本筛选',
-    numberFilter: '数字筛选',
-    dateFilter: '日期筛选',
-    setFilter: '列表筛选',
+  // Filter Titles
+  textFilter: i18n.t('action.textFilter'),
+  numberFilter: i18n.t('action.numberFilter'),
+  dateFilter: i18n.t('action.dateFilter'),
+  setFilter: i18n.t('action.setFilter'),
 
-    // Side Bar
-    columns: '列',
-    filters: '筛选器',
+  // Side Bar
+  columns: i18n.t('action.columns'),
+  filters: i18n.t('action.filters'),
 
-    // columns tool panel
-    pivotMode: 'Pivot Mode',
-    groups: 'Row Groups',
-    rowGroupColumnsEmptyMessage: 'Drag here to set row groups',
-    values: 'Values',
-    valueColumnsEmptyMessage: 'Drag here to aggregate',
-    pivots: 'Column Labels',
-    pivotColumnsEmptyMessage: 'Drag here to set column labels',
+  // columns tool panel
+  pivotMode: 'Pivot Mode',
+  groups: 'Row Groups',
+  rowGroupColumnsEmptyMessage: 'Drag here to set row groups',
+  values: 'Values',
+  valueColumnsEmptyMessage: 'Drag here to aggregate',
+  pivots: 'Column Labels',
+  pivotColumnsEmptyMessage: 'Drag here to set column labels',
 
-    // Header of the Default Group Column
-    group: 'Group',
+  // Header of the Default Group Column
+  group: 'Group',
 
-    // Other
-    loadingOoo: '加载中...',
-    noRowsToShow: '无数据显示',
-    enabled: '开启',
+  // Other
+  loadingOoo: i18n.t('action.loadingOoo'),
+  noRowsToShow: i18n.t('action.noRowsToShow'),
+  enabled: i18n.t('action.enabled'),
 
-    // Menu
-    pinColumn: '固定列',
-    pinLeft: '固定到左边',
-    pinRight: '固定到右边',
-    noPin: '不固定',
-    valueAggregation: 'Value Aggregation',
-    autosizeThiscolumn: '自动缩放此列',
-    autosizeAllColumns: '自动缩放所有列',
-    groupBy: '分组',
-    ungroupBy: 'Un-Group by',
-    resetColumns: '重置列设置',
-    expandAll: '展开所有',
-    collapseAll: '收缩所有',
-    copy: '复制',
-    ctrlC: 'Ctrl+C',
-    copyWithHeaders: '连同表头复制',
-    paste: '粘贴',
-    ctrlV: 'Ctrl+V',
-    export: '导出',
-    csvExport: 'CSV Export',
-    excelExport: 'Excel Export (.xlsx)',
-    excelXmlExport: 'Excel Export (.xml)',
+  // Menu
+  pinColumn: i18n.t('action.pinColumn'),
+  pinLeft: i18n.t('action.pinLeft'),
+  pinRight: i18n.t('action.pinRight'),
+  noPin: i18n.t('action.noPin'),
+  valueAggregation: 'Value Aggregation',
+  autosizeThiscolumn: i18n.t('action.autosizeThiscolumn'),
+  autosizeAllColumns: i18n.t('action.autosizeAllColumns'),
+  groupBy: i18n.t('action.groupBy'),
+  ungroupBy: 'Un-Group by',
+  resetColumns: i18n.t('action.resetColumns'),
+  expandAll: i18n.t('action.expandAll'),
+  collapseAll: i18n.t('action.collapseAll'),
+  copy: i18n.t('action.copy'),
+  ctrlC: 'Ctrl+C',
+  copyWithHeaders: i18n.t('action.copyWithHeaders'),
+  paste: i18n.t('action.paste'),
+  ctrlV: 'Ctrl+V',
+  export: i18n.t('action.export'),
+  csvExport: 'CSV Export',
+  excelExport: 'Excel Export (.xlsx)',
+  excelXmlExport: 'Excel Export (.xml)',
 
-    // Enterprise Menu Aggregation and Status Bar
-    sum: 'Sum',
-    min: 'Min',
-    max: 'Max',
-    none: 'None',
-    count: 'Count',
-    avg: 'Average',
-    filteredRows: 'Filtered',
-    selectedRows: 'Selected',
-    totalRows: 'Total Rows',
-    totalAndFilteredRows: 'Rows',
-    more: 'More',
-    to: 'to',
-    of: 'of',
-    page: 'Page',
-    nextPage: 'Next Page',
-    lastPage: 'Last Page',
-    firstPage: 'First Page',
-    previousPage: 'Previous Page',
+  // Enterprise Menu Aggregation and Status Bar
+  sum: 'Sum',
+  min: 'Min',
+  max: 'Max',
+  none: 'None',
+  count: 'Count',
+  avg: 'Average',
+  filteredRows: 'Filtered',
+  selectedRows: 'Selected',
+  totalRows: 'Total Rows',
+  totalAndFilteredRows: 'Rows',
+  more: 'More',
+  to: 'to',
+  of: 'of',
+  page: 'Page',
+  nextPage: 'Next Page',
+  lastPage: 'Last Page',
+  firstPage: 'First Page',
+  previousPage: 'Previous Page',
 
-    // Enterprise Menu (Charts)
-    pivotChartAndPivotMode: 'Pivot Chart & Pivot Mode',
-    pivotChart: 'Pivot Chart',
-    chartRange: 'Chart Range',
+  // Enterprise Menu (Charts)
+  pivotChartAndPivotMode: 'Pivot Chart & Pivot Mode',
+  pivotChart: 'Pivot Chart',
+  chartRange: 'Chart Range',
 
-    columnChart: 'Column',
-    groupedColumn: 'Grouped',
-    stackedColumn: 'Stacked',
-    normalizedColumn: '100% Stacked',
+  columnChart: 'Column',
+  groupedColumn: 'Grouped',
+  stackedColumn: 'Stacked',
+  normalizedColumn: '100% Stacked',
 
-    barChart: 'Bar',
-    groupedBar: 'Grouped',
-    stackedBar: 'Stacked',
-    normalizedBar: '100% Stacked',
+  barChart: 'Bar',
+  groupedBar: 'Grouped',
+  stackedBar: 'Stacked',
+  normalizedBar: '100% Stacked',
 
-    pieChart: 'Pie',
-    pie: 'Pie',
-    doughnut: 'Doughnut',
+  pieChart: 'Pie',
+  pie: 'Pie',
+  doughnut: 'Doughnut',
 
-    line: 'Line',
+  line: 'Line',
 
-    xyChart: 'X Y (Scatter)',
-    scatter: 'Scatter',
-    bubble: 'Bubble',
+  xyChart: 'X Y (Scatter)',
+  scatter: 'Scatter',
+  bubble: 'Bubble',
 
-    areaChart: 'Area',
-    area: 'Area',
-    stackedArea: 'Stacked',
-    normalizedArea: '100% Stacked',
+  areaChart: 'Area',
+  area: 'Area',
+  stackedArea: 'Stacked',
+  normalizedArea: '100% Stacked',
 
-    histogramChart: 'Histogram',
+  histogramChart: 'Histogram',
 
-    // Charts
-    pivotChartTitle: 'Pivot Chart',
-    rangeChartTitle: 'Range Chart',
-    settings: 'Settings',
-    data: 'Data',
-    format: 'Format',
-    categories: 'Categories',
-    defaultCategory: '(None)',
-    series: 'Series',
-    xyValues: 'X Y Values',
-    paired: 'Paired Mode',
-    axis: 'Axis',
-    navigator: 'Navigator',
-    color: 'Color',
-    thickness: 'Thickness',
-    xType: 'X Type',
-    automatic: 'Automatic',
-    category: 'Category',
-    number: 'Number',
-    time: 'Time',
-    xRotation: 'X Rotation',
-    yRotation: 'Y Rotation',
-    ticks: 'Ticks',
-    width: 'Width',
-    height: 'Height',
-    length: 'Length',
-    padding: 'Padding',
-    spacing: 'Spacing',
-    chart: 'Chart',
-    title: 'Title',
-    titlePlaceholder: 'Chart title - double click to edit',
-    background: 'Background',
-    font: 'Font',
-    top: 'Top',
-    right: 'Right',
-    bottom: 'Bottom',
-    left: 'Left',
-    labels: 'Labels',
-    size: 'Size',
-    minSize: 'Minimum Size',
-    maxSize: 'Maximum Size',
-    legend: 'Legend',
-    position: 'Position',
-    markerSize: 'Marker Size',
-    markerStroke: 'Marker Stroke',
-    markerPadding: 'Marker Padding',
-    itemSpacing: 'Item Spacing',
-    itemPaddingX: 'Item Padding X',
-    itemPaddingY: 'Item Padding Y',
-    layoutHorizontalSpacing: 'Horizontal Spacing',
-    layoutVerticalSpacing: 'Vertical Spacing',
-    strokeWidth: 'Stroke Width',
-    offset: 'Offset',
-    offsets: 'Offsets',
-    tooltips: 'Tooltips',
-    callout: 'Callout',
-    markers: 'Markers',
-    shadow: 'Shadow',
-    blur: 'Blur',
-    xOffset: 'X Offset',
-    yOffset: 'Y Offset',
-    lineWidth: 'Line Width',
-    normal: 'Normal',
-    bold: 'Bold',
-    italic: 'Italic',
-    boldItalic: 'Bold Italic',
-    predefined: 'Predefined',
-    fillOpacity: 'Fill Opacity',
-    strokeOpacity: 'Line Opacity',
-    histogramBinCount: 'Bin count',
-    columnGroup: 'Column',
-    barGroup: 'Bar',
-    pieGroup: 'Pie',
-    lineGroup: 'Line',
-    scatterGroup: 'X Y (Scatter)',
-    areaGroup: 'Area',
-    histogramGroup: 'Histogram',
-    groupedColumnTooltip: 'Grouped',
-    stackedColumnTooltip: 'Stacked',
-    normalizedColumnTooltip: '100% Stacked',
-    groupedBarTooltip: 'Grouped',
-    stackedBarTooltip: 'Stacked',
-    normalizedBarTooltip: '100% Stacked',
-    pieTooltip: 'Pie',
-    doughnutTooltip: 'Doughnut',
-    lineTooltip: 'Line',
-    groupedAreaTooltip: 'Area',
-    stackedAreaTooltip: 'Stacked',
-    normalizedAreaTooltip: '100% Stacked',
-    scatterTooltip: 'Scatter',
-    bubbleTooltip: 'Bubble',
-    histogramTooltip: 'Histogram',
-    noDataToChart: 'No data available to be charted.',
-    pivotChartRequiresPivotMode: 'Pivot Chart requires Pivot Mode enabled.',
-    chartSettingsToolbarTooltip: 'Menu',
-    chartLinkToolbarTooltip: 'Linked to Grid',
-    chartUnlinkToolbarTooltip: 'Unlinked from Grid',
-    chartDownloadToolbarTooltip: 'Download Chart',
+  // Charts
+  pivotChartTitle: 'Pivot Chart',
+  rangeChartTitle: 'Range Chart',
+  settings: 'Settings',
+  data: 'Data',
+  format: 'Format',
+  categories: 'Categories',
+  defaultCategory: '(None)',
+  series: 'Series',
+  xyValues: 'X Y Values',
+  paired: 'Paired Mode',
+  axis: 'Axis',
+  navigator: 'Navigator',
+  color: 'Color',
+  thickness: 'Thickness',
+  xType: 'X Type',
+  automatic: 'Automatic',
+  category: 'Category',
+  number: 'Number',
+  time: 'Time',
+  xRotation: 'X Rotation',
+  yRotation: 'Y Rotation',
+  ticks: 'Ticks',
+  width: 'Width',
+  height: 'Height',
+  length: 'Length',
+  padding: 'Padding',
+  spacing: 'Spacing',
+  chart: 'Chart',
+  title: 'Title',
+  titlePlaceholder: 'Chart title - double click to edit',
+  background: 'Background',
+  font: 'Font',
+  top: 'Top',
+  right: 'Right',
+  bottom: 'Bottom',
+  left: 'Left',
+  labels: 'Labels',
+  size: 'Size',
+  minSize: 'Minimum Size',
+  maxSize: 'Maximum Size',
+  legend: 'Legend',
+  position: 'Position',
+  markerSize: 'Marker Size',
+  markerStroke: 'Marker Stroke',
+  markerPadding: 'Marker Padding',
+  itemSpacing: 'Item Spacing',
+  itemPaddingX: 'Item Padding X',
+  itemPaddingY: 'Item Padding Y',
+  layoutHorizontalSpacing: 'Horizontal Spacing',
+  layoutVerticalSpacing: 'Vertical Spacing',
+  strokeWidth: 'Stroke Width',
+  offset: 'Offset',
+  offsets: 'Offsets',
+  tooltips: 'Tooltips',
+  callout: 'Callout',
+  markers: 'Markers',
+  shadow: 'Shadow',
+  blur: 'Blur',
+  xOffset: 'X Offset',
+  yOffset: 'Y Offset',
+  lineWidth: 'Line Width',
+  normal: 'Normal',
+  bold: 'Bold',
+  italic: 'Italic',
+  boldItalic: 'Bold Italic',
+  predefined: 'Predefined',
+  fillOpacity: 'Fill Opacity',
+  strokeOpacity: 'Line Opacity',
+  histogramBinCount: 'Bin count',
+  columnGroup: 'Column',
+  barGroup: 'Bar',
+  pieGroup: 'Pie',
+  lineGroup: 'Line',
+  scatterGroup: 'X Y (Scatter)',
+  areaGroup: 'Area',
+  histogramGroup: 'Histogram',
+  groupedColumnTooltip: 'Grouped',
+  stackedColumnTooltip: 'Stacked',
+  normalizedColumnTooltip: '100% Stacked',
+  groupedBarTooltip: 'Grouped',
+  stackedBarTooltip: 'Stacked',
+  normalizedBarTooltip: '100% Stacked',
+  pieTooltip: 'Pie',
+  doughnutTooltip: 'Doughnut',
+  lineTooltip: 'Line',
+  groupedAreaTooltip: 'Area',
+  stackedAreaTooltip: 'Stacked',
+  normalizedAreaTooltip: '100% Stacked',
+  scatterTooltip: 'Scatter',
+  bubbleTooltip: 'Bubble',
+  histogramTooltip: 'Histogram',
+  noDataToChart: 'No data available to be charted.',
+  pivotChartRequiresPivotMode: 'Pivot Chart requires Pivot Mode enabled.',
+  chartSettingsToolbarTooltip: 'Menu',
+  chartLinkToolbarTooltip: 'Linked to Grid',
+  chartUnlinkToolbarTooltip: 'Unlinked from Grid',
+  chartDownloadToolbarTooltip: 'Download Chart',
 
-    // ARIA
-    ariaHidden: 'hidden',
-    ariaVisible: 'visible',
-    ariaChecked: 'checked',
-    ariaUnchecked: 'unchecked',
-    ariaIndeterminate:'indeterminate',
-    ariaColumnSelectAll: 'Toggle Select All Columns',
-    ariaInputEditor: 'Input Editor',
-    ariaDateFilterInput: 'Date Filter Input',
-    ariaFilterInput: 'Filter Input',
-    ariaFilterColumnsInput: 'Filter Columns Input',
-    ariaFilterValue: 'Filter Value',
-    ariaFilterFromValue: 'Filter from value',
-    ariaFilterToValue: 'Filter to value',
-    ariaFilteringOperator: 'Filtering Operator',
-    ariaColumnToggleVisibility: 'column toggle visibility',
-    ariaColumnGroupToggleVisibility: 'column group toggle visibility',
-    ariaRowSelect: 'Press SPACE to select this row',
-    ariaRowDeselect: 'Press SPACE to deselect this row',
-    ariaRowToggleSelection: 'Press Space to toggle row selection',
-    ariaRowSelectAll: 'Press Space to toggle all rows selection',
-    ariaSearch: 'Search',
-    ariaSearchFilterValues: 'Search filter values'
+  // ARIA
+  ariaHidden: 'hidden',
+  ariaVisible: 'visible',
+  ariaChecked: 'checked',
+  ariaUnchecked: 'unchecked',
+  ariaIndeterminate: 'indeterminate',
+  ariaColumnSelectAll: 'Toggle Select All Columns',
+  ariaInputEditor: 'Input Editor',
+  ariaDateFilterInput: 'Date Filter Input',
+  ariaFilterInput: 'Filter Input',
+  ariaFilterColumnsInput: 'Filter Columns Input',
+  ariaFilterValue: 'Filter Value',
+  ariaFilterFromValue: 'Filter from value',
+  ariaFilterToValue: 'Filter to value',
+  ariaFilteringOperator: 'Filtering Operator',
+  ariaColumnToggleVisibility: 'column toggle visibility',
+  ariaColumnGroupToggleVisibility: 'column group toggle visibility',
+  ariaRowSelect: 'Press SPACE to select this row',
+  ariaRowDeselect: 'Press SPACE to deselect this row',
+  ariaRowToggleSelection: 'Press Space to toggle row selection',
+  ariaRowSelectAll: 'Press Space to toggle all rows selection',
+  ariaSearch: 'Search',
+  ariaSearchFilterValues: 'Search filter values'
 }

+ 5 - 4
src/utils/enum/DeviceTypeEnum.js

@@ -36,9 +36,10 @@ export const DEVICE_TYPE = createEnum(
     EMERGENCY_GATEWAY: [31, i18n.t('deviceType.EMERGENCY_GATEWAY')],
     ALARM_433BUTTON: [32, i18n.t('deviceType.ALARM_433BUTTON')],
     OTHER_HOST: [33, i18n.t('deviceType.OTHER_HOST')],
-      BREASTPLATE:[34, i18n.t('deviceType.BREASTPLATE')],
-    OWON_X5_GATEWAY:[35,i18n.t('deviceType.OWON_X5_GATEWAY')],
-    FALL_DETECTION_RADAR:[36,i18n.t('deviceType.FALL_DETECTION_RADAR')],
-      HUMAN_DETECTION_RADAR:[37,i18n.t('deviceType.HUMAN_DETECTION_RADAR')]
+    BREASTPLATE: [34, i18n.t('deviceType.BREASTPLATE')],
+    OWON_X5_GATEWAY: [35, i18n.t('deviceType.OWON_X5_GATEWAY')],
+    FALL_DETECTION_RADAR: [36, i18n.t('deviceType.FALL_DETECTION_RADAR')],
+    HUMAN_DETECTION_RADAR: [37, i18n.t('deviceType.HUMAN_DETECTION_RADAR')],
+    ALARM_INFUSION: [38, i18n.t('deviceType.ALARM_INFUSION')]
   }
 )

+ 47 - 0
src/utils/enum/ErrorEnum.js

@@ -0,0 +1,47 @@
+import createEnum from '@/utils/enum/createEnum'
+import i18n from '@/utils/i18n'
+
+export const ERROR_TYPE = createEnum(
+  {
+    TOKEN_FAILED: [8, i18n.t('errorType.TOKEN_FAILED')],
+    USER_NULL: [9, i18n.t('errorType.USER_NULL')],
+    USER_DISABLE: [10, i18n.t('errorType.USER_DISABLE')],
+    PASSWORD_ERROR: [11, i18n.t('errorType.PASSWORD_ERROR')],
+    LOGIN_FAILED: [12, i18n.t('errorType.LOGIN_FAILED')],
+    LOGOUT: [13, i18n.t('errorType.LOGOUT')],
+    MEMBER_NULL: [14, i18n.t('errorType.MEMBER_NULL')],
+    MEMBER_ADD_FAILED: [15, i18n.t('errorType.MEMBER_ADD_FAILED')],
+    MEMBER_FAILED: [16, i18n.t('errorType.MEMBER_FAILED')],
+    MOBILE_OCCUPY: [17, i18n.t('errorType.MOBILE_OCCUPY')],
+    MEMBER_NAME_OCCUPY: [18, i18n.t('errorType.MEMBER_NAME_OCCUPY')],
+    CHANNEL_FAILED: [19, i18n.t('errorType.CHANNEL_FAILED')],
+    CHANNEL_SUBSCRIBE_MEMBER_NULL: [20, i18n.t('errorType.CHANNEL_SUBSCRIBE_MEMBER_NULL')],
+    CHANNEL_MEMBER_FAILED: [21, i18n.t('errorType.CHANNEL_MEMBER_FAILED')],
+    CHANNEL_NULL: [22, i18n.t('errorType.CHANNEL_NULL')],
+    FRAME_HOSPITAL_NULL: [23, i18n.t('errorType.FRAME_HOSPITAL_NULL')],
+    FRAME_PART_NULL: [24, i18n.t('errorType.FRAME_PART_NULL')],
+    FRAME_ADD_FAILED: [25, i18n.t('errorType.FRAME_ADD_FAILED')],
+    CUSTOMER_INFO_NULL: [28, i18n.t('errorType.CUSTOMER_INFO_NULL')],
+    CLOUD_ADDRESS_NULL: [29, i18n.t('errorType.CLOUD_ADDRESS_NULL')],
+    CLOUD_SAVE_FAILED: [30, i18n.t('errorType.CLOUD_SAVE_FAILED')],
+    SHOP_NULL: [31, i18n.t('errorType.SHOP_NULL')],
+    SHOP_DAYTIME_ERROR: [32, i18n.t('errorType.SHOP_DAYTIME_ERROR')],
+    SHOP_NIGHTTIME_ERROR: [33, i18n.t('errorType.SHOP_NIGHTTIME_ERROR')],
+    ADMIN_PASSWORD_ERROR: [34, i18n.t('errorType.ADMIN_PASSWORD_ERROR')],
+    DEVICE_MAC_REPEAT: [35, i18n.t('errorType.DEVICE_MAC_REPEAT')],
+    DEVICE_ADD_FAILED: [36, i18n.t('errorType.DEVICE_ADD_FAILED')],
+    DEVICE_FRAME_FAILED: [37, i18n.t('errorType.DEVICE_FRAME_FAILED')],
+    DATA_NULL: [38, i18n.t('errorType.DATA_NULL')],
+    PARAM_ERROR: [39, i18n.t('errorType.PARAM_ERROR')],
+    PRIMARY_KEY_NULL: [40, i18n.t('errorType.PRIMARY_KEY_NULL')],
+    ROLE_NULL: [41, i18n.t('errorType.ROLE_NULL')],
+    ROLE_NAME_OCCUPY: [42, i18n.t('errorType.ROLE_NAME_OCCUPY')],
+    ROLE_DELETE_FAILED: [43, i18n.t('errorType.ROLE_DELETE_FAILED')],
+    LICENSE_ERROR: [44, i18n.t('errorType.LICENSE_ERROR')],
+    LICENSE_EXPIRE: [45, i18n.t('errorType.LICENSE_EXPIRE')],
+    LICENSE_FAILED: [46, i18n.t('errorType.LICENSE_FAILED')],
+    FILE_UPLOAD_FAILED: [47, i18n.t('errorType.FILE_UPLOAD_FAILED')],
+    FILE_FAILED: [48, i18n.t('errorType.FILE_FAILED')]
+  }
+)
+

+ 3 - 1
src/utils/i18n.js

@@ -2,6 +2,7 @@ import Vue from 'vue'
 import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
 import esLang from 'element-ui/lib/locale/lang/es'
 import zhLang from 'element-ui/lib/locale/lang/zh-CN'
+import ruLang from 'element-ui/lib/locale/lang/ru-RU'
 import VueI18n from 'vue-i18n'
 import locale from 'element-ui/lib/locale'
 import Storage from '@/utils/storage'
@@ -15,7 +16,8 @@ const i18n = new VueI18n({
   messages: {
     'zh': Object.assign(require('../../languages/zh-CN'), zhLang),
     'en': Object.assign(require('../../languages/en'), enLang),
-    'es': Object.assign(require('../../languages/es'), esLang)
+    'es': Object.assign(require('../../languages/es'), esLang),
+    'ru': Object.assign(require('../../languages/ru-RU'), ruLang)
   }
 })
 locale.i18n((key, value) => i18n.t(key, value))

+ 10 - 1
src/utils/request.js

@@ -8,6 +8,7 @@ import Storage from '@/utils/storage'
 import * as Foundation from '@/utils/Foundation'
 import md5 from 'js-md5'
 import checkToken from '@/utils/checkToken'
+import { ERROR_TYPE } from '@/utils/enum/ErrorEnum'
 const qs = require('qs')
 // create an axios instance
 const serverUrl = domain.serverUrl
@@ -147,7 +148,7 @@ service.interceptors.response.use(
     }
 
     Message({
-      message: error_data.message,
+      message: getErrorMgs(error_data.message),
       type: 'error',
       duration: 5 * 1000
     })
@@ -155,6 +156,14 @@ service.interceptors.response.use(
   }
 )
 
+function getErrorMgs(msg) {
+  if (ERROR_TYPE.getDesc(msg) !== undefined) {
+    return ERROR_TYPE.getDesc(msg)
+  } else {
+    return msg
+  }
+}
+
 /**
  * 关闭全局加载
  * 延迟200毫秒关闭,以免晃眼睛

+ 48 - 28
src/views/customer/components/customerManager.vue

@@ -260,16 +260,16 @@
                 style="width: 100%"
             >
               <el-table-column
-                  prop="true_name"
+                  prop="named"
                   :label="this.$t('customerManage.customerRelativeTrueName')"
                   width="180"
               />
-              <el-table-column
-                  prop="sex"
-                  :label="this.$t('member.sex')"
-                  width="180"
-                  :formatter="formatterSex"
-              />
+<!--              <el-table-column-->
+<!--                  prop="sex"-->
+<!--                  :label="this.$t('member.sex')"-->
+<!--                  width="180"-->
+<!--                  :formatter="formatterSex"-->
+<!--              />-->
               <el-table-column
                   prop="relative_name"
                   :label="this.$t('customerManage.relativeName')"
@@ -285,7 +285,7 @@
                   width="100"
               >
                 <template slot-scope="scope">
-                  <el-button type="danger" size="mini" @click="handlerDeleteRelative(scope.row.member_id)">{{ deleted }}</el-button>
+                  <el-button type="danger" size="mini" @click="handlerDeleteRelative(scope.row.id)">{{ deleted }}</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -308,13 +308,13 @@
                 </el-col>
               </el-row>
               <el-row>
-                <el-col :span="12">
-                  <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="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>-->
+<!--                    &lt;!&ndash;                    <el-radio v-model="relativeFormModel.sex" :label="2">未知</el-radio>&ndash;&gt;-->
+<!--                  </el-form-item>-->
+<!--                </el-col>-->
                 <el-col :span="12">
                   <el-form-item :label="this.$t('member.mobile')" prop="mobile">
                     <el-input v-model="relativeFormModel.mobile" clearable :placeholder="this.$t('member.inputMobile')" :maxlength="20" />
@@ -550,6 +550,7 @@ import {CHILDBIRTH_TYPE} from "@/utils/enum/ChildbirthTypeEnum";
 import * as shop_API from "@/api/ncs_shop";
 import {getDevicesByUuid} from "@/api/initialize"
 import myMapHtml from '@/views/customer/myMapHtml'
+import {getRelativeList, removeRelative} from "@/api/ncs_relative";
 const serverUrl = domain.serverUrl
 export default {
   name: 'CustomerManager',
@@ -798,17 +799,22 @@ export default {
         cellRenderer: this.sexRenderer },
       { headerName: this.$t('customerManage.age'), field: 'age', sortable: true, filter: 'agNumberColumnFilter', width: 130, valueFormatter: this.sexFormatter
       },
-      // { headerName: '生日', field: 'birthday', sortable: true, filter: 'agDateColumnFilter', width: 130, valueFormatter: this.unixDateFormatter2, filterParams: {
-      //     comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
-      //       const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
-      //       return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
-      //     }
-      //   }},
-      // { headerName: '入住编号', field: 'card_no', sortable: true, filter: 'agTextColumnFilter' },
-      // { headerName: '身份证件类型', field: 'id_type', sortable: true, filter: 'agTextColumnFilter' },
-      // { headerName: '证件', field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', valueFormatter: this.idNoFormatter },
+      { headerName: this.$t('member.birthday'), field: 'birthday', sortable: true, filter: 'agDateColumnFilter', width: 130, valueFormatter: this.unixDateFormatter2, filterParams: {
+          comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
+            const celldate = unixToDate(cellValue, 'yyyy-MM-dd 00:00:00')
+            return (new Date(celldate).getTime() / 1000) - (filterLocalDateAtMidnight.getTime() / 1000)
+          }
+        }},
+      { headerName: this.$t('customerManage.cardNo'), field: 'card_no', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('customerManage.idType'),
+        field: 'id_type',
+        sortable: true,
+        filter: 'agTextColumnFilter',
+        valueFormatter: this.idCardFormatter
+      },
+      { headerName: this.$t('customerManage.idNo'), field: 'id_no', sortable: true, filter: 'agNumberColumnFilter', valueFormatter: this.idNoFormatter },
       { headerName: this.$t('member.mobile'), field: 'mobile', sortable: true, filter: 'agTextColumnFilter' },
-      // { headerName: '家庭住址', field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260 },
+      { headerName: this.$t('member.homeAddress'), field: 'address', sortable: true, filter: 'agTextColumnFilter', width: 260 },
 
       { headerName: this.$t('customerManage.inDate'), field: 'in_date', sortable: true, filter: 'agDateColumnFilter', valueFormatter: this.formatterDate, filterParams: {
         comparator: (filterLocalDateAtMidnight, cellValue) => { // 所有数据都由服务器端过滤,此处只需返回0 即可
@@ -1092,6 +1098,20 @@ export default {
     sexFormatter(param) {
       return param.value + param.data.age_unit
     },
+    /**
+     * 身份证转换
+     */
+    idCardFormatter(param) {
+      if (param.value === '身份证') {
+        return this.$t('customerManage.idCard');
+      } else if (param.value === '护照') {
+        return this.$t('customerManage.passport');
+      } else if (param.value === '军人证') {
+        return this.$t('customerManage.servicemanCard');
+      } else {
+        return this.$t('customerManage.null');
+      }
+    },
     idNoFormatter(param) {
       if (param.value) {
         return param.data.id_type + ':' +  param.value
@@ -1431,8 +1451,8 @@ export default {
     },
     /** 拉取亲属列表 **/
     getRelatives() {
-      this.relativeParams.fixedCondition = ' relative_id=' + this.formmodel.member_id
-      API_User.getList(this.relativeParams).then(res => {
+      this.relativeParams.fixedCondition = ' member_id=' + this.formmodel.member_id
+      getRelativeList(this.relativeParams).then(res => {
         this.relativeData = res.data
       }).catch(() => {
 
@@ -1446,7 +1466,7 @@ export default {
         cancelButtonText: this.$t('action.cancel'),
         type: 'warning'
       }).then(() => {
-        API_User.remove(ids).then(
+        removeRelative(ids).then(
           response => {
             this.getRelatives()
           }

+ 19 - 19
src/views/customer/components/elderlyCareManager.vue

@@ -253,16 +253,16 @@
                                 style="width: 100%"
                         >
                             <el-table-column
-                                    prop="true_name"
+                                    prop="named"
                                     :label="this.$t('customerManage.customerRelativeTrueName')"
                                     width="180"
                             />
-                            <el-table-column
-                                    prop="sex"
-                                    :label="this.$t('member.sex')"
-                                    width="180"
-                                    :formatter="formatterSex"
-                            />
+<!--                            <el-table-column-->
+<!--                                    prop="sex"-->
+<!--                                    :label="this.$t('member.sex')"-->
+<!--                                    width="180"-->
+<!--                                    :formatter="formatterSex"-->
+<!--                            />-->
                             <el-table-column
                                     prop="relative_name"
                                     :label="this.$t('customerManage.relativeName')"
@@ -279,7 +279,7 @@
                             >
                                 <template slot-scope="scope">
                                     <el-button type="danger" size="mini"
-                                               @click="handlerDeleteRelative(scope.row.member_id)">{{ deleted }}
+                                               @click="handlerDeleteRelative(scope.row.id)">{{ deleted }}
                                     </el-button>
                                 </template>
                             </el-table-column>
@@ -305,13 +305,13 @@
                                 </el-col>
                             </el-row>
                             <el-row>
-                                <el-col :span="12">
-                                    <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="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>-->
+<!--                                        &lt;!&ndash;                    <el-radio v-model="relativeFormModel.sex" :label="2">未知</el-radio>&ndash;&gt;-->
+<!--                                    </el-form-item>-->
+<!--                                </el-col>-->
                                 <el-col :span="12">
                                     <el-form-item :label="this.$t('member.mobile')" prop="mobile">
                                         <el-input v-model="relativeFormModel.mobile" clearable :placeholder="this.$t('member.inputMobile')"
@@ -522,6 +522,7 @@
     import { getDevicesByUuid } from '@/api/initialize'
     import {RELATIVE_NAME_TYPE} from "@/utils/enum/RelativeNameTypeEnum";
     import SleepDetectData from "../sleep-detect-data";
+    import {getRelativeList, removeRelative} from "@/api/ncs_relative";
     const serverUrl = domain.serverUrl
     export default {
         name: 'ElderlyCareManager',
@@ -601,7 +602,6 @@
                     page_no: 1,
                     sort: 'create_time',
                     dir: 'desc',
-                    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: this.$t('customerManage.inputRemarks'), trigger: 'blur'}],
@@ -1413,8 +1413,8 @@
             },
             /** 拉取亲属列表 **/
             getRelatives() {
-                this.relativeParams.fixedCondition = ' relative_id=' + this.formmodel.member_id
-                API_User.getList(this.relativeParams).then(res => {
+                this.relativeParams.fixedCondition = ' member_id=' + this.formmodel.member_id
+              getRelativeList(this.relativeParams).then(res => {
                     this.relativeData = res.data
                 }).catch(() => {
 
@@ -1428,7 +1428,7 @@
                     cancelButtonText: this.$t('action.cancel'),
                     type: 'warning'
                 }).then(() => {
-                    API_User.remove(ids).then(
+                  removeRelative(ids).then(
                         response => {
                             this.getRelatives()
                         }

+ 22 - 23
src/views/customer/components/patientManager.vue

@@ -273,16 +273,16 @@
                                 style="width: 100%"
                         >
                             <el-table-column
-                                    prop="true_name"
+                                    prop="named"
                                     :label="this.$t('customerManage.customerRelativeTrueName')"
                                     width="180"
                             />
-                            <el-table-column
-                                    prop="sex"
-                                    :label="this.$t('member.sex')"
-                                    width="180"
-                                    :formatter="formatterSex"
-                            />
+<!--                            <el-table-column-->
+<!--                                    prop="sex"-->
+<!--                                    :label="this.$t('member.sex')"-->
+<!--                                    width="180"-->
+<!--                                    :formatter="formatterSex"-->
+<!--                            />-->
                             <el-table-column
                                     prop="relative_name"
                                     :label="this.$t('customerManage.relativeName')"
@@ -299,7 +299,7 @@
                             >
                                 <template slot-scope="scope">
                                     <el-button type="danger" size="mini"
-                                               @click="handlerDeleteRelative(scope.row.member_id)">{{ deleted }}
+                                               @click="handlerDeleteRelative(scope.row.id)">{{ deleted }}
                                     </el-button>
                                 </template>
                             </el-table-column>
@@ -323,13 +323,13 @@
                                 </el-col>
                             </el-row>
                             <el-row>
-                                <el-col :span="12">
-                                    <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="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>-->
+<!--                                        &lt;!&ndash;                    <el-radio v-model="relativeFormModel.sex" :label="2">未知</el-radio>&ndash;&gt;-->
+<!--                                    </el-form-item>-->
+<!--                                </el-col>-->
                                 <el-col :span="12">
                                     <el-form-item :label="this.$t('member.mobile')" prop="mobile">
                                         <el-input v-model="relativeFormModel.mobile" clearable :placeholder="this.$t('member.inputMobile')"
@@ -531,7 +531,6 @@
     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";
     import * as API_SystemConfig from "@/api/ncs_systemconfig";
     import * as shop_API from "@/api/ncs_shop";
@@ -540,6 +539,7 @@
     import {RELATIVE_NAME_TYPE} from "@/utils/enum/RelativeNameTypeEnum";
     import {CHILDBIRTH_TYPE} from "@/utils/enum/ChildbirthTypeEnum";
     import SleepDetectData from "../sleep-detect-data";
+    import {getRelativeList, removeRelative} from "@/api/ncs_relative";
     const serverUrl = domain.serverUrl
     export default {
         name: 'PatientManager',
@@ -623,7 +623,6 @@
                     page_no: 1,
                     sort: 'create_time',
                     dir: 'desc',
-                    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: this.$t('customerManage.inputRemarks'), trigger: 'blur'}],
@@ -1476,12 +1475,12 @@
             },
             /** 拉取亲属列表 **/
             getRelatives() {
-                this.relativeParams.fixedCondition = ' relative_id=' + this.formmodel.member_id
-                API_User.getList(this.relativeParams).then(res => {
-                    this.relativeData = res.data
-                }).catch(() => {
+              this.relativeParams.fixedCondition = ' member_id=' + this.formmodel.member_id
+              getRelativeList(this.relativeParams).then(res => {
+                this.relativeData = res.data
+              }).catch(() => {
 
-                })
+              })
             },
             /** 单条数据删除处理 */
             handlerDeleteRelative(ids) {
@@ -1491,7 +1490,7 @@
                     cancelButtonText: this.$t('action.cancel'),
                     type: 'warning'
                 }).then(() => {
-                    API_User.remove(ids).then(
+                  removeRelative(ids).then(
                         response => {
                             this.getRelatives()
                         }

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

@@ -1,612 +0,0 @@
-<template>
-  <div class="formwrap">
-    <el-tabs v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="用户管理" name="customerEdit">
-        <el-form ref="editForm" :model="formmodel" :rules="rules" label-width="140px">
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="用户姓名" prop="named">
-                <el-input v-model="formmodel.named" clearable placeholder="请输入姓名" :maxlength="20" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="用户编号">
-                <el-input v-model="formmodel.card_no" clearable placeholder="请输入用户编号" :maxlength="20" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <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-select>
-                </el-input>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="性别" class="form-item-sex">
-                <el-radio v-model="formmodel.sex" :label="1">男</el-radio>
-                <el-radio v-model="formmodel.sex" :label="0">女</el-radio>
-                <el-radio v-model="formmodel.sex" :label="3">未知</el-radio>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="在院状态">
-                <el-radio v-model="formmodel.status" :label="0">在院</el-radio>
-                <el-radio v-model="formmodel.status" :label="1">已出院</el-radio>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <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>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="证件号">
-                <el-input v-model="formmodel.id_no" clearable placeholder="请输入证件号" :maxlength="20" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="入院日期" prop="in_date">
-                <el-date-picker
-                  v-model="formmodel.in_date"
-                  type="date"
-                  :editable="false"
-                  value-format="timestamp"
-                  placeholder="选择入院日期"
-                  :picker-options="{disabledDate(time) { return time.getTime() > Date.now() }}"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="出院日期" prop="out_date">
-                <el-date-picker
-                  v-model="formmodel.out_date"
-                  type="date"
-                  :editable="false"
-                  value-format="timestamp"
-                  placeholder="选择出院日期"
-                  :picker-options="{disabledDate(time) { return time.getTime() < Date.now() }}"
-                />
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="责任医生">
-                <el-select v-model="formmodel.doctor_id" placeholder="请选择医生" @change="doctorChange(1)">
-                  <el-option v-for="(item,index) in doctors" :key="index" :label="item.clerk_name" :value="item.clerk_id" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="责任护士">
-                <el-select v-model="formmodel.nurse_id" placeholder="请选择护士" @change="doctorChange(2)">
-                  <el-option v-for="(item,index) in nurses" :key="index" :label="item.clerk_name" :value="item.clerk_id" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="责任护工">
-                <el-select v-model="formmodel.worker_id" placeholder="请选择护工" @change="doctorChange(3)">
-                  <el-option v-for="(item,index) in workrs" :key="index" :label="item.clerk_name" :value="item.clerk_id" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row v-if="nurseData.length > 0">
-            <el-col v-for="(item, index) in nurseList" :key="index" :span="24 / nurseList.length">
-              <el-form-item :label="item[0]">
-                <el-select v-model="nurseData[index].nurse_level" :placeholder="'请选择'+item[0]" @change="changeNurseData(index)">
-                  <el-option v-for="(t,i) in item[1]" :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>
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row>
-            <el-col :span="16">
-              <el-form-item label="病况描述">
-                <el-input
-                  v-model="formmodel.illness_desc"
-                  type="textarea"
-                  :autosize="{ minRows: 2, maxRows: 4}"
-                  :minlength="2"
-                  :maxlength="50"
-                  :placeholder="'请输入文本内容,长度2~50'"
-                />
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-form-item style="margin-top:15px;">
-            <el-button type="primary" :disabled="isDisabled" class="save" @click="handlerSubmit('editForm')">保存修改</el-button>
-          </el-form-item>
-        </el-form>
-
-        <el-card v-if="this.customerId != 0" style="maring:15px">
-          <div>
-            <div style="float: left"><h4>用户备注</h4></div>
-            <div style="float: right">
-              <el-button type="success" @click="dialogAddVisible = true">添加备注</el-button>
-            </div>
-          </div>
-          <div style="clear:both">
-            <div>
-              <el-card v-for="(item, index) in tableData" :key="index">
-                <div>
-                  <span style="margin-left: 20px;font-weight:bold">备注内容:</span><span style="line-height:1.5">{{ item.content }}</span>
-                </div>
-                <div style="margin: 10px">
-                  <div style="float: left">
-                    <span v-if="item.file_name">
-                      <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{ item.file_name }}</el-link>
-                    </span>
-                  </div>
-                  <div style="float: right">
-                    <p>
-                      <span style="font-weight:bold">创建时间:</span>{{ forDate(item.create_time) }}
-                      <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{ item.create_name }}
-                    </p>
-                  </div>
-                </div>
-              </el-card>
-              <!--翻页-->
-              <el-pagination
-                v-if="pageData"
-                slot="pagination"
-                :current-page="pageData.page_no"
-                :page-sizes="[10, 30, 50, 100]"
-                :page-size="pageData.page_size"
-                layout="total, sizes, prev, pager, next, jumper"
-                :total="pageData.data_total"
-                @size-change="handlePageSizeChange"
-                @current-change="handlePageCurrentChange"
-              />
-            </div>
-          </div>
-        </el-card>
-        <el-dialog title="添加用户备注" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
-          <el-form ref="editForm" :model="formmodel" :rules="rules" label-width="140px">
-            <el-form-item label="内容" prop="content">
-              <el-input
-                v-model="content"
-                type="textarea"
-                :autosize="{ minRows: 2, maxRows: 6}"
-                :minlength="2"
-                :maxlength="300"
-                show-word-limit
-                :placeholder="'请输入文本内容,长度300'"
-              />
-            </el-form-item>
-            <el-form-item label="附件">
-              <el-upload
-                v-if="!filePath"
-                class="avatar-uploader"
-                :action="`${uploadServer}?scene=avatar`"
-                :show-file-list="false"
-                :on-success="uploaded"
-                :before-upload="handleShopLogoBefore"
-              >
-                <i class="el-icon-plus avatar-uploader-icon" />
-              </el-upload>
-              <span v-if="filePath">{{ fileName }}</span>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" @click="addRemark">立即添加</el-button>
-              <el-button @click="quxiao">取消</el-button>
-            </el-form-item>
-          </el-form>
-        </el-dialog>
-      </el-tab-pane>
-      <el-tab-pane v-if="customerId != 0" label="用户亲属" name="customer-relative">
-        <customer-relative :member-id="memberId" />
-      </el-tab-pane>
-
-    </el-tabs>
-
-  </div>
-
-</template>
-
-<script>
-import * as customer_API from '@/api/ncs_customer'
-import * as clerk_API from '@/api/ncs_clerk'
-import * as NurseConfig_API from '@/api/ncs_nurse_config'
-import * as remark_API from '@/api/ncs_remark'
-import * as RegExp from '@/utils/RegExp'
-import { unixToDate } from '@/utils/Foundation'
-// import { serverUrl } from '@/utils/domain'
-import customerRelative from '@/views/customer/customer_relative'
-const serverUrl = domain.serverUrl
-
-export default {
-  name: 'PatientInfoEdit',
-  components: { customerRelative },
-  props: {
-    customerId: {
-      type: Number,
-      default: 0
-    },
-    frameId: {
-      type: Number,
-      default: 0
-    }
-  },
-  data: function() {
-    return {
-      formmodel: {
-        sex: 1,
-        status: 0,
-        age_unit: '岁',
-        id_type: '身份证',
-        part_id: this.$store.getters.partId
-      },
-      nurseList: [],
-      nurseData: [],
-      nurseConfigDtos: [],
-      rules: {
-        named: [
-          this.MixinRequired('请输入真实姓名!'),
-          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
-          {
-            validator: (rule, value, callback) => {
-              if (!RegExp.userName.test(value)) {
-                callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
-              } else {
-                callback()
-              }
-            }
-          }
-        ],
-        age: [{ required: true, message: '请输入年龄', trigger: 'blur' }],
-        content: [{ required: true, message: '请输入备注内容', trigger: 'blur' }],
-        in_date: [{ required: true, message: '请选择入院日期', trigger: 'blur' }]
-      },
-      isDisabled: false,
-      doctors: [],
-      nurses: [],
-      workrs: [],
-      doctor_mapping_id: false,
-      nurse_Mapping_id: false,
-      worker_mapping_id: false,
-      params: {
-        page_size: 10,
-        page_no: 1,
-        sort: 'create_time',
-        dir: 'desc'
-      },
-      tableData: [],
-      pageData: [],
-      dialogAddVisible: false,
-      fileName: null,
-      filePath: null,
-      uploadServer: serverUrl + '/ncs/upload/uploadFile',
-      userInfo: this.$store.getters.userInfo,
-      content: null,
-      activeName: 'customerEdit',
-      memberId: null
-    }
-  },
-  watch: {
-    frameId: function(newval) {
-      this.getNurseConfigs()
-      this.hasCustomerId()
-    }
-  },
-  mounted() {
-    this.getEmployees()
-    if (this.nurseList.length === 0) {
-      this.getNurseConfigs()
-      this.hasCustomerId()
-    }
-  },
-
-  methods: {
-    getEmployees() {
-      const _this = this
-      clerk_API.listByPartRoleId({ partId: this.$store.getters.partId }).then(res => {
-        const groupBy = (arr, func) =>
-          arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => {
-            acc[val] = (acc[val] || []).concat(arr[i])
-            return acc
-          }, {})
-        const groupData = groupBy(res, item => item.role_name)
-        if (Object.entries(groupData).length > 0) {
-          Object.entries(groupData).forEach(item => {
-            if (item[0] === '医生') {
-              _this.doctors = item[1]
-            } else if (item[0] === '护士') {
-              _this.nurses = item[1]
-            } else if (item[0] === '护工') {
-              _this.workrs = item[1]
-            }
-          })
-        }
-      })
-    },
-    getNurseConfigs() {
-      this.nurseData = []
-      const _this = this
-      NurseConfig_API.listByPartId({ partId: this.$store.getters.partId }).then(res => {
-        const groupBy = (arr, func) =>
-          arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => {
-            acc[val] = (acc[val] || []).concat(arr[i])
-            return acc
-          }, {})
-          // 以参数名称来分组
-        const groupData = groupBy(res, item => item.config_name)
-        _this.nurseList = Object.entries(groupData)
-        if (_this.nurseList.length > 0) {
-          _this.nurseList.forEach((item, index) => {
-            _this.nurseData.push({ nurse_level: null, id: null, nurse_config: item[1][0].ncfg_id })
-          })
-        }
-      })
-    },
-    hasCustomerId() {
-      this.clearForm()
-      if (this.customerId !== 0) {
-        const _this = this
-        customer_API.getCustomerInfo(this.customerId).then(res => {
-          _this.formmodel = res
-          _this.doctor_mapping_id = res.doctor_mapping_id
-          _this.nurse_Mapping_id = res.nurse_Mapping_id
-          _this.worker_mapping_id = res.worker_mapping_id
-          _this.formmodel.doctor_mapping_id = null
-          _this.formmodel.nurse_Mapping_id = null
-          _this.formmodel.worker_mapping_id = null
-          if (_this.formmodel.in_date) {
-            _this.formmodel.in_date = _this.formmodel.in_date * 1000
-          }
-          if (_this.formmodel.out_date) {
-            _this.formmodel.out_date = _this.formmodel.out_date * 1000
-          }
-          console.log(_this.formmodel.in_date, _this.formmodel.out_date)
-          _this.getRemarks()
-          if (res.list !== null) {
-            _this.nurseData.forEach((item, index) => {
-              res.list.forEach((t, i) => { // 为护理项赋值
-                if (item.nurse_config === t.nurse_config) {
-                  item.nurse_level = t.nurse_level
-                  item.id = t.id
-                }
-              })
-            })
-          }
-        })
-      }
-    },
-    doctorChange(type) {
-      if (this.customerId !== 0) {
-        if (type === 1) {
-          if (this.doctor_mapping_id === null) {
-            this.formmodel.doctor_mapping_id = 0 // 为0则新增,// 其他值为修改
-          } else {
-            this.formmodel.doctor_mapping_id = this.doctor_mapping_id
-          }
-        } else if (type === 2) {
-          if (this.nurse_Mapping_id === null) {
-            this.formmodel.nurse_Mapping_id = 0 // 为0则新增,// 其他值为修改
-          } else {
-            this.formmodel.nurse_Mapping_id = this.nurse_Mapping_id
-          }
-        } else {
-          if (this.worker_mapping_id === null) {
-            this.formmodel.worker_mapping_id = 0 // 为0则新增,// 其他值为修改
-          } else {
-            this.formmodel.worker_mapping_id = this.worker_mapping_id
-          }
-        }
-      }
-    },
-    /** 保存按钮处理事件 */
-    handlerSubmit(formName) {
-      this.$refs[formName].validate(valid => {
-        if (valid) {
-          this.isDisabled = true
-          if (this.formmodel.in_date) {
-            this.formmodel.in_date = this.formmodel.in_date / 1000
-          }
-          if (this.formmodel.out_date) {
-            this.formmodel.out_date = this.formmodel.out_date / 1000
-          }
-          if (this.customerId === 0) {
-            this.formmodel.frame_id = this.frameId
-            this.formmodel.list = this.nurseConfigDtos
-            customer_API.addAll(this.formmodel).then(res => {
-              this.$message.success(this.$t('action.addSuccess2'))
-              this.clearForm()
-              this.$emit('saved')
-            }).catch(e => {
-              this.isDisabled = false
-            })
-          } else {
-            this.formmodel.list = this.nurseConfigDtos
-            customer_API.updateAll(this.formmodel).then(res => {
-              this.$message.success(this.$t('action.editSuccess'))
-              this.isDisabled = false
-              this.$emit('saved')
-            })
-          }
-        } else {
-          this.$message.error(this.$t('action.fromError'))
-          return false
-        }
-      })
-    },
-    clearForm() {
-      this.activeName = 'customerEdit'
-      this.formmodel = {
-        sex: 1,
-        status: 0,
-        age_unit: '岁',
-        id_type: '身份证',
-        part_id: this.$store.getters.partId,
-        named: null,
-        card_no: null,
-        id_no: null,
-        in_date: new Date(new Date().toLocaleDateString()).getTime(),
-        out_date: null,
-        doctor_id: null,
-        nurse_id: null,
-        worker_id: null,
-        illness_desc: null
-      }
-      this.isDisabled = false
-      this.nurseConfigDtos = []
-    },
-    // 选择了护理项
-    changeNurseData(index) {
-      const i = this.nurseConfigDtos.findIndex(item => {
-        return item.nurse_level === this.nurseData[index].nurse_level
-      })
-      if (i !== -1) {
-        this.nurseConfigDtos.splice(i, 1)
-      }
-      this.nurseConfigDtos.push(this.nurseData[index])
-    },
-    getRemarks() {
-      const _this = this
-      this.params.fixedCondition = ' part_id=' + this.$store.getters.partId + ' and type=1 and member_id = ' + this.formmodel.member_id
-      remark_API.getRemarks(this.params).then(res => {
-        _this.tableData = res.data
-        _this.pageData = {
-          page_no: res.page_no,
-          page_size: res.page_size,
-          data_total: res.data_total
-        }
-      })
-    },
-    /** 分页大小发生改变 */
-    handlePageSizeChange(size) {
-      this.params.page_size = size
-      this.getRemarks()
-    },
-    /** 分页页数发生改变 */
-    handlePageCurrentChange(page) {
-      this.params.page_no = page
-      this.getRemarks()
-    },
-    forDate(date) {
-      return unixToDate(date)
-    },
-    /** 上传成功后的钩子 更换图片 置空存储数组*/
-    uploaded(res) {
-      this.filePath = serverUrl + '/' + res
-    },
-    /** 图片上传之前的校验 */
-    handleShopLogoBefore(file) {
-      const _this = this
-      return new Promise((resolve, reject) => {
-        let hz = file.name
-        _this.fileName = hz
-        const index = hz.lastIndexOf('.')
-        hz = hz.substring(index + 1, hz.length)
-        const isImg = hz === 'jpeg' || hz === 'png' || hz === 'jpg' || hz === 'txt' || hz === 'doc' || hz === 'docx' || hz === 'xls' || hz === 'xlsx'
-        const isLt5M = file.size / 1024 / 1024 < 5
-        if (!isImg) {
-          _this.$message.error('上传附件只能是txt,doc,docx,xls,xlsx,jpg,png,jpeg格式!')
-          reject()
-        }
-        if (!isLt5M) {
-          _this.$message.error('上传附件大小不能超过 5MB!')
-          reject()
-        }
-        resolve()
-      })
-    },
-    addRemark() {
-      if (!this.content) {
-        this.$message.info('请输入内容!')
-        return
-      }
-      if (!this.filePath) {
-        this.fileName = null
-      }
-      const data = {
-        partId: this.$store.getters.partId,
-        type: 1,
-        memberId: this.formmodel.member_id,
-        createName: this.userInfo.username,
-        content: this.content,
-        filePath: this.filePath,
-        fileName: this.fileName
-      }
-      const _this = this
-      remark_API.save(data).then(res => {
-        _this.$message.success(this.$t('action.addSuccess2'))
-        _this.getRemarks()
-        _this.quxiao()
-      })
-    },
-    quxiao() {
-      this.dialogAddVisible = false
-      this.content = null
-      this.fileName = null
-      this.filePath = null
-    },
-    handleClick(tab) {
-      this.memberId = this.formmodel.member_id
-    }
-  }
-}
-</script>
-
-<style type="text/scss" scoped>
-  .el-input .el-select {
-    width: 68px;
-  }
-  .el-select {
-    width: 100%;
-  }
-  .formwrap {
-    border: 1px solid #ebebeb;
-    border-radius: 3px;
-    background: #fff;
-    padding: 24px;
-    min-height: 500px;
-  }
-  /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 - 0
src/views/customer/customerManagement.vue

@@ -5,6 +5,7 @@
 </template>
 
 <script>
+// 月子中心版
 import CustomerManager from './components/customerManager'
 export default {
   name: 'CustomerManagement',

+ 0 - 284
src/views/customer/customer_relative.vue

@@ -1,284 +0,0 @@
-<template>
-  <div>
-    <en-table-layout
-      toolbar
-      @selection-change="selectFun"
-      pagination
-      :tableData="tableData"
-      :height="600"
-      :loading="loading"
-      :default-sort="{prop: 'id', order: 'ascending'}"
-    >
-      <!--工具栏-->
-      <div slot="toolbar" class="inner-toolbar">
-        <div class="toolbar-search">
-          <en-table-search @search="handlerSearch" :placeholder="this.$t('action.keywords')"/>
-        </div>
-        <div class="toolbar-btns">
-          <el-button type="primary" @click="handleAdd">添加亲属</el-button>
-           <el-button type="danger" :disabled="multipleSelection.length === 0" @click="batchDelete">批量删除</el-button>
-        </div>
-      </div>
-      <!--表头-->
-      <template slot="table-columns">
-        <el-table-column type="selection" width="55" align="center"></el-table-column>
-        <el-table-column prop="nickname" label="姓名" align="center"></el-table-column>
-        <el-table-column prop="relative_name" label="亲属称呼" align="center"></el-table-column>
-        <el-table-column prop="sex" label="性别" align="center" :formatter="formatterSex"></el-table-column>
-        <el-table-column prop="mobile" label="手机" align="center"></el-table-column>
-        <el-table-column label="操作" width="120">
-          <template slot-scope="scope">
-            <el-button type="danger" size="mini" @click="handlerDelete(scope.row.member_id)">
-              删除
-            </el-button>
-          </template>
-        </el-table-column>
-      </template>
-
-      <!--翻页-->
-      <el-pagination
-        slot="pagination"
-        v-if="pageData"
-        :current-page="pageData.page_no"
-        :page-sizes="[20, 30, 50, 100]"
-        :page-size="pageData.page_size"
-        @size-change="handlePageSizeChange"
-        @current-change="handlePageCurrentChange"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="pageData.data_total">
-      </el-pagination>
-    </en-table-layout>
-
-    <el-dialog title="添加用户亲属" :visible.sync="dialogAddVisible" :append-to-body="true" width="80%">
-      <el-form :model="formmodel" :rules="rules" ref="editForm" label-width="140px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="姓名" prop="nickname">
-              <el-input v-model="formmodel.nickname" clearable placeholder="请输入姓名" :maxlength="20"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="亲属称呼" prop="relative_name">
-              <el-input v-model="formmodel.relative_name" clearable placeholder="请输入亲属称呼" :maxlength="20"></el-input>
-            </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="formmodel.sex" :label="1">男</el-radio>
-              <el-radio v-model="formmodel.sex" :label="0">女</el-radio>
-              <el-radio v-model="formmodel.sex" :label="3">未知</el-radio>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="手机号码">
-              <el-input v-model="formmodel.mobile" clearable placeholder="请输入手机号码" :maxlength="20"></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item>
-          <el-button type="primary" @click="addMember">立即添加</el-button>
-          <el-button @click="quxiao">取消</el-button>
-        </el-form-item>
-      </el-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-  import * as API_user from '@/api/user'
-  import * as RegExp from "@/utils/RegExp";
-
-  export default {
-    name: 'customer_relative',
-    props: {
-      memberId: {
-        type: Number,
-        default: 0
-      }
-    },
-    data: function() {
-      return {
-        /** 列表loading状态 */
-        loading: false,
-        /** 列表参数 */
-        params: {
-          page_size: 10,
-          page_no: 1,
-          sort: 'create_time',
-          dir: 'desc',
-          fixedCondition: ''
-        },
-        currentRow: {},
-        /** 列表数据 */
-        tableData: [],
-        pageData: [],
-        dialogAddVisible: false,
-        /** 选中行数据 */
-        multipleSelection: [],
-        lookForm: {},
-        formshow: false,
-        formmodel: {
-          sex: 1
-        },
-        rules: {
-          nickname: [
-            this.MixinRequired('请输入亲属姓名!'),
-            { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
-            {
-              validator: (rule, value, callback) => {
-                if (!RegExp.userName.test(value)) {
-                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
-                } else {
-                  callback()
-                }
-              }
-            }
-          ],
-          relative_name: [
-            this.MixinRequired('请输入亲属称呼!'),
-            { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
-            {
-              validator: (rule, value, callback) => {
-                if (!RegExp.userName.test(value)) {
-                  callback(new Error('只支持汉字、字母、数字、“-”、“_”的组合!'))
-                } else {
-                  callback()
-                }
-              }
-            }
-          ],
-        },
-      }
-    },
-    mounted() {
-      // if (this.memberId) {
-      //   this.GET_List()
-      // }
-    },
-    watch: {
-      memberId: function() {
-        if (this.memberId) {
-          this.GET_List()
-        }
-      }
-    },
-    methods: {
-      /** 选择行变化时,记录选中的行数据 */
-      selectFun(val) {
-        this.multipleSelection = val
-      },
-      /** 加载设备信息列表 */
-      GET_List() {
-        this.loading = true
-        this.params.fixedCondition = ' relative_id=' + this.memberId
-        API_user.getList(this.params).then(res => {
-          this.loading = false
-          this.tableData = res.data
-          this.pageData = {
-            page_no: res.page_no,
-            page_size: res.page_size,
-            data_total: res.data_total
-          }
-        }).catch(() => {
-          this.loading = false
-        })
-      },
-      /** 处理搜索 **/
-      handlerSearch(keywords) {
-        this.params.query = keywords
-        this.GET_List()
-      },
-      /** 单条数据删除处理 */
-      handlerDelete(ids) {
-        let test = '你确定要删除此用户亲属信息?'
-        let _this = this
-        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(
-            response => {
-              _this.GET_List()
-            }
-          ).catch(response => {
-            _this.$message({
-              type: 'info',
-              message: response.message
-            })
-          })
-        })
-      },
-      /** 批量数据删除处理(删除选中的行) */
-      batchDelete: function() {
-        const ids = []
-        this.multipleSelection.forEach(function(item) {
-          ids.push(item.member_id)
-        })
-        this.handlerDelete(ids.join(','), 'del')
-      },
-      /** 添加设备信息 */
-      handleAdd() {
-        this.dialogAddVisible = true
-      },
-      /** 编辑设备信息 */
-      handlerEdit(index, row) {
-        this.lookForm = Object.assign({}, row);
-        this.formshow = true
-      },
-      /** 分页大小发生改变 */
-      handlePageSizeChange(size) {
-        this.params.page_size = size
-        this.GET_List()
-      },
-      /** 分页页数发生改变 */
-      handlePageCurrentChange(page) {
-        this.params.page_no = page
-        this.GET_List()
-      },
-      addMember() {
-        this.formmodel.relative_id = this.memberId
-        let _this = this
-        API_user.add(this.formmodel).then(res=> {
-          _this.GET_List()
-          _this.quxiao()
-        })
-      },
-      quxiao() {
-        this.dialogAddVisible = false
-        this.formmodel = {
-          sex: 1
-        }
-      },
-      formatterSex(row, column, cellValue) {
-        if (row.sex === 1) {
-          return '男'
-        } else if (row.sex === 0) {
-          return '女'
-        } else {
-          return '未知'
-        }
-      }
-    }
-  }
-</script>
-
-<style type="text/scss" scoped>
-
-  /deep/ div.toolbar {
-    height: 70px;
-    padding: 20px 0;
-  }
-
-  /deep/ .el-table {
-    width: 100%;
-    overflow-x: scroll;
-
-    & td:not(.is-left) {
-      text-align: center;
-    }
-  }
-
-</style>

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

@@ -5,6 +5,7 @@
 </template>
 
 <script>
+// 养老院版
     import elderlyCareManager from "./components/elderlyCareManager"
     export default {
         name: "ElderlyCareManagement",

+ 0 - 474
src/views/customer/list.vue

@@ -1,474 +0,0 @@
-<template>
-  <div>
-    <!--工具栏-->
-    <div class="toolbar" style="padding-left: 20px">
-      <el-form :inline="true" label-width="120px">
-        <el-form-item>
-          <el-input v-model="searchStr" placeholder="请输入用户姓名、编号、床位" clearable @clear="clickSearch" @keyup.native.enter="clickSearch">
-            <el-button slot="append" icon="el-icon-search" @click="clickSearch"></el-button>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="用户状态">
-          <el-select v-model="callingType" placeholder="请选择用户状态" clearable @change="changeStatus">
-            <el-option label="在院" :value="0" />
-            <el-option label="已出院" :value="1" />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="danger" @click="batchDelete">批量删除</el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <ag-grid-layout
-            :toolbar="false"
-            :table-height="tableHeight"
-            theme="ag-theme-alpine"
-            :column-defs="columnDefs"
-            :row-data="tableData"
-            :locale-text="localeText"
-            :grid-options="gridOptions"
-            :default-col-def="defaultColDef"
-            :animate-rows="true"
-            :row-selection="rowSelection"
-            @filterChanged="filterModifed"
-            @sortChanged="gridSortChange"
-    >
-      <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="编辑用户信息" :visible.sync="dialogAddVisible" :append-to-body="true" width="85%">
-      <customer-edit :customer-id="customerId" :frame-id="frameId" @saved="handlePatientFinished"></customer-edit>
-    </el-dialog>
-
-    <el-dialog title="换床" :visible.sync="formshow" :append-to-body="true" width="80%">
-      <el-form ref="editForm" label-width="140px">
-        <el-form-item label="当前床位:"><svg-icon icon-class="bed" style="color: #9aaabf;margin-top: 5px" />{{ full_name }}</el-form-item>
-        <el-form-item label="可换床位:">
-          <el-radio-group v-model="changeFrameId">
-            <el-radio v-for="(item, index) in frameList" :label="item.id" :key="index">
-              <svg-icon icon-class="bed" style="color: #9aaabf;margin-top: 5px" />{{ item.full_name }}
-            </el-radio>
-          </el-radio-group>
-        </el-form-item>
-
-        <el-form-item>
-          <el-button type="primary" @click="updateFrameId">确定换床</el-button>
-        </el-form-item>
-      </el-form>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-  import * as API_customer from '@/api/ncs_customer'
-  import { unixToDate } from "@/utils/Foundation"
-  import customerEdit from '@/views/customer/customerEdit'
-  import * as RegExp from "@/utils/RegExp"
-  import * as API_hospitalFrame from "@/api/ncs_hospitalFrame"
-  import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
-  import {param} from "@/utils"
-  import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
-  import RadioFilter from "@/components/AgGridCustomFilter/RadioFilter";
-
-  export default {
-    name: 'customer_list',
-    components: { customerEdit, ButtonCellRender, RadioFilter },
-    data: function() {
-      return {
-        /** 列表loading状态 */
-        loading: false,
-        /** 列表参数 */
-        params: {
-          page_size: 10,
-          page_no: 1,
-          sort: 'status,create_time',
-          dir: 'desc',
-          fixedCondition: ' part_id = ' + this.$store.getters.partId,
-          alias: 'nc'
-        },
-        currentRow: {},
-        /** 列表数据 */
-        tableData: [],
-        pageData: [],
-        dialogAddVisible: false,
-        /** 选中行数据 */
-        multipleSelection: [],
-        lookForm: {},
-        formshow: false,
-        changeFrameId: null,
-        customerId: null,
-        frameId: null,
-        callingType: null,
-        frameList: [],
-        searchStr: null,
-        full_name: '',
-        columnDefs: null,
-        defaultColDef: null,
-        gridOptions: null,
-        gridApi: null,
-        columnApi: null,
-        localeText: AG_GRID_LOCALE_CN,
-        rowSelection: null,
-        sexTransfer: [
-          { key: '男', value: 1, color: 'green' },
-          { key: '女', value: 0, color: 'red' }
-        ],
-        statusTransfer: [
-        { key: '已出院', value: 1,  color: 'orange' },
-          { key: '在院', value: 0,  color: 'green' }
-        ]
-      }
-    },
-    computed: {
-      tableHeight() {
-        return this.mainAreaHeight - 130
-      }
-    },
-    beforeMount() {
-      this.gridOptions = {
-      }
-      this.columnDefs = [
-        {
-          headerName: '#',
-          headerCheckboxSelection: true,
-          headerCheckboxSelectionFilteredOnly: true,
-          checkboxSelection: true,
-          sortable: false, filter: false,
-          width: 50,
-          resizable: false,
-          valueGetter: this.hashValueGetter
-        },
-        { headerName: '姓名', field: 'named', sortable: true, filter: 'agTextColumnFilter', minWidth: 160 },
-        { headerName: '用户编号', field: 'card_no', sortable: true, filter: true, minWidth: 170 },
-        { headerName: '年龄', field: 'age', sortable: true, filter: 'agNumberColumnFilter', valueFormatter: this.formatterAge, minWidth: 100 },
-        { headerName: '性别', field: 'sex', sortable: true, filter: true, cellRenderer: this.formatterSex, minWidth: 100, filterFramework: 'RadioFilter',
-          filterParams: {
-            listData: this.sexTransfer
-          }
-        },
-        { headerName: '住院时间', field: 'in_date', valueFormatter: this.formatterDate, sortable: true, minWidth: 220, filter: 'agDateColumnFilter',
-          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: 'status', sortable: true, filter: false, cellRenderer: this.formatterStatus, minWidth: 100, filterFramework: 'RadioFilter',
-          filterParams: {
-            listData: this.statusTransfer
-          }
-        },
-        { headerName: '床位', field: 'full_name', sortable: true, filter: true, minWidth: 120 },
-        { headerName: '操作任务', field: 'id',
-          cellRendererFramework: 'ButtonCellRender',
-          cellRendererParams: param => {
-            return {
-              onClick: this.handleAdd,
-              label: this.$t('action.edit'),
-              buttonType: 'primary',
-              buttonSize: 'mini'
-            }
-          },
-          filter: false,
-          pinned: 'right',
-          lockPinned: true,
-          width: 100,
-          resizable: false,
-          sortable: false },
-        { headerName: '换床', field: 'id',
-          cellRendererFramework: 'ButtonCellRender',
-          cellRendererParams: param => {
-            return {
-              onClick: this.handlerEdit,
-              label: '换床',
-              buttonType: 'success',
-              buttonSize: 'mini',
-              show: !param.data['status']
-            }
-          },
-          filter: false,
-          pinned: 'right',
-          lockPinned: true,
-          width: 100,
-          resizable: false,
-          sortable: false },
-        { headerName: '出院', field: 'id',
-          cellRendererFramework: 'ButtonCellRender',
-          cellRendererParams: param => {
-            return {
-              onClick: this.cy,
-              label: '出院',
-              buttonType: 'danger',
-              buttonSize: 'mini',
-              show: !param.data['status']
-            }
-          },
-          pinned: 'right',
-          lockPinned: true,
-          width: 100,
-          resizable: false,
-          filter: false,
-          sortable: false }
-      ]
-      this.defaultColDef = {
-        filter: 'agTextColumnFilter',
-        sortable: true,
-        resizable: true,
-        comparator: this.testComparator,
-        filterParams: {
-          debounceMs: 200,
-          newRowsAction: 'keep',
-          textCustomComparator: this.textCustomComparator,
-          comparator: this.testComparator
-        }
-      },
-              this.rowSelection = 'multiple'
-    },
-    mounted() {
-      window.onresize = this.windowResize()
-      this.gridApi = this.gridOptions.api
-      this.GET_List()
-    },
-    methods: {
-      windowResize() {
-        this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
-      },
-      /** 选择行变化时,记录选中的行数据 */
-      selectFun(val) {
-        this.multipleSelection = val
-      },
-      /** 加载设备信息列表 */
-      GET_List() {
-        this.loading = true
-        this.gridApi.showLoadingOverlay()
-        this.gridApi.sizeColumnsToFit()
-        API_customer.getList(this.params).then(res => {
-          this.loading = false
-          this.tableData = res.data
-          this.pageData = {
-            page_no: res.page_no,
-            page_size: res.page_size,
-            data_total: res.data_total
-          }
-        }).catch(() => {
-          this.loading = false
-        })
-      },
-      /** 处理搜索 **/
-      handlerSearch(keywords) {
-        this.params.query = keywords
-        this.GET_List()
-      },
-      changeStatus(value) {
-        delete this.params.fixedCondition
-        if (value) {
-          this.params.fixedCondition = ' part_id =' + this.$store.getters.partId + ' and status=' + value
-        } else {
-          this.params.fixedCondition = ' 1 = 1'
-        }
-        this.GET_List()
-      },
-      /** 单条数据删除处理 */
-      handlerDelete(ids) {
-        let test = '你确定要删除此用户信息?'
-        let _this = this
-        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(
-            response => {
-              _this.GET_List()
-            }
-          ).catch(response => {
-            _this.$message({
-              type: 'info',
-              message: response.message
-            })
-          })
-        })
-      },
-      /** 批量数据删除处理(删除选中的行) */
-      batchDelete: function() {
-        let rows = this.gridApi.getSelectedRows()
-        if (rows.length === 0) {
-          this.$message({ type: 'info', message: '请先勾选需要删除的数据' })
-          return
-        }
-        const ids = []
-        rows.forEach(function (item) {
-          ids.push(item.id)
-        })
-        this.handlerDelete(ids.join(','), 'del')
-      },
-      /** 添加设备信息 */
-      handleAdd(row) {
-        this.dialogAddVisible = true
-        this.customerId = row.id
-        this.frameId = row.frame_id
-      },
-      handlerEdit(row) {
-        this.customerId = row.id
-        this.full_name = row.full_name
-        API_hospitalFrame.getSickbedByPartId(this.$store.getters.partId).then(res=> {
-          this.frameList = res
-        })
-        this.formshow = true
-      },
-      cy(row) {
-        this.customerId = row.id
-        let _this = this
-        this.$confirm('你确定要进行出院操作吗', this.$t('action.waring'), {
-          confirmButtonText: this.$t('action.yes'),
-          cancelButtonText: this.$t('action.cancel'),
-          type: 'warning'
-        }).then(() => {
-          const data = {
-            out_date: new Date(new Date().toLocaleDateString()).getTime(),
-            status: 1
-          }
-          _this.updateSave(data)
-        })
-      },
-      /** 分页大小发生改变 */
-      handlePageSizeChange(size) {
-        this.params.page_size = size
-        this.GET_List()
-      },
-      /** 分页页数发生改变 */
-      handlePageCurrentChange(page) {
-        this.params.page_no = page
-        this.GET_List()
-      },
-      formatterAge(param) {
-        return param.data.age + param.data.age_unit
-      },
-      formatterStatus(params) {
-        if (params.value === null || params.value === undefined) return ''
-        const item = this.statusTransfer.filter(p => p.value === params.value)[0]
-        if (item) {
-          return '<span style="color:' + item.color + ';">' + item.key + '</span>'
-        } else {
-          return '未知'
-        }
-      },
-      formatterDate(param) {
-        let date = unixToDate(param.data.in_date, 'yyyy-MM-dd')
-        if (param.data.out_date) {
-          date += '至' + unixToDate(param.data.out_date, 'yyyy-MM-dd')
-        } else {
-          if (param.data.in_date) {
-            date += '至今'
-          }
-        }
-        return date
-      },
-      handlePatientFinished() {
-        this.dialogAddVisible = false
-        this.GET_List()
-      },
-      updateFrameId() {
-        if (!this.changeFrameId) {
-          this.$message({
-            type: 'info',
-            message: '请选择床位'
-          })
-          return
-        }
-        const data = {
-          frame_id: this.changeFrameId
-        }
-        this.updateSave(data)
-      },
-      updateSave(data) {
-        API_customer.update(this.customerId, data).then(res=> {
-          this.$message({
-            type: 'success',
-            message: '修改成功'
-          })
-          this.formshow = false
-          this.GET_List()
-        })
-      },
-      clickSearch(value) {
-        this.params.query = this.searchStr
-        this.GET_List()
-      },
-      /** 性别格式化 */
-      formatterSex(params) {
-        if (params.value === null || params.value === undefined) return ''
-        const item = this.sexTransfer.filter(p => p.value === params.value)[0]
-        if (item) {
-          return '<span style="color:' + item.color + ';">' + item.key + '</span>'
-        } else {
-          return '未知'
-        }
-      },
-      filterModifed(param) {
-        let model = param.api.getFilterModel()
-        this.params.filter = JSON.stringify(model)
-        this.GET_List()
-      },
-      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.GET_List()
-      },
-    }
-  }
-</script>
-
-<style type="text/scss" scoped>
-
-  /deep/ div.toolbar {
-    height: 70px;
-    padding: 20px 0;
-  }
-
-  /deep/ .el-table {
-    width: 100%;
-    overflow-x: scroll;
-
-    & td:not(.is-left) {
-      text-align: center;
-    }
-  }
-</style>

+ 1 - 0
src/views/customer/patientManagement.vue

@@ -5,6 +5,7 @@
 </template>
 
 <script>
+// 医院版
 import PatientManager from './components/patientManager'
 export default {
   name: 'PatientManagement',

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

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

+ 14 - 14
src/views/login/index.vue

@@ -9,14 +9,14 @@
             <h3 class="title">{{ this.$t('action.wdklCallingSystem') }}</h3>
           </div>
 
-          <el-form-item prop="username">
+          <el-form-item :prop="this.$t('action.usernameMsg')">
             <span class="svg-container">
               <svg-icon icon-class="user" />
             </span>
             <el-input
               ref="username"
               v-model="loginForm.username"
-              placeholder="Username"
+              :placeholder="this.$t('action.usernameMsg')"
               name="username"
               type="text"
               tabindex="1"
@@ -25,7 +25,7 @@
           </el-form-item>
 
           <el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
-            <el-form-item prop="password">
+            <el-form-item :prop="this.$t('action.passwordMsg')">
               <span class="svg-container">
                 <svg-icon icon-class="password" />
               </span>
@@ -34,7 +34,7 @@
                 ref="password"
                 v-model="loginForm.password"
                 :type="passwordType"
-                placeholder="Password"
+                :placeholder="this.$t('action.passwordMsg')"
                 name="password"
                 tabindex="2"
                 autocomplete="on"
@@ -159,20 +159,20 @@ export default {
                 // this.$router.push({ path: '/' })
                 this.loading = false
               }).catch(err => {
-                Message({
-                  message: err,
-                  type: 'error',
-                  duration: 5 * 1000
-                })
+                // Message({
+                //   message: err,
+                //   type: 'error',
+                //   duration: 5 * 1000
+                // })
                 this.loading = false
               })
             })
             .catch((error) => {
-              Message({
-                message: error,
-                type: 'error',
-                duration: 5 * 1000
-              })
+              // Message({
+              //   message: error,
+              //   type: 'error',
+              //   duration: 5 * 1000
+              // })
               this.loading = false
             })
         } else {

+ 9 - 4
src/views/ncs-chars/index.vue

@@ -102,6 +102,9 @@
       <el-tab-pane name="PHONE">
         <span slot="label"><i class="el-icon-mobile-phone" /> {{ this.$t('tcpType.PHONE') }}</span>
       </el-tab-pane>
+      <el-tab-pane name="SIDE">
+        <span slot="label"><i class="el-icon-first-aid-kit" /> {{ this.$t('tcpType.SIDE') }}</span>
+      </el-tab-pane>
     </el-tabs>
     <div v-if="sssparams.type">
       <el-card shadow="always" style="margin-top: 15px;">
@@ -193,7 +196,7 @@ export default {
         noCount: 0
       },
       tableData: [],
-      dataList: [this.$t('tcpType.VOICE'), this.$t('tcpType.VIDEO'), this.$t('tcpType.IM'), this.$t('tcpType.EVENT'), this.$t('tcpType.ENTRACEGUARD'), this.$t('tcpType.SOS'), this.$t('tcpType.PHONE')],
+      dataList: [this.$t('tcpType.VOICE'), this.$t('tcpType.VIDEO'), this.$t('tcpType.IM'), this.$t('tcpType.EVENT'), this.$t('tcpType.ENTRACEGUARD'), this.$t('tcpType.SOS'), this.$t('tcpType.PHONE'), this.$t('tcpType.SIDE')],
       activeName: 'ALL',
       userActionList: [],
       activeName2: 'user',
@@ -462,12 +465,12 @@ export default {
         this.sssparams.year = object.date_val.getFullYear()
         this.sssparams.month = this.checkTime(object.date_val.getMonth() + 1)
         this.sssparams.day = this.checkTime(object.date_val.getDate())
-        this.infoDay = this.sssparams.year + '年' + this.sssparams.month + '月' + this.sssparams.day + '日'
+        this.infoDay = this.sssparams.year + this.$t('interaction.year') + this.sssparams.month + this.$t('interaction.month') + this.sssparams.day + this.$t('interaction.day')
       } else {
         this.sssparams.year = object.year
         this.sssparams.month = object.month
         this.sssparams.cycle_type = object.type
-        this.infoDay = this.sssparams.year + '年' + this.sssparams.month
+        this.infoDay = this.sssparams.year + this.$t('interaction.year') + this.sssparams.month
       }
       this.getLogCharsJS()
       if (this.activeName !== 'ALL') {
@@ -498,6 +501,8 @@ export default {
           return this.$t('tcpType.SOS')
         case 'PHONE':
           return this.$t('tcpType.PHONE')
+        case 'SIDE':
+          return this.$t('tcpType.SIDE')
         default:
           return this.$t('tcpType.UNKNOWN')
       }
@@ -577,7 +582,7 @@ export default {
             tHeader.push(this.$t('interaction.SumNum'))
             filterVal.push('sum_num')
           }
-          const tit = _this.infoDay + _this.formatterType(_this.activeName) + '统计表'
+          const tit = _this.infoDay + _this.formatterType(_this.activeName) + $t('interaction.eventStatistics')
           const data = _this.formatJson(filterVal, _this.userActionList)
           excel.export_json_to_excel({
             header: tHeader,

+ 3 - 3
src/views/ncs-chars/info.vue

@@ -2,7 +2,7 @@
   <div>
     <div style="padding: 10px;margin: 10px;">
       <div style="padding: 10px;">
-        <el-button type="primary" @click="exportExcel">导出</el-button>
+        <el-button type="primary" @click="exportExcel">{{ this.$t('action.export') }}</el-button>
       </div>
       <div class="table-wrapper">
         <el-table :data="userActionList" stripe border :default-sort = "{prop: 'num', order: 'descending'}" style="width: 100%">
@@ -107,7 +107,7 @@ export default {
     },
     exportExcel() {
       const _this = this
-      this.$confirm('将导出Excel文件,是否继续?', '提示', {
+      this.$confirm(this.$t('action.excelFile'), this.$t('action.prompt'), {
         type: 'warning'
       }).then(() => {
         _this.loading = false
@@ -115,7 +115,7 @@ export default {
           const tHeader = [this.sssparams.eventType ? this.$t('member.name') : this.$t('tcpType.EVENT'), this.$t('interaction.actionTime'),
             this.$t('interaction.unSuccessTime'), this.$t('interaction.avgResponseNum'), this.$t('interaction.MinNum'), this.$t('interaction.MaxNum')] // 表头
           const filterVal = ['name', 'num', 'error_num', 'avg_num', 'min_num', 'max_num']
-          const tit = this.infoName + '事件统计表'
+          const tit = this.infoName + this.$t('action.eventStatistics')
           const data = _this.formatJson(filterVal, this.userActionList)
           excel.export_json_to_excel({
             header: tHeader,

+ 24 - 1
src/views/ncs-clerk/components/clerkList.vue

@@ -24,7 +24,7 @@
 <!--        </div>-->
         <div class="toolbar-btns">
           <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>-->
+          <el-button v-if="!part_view" type="danger" size="mini" @click="batchDelete">{{ this.$t('action.deleteList') }}</el-button>
         </div>
       </div>
       <el-pagination
@@ -382,6 +382,25 @@ export default {
         width: 100,
         resizable: false,
         sortable: false
+      },
+      {
+        headerName: this.$t('action.delete'), field: 'id',
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: param => {
+          return {
+            onClick: this.deleteSingle,
+            label: this.$t('action.delete'),
+            buttonType: 'danger',
+            buttonSize: 'mini',
+            disabled: param.data['member_name'] === 'superadmin'
+          }
+        },
+        pinned: 'right',
+        lockPinned: true,
+        width: 90,
+        resizable: false,
+        filter: false,
+        sortable: false
       }
     ]
     this.defaultColDef = {
@@ -446,6 +465,10 @@ export default {
       this.params.query = keywords
       this.GET_MemberList()
     },
+    /** 删除设备 **/
+    deleteSingle(row) {
+      this.handlerDelete(row.clerk_id)
+    },
     /** 单条数据删除处理 */
     handlerDelete(ids) {
       this.$confirm(this.$t('member.disableClerk'), this.$t('action.waring'), {

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

@@ -1004,7 +1004,8 @@
                     val === DEVICE_TYPE.SIMULATE_BED_DEVICE ||
                     val === DEVICE_TYPE.REMOTE_CONTROL ||
                     val === DEVICE_TYPE.CELL_PHONE ||
-                    val === DEVICE_TYPE.ALARM_433BUTTON
+                    val === DEVICE_TYPE.ALARM_433BUTTON ||
+                    val === DEVICE_TYPE.ALARM_INFUSION
                 ) {
                     this.getFramesByType(FRAME_TYPE.BED)
                 } else {

+ 283 - 0
src/views/ncs-his/his-clerk/hisClerkManager.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="app-container">
+
+    <ag-grid-layout
+        :table-height="tableHeight"
+        theme="ag-theme-alpine"
+        :column-defs="columnDefs"
+        :row-data="tableData"
+        :locale-text="localeText"
+        :grid-options="gridOptions"
+        :default-col-def="defaultColDef"
+        :animate-rows="true"
+        :row-selection="rowSelection"
+        row-height="50"
+        @filterChanged="filterModifed"
+        @sortChanged="gridSortChange"
+    >
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
+        </div>
+      </div>
+      <el-pagination
+          v-if="pageData"
+          slot="pagination"
+          :current-page="pageData.page_no"
+          :page-sizes="[20, 50, 100, 200]"
+          :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>
+  </div>
+</template>
+
+<script>
+import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
+import RadioFilter from "@/components/AgGridCustomFilter/RadioFilter";
+import ListFilter from "@/components/AgGridCustomFilter/ListFilter";
+import RecordButtonCellRender from "@/components/AgGridCellRender/RecordButtonCellRender";
+import {AG_GRID_LOCALE_CN} from "@/utils/AgGridVueLocaleCn";
+import * as API_his from "@/api/ncs_his";
+import {unixToDate} from "@/utils/Foundation";
+
+export default {
+  name: "hisClerkManager",
+  components: { ButtonCellRender, RadioFilter, ListFilter, RecordButtonCellRender },
+  data() {
+    return {
+      pickerOptions: {
+      },
+      tableData: [],
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1,
+      },
+      pageData: [],
+      loading: false,
+      searchDateRange: [],
+      callingType: null,
+      columnDefs: null, // 新表格
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      rowSelection: null,
+      showViewer: false,
+      queryResult: '-1',
+      srcStreaming1: '',
+      srcStreaming2: '',
+      stream1: '',
+      stream2: '',
+      beginSeconds: 0,
+      buttonStr: this.$t('action.play'),
+      dialogVisible: false,
+      streamingType: true,
+      recordDir: '',
+      sexTransfer: [
+        { key: this.$t('member.man'), value: '1', color: 'green' },
+        { key: this.$t('member.woman'), value: '0', color: 'red' }
+      ],
+      roleTypeTransfer: [
+        { key: '医生', value: '1' },
+        { key: '护士', value: '2' },
+        { key: '护工', value: '3' },
+      ],
+      partKeyval: this.$route.params.id
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 130
+    }
+  },
+  beforeMount() {
+    this.gridOptions = {
+    }
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 50,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: this.$t('his.hisClerkKeyval'), field: 'keyval', sortable: false, minWidth: 120 },
+      { headerName: this.$t('his.hisPartKeyval'), field: 'part_keyval', sortable: false, minWidth: 120 },
+      { headerName: this.$t('member.uname'), field: 'name', sortable: false, minWidth: 120 },
+      { headerName: this.$t('role.roleName'), field: 'type', sortable: false, minWidth: 120,
+        filterParams: {
+          listData: this.roleTypeTransfer
+        },
+        cellRenderer: this.roleTypeRenderer },
+      { headerName: this.$t('member.sex'), field: 'sex', sortable: true, filterFramework: 'RadioFilter', minWidth: 80,
+        filterParams: {
+          listData: this.sexTransfer
+        },
+        cellRenderer: this.sexRenderer },
+      { headerName: this.$t('member.birthday'), field: 'birthday', sortable: false, minWidth: 150 },
+      { headerName: this.$t('customerManage.idNo'), field: 'id_no', sortable: true, filter: 'agNumberColumnFilter' },
+      { headerName: this.$t('member.mobile'), field: 'mobile', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('his.passNo'), field: 'pass_no', sortable: false, minWidth: 150 },
+    ]
+    this.defaultColDef = {
+      filter: false,
+      sortable: true,
+      resizable: true,
+      comparator: this.testComparator,
+      filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        textCustomComparator: this.textCustomComparator,
+        comparator: this.testComparator
+      }
+    }
+    this.rowSelection = 'multiple'
+  },
+  mounted() {
+    window.onresize = this.windowResize
+    this.gridApi = this.gridOptions.api
+    this.getList()
+    // this.$refs.video2.addEventListener("pause", this.pause)
+  },
+  methods: {
+    windowResize() {
+      this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      this.gridApi.showLoadingOverlay()
+      this.gridApi.sizeColumnsToFit()
+      if (this.partKeyval !== undefined) {
+        this.params.fixedCondition = 'part_keyval = "' + this.partKeyval + '"'
+      }
+
+      const param = this.MixinClone(this.params)
+      API_his.getClerkList(param).then(response => {
+        this.loading = false
+        this.tableData = [...response.data]
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+      }).catch((error) => {
+        this.loading = false
+      })
+    },
+    /** 处理搜索 */
+    handlerSearch(value) {
+      this.params.page_no = 1
+      this.params.query = value
+      this.getList()
+    },
+    formatterCreateTime(row, column, cellValue) {
+      return unixToDate(row.create_time)
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.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()
+    },
+    changeResult() {
+      this.params.query_result = this.queryResult
+      this.params.page_no = 1
+      this.getList()
+    },
+    /** 性别格式化 **/
+    sexRenderer(params) {
+      if (params.value === null || params.value === undefined) return ''
+      const item = this.sexTransfer.filter(p => p.value === params.value)[0]
+      if (item) {
+        return '<span style="color:' + item.color + ';">' + item.key + '</span>'
+      } else {
+        return this.$t('member.unknown')
+      }
+    },
+    /** 性别格式化 **/
+    roleTypeRenderer(params) {
+      if (params.value === null || params.value === undefined) return ''
+      const item = this.roleTypeTransfer.filter(p => p.value === params.value)[0]
+      if (item) {
+        return item.key
+      } else {
+        return this.$t('member.unknown')
+      }
+    },
+    formatterPartName(param) {
+      let partName = ''
+      API_his.getPartByKeyval(param.value).then(response => {
+        partName = response.name
+      })
+      return partName
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 306 - 0
src/views/ncs-his/his-nurse-config/hisNurseConfigManager.vue

@@ -0,0 +1,306 @@
+<template>
+  <div class="app-container">
+    <el-container :style="{height: tableHeight+'px'}">
+
+      <el-aside width="300px" style="background-color: rgb(238, 241, 246)">
+        <el-table
+            ref="nurseConfigTable"
+            v-loading="listLoading"
+            :data="tagList1"
+            highlight-current-row
+            :height="tableHeight-40"
+            stripe
+            @row-click="tableClick"
+        >
+          <el-table-column prop="name" :label="this.$t('nurseConfig.configName')" width="120px" />
+          <el-table-column
+              width="160px"
+              align="right"
+          >
+
+          </el-table-column>
+        </el-table>
+      </el-aside>
+      <el-main>
+
+        <ag-grid-layout
+            toolbar
+            :table-height="tableHeight-130"
+            theme="ag-theme-alpine"
+            :column-defs="columnDefs"
+            :row-data="tagList2"
+            :locale-text="localeText"
+            :grid-options="gridOptions"
+            :default-col-def="defaultColDef"
+            :animate-rows="true"
+            :row-selection="rowSelection"
+            @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>
+          <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-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
+import * as API_his from "@/api/ncs_his";
+
+export default {
+  name: 'hisNurseConfig',
+  components: {},
+  data() {
+    return {
+      listLoading: false,
+      tagList1: [],
+      tagList2: [],
+      pKeyval: '',
+      type: '',
+      myTitle: '',
+      shopVisible: false,
+      member_tags: null,
+      params: {
+        page_size: 20,
+        page_no: 1,
+        sort: 'id',
+        dir: 'desc'
+      },
+      partId: this.$store.getters.partId,
+      pName: null,
+      /** ag-grid参数 **/
+      pageData: [],
+      loading: false,
+      errorId: null,
+      columnDefs: null,
+      rowData: null,
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      filterState: null,
+      rowSelection: null,
+      partKeyval: this.$route.params.id,
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 40
+    }
+  },
+  beforeMount() {
+    this.gridOptions = {
+    }
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 100,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: this.$t('his.hisNurseOptionsKeyval'), field: 'keyval', sortable: true, filter: 'agNumberColumnFilter', width: 80 },
+      { headerName: this.$t('nurseConfig.optionName'), field: 'name', sortable: true, flex: 1, filter: 'agTextColumnFilter', filterParams: {
+          debounceMs: 200,
+          newRowsAction: 'keep'
+        }
+      },
+      // lockPosition 锁定位置,会在第一列
+      // lockPinned = true 不能拖动然后固定
+      // resizeable 单元个大小是否可以调整
+      { headerName: this.$t('nurseConfig.colorRgb'), field: 'color', sortable: true, filter: false,
+        cellRenderer: this.colorFormatter
+      },
+    ]
+    this.defaultColDef = {
+      filter: 'agTextColumnFilter',
+      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.gettagList1()
+  },
+  methods: {
+    windowResize() {
+      this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
+    },
+    gettagList1() {
+      this.params.sort = 'index_no'
+      this.params.dir = 'asc'
+      if (this.partKeyval !== undefined && this.partKeyval.length > 0) {
+        this.params.fixedCondition = 'part_keyval= "' + this.partKeyval + '"'
+      }
+
+      API_his.getNurseConfigList(this.params).then(response => {
+        this.listLoading = false
+        this.tagList1 = response.data
+
+        if (this.tagList1.length > 0) {
+          if (this.pKeyval === '') {
+            this.pKeyval = this.tagList1[0].keyval
+          }
+          this.pName = this.tagList1[0].name
+          this.gettagList2(this.pKeyval)
+          const currentRow = this.tagList1.find(p => p.keyval === this.pKeyval)
+          this.$refs.nurseConfigTable.setCurrentRow(currentRow)
+        }
+      }).catch(() => {
+        this.listLoading = false
+      })
+    },
+    gettagList2() {
+      if (this.pKeyval !== undefined && this.pKeyval.length > 0) {
+        this.params.fixedCondition = ' category_keyval = "' + this.pKeyval + '"'
+      }
+
+      this.params.sort = 'id'
+      this.params.dir = 'desc'
+      API_his.getNurseOptionsList(this.params).then(response => {
+        this.tagList2 = response.data
+      }).catch(() => {
+      })
+    },
+    tableClick(row, column, event, cell) {
+      if (column.property === 'name') {
+        this.pKeyval = row.keyval
+        this.pName = row.name
+        this.gettagList2()
+      }
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.gettagList2()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.gettagList2()
+    },
+    memberInit() {
+    },
+    openAdvert(index, row) {
+      this.member_tags = row.tag
+      this.shopVisible = true
+    },
+    colorFormatter(param) {
+      console.log('aa', param)
+      return '<button style="width: 120px;height: 30px;vertical-align:middle;border:0;background-color: #' + param.value + '"/>'
+    },
+    /** 处理搜索 */
+    handlerSearch(keywords) {
+      this.params.query = keywords
+      this.gettagList2()
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.gettagList2()
+    },
+    gridSortChange(param) {
+      console.log('sortparam', 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.gettagList2()
+      console.log(sortState)
+    },
+    filterModifed(param) {
+      console.log(param)
+      var model = param.api.getFilterModel()
+      console.log('model', JSON.stringify(model))
+      this.params.filter = JSON.stringify(model)
+      this.gettagList2()
+    },
+  }
+}
+</script>
+
+<style scoped>
+.permission-container {
+  padding: 10px;
+  background-color: #fff;
+}
+.el-aside{
+  padding: 8px 10px;
+}
+.mytable {
+  width: 100%;
+  padding: 20px;
+  min-height: 480px;
+  cursor: pointer;
+  font-size: 16px;
+}
+/deep/ .colorBtn {
+  width: 80px !important;
+  height: 40px !important;
+}
+/deep/ .m-colorPicker .box.open{
+  z-index: 1000 !important;
+}
+</style>

+ 272 - 0
src/views/ncs-his/his-part/hisPartManager.vue

@@ -0,0 +1,272 @@
+<template>
+  <div class="app-container">
+
+    <ag-grid-layout
+        :table-height="tableHeight"
+        theme="ag-theme-alpine"
+        :column-defs="columnDefs"
+        :row-data="tableData"
+        :locale-text="localeText"
+        :grid-options="gridOptions"
+        :default-col-def="defaultColDef"
+        :animate-rows="true"
+        :row-selection="rowSelection"
+        row-height="50"
+        @filterChanged="filterModifed"
+        @sortChanged="gridSortChange"
+    >
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
+        </div>
+      </div>
+      <el-pagination
+          v-if="pageData"
+          slot="pagination"
+          :current-page="pageData.page_no"
+          :page-sizes="[20, 50, 100, 200]"
+          :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>
+  </div>
+</template>
+
+<script>
+import * as API_his from '@/api/ncs_his'
+import { unixToDate } from '@/utils/Foundation'
+import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
+import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
+import RecordButtonCellRender from "@/components/AgGridCellRender/RecordButtonCellRender";
+import RadioFilter from "@/components/AgGridCustomFilter/RadioFilter";
+import ListFilter from "@/components/AgGridCustomFilter/ListFilter";
+import ButtonCellRenderList from "@/components/AgGridCellRender/ButtonCellRenderList";
+const DeviceUrl = domain.DeviceUrl
+
+export default {
+  name: 'hisPartManager',
+  components: { ButtonCellRenderList, ButtonCellRender, RadioFilter, ListFilter, RecordButtonCellRender },
+  data() {
+    return {
+      pickerOptions: {
+      },
+      tableData: [],
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1,
+      },
+      pageData: [],
+      loading: false,
+      searchDateRange: [],
+      callingType: null,
+      columnDefs: null, // 新表格
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      rowSelection: null,
+      showViewer: false,
+      queryResult: '-1',
+      srcStreaming1: '',
+      srcStreaming2: '',
+      stream1: '',
+      stream2: '',
+      beginSeconds: 0,
+      buttonStr: this.$t('action.play'),
+      dialogVisible: false,
+      streamingType: true,
+      recordDir: '',
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 130
+    }
+  },
+  beforeMount() {
+    this.gridOptions = {
+    }
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 50,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: this.$t('his.hisPartKeyval'), field: 'keyval', sortable: false, minWidth: 150 },
+      { headerName: this.$t('his.hisPartName'), field: 'name', sortable: false, minWidth: 150 },
+      { headerName: this.$t('his.summary'), field: 'summary', sortable: false, minWidth: 150 },
+      { headerName: this.$t('his.tel'), field: 'tel', sortable: false, minWidth: 150 },
+      { headerName: this.$t('action.handle'), field: 'id',
+        cellRendererFramework: 'ButtonCellRenderList',
+        cellRendererParams: param => {
+          return {
+            list: [
+              {
+                onClick: this.getHisPatient,
+                label: this.$t('his.hisPatient'),
+                buttonType: 'primary',
+                buttonSize: 'mini'
+              },
+              {
+                onClick: this.getHisClerk,
+                label: this.$t('his.hisClerk'),
+                buttonType: 'warning',
+                buttonSize: 'mini',
+              },
+              {
+                onClick: this.getHisNurseConfig,
+                label: this.$t('his.hisNurseConfig'),
+                buttonType: 'success',
+                buttonSize: 'mini',
+              }
+            ]}
+        },
+        filter: false,
+        pinned: 'right',
+        lockPinned: true,
+        minWidth: this.$i18n.locale === 'zh' ? 240 : 350,
+        resizable: false,
+        sortable: false
+      }
+    ]
+    this.defaultColDef = {
+      filter: false,
+      sortable: true,
+      resizable: true,
+      comparator: this.testComparator,
+      filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        textCustomComparator: this.textCustomComparator,
+        comparator: this.testComparator
+      }
+    }
+    this.rowSelection = 'multiple'
+  },
+  mounted() {
+    window.onresize = this.windowResize
+    this.gridApi = this.gridOptions.api
+    this.getList()
+    // this.$refs.video2.addEventListener("pause", this.pause)
+  },
+  methods: {
+    windowResize() {
+      this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      this.gridApi.showLoadingOverlay()
+      this.gridApi.sizeColumnsToFit()
+      const param = this.MixinClone(this.params)
+      API_his.getList(param).then(response => {
+        this.loading = false
+        this.tableData = [...response.data]
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+      }).catch((error) => {
+        this.loading = false
+      })
+    },
+    getHisPatient(row) {
+      this.$router.push({ name: 'hisPatientManage', params: { id: row.keyval, callback: this.getList() }})
+    },
+    getHisClerk(row) {
+      this.$router.push({ name: 'hisClerkManage', params: { id: row.keyval, callback: this.getList() }})
+    },
+    getHisNurseConfig(row) {
+      this.$router.push({ name: 'hisNurseConfigManage', params: { id: row.keyval, callback: this.getList() }})
+    },
+    /** 处理搜索 */
+    handlerSearch(value) {
+      this.params.page_no = 1
+      this.params.query = value
+      this.getList()
+    },
+    formatterCreateTime(row, column, cellValue) {
+      return unixToDate(row.create_time)
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.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()
+    },
+    changeResult() {
+      this.params.query_result = this.queryResult
+      this.params.page_no = 1
+      this.getList()
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 495 - 0
src/views/ncs-his/his-patient/hisPatientManage.vue

@@ -0,0 +1,495 @@
+<template>
+  <div class="app-container">
+
+    <ag-grid-layout
+        :table-height="tableHeight"
+        theme="ag-theme-alpine"
+        :column-defs="columnDefs"
+        :row-data="tableData"
+        :locale-text="localeText"
+        :grid-options="gridOptions"
+        :default-col-def="defaultColDef"
+        :animate-rows="true"
+        :row-selection="rowSelection"
+        row-height="50"
+        @filterChanged="filterModifed"
+        @sortChanged="gridSortChange"
+    >
+      <div slot="toolbar" class="inner-toolbar">
+        <div class="toolbar-search">
+          <en-table-search :placeholder="this.$t('action.keywords')" @search="handlerSearch" />
+        </div>
+      </div>
+      <el-pagination
+          v-if="pageData"
+          slot="pagination"
+          :current-page="pageData.page_no"
+          :page-sizes="[20, 50, 100, 200]"
+          :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 :visible.sync="customerFormVisible" :title="this.$t('customerManage.customerInfo')" class="customer-dialog" width="60%">
+      <el-form ref="editForm" :model="formmodel" :label-width="this.$i18n.locale === 'zh' ? '120px' : '145px'">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.named')" prop="name">
+              {{ this.formmodel.name }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.cardNo')">
+              {{ this.formmodel.card_no }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('member.sex')" class="form-item-sex">
+              {{ getSex(this.formmodel.sex) }}
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.age')" prop="age">
+              {{ this.formmodel.age + this.formmodel.age_unit }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('member.mobile')" prop="mobile">
+              {{ this.formmodel.mobile }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('member.homeAddress')" prop="address">
+              {{ this.formmodel.address }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('member.birthday')" prop="birthday">
+              {{ this.formmodel.birthday }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.inDate')" prop="in_date">
+              {{ this.formmodel.indate }}
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.idCard')">
+              {{ this.formmodel.id_no }}
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item :label="this.$t('customerManage.frame')" prop="frame_id">
+              {{ this.formmodel.bed_no }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="16">
+            <el-form-item :label="this.$t('customerManage.patientIllnessDesc')">
+              {{ this.formmodel.illness_description }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.doctor')">
+              {{ this.formmodel.doctor_name }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.nurse')">
+              {{ this.formmodel.nurse_name }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.worker')">
+              {{ this.formmodel.worker_name }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row v-if="hisPatientMappingList.length > 0">
+          <el-col v-for="(item, index) in hisPatientMappingList" :key="index" :span="8">
+            <el-form-item :label="item.category_name">
+              <span :style="'color: #' + item.color">{{ item.options_name }}</span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+
+        <el-row>
+
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.babyName')">
+              {{ this.formmodel.baby_name }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.babySex')">
+              {{ getSex(this.formmodel.baby_sex) }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('customerManage.babyBirthday')">
+              {{ this.formmodel.baby_birthday  }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import * as API_his from '@/api/ncs_his'
+import { unixToDate } from '@/utils/Foundation'
+import { AG_GRID_LOCALE_CN } from '@/utils/AgGridVueLocaleCn'
+import ButtonCellRender from "@/components/AgGridCellRender/ButtonCellRender";
+import RecordButtonCellRender from "@/components/AgGridCellRender/RecordButtonCellRender";
+import RadioFilter from "@/components/AgGridCustomFilter/RadioFilter";
+import ListFilter from "@/components/AgGridCustomFilter/ListFilter";
+import {getDevicesByUuid} from "@/api/initialize";
+import * as API_NurseConfig from "@/api/ncs_nurse_config";
+const DeviceUrl = domain.DeviceUrl
+
+export default {
+  name: 'hisPatientManage',
+  components: { ButtonCellRender, RadioFilter, ListFilter, RecordButtonCellRender },
+  data() {
+    return {
+      pickerOptions: {
+      },
+      tableData: [],
+      /** 列表参数 */
+      params: {
+        page_size: 20,
+        page_no: 1,
+      },
+      activeName: 'customerBaseInfo',
+      formmodel: {},
+      pageData: [],
+      nurseconfigSelection: [],
+      loading: false,
+      searchDateRange: [],
+      callingType: null,
+      columnDefs: null, // 新表格
+      defaultColDef: null,
+      gridOptions: null,
+      gridApi: null,
+      columnApi: null,
+      localeText: AG_GRID_LOCALE_CN,
+      rowSelection: null,
+      showViewer: false,
+      queryResult: '-1',
+      srcStreaming1: '',
+      srcStreaming2: '',
+      stream1: '',
+      stream2: '',
+      beginSeconds: 0,
+      buttonStr: this.$t('action.play'),
+      dialogVisible: false,
+      streamingType: true,
+      recordDir: '',
+      sexTransfer: [
+        { key: this.$t('member.man'), value: '1', color: 'green' },
+        { key: this.$t('member.woman'), value: '0', color: 'red' }
+      ],
+      customerStatusTransfer: [
+        { key: this.$t('customerManage.customerStatusTrue'), value: '0', color: 'green' },
+        { key: this.$t('customerManage.customerStatusFalse'), value: '1', color: 'red' }
+      ],
+      partKeyval: this.$route.params.id,
+      partName: '',
+      customerFormVisible: false,
+      hisNurseOptionsList: [],
+      hisPatientMappingList: []
+    }
+  },
+  computed: {
+    tableHeight() {
+      return this.mainAreaHeight - 130
+    }
+  },
+  beforeMount() {
+    this.gridOptions = {
+    }
+    this.columnDefs = [
+      {
+        headerName: '#',
+        headerCheckboxSelection: true,
+        headerCheckboxSelectionFilteredOnly: true,
+        checkboxSelection: true,
+        sortable: false, filter: false,
+        width: 50,
+        resizable: false,
+        valueGetter: this.hashValueGetter
+      },
+      { headerName: this.$t('his.hisPatientKeyval'), field: 'keyval', sortable: false, minWidth: 120 },
+      { headerName: this.$t('his.hisPartKeyval'), field: 'part_keyval', sortable: false, minWidth: 120 },
+      { headerName: this.$t('customerManage.named'), field: 'name', sortable: false, minWidth: 120 },
+      { headerName: this.$t('customerManage.frame'), field: 'bed_no', sortable: false, minWidth: 120 },
+      { headerName: this.$t('member.sex'), field: 'sex', sortable: true, filterFramework: 'RadioFilter', minWidth: 120,
+        filterParams: {
+          listData: this.sexTransfer
+        },
+        cellRenderer: this.sexRenderer },
+      { headerName: this.$t('customerManage.customerStatus'), field: 'status', sortable: true, filterFramework: 'RadioFilter', minWidth: 80,
+        filterParams: {
+          listData: this.customerStatusTransfer
+        },
+        cellRenderer: this.customerStatusRenderer },
+      { headerName: this.$t('member.mobile'), field: 'mobile', sortable: true, filter: 'agTextColumnFilter', minWidth: 120 },
+      { headerName: this.$t('customerManage.age'), field: 'age', sortable: true, filter: 'agNumberColumnFilter', minWidth: 80 },
+      { headerName: this.$t('customerManage.ageUnit'), field: 'age_unit', sortable: true, filter: 'agTextColumnFilter', minWidth: 80 },
+      { headerName: this.$t('member.birthday'), field: 'birthday', sortable: false, minWidth: 120 },
+      { headerName: this.$t('customerManage.cardNo'), field: 'card_no', sortable: false, minWidth: 120 },
+      { headerName: this.$t('customerManage.inDate'), field: 'indate', sortable: true, filter: 'agTextColumnFilter' },
+      { headerName: this.$t('action.handle'), field: 'id',
+        cellRendererFramework: 'ButtonCellRender',
+        cellRendererParams: {
+          onClick: this.handleInfo,
+          label: this.$t('his.hisPatientInfo'),
+          buttonType: 'primary',
+          buttonSize: 'mini'
+        },
+        filter: false,
+        pinned: 'right',
+        lockPinned: true,
+        minWidth: 120,
+        resizable: false,
+        sortable: false
+      }
+    ]
+    this.defaultColDef = {
+      filter: false,
+      sortable: true,
+      resizable: true,
+      comparator: this.testComparator,
+      filterParams: {
+        debounceMs: 200,
+        newRowsAction: 'keep',
+        textCustomComparator: this.textCustomComparator,
+        comparator: this.testComparator
+      }
+    }
+    this.rowSelection = 'multiple'
+  },
+  mounted() {
+    window.onresize = this.windowResize
+    this.gridApi = this.gridOptions.api
+    this.getList()
+    // this.$refs.video2.addEventListener("pause", this.pause)
+  },
+  methods: {
+    windowResize() {
+      this.$set(this, 'mainAreaHeight', Number(document.documentElement.clientHeight) - 84)
+    },
+    /** 分页大小发生改变 */
+    handlePageSizeChange(size) {
+      this.params.page_size = size
+      this.getList()
+    },
+
+    /** 分页页数发生改变 */
+    handlePageCurrentChange(page) {
+      this.params.page_no = page
+      this.getList()
+    },
+    /** 加载列表数据 */
+    getList() {
+      this.loading = true
+      this.gridApi.showLoadingOverlay()
+      this.gridApi.sizeColumnsToFit()
+
+      if (this.partKeyval !== undefined) {
+        this.params.fixedCondition = 'part_keyval = "' + this.partKeyval + '"'
+      }
+
+      const param = this.MixinClone(this.params)
+      API_his.getPatientList(param).then(response => {
+        this.loading = false
+        this.tableData = [...response.data]
+        this.pageData = {
+          page_no: response.page_no,
+          page_size: response.page_size,
+          data_total: response.data_total
+        }
+      }).catch((error) => {
+        this.loading = false
+      })
+    },
+    /** 处理搜索 */
+    handlerSearch(value) {
+      this.params.page_no = 1
+      this.params.query = value
+      this.getList()
+    },
+    formatterCreateTime(row, column, cellValue) {
+      return unixToDate(row.create_time)
+    },
+    /** 处理字段排序 */
+    tableSort(column) {
+      if (column.order !== null) {
+        this.params.sort = column.prop
+        this.params.dir = column.order === 'ascending' ? 'asc' : 'desc'
+      } else {
+        this.params.sort = null
+        this.params.dir = null
+      }
+      this.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()
+    },
+    changeResult() {
+      this.params.query_result = this.queryResult
+      this.params.page_no = 1
+      this.getList()
+    },
+    /** 性别格式化 **/
+    sexRenderer(params) {
+      if (params.value === null || params.value === undefined) return ''
+      const item = this.sexTransfer.filter(p => p.value === params.value)[0]
+      if (item) {
+        return '<span style="color:' + item.color + ';">' + item.key + '</span>'
+      } else {
+        return this.$t('member.unknown')
+      }
+    },
+    getSex(value) {
+      if (value === null || value === undefined) return ''
+      const item = this.sexTransfer.filter(p => p.value ===value)[0]
+      if (item) {
+        return item.key
+      } else {
+        return this.$t('member.unknown')
+      }
+    },
+    /** 状态格式化 **/
+    customerStatusRenderer(params) {
+      if (params.value === null || params.value === undefined) return ''
+      const item = this.customerStatusTransfer.filter(p => p.value === params.value)[0]
+      if (item) {
+        return '<span style="color:' + item.color + ';">' + item.key + '</span>'
+      } else {
+        return this.$t('member.unknown')
+      }
+    },
+    handleInfo(row) {
+      this.boolDevice = false
+      this.formmodel = {
+        ...row
+      }
+
+      console.log(this.formmodel)
+      this.getPatientNurseMappingByPatientKeyval(this.formmodel.keyval)
+      // // 处理护理项已选择内容
+      // const nurseconfigs = this.formmodel.nurseconfigs
+      // for (let i = 0; i < this.nurseconfigSelection.length; i++) {
+      //   delete this.nurseconfigSelection[i].selected_id
+      //   delete this.nurseconfigSelection[i].mapping_id
+      // }
+      // if (nurseconfigs) {
+      //   nurseconfigs.forEach(item => {
+      //     const nurseconfigselect = this.nurseconfigSelection.find(p => p.config.id === item.nurseconfig_id)
+      //     if (nurseconfigselect) {
+      //       nurseconfigselect.selected_id = item.nurseconfig_option_id
+      //       nurseconfigselect.mapping_id = item.mapping_id
+      //     }
+      //   })
+      // }
+      this.customerFormVisible = true
+      // this.handNusreColor()
+    },
+
+    /**
+     * 加载护理参数
+     */
+    getNurseConfigs() {
+      this.nurseData = []
+      API_NurseConfig.getConfigSelectionByPartId(this.$store.getters.partId).then(res => {
+        this.nurseconfigSelection = [...res]
+      })
+    },
+    // 护理项选择 设置选中项的颜色
+    changeNurseData(val, configid, index) {
+      const currentCfg = this.nurseconfigSelection.find(p => p.config.id === configid).options.find(p => p.id === val)
+      if (currentCfg) {
+        this.$refs['patient_nurse_' + configid][0].$el.getElementsByClassName('el-input__inner')[0].style = 'color:#' + currentCfg.color_rgb + ' !important'
+      }
+      this.$set(this, 'nurseconfigSelection', this.nurseconfigSelection)
+      this.$set(this.nurseconfigSelection, index, this.nurseconfigSelection[index])
+    },
+    // 初始化护理参数选中项颜色
+    handNusreColor() {
+      // 处理护理等级颜色
+      this.$nextTick(() => {
+        this.nurseconfigSelection.forEach(item => {
+          const currentCfg = this.nurseconfigSelection.find(p => p.config.id === item.config.id).options.find(p => p.id === item.selected_id)
+          if (currentCfg) {
+            this.$refs['patient_nurse_' + item.config.id][0].$el.getElementsByClassName('el-input__inner')[0].style = 'color:#' + currentCfg.color_rgb + ' !important'
+          }
+        })
+      })
+    },
+    getPatientNurseMappingByPatientKeyval(patientKeyval) {
+      API_his.getPatientNurseMappingByPatientKeyval(patientKeyval).then(res => {
+        this.hisPatientMappingList = res
+        console.log(this.hisPatientMappingList)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 48 - 0
src/views/ncs-his/hisManagement.vue

@@ -0,0 +1,48 @@
+<template>
+  <el-tabs v-model="activeName" style="margin:0;" type="border-card">
+    <el-tab-pane :label="this.$t('his.hisPart')" name="hisPart">
+      <keep-alive>
+        <his-part-manager :frame="frame" />
+      </keep-alive>
+    </el-tab-pane>
+    <el-tab-pane :label="this.$t('his.hisPatient')" name="hisPatient">
+      <keep-alive>
+        <his-patient-manager :frame="frame" />
+      </keep-alive>
+    </el-tab-pane>
+    <el-tab-pane :label="this.$t('his.hisClerk')" name="hisClerk">
+      <keep-alive>
+        <his-clerk-manager :frame="frame" />
+      </keep-alive>
+    </el-tab-pane>
+    <el-tab-pane :label="this.$t('his.hisNurseConfig')" name="hisNurseConfig">
+      <keep-alive>
+        <his-nurse-config-manager :frame="frame" />
+      </keep-alive>
+    </el-tab-pane>
+  </el-tabs>
+</template>
+
+<script>
+import HisPartManager from './his-part/hisPartManager'
+import HisPatientManager from './his-patient/hisPatientManage'
+import HisClerkManager from './his-clerk/hisClerkManager'
+import HisNurseConfigManager from './his-nurse-config/hisNurseConfigManager'
+export default {
+  name: 'hisManager',
+  components: { HisPartManager, HisPatientManager, HisClerkManager, HisNurseConfigManager },
+  data() {
+    return {
+      frame: {},
+      activeName: 'hisPart',
+      loading: false
+    }
+  },
+  methods: {
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

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

@@ -398,7 +398,7 @@ export default {
         }
         return named
       } else {
-        return row.data.from_member_name + '的' + row.data.relative_name
+        return row.data.from_member_name + this.$t('action.of') + row.data.relative_name
       }
     },
     formatterToName(row) {
@@ -445,6 +445,7 @@ export default {
       }
     },
     formatterResponseTime(params) {
+      console.log(params.data)
       let responseTime = 0;
       if (params.data.action_end !== null) {
         if (params.data.action_type === TCP_TYPE.VOICE ||
@@ -452,10 +453,14 @@ export default {
             params.data.action_type === TCP_TYPE.PHONE
         ) {
           if (params.data.action_start !== null && params.data.action_accept !== null) {
+            console.log("params.data.action_accept : " +  params.data.action_accept)
+            console.log("params.data.action_start : " + params.data.action_start)
             responseTime = params.data.action_accept - params.data.action_start
             return this.formateSeconds(responseTime)
           }
         } else {
+          console.log("params.data.action_end : " +  params.data.action_end)
+          console.log("params.data.action_start : " + params.data.action_start)
           responseTime = params.data.action_end - params.data.action_start
           return this.formateSeconds(responseTime)
         }
@@ -548,13 +553,13 @@ export default {
     },
     daochu() {
       const _this = this
-      this.$confirm('将导出交互信息Excel文件,是否继续?', '提示', {
+      this.$confirm(this.$t('action.excelFile'), this.$t('action.prompt'), {
         type: 'warning'
       }).then(() => {
         _this.loading = true
         const params = _this.MixinClone(_this.params)
         if (!params.start_date || !params.end_date) {
-          _this.$message.info('请选择时间范围!')
+          _this.$message.info(this.$t('action.timeMsg'))
           return
         }
         params.page_size = this.pageData.data_total
@@ -562,11 +567,10 @@ export default {
         API_interaction.getList(params).then(res => {
           _this.loading = false
           import('@/vendor/Export2Excel').then(excel => {
-            const tHeader = [this.$t('interaction.fromMemberName'), this.$t('interaction.toMemberName'), this.$t('interaction.actionType'),
-              this.$t('interaction.actionEnd'), this.$t('interaction.data'), this.$t('interaction.responseTime'),
+            const tHeader = [this.$t('interaction.fromMemberName'), this.$t('interaction.toMemberName'), this.$t('interaction.actionType'), this.$t('interaction.actionEnd'), this.$t('interaction.data'),
               this.$t('interaction.createDate')] // 表头
-            const filterVal = ['fromMemberName', 'toMemberName', 'action_type', 'action_end', 'data', 'responseTime', 'create_date']
-            const tit = params.start_date + '至' + params.end_date + '交互记录'
+            const filterVal = ['fromMemberName', 'toMemberName', 'action_type', 'action_end', 'data', 'create_date']
+            const tit = params.start_date + this.$t('action.to') + params.end_date + this.$t('interaction.interactionRecord')
             const data = _this.formatJson(filterVal, res.data)
             excel.export_json_to_excel({
               header: tHeader,
@@ -584,11 +588,11 @@ export default {
           return this.formatterFromName({data: v})
         } else if (j === 'toMemberName') {
           return this.formatterToName({data: v})
-        } else if (j === 'action_type') {
+        }else if (j === 'action_type') {
           return this.formatterType({value: v[j]})
-        } else if (j === 'action_end') {
+        }else if (j === 'action_end') {
           return this.formatterResult2(v[j])
-        } else if (j === 'create_date') {
+        }else if (j === 'create_date') {
           return this.formatterDate({value: v[j]})
         } else if (j === 'responseTime') {
           console.log(v)

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

@@ -528,21 +528,21 @@
               </el-form-item>
             </el-col>
 
-            <el-col :span="8">
-              <el-form-item :label="this.$t('action.excelUpload')">
-                <el-upload
-                    class="excel-uploader"
-                    :action="`${excelUploadUrl}`"
-                    :show-file-list="false"
-                    :on-success="excelUploaded"
-                    :before-upload="handleExcelBefore"
-                    :limit="1"
-                >
-                  <el-button size="small" type="primary">{{ this.$t('action.uploadFile') }}</el-button>
-                </el-upload>
-                <el-link :href="excelUploadDemo" type="primary" target="_blank" icon="el-icon-download" :underline="false">excel表格模板</el-link>
-              </el-form-item>
-            </el-col>
+<!--            <el-col :span="8">-->
+<!--              <el-form-item :label="this.$t('action.excelUpload')">-->
+<!--                <el-upload-->
+<!--                    class="excel-uploader"-->
+<!--                    :action="`${excelUploadUrl}`"-->
+<!--                    :show-file-list="false"-->
+<!--                    :on-success="excelUploaded"-->
+<!--                    :before-upload="handleExcelBefore"-->
+<!--                    :limit="1"-->
+<!--                >-->
+<!--                  <el-button size="small" type="primary">{{ this.$t('action.uploadFile') }}</el-button>-->
+<!--                </el-upload>-->
+<!--                <el-link :href="excelUploadDemo" type="primary" target="_blank" icon="el-icon-download" :underline="false">excel表格模板</el-link>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
           </el-row>
         </fieldset>
 

+ 1 - 1
src/views/ncs-orginazition/index.vue

@@ -239,7 +239,7 @@ export default {
         filter: false,
         pinned: 'right',
         lockPinned: true,
-        minWidth: this.$i18n.locale === 'zh' ? 230 : 310,
+        minWidth: this.$i18n.locale === 'zh' ? 230 : 330,
         resizable: false,
         sortable: false },
 

+ 4 - 4
src/views/ncs-remark/index.vue

@@ -107,7 +107,7 @@
                 userInfo: this.$store.getters.userInfo,
                 content: null,
                 rules: {
-                    content: [{required: true, message: '请输入备注内容', trigger: 'blur'}],
+                    content: [{required: true, message: this.$t('customerManage.inputRemarks'), trigger: 'blur'}],
                 },
               remarkContent: this.$t('remark.remarkContent'),
               remarkCreateTime: this.$t('remark.remarkCreateTime'),
@@ -212,11 +212,11 @@
                     const isImg = hz === 'jpeg' || hz === 'png' || hz === 'jpg' || hz === 'txt'  || hz === 'doc' || hz === 'docx' || hz === 'xls' || hz === '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('action.uploaderImg'))
                         reject()
                     }
                     if (!isLt5M) {
-                        _this.$message.error('上传附件大小不能超过 5MB!')
+                        _this.$message.error(this.$t('action.uploaderSize'))
                         reject()
                     }
                     resolve()
@@ -224,7 +224,7 @@
             },
             addRemark() {
                 if (!this.content) {
-                    this.$message.info('请输入内容!')
+                    this.$message.info(this.$t('action.inputMsg'))
                     return
                 }
                 if (!this.filePath) {