Browse Source

refactor(硬件管理):
- 移除rfid管理和工卡管理

refactor(点位管理):
- 列表新增点位录入
- 新增点位和修改点位新增直接刷点位rfid进行录入

周文健 8 tháng trước cách đây
mục cha
commit
6150e05509
62 tập tin đã thay đổi với 784 bổ sung9278 xóa
  1. 0 4182
      app/src/main/assets/i18n/en-US.json
  2. 0 4182
      app/src/main/assets/i18n/zh-CN.json
  3. 0 34
      app/src/main/assets/preset/preset_sys_role.json
  4. 9 15
      app/src/main/java/com/grkj/iscs/ISCSApplication.kt
  5. 4 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/QuickEntranceConfigDialog.kt
  6. 6 9
      app/src/main/java/com/grkj/iscs/features/main/dialog/SwipCardOperationTipDialog.kt
  7. 48 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/SwipRfidOperationTipDialog.kt
  8. 8 8
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  9. 43 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  10. 44 7
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt
  11. 84 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  12. 12 12
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/HardwareManageHomeFragment.kt
  13. 14 29
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt
  14. 6 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  15. 3 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt
  16. 80 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt
  17. 2 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/MyTodoViewModel.kt
  18. 11 2
      app/src/main/res/layout-land/fragment_point_manage.xml
  19. 18 0
      app/src/main/res/layout-land/item_point_manage_point.xml
  20. 1 0
      app/src/main/res/layout-land/item_quick_entrance_config.xml
  21. 1 0
      app/src/main/res/layout-land/item_quick_entrance_not_config.xml
  22. 1 1
      app/src/main/res/layout/dialog_change_lang.xml
  23. 0 0
      app/src/main/res/layout/dialog_swip_card_operation_tip.xml
  24. 0 0
      app/src/main/res/layout/dialog_swip_rfid_operation_tip.xml
  25. 8 0
      app/src/main/res/layout/fragment_point_manage.xml
  26. 11 2
      app/src/main/res/layout/fragment_user_manage.xml
  27. 21 2
      app/src/main/res/layout/item_point_manage_point.xml
  28. 1 0
      app/src/main/res/layout/item_quick_entrance_config.xml
  29. 1 0
      app/src/main/res/layout/item_quick_entrance_not_config.xml
  30. 51 2
      app/src/main/res/layout/item_user_manage_user.xml
  31. 7 0
      app/src/main/res/values-en/strings.xml
  32. 7 0
      app/src/main/res/values-zh/strings.xml
  33. 6 0
      app/src/main/res/values/strings.xml
  34. 6 0
      data/src/main/java/com/grkj/data/dao/HardwareDao.kt
  35. 6 0
      data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt
  36. 6 0
      data/src/main/java/com/grkj/data/dao/RfidTokenDao.kt
  37. 1 3
      data/src/main/java/com/grkj/data/enums/RoleEnum.kt
  38. 6 1
      data/src/main/java/com/grkj/data/logic/IHardwareLogic.kt
  39. 5 0
      data/src/main/java/com/grkj/data/logic/IIsolationPointLogic.kt
  40. 5 0
      data/src/main/java/com/grkj/data/logic/IRfidTokenLogic.kt
  41. 5 1
      data/src/main/java/com/grkj/data/logic/impl/network/NetworkHardwareLogic.kt
  42. 4 0
      data/src/main/java/com/grkj/data/logic/impl/network/NetworkIsolationPointLogic.kt
  43. 4 0
      data/src/main/java/com/grkj/data/logic/impl/network/NetworkRfidTokenLogic.kt
  44. 6 2
      data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt
  45. 9 1
      data/src/main/java/com/grkj/data/logic/impl/standard/IsolationPointLogic.kt
  46. 4 0
      data/src/main/java/com/grkj/data/logic/impl/standard/RfidTokenLogic.kt
  47. 0 39
      data/src/main/java/com/grkj/data/logic/impl/standard/SysMenuLogic.kt
  48. 16 4
      data/src/main/java/com/grkj/data/model/local/TodoStepJoin.kt
  49. 124 59
      shared/src/main/java/com/grkj/shared/utils/i18n/I18nManager.kt
  50. 11 10
      shared/src/main/java/com/grkj/shared/utils/i18n/I18nRepository.kt
  51. 0 85
      shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonImporter.kt
  52. 0 39
      shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonMerger.kt
  53. 0 158
      shared/src/main/java/com/grkj/shared/utils/i18n/source/AssetsI18nSource.kt
  54. 0 148
      shared/src/main/java/com/grkj/shared/utils/i18n/source/FileI18nSource.kt
  55. 25 0
      shared/src/main/java/com/grkj/shared/utils/i18n/source/XmlResourcesI18nSource.kt
  56. 0 210
      shared/src/main/java/com/grkj/shared/utils/i18n/util/JsonUtils.kt
  57. 14 3
      ui-base/src/main/java/com/grkj/ui_base/utils/CommonUtils.kt
  58. 7 5
      ui-base/src/main/res/values-en/strings.xml
  59. 5 3
      ui-base/src/main/res/values-zh/strings.xml
  60. 1 0
      ui-base/src/main/res/values/attrs.xml
  61. 5 3
      ui-base/src/main/res/values/strings.xml
  62. 1 0
      ui-base/src/main/res/values/theme.xml

+ 0 - 4182
app/src/main/assets/i18n/en-US.json

@@ -1,4182 +0,0 @@
-{
-  "i18n.language_name": {
-    "key": "i18n.language_name",
-    "type": "text",
-    "value": "English"
-  },
-  "abnormal": {
-    "key": "abnormal",
-    "type": "text",
-    "value": "Abnormal"
-  },
-  "password_login": {
-    "key": "password_login",
-    "type": "text",
-    "value": "Password Login"
-  },
-  "action_confirm": {
-    "key": "action_confirm",
-    "type": "text",
-    "value": "Action Confirmation"
-  },
-  "action_confirm_content": {
-    "key": "action_confirm_content",
-    "type": "text",
-    "value": "Are you sure you want to perform {0}?"
-  },
-  "action_failed": {
-    "key": "action_failed",
-    "type": "text",
-    "value": "Action Failed"
-  },
-  "action_hint": {
-    "key": "action_hint",
-    "type": "text",
-    "value": "Action Notification"
-  },
-  "action_succeed": {
-    "key": "action_succeed",
-    "type": "text",
-    "value": "Action Successful"
-  },
-  "add_card_failed": {
-    "key": "add_card_failed",
-    "type": "text",
-    "value": "Failed to Add Card"
-  },
-  "add_card_succeed": {
-    "key": "add_card_succeed",
-    "type": "text",
-    "value": "Card Added Successfully"
-  },
-  "add_colocker": {
-    "key": "add_colocker",
-    "type": "text",
-    "value": "Add Co-lock User ({0})"
-  },
-  "add_group": {
-    "key": "add_group",
-    "type": "text",
-    "value": "+Group"
-  },
-  "add_key_failed": {
-    "key": "add_key_failed",
-    "type": "text",
-    "value": "Failed to Add Key"
-  },
-  "add_key_succeed": {
-    "key": "add_key_succeed",
-    "type": "text",
-    "value": "Key Added Successfully"
-  },
-  "add_lock_failed": {
-    "key": "add_lock_failed",
-    "type": "text",
-    "value": "Failed to Add Padlock"
-  },
-  "add_lock_succeed": {
-    "key": "add_lock_succeed",
-    "type": "text",
-    "value": "Padlock Added Successfully"
-  },
-  "add_point_failed": {
-    "key": "add_point_failed",
-    "type": "text",
-    "value": "Failed to Add Isolation Point"
-  },
-  "add_point_succeed": {
-    "key": "add_point_succeed",
-    "type": "text",
-    "value": "Isolation Point Added Successfully"
-  },
-  "add_rfid_token_failed": {
-    "key": "add_rfid_token_failed",
-    "type": "text",
-    "value": "Failed to Add RFID Tag"
-  },
-  "add_rfid_token_succeed": {
-    "key": "add_rfid_token_succeed",
-    "type": "text",
-    "value": "RFID Tag Added Successfully"
-  },
-  "add_role_failed": {
-    "key": "add_role_failed",
-    "type": "text",
-    "value": "Failed to Add Role"
-  },
-  "add_role_succeed": {
-    "key": "add_role_succeed",
-    "type": "text",
-    "value": "Role Added Successfully"
-  },
-  "add_user_succeed": {
-    "key": "add_user_succeed",
-    "type": "text",
-    "value": "User Added Successfully"
-  },
-  "add_workstation_failed": {
-    "key": "add_workstation_failed",
-    "type": "text",
-    "value": "Failed to Add Area"
-  },
-  "add_workstation_succeed": {
-    "key": "add_workstation_succeed",
-    "type": "text",
-    "value": "Area Added Successfully"
-  },
-  "admin_role_can_not_edit": {
-    "key": "admin_role_can_not_edit",
-    "type": "text",
-    "value": "Administrator Role Cannot Be Edited"
-  },
-  "admin_username": {
-    "key": "admin_username",
-    "type": "text",
-    "value": "Admin Account: (Numbers, Letters, 6–20 characters)"
-  },
-  "all": {
-    "key": "all",
-    "type": "text",
-    "value": "All"
-  },
-  "all_hardware_tv": {
-    "key": "all_hardware_tv",
-    "type": "text",
-    "value": "All Hardware"
-  },
-  "all_job_tv": {
-    "key": "all_job_tv",
-    "type": "text",
-    "value": "All Jobs"
-  },
-  "all_points_tv": {
-    "key": "all_points_tv",
-    "type": "text",
-    "value": "All Points"
-  },
-  "all_quick_entrance": {
-    "key": "all_quick_entrance",
-    "type": "text",
-    "value": "All Shortcuts"
-  },
-  "all_select_not_all_select": {
-    "key": "all_select_not_all_select",
-    "type": "text",
-    "value": "Select All"
-  },
-  "already_colock": {
-    "key": "already_colock",
-    "type": "text",
-    "value": "Co-locked ({0})"
-  },
-  "already_uncolock": {
-    "key": "already_uncolock",
-    "type": "text",
-    "value": "Co-lock Released ({0})"
-  },
-  "back": {
-    "key": "back",
-    "type": "text",
-    "value": "Back"
-  },
-  "base_info_title": {
-    "key": "base_info_title",
-    "type": "text",
-    "value": "Basic Information"
-  },
-  "ble_connect_fail": {
-    "key": "ble_connect_fail",
-    "type": "text",
-    "value": "Connection Failed, Please Retry!"
-  },
-  "ble_connecting": {
-    "key": "ble_connecting",
-    "type": "text",
-    "value": "Connecting, Please Wait..."
-  },
-  "can_not_remove_current_colocker": {
-    "key": "can_not_remove_current_colocker",
-    "type": "text",
-    "value": "Cannot Remove Current Co-lock User"
-  },
-  "can_not_remove_current_locker": {
-    "key": "can_not_remove_current_locker",
-    "type": "text",
-    "value": "Cannot Remove Current Locker"
-  },
-  "cancel": {
-    "key": "cancel",
-    "type": "text",
-    "value": "Cancel"
-  },
-  "cancel_countdown": {
-    "key": "cancel_countdown",
-    "type": "text",
-    "value": "Cancel ({0}s)"
-  },
-  "cancel_exception": {
-    "key": "cancel_exception",
-    "type": "text",
-    "value": "Cancel Exception"
-  },
-  "cancel_exception_failed": {
-    "key": "cancel_exception_failed",
-    "type": "text",
-    "value": "Failed to Cancel Exception"
-  },
-  "cancel_exception_success": {
-    "key": "cancel_exception_success",
-    "type": "text",
-    "value": "Exception Cancelled Successfully"
-  },
-  "cancel_job": {
-    "key": "cancel_job",
-    "type": "text",
-    "value": "Cancel Job"
-  },
-  "cancel_job_tip": {
-    "key": "cancel_job_tip",
-    "type": "text",
-    "value": "Are you sure you want to cancel the current job?"
-  },
-  "capture_tip_content": {
-    "key": "capture_tip_content",
-    "type": "text",
-    "value": "1. The system will automatically take a photo. During the process, please ensure:\n       · Face is facing the camera\n       · Maintain an appropriate distance so the entire face fits within the left frame\n       · Adequate lighting\n       · Natural expression \n 2. After the photo is taken, you can click the Confirm button to submit, or click the Retake button to take the photo again. \n 3. To cancel enrollment, please click the Cancel button."
-  },
-  "capture_tip_title": {
-    "key": "capture_tip_title",
-    "type": "text",
-    "value": "Capture Prompt"
-  },
-  "card_already_registration": {
-    "key": "card_already_registration",
-    "type": "text",
-    "value": "Card Already Registered"
-  },
-  "card_code": {
-    "key": "card_code",
-    "type": "text",
-    "value": "Card Name"
-  },
-  "card_login": {
-    "key": "card_login",
-    "type": "text",
-    "value": "Card Login"
-  },
-  "card_manage_card_detail_title": {
-    "key": "card_manage_card_detail_title",
-    "type": "text",
-    "value": "Card Details"
-  },
-  "card_manage_delete_failed": {
-    "key": "card_manage_delete_failed",
-    "type": "text",
-    "value": "Failed to Delete Card"
-  },
-  "card_manage_delete_succeed": {
-    "key": "card_manage_delete_succeed",
-    "type": "text",
-    "value": "Card Deleted Successfully"
-  },
-  "card_manage_new_card_title": {
-    "key": "card_manage_new_card_title",
-    "type": "text",
-    "value": "Add New Card"
-  },
-  "card_manage_title": {
-    "key": "card_manage_title",
-    "type": "text",
-    "value": "Card Management"
-  },
-  "card_nfc": {
-    "key": "card_nfc",
-    "type": "text",
-    "value": "Card NFC"
-  },
-  "change_to_standard": {
-    "key": "change_to_standard",
-    "type": "text",
-    "value": "Switch to Standard Version"
-  },
-  "check_before_unlocking": {
-    "key": "check_before_unlocking",
-    "type": "text",
-    "value": "Pre-Unlocking Check"
-  },
-  "check_delete_card": {
-    "key": "check_delete_card",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected card?"
-  },
-  "check_delete_job": {
-    "key": "check_delete_job",
-    "type": "text",
-    "value": "Are you sure you want to delete the job?"
-  },
-  "check_delete_key": {
-    "key": "check_delete_key",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected key?"
-  },
-  "check_delete_lock": {
-    "key": "check_delete_lock",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected padlock?"
-  },
-  "check_delete_point": {
-    "key": "check_delete_point",
-    "type": "text",
-    "value": "Are you sure you want to delete the isolation point?"
-  },
-  "check_delete_rfid_token": {
-    "key": "check_delete_rfid_token",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected RFID tag?"
-  },
-  "check_delete_role": {
-    "key": "check_delete_role",
-    "type": "text",
-    "value": "Are you sure you want to delete the role?"
-  },
-  "check_delete_sop": {
-    "key": "check_delete_sop",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected SOP?"
-  },
-  "check_delete_user": {
-    "key": "check_delete_user",
-    "type": "text",
-    "value": "Are you sure you want to delete the user?"
-  },
-  "check_delete_workflow_mode": {
-    "key": "check_delete_workflow_mode",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected workflow mode?"
-  },
-  "check_delete_workstation": {
-    "key": "check_delete_workstation",
-    "type": "text",
-    "value": "Are you sure you want to delete the area \"{0}\"?"
-  },
-  "check_device_info": {
-    "key": "check_device_info",
-    "type": "text",
-    "value": "Detected {0} unregistered keys, {1} unregistered padlocks"
-  },
-  "check_key_and_lock": {
-    "key": "check_key_and_lock",
-    "type": "text",
-    "value": "Checking Keys and Padlocks"
-  },
-  "check_lock_is_new_device": {
-    "key": "check_lock_is_new_device",
-    "type": "text",
-    "value": "Checking if Padlock is New Device"
-  },
-  "check_new_key_need_register": {
-    "key": "check_new_key_need_register",
-    "type": "text",
-    "value": "New Key Detected. Register Now?"
-  },
-  "check_new_lock_need_register": {
-    "key": "check_new_lock_need_register",
-    "type": "text",
-    "value": "New Padlock Detected. Register Now?"
-  },
-  "close": {
-    "key": "close",
-    "type": "text",
-    "value": "Close"
-  },
-  "colock": {
-    "key": "colock",
-    "type": "text",
-    "value": "Add Co-lock"
-  },
-  "colock_complete": {
-    "key": "colock_complete",
-    "type": "text",
-    "value": "Co-lock Added Successfully"
-  },
-  "colock_failed": {
-    "key": "colock_failed",
-    "type": "text",
-    "value": "Failed to Add Co-lock"
-  },
-  "colocker": {
-    "key": "colocker",
-    "type": "text",
-    "value": "Co-lock User"
-  },
-  "confirm": {
-    "key": "confirm",
-    "type": "text",
-    "value": "Confirm"
-  },
-  "confirm_cancel_exception": {
-    "key": "confirm_cancel_exception",
-    "type": "text",
-    "value": "Are you sure you want to cancel the exception?"
-  },
-  "confirm_create_lock_job": {
-    "key": "confirm_create_lock_job",
-    "type": "text",
-    "value": "Confirm Creating Locking Job?"
-  },
-  "confirm_create_unlock_job": {
-    "key": "confirm_create_unlock_job",
-    "type": "text",
-    "value": "Confirm Creating Unlocking Job?"
-  },
-  "confirm_handle_exception": {
-    "key": "confirm_handle_exception",
-    "type": "text",
-    "value": "Are you sure you want to handle the exception?"
-  },
-  "confirm_to_colock": {
-    "key": "confirm_to_colock",
-    "type": "text",
-    "value": "Should {0} confirm co-locking?"
-  },
-  "confirm_to_uncolock": {
-    "key": "confirm_to_uncolock",
-    "type": "text",
-    "value": "Should {0} confirm releasing co-lock?"
-  },
-  "continue_the_ticket": {
-    "key": "continue_the_ticket",
-    "type": "text",
-    "value": "Please Continue Completing the Work Permit"
-  },
-  "create_job_failed": {
-    "key": "create_job_failed",
-    "type": "text",
-    "value": "Failed to Create Job"
-  },
-  "create_job_name": {
-    "key": "create_job_name",
-    "type": "text",
-    "value": "Job Name"
-  },
-  "create_job_title": {
-    "key": "create_job_title",
-    "type": "text",
-    "value": "Create New Job"
-  },
-  "create_sop_job_sop": {
-    "key": "create_sop_job_sop",
-    "type": "text",
-    "value": "SOP"
-  },
-  "create_sop_job_tip": {
-    "key": "create_sop_job_tip",
-    "type": "text",
-    "value": "Are you sure you want to execute job \"{0}\"?"
-  },
-  "create_sop_job_title": {
-    "key": "create_sop_job_title",
-    "type": "text",
-    "value": "Create New SOP Job"
-  },
-  "create_sop_name": {
-    "key": "create_sop_name",
-    "type": "text",
-    "value": "SOP Name"
-  },
-  "create_sop_title": {
-    "key": "create_sop_title",
-    "type": "text",
-    "value": "Create New SOP"
-  },
-  "current_job_has_cross_job": {
-    "key": "current_job_has_cross_job",
-    "type": "text",
-    "value": "Warning! Current job overlaps with another. Continue handling exception?"
-  },
-  "current_role_no_user": {
-    "key": "current_role_no_user",
-    "type": "text",
-    "value": "No Users Assigned to Current Role"
-  },
-  "current_slot_has_no_key": {
-    "key": "current_slot_has_no_key",
-    "type": "text",
-    "value": "No Key in Current Slot"
-  },
-  "current_slot_has_no_lock": {
-    "key": "current_slot_has_no_lock",
-    "type": "text",
-    "value": "No Padlock in Current Slot"
-  },
-  "current_sop_has_job_in_progress": {
-    "key": "current_sop_has_job_in_progress",
-    "type": "text",
-    "value": "Current SOP Has Ongoing Job"
-  },
-  "current_ticket_report_lock_take_exception_tip": {
-    "key": "current_ticket_report_lock_take_exception_tip",
-    "type": "text",
-    "value": "Padlock Exception Reported in Current Job. Please Return Padlock"
-  },
-  "current_user_has_not_face_data": {
-    "key": "current_user_has_not_face_data",
-    "type": "text",
-    "value": "Current User Has No Face Data"
-  },
-  "current_workflow_mode_error": {
-    "key": "current_workflow_mode_error",
-    "type": "text",
-    "value": "Current Workflow Mode Error"
-  },
-  "currently_no_hardware_can_be_report": {
-    "key": "currently_no_hardware_can_be_report",
-    "type": "text",
-    "value": "No Hardware Available for Reporting"
-  },
-  "currently_no_job_can_be_report": {
-    "key": "currently_no_job_can_be_report",
-    "type": "text",
-    "value": "No Job Available for Reporting"
-  },
-  "currently_unable_to_lock_together": {
-    "key": "currently_unable_to_lock_together",
-    "type": "text",
-    "value": "Unable to Co-lock at Current Stage"
-  },
-  "data_content_error": {
-    "key": "data_content_error",
-    "type": "text",
-    "value": "Data Content Error"
-  },
-  "data_decrypt_failed": {
-    "key": "data_decrypt_failed",
-    "type": "text",
-    "value": "Data Decryption Failed"
-  },
-  "data_file_is_corrupted": {
-    "key": "data_file_is_corrupted",
-    "type": "text",
-    "value": "Data File Corrupted"
-  },
-  "data_file_not_exists": {
-    "key": "data_file_not_exists",
-    "type": "text",
-    "value": "Data File Does Not Exist"
-  },
-  "date": {
-    "key": "date",
-    "type": "text",
-    "value": "{0}-{1}-{2}"
-  },
-  "delete": {
-    "key": "delete",
-    "type": "text",
-    "value": "Delete"
-  },
-  "delete_group": {
-    "key": "delete_group",
-    "type": "text",
-    "value": "Delete"
-  },
-  "delete_success": {
-    "key": "delete_success",
-    "type": "text",
-    "value": "Deleted Successfully"
-  },
-  "detail": {
-    "key": "detail",
-    "type": "text",
-    "value": "Details"
-  },
-  "detect_face_tip": {
-    "key": "detect_face_tip",
-    "type": "text",
-    "value": "Face Detected. Capturing Soon"
-  },
-  "detect_port": {
-    "key": "detect_port",
-    "type": "text",
-    "value": "Scanning Devices..."
-  },
-  "detect_slot": {
-    "key": "detect_slot",
-    "type": "text",
-    "value": "Detecting Slot"
-  },
-  "device_in_detect": {
-    "key": "device_in_detect",
-    "type": "text",
-    "value": "Device Recognition in Progress"
-  },
-  "do_you_want_to_remove_exception": {
-    "key": "do_you_want_to_remove_exception",
-    "type": "text",
-    "value": "Are you sure you want to remove this exception?"
-  },
-  "doing_checking": {
-    "key": "doing_checking",
-    "type": "text",
-    "value": "Verifying..."
-  },
-  "doing_login": {
-    "key": "doing_login",
-    "type": "text",
-    "value": "Logging In..."
-  },
-  "done_header": {
-    "key": "done_header",
-    "type": "text",
-    "value": "Processed"
-  },
-  "edit": {
-    "key": "edit",
-    "type": "text",
-    "value": "Edit"
-  },
-  "edit_job_title": {
-    "key": "edit_job_title",
-    "type": "text",
-    "value": "Job Details"
-  },
-  "edit_sop_job_title": {
-    "key": "edit_sop_job_title",
-    "type": "text",
-    "value": "SOP Job Details"
-  },
-  "edit_sop_title": {
-    "key": "edit_sop_title",
-    "type": "text",
-    "value": "SOP Details"
-  },
-  "end": {
-    "key": "end",
-    "type": "text",
-    "value": "End Job"
-  },
-  "end_job": {
-    "key": "end_job",
-    "type": "text",
-    "value": "End Job"
-  },
-  "end_time": {
-    "key": "end_time",
-    "type": "text",
-    "value": "End Time"
-  },
-  "ensure_power_isolation": {
-    "key": "ensure_power_isolation",
-    "type": "text",
-    "value": "Energy Isolation Confirmation"
-  },
-  "error_date_range_invalid": {
-    "key": "error_date_range_invalid",
-    "type": "text",
-    "value": "Start Time Cannot Be Later Than End Time"
-  },
-  "exception_data_not_exists": {
-    "key": "exception_data_not_exists",
-    "type": "text",
-    "value": "Exception Data Not Found"
-  },
-  "exception_description": {
-    "key": "exception_description",
-    "type": "text",
-    "value": "Exception Description:"
-  },
-  "exception_description_tv": {
-    "key": "exception_description_tv",
-    "type": "text",
-    "value": "Exception Description"
-  },
-  "exception_detail_title": {
-    "key": "exception_detail_title",
-    "type": "text",
-    "value": "Exception Details"
-  },
-  "exception_info": {
-    "key": "exception_info",
-    "type": "text",
-    "value": "Exception Information"
-  },
-  "exception_job": {
-    "key": "exception_job",
-    "type": "text",
-    "value": "Excp Jobs"
-  },
-  "exception_job_title": {
-    "key": "exception_job_title",
-    "type": "text",
-    "value": "Exception Job"
-  },
-  "exception_lost": {
-    "key": "exception_lost",
-    "type": "text",
-    "value": "Exception Lost"
-  },
-  "exception_manage_title": {
-    "key": "exception_manage_title",
-    "type": "text",
-    "value": "Exception Management"
-  },
-  "exception_occurrence_time": {
-    "key": "exception_occurrence_time",
-    "type": "text",
-    "value": "Exception Occurrence Time:"
-  },
-  "exception_occurrence_time_header": {
-    "key": "exception_occurrence_time_header",
-    "type": "text",
-    "value": "Occurrence Time"
-  },
-  "exception_reason": {
-    "key": "exception_reason",
-    "type": "text",
-    "value": "Exception Reason"
-  },
-  "exception_release_time": {
-    "key": "exception_release_time",
-    "type": "text",
-    "value": "Exception Release Time:"
-  },
-  "exception_report": {
-    "key": "exception_report",
-    "type": "text",
-    "value": "Excp Rpt"
-  },
-  "exception_report_success": {
-    "key": "exception_report_success",
-    "type": "text",
-    "value": "Exception Report Successful"
-  },
-  "exception_reporter": {
-    "key": "exception_reporter",
-    "type": "text",
-    "value": "Reporter:"
-  },
-  "exception_source": {
-    "key": "exception_source",
-    "type": "text",
-    "value": "Exception Source:"
-  },
-  "exception_source_tv": {
-    "key": "exception_source_tv",
-    "type": "text",
-    "value": "Exception Source"
-  },
-  "exception_status": {
-    "key": "exception_status",
-    "type": "text",
-    "value": "Status:"
-  },
-  "exception_status_header": {
-    "key": "exception_status_header",
-    "type": "text",
-    "value": "Exception Status"
-  },
-  "exception_type": {
-    "key": "exception_type",
-    "type": "text",
-    "value": "Exception Type:"
-  },
-  "exception_type_header": {
-    "key": "exception_type_header",
-    "type": "text",
-    "value": "Exception Type"
-  },
-  "exception_type_tv": {
-    "key": "exception_type_tv",
-    "type": "text",
-    "value": "Exception Type"
-  },
-  "expand_collapse": {
-    "key": "expand_collapse",
-    "type": "text",
-    "value": "Expand all"
-  },
-  "face_can_not_process": {
-    "key": "face_can_not_process",
-    "type": "text",
-    "value": "Face Recognition Engine Activation Failed, Recognition Unavailable"
-  },
-  "face_detected_do_login": {
-    "key": "face_detected_do_login",
-    "type": "text",
-    "value": "Face Detected, Logging In..."
-  },
-  "face_login": {
-    "key": "face_login",
-    "type": "text",
-    "value": "Face Login"
-  },
-  "face_login_failed": {
-    "key": "face_login_failed",
-    "type": "text",
-    "value": "Face Match Failed, Please Retry"
-  },
-  "face_login_success": {
-    "key": "face_login_success",
-    "type": "text",
-    "value": "Face Authentication Successful"
-  },
-  "face_not_set_tip": {
-    "key": "face_not_set_tip",
-    "type": "text",
-    "value": "Face Data Not Set"
-  },
-  "face_set_tip": {
-    "key": "face_set_tip",
-    "type": "text",
-    "value": "Face Data Configured"
-  },
-  "file_not_exists": {
-    "key": "file_not_exists",
-    "type": "text",
-    "value": "File Does Not Exist"
-  },
-  "filter": {
-    "key": "filter",
-    "type": "text",
-    "value": "Filter"
-  },
-  "fingerprint_add_success_tip": {
-    "key": "fingerprint_add_success_tip",
-    "type": "text",
-    "value": "Fingerprint Data Added Successfully"
-  },
-  "fingerprint_code": {
-    "key": "fingerprint_code",
-    "type": "text",
-    "value": "Fingerprint ID"
-  },
-  "fingerprint_code_str": {
-    "key": "fingerprint_code_str",
-    "type": "text",
-    "value": "Fingerprint_{0}"
-  },
-  "fingerprint_delete_confirm_tip": {
-    "key": "fingerprint_delete_confirm_tip",
-    "type": "text",
-    "value": "Are you sure you want to delete {0}?"
-  },
-  "fingerprint_delete_selected_confirm_tip": {
-    "key": "fingerprint_delete_selected_confirm_tip",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected fingerprint(s)?"
-  },
-  "fingerprint_login": {
-    "key": "fingerprint_login",
-    "type": "text",
-    "value": "Fingerprint Login"
-  },
-  "fingerprint_login_failed": {
-    "key": "fingerprint_login_failed",
-    "type": "text",
-    "value": "Fingerprint Recognition Failed, Please Retry"
-  },
-  "fingerprint_login_success": {
-    "key": "fingerprint_login_success",
-    "type": "text",
-    "value": "Fingerprint Authentication Successful"
-  },
-  "fingerprint_scan_tip": {
-    "key": "fingerprint_scan_tip",
-    "type": "text",
-    "value": "Please Press Fingerprint Sensor {0} Times"
-  },
-  "finish_job_tip": {
-    "key": "finish_job_tip",
-    "type": "text",
-    "value": "Are you sure you want to end the current job?"
-  },
-  "finish_the_job": {
-    "key": "finish_the_job",
-    "type": "text",
-    "value": "End Job"
-  },
-  "get_key_info_fail": {
-    "key": "get_key_info_fail",
-    "type": "text",
-    "value": "Failed to Retrieve Key Information"
-  },
-  "go_locking": {
-    "key": "go_locking",
-    "type": "text",
-    "value": "Proceed to Lock"
-  },
-  "go_unlocking": {
-    "key": "go_unlocking",
-    "type": "text",
-    "value": "Proceed to Unlock"
-  },
-  "group_at_least_has_one_point": {
-    "key": "group_at_least_has_one_point",
-    "type": "text",
-    "value": "Each Group Must Contain at Least One Point"
-  },
-  "group_job_in_progress": {
-    "key": "group_job_in_progress",
-    "type": "text",
-    "value": "Group Job in Progress"
-  },
-  "group_name_must_not_empty": {
-    "key": "group_name_must_not_empty",
-    "type": "text",
-    "value": "Group Name Cannot Be Empty"
-  },
-  "handle": {
-    "key": "handle",
-    "type": "text",
-    "value": "Handle"
-  },
-  "handle_colock": {
-    "key": "handle_colock",
-    "type": "text",
-    "value": "Please Confirm to Add Co-lock"
-  },
-  "handle_exception": {
-    "key": "handle_exception",
-    "type": "text",
-    "value": "Handle Exception"
-  },
-  "handle_exception_success": {
-    "key": "handle_exception_success",
-    "type": "text",
-    "value": "Exception Handled Successfully"
-  },
-  "handle_exception_will_release_all_colock": {
-    "key": "handle_exception_will_release_all_colock",
-    "type": "text",
-    "value": "Warning! Handling Exception Will Remove All Co-locks. Continue?"
-  },
-  "handle_failed": {
-    "key": "handle_failed",
-    "type": "text",
-    "value": "Handling Failed"
-  },
-  "handle_lock_take_key": {
-    "key": "handle_lock_take_key",
-    "type": "text",
-    "value": "Confirm to Take Key for Locking?"
-  },
-  "handle_release_colock": {
-    "key": "handle_release_colock",
-    "type": "text",
-    "value": "Please Confirm to Release Co-lock"
-  },
-  "handle_step_confirm": {
-    "key": "handle_step_confirm",
-    "type": "text",
-    "value": "Please Confirm Completion of [{0}]"
-  },
-  "handle_time": {
-    "key": "handle_time",
-    "type": "text",
-    "value": "Handling Time:"
-  },
-  "handle_time_custom_time_range": {
-    "key": "handle_time_custom_time_range",
-    "type": "text",
-    "value": "Custom Range"
-  },
-  "handle_time_last_30_days": {
-    "key": "handle_time_last_30_days",
-    "type": "text",
-    "value": "Last 30 Days"
-  },
-  "handle_time_last_7_days": {
-    "key": "handle_time_last_7_days",
-    "type": "text",
-    "value": "Last 7 Days"
-  },
-  "handle_unknown": {
-    "key": "handle_unknown",
-    "type": "text",
-    "value": "Unknown Handling Type, Unable to Process"
-  },
-  "handle_unlock_take_key": {
-    "key": "handle_unlock_take_key",
-    "type": "text",
-    "value": "Confirm to Take Key for Unlocking?"
-  },
-  "hardware_in_use_tv": {
-    "key": "hardware_in_use_tv",
-    "type": "text",
-    "value": "Hardware In Use"
-  },
-  "hardware_info": {
-    "key": "hardware_info",
-    "type": "text",
-    "value": "Hardware Info: {0}"
-  },
-  "hardware_key": {
-    "key": "hardware_key",
-    "type": "text",
-    "value": "Key"
-  },
-  "hardware_lock": {
-    "key": "hardware_lock",
-    "type": "text",
-    "value": "Padlock"
-  },
-  "hardware_unknown": {
-    "key": "hardware_unknown",
-    "type": "text",
-    "value": "Unknown"
-  },
-  "has_job_in_progress": {
-    "key": "has_job_in_progress",
-    "type": "text",
-    "value": "Job in Progress Exists"
-  },
-  "has_locked": {
-    "key": "has_locked",
-    "type": "text",
-    "value": "Locked"
-  },
-  "has_user_in_progress_job": {
-    "key": "has_user_in_progress_job",
-    "type": "text",
-    "value": "User(s) Currently in Job"
-  },
-  "home_overview_data_title": {
-    "key": "home_overview_data_title",
-    "type": "text",
-    "value": "Overview Data"
-  },
-  "home_realtime_data_title": {
-    "key": "home_realtime_data_title",
-    "type": "text",
-    "value": "Real-time Data"
-  },
-  "import_str": {
-    "key": "import_str",
-    "type": "text",
-    "value": "Import"
-  },
-  "import_success": {
-    "key": "import_success",
-    "type": "text",
-    "value": "Import Successful"
-  },
-  "in_progress_job_manage_title": {
-    "key": "in_progress_job_manage_title",
-    "type": "text",
-    "value": "Jobs in Progress"
-  },
-  "init_card_registration_step_hint": {
-    "key": "init_card_registration_step_hint",
-    "type": "text",
-    "value": "Please Swipe Card on Reader"
-  },
-  "init_card_registration_step_tip": {
-    "key": "init_card_registration_step_tip",
-    "type": "text",
-    "value": "Identify and Register Card"
-  },
-  "init_device_registration_key_and_lock_complete_step_hint": {
-    "key": "init_device_registration_key_and_lock_complete_step_hint",
-    "type": "text",
-    "value": "Scan Complete"
-  },
-  "init_device_registration_key_and_lock_step_hint": {
-    "key": "init_device_registration_key_and_lock_step_hint",
-    "type": "text",
-    "value": "Please Wait for System to Identify Keys and Padlocks"
-  },
-  "init_device_registration_key_and_lock_step_tip": {
-    "key": "init_device_registration_key_and_lock_step_tip",
-    "type": "text",
-    "value": "Identify Keys and Padlocks"
-  },
-  "init_point_rfid_registration_step_hint": {
-    "key": "init_point_rfid_registration_step_hint",
-    "type": "text",
-    "value": "Please Scan Point RFID Tag on Reader"
-  },
-  "init_point_rfid_registration_step_tip": {
-    "key": "init_point_rfid_registration_step_tip",
-    "type": "text",
-    "value": "Identify and Register Point RFID Tag"
-  },
-  "init_set_admin_account_step": {
-    "key": "init_set_admin_account_step",
-    "type": "text",
-    "value": "1"
-  },
-  "init_set_admin_account_step_hint": {
-    "key": "init_set_admin_account_step_hint",
-    "type": "text",
-    "value": "Please Set Admin Username and Password"
-  },
-  "init_set_admin_account_step_tip": {
-    "key": "init_set_admin_account_step_tip",
-    "type": "text",
-    "value": "Configure Admin Account"
-  },
-  "init_set_remote_server_step_hint": {
-    "key": "init_set_remote_server_step_hint",
-    "type": "text",
-    "value": "Please Set Server Address and Port"
-  },
-  "init_set_remote_server_step_tip": {
-    "key": "init_set_remote_server_step_tip",
-    "type": "text",
-    "value": "Configure Server"
-  },
-  "insert": {
-    "key": "insert",
-    "type": "text",
-    "value": "Add"
-  },
-  "invalid_card": {
-    "key": "invalid_card",
-    "type": "text",
-    "value": "Invalid Card"
-  },
-  "invalid_user": {
-    "key": "invalid_user",
-    "type": "text",
-    "value": "User Does Not Exist"
-  },
-  "item_my_todo_complete_time_title": {
-    "key": "item_my_todo_complete_time_title",
-    "type": "text",
-    "value": "Completion Time:"
-  },
-  "item_my_todo_current_operation_title": {
-    "key": "item_my_todo_current_operation_title",
-    "type": "text",
-    "value": "Current Operation:"
-  },
-  "item_my_todo_current_step_title": {
-    "key": "item_my_todo_current_step_title",
-    "type": "text",
-    "value": "Current Step:"
-  },
-  "item_my_todo_job_name_title": {
-    "key": "item_my_todo_job_name_title",
-    "type": "text",
-    "value": "Related Job:"
-  },
-  "job_already_finished": {
-    "key": "job_already_finished",
-    "type": "text",
-    "value": "This job has already been completed"
-  },
-  "job_canceled": {
-    "key": "job_canceled",
-    "type": "text",
-    "value": "Job canceled"
-  },
-  "job_card_login_failed": {
-    "key": "job_card_login_failed",
-    "type": "text",
-    "value": "Invalid job card"
-  },
-  "job_card_login_success": {
-    "key": "job_card_login_success",
-    "type": "text",
-    "value": "Job card recognized successfully"
-  },
-  "job_card_not_set_tip": {
-    "key": "job_card_not_set_tip",
-    "type": "text",
-    "value": "You have not set up a job card"
-  },
-  "job_card_scan_tip": {
-    "key": "job_card_scan_tip",
-    "type": "text",
-    "value": "Please scan your card on the reader"
-  },
-  "job_card_set_tip": {
-    "key": "job_card_set_tip",
-    "type": "text",
-    "value": "Job card data has been set"
-  },
-  "job_create_and_execute_failed": {
-    "key": "job_create_and_execute_failed",
-    "type": "text",
-    "value": "Job execution failed"
-  },
-  "job_create_and_execute_succeed": {
-    "key": "job_create_and_execute_succeed",
-    "type": "text",
-    "value": "Job started successfully"
-  },
-  "job_create_failed": {
-    "key": "job_create_failed",
-    "type": "text",
-    "value": "Job save failed"
-  },
-  "job_create_succeed": {
-    "key": "job_create_succeed",
-    "type": "text",
-    "value": "Job saved successfully"
-  },
-  "job_execute_colocker_colock_status_title": {
-    "key": "job_execute_colocker_colock_status_title",
-    "type": "text",
-    "value": "Co-lock personnel status"
-  },
-  "job_execute_lock_status_title": {
-    "key": "job_execute_lock_status_title",
-    "type": "text",
-    "value": "Isolation point lock status"
-  },
-  "job_execute_step_description": {
-    "key": "job_execute_step_description",
-    "type": "text",
-    "value": "Operation instructions ({0})"
-  },
-  "job_execute_tab_title_colock": {
-    "key": "job_execute_tab_title_colock",
-    "type": "text",
-    "value": "Co-lock"
-  },
-  "job_execute_tab_title_lock": {
-    "key": "job_execute_tab_title_lock",
-    "type": "text",
-    "value": "Lock"
-  },
-  "job_execute_title": {
-    "key": "job_execute_title",
-    "type": "text",
-    "value": "Job Execution"
-  },
-  "job_finished": {
-    "key": "job_finished",
-    "type": "text",
-    "value": "Job completed"
-  },
-  "job_lost": {
-    "key": "job_lost",
-    "type": "text",
-    "value": "Job lost"
-  },
-  "job_manage_delete_failed": {
-    "key": "job_manage_delete_failed",
-    "type": "text",
-    "value": "Failed to delete selected job"
-  },
-  "job_manage_delete_succeed": {
-    "key": "job_manage_delete_succeed",
-    "type": "text",
-    "value": "Selected job deleted successfully"
-  },
-  "job_manage_title": {
-    "key": "job_manage_title",
-    "type": "text",
-    "value": "Job Management"
-  },
-  "job_name": {
-    "key": "job_name",
-    "type": "text",
-    "value": "Job Name"
-  },
-  "job_save_and_execute_tip": {
-    "key": "job_save_and_execute_tip",
-    "type": "text",
-    "value": "Are you sure you want to execute job \"{0}\"?"
-  },
-  "job_save_tip": {
-    "key": "job_save_tip",
-    "type": "text",
-    "value": "Are you sure you want to save job \"{0}\"?"
-  },
-  "job_status": {
-    "key": "job_status",
-    "type": "text",
-    "value": "Job Status"
-  },
-  "job_workstation": {
-    "key": "job_workstation",
-    "type": "text",
-    "value": "Job Area"
-  },
-  "key_exception_tag": {
-    "key": "key_exception_tag",
-    "type": "text",
-    "value": "This key has been flagged as abnormal"
-  },
-  "key_in_use": {
-    "key": "key_in_use",
-    "type": "text",
-    "value": "Key is in use"
-  },
-  "key_info_already_exists": {
-    "key": "key_info_already_exists",
-    "type": "text",
-    "value": "Key information already exists"
-  },
-  "key_is_in_failure_mode": {
-    "key": "key_is_in_failure_mode",
-    "type": "text",
-    "value": "Key is in failure mode"
-  },
-  "key_mac": {
-    "key": "key_mac",
-    "type": "text",
-    "value": "Key MAC"
-  },
-  "key_manage_delete_failed": {
-    "key": "key_manage_delete_failed",
-    "type": "text",
-    "value": "Failed to delete key"
-  },
-  "key_manage_delete_succeed": {
-    "key": "key_manage_delete_succeed",
-    "type": "text",
-    "value": "Key deleted successfully"
-  },
-  "key_manage_key_detail_title": {
-    "key": "key_manage_key_detail_title",
-    "type": "text",
-    "value": "Key Details"
-  },
-  "key_manage_new_key_title": {
-    "key": "key_manage_new_key_title",
-    "type": "text",
-    "value": "Add New Key"
-  },
-  "key_manage_title": {
-    "key": "key_manage_title",
-    "type": "text",
-    "value": "Key Management"
-  },
-  "key_name": {
-    "key": "key_name",
-    "type": "text",
-    "value": "Key Name"
-  },
-  "key_nfc": {
-    "key": "key_nfc",
-    "type": "text",
-    "value": "Key NFC"
-  },
-  "key_not_exists": {
-    "key": "key_not_exists",
-    "type": "text",
-    "value": "Key does not exist"
-  },
-  "key_return_success": {
-    "key": "key_return_success",
-    "type": "text",
-    "value": "Key returned successfully"
-  },
-  "key_return_tip": {
-    "key": "key_return_tip",
-    "type": "text",
-    "value": "Job ticket not completed; returning key is prohibited"
-  },
-  "key_take_error_tip": {
-    "key": "key_take_error_tip",
-    "type": "text",
-    "value": "Key allocation failed; please check hardware status"
-  },
-  "loading_data": {
-    "key": "loading_data",
-    "type": "text",
-    "value": "Loading data"
-  },
-  "loading_device": {
-    "key": "loading_device",
-    "type": "text",
-    "value": "Loading hardware..."
-  },
-  "loading_msg_get_ticket_status_start": {
-    "key": "loading_msg_get_ticket_status_start",
-    "type": "text",
-    "value": "Reading key job ticket"
-  },
-  "loading_msg_return_key_start": {
-    "key": "loading_msg_return_key_start",
-    "type": "text",
-    "value": "Connecting to key, please wait..."
-  },
-  "lock": {
-    "key": "lock",
-    "type": "text",
-    "value": "Padlock"
-  },
-  "lock_already_exists": {
-    "key": "lock_already_exists",
-    "type": "text",
-    "value": "Lock information already exists"
-  },
-  "lock_code": {
-    "key": "lock_code",
-    "type": "text",
-    "value": "Lock Name"
-  },
-  "lock_exception_tag": {
-    "key": "lock_exception_tag",
-    "type": "text",
-    "value": "This lock has been flagged as abnormal"
-  },
-  "lock_in_use": {
-    "key": "lock_in_use",
-    "type": "text",
-    "value": "Lock is currently in use"
-  },
-  "lock_is_not_enough": {
-    "key": "lock_is_not_enough",
-    "type": "text",
-    "value": "Insufficient lock quantity"
-  },
-  "lock_key_return_tip": {
-    "key": "lock_key_return_tip",
-    "type": "text",
-    "value": "Job ticket not completed; force upload data?"
-  },
-  "lock_manage_delete_failed": {
-    "key": "lock_manage_delete_failed",
-    "type": "text",
-    "value": "Failed to delete lock"
-  },
-  "lock_manage_delete_succeed": {
-    "key": "lock_manage_delete_succeed",
-    "type": "text",
-    "value": "Lock deleted successfully"
-  },
-  "lock_manage_lock_detail_title": {
-    "key": "lock_manage_lock_detail_title",
-    "type": "text",
-    "value": "Lock Details"
-  },
-  "lock_manage_new_lock_title": {
-    "key": "lock_manage_new_lock_title",
-    "type": "text",
-    "value": "Add New Lock"
-  },
-  "lock_manage_title": {
-    "key": "lock_manage_title",
-    "type": "text",
-    "value": "Lock Management"
-  },
-  "lock_name": {
-    "key": "lock_name",
-    "type": "text",
-    "value": "Lock Name"
-  },
-  "lock_nfc": {
-    "key": "lock_nfc",
-    "type": "text",
-    "value": "Lock NFC"
-  },
-  "lock_status": {
-    "key": "lock_status",
-    "type": "text",
-    "value": "Lock Status"
-  },
-  "lock_take_report_fail": {
-    "key": "lock_take_report_fail",
-    "type": "text",
-    "value": "Lock removal reporting failed"
-  },
-  "locked_points_title": {
-    "key": "locked_points_title",
-    "type": "text",
-    "value": "Locked Points"
-  },
-  "locked_points_tv": {
-    "key": "locked_points_tv",
-    "type": "text",
-    "value": "Locked Points"
-  },
-  "locker": {
-    "key": "locker",
-    "type": "text",
-    "value": "Locker"
-  },
-  "login": {
-    "key": "login",
-    "type": "text",
-    "value": "Login"
-  },
-  "login_tip": {
-    "key": "login_tip",
-    "type": "text",
-    "value": "You can log in directly through fingerprint or swipe card"
-  },
-  "loto": {
-    "key": "loto",
-    "type": "text",
-    "value": "Intelligent Lock Control System"
-  },
-  "loto_en": {
-    "key": "loto_en",
-    "type": "text",
-    "value": "Intelligent Lock Control System"
-  },
-  "manage_filter_status": {
-    "key": "manage_filter_status",
-    "type": "text",
-    "value": "Status"
-  },
-  "manage_role_function_permission": {
-    "key": "manage_role_function_permission",
-    "type": "text",
-    "value": "Func Perms"
-  },
-  "member_info_title": {
-    "key": "member_info_title",
-    "type": "text",
-    "value": "Personnel Information"
-  },
-  "move_down": {
-    "key": "move_down",
-    "type": "text",
-    "value": "Move Down"
-  },
-  "move_up": {
-    "key": "move_up",
-    "type": "text",
-    "value": "Move Up"
-  },
-  "my_todo_title": {
-    "key": "my_todo_title",
-    "type": "text",
-    "value": "My To-Do"
-  },
-  "navigate_to_step": {
-    "key": "navigate_to_step",
-    "type": "text",
-    "value": "Navigate to Step {0}"
-  },
-  "new_device": {
-    "key": "new_device",
-    "type": "text",
-    "value": "New Device"
-  },
-  "new_group": {
-    "key": "new_group",
-    "type": "text",
-    "value": "New Group {0}"
-  },
-  "new_password": {
-    "key": "new_password",
-    "type": "text",
-    "value": "New Password (6-20 characters: letters, numbers, special symbols)"
-  },
-  "new_password_and_repeat_new_password_not_same": {
-    "key": "new_password_and_repeat_new_password_not_same",
-    "type": "text",
-    "value": "New password and repeated password do not match"
-  },
-  "new_password_cannot_be_the_same_as_the_old_password": {
-    "key": "new_password_cannot_be_the_same_as_the_old_password",
-    "type": "text",
-    "value": "New password cannot be the same as the old password"
-  },
-  "next": {
-    "key": "next",
-    "type": "text",
-    "value": "Next"
-  },
-  "nickname": {
-    "key": "nickname",
-    "type": "text",
-    "value": "Name"
-  },
-  "no_available_key": {
-    "key": "no_available_key",
-    "type": "text",
-    "value": "No available keys"
-  },
-  "no_data": {
-    "key": "no_data",
-    "type": "text",
-    "value": "No data"
-  },
-  "no_goto_step": {
-    "key": "no_goto_step",
-    "type": "text",
-    "value": "No jump step"
-  },
-  "no_permission_to_handle": {
-    "key": "no_permission_to_handle",
-    "type": "text",
-    "value": "You do not have permission to operate the current job ticket"
-  },
-  "no_response_board_exists": {
-    "key": "no_response_board_exists",
-    "type": "text",
-    "value": "Unresponsive main board exists"
-  },
-  "normal": {
-    "key": "normal",
-    "type": "text",
-    "value": "Normal"
-  },
-  "not_group_can_lock": {
-    "key": "not_group_can_lock",
-    "type": "text",
-    "value": "No group available for locking"
-  },
-  "not_group_can_unlock": {
-    "key": "not_group_can_unlock",
-    "type": "text",
-    "value": "No group available for unlocking"
-  },
-  "not_in_slot": {
-    "key": "not_in_slot",
-    "type": "text",
-    "value": "Not in slot"
-  },
-  "not_save_tip": {
-    "key": "not_save_tip",
-    "type": "text",
-    "value": "Data not saved yet. Are you sure you want to discard changes and leave this page?"
-  },
-  "number": {
-    "key": "number",
-    "type": "text",
-    "value": "Number:"
-  },
-  "old_password": {
-    "key": "old_password",
-    "type": "text",
-    "value": "Old Password"
-  },
-  "old_password_error": {
-    "key": "old_password_error",
-    "type": "text",
-    "value": "Incorrect old password"
-  },
-  "one_key_cancel": {
-    "key": "one_key_cancel",
-    "type": "text",
-    "value": "One-Click Cancel"
-  },
-  "one_key_handle": {
-    "key": "one_key_handle",
-    "type": "text",
-    "value": "One-Click Handle"
-  },
-  "ongoing_job_tv": {
-    "key": "ongoing_job_tv",
-    "type": "text",
-    "value": "Ongoing Jobs"
-  },
-  "only_one_person_allowed": {
-    "key": "only_one_person_allowed",
-    "type": "text",
-    "value": "Only one person allowed in view"
-  },
-  "operation": {
-    "key": "operation",
-    "type": "text",
-    "value": "Operation"
-  },
-  "password_and_repeat_password_not_same": {
-    "key": "password_and_repeat_password_not_same",
-    "type": "text",
-    "value": "Password and repeated password do not match"
-  },
-  "password_regex_tip": {
-    "key": "password_regex_tip",
-    "type": "text",
-    "value": "Password does not meet requirements"
-  },
-  "phone": {
-    "key": "phone",
-    "type": "text",
-    "value": "Phone"
-  },
-  "please_do_colock": {
-    "key": "please_do_colock",
-    "type": "text",
-    "value": "Please complete co-locking"
-  },
-  "please_do_uncolock": {
-    "key": "please_do_uncolock",
-    "type": "text",
-    "value": "Please release co-locking"
-  },
-  "please_done_operation": {
-    "key": "please_done_operation",
-    "type": "text",
-    "value": "Please complete {0} first"
-  },
-  "please_go_locking": {
-    "key": "please_go_locking",
-    "type": "text",
-    "value": "Please proceed to locking operation"
-  },
-  "please_go_unlocking": {
-    "key": "please_go_unlocking",
-    "type": "text",
-    "value": "Please proceed to unlocking operation"
-  },
-  "please_input_account": {
-    "key": "please_input_account",
-    "type": "text",
-    "value": "Please enter username"
-  },
-  "please_input_admin_username": {
-    "key": "please_input_admin_username",
-    "type": "text",
-    "value": "Please enter admin account"
-  },
-  "please_input_area": {
-    "key": "please_input_area",
-    "type": "text",
-    "value": "Please enter area"
-  },
-  "please_input_card_code": {
-    "key": "please_input_card_code",
-    "type": "text",
-    "value": "Please enter job card number"
-  },
-  "please_input_card_nfc": {
-    "key": "please_input_card_nfc",
-    "type": "text",
-    "value": "Please enter card NFC"
-  },
-  "please_input_correct_phone": {
-    "key": "please_input_correct_phone",
-    "type": "text",
-    "value": "Please enter a valid phone number"
-  },
-  "please_input_exception_reason": {
-    "key": "please_input_exception_reason",
-    "type": "text",
-    "value": "Please enter exception reason"
-  },
-  "please_input_job_name": {
-    "key": "please_input_job_name",
-    "type": "text",
-    "value": "Please enter job name"
-  },
-  "please_input_key_mac": {
-    "key": "please_input_key_mac",
-    "type": "text",
-    "value": "Please enter key MAC"
-  },
-  "please_input_key_name": {
-    "key": "please_input_key_name",
-    "type": "text",
-    "value": "Please enter key name"
-  },
-  "please_input_key_nfc": {
-    "key": "please_input_key_nfc",
-    "type": "text",
-    "value": "Please enter key NFC"
-  },
-  "please_input_key_word": {
-    "key": "please_input_key_word",
-    "type": "text",
-    "value": "Please enter keyword"
-  },
-  "please_input_lock_code": {
-    "key": "please_input_lock_code",
-    "type": "text",
-    "value": "Please enter lock number"
-  },
-  "please_input_lock_nfc": {
-    "key": "please_input_lock_nfc",
-    "type": "text",
-    "value": "Please enter lock NFC"
-  },
-  "please_input_new_password": {
-    "key": "please_input_new_password",
-    "type": "text",
-    "value": "Please enter new password"
-  },
-  "please_input_nickname": {
-    "key": "please_input_nickname",
-    "type": "text",
-    "value": "Please enter name"
-  },
-  "please_input_old_password": {
-    "key": "please_input_old_password",
-    "type": "text",
-    "value": "Please enter old password"
-  },
-  "please_input_password": {
-    "key": "please_input_password",
-    "type": "text",
-    "value": "Please enter password"
-  },
-  "please_input_permission_characters": {
-    "key": "please_input_permission_characters",
-    "type": "text",
-    "value": "Please enter permission characters"
-  },
-  "please_input_phone": {
-    "key": "please_input_phone",
-    "type": "text",
-    "value": "Please enter phone number"
-  },
-  "please_input_point_function": {
-    "key": "please_input_point_function",
-    "type": "text",
-    "value": "Please enter isolation point function"
-  },
-  "please_input_point_name": {
-    "key": "please_input_point_name",
-    "type": "text",
-    "value": "Please enter isolation point name"
-  },
-  "please_input_remark": {
-    "key": "please_input_remark",
-    "type": "text",
-    "value": "Please enter remark"
-  },
-  "please_input_remote_server_address": {
-    "key": "please_input_remote_server_address",
-    "type": "text",
-    "value": "Please enter server address"
-  },
-  "please_input_repeat_new_password": {
-    "key": "please_input_repeat_new_password",
-    "type": "text",
-    "value": "Please repeat new password"
-  },
-  "please_input_repeat_password": {
-    "key": "please_input_repeat_password",
-    "type": "text",
-    "value": "Please enter repeated password"
-  },
-  "please_input_rfid": {
-    "key": "please_input_rfid",
-    "type": "text",
-    "value": "Please enter RFID tag"
-  },
-  "please_input_rfid_code": {
-    "key": "please_input_rfid_code",
-    "type": "text",
-    "value": "Please enter RFID Name"
-  },
-  "please_input_rfid_tag": {
-    "key": "please_input_rfid_tag",
-    "type": "text",
-    "value": "Please enter RFID tag"
-  },
-  "please_input_role_name": {
-    "key": "please_input_role_name",
-    "type": "text",
-    "value": "Please enter role name"
-  },
-  "please_input_sop_name": {
-    "key": "please_input_sop_name",
-    "type": "text",
-    "value": "Please enter SOP name"
-  },
-  "please_input_step_description": {
-    "key": "please_input_step_description",
-    "type": "text",
-    "value": "Please enter step operation instructions"
-  },
-  "please_input_step_title": {
-    "key": "please_input_step_title",
-    "type": "text",
-    "value": "Please enter step title"
-  },
-  "please_input_step_title_short": {
-    "key": "please_input_step_title_short",
-    "type": "text",
-    "value": "Please enter step title abbreviation"
-  },
-  "please_input_username": {
-    "key": "please_input_username",
-    "type": "text",
-    "value": "Please enter login name"
-  },
-  "please_input_workstation_name": {
-    "key": "please_input_workstation_name",
-    "type": "text",
-    "value": "Please enter area name"
-  },
-  "please_must_select_at_least_one_point": {
-    "key": "please_must_select_at_least_one_point",
-    "type": "text",
-    "value": "You must add at least one point"
-  },
-  "please_press_fingerprint_again": {
-    "key": "please_press_fingerprint_again",
-    "type": "text",
-    "value": "Please press fingerprint again"
-  },
-  "please_re_press_fingerprint_again": {
-    "key": "please_re_press_fingerprint_again",
-    "type": "text",
-    "value": "Please press fingerprint again"
-  },
-  "please_return_key_after_locking": {
-    "key": "please_return_key_after_locking",
-    "type": "text",
-    "value": "Please return key after locking operation"
-  },
-  "please_return_key_after_unlocking": {
-    "key": "please_return_key_after_unlocking",
-    "type": "text",
-    "value": "Please return key after unlocking operation"
-  },
-  "please_scan_face": {
-    "key": "please_scan_face",
-    "type": "text",
-    "value": "Please scan face"
-  },
-  "please_scan_fingerprint": {
-    "key": "please_scan_fingerprint",
-    "type": "text",
-    "value": "Please scan fingerprint"
-  },
-  "please_select_area": {
-    "key": "please_select_area",
-    "type": "text",
-    "value": "Please select area"
-  },
-  "please_select_card": {
-    "key": "please_select_card",
-    "type": "text",
-    "value": "Please select card"
-  },
-  "please_select_card_username": {
-    "key": "please_select_card_username",
-    "type": "text",
-    "value": "Please select user name"
-  },
-  "please_select_colocker": {
-    "key": "please_select_colocker",
-    "type": "text",
-    "value": "Please select co-locker"
-  },
-  "please_select_exception_description": {
-    "key": "please_select_exception_description",
-    "type": "text",
-    "value": "Please select exception description"
-  },
-  "please_select_exception_source": {
-    "key": "please_select_exception_source",
-    "type": "text",
-    "value": "Please select exception source"
-  },
-  "please_select_exception_type": {
-    "key": "please_select_exception_type",
-    "type": "text",
-    "value": "Please select exception type"
-  },
-  "please_select_flow_mode": {
-    "key": "please_select_flow_mode",
-    "type": "text",
-    "value": "Please select workflow mode"
-  },
-  "please_select_group": {
-    "key": "please_select_group",
-    "type": "text",
-    "value": "Please select group"
-  },
-  "please_select_handle_time": {
-    "key": "please_select_handle_time",
-    "type": "text",
-    "value": "Please select handling time"
-  },
-  "please_select_job": {
-    "key": "please_select_job",
-    "type": "text",
-    "value": "Please select job"
-  },
-  "please_select_job_workstation": {
-    "key": "please_select_job_workstation",
-    "type": "text",
-    "value": "Please select job area"
-  },
-  "please_select_key": {
-    "key": "please_select_key",
-    "type": "text",
-    "value": "Please select key"
-  },
-  "please_select_lock": {
-    "key": "please_select_lock",
-    "type": "text",
-    "value": "Please select lock"
-  },
-  "please_select_locker": {
-    "key": "please_select_locker",
-    "type": "text",
-    "value": "Please select locker"
-  },
-  "please_select_member": {
-    "key": "please_select_member",
-    "type": "text",
-    "value": "You can select personnel to add"
-  },
-  "please_select_point": {
-    "key": "please_select_point",
-    "type": "text",
-    "value": "Please select isolation point"
-  },
-  "please_select_power_type": {
-    "key": "please_select_power_type",
-    "type": "text",
-    "value": "Please select power source"
-  },
-  "please_select_process_application": {
-    "key": "please_select_process_application",
-    "type": "text",
-    "value": "Please select process application"
-  },
-  "please_select_rfid_token": {
-    "key": "please_select_rfid_token",
-    "type": "text",
-    "value": "Please select RFID tag"
-  },
-  "please_select_role": {
-    "key": "please_select_role",
-    "type": "text",
-    "value": "Please select role"
-  },
-  "please_select_sop": {
-    "key": "please_select_sop",
-    "type": "text",
-    "value": "Please select SOP"
-  },
-  "please_select_sop_workstation": {
-    "key": "please_select_sop_workstation",
-    "type": "text",
-    "value": "Please select SOP area"
-  },
-  "please_select_start_time": {
-    "key": "please_select_start_time",
-    "type": "text",
-    "value": "Please select start time first"
-  },
-  "please_select_status": {
-    "key": "please_select_status",
-    "type": "text",
-    "value": "Please select status"
-  },
-  "please_select_step_confirm_member": {
-    "key": "please_select_step_confirm_member",
-    "type": "text",
-    "value": "Please select execution confirmation personnel"
-  },
-  "please_select_step_confirm_role": {
-    "key": "please_select_step_confirm_role",
-    "type": "text",
-    "value": "Please select execution confirmation role"
-  },
-  "please_select_step_confirm_type": {
-    "key": "please_select_step_confirm_type",
-    "type": "text",
-    "value": "Please select execution confirmation method"
-  },
-  "please_select_user": {
-    "key": "please_select_user",
-    "type": "text",
-    "value": "Please select user"
-  },
-  "please_select_workflow_mode": {
-    "key": "please_select_workflow_mode",
-    "type": "text",
-    "value": "Please select workflow mode"
-  },
-  "please_select_workstation": {
-    "key": "please_select_workstation",
-    "type": "text",
-    "value": "Please select area"
-  },
-  "please_swipe_card": {
-    "key": "please_swipe_card",
-    "type": "text",
-    "value": "Please swipe card"
-  },
-  "please_take_out_ready_device_first": {
-    "key": "please_take_out_ready_device_first",
-    "type": "text",
-    "value": "Please remove devices with activated card locks first"
-  },
-  "please_wait_ticket_name_lock_complete": {
-    "key": "please_wait_ticket_name_lock_complete",
-    "type": "text",
-    "value": "Please wait for [{0}] to complete locking"
-  },
-  "ticket_name": {
-    "key": "ticket_name",
-    "type": "text",
-    "value": "Ticket Name"
-  },
-  "point_detail": {
-    "key": "point_detail",
-    "type": "text",
-    "value": "Point Details"
-  },
-  "point_in_use": {
-    "key": "point_in_use",
-    "type": "text",
-    "value": "Point is in use and cannot be modified"
-  },
-  "point_info_title": {
-    "key": "point_info_title",
-    "type": "text",
-    "value": "Point Information"
-  },
-  "point_list_title": {
-    "key": "point_list_title",
-    "type": "text",
-    "value": "Point List"
-  },
-  "point_manage_add_title": {
-    "key": "point_manage_add_title",
-    "type": "text",
-    "value": "Add Point"
-  },
-  "point_manage_delete_failed": {
-    "key": "point_manage_delete_failed",
-    "type": "text",
-    "value": "Unable to delete isolation point"
-  },
-  "point_manage_delete_succeed": {
-    "key": "point_manage_delete_succeed",
-    "type": "text",
-    "value": "Isolation point deleted successfully"
-  },
-  "point_manage_point_function": {
-    "key": "point_manage_point_function",
-    "type": "text",
-    "value": "Isolation Point Func"
-  },
-  "point_manage_point_group": {
-    "key": "point_manage_point_group",
-    "type": "text",
-    "value": "Group Name"
-  },
-  "point_manage_point_name": {
-    "key": "point_manage_point_name",
-    "type": "text",
-    "value": "Isolation Point Name"
-  },
-  "point_manage_point_power_type": {
-    "key": "point_manage_point_power_type",
-    "type": "text",
-    "value": "Power Source"
-  },
-  "point_manage_rfid": {
-    "key": "point_manage_rfid",
-    "type": "text",
-    "value": "RFID"
-  },
-  "point_manage_rfid_tag": {
-    "key": "point_manage_rfid_tag",
-    "type": "text",
-    "value": "RFID Tag"
-  },
-  "point_manage_title": {
-    "key": "point_manage_title",
-    "type": "text",
-    "value": "Point Management"
-  },
-  "point_manage_update_title": {
-    "key": "point_manage_update_title",
-    "type": "text",
-    "value": "Edit Point"
-  },
-  "point_manage_workstation": {
-    "key": "point_manage_workstation",
-    "type": "text",
-    "value": "Area"
-  },
-  "point_name_tv": {
-    "key": "point_name_tv",
-    "type": "text",
-    "value": "Isolation Point"
-  },
-  "power_isolation_way": {
-    "key": "power_isolation_way",
-    "type": "text",
-    "value": "Confirm Isolation Method"
-  },
-  "preset_workflow_can_not_delete": {
-    "key": "preset_workflow_can_not_delete",
-    "type": "text",
-    "value": "Preset workflow mode cannot be deleted"
-  },
-  "previous": {
-    "key": "previous",
-    "type": "text",
-    "value": "Previous"
-  },
-  "process_application_tv": {
-    "key": "process_application_tv",
-    "type": "text",
-    "value": "Process Application"
-  },
-  "quick_entrance_most_set_tip": {
-    "key": "quick_entrance_most_set_tip",
-    "type": "text",
-    "value": "A maximum of 8 shortcuts can be set"
-  },
-  "quick_entrance_title": {
-    "key": "quick_entrance_title",
-    "type": "text",
-    "value": "Shortcut Configuration"
-  },
-  "re_recognize": {
-    "key": "re_recognize",
-    "type": "text",
-    "value": "Re-recognize"
-  },
-  "real_person_verification_required": {
-    "key": "real_person_verification_required",
-    "type": "text",
-    "value": "Please ensure real-person operation"
-  },
-  "recapture": {
-    "key": "recapture",
-    "type": "text",
-    "value": "Retake"
-  },
-  "recognize_work_content": {
-    "key": "recognize_work_content",
-    "type": "text",
-    "value": "Recognize Work Content"
-  },
-  "recognized_card_rfid": {
-    "key": "recognized_card_rfid",
-    "type": "text",
-    "value": "Recognized Card RFID"
-  },
-  "recognized_point_rfid": {
-    "key": "recognized_point_rfid",
-    "type": "text",
-    "value": "Recognized Point RFID"
-  },
-  "reduce_colocker": {
-    "key": "reduce_colocker",
-    "type": "text",
-    "value": "Reduce co-locker ({0})"
-  },
-  "register_failed": {
-    "key": "register_failed",
-    "type": "text",
-    "value": "Registration failed"
-  },
-  "register_success": {
-    "key": "register_success",
-    "type": "text",
-    "value": "Registration succeeded"
-  },
-  "release_colocker": {
-    "key": "release_colocker",
-    "type": "text",
-    "value": "Release Co-locking"
-  },
-  "remark": {
-    "key": "remark",
-    "type": "text",
-    "value": "Remark"
-  },
-  "repeat_new_password": {
-    "key": "repeat_new_password",
-    "type": "text",
-    "value": "Repeat New Password (6-20 characters: letters, numbers, special symbols)"
-  },
-  "repeat_password": {
-    "key": "repeat_password",
-    "type": "text",
-    "value": "Repeat Password (6-20 characters: letters, numbers, special symbols)"
-  },
-  "reset": {
-    "key": "reset",
-    "type": "text",
-    "value": "Reset"
-  },
-  "reset_data_tv": {
-    "key": "reset_data_tv",
-    "type": "text",
-    "value": "Click to reset"
-  },
-  "reset_password_title": {
-    "key": "reset_password_title",
-    "type": "text",
-    "value": "Reset Password"
-  },
-  "reset_user_password_failed": {
-    "key": "reset_user_password_failed",
-    "type": "text",
-    "value": "User password reset failed"
-  },
-  "reset_user_password_succeed": {
-    "key": "reset_user_password_succeed",
-    "type": "text",
-    "value": "User password reset succeeded"
-  },
-  "restart_app_after_set": {
-    "key": "restart_app_after_set",
-    "type": "text",
-    "value": "App will restart after settings are applied"
-  },
-  "rfid": {
-    "key": "rfid",
-    "type": "text",
-    "value": "RFID Tag"
-  },
-  "rfid_already_bind": {
-    "key": "rfid_already_bind",
-    "type": "text",
-    "value": "This RFID tag is already bound"
-  },
-  "rfid_already_registration": {
-    "key": "rfid_already_registration",
-    "type": "text",
-    "value": "RFID tag already registered"
-  },
-  "rfid_code": {
-    "key": "rfid_code",
-    "type": "text",
-    "value": "RFID Name"
-  },
-  "rfid_in_use": {
-    "key": "rfid_in_use",
-    "type": "text",
-    "value": "RFID tag in use, cannot modify"
-  },
-  "rfid_name": {
-    "key": "rfid_name",
-    "type": "text",
-    "value": "RFID Name"
-  },
-  "rfid_token_manage_delete_failed": {
-    "key": "rfid_token_manage_delete_failed",
-    "type": "text",
-    "value": "RFID tag deletion failed"
-  },
-  "rfid_token_manage_delete_succeed": {
-    "key": "rfid_token_manage_delete_succeed",
-    "type": "text",
-    "value": "RFID tag deleted successfully"
-  },
-  "rfid_token_manage_new_rfid_token_title": {
-    "key": "rfid_token_manage_new_rfid_token_title",
-    "type": "text",
-    "value": "Add RFID Tag"
-  },
-  "rfid_token_manage_rfid_token_detail_title": {
-    "key": "rfid_token_manage_rfid_token_detail_title",
-    "type": "text",
-    "value": "RFID Tag Details"
-  },
-  "rfid_token_manage_title": {
-    "key": "rfid_token_manage_title",
-    "type": "text",
-    "value": "RFID Management"
-  },
-  "role_in_preset_tip": {
-    "key": "role_in_preset_tip",
-    "type": "text",
-    "value": "Preset roles cannot be deleted"
-  },
-  "role_in_use": {
-    "key": "role_in_use",
-    "type": "text",
-    "value": "Role is in use in current jobs"
-  },
-  "role_key_already_exists": {
-    "key": "role_key_already_exists",
-    "type": "text",
-    "value": "Role permission characters already exist"
-  },
-  "role_manage_add_title": {
-    "key": "role_manage_add_title",
-    "type": "text",
-    "value": "Add Role"
-  },
-  "role_manage_update_title": {
-    "key": "role_manage_update_title",
-    "type": "text",
-    "value": "Update Role"
-  },
-  "role_manage_delete_failed": {
-    "key": "role_manage_delete_failed",
-    "type": "text",
-    "value": "Unable to delete role"
-  },
-  "role_manage_delete_succeed": {
-    "key": "role_manage_delete_succeed",
-    "type": "text",
-    "value": "Role deleted successfully"
-  },
-  "role_manage_permission_string": {
-    "key": "role_manage_permission_string",
-    "type": "text",
-    "value": "Perm Chars"
-  },
-  "role_manage_role_name": {
-    "key": "role_manage_role_name",
-    "type": "text",
-    "value": "Role Name"
-  },
-  "role_manage_role_num": {
-    "key": "role_manage_role_num",
-    "type": "text",
-    "value": "Role Number"
-  },
-  "role_manage_title": {
-    "key": "role_manage_title",
-    "type": "text",
-    "value": "Role Management"
-  },
-  "save": {
-    "key": "save",
-    "type": "text",
-    "value": "Save"
-  },
-  "save_and_execute": {
-    "key": "save_and_execute",
-    "type": "text",
-    "value": "Save and Execute"
-  },
-  "save_sop_check": {
-    "key": "save_sop_check",
-    "type": "text",
-    "value": "Generate SOP"
-  },
-  "save_success": {
-    "key": "save_success",
-    "type": "text",
-    "value": "Saved successfully!"
-  },
-  "scan_complete_app_restarting": {
-    "key": "scan_complete_app_restarting",
-    "type": "text",
-    "value": "Scan complete, app will restart automatically"
-  },
-  "select": {
-    "key": "select",
-    "type": "text",
-    "value": "Select"
-  },
-  "select_colocker_tip": {
-    "key": "select_colocker_tip",
-    "type": "text",
-    "value": "Please select co-locker from the following personnel"
-  },
-  "select_coloker": {
-    "key": "select_coloker",
-    "type": "text",
-    "value": "Please select co-locker"
-  },
-  "select_group_tip": {
-    "key": "select_group_tip",
-    "type": "text",
-    "value": "Click empty space in group to select"
-  },
-  "select_locker": {
-    "key": "select_locker",
-    "type": "text",
-    "value": "Select Locker"
-  },
-  "select_locker_tip": {
-    "key": "select_locker_tip",
-    "type": "text",
-    "value": "Please select [{0}] as locker from the following personnel"
-  },
-  "select_member_title": {
-    "key": "select_member_title",
-    "type": "text",
-    "value": "Select Personnel"
-  },
-  "select_point_title": {
-    "key": "select_point_title",
-    "type": "text",
-    "value": "Select Point"
-  },
-  "selected_point_already_in_use": {
-    "key": "selected_point_already_in_use",
-    "type": "text",
-    "value": "Some selected points are already in use"
-  },
-  "selected_point_info_title": {
-    "key": "selected_point_info_title",
-    "type": "text",
-    "value": "Default Group"
-  },
-  "selected_quick_entrance": {
-    "key": "selected_quick_entrance",
-    "type": "text",
-    "value": "Configured Shortcuts (up to 8, draggable)"
-  },
-  "selected_rfid_in_use": {
-    "key": "selected_rfid_in_use",
-    "type": "text",
-    "value": "Some selected RFID tags are in use"
-  },
-  "send_ticket_fail": {
-    "key": "send_ticket_fail",
-    "type": "text",
-    "value": "Job ticket issuance failed"
-  },
-  "sending_ticket": {
-    "key": "sending_ticket",
-    "type": "text",
-    "value": "Sending job ticket..."
-  },
-  "server_address": {
-    "key": "server_address",
-    "type": "text",
-    "value": "Server Address"
-  },
-  "server_address_error": {
-    "key": "server_address_error",
-    "type": "text",
-    "value": "Server address error"
-  },
-  "set_colocker": {
-    "key": "set_colocker",
-    "type": "text",
-    "value": "Set Co-locker"
-  },
-  "set_data_tv": {
-    "key": "set_data_tv",
-    "type": "text",
-    "value": "Click to set"
-  },
-  "set_face_title": {
-    "key": "set_face_title",
-    "type": "text",
-    "value": "Set Face"
-  },
-  "set_fingerprint_title": {
-    "key": "set_fingerprint_title",
-    "type": "text",
-    "value": "Set Fingerprint"
-  },
-  "set_job_card_title": {
-    "key": "set_job_card_title",
-    "type": "text",
-    "value": "Set Job Card"
-  },
-  "set_locker": {
-    "key": "set_locker",
-    "type": "text",
-    "value": "Set Locker"
-  },
-  "set_password": {
-    "key": "set_password",
-    "type": "text",
-    "value": "Set Password (6-20 characters: letters, numbers, special symbols)"
-  },
-  "settings": {
-    "key": "settings",
-    "type": "text",
-    "value": "Settings"
-  },
-  "show_member_when_selected_sop": {
-    "key": "show_member_when_selected_sop",
-    "type": "text",
-    "value": "Personnel information will be displayed automatically after selecting SOP"
-  },
-  "show_points_when_selected_sop": {
-    "key": "show_points_when_selected_sop",
-    "type": "text",
-    "value": "Point information will be displayed automatically after selecting SOP"
-  },
-  "shutdown": {
-    "key": "shutdown",
-    "type": "text",
-    "value": "Shutdown"
-  },
-  "ski_step": {
-    "key": "ski_step",
-    "type": "text",
-    "value": "Skip this step"
-  },
-  "skip_and_complete": {
-    "key": "skip_and_complete",
-    "type": "text",
-    "value": "Skip and Complete"
-  },
-  "slot_exception_tag": {
-    "key": "slot_exception_tag",
-    "type": "text",
-    "value": "This lock slot has been marked as abnormal"
-  },
-  "slots_exception_report": {
-    "key": "slots_exception_report",
-    "type": "text",
-    "value": "Slot Exception Report"
-  },
-  "slots_manage_title": {
-    "key": "slots_manage_title",
-    "type": "text",
-    "value": "Slot Management"
-  },
-  "sop_create_failed": {
-    "key": "sop_create_failed",
-    "type": "text",
-    "value": "SOP creation failed"
-  },
-  "sop_create_succeed": {
-    "key": "sop_create_succeed",
-    "type": "text",
-    "value": "SOP created successfully"
-  },
-  "sop_job_save_and_execute_failed": {
-    "key": "sop_job_save_and_execute_failed",
-    "type": "text",
-    "value": "SOP job execution failed"
-  },
-  "sop_job_save_and_execute_succeed": {
-    "key": "sop_job_save_and_execute_succeed",
-    "type": "text",
-    "value": "SOP job started successfully"
-  },
-  "sop_job_save_failed": {
-    "key": "sop_job_save_failed",
-    "type": "text",
-    "value": "SOP job save failed"
-  },
-  "sop_job_save_succeed": {
-    "key": "sop_job_save_succeed",
-    "type": "text",
-    "value": "SOP job saved successfully"
-  },
-  "sop_manage_delete_failed": {
-    "key": "sop_manage_delete_failed",
-    "type": "text",
-    "value": "Unable to delete selected SOP"
-  },
-  "sop_manage_delete_succeed": {
-    "key": "sop_manage_delete_succeed",
-    "type": "text",
-    "value": "Selected SOP deleted successfully"
-  },
-  "sop_manage_sop_name": {
-    "key": "sop_manage_sop_name",
-    "type": "text",
-    "value": "SOP Name"
-  },
-  "sop_manage_title": {
-    "key": "sop_manage_title",
-    "type": "text",
-    "value": "SOP Management"
-  },
-  "sop_manage_workstation": {
-    "key": "sop_manage_workstation",
-    "type": "text",
-    "value": "Area"
-  },
-  "sop_save_failed": {
-    "key": "sop_save_failed",
-    "type": "text",
-    "value": "SOP save failed"
-  },
-  "sop_save_succeed": {
-    "key": "sop_save_succeed",
-    "type": "text",
-    "value": "SOP saved successfully"
-  },
-  "sop_save_tip": {
-    "key": "sop_save_tip",
-    "type": "text",
-    "value": "Are you sure you want to save \"{0}\"?"
-  },
-  "sop_workstation": {
-    "key": "sop_workstation",
-    "type": "text",
-    "value": "SOP Area"
-  },
-  "start": {
-    "key": "start",
-    "type": "text",
-    "value": "Start"
-  },
-  "start_detect_key_slot": {
-    "key": "start_detect_key_slot",
-    "type": "text",
-    "value": "Start detecting key slot"
-  },
-  "start_detect_lock_slot": {
-    "key": "start_detect_lock_slot",
-    "type": "text",
-    "value": "Start detecting lock slot"
-  },
-  "start_scan_key_mac": {
-    "key": "start_scan_key_mac",
-    "type": "text",
-    "value": "Start scanning key information"
-  },
-  "start_time": {
-    "key": "start_time",
-    "type": "text",
-    "value": "Start Time"
-  },
-  "end_time_must_large_then_start_time": {
-    "key": "end_time_must_large_then_start_time",
-    "type": "text",
-    "value": "End time must be later than start time"
-  },
-  "start_tip": {
-    "key": "start_tip",
-    "type": "text",
-    "value": "Initialize the system according to the instructions"
-  },
-  "start_to_send_ticket": {
-    "key": "start_to_send_ticket",
-    "type": "text",
-    "value": "Start sending job ticket..."
-  },
-  "status": {
-    "key": "status",
-    "type": "text",
-    "value": "Status"
-  },
-  "step_confirm_failed": {
-    "key": "step_confirm_failed",
-    "type": "text",
-    "value": "Step confirmation failed"
-  },
-  "take_out_key": {
-    "key": "take_out_key",
-    "type": "text",
-    "value": "Please take out the key"
-  },
-  "take_out_key_tip": {
-    "key": "take_out_key_tip",
-    "type": "text",
-    "value": "Please take the key from the opened key slot"
-  },
-  "take_out_lock_tip": {
-    "key": "take_out_lock_tip",
-    "type": "text",
-    "value": "Please take the lock from the opened lock slot, {0} remaining"
-  },
-  "take_out_rest_locks": {
-    "key": "take_out_rest_locks",
-    "type": "text",
-    "value": "Please take out remaining locks with activated card locks"
-  },
-  "tec_support": {
-    "key": "tec_support",
-    "type": "text",
-    "value": "Wenzhou Doctor Safety Products Co., Ltd."
-  },
-  "the_verification_file_not_exists": {
-    "key": "the_verification_file_not_exists",
-    "type": "text",
-    "value": "Verification file does not exist"
-  },
-  "ticket_data_error": {
-    "key": "ticket_data_error",
-    "type": "text",
-    "value": "Job ticket data corrupted"
-  },
-  "ticket_get_failed": {
-    "key": "ticket_get_failed",
-    "type": "text",
-    "value": "Failed to obtain job ticket, Please shutdown the key then take and return key again."
-  },
-  "ticket_lost": {
-    "key": "ticket_lost",
-    "type": "text",
-    "value": "Job ticket does not exist"
-  },
-  "time_frame_tv": {
-    "key": "time_frame_tv",
-    "type": "text",
-    "value": "Time Range"
-  },
-  "todo_header": {
-    "key": "todo_header",
-    "type": "text",
-    "value": "In Progress"
-  },
-  "turn_off": {
-    "key": "turn_off",
-    "type": "text",
-    "value": "Off"
-  },
-  "turn_on": {
-    "key": "turn_on",
-    "type": "text",
-    "value": "On"
-  },
-  "turn_read": {
-    "key": "turn_read",
-    "type": "text",
-    "value": "Read"
-  },
-  "uncolock_complete": {
-    "key": "uncolock_complete",
-    "type": "text",
-    "value": "Co-lock release successful"
-  },
-  "uncolock_failed": {
-    "key": "uncolock_failed",
-    "type": "text",
-    "value": "Co-lock release failed"
-  },
-  "unlock": {
-    "key": "unlock",
-    "type": "text",
-    "value": "Unlock"
-  },
-  "unlock_and_restore_switch": {
-    "key": "unlock_and_restore_switch",
-    "type": "text",
-    "value": "Unlock and restore switch"
-  },
-  "unzip": {
-    "key": "unzip",
-    "type": "text",
-    "value": "Unzipping… {0}"
-  },
-  "update_card_failed": {
-    "key": "update_card_failed",
-    "type": "text",
-    "value": "Update card failed"
-  },
-  "update_card_succeed": {
-    "key": "update_card_succeed",
-    "type": "text",
-    "value": "Card updated successfully"
-  },
-  "update_key_failed": {
-    "key": "update_key_failed",
-    "type": "text",
-    "value": "Update key failed"
-  },
-  "update_key_succeed": {
-    "key": "update_key_succeed",
-    "type": "text",
-    "value": "Key updated successfully"
-  },
-  "update_lock_failed": {
-    "key": "update_lock_failed",
-    "type": "text",
-    "value": "Update lock failed"
-  },
-  "update_lock_succeed": {
-    "key": "update_lock_succeed",
-    "type": "text",
-    "value": "Lock updated successfully"
-  },
-  "update_point_failed": {
-    "key": "update_point_failed",
-    "type": "text",
-    "value": "Save point failed"
-  },
-  "update_point_succeed": {
-    "key": "update_point_succeed",
-    "type": "text",
-    "value": "Point saved successfully"
-  },
-  "update_rfid_token_failed": {
-    "key": "update_rfid_token_failed",
-    "type": "text",
-    "value": "Update RFID tag failed"
-  },
-  "update_rfid_token_succeed": {
-    "key": "update_rfid_token_succeed",
-    "type": "text",
-    "value": "RFID tag updated successfully"
-  },
-  "update_role_failed": {
-    "key": "update_role_failed",
-    "type": "text",
-    "value": "Role update failed"
-  },
-  "update_role_succeed": {
-    "key": "update_role_succeed",
-    "type": "text",
-    "value": "Role updated successfully"
-  },
-  "update_user_failed": {
-    "key": "update_user_failed",
-    "type": "text",
-    "value": "User update failed"
-  },
-  "update_user_succeed": {
-    "key": "update_user_succeed",
-    "type": "text",
-    "value": "User updated successfully"
-  },
-  "update_workstation_failed": {
-    "key": "update_workstation_failed",
-    "type": "text",
-    "value": "Update area failed"
-  },
-  "update_workstation_succeed": {
-    "key": "update_workstation_succeed",
-    "type": "text",
-    "value": "Area updated successfully"
-  },
-  "user_already_exists": {
-    "key": "user_already_exists",
-    "type": "text",
-    "value": "User already exists"
-  },
-  "user_info_title": {
-    "key": "user_info_title",
-    "type": "text",
-    "value": "Personal Information"
-  },
-  "user_manage_area": {
-    "key": "user_manage_area",
-    "type": "text",
-    "value": "Area"
-  },
-  "user_manage_card_code": {
-    "key": "user_manage_card_code",
-    "type": "text",
-    "value": "Job Card"
-  },
-  "user_manage_delete_failed": {
-    "key": "user_manage_delete_failed",
-    "type": "text",
-    "value": "Unable to delete user"
-  },
-  "user_manage_delete_succeed": {
-    "key": "user_manage_delete_succeed",
-    "type": "text",
-    "value": "User deleted successfully"
-  },
-  "user_manage_filter_activate": {
-    "key": "user_manage_filter_activate",
-    "type": "text",
-    "value": "Active"
-  },
-  "user_manage_filter_deactivate": {
-    "key": "user_manage_filter_deactivate",
-    "type": "text",
-    "value": "Inactive"
-  },
-  "user_manage_filter_title": {
-    "key": "user_manage_filter_title",
-    "type": "text",
-    "value": "Filter Criteria"
-  },
-  "user_manage_new_user_title": {
-    "key": "user_manage_new_user_title",
-    "type": "text",
-    "value": "Add User"
-  },
-  "user_manage_role": {
-    "key": "user_manage_role",
-    "type": "text",
-    "value": "Role"
-  },
-  "user_manage_title": {
-    "key": "user_manage_title",
-    "type": "text",
-    "value": "User Management"
-  },
-  "user_manage_user_detail_title": {
-    "key": "user_manage_user_detail_title",
-    "type": "text",
-    "value": "User Details"
-  },
-  "user_manage_view": {
-    "key": "user_manage_view",
-    "type": "text",
-    "value": "View"
-  },
-  "user_name": {
-    "key": "user_name",
-    "type": "text",
-    "value": "Login Name"
-  },
-  "username": {
-    "key": "username",
-    "type": "text",
-    "value": "Username"
-  },
-  "username_or_password_error": {
-    "key": "username_or_password_error",
-    "type": "text",
-    "value": "Incorrect username or password"
-  },
-  "username_passowrd_login_success": {
-    "key": "username_passowrd_login_success",
-    "type": "text",
-    "value": "Username and password verified successfully"
-  },
-  "username_password_not_exists": {
-    "key": "username_password_not_exists",
-    "type": "text",
-    "value": "Username or password does not exist"
-  },
-  "username_regex_tip": {
-    "key": "username_regex_tip",
-    "type": "text",
-    "value": "Username does not meet requirements"
-  },
-  "verify_failed": {
-    "key": "verify_failed",
-    "type": "text",
-    "value": "Verification failed"
-  },
-  "view": {
-    "key": "view",
-    "type": "text",
-    "value": "View"
-  },
-  "wait_header": {
-    "key": "wait_header",
-    "type": "text",
-    "value": "Waiting"
-  },
-  "wait_to_colock": {
-    "key": "wait_to_colock",
-    "type": "text",
-    "value": "Pending co-lock ({0})"
-  },
-  "warn": {
-    "key": "warn",
-    "type": "text",
-    "value": "Warning"
-  },
-  "welcome_tip": {
-    "key": "welcome_tip",
-    "type": "text",
-    "value": "Hello, welcome"
-  },
-  "workflow_already_exists": {
-    "key": "workflow_already_exists",
-    "type": "text",
-    "value": "Workflow mode already exists"
-  },
-  "workflow_manage_title": {
-    "key": "workflow_manage_title",
-    "type": "text",
-    "value": "Workflow Mode Management"
-  },
-  "workflow_mode": {
-    "key": "workflow_mode",
-    "type": "text",
-    "value": "Workflow Mode"
-  },
-  "workflow_mode_manage_delete_succeed": {
-    "key": "workflow_mode_manage_delete_succeed",
-    "type": "text",
-    "value": "Workflow mode deleted successfully"
-  },
-  "workflow_mode_status_update_failed": {
-    "key": "workflow_mode_status_update_failed",
-    "type": "text",
-    "value": "Status update failed"
-  },
-  "workflow_mode_status_update_succeed": {
-    "key": "workflow_mode_status_update_succeed",
-    "type": "text",
-    "value": "Status updated successfully"
-  },
-  "workflow_name": {
-    "key": "workflow_name",
-    "type": "text",
-    "value": "Workflow Mode Name"
-  },
-  "workflow_setting": {
-    "key": "workflow_setting",
-    "type": "text",
-    "value": "Workflow Settings"
-  },
-  "workflow_step_confirm_member": {
-    "key": "workflow_step_confirm_member",
-    "type": "text",
-    "value": "Execution confirmation personnel"
-  },
-  "workflow_step_confirm_role": {
-    "key": "workflow_step_confirm_role",
-    "type": "text",
-    "value": "Execution confirmation role"
-  },
-  "workflow_step_confirm_type": {
-    "key": "workflow_step_confirm_type",
-    "type": "text",
-    "value": "Execution confirmation method"
-  },
-  "workflow_step_description": {
-    "key": "workflow_step_description",
-    "type": "text",
-    "value": "Step Instructions"
-  },
-  "workflow_step_function": {
-    "key": "workflow_step_function",
-    "type": "text",
-    "value": "Step Function"
-  },
-  "workflow_step_title": {
-    "key": "workflow_step_title",
-    "type": "text",
-    "value": "Step Title"
-  },
-  "workflow_step_title_short": {
-    "key": "workflow_step_title_short",
-    "type": "text",
-    "value": "Step Title Abbreviation"
-  },
-  "workstation_already_exists": {
-    "key": "workstation_already_exists",
-    "type": "text",
-    "value": "Area already exists"
-  },
-  "workstation_is_in_bottom": {
-    "key": "workstation_is_in_bottom",
-    "type": "text",
-    "value": "Area is already at the bottom"
-  },
-  "workstation_is_in_top": {
-    "key": "workstation_is_in_top",
-    "type": "text",
-    "value": "Area is already at the top"
-  },
-  "workstation_manage_delete_failed": {
-    "key": "workstation_manage_delete_failed",
-    "type": "text",
-    "value": "Unable to delete area {0}"
-  },
-  "workstation_manage_delete_succeed": {
-    "key": "workstation_manage_delete_succeed",
-    "type": "text",
-    "value": "Area {0} deleted successfully"
-  },
-  "workstation_manage_new_workstation": {
-    "key": "workstation_manage_new_workstation",
-    "type": "text",
-    "value": "Add Area"
-  },
-  "workstation_manage_update_workstation": {
-    "key": "workstation_manage_update_workstation",
-    "type": "text",
-    "value": "Edit Area"
-  },
-  "workstation_manage_title": {
-    "key": "workstation_manage_title",
-    "type": "text",
-    "value": "Area Management"
-  },
-  "workstation_manage_workstation_name": {
-    "key": "workstation_manage_workstation_name",
-    "type": "text",
-    "value": "Area Name"
-  },
-  "workstation_manage_parent_workstation_name": {
-    "key": "workstation_manage_parent_workstation_name",
-    "type": "text",
-    "value": "Parent area Name"
-  },
-  "you_are_not_locker_tip": {
-    "key": "you_are_not_locker_tip",
-    "type": "text",
-    "value": "You are not the locker and cannot perform this operation"
-  },
-  "zone": {
-    "key": "zone",
-    "type": "text",
-    "value": "Area Range"
-  },
-  "backup_title": {
-    "key": "backup_title",
-    "type": "text",
-    "value": "Backup/Restore"
-  },
-  "backup": {
-    "key": "backup",
-    "type": "text",
-    "value": "Backup"
-  },
-  "backup_path": {
-    "key": "backup_path",
-    "type": "text",
-    "value": "Backup Path"
-  },
-  "maximum_number_of_backups": {
-    "key": "maximum_number_of_backups",
-    "type": "text",
-    "value": "Max No. of Bkps"
-  },
-  "auto_backup": {
-    "key": "auto_backup",
-    "type": "text",
-    "value": "Auto Backup"
-  },
-  "common_enable": {
-    "key": "common_enable",
-    "type": "text",
-    "value": "Enable"
-  },
-  "common_disable": {
-    "key": "common_disable",
-    "type": "text",
-    "value": "Disable"
-  },
-  "backup_frequency": {
-    "key": "backup_frequency",
-    "type": "text",
-    "value": "Bkp Freq"
-  },
-  "backup_time": {
-    "key": "backup_time",
-    "type": "text",
-    "value": "Backup Time"
-  },
-  "backup_tip": {
-    "key": "backup_tip",
-    "type": "text",
-    "value": "Note: The app must remain running during auto backup."
-  },
-  "backup_now": {
-    "key": "backup_now",
-    "type": "text",
-    "value": "Backup Now"
-  },
-  "backup_range": {
-    "key": "backup_range",
-    "type": "text",
-    "value": "Range: {0}"
-  },
-  "restore": {
-    "key": "restore",
-    "type": "text",
-    "value": "Restore"
-  },
-  "common_batch_export": {
-    "key": "common_batch_export",
-    "type": "text",
-    "value": "Batch Export"
-  },
-  "common_batch_delete": {
-    "key": "common_batch_delete",
-    "type": "text",
-    "value": "Batch Delete"
-  },
-  "common_export": {
-    "key": "common_export",
-    "type": "text",
-    "value": "Export"
-  },
-  "MON": {
-    "key": "MON",
-    "type": "text",
-    "value": "Monday"
-  },
-  "TUE": {
-    "key": "TUE",
-    "type": "text",
-    "value": "Tuesday"
-  },
-  "WED": {
-    "key": "WED",
-    "type": "text",
-    "value": "Wednesday"
-  },
-  "THU": {
-    "key": "THU",
-    "type": "text",
-    "value": "Thursday"
-  },
-  "FRI": {
-    "key": "FRI",
-    "type": "text",
-    "value": "Friday"
-  },
-  "SAT": {
-    "key": "SAT",
-    "type": "text",
-    "value": "Saturday"
-  },
-  "SUN": {
-    "key": "SUN",
-    "type": "text",
-    "value": "Sunday"
-  },
-  "backup_frequency_every_day": {
-    "key": "backup_frequency_every_day",
-    "type": "text",
-    "value": "Every Day"
-  },
-  "please_select_backup_frequency": {
-    "key": "please_select_backup_frequency",
-    "type": "text",
-    "value": "Please select a backup frequency"
-  },
-  "maximumNumberOfBackupsNotCorrect": {
-    "key": "maximumNumberOfBackupsNotCorrect",
-    "type": "text",
-    "value": "Please enter a valid maximum number of backups"
-  },
-  "please_select_time": {
-    "key": "please_select_time",
-    "type": "text",
-    "value": "Please select a time"
-  },
-  "backup_now_please_wait": {
-    "key": "backup_now_please_wait",
-    "type": "text",
-    "value": "Backing up,please wait…"
-  },
-  "backup_success": {
-    "key": "backup_success",
-    "type": "text",
-    "value": "Backup Successful"
-  },
-  "backup_failed": {
-    "key": "backup_failed",
-    "type": "text",
-    "value": "Backup Failed"
-  },
-  "delete_backup_file_confirm": {
-    "key": "delete_backup_file_confirm",
-    "type": "text",
-    "value": "Are you sure you want to delete this backup? Once deleted,it cannot be recovered."
-  },
-  "delete_selected_backup_file_confirm": {
-    "key": "delete_selected_backup_file_confirm",
-    "type": "text",
-    "value": "Are you sure you want to delete the selected backups? Once deleted,they cannot be recovered."
-  },
-  "restore_backup_confirm": {
-    "key": "restore_backup_confirm",
-    "type": "text",
-    "value": "Restoring a backup will erase all data from the backup date to now. Are you sure you want to continue?"
-  },
-  "restore_backup_success": {
-    "key": "restore_backup_success",
-    "type": "text",
-    "value": "Backup restored successfully"
-  },
-  "export_success": {
-    "key": "export_success",
-    "type": "text",
-    "value": "Export Successful"
-  },
-  "no_backup_data": {
-    "key": "no_backup_data",
-    "type": "text",
-    "value": "No backup data available"
-  },
-  "loading_backup": {
-    "key": "loading_backup",
-    "type": "text",
-    "value": "Reading backup file…"
-  },
-  "max_backup_tip": {
-    "key": "max_backup_tip",
-    "type": "text",
-    "value": "The maximum number of backups has been reached. Continuing will remove the oldest backup."
-  },
-  "switch": {
-    "key": "switch",
-    "type": "text",
-    "value": "Switch"
-  },
-  "backup_restoring": {
-    "key": "backup_restoring",
-    "type": "text",
-    "value": "Restoring backup…"
-  },
-  "point_manage_switch_icon": {
-    "key": "point_manage_switch_icon",
-    "type": "text",
-    "value": "Switch Icon"
-  },
-  "user_manage": {
-    "key": "user_manage",
-    "type": "text",
-    "value": "Users"
-  },
-  "role_manage": {
-    "key": "role_manage",
-    "type": "text",
-    "value": "Roles"
-  },
-  "workstation_manage": {
-    "key": "workstation_manage",
-    "type": "text",
-    "value": "Areas"
-  },
-  "point_manage": {
-    "key": "point_manage",
-    "type": "text",
-    "value": "Points"
-  },
-  "backup_and_restore": {
-    "key": "backup_and_restore",
-    "type": "text",
-    "value": "Bkp/Rst"
-  },
-  "in_progress_job": {
-    "key": "in_progress_job",
-    "type": "text",
-    "value": "Active Jobs"
-  },
-  "create_sop": {
-    "key": "create_sop",
-    "type": "text",
-    "value": "New SOP"
-  },
-  "sop_manage": {
-    "key": "sop_manage",
-    "type": "text",
-    "value": "SOP"
-  },
-  "create_job": {
-    "key": "create_job",
-    "type": "text",
-    "value": "New Job"
-  },
-  "job_manage": {
-    "key": "job_manage",
-    "type": "text",
-    "value": "Jobs"
-  },
-  "workflow_manage": {
-    "key": "workflow_manage",
-    "type": "text",
-    "value": "Workflow"
-  },
-  "create_sop_job": {
-    "key": "create_sop_job",
-    "type": "text",
-    "value": "New SOPJob"
-  },
-  "locked_point": {
-    "key": "locked_point",
-    "type": "text",
-    "value": "Lock-Points"
-  },
-  "slot_manage": {
-    "key": "slot_manage",
-    "type": "text",
-    "value": "Slots"
-  },
-  "key_manage": {
-    "key": "key_manage",
-    "type": "text",
-    "value": "Keys"
-  },
-  "lock_manage": {
-    "key": "lock_manage",
-    "type": "text",
-    "value": "Locks"
-  },
-  "card_manage": {
-    "key": "card_manage",
-    "type": "text",
-    "value": "Cards"
-  },
-  "rfid_manage": {
-    "key": "rfid_manage",
-    "type": "text",
-    "value": "RFID"
-  },
-  "exception_manage": {
-    "key": "exception_manage",
-    "type": "text",
-    "value": "Exceptions"
-  },
-  "user_info": {
-    "key": "user_info",
-    "type": "text",
-    "value": "Profile"
-  },
-  "reset_password": {
-    "key": "reset_password",
-    "type": "text",
-    "value": "Password"
-  },
-  "fingerprint_setting": {
-    "key": "fingerprint_setting",
-    "type": "text",
-    "value": "Fingerprint"
-  },
-  "face_setting": {
-    "key": "face_setting",
-    "type": "text",
-    "value": "Face"
-  },
-  "card_setting": {
-    "key": "card_setting",
-    "type": "text",
-    "value": "Job Card"
-  },
-  "logout": {
-    "key": "logout",
-    "type": "text",
-    "value": "Logout"
-  },
-  "todo_list": {
-    "key": "todo_list",
-    "type": "text",
-    "value": "My To-Do"
-  },
-  "hardware_manage": {
-    "key": "hardware_manage",
-    "type": "text",
-    "value": "Hardware"
-  },
-  "job_ticket_manage": {
-    "key": "job_ticket_manage",
-    "type": "text",
-    "value": "Jobs"
-  },
-  "data_manage": {
-    "key": "data_manage",
-    "type": "text",
-    "value": "Data"
-  },
-  "home": {
-    "key": "home",
-    "type": "text",
-    "value": "Home"
-  },
-  "auto_confirm": {
-    "key": "auto_confirm",
-    "type": "text",
-    "value": "Auto Confirm"
-  },
-  "click_confirm": {
-    "key": "click_confirm",
-    "type": "text",
-    "value": "Click Confirm"
-  },
-  "role_confirm": {
-    "key": "role_confirm",
-    "type": "text",
-    "value": "Role Confirm"
-  },
-  "admin": {
-    "key": "admin",
-    "type": "text",
-    "value": "Super Admin"
-  },
-  "jtdrawer": {
-    "key": "jtdrawer",
-    "type": "text",
-    "value": "Job Admin"
-  },
-  "jtlocker": {
-    "key": "jtlocker",
-    "type": "text",
-    "value": "Locker"
-  },
-  "jtcolocker": {
-    "key": "jtcolocker",
-    "type": "text",
-    "value": "Co-locker"
-  },
-  "jtguard": {
-    "key": "jtguard",
-    "type": "text",
-    "value": "Observer"
-  },
-  "sysconfig": {
-    "key": "sysconfig",
-    "type": "text",
-    "value": "System Configurator"
-  },
-  "force_shared_lock": {
-    "key": "force_shared_lock",
-    "type": "text",
-    "value": "Forced Shared-Lock Mode"
-  },
-  "force_multi_lock": {
-    "key": "force_multi_lock",
-    "type": "text",
-    "value": "Forced Multi-Lock Mode"
-  },
-  "mixed_mode": {
-    "key": "mixed_mode",
-    "type": "text",
-    "value": "Mixed Mode"
-  },
-  "lock_take_key": {
-    "key": "lock_take_key",
-    "type": "text",
-    "value": "Start Locking"
-  },
-  "lock_return_key": {
-    "key": "lock_return_key",
-    "type": "text",
-    "value": "Finish Locking"
-  },
-  "unlock_take_key": {
-    "key": "unlock_take_key",
-    "type": "text",
-    "value": "Start Unlocking"
-  },
-  "unlock_return_key": {
-    "key": "unlock_return_key",
-    "type": "text",
-    "value": "Finish Unlocking"
-  },
-  "release_colock": {
-    "key": "release_colock",
-    "type": "text",
-    "value": "Release Co-lock"
-  },
-  "confirm_exec": {
-    "key": "confirm_exec",
-    "type": "text",
-    "value": "Confirm Execution"
-  },
-  "unknown": {
-    "key": "unknown",
-    "type": "text",
-    "value": "Unknown To-Do"
-  },
-  "not_start": {
-    "key": "not_start",
-    "type": "text",
-    "value": "Not Started"
-  },
-  "select_member": {
-    "key": "select_member",
-    "type": "text",
-    "value": "Select Member"
-  },
-  "locking": {
-    "key": "locking",
-    "type": "text",
-    "value": "Locking"
-  },
-  "colocking": {
-    "key": "colocking",
-    "type": "text",
-    "value": "Co-locking"
-  },
-  "unlocking": {
-    "key": "unlocking",
-    "type": "text",
-    "value": "Unlocking"
-  },
-  "finished": {
-    "key": "finished",
-    "type": "text",
-    "value": "Finished"
-  },
-  "canceled": {
-    "key": "canceled",
-    "type": "text",
-    "value": "Canceled"
-  },
-  "progressing": {
-    "key": "progressing",
-    "type": "text",
-    "value": "In Progress"
-  },
-  "hydraulic_pressure": {
-    "key": "hydraulic_pressure",
-    "type": "text",
-    "value": "Hydraulic"
-  },
-  "electric_energy": {
-    "key": "electric_energy",
-    "type": "text",
-    "value": "Electrical Energy"
-  },
-  "potential_energy": {
-    "key": "potential_energy",
-    "type": "text",
-    "value": "Potential Energy"
-  },
-  "heat_energy": {
-    "key": "heat_energy",
-    "type": "text",
-    "value": "Thermal Energy"
-  },
-  "gas": {
-    "key": "gas",
-    "type": "text",
-    "value": "Gas"
-  },
-  "mechanical_energy": {
-    "key": "mechanical_energy",
-    "type": "text",
-    "value": "Mechanical Energy"
-  },
-  "air_energy": {
-    "key": "air_energy",
-    "type": "text",
-    "value": "Compressed Air"
-  },
-  "apply_master_key": {
-    "key": "apply_master_key",
-    "type": "text",
-    "value": "Apply for Master Key"
-  },
-  "apply_finish_job": {
-    "key": "apply_finish_job",
-    "type": "text",
-    "value": "Apply to Finish Job"
-  },
-  "apply_scrap_slot": {
-    "key": "apply_scrap_slot",
-    "type": "text",
-    "value": "Apply to Scrap Slot"
-  },
-  "apply_scrap_lock": {
-    "key": "apply_scrap_lock",
-    "type": "text",
-    "value": "Apply to Scrap Padlock"
-  },
-  "apply_scrap_key": {
-    "key": "apply_scrap_key",
-    "type": "text",
-    "value": "Apply to Scrap Key"
-  },
-  "slot_damage": {
-    "key": "slot_damage",
-    "type": "text",
-    "value": "Damaged Slot"
-  },
-  "lock_damage": {
-    "key": "lock_damage",
-    "type": "text",
-    "value": "Damaged Padlock"
-  },
-  "key_damage": {
-    "key": "key_damage",
-    "type": "text",
-    "value": "Damaged Key"
-  },
-  "job_cat_not_exec": {
-    "key": "job_cat_not_exec",
-    "type": "text",
-    "value": "Job Ticket Not Executable"
-  },
-  "pending": {
-    "key": "pending",
-    "type": "text",
-    "value": "Pending"
-  },
-  "processed": {
-    "key": "processed",
-    "type": "text",
-    "value": "Processed"
-  },
-  "canceld": {
-    "key": "canceld",
-    "type": "text",
-    "value": "Canceled"
-  },
-  "key": {
-    "key": "key",
-    "type": "text",
-    "value": "Key"
-  },
-  "slot": {
-    "key": "slot",
-    "type": "text",
-    "value": "Slot"
-  },
-  "job": {
-    "key": "job",
-    "type": "text",
-    "value": "Job"
-  },
-  "job_exception": {
-    "key": "job_exception",
-    "type": "text",
-    "value": "Job Exception"
-  },
-  "hardware_exception": {
-    "key": "hardware_exception",
-    "type": "text",
-    "value": "Hardware Exception"
-  },
-  "administrator": {
-    "key": "administrator",
-    "type": "text",
-    "value": "administrator"
-  },
-  "switch_layout": {
-    "key": "switch_layout",
-    "type": "text",
-    "value": "Switch Layout"
-  },
-  "switch_information": {
-    "key": "switch_information",
-    "type": "text",
-    "value": "Switch Info"
-  },
-  "switch_status": {
-    "key": "switch_status",
-    "type": "text",
-    "value": "Switch Status:"
-  },
-  "switch_id": {
-    "key": "switch_id",
-    "type": "text",
-    "value": "ID:{0}"
-  },
-  "switch_open": {
-    "key": "switch_open",
-    "type": "text",
-    "value": "Unlocked"
-  },
-  "switch_close": {
-    "key": "switch_close",
-    "type": "text",
-    "value": "Locked"
-  },
-  "switch_alarm": {
-    "key": "switch_alarm",
-    "type": "text",
-    "value": "Alarm"
-  },
-  "position": {
-    "key": "position",
-    "type": "text",
-    "value": "Position"
-  },
-  "default_map": {
-    "key": "default_map",
-    "type": "text",
-    "value": "Default Map"
-  },
-  "update_info": {
-    "key": "update_info",
-    "type": "text",
-    "value": "Update Info"
-  },
-  "add_to_map_x": {
-    "key": "add_to_map_x",
-    "type": "text",
-    "value": "Coordinate X:"
-  },
-  "add_to_map_point_name": {
-    "key": "add_to_map_point_name",
-    "type": "text",
-    "value": "Point Name:"
-  },
-  "add_to_map_y": {
-    "key": "add_to_map_y",
-    "type": "text",
-    "value": "Coordinate Y:"
-  },
-  "please_set_point_coordinate_first": {
-    "key": "please_set_point_coordinate_first",
-    "type": "text",
-    "value": "please_set_point_coordinate_first"
-  },
-  "add_to_map_point_serial_number": {
-    "key": "add_to_map_point_serial_number",
-    "type": "text",
-    "value": "Point Serial Number:"
-  },
-  "please_input_x_in_map": {
-    "key": "please_input_x_in_map",
-    "type": "text",
-    "value": "Please input coordinate X(Max 1920)"
-  },
-  "please_input_y_in_map": {
-    "key": "please_input_y_in_map",
-    "type": "text",
-    "value": "Please input coordinate Y(Max 1080)"
-  },
-  "please_input_point_serial_number": {
-    "key": "please_input_point_serial_number",
-    "type": "text",
-    "value": "Please input point serial number(0-31)"
-  },
-  "data_exception": {
-    "key": "data_exception",
-    "type": "text",
-    "value": "Data exception"
-  },
-  "remove": {
-    "key": "remove",
-    "type": "text",
-    "value": "remove"
-  },
-  "workstation_info": {
-    "key": "workstation_info",
-    "type": "text",
-    "value": "Area info"
-  },
-  "year": {
-    "key": "year",
-    "type": "text",
-    "value": ""
-  },
-  "month": {
-    "key": "month",
-    "type": "text",
-    "value": ""
-  },
-  "day": {
-    "key": "day",
-    "type": "text",
-    "value": ""
-  },
-  "hour": {
-    "key": "hour",
-    "type": "text",
-    "value": ""
-  },
-  "min": {
-    "key": "min",
-    "type": "text",
-    "value": ""
-  },
-  "sec": {
-    "key": "sec",
-    "type": "text",
-    "value": ""
-  },
-  "please_select_backup_file": {
-    "key": "please_select_backup_file",
-    "type": "text",
-    "value": "Please select backup file"
-  },
-  "export_selected_backup_file_confirm": {
-    "key": "export_selected_backup_file_confirm",
-    "type": "text",
-    "value": "Launch the path selector, select and click on the bottom right corner to choose 'Export'"
-  },
-  "header_pulling": {
-    "key": "header_pulling",
-    "type": "text",
-    "value": "Pull down to refresh"
-  },
-  "header_refreshing": {
-    "key": "header_refreshing",
-    "type": "text",
-    "value": "Refreshing..."
-  },
-  "header_loading": {
-    "key": "header_loading",
-    "type": "text",
-    "value": "Loading..."
-  },
-  "header_release": {
-    "key": "header_release",
-    "type": "text",
-    "value": "Release to refresh"
-  },
-  "header_finish": {
-    "key": "header_finish",
-    "type": "text",
-    "value": "Refresh complete"
-  },
-  "header_failed": {
-    "key": "header_failed",
-    "type": "text",
-    "value": "Refresh failed"
-  },
-  "header_update": {
-    "key": "header_update",
-    "type": "text",
-    "value": "'Last update' M-d HH:mm"
-  },
-  "header_secondary": {
-    "key": "header_secondary",
-    "type": "text",
-    "value": "Release to enter second floor"
-  },
-  "footer_pulling": {
-    "key": "footer_pulling",
-    "type": "text",
-    "value": "Pull up to load more"
-  },
-  "footer_release": {
-    "key": "footer_release",
-    "type": "text",
-    "value": "Release to load"
-  },
-  "footer_loading": {
-    "key": "footer_loading",
-    "type": "text",
-    "value": "Refreshing..."
-  },
-  "footer_refreshing": {
-    "key": "footer_refreshing",
-    "type": "text",
-    "value": "Loading..."
-  },
-  "footer_finish": {
-    "key": "footer_finish",
-    "type": "text",
-    "value": "Load complete"
-  },
-  "footer_failed": {
-    "key": "footer_failed",
-    "type": "text",
-    "value": "Load failed"
-  },
-  "footer_nothing": {
-    "key": "footer_nothing",
-    "type": "text",
-    "value": "No more data"
-  },
-  "set_default": {
-    "key": "set_default",
-    "type": "text",
-    "value": "Set as default"
-  },
-  "show_in_map": {
-    "key": "show_in_map",
-    "type": "text",
-    "value": "Show in Map"
-  },
-  "max_fingerprint_insert_tip": {
-    "key": "max_fingerprint_insert_tip",
-    "type": "text",
-    "value": "(Up to {0} fingerprints can be entered)"
-  },
-  "fingerprint_limit_tip": {
-    "key": "fingerprint_limit_tip",
-    "type": "text",
-    "value": "The number of fingerprints has reached the upper limit"
-  },
-  "max_fingerprint_insert": {
-    "key": "max_fingerprint_insert",
-    "type": "text",
-    "value": "Max fingerprint entries:"
-  },
-  "auto_logout_time": {
-    "key": "auto_logout_time",
-    "type": "text",
-    "value": "Auto logout time (min 1, max 10, unit: min):"
-  },
-  "please_input_max_fingerprint_entries_size": {
-    "key": "please_input_max_fingerprint_entries_size",
-    "type": "text",
-    "value": "Please input max fingerprint entries size"
-  },
-  "please_input_auto_logout_time": {
-    "key": "please_input_auto_logout_time",
-    "type": "text",
-    "value": "Please input auto logout time"
-  },
-  "please_input_auto_logout_time_correct": {
-    "key": "please_input_auto_logout_time_correct",
-    "type": "text",
-    "value": "Please input auto logout time correct"
-  },
-  "data_export": {
-    "key": "data_export",
-    "type": "text",
-    "value": "Data Export"
-  },
-  "data_export_tip": {
-    "key": "data_export",
-    "type": "text",
-    "value": "Please select the table you want to export and click Export."
-  },
-  "data_table": {
-    "key": "data_table",
-    "type": "text",
-    "value": "Data Table"
-  },
-  "last_export_datetime": {
-    "key": "last_export_datetime",
-    "type": "text",
-    "value": "Last export time"
-  },
-  "please_select_data_you_want_to_export": {
-    "key": "please_select_data_you_want_to_export",
-    "type": "text",
-    "value": "Please select the data table you want to export."
-  },
-  "data_export_success_tip": {
-    "key": "data_export_success_tip",
-    "type": "text",
-    "value": "Data Export completed. Please select a folder and click the bottom right button to save."
-  },
-  "data_export_error": {
-    "key": "data_export_error",
-    "type": "text",
-    "value": "Data Export failed."
-  },
-  "user": {
-    "key": "user",
-    "type": "text",
-    "value": "User"
-  },
-  "role": {
-    "key": "role",
-    "type": "text",
-    "value": "Role"
-  },
-  "workstation": {
-    "key": "workstation",
-    "type": "text",
-    "value": "Area"
-  },
-  "point": {
-    "key": "point",
-    "type": "text",
-    "value": "Point"
-  },
-  "sop": {
-    "key": "sop",
-    "type": "text",
-    "value": "SOP"
-  },
-  "exporting": {
-    "key": "exporting",
-    "type": "text",
-    "value": "Exporting……"
-  },
-  "data_in_backup": {
-    "key": "data_in_backup",
-    "type": "text",
-    "value": "Data backup in progress……"
-  },
-  "hardware_mode": {
-    "key": "hardware_mode",
-    "type": "text",
-    "value": "Hardware mode (mode modification and saving require restarting the application)"
-  },
-  "password": {
-    "key": "password",
-    "type": "text",
-    "value": "Password"
-  },
-  "init_hardware_mode": {
-    "key": "hardware_mode",
-    "type": "text",
-    "value": "Hardware Mode"
-  },
-  "password_hint": {
-    "key": "password_hint",
-    "type": "text",
-    "value": "6–20: letters/numbers/symbols"
-  },
-  "all_slot_turn_on": {
-    "key": "all_slot_turn_on",
-    "type": "text",
-    "value": "All slot turn on"
-  },
-  "all_slot_turn_off": {
-    "key": "all_slot_turn_off",
-    "type": "text",
-    "value": "All slot turn off"
-  },
-  "all_new_lock_registration": {
-    "key": "all_new_lock_registration",
-    "type": "text",
-    "value": "Register all new pedLocks"
-  },
-  "todo_wait": {
-    "key": "todo_wait",
-    "type": "text",
-    "value": "Wait:"
-  },
-  "excp_job_name_title": {
-    "key": "excp_job_name_title",
-    "type": "text",
-    "value": "Exception Job Name"
-  },
-  "allow_colocker_login_to_colock": {
-    "key": "allow_colocker_login_to_colock",
-    "type": "text",
-    "value": "Allow co-locker login to coLock"
-  },
-  "please_input_username_min_size": {
-    "key": "please_input_username_min_size",
-    "type": "text",
-    "value": "Please input username min size"
-  },
-  "username_min_size": {
-    "key": "username_min_size",
-    "type": "text",
-    "value": "Username min size(1-6)"
-  }
-}

+ 0 - 4182
app/src/main/assets/i18n/zh-CN.json

@@ -1,4182 +0,0 @@
-{
-  "i18n.language_name": {
-    "key": "i18n.language_name",
-    "type": "text",
-    "value": "中文"
-  },
-  "abnormal": {
-    "key": "abnormal",
-    "type": "text",
-    "value": "异常"
-  },
-  "password_login": {
-    "key": "password_login",
-    "type": "text",
-    "value": "密码登录"
-  },
-  "action_confirm": {
-    "key": "action_confirm",
-    "type": "text",
-    "value": "操作确认"
-  },
-  "action_confirm_content": {
-    "key": "action_confirm_content",
-    "type": "text",
-    "value": "确定要执行{0}吗?"
-  },
-  "action_failed": {
-    "key": "action_failed",
-    "type": "text",
-    "value": "操作失败"
-  },
-  "action_hint": {
-    "key": "action_hint",
-    "type": "text",
-    "value": "操作提醒"
-  },
-  "action_succeed": {
-    "key": "action_succeed",
-    "type": "text",
-    "value": "操作成功"
-  },
-  "add_card_failed": {
-    "key": "add_card_failed",
-    "type": "text",
-    "value": "添加卡片失败"
-  },
-  "add_card_succeed": {
-    "key": "add_card_succeed",
-    "type": "text",
-    "value": "添加卡片成功"
-  },
-  "add_colocker": {
-    "key": "add_colocker",
-    "type": "text",
-    "value": "添加共锁人({0})"
-  },
-  "add_group": {
-    "key": "add_group",
-    "type": "text",
-    "value": "添加分组"
-  },
-  "add_key_failed": {
-    "key": "add_key_failed",
-    "type": "text",
-    "value": "新增钥匙失败"
-  },
-  "add_key_succeed": {
-    "key": "add_key_succeed",
-    "type": "text",
-    "value": "新增钥匙成功"
-  },
-  "add_lock_failed": {
-    "key": "add_lock_failed",
-    "type": "text",
-    "value": "添加挂锁失败"
-  },
-  "add_lock_succeed": {
-    "key": "add_lock_succeed",
-    "type": "text",
-    "value": "添加挂锁成功"
-  },
-  "add_point_failed": {
-    "key": "add_point_failed",
-    "type": "text",
-    "value": "新增隔离点失败"
-  },
-  "add_point_succeed": {
-    "key": "add_point_succeed",
-    "type": "text",
-    "value": "新增隔离点成功"
-  },
-  "add_rfid_token_failed": {
-    "key": "add_rfid_token_failed",
-    "type": "text",
-    "value": "添加RFID标签失败"
-  },
-  "add_rfid_token_succeed": {
-    "key": "add_rfid_token_succeed",
-    "type": "text",
-    "value": "添加RFID标签成功"
-  },
-  "add_role_failed": {
-    "key": "add_role_failed",
-    "type": "text",
-    "value": "新增角色失败"
-  },
-  "add_role_succeed": {
-    "key": "add_role_succeed",
-    "type": "text",
-    "value": "新增角色成功"
-  },
-  "add_user_succeed": {
-    "key": "add_user_succeed",
-    "type": "text",
-    "value": "新增用户成功"
-  },
-  "add_workstation_failed": {
-    "key": "add_workstation_failed",
-    "type": "text",
-    "value": "新增区域失败"
-  },
-  "add_workstation_succeed": {
-    "key": "add_workstation_succeed",
-    "type": "text",
-    "value": "新增区域成功"
-  },
-  "admin_role_can_not_edit": {
-    "key": "admin_role_can_not_edit",
-    "type": "text",
-    "value": "管理员角色无法编辑"
-  },
-  "admin_username": {
-    "key": "admin_username",
-    "type": "text",
-    "value": "管理员账号:(数字、字母)"
-  },
-  "all": {
-    "key": "all",
-    "type": "text",
-    "value": "全部"
-  },
-  "all_hardware_tv": {
-    "key": "all_hardware_tv",
-    "type": "text",
-    "value": "全部硬件"
-  },
-  "all_job_tv": {
-    "key": "all_job_tv",
-    "type": "text",
-    "value": "全部作业"
-  },
-  "all_points_tv": {
-    "key": "all_points_tv",
-    "type": "text",
-    "value": "全部点位"
-  },
-  "all_quick_entrance": {
-    "key": "all_quick_entrance",
-    "type": "text",
-    "value": "所有快捷入口"
-  },
-  "all_select_not_all_select": {
-    "key": "all_select_not_all_select",
-    "type": "text",
-    "value": "全选/全不选"
-  },
-  "already_colock": {
-    "key": "already_colock",
-    "type": "text",
-    "value": "已共锁({0})"
-  },
-  "already_uncolock": {
-    "key": "already_uncolock",
-    "type": "text",
-    "value": "已解除共锁({0})"
-  },
-  "back": {
-    "key": "back",
-    "type": "text",
-    "value": "返回"
-  },
-  "base_info_title": {
-    "key": "base_info_title",
-    "type": "text",
-    "value": "基本信息"
-  },
-  "ble_connect_fail": {
-    "key": "ble_connect_fail",
-    "type": "text",
-    "value": "连接失败,请重试!"
-  },
-  "ble_connecting": {
-    "key": "ble_connecting",
-    "type": "text",
-    "value": "连接中,请稍后..."
-  },
-  "can_not_remove_current_colocker": {
-    "key": "can_not_remove_current_colocker",
-    "type": "text",
-    "value": "无法移除当前共锁人"
-  },
-  "can_not_remove_current_locker": {
-    "key": "can_not_remove_current_locker",
-    "type": "text",
-    "value": "无法移除当前上锁人"
-  },
-  "cancel": {
-    "key": "cancel",
-    "type": "text",
-    "value": "取消"
-  },
-  "cancel_countdown": {
-    "key": "cancel_countdown",
-    "type": "text",
-    "value": "取消({0}秒)"
-  },
-  "cancel_exception": {
-    "key": "cancel_exception",
-    "type": "text",
-    "value": "取消异常"
-  },
-  "cancel_exception_failed": {
-    "key": "cancel_exception_failed",
-    "type": "text",
-    "value": "取消异常失败"
-  },
-  "cancel_exception_success": {
-    "key": "cancel_exception_success",
-    "type": "text",
-    "value": "异常取消成功"
-  },
-  "cancel_job": {
-    "key": "cancel_job",
-    "type": "text",
-    "value": "取消作业"
-  },
-  "cancel_job_tip": {
-    "key": "cancel_job_tip",
-    "type": "text",
-    "value": "是否确认取消当前作业"
-  },
-  "capture_tip_content": {
-    "key": "capture_tip_content",
-    "type": "text",
-    "value": "1. 系统将自动拍摄照片,在拍摄过程中请确保:\n      · 脸部正对摄像头\n      · 保持适当距离,让整个脸部出现在左侧框中\n      · 光线充足\n      · 表情自然\n2. 拍摄完成后,您可以点击确认按钮进行提交,也可以点击重拍按钮重新进行拍摄。\n3. 取消录入,请点击取消按钮"
-  },
-  "capture_tip_title": {
-    "key": "capture_tip_title",
-    "type": "text",
-    "value": "录入提示"
-  },
-  "card_already_registration": {
-    "key": "card_already_registration",
-    "type": "text",
-    "value": "卡片已录入"
-  },
-  "card_code": {
-    "key": "card_code",
-    "type": "text",
-    "value": "卡片名称"
-  },
-  "card_login": {
-    "key": "card_login",
-    "type": "text",
-    "value": "刷卡登录"
-  },
-  "card_manage_card_detail_title": {
-    "key": "card_manage_card_detail_title",
-    "type": "text",
-    "value": "卡片详情"
-  },
-  "card_manage_delete_failed": {
-    "key": "card_manage_delete_failed",
-    "type": "text",
-    "value": "卡片删除失败"
-  },
-  "card_manage_delete_succeed": {
-    "key": "card_manage_delete_succeed",
-    "type": "text",
-    "value": "卡片删除成功"
-  },
-  "card_manage_new_card_title": {
-    "key": "card_manage_new_card_title",
-    "type": "text",
-    "value": "新增卡片"
-  },
-  "card_manage_title": {
-    "key": "card_manage_title",
-    "type": "text",
-    "value": "卡片管理"
-  },
-  "card_nfc": {
-    "key": "card_nfc",
-    "type": "text",
-    "value": "卡片 NFC"
-  },
-  "change_to_standard": {
-    "key": "change_to_standard",
-    "type": "text",
-    "value": "切换标准版"
-  },
-  "check_before_unlocking": {
-    "key": "check_before_unlocking",
-    "type": "text",
-    "value": "取锁前检查"
-  },
-  "check_delete_card": {
-    "key": "check_delete_card",
-    "type": "text",
-    "value": "确定要删除选中的卡片吗?"
-  },
-  "check_delete_job": {
-    "key": "check_delete_job",
-    "type": "text",
-    "value": "您确认要删除作业吗"
-  },
-  "check_delete_key": {
-    "key": "check_delete_key",
-    "type": "text",
-    "value": "您确定要删除选中的钥匙吗"
-  },
-  "check_delete_lock": {
-    "key": "check_delete_lock",
-    "type": "text",
-    "value": "确定要删除选中的挂锁吗?"
-  },
-  "check_delete_point": {
-    "key": "check_delete_point",
-    "type": "text",
-    "value": "您确定要删除隔离点吗"
-  },
-  "check_delete_rfid_token": {
-    "key": "check_delete_rfid_token",
-    "type": "text",
-    "value": "确定要删除选中的RFID标签吗?"
-  },
-  "check_delete_role": {
-    "key": "check_delete_role",
-    "type": "text",
-    "value": "您确认要删除角色吗"
-  },
-  "check_delete_sop": {
-    "key": "check_delete_sop",
-    "type": "text",
-    "value": "您确定要删除选中的SOP吗"
-  },
-  "check_delete_user": {
-    "key": "check_delete_user",
-    "type": "text",
-    "value": "您确认要删除用户吗?"
-  },
-  "check_delete_workflow_mode": {
-    "key": "check_delete_workflow_mode",
-    "type": "text",
-    "value": "确定要删除选中的流程模式吗"
-  },
-  "check_delete_workstation": {
-    "key": "check_delete_workstation",
-    "type": "text",
-    "value": "您确定要删除区域{0}吗"
-  },
-  "check_device_info": {
-    "key": "check_device_info",
-    "type": "text",
-    "value": "检测到未注册钥匙{0}把"
-  },
-  "check_key_and_lock": {
-    "key": "check_key_and_lock",
-    "type": "text",
-    "value": "正在检查钥匙和挂锁"
-  },
-  "check_lock_is_new_device": {
-    "key": "check_lock_is_new_device",
-    "type": "text",
-    "value": "检查挂锁是否为新硬件"
-  },
-  "check_new_key_need_register": {
-    "key": "check_new_key_need_register",
-    "type": "text",
-    "value": "检测到新钥匙,是否注册"
-  },
-  "check_new_lock_need_register": {
-    "key": "check_new_lock_need_register",
-    "type": "text",
-    "value": "检测到新挂锁,是否注册"
-  },
-  "close": {
-    "key": "close",
-    "type": "text",
-    "value": "关闭"
-  },
-  "colock": {
-    "key": "colock",
-    "type": "text",
-    "value": "添加共锁"
-  },
-  "colock_complete": {
-    "key": "colock_complete",
-    "type": "text",
-    "value": "添加共锁完成"
-  },
-  "colock_failed": {
-    "key": "colock_failed",
-    "type": "text",
-    "value": "添加共锁失败"
-  },
-  "colocker": {
-    "key": "colocker",
-    "type": "text",
-    "value": "共锁人"
-  },
-  "confirm": {
-    "key": "confirm",
-    "type": "text",
-    "value": "确认"
-  },
-  "confirm_cancel_exception": {
-    "key": "confirm_cancel_exception",
-    "type": "text",
-    "value": "是否确认取消异常"
-  },
-  "confirm_create_lock_job": {
-    "key": "confirm_create_lock_job",
-    "type": "text",
-    "value": "确认是否创建上锁作业"
-  },
-  "confirm_create_unlock_job": {
-    "key": "confirm_create_unlock_job",
-    "type": "text",
-    "value": "是否创建解锁作业"
-  },
-  "confirm_handle_exception": {
-    "key": "confirm_handle_exception",
-    "type": "text",
-    "value": "是否确认处理异常"
-  },
-  "confirm_to_colock": {
-    "key": "confirm_to_colock",
-    "type": "text",
-    "value": "{0}是否确认共锁?"
-  },
-  "confirm_to_uncolock": {
-    "key": "confirm_to_uncolock",
-    "type": "text",
-    "value": "{0}是否确认解除共锁?"
-  },
-  "continue_the_ticket": {
-    "key": "continue_the_ticket",
-    "type": "text",
-    "value": "请继续完成作业票"
-  },
-  "create_job_failed": {
-    "key": "create_job_failed",
-    "type": "text",
-    "value": "创建作业失败"
-  },
-  "create_job_name": {
-    "key": "create_job_name",
-    "type": "text",
-    "value": "作业名称"
-  },
-  "create_job_title": {
-    "key": "create_job_title",
-    "type": "text",
-    "value": "新建作业"
-  },
-  "create_sop_job_sop": {
-    "key": "create_sop_job_sop",
-    "type": "text",
-    "value": "SOP"
-  },
-  "create_sop_job_tip": {
-    "key": "create_sop_job_tip",
-    "type": "text",
-    "value": "确定要执行作业{0}吗?"
-  },
-  "create_sop_job_title": {
-    "key": "create_sop_job_title",
-    "type": "text",
-    "value": "新建SOP作业"
-  },
-  "create_sop_name": {
-    "key": "create_sop_name",
-    "type": "text",
-    "value": "SOP名称"
-  },
-  "create_sop_title": {
-    "key": "create_sop_title",
-    "type": "text",
-    "value": "新建SOP"
-  },
-  "current_job_has_cross_job": {
-    "key": "current_job_has_cross_job",
-    "type": "text",
-    "value": "警告!当前作业存在交叉作业,是否继续处理异常"
-  },
-  "current_role_no_user": {
-    "key": "current_role_no_user",
-    "type": "text",
-    "value": "当前角色暂无用户"
-  },
-  "current_slot_has_no_key": {
-    "key": "current_slot_has_no_key",
-    "type": "text",
-    "value": "当前仓位不存在钥匙"
-  },
-  "current_slot_has_no_lock": {
-    "key": "current_slot_has_no_lock",
-    "type": "text",
-    "value": "当前仓位不存在挂锁"
-  },
-  "current_sop_has_job_in_progress": {
-    "key": "current_sop_has_job_in_progress",
-    "type": "text",
-    "value": "当前SOP存在进行中的作业"
-  },
-  "current_ticket_report_lock_take_exception_tip": {
-    "key": "current_ticket_report_lock_take_exception_tip",
-    "type": "text",
-    "value": "当前作业挂锁上报异常,请归还挂锁"
-  },
-  "current_user_has_not_face_data": {
-    "key": "current_user_has_not_face_data",
-    "type": "text",
-    "value": "当前用户不存在人脸数据"
-  },
-  "current_workflow_mode_error": {
-    "key": "current_workflow_mode_error",
-    "type": "text",
-    "value": "当前流程模式错误"
-  },
-  "currently_no_hardware_can_be_report": {
-    "key": "currently_no_hardware_can_be_report",
-    "type": "text",
-    "value": "当前没有硬件可以上报"
-  },
-  "currently_no_job_can_be_report": {
-    "key": "currently_no_job_can_be_report",
-    "type": "text",
-    "value": "当前没有作业可以上报"
-  },
-  "currently_unable_to_lock_together": {
-    "key": "currently_unable_to_lock_together",
-    "type": "text",
-    "value": "当前阶段无法共锁"
-  },
-  "data_content_error": {
-    "key": "data_content_error",
-    "type": "text",
-    "value": "数据内容错误"
-  },
-  "data_decrypt_failed": {
-    "key": "data_decrypt_failed",
-    "type": "text",
-    "value": "数据解密失败"
-  },
-  "data_file_is_corrupted": {
-    "key": "data_file_is_corrupted",
-    "type": "text",
-    "value": "数据文件已损坏"
-  },
-  "data_file_not_exists": {
-    "key": "data_file_not_exists",
-    "type": "text",
-    "value": "数据文件不存在"
-  },
-  "date": {
-    "key": "date",
-    "type": "text",
-    "value": "{0}年{1}月{2}日"
-  },
-  "delete": {
-    "key": "delete",
-    "type": "text",
-    "value": "删除"
-  },
-  "delete_group": {
-    "key": "delete_group",
-    "type": "text",
-    "value": "删除分组"
-  },
-  "delete_success": {
-    "key": "delete_success",
-    "type": "text",
-    "value": "删除成功"
-  },
-  "detail": {
-    "key": "detail",
-    "type": "text",
-    "value": "详情"
-  },
-  "detect_face_tip": {
-    "key": "detect_face_tip",
-    "type": "text",
-    "value": "检测到人脸,即将拍摄"
-  },
-  "detect_port": {
-    "key": "detect_port",
-    "type": "text",
-    "value": "正在扫描设备......"
-  },
-  "detect_slot": {
-    "key": "detect_slot",
-    "type": "text",
-    "value": "检测仓位"
-  },
-  "device_in_detect": {
-    "key": "device_in_detect",
-    "type": "text",
-    "value": "设备识别中"
-  },
-  "do_you_want_to_remove_exception": {
-    "key": "do_you_want_to_remove_exception",
-    "type": "text",
-    "value": "是否确认移除该异常"
-  },
-  "doing_checking": {
-    "key": "doing_checking",
-    "type": "text",
-    "value": "正在验证......"
-  },
-  "doing_login": {
-    "key": "doing_login",
-    "type": "text",
-    "value": "正在登录······"
-  },
-  "done_header": {
-    "key": "done_header",
-    "type": "text",
-    "value": "已处理"
-  },
-  "edit": {
-    "key": "edit",
-    "type": "text",
-    "value": "编辑"
-  },
-  "edit_job_title": {
-    "key": "edit_job_title",
-    "type": "text",
-    "value": "作业详情"
-  },
-  "edit_sop_job_title": {
-    "key": "edit_sop_job_title",
-    "type": "text",
-    "value": "SOP作业详情"
-  },
-  "edit_sop_title": {
-    "key": "edit_sop_title",
-    "type": "text",
-    "value": "SOP详情"
-  },
-  "end": {
-    "key": "end",
-    "type": "text",
-    "value": "结束作业"
-  },
-  "end_job": {
-    "key": "end_job",
-    "type": "text",
-    "value": "结束作业"
-  },
-  "end_time": {
-    "key": "end_time",
-    "type": "text",
-    "value": "结束时间"
-  },
-  "ensure_power_isolation": {
-    "key": "ensure_power_isolation",
-    "type": "text",
-    "value": "能量隔离证实"
-  },
-  "error_date_range_invalid": {
-    "key": "error_date_range_invalid",
-    "type": "text",
-    "value": "开始时间不能晚于结束时间"
-  },
-  "exception_data_not_exists": {
-    "key": "exception_data_not_exists",
-    "type": "text",
-    "value": "异常数据不存在"
-  },
-  "exception_description": {
-    "key": "exception_description",
-    "type": "text",
-    "value": "异常描述:"
-  },
-  "exception_description_tv": {
-    "key": "exception_description_tv",
-    "type": "text",
-    "value": "异常描述"
-  },
-  "exception_detail_title": {
-    "key": "exception_detail_title",
-    "type": "text",
-    "value": "异常详情"
-  },
-  "exception_info": {
-    "key": "exception_info",
-    "type": "text",
-    "value": "异常信息"
-  },
-  "exception_job": {
-    "key": "exception_job",
-    "type": "text",
-    "value": "异常作业"
-  },
-  "exception_job_title": {
-    "key": "exception_job_title",
-    "type": "text",
-    "value": "异常作业"
-  },
-  "exception_lost": {
-    "key": "exception_lost",
-    "type": "text",
-    "value": "异常丢失"
-  },
-  "exception_manage_title": {
-    "key": "exception_manage_title",
-    "type": "text",
-    "value": "异常管理"
-  },
-  "exception_occurrence_time": {
-    "key": "exception_occurrence_time",
-    "type": "text",
-    "value": "异常发生时间:"
-  },
-  "exception_occurrence_time_header": {
-    "key": "exception_occurrence_time_header",
-    "type": "text",
-    "value": "发生时间"
-  },
-  "exception_reason": {
-    "key": "exception_reason",
-    "type": "text",
-    "value": "异常信息"
-  },
-  "exception_release_time": {
-    "key": "exception_release_time",
-    "type": "text",
-    "value": "异常解除时间:"
-  },
-  "exception_report": {
-    "key": "exception_report",
-    "type": "text",
-    "value": "异常上报"
-  },
-  "exception_report_success": {
-    "key": "exception_report_success",
-    "type": "text",
-    "value": "异常上报成功"
-  },
-  "exception_reporter": {
-    "key": "exception_reporter",
-    "type": "text",
-    "value": "上报人:"
-  },
-  "exception_source": {
-    "key": "exception_source",
-    "type": "text",
-    "value": "异常源:"
-  },
-  "exception_source_tv": {
-    "key": "exception_source_tv",
-    "type": "text",
-    "value": "异常源"
-  },
-  "exception_status": {
-    "key": "exception_status",
-    "type": "text",
-    "value": "状态:"
-  },
-  "exception_status_header": {
-    "key": "exception_status_header",
-    "type": "text",
-    "value": "异常状态"
-  },
-  "exception_type": {
-    "key": "exception_type",
-    "type": "text",
-    "value": "异常类型:"
-  },
-  "exception_type_header": {
-    "key": "exception_type_header",
-    "type": "text",
-    "value": "异常类型"
-  },
-  "exception_type_tv": {
-    "key": "exception_type_tv",
-    "type": "text",
-    "value": "异常类型"
-  },
-  "expand_collapse": {
-    "key": "expand_collapse",
-    "type": "text",
-    "value": "展开/折叠"
-  },
-  "face_can_not_process": {
-    "key": "face_can_not_process",
-    "type": "text",
-    "value": "人脸引擎激活失败,识别暂不可用"
-  },
-  "face_detected_do_login": {
-    "key": "face_detected_do_login",
-    "type": "text",
-    "value": "检测到人脸,正在登录······"
-  },
-  "face_login": {
-    "key": "face_login",
-    "type": "text",
-    "value": "人脸登录"
-  },
-  "face_login_failed": {
-    "key": "face_login_failed",
-    "type": "text",
-    "value": "人脸匹配失败,请重试"
-  },
-  "face_login_success": {
-    "key": "face_login_success",
-    "type": "text",
-    "value": "人脸验证通过"
-  },
-  "face_not_set_tip": {
-    "key": "face_not_set_tip",
-    "type": "text",
-    "value": "您尚未设置人脸数据"
-  },
-  "face_set_tip": {
-    "key": "face_set_tip",
-    "type": "text",
-    "value": "您已设置了人脸数据"
-  },
-  "file_not_exists": {
-    "key": "file_not_exists",
-    "type": "text",
-    "value": "文件不存在"
-  },
-  "filter": {
-    "key": "filter",
-    "type": "text",
-    "value": "筛选"
-  },
-  "fingerprint_add_success_tip": {
-    "key": "fingerprint_add_success_tip",
-    "type": "text",
-    "value": "已成功添加指纹数据"
-  },
-  "fingerprint_code": {
-    "key": "fingerprint_code",
-    "type": "text",
-    "value": "指纹编号"
-  },
-  "fingerprint_code_str": {
-    "key": "fingerprint_code_str",
-    "type": "text",
-    "value": "指纹_{0}"
-  },
-  "fingerprint_delete_confirm_tip": {
-    "key": "fingerprint_delete_confirm_tip",
-    "type": "text",
-    "value": "确定要删除{0}吗?"
-  },
-  "fingerprint_delete_selected_confirm_tip": {
-    "key": "fingerprint_delete_selected_confirm_tip",
-    "type": "text",
-    "value": "确定要删除选中的指纹吗?"
-  },
-  "fingerprint_login": {
-    "key": "fingerprint_login",
-    "type": "text",
-    "value": "指纹登录"
-  },
-  "fingerprint_login_failed": {
-    "key": "fingerprint_login_failed",
-    "type": "text",
-    "value": "指纹识别失败,请重试"
-  },
-  "fingerprint_login_success": {
-    "key": "fingerprint_login_success",
-    "type": "text",
-    "value": "指纹验证通过"
-  },
-  "fingerprint_scan_tip": {
-    "key": "fingerprint_scan_tip",
-    "type": "text",
-    "value": "请连续按压{0}次指纹识别区"
-  },
-  "finish_job_tip": {
-    "key": "finish_job_tip",
-    "type": "text",
-    "value": "是否确认结束当前作业"
-  },
-  "finish_the_job": {
-    "key": "finish_the_job",
-    "type": "text",
-    "value": "结束作业"
-  },
-  "get_key_info_fail": {
-    "key": "get_key_info_fail",
-    "type": "text",
-    "value": "获取钥匙信息失败"
-  },
-  "go_locking": {
-    "key": "go_locking",
-    "type": "text",
-    "value": "去上锁"
-  },
-  "go_unlocking": {
-    "key": "go_unlocking",
-    "type": "text",
-    "value": "去解锁"
-  },
-  "group_at_least_has_one_point": {
-    "key": "group_at_least_has_one_point",
-    "type": "text",
-    "value": "每个分组至少需要存在一个点位"
-  },
-  "group_job_in_progress": {
-    "key": "group_job_in_progress",
-    "type": "text",
-    "value": "分组作业进行中"
-  },
-  "group_name_must_not_empty": {
-    "key": "group_name_must_not_empty",
-    "type": "text",
-    "value": "分组名称不能为空"
-  },
-  "handle": {
-    "key": "handle",
-    "type": "text",
-    "value": "处理"
-  },
-  "handle_colock": {
-    "key": "handle_colock",
-    "type": "text",
-    "value": "请确认是否要进行添加共锁"
-  },
-  "handle_exception": {
-    "key": "handle_exception",
-    "type": "text",
-    "value": "处理异常"
-  },
-  "handle_exception_success": {
-    "key": "handle_exception_success",
-    "type": "text",
-    "value": "异常处理成功"
-  },
-  "handle_exception_will_release_all_colock": {
-    "key": "handle_exception_will_release_all_colock",
-    "type": "text",
-    "value": "警告!处理异常将移除所有共锁,请确认是否继续"
-  },
-  "handle_failed": {
-    "key": "handle_failed",
-    "type": "text",
-    "value": "处理失败"
-  },
-  "handle_lock_take_key": {
-    "key": "handle_lock_take_key",
-    "type": "text",
-    "value": "确认获取钥匙进行上锁吗?"
-  },
-  "handle_release_colock": {
-    "key": "handle_release_colock",
-    "type": "text",
-    "value": "请确认是否要进行解除共锁"
-  },
-  "handle_step_confirm": {
-    "key": "handle_step_confirm",
-    "type": "text",
-    "value": "请确认是否完成[{0}]"
-  },
-  "handle_time": {
-    "key": "handle_time",
-    "type": "text",
-    "value": "处理时间:"
-  },
-  "handle_time_custom_time_range": {
-    "key": "handle_time_custom_time_range",
-    "type": "text",
-    "value": "自定义区间"
-  },
-  "handle_time_last_30_days": {
-    "key": "handle_time_last_30_days",
-    "type": "text",
-    "value": "近30天"
-  },
-  "handle_time_last_7_days": {
-    "key": "handle_time_last_7_days",
-    "type": "text",
-    "value": "近7天"
-  },
-  "handle_unknown": {
-    "key": "handle_unknown",
-    "type": "text",
-    "value": "当前处理类型未知,无法处理"
-  },
-  "handle_unlock_take_key": {
-    "key": "handle_unlock_take_key",
-    "type": "text",
-    "value": "确认获取钥匙进行解锁吗?"
-  },
-  "hardware_in_use_tv": {
-    "key": "hardware_in_use_tv",
-    "type": "text",
-    "value": "使用中的硬件"
-  },
-  "hardware_info": {
-    "key": "hardware_info",
-    "type": "text",
-    "value": "硬件信息: {0}"
-  },
-  "hardware_key": {
-    "key": "hardware_key",
-    "type": "text",
-    "value": "钥匙"
-  },
-  "hardware_lock": {
-    "key": "hardware_lock",
-    "type": "text",
-    "value": "挂锁"
-  },
-  "hardware_unknown": {
-    "key": "hardware_unknown",
-    "type": "text",
-    "value": "未知"
-  },
-  "has_job_in_progress": {
-    "key": "has_job_in_progress",
-    "type": "text",
-    "value": "存在正在进行中的作业"
-  },
-  "has_locked": {
-    "key": "has_locked",
-    "type": "text",
-    "value": "已上锁"
-  },
-  "has_user_in_progress_job": {
-    "key": "has_user_in_progress_job",
-    "type": "text",
-    "value": "有用户在进行的作业中"
-  },
-  "home_overview_data_title": {
-    "key": "home_overview_data_title",
-    "type": "text",
-    "value": "总览数据"
-  },
-  "home_realtime_data_title": {
-    "key": "home_realtime_data_title",
-    "type": "text",
-    "value": "实时数据"
-  },
-  "import_str": {
-    "key": "import_str",
-    "type": "text",
-    "value": "导入"
-  },
-  "import_success": {
-    "key": "import_success",
-    "type": "text",
-    "value": "导入成功"
-  },
-  "in_progress_job_manage_title": {
-    "key": "in_progress_job_manage_title",
-    "type": "text",
-    "value": "进行中的作业"
-  },
-  "init_card_registration_step_hint": {
-    "key": "init_card_registration_step_hint",
-    "type": "text",
-    "value": "请在读卡器上刷卡"
-  },
-  "init_card_registration_step_tip": {
-    "key": "init_card_registration_step_tip",
-    "type": "text",
-    "value": "识别并录入卡片"
-  },
-  "init_device_registration_key_and_lock_complete_step_hint": {
-    "key": "init_device_registration_key_and_lock_complete_step_hint",
-    "type": "text",
-    "value": "扫描完成"
-  },
-  "init_device_registration_key_and_lock_step_hint": {
-    "key": "init_device_registration_key_and_lock_step_hint",
-    "type": "text",
-    "value": "请等待系统识别钥匙和挂锁"
-  },
-  "init_device_registration_key_and_lock_step_tip": {
-    "key": "init_device_registration_key_and_lock_step_tip",
-    "type": "text",
-    "value": "识别钥匙和挂锁"
-  },
-  "init_point_rfid_registration_step_hint": {
-    "key": "init_point_rfid_registration_step_hint",
-    "type": "text",
-    "value": "请在读卡器上刷点位RFID标签"
-  },
-  "init_point_rfid_registration_step_tip": {
-    "key": "init_point_rfid_registration_step_tip",
-    "type": "text",
-    "value": "识别并录入点位RFID标签"
-  },
-  "init_set_admin_account_step": {
-    "key": "init_set_admin_account_step",
-    "type": "text",
-    "value": "1"
-  },
-  "init_set_admin_account_step_hint": {
-    "key": "init_set_admin_account_step_hint",
-    "type": "text",
-    "value": "请设置管理员账号密码"
-  },
-  "init_set_admin_account_step_tip": {
-    "key": "init_set_admin_account_step_tip",
-    "type": "text",
-    "value": "设置管理员账号"
-  },
-  "init_set_remote_server_step_hint": {
-    "key": "init_set_remote_server_step_hint",
-    "type": "text",
-    "value": "请设置服务器的地址和端口"
-  },
-  "init_set_remote_server_step_tip": {
-    "key": "init_set_remote_server_step_tip",
-    "type": "text",
-    "value": "配置服务器"
-  },
-  "insert": {
-    "key": "insert",
-    "type": "text",
-    "value": "新增"
-  },
-  "invalid_card": {
-    "key": "invalid_card",
-    "type": "text",
-    "value": "卡片无效"
-  },
-  "invalid_user": {
-    "key": "invalid_user",
-    "type": "text",
-    "value": "用户不存在"
-  },
-  "item_my_todo_complete_time_title": {
-    "key": "item_my_todo_complete_time_title",
-    "type": "text",
-    "value": "完成时间:"
-  },
-  "item_my_todo_current_operation_title": {
-    "key": "item_my_todo_current_operation_title",
-    "type": "text",
-    "value": "当前操作:"
-  },
-  "item_my_todo_current_step_title": {
-    "key": "item_my_todo_current_step_title",
-    "type": "text",
-    "value": "当前步骤:"
-  },
-  "item_my_todo_job_name_title": {
-    "key": "item_my_todo_job_name_title",
-    "type": "text",
-    "value": "相关作业:"
-  },
-  "job_already_finished": {
-    "key": "job_already_finished",
-    "type": "text",
-    "value": "该作业已被结束"
-  },
-  "job_canceled": {
-    "key": "job_canceled",
-    "type": "text",
-    "value": "作业已取消"
-  },
-  "job_card_login_failed": {
-    "key": "job_card_login_failed",
-    "type": "text",
-    "value": "工卡无效"
-  },
-  "job_card_login_success": {
-    "key": "job_card_login_success",
-    "type": "text",
-    "value": "工卡识别成功"
-  },
-  "job_card_not_set_tip": {
-    "key": "job_card_not_set_tip",
-    "type": "text",
-    "value": "您尚未设置工卡"
-  },
-  "job_card_scan_tip": {
-    "key": "job_card_scan_tip",
-    "type": "text",
-    "value": "请在读卡器上读卡"
-  },
-  "job_card_set_tip": {
-    "key": "job_card_set_tip",
-    "type": "text",
-    "value": "您已设置了工卡数据"
-  },
-  "job_create_and_execute_failed": {
-    "key": "job_create_and_execute_failed",
-    "type": "text",
-    "value": "作业执行失败"
-  },
-  "job_create_and_execute_succeed": {
-    "key": "job_create_and_execute_succeed",
-    "type": "text",
-    "value": "作业开始执行"
-  },
-  "job_create_failed": {
-    "key": "job_create_failed",
-    "type": "text",
-    "value": "作业保存失败"
-  },
-  "job_create_succeed": {
-    "key": "job_create_succeed",
-    "type": "text",
-    "value": "作业保存成功"
-  },
-  "job_execute_colocker_colock_status_title": {
-    "key": "job_execute_colocker_colock_status_title",
-    "type": "text",
-    "value": "共锁人员共锁状态"
-  },
-  "job_execute_lock_status_title": {
-    "key": "job_execute_lock_status_title",
-    "type": "text",
-    "value": "隔离点锁定状态"
-  },
-  "job_execute_step_description": {
-    "key": "job_execute_step_description",
-    "type": "text",
-    "value": "操作说明({0})"
-  },
-  "job_execute_tab_title_colock": {
-    "key": "job_execute_tab_title_colock",
-    "type": "text",
-    "value": "共锁"
-  },
-  "job_execute_tab_title_lock": {
-    "key": "job_execute_tab_title_lock",
-    "type": "text",
-    "value": "锁定"
-  },
-  "job_execute_title": {
-    "key": "job_execute_title",
-    "type": "text",
-    "value": "作业执行"
-  },
-  "job_finished": {
-    "key": "job_finished",
-    "type": "text",
-    "value": "作业已结束"
-  },
-  "job_lost": {
-    "key": "job_lost",
-    "type": "text",
-    "value": "作业丢失"
-  },
-  "job_manage_delete_failed": {
-    "key": "job_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除选中的作业"
-  },
-  "job_manage_delete_succeed": {
-    "key": "job_manage_delete_succeed",
-    "type": "text",
-    "value": "删除选中的作业成功"
-  },
-  "job_manage_title": {
-    "key": "job_manage_title",
-    "type": "text",
-    "value": "作业管理"
-  },
-  "job_name": {
-    "key": "job_name",
-    "type": "text",
-    "value": "作业名称"
-  },
-  "job_save_and_execute_tip": {
-    "key": "job_save_and_execute_tip",
-    "type": "text",
-    "value": "确定要执行作业{0}吗?"
-  },
-  "job_save_tip": {
-    "key": "job_save_tip",
-    "type": "text",
-    "value": "确定要保存作业{0}吗?"
-  },
-  "job_status": {
-    "key": "job_status",
-    "type": "text",
-    "value": "作业状态"
-  },
-  "job_workstation": {
-    "key": "job_workstation",
-    "type": "text",
-    "value": "作业区域"
-  },
-  "key_exception_tag": {
-    "key": "key_exception_tag",
-    "type": "text",
-    "value": "该钥匙已被标记异常"
-  },
-  "key_in_use": {
-    "key": "key_in_use",
-    "type": "text",
-    "value": "钥匙正在使用"
-  },
-  "key_info_already_exists": {
-    "key": "key_info_already_exists",
-    "type": "text",
-    "value": "钥匙信息已存在"
-  },
-  "key_is_in_failure_mode": {
-    "key": "key_is_in_failure_mode",
-    "type": "text",
-    "value": "钥匙处于故障模式"
-  },
-  "key_mac": {
-    "key": "key_mac",
-    "type": "text",
-    "value": "钥匙MAC"
-  },
-  "key_manage_delete_failed": {
-    "key": "key_manage_delete_failed",
-    "type": "text",
-    "value": "钥匙删除失败"
-  },
-  "key_manage_delete_succeed": {
-    "key": "key_manage_delete_succeed",
-    "type": "text",
-    "value": "钥匙删除成功"
-  },
-  "key_manage_key_detail_title": {
-    "key": "key_manage_key_detail_title",
-    "type": "text",
-    "value": "钥匙详情"
-  },
-  "key_manage_new_key_title": {
-    "key": "key_manage_new_key_title",
-    "type": "text",
-    "value": "新增钥匙"
-  },
-  "key_manage_title": {
-    "key": "key_manage_title",
-    "type": "text",
-    "value": "钥匙管理"
-  },
-  "key_name": {
-    "key": "key_name",
-    "type": "text",
-    "value": "钥匙名称"
-  },
-  "key_nfc": {
-    "key": "key_nfc",
-    "type": "text",
-    "value": "钥匙NFC"
-  },
-  "key_not_exists": {
-    "key": "key_not_exists",
-    "type": "text",
-    "value": "钥匙不存在"
-  },
-  "key_return_success": {
-    "key": "key_return_success",
-    "type": "text",
-    "value": "钥匙归还成功"
-  },
-  "key_return_tip": {
-    "key": "key_return_tip",
-    "type": "text",
-    "value": "作业票尚未完成,禁止归还钥匙"
-  },
-  "key_take_error_tip": {
-    "key": "key_take_error_tip",
-    "type": "text",
-    "value": "钥匙分配失败,请检查硬件状态"
-  },
-  "loading_data": {
-    "key": "loading_data",
-    "type": "text",
-    "value": "数据加载中"
-  },
-  "loading_device": {
-    "key": "loading_device",
-    "type": "text",
-    "value": "正在加载硬件......"
-  },
-  "loading_msg_get_ticket_status_start": {
-    "key": "loading_msg_get_ticket_status_start",
-    "type": "text",
-    "value": "正在读取钥匙作业票"
-  },
-  "loading_msg_return_key_start": {
-    "key": "loading_msg_return_key_start",
-    "type": "text",
-    "value": "开始连接钥匙,请稍候······"
-  },
-  "lock": {
-    "key": "lock",
-    "type": "text",
-    "value": "挂锁"
-  },
-  "lock_already_exists": {
-    "key": "lock_already_exists",
-    "type": "text",
-    "value": "挂锁信息已存在"
-  },
-  "lock_code": {
-    "key": "lock_code",
-    "type": "text",
-    "value": "挂锁编号"
-  },
-  "lock_exception_tag": {
-    "key": "lock_exception_tag",
-    "type": "text",
-    "value": "该挂锁已被标记异常"
-  },
-  "lock_in_use": {
-    "key": "lock_in_use",
-    "type": "text",
-    "value": "挂锁正在使用中"
-  },
-  "lock_is_not_enough": {
-    "key": "lock_is_not_enough",
-    "type": "text",
-    "value": "锁具数量不足"
-  },
-  "lock_key_return_tip": {
-    "key": "lock_key_return_tip",
-    "type": "text",
-    "value": "作业票尚未完成,是否强制上传数据"
-  },
-  "lock_manage_delete_failed": {
-    "key": "lock_manage_delete_failed",
-    "type": "text",
-    "value": "挂锁删除失败"
-  },
-  "lock_manage_delete_succeed": {
-    "key": "lock_manage_delete_succeed",
-    "type": "text",
-    "value": "挂锁删除成功"
-  },
-  "lock_manage_lock_detail_title": {
-    "key": "lock_manage_lock_detail_title",
-    "type": "text",
-    "value": "挂锁详情"
-  },
-  "lock_manage_new_lock_title": {
-    "key": "lock_manage_new_lock_title",
-    "type": "text",
-    "value": "新增挂锁"
-  },
-  "lock_manage_title": {
-    "key": "lock_manage_title",
-    "type": "text",
-    "value": "挂锁管理"
-  },
-  "lock_name": {
-    "key": "lock_name",
-    "type": "text",
-    "value": "挂锁名称"
-  },
-  "lock_nfc": {
-    "key": "lock_nfc",
-    "type": "text",
-    "value": "挂锁 NFC"
-  },
-  "lock_status": {
-    "key": "lock_status",
-    "type": "text",
-    "value": "上锁状态"
-  },
-  "lock_take_report_fail": {
-    "key": "lock_take_report_fail",
-    "type": "text",
-    "value": "挂锁取出上报失败"
-  },
-  "locked_points_title": {
-    "key": "locked_points_title",
-    "type": "text",
-    "value": "锁定中的点位"
-  },
-  "locked_points_tv": {
-    "key": "locked_points_tv",
-    "type": "text",
-    "value": "锁定中的点位"
-  },
-  "locker": {
-    "key": "locker",
-    "type": "text",
-    "value": "上锁人"
-  },
-  "login": {
-    "key": "login",
-    "type": "text",
-    "value": "登录"
-  },
-  "login_tip": {
-    "key": "login_tip",
-    "type": "text",
-    "value": "您可以通过指纹或刷卡直接进行登录"
-  },
-  "loto": {
-    "key": "loto",
-    "type": "text",
-    "value": "智能锁控系统"
-  },
-  "loto_en": {
-    "key": "loto_en",
-    "type": "text",
-    "value": "Intelligent Lock Control System"
-  },
-  "manage_filter_status": {
-    "key": "manage_filter_status",
-    "type": "text",
-    "value": "状态"
-  },
-  "manage_role_function_permission": {
-    "key": "manage_role_function_permission",
-    "type": "text",
-    "value": "功能权限"
-  },
-  "member_info_title": {
-    "key": "member_info_title",
-    "type": "text",
-    "value": "人员信息"
-  },
-  "move_down": {
-    "key": "move_down",
-    "type": "text",
-    "value": "下移"
-  },
-  "move_up": {
-    "key": "move_up",
-    "type": "text",
-    "value": "上移"
-  },
-  "my_todo_title": {
-    "key": "my_todo_title",
-    "type": "text",
-    "value": "我的待办"
-  },
-  "navigate_to_step": {
-    "key": "navigate_to_step",
-    "type": "text",
-    "value": "跳转到第{0}步"
-  },
-  "new_device": {
-    "key": "new_device",
-    "type": "text",
-    "value": "New"
-  },
-  "new_group": {
-    "key": "new_group",
-    "type": "text",
-    "value": "新分组{0}"
-  },
-  "new_password": {
-    "key": "new_password",
-    "type": "text",
-    "value": "新密码(数字、字母、特殊符号、6-20位)"
-  },
-  "new_password_and_repeat_new_password_not_same": {
-    "key": "new_password_and_repeat_new_password_not_same",
-    "type": "text",
-    "value": "新密码与重复新密码不一致"
-  },
-  "new_password_cannot_be_the_same_as_the_old_password": {
-    "key": "new_password_cannot_be_the_same_as_the_old_password",
-    "type": "text",
-    "value": "新密码与旧密码不能相同"
-  },
-  "next": {
-    "key": "next",
-    "type": "text",
-    "value": "下一步"
-  },
-  "nickname": {
-    "key": "nickname",
-    "type": "text",
-    "value": "姓名"
-  },
-  "no_available_key": {
-    "key": "no_available_key",
-    "type": "text",
-    "value": "暂无可用钥匙"
-  },
-  "no_data": {
-    "key": "no_data",
-    "type": "text",
-    "value": "暂无数据"
-  },
-  "no_goto_step": {
-    "key": "no_goto_step",
-    "type": "text",
-    "value": "无跳转"
-  },
-  "no_permission_to_handle": {
-    "key": "no_permission_to_handle",
-    "type": "text",
-    "value": "您暂无权限操作当前作业票"
-  },
-  "no_response_board_exists": {
-    "key": "no_response_board_exists",
-    "type": "text",
-    "value": "存在未响应的主板"
-  },
-  "normal": {
-    "key": "normal",
-    "type": "text",
-    "value": "正常"
-  },
-  "not_group_can_lock": {
-    "key": "not_group_can_lock",
-    "type": "text",
-    "value": "当前无分组可上锁"
-  },
-  "not_group_can_unlock": {
-    "key": "not_group_can_unlock",
-    "type": "text",
-    "value": "当前无分组可解锁"
-  },
-  "not_in_slot": {
-    "key": "not_in_slot",
-    "type": "text",
-    "value": "未在仓位"
-  },
-  "not_save_tip": {
-    "key": "not_save_tip",
-    "type": "text",
-    "value": "数据还没有保存,您确定要放弃保存,离开当前页面吗?"
-  },
-  "number": {
-    "key": "number",
-    "type": "text",
-    "value": "编号:"
-  },
-  "old_password": {
-    "key": "old_password",
-    "type": "text",
-    "value": "旧密码"
-  },
-  "old_password_error": {
-    "key": "old_password_error",
-    "type": "text",
-    "value": "旧密码错误"
-  },
-  "one_key_cancel": {
-    "key": "one_key_cancel",
-    "type": "text",
-    "value": "一键取消"
-  },
-  "one_key_handle": {
-    "key": "one_key_handle",
-    "type": "text",
-    "value": "一键处理"
-  },
-  "ongoing_job_tv": {
-    "key": "ongoing_job_tv",
-    "type": "text",
-    "value": "进行中的作业"
-  },
-  "only_one_person_allowed": {
-    "key": "only_one_person_allowed",
-    "type": "text",
-    "value": "请保持单人入镜"
-  },
-  "operation": {
-    "key": "operation",
-    "type": "text",
-    "value": "操作"
-  },
-  "password_and_repeat_password_not_same": {
-    "key": "password_and_repeat_password_not_same",
-    "type": "text",
-    "value": "密码与重复密码不一致"
-  },
-  "password_regex_tip": {
-    "key": "password_regex_tip",
-    "type": "text",
-    "value": "密码不符合要求"
-  },
-  "phone": {
-    "key": "phone",
-    "type": "text",
-    "value": "电话"
-  },
-  "please_do_colock": {
-    "key": "please_do_colock",
-    "type": "text",
-    "value": "请共锁人完成共锁"
-  },
-  "please_do_uncolock": {
-    "key": "please_do_uncolock",
-    "type": "text",
-    "value": "请共锁人解除共锁"
-  },
-  "please_done_operation": {
-    "key": "please_done_operation",
-    "type": "text",
-    "value": "请先完成{0}"
-  },
-  "please_go_locking": {
-    "key": "please_go_locking",
-    "type": "text",
-    "value": "请上锁员执行去上锁操作"
-  },
-  "please_go_unlocking": {
-    "key": "please_go_unlocking",
-    "type": "text",
-    "value": "请上锁员执行去解锁操作"
-  },
-  "please_input_account": {
-    "key": "please_input_account",
-    "type": "text",
-    "value": "请输入用户名"
-  },
-  "please_input_admin_username": {
-    "key": "please_input_admin_username",
-    "type": "text",
-    "value": "请输入管理员账号"
-  },
-  "please_input_area": {
-    "key": "please_input_area",
-    "type": "text",
-    "value": "请输入区域"
-  },
-  "please_input_card_code": {
-    "key": "please_input_card_code",
-    "type": "text",
-    "value": "请输入工卡"
-  },
-  "please_input_card_nfc": {
-    "key": "please_input_card_nfc",
-    "type": "text",
-    "value": "请输入卡片 NFC"
-  },
-  "please_input_correct_phone": {
-    "key": "please_input_correct_phone",
-    "type": "text",
-    "value": "请输入正确的手机号"
-  },
-  "please_input_exception_reason": {
-    "key": "please_input_exception_reason",
-    "type": "text",
-    "value": "请输入异常原因"
-  },
-  "please_input_job_name": {
-    "key": "please_input_job_name",
-    "type": "text",
-    "value": "请输入作业名称"
-  },
-  "please_input_key_mac": {
-    "key": "please_input_key_mac",
-    "type": "text",
-    "value": "请输入钥匙MAC"
-  },
-  "please_input_key_name": {
-    "key": "please_input_key_name",
-    "type": "text",
-    "value": "请输入钥匙名称"
-  },
-  "please_input_key_nfc": {
-    "key": "please_input_key_nfc",
-    "type": "text",
-    "value": "请输入钥匙NFC"
-  },
-  "please_input_key_word": {
-    "key": "please_input_key_word",
-    "type": "text",
-    "value": "请输入关键字"
-  },
-  "please_input_lock_code": {
-    "key": "please_input_lock_code",
-    "type": "text",
-    "value": "请输入挂锁编号"
-  },
-  "please_input_lock_nfc": {
-    "key": "please_input_lock_nfc",
-    "type": "text",
-    "value": "请输入挂锁 NFC"
-  },
-  "please_input_new_password": {
-    "key": "please_input_new_password",
-    "type": "text",
-    "value": "请输入新密码"
-  },
-  "please_input_nickname": {
-    "key": "please_input_nickname",
-    "type": "text",
-    "value": "请输入姓名"
-  },
-  "please_input_old_password": {
-    "key": "please_input_old_password",
-    "type": "text",
-    "value": "请输入旧密码"
-  },
-  "please_input_password": {
-    "key": "please_input_password",
-    "type": "text",
-    "value": "请输入密码"
-  },
-  "please_input_permission_characters": {
-    "key": "please_input_permission_characters",
-    "type": "text",
-    "value": "请输入权限字符"
-  },
-  "please_input_phone": {
-    "key": "please_input_phone",
-    "type": "text",
-    "value": "请输入电话"
-  },
-  "please_input_point_function": {
-    "key": "please_input_point_function",
-    "type": "text",
-    "value": "请输入隔离点作用"
-  },
-  "please_input_point_name": {
-    "key": "please_input_point_name",
-    "type": "text",
-    "value": "请输入隔离点名称"
-  },
-  "please_input_remark": {
-    "key": "please_input_remark",
-    "type": "text",
-    "value": "请输入备注"
-  },
-  "please_input_remote_server_address": {
-    "key": "please_input_remote_server_address",
-    "type": "text",
-    "value": "请输入服务地址"
-  },
-  "please_input_repeat_new_password": {
-    "key": "please_input_repeat_new_password",
-    "type": "text",
-    "value": "请重复新密码"
-  },
-  "please_input_repeat_password": {
-    "key": "please_input_repeat_password",
-    "type": "text",
-    "value": "请输入重复密码"
-  },
-  "please_input_rfid": {
-    "key": "please_input_rfid",
-    "type": "text",
-    "value": "请输入 RFID 标签"
-  },
-  "please_input_rfid_code": {
-    "key": "please_input_rfid_code",
-    "type": "text",
-    "value": "请输入 RFID 编号"
-  },
-  "please_input_rfid_tag": {
-    "key": "please_input_rfid_tag",
-    "type": "text",
-    "value": "请输入RFID标签"
-  },
-  "please_input_role_name": {
-    "key": "please_input_role_name",
-    "type": "text",
-    "value": "请输入角色名称"
-  },
-  "please_input_sop_name": {
-    "key": "please_input_sop_name",
-    "type": "text",
-    "value": "请输入SOP名称"
-  },
-  "please_input_step_description": {
-    "key": "please_input_step_description",
-    "type": "text",
-    "value": "请输入步骤操作说明"
-  },
-  "please_input_step_title": {
-    "key": "please_input_step_title",
-    "type": "text",
-    "value": "请填写步骤标题"
-  },
-  "please_input_step_title_short": {
-    "key": "please_input_step_title_short",
-    "type": "text",
-    "value": "请输入步骤标题缩写"
-  },
-  "please_input_username": {
-    "key": "please_input_username",
-    "type": "text",
-    "value": "请输入登录名"
-  },
-  "please_input_workstation_name": {
-    "key": "please_input_workstation_name",
-    "type": "text",
-    "value": "请输入区域名称"
-  },
-  "please_must_select_at_least_one_point": {
-    "key": "please_must_select_at_least_one_point",
-    "type": "text",
-    "value": "您至少需要添加一个点位"
-  },
-  "please_press_fingerprint_again": {
-    "key": "please_press_fingerprint_again",
-    "type": "text",
-    "value": "请再次按压指纹"
-  },
-  "please_re_press_fingerprint_again": {
-    "key": "please_re_press_fingerprint_again",
-    "type": "text",
-    "value": "请重新按压指纹"
-  },
-  "please_return_key_after_locking": {
-    "key": "please_return_key_after_locking",
-    "type": "text",
-    "value": "请上锁员完成上锁后,归还钥匙"
-  },
-  "please_return_key_after_unlocking": {
-    "key": "please_return_key_after_unlocking",
-    "type": "text",
-    "value": "请上锁员完成解锁后,归还钥匙"
-  },
-  "please_scan_face": {
-    "key": "please_scan_face",
-    "type": "text",
-    "value": "请刷脸"
-  },
-  "please_scan_fingerprint": {
-    "key": "please_scan_fingerprint",
-    "type": "text",
-    "value": "请刷指纹"
-  },
-  "please_select_area": {
-    "key": "please_select_area",
-    "type": "text",
-    "value": "请选择区域"
-  },
-  "please_select_card": {
-    "key": "please_select_card",
-    "type": "text",
-    "value": "请选择卡片"
-  },
-  "please_select_card_username": {
-    "key": "please_select_card_username",
-    "type": "text",
-    "value": "请选择用户名称"
-  },
-  "please_select_colocker": {
-    "key": "please_select_colocker",
-    "type": "text",
-    "value": "请选择共锁人"
-  },
-  "please_select_exception_description": {
-    "key": "please_select_exception_description",
-    "type": "text",
-    "value": "请选择异常描述"
-  },
-  "please_select_exception_source": {
-    "key": "please_select_exception_source",
-    "type": "text",
-    "value": "请选择异常源"
-  },
-  "please_select_exception_type": {
-    "key": "please_select_exception_type",
-    "type": "text",
-    "value": "请选择异常类型"
-  },
-  "please_select_flow_mode": {
-    "key": "please_select_flow_mode",
-    "type": "text",
-    "value": "请选择流程模式"
-  },
-  "please_select_group": {
-    "key": "please_select_group",
-    "type": "text",
-    "value": "请选择分组"
-  },
-  "please_select_handle_time": {
-    "key": "please_select_handle_time",
-    "type": "text",
-    "value": "请选择处理时间"
-  },
-  "please_select_job": {
-    "key": "please_select_job",
-    "type": "text",
-    "value": "请选择作业"
-  },
-  "please_select_job_workstation": {
-    "key": "please_select_job_workstation",
-    "type": "text",
-    "value": "请选择作业区域"
-  },
-  "please_select_key": {
-    "key": "please_select_key",
-    "type": "text",
-    "value": "请选择钥匙"
-  },
-  "please_select_lock": {
-    "key": "please_select_lock",
-    "type": "text",
-    "value": "请选择挂锁"
-  },
-  "please_select_locker": {
-    "key": "please_select_locker",
-    "type": "text",
-    "value": "请选择上锁人"
-  },
-  "please_select_member": {
-    "key": "please_select_member",
-    "type": "text",
-    "value": "您可以选择添加人员"
-  },
-  "please_select_point": {
-    "key": "please_select_point",
-    "type": "text",
-    "value": "请选择隔离点"
-  },
-  "please_select_power_type": {
-    "key": "please_select_power_type",
-    "type": "text",
-    "value": "请选择能量源"
-  },
-  "please_select_process_application": {
-    "key": "please_select_process_application",
-    "type": "text",
-    "value": "请选择处理申请"
-  },
-  "please_select_rfid_token": {
-    "key": "please_select_rfid_token",
-    "type": "text",
-    "value": "请选择RFID标签"
-  },
-  "please_select_role": {
-    "key": "please_select_role",
-    "type": "text",
-    "value": "请选择角色"
-  },
-  "please_select_sop": {
-    "key": "please_select_sop",
-    "type": "text",
-    "value": "请选择SOP"
-  },
-  "please_select_sop_workstation": {
-    "key": "please_select_sop_workstation",
-    "type": "text",
-    "value": "请选择SOP区域"
-  },
-  "please_select_start_time": {
-    "key": "please_select_start_time",
-    "type": "text",
-    "value": "请先选择开始时间"
-  },
-  "please_select_status": {
-    "key": "please_select_status",
-    "type": "text",
-    "value": "请选择状态"
-  },
-  "please_select_step_confirm_member": {
-    "key": "please_select_step_confirm_member",
-    "type": "text",
-    "value": "请选择执行确认人员"
-  },
-  "please_select_step_confirm_role": {
-    "key": "please_select_step_confirm_role",
-    "type": "text",
-    "value": "请选择执行确认角色"
-  },
-  "please_select_step_confirm_type": {
-    "key": "please_select_step_confirm_type",
-    "type": "text",
-    "value": "请选择执行确认方式"
-  },
-  "please_select_user": {
-    "key": "please_select_user",
-    "type": "text",
-    "value": "请选择用户"
-  },
-  "please_select_workflow_mode": {
-    "key": "please_select_workflow_mode",
-    "type": "text",
-    "value": "请选择流程模式"
-  },
-  "please_select_workstation": {
-    "key": "please_select_workstation",
-    "type": "text",
-    "value": "请选择区域"
-  },
-  "please_swipe_card": {
-    "key": "please_swipe_card",
-    "type": "text",
-    "value": "请刷卡"
-  },
-  "please_take_out_ready_device_first": {
-    "key": "please_take_out_ready_device_first",
-    "type": "text",
-    "value": "请先取出已开卡扣的设备"
-  },
-  "please_wait_ticket_name_lock_complete": {
-    "key": "please_wait_ticket_name_lock_complete",
-    "type": "text",
-    "value": "请等待[{0}]上锁完成"
-  },
-  "point_detail": {
-    "key": "point_detail",
-    "type": "text",
-    "value": "点位明细"
-  },
-  "point_in_use": {
-    "key": "point_in_use",
-    "type": "text",
-    "value": "点位正在使用无法修改"
-  },
-  "point_info_title": {
-    "key": "point_info_title",
-    "type": "text",
-    "value": "点位信息"
-  },
-  "point_list_title": {
-    "key": "point_list_title",
-    "type": "text",
-    "value": "点位清单"
-  },
-  "point_manage_add_title": {
-    "key": "point_manage_add_title",
-    "type": "text",
-    "value": "添加点位"
-  },
-  "point_manage_delete_failed": {
-    "key": "point_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除隔离点"
-  },
-  "point_manage_delete_succeed": {
-    "key": "point_manage_delete_succeed",
-    "type": "text",
-    "value": "隔离点删除成功"
-  },
-  "point_manage_point_function": {
-    "key": "point_manage_point_function",
-    "type": "text",
-    "value": "隔离点作用"
-  },
-  "point_manage_point_group": {
-    "key": "point_manage_point_group",
-    "type": "text",
-    "value": "分组名称"
-  },
-  "point_manage_point_name": {
-    "key": "point_manage_point_name",
-    "type": "text",
-    "value": "隔离点名称"
-  },
-  "point_manage_point_power_type": {
-    "key": "point_manage_point_power_type",
-    "type": "text",
-    "value": "能量源"
-  },
-  "point_manage_rfid": {
-    "key": "point_manage_rfid",
-    "type": "text",
-    "value": "RFID"
-  },
-  "point_manage_rfid_tag": {
-    "key": "point_manage_rfid_tag",
-    "type": "text",
-    "value": "RFID 标签"
-  },
-  "point_manage_title": {
-    "key": "point_manage_title",
-    "type": "text",
-    "value": "点位管理"
-  },
-  "point_manage_update_title": {
-    "key": "point_manage_update_title",
-    "type": "text",
-    "value": "修改点位"
-  },
-  "point_manage_workstation": {
-    "key": "point_manage_workstation",
-    "type": "text",
-    "value": "区域"
-  },
-  "point_name_tv": {
-    "key": "point_name_tv",
-    "type": "text",
-    "value": "隔离点"
-  },
-  "power_isolation_way": {
-    "key": "power_isolation_way",
-    "type": "text",
-    "value": "确认隔离方式"
-  },
-  "preset_workflow_can_not_delete": {
-    "key": "preset_workflow_can_not_delete",
-    "type": "text",
-    "value": "预设流程模式无法删除"
-  },
-  "previous": {
-    "key": "previous",
-    "type": "text",
-    "value": "上一步"
-  },
-  "process_application_tv": {
-    "key": "process_application_tv",
-    "type": "text",
-    "value": "处理申请"
-  },
-  "quick_entrance_most_set_tip": {
-    "key": "quick_entrance_most_set_tip",
-    "type": "text",
-    "value": "快捷入口最多设置8个"
-  },
-  "quick_entrance_title": {
-    "key": "quick_entrance_title",
-    "type": "text",
-    "value": "快捷入口配置"
-  },
-  "re_recognize": {
-    "key": "re_recognize",
-    "type": "text",
-    "value": "重新识别"
-  },
-  "real_person_verification_required": {
-    "key": "real_person_verification_required",
-    "type": "text",
-    "value": "请保持真人操作"
-  },
-  "recapture": {
-    "key": "recapture",
-    "type": "text",
-    "value": "重拍"
-  },
-  "recognize_work_content": {
-    "key": "recognize_work_content",
-    "type": "text",
-    "value": "识别工作内容"
-  },
-  "recognized_card_rfid": {
-    "key": "recognized_card_rfid",
-    "type": "text",
-    "value": "已识别的卡片RFID"
-  },
-  "recognized_point_rfid": {
-    "key": "recognized_point_rfid",
-    "type": "text",
-    "value": "已识别的点位RFID"
-  },
-  "reduce_colocker": {
-    "key": "reduce_colocker",
-    "type": "text",
-    "value": "减少共锁人({0})"
-  },
-  "register_failed": {
-    "key": "register_failed",
-    "type": "text",
-    "value": "注册失败"
-  },
-  "register_success": {
-    "key": "register_success",
-    "type": "text",
-    "value": "注册成功"
-  },
-  "release_colocker": {
-    "key": "release_colocker",
-    "type": "text",
-    "value": "解除共锁"
-  },
-  "remark": {
-    "key": "remark",
-    "type": "text",
-    "value": "备注"
-  },
-  "repeat_new_password": {
-    "key": "repeat_new_password",
-    "type": "text",
-    "value": "重复新密码(数字、字母、特殊符号、6-20位)"
-  },
-  "repeat_password": {
-    "key": "repeat_password",
-    "type": "text",
-    "value": "重复密码:(数字、字母、特殊符号、6-20位)"
-  },
-  "reset": {
-    "key": "reset",
-    "type": "text",
-    "value": "重置"
-  },
-  "reset_data_tv": {
-    "key": "reset_data_tv",
-    "type": "text",
-    "value": "点击重设"
-  },
-  "reset_password_title": {
-    "key": "reset_password_title",
-    "type": "text",
-    "value": "重置密码"
-  },
-  "reset_user_password_failed": {
-    "key": "reset_user_password_failed",
-    "type": "text",
-    "value": "用户密码重置失败"
-  },
-  "reset_user_password_succeed": {
-    "key": "reset_user_password_succeed",
-    "type": "text",
-    "value": "用户密码重置成功"
-  },
-  "restart_app_after_set": {
-    "key": "restart_app_after_set",
-    "type": "text",
-    "value": "App将在设置完成后重启"
-  },
-  "rfid": {
-    "key": "rfid",
-    "type": "text",
-    "value": "RFID 标签"
-  },
-  "rfid_already_bind": {
-    "key": "rfid_already_bind",
-    "type": "text",
-    "value": "该Rfid标签已被绑定"
-  },
-  "rfid_already_registration": {
-    "key": "rfid_already_registration",
-    "type": "text",
-    "value": "RFID标签已录入"
-  },
-  "rfid_code": {
-    "key": "rfid_code",
-    "type": "text",
-    "value": "RFID 编号"
-  },
-  "rfid_in_use": {
-    "key": "rfid_in_use",
-    "type": "text",
-    "value": "RFID标签使用中,无法修改"
-  },
-  "rfid_name": {
-    "key": "rfid_name",
-    "type": "text",
-    "value": "RFID编号"
-  },
-  "rfid_token_manage_delete_failed": {
-    "key": "rfid_token_manage_delete_failed",
-    "type": "text",
-    "value": "RFID标签删除失败"
-  },
-  "rfid_token_manage_delete_succeed": {
-    "key": "rfid_token_manage_delete_succeed",
-    "type": "text",
-    "value": "RFID标签删除成功"
-  },
-  "rfid_token_manage_new_rfid_token_title": {
-    "key": "rfid_token_manage_new_rfid_token_title",
-    "type": "text",
-    "value": "新增 RFID 标签"
-  },
-  "rfid_token_manage_rfid_token_detail_title": {
-    "key": "rfid_token_manage_rfid_token_detail_title",
-    "type": "text",
-    "value": "RFID标签详情"
-  },
-  "rfid_token_manage_title": {
-    "key": "rfid_token_manage_title",
-    "type": "text",
-    "value": "RFID管理"
-  },
-  "role_in_preset_tip": {
-    "key": "role_in_preset_tip",
-    "type": "text",
-    "value": "预设角色不允许删除"
-  },
-  "role_in_use": {
-    "key": "role_in_use",
-    "type": "text",
-    "value": "角色已有作业在使用"
-  },
-  "role_key_already_exists": {
-    "key": "role_key_already_exists",
-    "type": "text",
-    "value": "该角色权限字符已存在"
-  },
-  "role_manage_add_title": {
-    "key": "role_manage_add_title",
-    "type": "text",
-    "value": "添加角色"
-  },
-  "role_manage_update_title": {
-    "key": "role_manage_update_title",
-    "type": "text",
-    "value": "修改角色"
-  },
-  "role_manage_delete_failed": {
-    "key": "role_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除角色"
-  },
-  "role_manage_delete_succeed": {
-    "key": "role_manage_delete_succeed",
-    "type": "text",
-    "value": "角色已删除"
-  },
-  "role_manage_permission_string": {
-    "key": "role_manage_permission_string",
-    "type": "text",
-    "value": "权限字符"
-  },
-  "role_manage_role_name": {
-    "key": "role_manage_role_name",
-    "type": "text",
-    "value": "角色名称"
-  },
-  "role_manage_role_num": {
-    "key": "role_manage_role_num",
-    "type": "text",
-    "value": "角色编号"
-  },
-  "role_manage_title": {
-    "key": "role_manage_title",
-    "type": "text",
-    "value": "角色管理"
-  },
-  "save": {
-    "key": "save",
-    "type": "text",
-    "value": "保存"
-  },
-  "save_and_execute": {
-    "key": "save_and_execute",
-    "type": "text",
-    "value": "保存并执行"
-  },
-  "save_sop_check": {
-    "key": "save_sop_check",
-    "type": "text",
-    "value": "生成SOP"
-  },
-  "save_success": {
-    "key": "save_success",
-    "type": "text",
-    "value": "保存成功!"
-  },
-  "scan_complete_app_restarting": {
-    "key": "scan_complete_app_restarting",
-    "type": "text",
-    "value": "扫描完成,APP将自动重启"
-  },
-  "select": {
-    "key": "select",
-    "type": "text",
-    "value": "选择"
-  },
-  "select_colocker_tip": {
-    "key": "select_colocker_tip",
-    "type": "text",
-    "value": "请在以下人员中选择共锁人"
-  },
-  "select_coloker": {
-    "key": "select_coloker",
-    "type": "text",
-    "value": "请选择共锁人"
-  },
-  "select_group_tip": {
-    "key": "select_group_tip",
-    "type": "text",
-    "value": "点击分组空白区域进行选中"
-  },
-  "select_locker": {
-    "key": "select_locker",
-    "type": "text",
-    "value": "选择上锁人"
-  },
-  "select_locker_tip": {
-    "key": "select_locker_tip",
-    "type": "text",
-    "value": "请在以下人员中选择[{0}]上锁人"
-  },
-  "select_member_title": {
-    "key": "select_member_title",
-    "type": "text",
-    "value": "选择人员"
-  },
-  "select_point_title": {
-    "key": "select_point_title",
-    "type": "text",
-    "value": "选择点位"
-  },
-  "selected_point_already_in_use": {
-    "key": "selected_point_already_in_use",
-    "type": "text",
-    "value": "存在使用中的点位"
-  },
-  "selected_point_info_title": {
-    "key": "selected_point_info_title",
-    "type": "text",
-    "value": "默认分组"
-  },
-  "selected_quick_entrance": {
-    "key": "selected_quick_entrance",
-    "type": "text",
-    "value": "已配置的快捷入口(最多添加8个快捷入口,可拖拽排序)"
-  },
-  "selected_rfid_in_use": {
-    "key": "selected_rfid_in_use",
-    "type": "text",
-    "value": "存在正在使用的RFID标签"
-  },
-  "send_ticket_fail": {
-    "key": "send_ticket_fail",
-    "type": "text",
-    "value": "作业票下发失败"
-  },
-  "sending_ticket": {
-    "key": "sending_ticket",
-    "type": "text",
-    "value": "工作票下发中······"
-  },
-  "server_address": {
-    "key": "server_address",
-    "type": "text",
-    "value": "服务地址"
-  },
-  "server_address_error": {
-    "key": "server_address_error",
-    "type": "text",
-    "value": "服务器地址错误"
-  },
-  "set_colocker": {
-    "key": "set_colocker",
-    "type": "text",
-    "value": "设置共锁人"
-  },
-  "set_data_tv": {
-    "key": "set_data_tv",
-    "type": "text",
-    "value": "点击设置"
-  },
-  "set_face_title": {
-    "key": "set_face_title",
-    "type": "text",
-    "value": "设置人脸"
-  },
-  "set_fingerprint_title": {
-    "key": "set_fingerprint_title",
-    "type": "text",
-    "value": "设置指纹"
-  },
-  "set_job_card_title": {
-    "key": "set_job_card_title",
-    "type": "text",
-    "value": "设置工卡"
-  },
-  "set_locker": {
-    "key": "set_locker",
-    "type": "text",
-    "value": "设置上锁人"
-  },
-  "set_password": {
-    "key": "set_password",
-    "type": "text",
-    "value": "设置密码:(数字、字母、特殊符号、6-20位)"
-  },
-  "settings": {
-    "key": "settings",
-    "type": "text",
-    "value": "设置"
-  },
-  "show_member_when_selected_sop": {
-    "key": "show_member_when_selected_sop",
-    "type": "text",
-    "value": "选择SOP后,将自动展示SOP的人员信息。"
-  },
-  "show_points_when_selected_sop": {
-    "key": "show_points_when_selected_sop",
-    "type": "text",
-    "value": "选择SOP后,将自动展示SOP的点位信息。"
-  },
-  "shutdown": {
-    "key": "shutdown",
-    "type": "text",
-    "value": "操作停机"
-  },
-  "ski_step": {
-    "key": "ski_step",
-    "type": "text",
-    "value": "跳过该步骤"
-  },
-  "skip_and_complete": {
-    "key": "skip_and_complete",
-    "type": "text",
-    "value": "跳过并完成"
-  },
-  "slot_exception_tag": {
-    "key": "slot_exception_tag",
-    "type": "text",
-    "value": "该锁仓已被标记异常"
-  },
-  "slots_exception_report": {
-    "key": "slots_exception_report",
-    "type": "text",
-    "value": "仓位异常上报"
-  },
-  "slots_manage_title": {
-    "key": "slots_manage_title",
-    "type": "text",
-    "value": "仓位管理"
-  },
-  "sop_create_failed": {
-    "key": "sop_create_failed",
-    "type": "text",
-    "value": "SOP创建失败"
-  },
-  "sop_create_succeed": {
-    "key": "sop_create_succeed",
-    "type": "text",
-    "value": "SOP创建成功"
-  },
-  "sop_job_save_and_execute_failed": {
-    "key": "sop_job_save_and_execute_failed",
-    "type": "text",
-    "value": "SOP作业执行失败"
-  },
-  "sop_job_save_and_execute_succeed": {
-    "key": "sop_job_save_and_execute_succeed",
-    "type": "text",
-    "value": "SOP作业开始执行"
-  },
-  "sop_job_save_failed": {
-    "key": "sop_job_save_failed",
-    "type": "text",
-    "value": "SOP作业保存失败"
-  },
-  "sop_job_save_succeed": {
-    "key": "sop_job_save_succeed",
-    "type": "text",
-    "value": "SOP作业保存成功"
-  },
-  "sop_manage_delete_failed": {
-    "key": "sop_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除选中的SOP"
-  },
-  "sop_manage_delete_succeed": {
-    "key": "sop_manage_delete_succeed",
-    "type": "text",
-    "value": "删除选中的SOP成功"
-  },
-  "sop_manage_sop_name": {
-    "key": "sop_manage_sop_name",
-    "type": "text",
-    "value": "SOP名称"
-  },
-  "sop_manage_title": {
-    "key": "sop_manage_title",
-    "type": "text",
-    "value": "SOP管理"
-  },
-  "sop_manage_workstation": {
-    "key": "sop_manage_workstation",
-    "type": "text",
-    "value": "所属岗位"
-  },
-  "sop_save_failed": {
-    "key": "sop_save_failed",
-    "type": "text",
-    "value": "SOP保存失败"
-  },
-  "sop_save_succeed": {
-    "key": "sop_save_succeed",
-    "type": "text",
-    "value": "SOP保存成功"
-  },
-  "sop_save_tip": {
-    "key": "sop_save_tip",
-    "type": "text",
-    "value": "确定要保存{0}吗?"
-  },
-  "sop_workstation": {
-    "key": "sop_workstation",
-    "type": "text",
-    "value": "SOP区域"
-  },
-  "start": {
-    "key": "start",
-    "type": "text",
-    "value": "开始"
-  },
-  "start_detect_key_slot": {
-    "key": "start_detect_key_slot",
-    "type": "text",
-    "value": "开始检测钥匙仓位"
-  },
-  "start_detect_lock_slot": {
-    "key": "start_detect_lock_slot",
-    "type": "text",
-    "value": "开始检测挂锁仓位"
-  },
-  "start_scan_key_mac": {
-    "key": "start_scan_key_mac",
-    "type": "text",
-    "value": "开始扫描钥匙信息"
-  },
-  "start_time": {
-    "key": "start_time",
-    "type": "text",
-    "value": "开始时间"
-  },
-  "end_time_must_large_then_start_time": {
-    "key": "end_time_must_large_then_start_time",
-    "type": "text",
-    "value": "结束时间必须大于开始时间"
-  },
-  "start_tip": {
-    "key": "start_tip",
-    "type": "text",
-    "value": "根据提示对系统进行初始化"
-  },
-  "start_to_send_ticket": {
-    "key": "start_to_send_ticket",
-    "type": "text",
-    "value": "开始下发工作票······"
-  },
-  "status": {
-    "key": "status",
-    "type": "text",
-    "value": "状态"
-  },
-  "step_confirm_failed": {
-    "key": "step_confirm_failed",
-    "type": "text",
-    "value": "步骤确认失败"
-  },
-  "take_out_key": {
-    "key": "take_out_key",
-    "type": "text",
-    "value": "请取出钥匙"
-  },
-  "take_out_key_tip": {
-    "key": "take_out_key_tip",
-    "type": "text",
-    "value": "请从打开的钥匙仓取出钥匙"
-  },
-  "take_out_lock_tip": {
-    "key": "take_out_lock_tip",
-    "type": "text",
-    "value": "请从打开的锁仓取出锁,还有{0}把待取出"
-  },
-  "take_out_rest_locks": {
-    "key": "take_out_rest_locks",
-    "type": "text",
-    "value": "请取出剩余开启卡扣的挂锁"
-  },
-  "tec_support": {
-    "key": "tec_support",
-    "type": "text",
-    "value": "温州博士安全用品有限公司"
-  },
-  "the_verification_file_not_exists": {
-    "key": "the_verification_file_not_exists",
-    "type": "text",
-    "value": "校验文件不存在"
-  },
-  "ticket_data_error": {
-    "key": "ticket_data_error",
-    "type": "text",
-    "value": "工作票数据损坏"
-  },
-  "ticket_get_failed": {
-    "key": "ticket_get_failed",
-    "type": "text",
-    "value": "作业票获取失败,请关闭钥匙电源并重新拿取并归还钥匙"
-  },
-  "ticket_lost": {
-    "key": "ticket_lost",
-    "type": "text",
-    "value": "作业票不存在"
-  },
-  "time_frame_tv": {
-    "key": "time_frame_tv",
-    "type": "text",
-    "value": "时间范围"
-  },
-  "todo_header": {
-    "key": "todo_header",
-    "type": "text",
-    "value": "处理中"
-  },
-  "turn_off": {
-    "key": "turn_off",
-    "type": "text",
-    "value": "关"
-  },
-  "turn_on": {
-    "key": "turn_on",
-    "type": "text",
-    "value": "开"
-  },
-  "turn_read": {
-    "key": "turn_read",
-    "type": "text",
-    "value": "读"
-  },
-  "uncolock_complete": {
-    "key": "uncolock_complete",
-    "type": "text",
-    "value": "解除共锁成功"
-  },
-  "uncolock_failed": {
-    "key": "uncolock_failed",
-    "type": "text",
-    "value": "解除共锁失败"
-  },
-  "unlock": {
-    "key": "unlock",
-    "type": "text",
-    "value": "解锁"
-  },
-  "unlock_and_restore_switch": {
-    "key": "unlock_and_restore_switch",
-    "type": "text",
-    "value": "拆锁恢复开关"
-  },
-  "unzip": {
-    "key": "unzip",
-    "type": "text",
-    "value": "解压中……{0}"
-  },
-  "update_card_failed": {
-    "key": "update_card_failed",
-    "type": "text",
-    "value": "更新卡片失败"
-  },
-  "update_card_succeed": {
-    "key": "update_card_succeed",
-    "type": "text",
-    "value": "更新卡片成功"
-  },
-  "update_key_failed": {
-    "key": "update_key_failed",
-    "type": "text",
-    "value": "更新钥匙失败"
-  },
-  "update_key_succeed": {
-    "key": "update_key_succeed",
-    "type": "text",
-    "value": "更新钥匙成功"
-  },
-  "update_lock_failed": {
-    "key": "update_lock_failed",
-    "type": "text",
-    "value": "更新挂锁失败"
-  },
-  "update_lock_succeed": {
-    "key": "update_lock_succeed",
-    "type": "text",
-    "value": "更新挂锁成功"
-  },
-  "update_point_failed": {
-    "key": "update_point_failed",
-    "type": "text",
-    "value": "保存点位失败"
-  },
-  "update_point_succeed": {
-    "key": "update_point_succeed",
-    "type": "text",
-    "value": "保存点位成功"
-  },
-  "update_rfid_token_failed": {
-    "key": "update_rfid_token_failed",
-    "type": "text",
-    "value": "更新RFID标签失败"
-  },
-  "update_rfid_token_succeed": {
-    "key": "update_rfid_token_succeed",
-    "type": "text",
-    "value": "更新RFID标签成功"
-  },
-  "update_role_failed": {
-    "key": "update_role_failed",
-    "type": "text",
-    "value": "角色更新失败"
-  },
-  "update_role_succeed": {
-    "key": "update_role_succeed",
-    "type": "text",
-    "value": "角色更新成功"
-  },
-  "update_user_failed": {
-    "key": "update_user_failed",
-    "type": "text",
-    "value": "用户更新失败"
-  },
-  "update_user_succeed": {
-    "key": "update_user_succeed",
-    "type": "text",
-    "value": "用户更新成功"
-  },
-  "update_workstation_failed": {
-    "key": "update_workstation_failed",
-    "type": "text",
-    "value": "更新区域失败"
-  },
-  "update_workstation_succeed": {
-    "key": "update_workstation_succeed",
-    "type": "text",
-    "value": "更新区域成功"
-  },
-  "user_already_exists": {
-    "key": "user_already_exists",
-    "type": "text",
-    "value": "用户已存在"
-  },
-  "user_info_title": {
-    "key": "user_info_title",
-    "type": "text",
-    "value": "个人信息"
-  },
-  "user_manage_area": {
-    "key": "user_manage_area",
-    "type": "text",
-    "value": "区域"
-  },
-  "user_manage_card_code": {
-    "key": "user_manage_card_code",
-    "type": "text",
-    "value": "工卡"
-  },
-  "user_manage_delete_failed": {
-    "key": "user_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除用户"
-  },
-  "user_manage_delete_succeed": {
-    "key": "user_manage_delete_succeed",
-    "type": "text",
-    "value": "用户已删除"
-  },
-  "user_manage_filter_activate": {
-    "key": "user_manage_filter_activate",
-    "type": "text",
-    "value": "正常"
-  },
-  "user_manage_filter_deactivate": {
-    "key": "user_manage_filter_deactivate",
-    "type": "text",
-    "value": "停用"
-  },
-  "user_manage_filter_title": {
-    "key": "user_manage_filter_title",
-    "type": "text",
-    "value": "筛选条件"
-  },
-  "user_manage_new_user_title": {
-    "key": "user_manage_new_user_title",
-    "type": "text",
-    "value": "新增用户"
-  },
-  "user_manage_role": {
-    "key": "user_manage_role",
-    "type": "text",
-    "value": "角色"
-  },
-  "user_manage_title": {
-    "key": "user_manage_title",
-    "type": "text",
-    "value": "用户管理"
-  },
-  "user_manage_user_detail_title": {
-    "key": "user_manage_user_detail_title",
-    "type": "text",
-    "value": "用户详情"
-  },
-  "user_manage_view": {
-    "key": "user_manage_view",
-    "type": "text",
-    "value": "查看"
-  },
-  "user_name": {
-    "key": "user_name",
-    "type": "text",
-    "value": "登录名"
-  },
-  "username": {
-    "key": "username",
-    "type": "text",
-    "value": "用户名称"
-  },
-  "username_or_password_error": {
-    "key": "username_or_password_error",
-    "type": "text",
-    "value": "账号或密码错误"
-  },
-  "username_passowrd_login_success": {
-    "key": "username_passowrd_login_success",
-    "type": "text",
-    "value": "账号密码验证通过"
-  },
-  "username_password_not_exists": {
-    "key": "username_password_not_exists",
-    "type": "text",
-    "value": "账号密码不存在"
-  },
-  "username_regex_tip": {
-    "key": "username_regex_tip",
-    "type": "text",
-    "value": "账号不符合要求"
-  },
-  "verify_failed": {
-    "key": "verify_failed",
-    "type": "text",
-    "value": "验证失败"
-  },
-  "view": {
-    "key": "view",
-    "type": "text",
-    "value": "查看"
-  },
-  "wait_header": {
-    "key": "wait_header",
-    "type": "text",
-    "value": "等待中"
-  },
-  "wait_to_colock": {
-    "key": "wait_to_colock",
-    "type": "text",
-    "value": "待共锁({0})"
-  },
-  "warn": {
-    "key": "warn",
-    "type": "text",
-    "value": "警告"
-  },
-  "welcome_tip": {
-    "key": "welcome_tip",
-    "type": "text",
-    "value": "您好,欢迎您使用"
-  },
-  "workflow_already_exists": {
-    "key": "workflow_already_exists",
-    "type": "text",
-    "value": "流程模式已存在"
-  },
-  "workflow_manage_title": {
-    "key": "workflow_manage_title",
-    "type": "text",
-    "value": "流程模式"
-  },
-  "workflow_mode": {
-    "key": "workflow_mode",
-    "type": "text",
-    "value": "流程模式"
-  },
-  "workflow_mode_manage_delete_succeed": {
-    "key": "workflow_mode_manage_delete_succeed",
-    "type": "text",
-    "value": "删除流程模式成功"
-  },
-  "workflow_mode_status_update_failed": {
-    "key": "workflow_mode_status_update_failed",
-    "type": "text",
-    "value": "状态修改失败"
-  },
-  "workflow_mode_status_update_succeed": {
-    "key": "workflow_mode_status_update_succeed",
-    "type": "text",
-    "value": "状态修改成功"
-  },
-  "workflow_name": {
-    "key": "workflow_name",
-    "type": "text",
-    "value": "流程模式名称"
-  },
-  "workflow_setting": {
-    "key": "workflow_setting",
-    "type": "text",
-    "value": "流程设置"
-  },
-  "workflow_step_confirm_member": {
-    "key": "workflow_step_confirm_member",
-    "type": "text",
-    "value": "执行确认人员"
-  },
-  "workflow_step_confirm_role": {
-    "key": "workflow_step_confirm_role",
-    "type": "text",
-    "value": "执行确认角色"
-  },
-  "workflow_step_confirm_type": {
-    "key": "workflow_step_confirm_type",
-    "type": "text",
-    "value": "执行确认方式"
-  },
-  "workflow_step_description": {
-    "key": "workflow_step_description",
-    "type": "text",
-    "value": "步骤操作说明"
-  },
-  "workflow_step_function": {
-    "key": "workflow_step_function",
-    "type": "text",
-    "value": "步骤功能"
-  },
-  "workflow_step_title": {
-    "key": "workflow_step_title",
-    "type": "text",
-    "value": "步骤标题"
-  },
-  "workflow_step_title_short": {
-    "key": "workflow_step_title_short",
-    "type": "text",
-    "value": "步骤标题缩写"
-  },
-  "workstation_already_exists": {
-    "key": "workstation_already_exists",
-    "type": "text",
-    "value": "区域已存在"
-  },
-  "workstation_is_in_bottom": {
-    "key": "workstation_is_in_bottom",
-    "type": "text",
-    "value": "区域已经在底部"
-  },
-  "workstation_is_in_top": {
-    "key": "workstation_is_in_top",
-    "type": "text",
-    "value": "区域已经在顶部"
-  },
-  "workstation_manage_delete_failed": {
-    "key": "workstation_manage_delete_failed",
-    "type": "text",
-    "value": "无法删除区域{0}"
-  },
-  "workstation_manage_delete_succeed": {
-    "key": "workstation_manage_delete_succeed",
-    "type": "text",
-    "value": "删除区域{0}成功"
-  },
-  "workstation_manage_new_workstation": {
-    "key": "workstation_manage_new_workstation",
-    "type": "text",
-    "value": "新增区域"
-  },
-  "workstation_manage_update_workstation": {
-    "key": "workstation_manage_update_workstation",
-    "type": "text",
-    "value": "编辑区域"
-  },
-  "workstation_manage_title": {
-    "key": "workstation_manage_title",
-    "type": "text",
-    "value": "区域管理"
-  },
-  "workstation_manage_workstation_name": {
-    "key": "workstation_manage_workstation_name",
-    "type": "text",
-    "value": "区域名称"
-  },
-  "workstation_manage_parent_workstation_name": {
-    "key": "workstation_manage_parent_workstation_name",
-    "type": "text",
-    "value": "上级区域名称"
-  },
-  "you_are_not_locker_tip": {
-    "key": "you_are_not_locker_tip",
-    "type": "text",
-    "value": "您不是上锁人,无法执行此操作"
-  },
-  "zone": {
-    "key": "zone",
-    "type": "text",
-    "value": "区域范围"
-  },
-  "backup_title": {
-    "key": "backup_title",
-    "type": "text",
-    "value": "备份/还原"
-  },
-  "backup": {
-    "key": "backup",
-    "type": "text",
-    "value": "备份"
-  },
-  "backup_path": {
-    "key": "backup_path",
-    "type": "text",
-    "value": "备份路径"
-  },
-  "maximum_number_of_backups": {
-    "key": "maximum_number_of_backups",
-    "type": "text",
-    "value": "备份数量上限"
-  },
-  "auto_backup": {
-    "key": "auto_backup",
-    "type": "text",
-    "value": "自动备份"
-  },
-  "common_enable": {
-    "key": "common_enable",
-    "type": "text",
-    "value": "启用"
-  },
-  "common_disable": {
-    "key": "common_disable",
-    "type": "text",
-    "value": "停用"
-  },
-  "backup_frequency": {
-    "key": "backup_frequency",
-    "type": "text",
-    "value": "备份频率"
-  },
-  "backup_time": {
-    "key": "backup_time",
-    "type": "text",
-    "value": "备份时间"
-  },
-  "backup_tip": {
-    "key": "backup_tip",
-    "type": "text",
-    "value": "注意:自动备份时必须保证应用处于启动状态。"
-  },
-  "backup_now": {
-    "key": "backup_now",
-    "type": "text",
-    "value": "立即备份"
-  },
-  "backup_range": {
-    "key": "backup_range",
-    "type": "text",
-    "value": "范围:{0}"
-  },
-  "restore": {
-    "key": "restore",
-    "type": "text",
-    "value": "还原"
-  },
-  "common_batch_export": {
-    "key": "common_batch_export",
-    "type": "text",
-    "value": "批量导出"
-  },
-  "common_batch_delete": {
-    "key": "common_batch_delete",
-    "type": "text",
-    "value": "批量删除"
-  },
-  "common_export": {
-    "key": "common_export",
-    "type": "text",
-    "value": "导出"
-  },
-  "MON": {
-    "key": "MON",
-    "type": "text",
-    "value": "星期一"
-  },
-  "TUE": {
-    "key": "TUE",
-    "type": "text",
-    "value": "星期二"
-  },
-  "WED": {
-    "key": "WED",
-    "type": "text",
-    "value": "星期三"
-  },
-  "THU": {
-    "key": "THU",
-    "type": "text",
-    "value": "星期四"
-  },
-  "FRI": {
-    "key": "FRI",
-    "type": "text",
-    "value": "星期五"
-  },
-  "SAT": {
-    "key": "SAT",
-    "type": "text",
-    "value": "星期六"
-  },
-  "SUN": {
-    "key": "SUN",
-    "type": "text",
-    "value": "星期日"
-  },
-  "backup_frequency_every_day": {
-    "key": "backup_frequency_every_day",
-    "type": "text",
-    "value": "每天"
-  },
-  "please_select_backup_frequency": {
-    "key": "please_select_backup_frequency",
-    "type": "text",
-    "value": "请选择备份频率"
-  },
-  "maximumNumberOfBackupsNotCorrect": {
-    "key": "maximumNumberOfBackupsNotCorrect",
-    "type": "text",
-    "value": "请填写正确的备份数量上限"
-  },
-  "please_select_time": {
-    "key": "please_select_time",
-    "type": "text",
-    "value": "请选择时间"
-  },
-  "backup_now_please_wait": {
-    "key": "backup_now_please_wait",
-    "type": "text",
-    "value": "正在备份中,请稍等……"
-  },
-  "backup_success": {
-    "key": "backup_success",
-    "type": "text",
-    "value": "备份成功"
-  },
-  "backup_failed": {
-    "key": "backup_failed",
-    "type": "text",
-    "value": "备份失败"
-  },
-  "delete_backup_file_confirm": {
-    "key": "delete_backup_file_confirm",
-    "type": "text",
-    "value": "是否确认删除该备份,删除后备份无法恢复。"
-  },
-  "delete_selected_backup_file_confirm": {
-    "key": "delete_selected_backup_file_confirm",
-    "type": "text",
-    "value": "是否确认删除选中备份,删除后备份无法恢复。"
-  },
-  "restore_backup_confirm": {
-    "key": "restore_backup_confirm",
-    "type": "text",
-    "value": "还原备份将清除备份日期到当前时间的所有数据,是否确认还原备份?"
-  },
-  "restore_backup_success": {
-    "key": "restore_backup_success",
-    "type": "text",
-    "value": "备份还原成功"
-  },
-  "export_success": {
-    "key": "export_success",
-    "type": "text",
-    "value": "导出成功"
-  },
-  "no_backup_data": {
-    "key": "no_backup_data",
-    "type": "text",
-    "value": "暂无备份数据"
-  },
-  "loading_backup": {
-    "key": "loading_backup",
-    "type": "text",
-    "value": "正在读取备份文件"
-  },
-  "max_backup_tip": {
-    "key": "max_backup_tip",
-    "type": "text",
-    "value": "备份数量已经达到上限,继续备份将移除最老的数据。"
-  },
-  "switch": {
-    "key": "switch",
-    "type": "text",
-    "value": "切换"
-  },
-  "backup_restoring": {
-    "key": "backup_restoring",
-    "type": "text",
-    "value": "备份还原中……"
-  },
-  "point_manage_switch_icon": {
-    "key": "point_manage_switch_icon",
-    "type": "text",
-    "value": "开关图标"
-  },
-  "user_manage": {
-    "key": "user_manage",
-    "type": "text",
-    "value": "用户管理"
-  },
-  "role_manage": {
-    "key": "role_manage",
-    "type": "text",
-    "value": "角色管理"
-  },
-  "workstation_manage": {
-    "key": "workstation_manage",
-    "type": "text",
-    "value": "区域管理"
-  },
-  "point_manage": {
-    "key": "point_manage",
-    "type": "text",
-    "value": "点位管理"
-  },
-  "backup_and_restore": {
-    "key": "backup_and_restore",
-    "type": "text",
-    "value": "备份/还原"
-  },
-  "in_progress_job": {
-    "key": "in_progress_job",
-    "type": "text",
-    "value": "进行中的作业"
-  },
-  "create_sop": {
-    "key": "create_sop",
-    "type": "text",
-    "value": "新建SOP"
-  },
-  "sop_manage": {
-    "key": "sop_manage",
-    "type": "text",
-    "value": "SOP管理"
-  },
-  "create_job": {
-    "key": "create_job",
-    "type": "text",
-    "value": "新建作业"
-  },
-  "job_manage": {
-    "key": "job_manage",
-    "type": "text",
-    "value": "作业管理"
-  },
-  "workflow_manage": {
-    "key": "workflow_manage",
-    "type": "text",
-    "value": "流程模式"
-  },
-  "create_sop_job": {
-    "key": "create_sop_job",
-    "type": "text",
-    "value": "新建SOP作业"
-  },
-  "locked_point": {
-    "key": "locked_point",
-    "type": "text",
-    "value": "锁定中的点位"
-  },
-  "slot_manage": {
-    "key": "slot_manage",
-    "type": "text",
-    "value": "仓位管理"
-  },
-  "key_manage": {
-    "key": "key_manage",
-    "type": "text",
-    "value": "钥匙管理"
-  },
-  "lock_manage": {
-    "key": "lock_manage",
-    "type": "text",
-    "value": "挂锁管理"
-  },
-  "card_manage": {
-    "key": "card_manage",
-    "type": "text",
-    "value": "卡片管理"
-  },
-  "rfid_manage": {
-    "key": "rfid_manage",
-    "type": "text",
-    "value": "RFID管理"
-  },
-  "exception_manage": {
-    "key": "exception_manage",
-    "type": "text",
-    "value": "异常管理"
-  },
-  "user_info": {
-    "key": "user_info",
-    "type": "text",
-    "value": "个人信息"
-  },
-  "reset_password": {
-    "key": "reset_password",
-    "type": "text",
-    "value": "重置密码"
-  },
-  "fingerprint_setting": {
-    "key": "fingerprint_setting",
-    "type": "text",
-    "value": "设置指纹"
-  },
-  "face_setting": {
-    "key": "face_setting",
-    "type": "text",
-    "value": "设置人脸"
-  },
-  "card_setting": {
-    "key": "card_setting",
-    "type": "text",
-    "value": "设置工卡"
-  },
-  "logout": {
-    "key": "logout",
-    "type": "text",
-    "value": "退出登录"
-  },
-  "todo_list": {
-    "key": "todo_list",
-    "type": "text",
-    "value": "我的待办"
-  },
-  "hardware_manage": {
-    "key": "hardware_manage",
-    "type": "text",
-    "value": "硬件管理"
-  },
-  "job_ticket_manage": {
-    "key": "job_ticket_manage",
-    "type": "text",
-    "value": "作业管理"
-  },
-  "data_manage": {
-    "key": "data_manage",
-    "type": "text",
-    "value": "数据管理"
-  },
-  "home": {
-    "key": "home",
-    "type": "text",
-    "value": "主页"
-  },
-  "auto_confirm": {
-    "key": "auto_confirm",
-    "type": "text",
-    "value": "自动确认"
-  },
-  "click_confirm": {
-    "key": "click_confirm",
-    "type": "text",
-    "value": "点击确认"
-  },
-  "role_confirm": {
-    "key": "role_confirm",
-    "type": "text",
-    "value": "角色确认"
-  },
-  "admin": {
-    "key": "admin",
-    "type": "text",
-    "value": "超级管理员"
-  },
-  "jtdrawer": {
-    "key": "jtdrawer",
-    "type": "text",
-    "value": "作业管理员"
-  },
-  "jtlocker": {
-    "key": "jtlocker",
-    "type": "text",
-    "value": "上锁人"
-  },
-  "jtcolocker": {
-    "key": "jtcolocker",
-    "type": "text",
-    "value": "共锁人"
-  },
-  "jtguard": {
-    "key": "jtguard",
-    "type": "text",
-    "value": "作业观察员"
-  },
-  "sysconfig": {
-    "key": "sysconfig",
-    "type": "text",
-    "value": "系统配置员"
-  },
-  "force_shared_lock": {
-    "key": "force_shared_lock",
-    "type": "text",
-    "value": "强制共享锁模式"
-  },
-  "force_multi_lock": {
-    "key": "force_multi_lock",
-    "type": "text",
-    "value": "强制多锁模式"
-  },
-  "mixed_mode": {
-    "key": "mixed_mode",
-    "type": "text",
-    "value": "混合模式"
-  },
-  "lock_take_key": {
-    "key": "lock_take_key",
-    "type": "text",
-    "value": "启动上锁"
-  },
-  "lock_return_key": {
-    "key": "lock_return_key",
-    "type": "text",
-    "value": "完成上锁"
-  },
-  "unlock_take_key": {
-    "key": "unlock_take_key",
-    "type": "text",
-    "value": "启动解锁"
-  },
-  "unlock_return_key": {
-    "key": "unlock_return_key",
-    "type": "text",
-    "value": "完成解锁"
-  },
-  "release_colock": {
-    "key": "release_colock",
-    "type": "text",
-    "value": "解除共锁"
-  },
-  "unknown": {
-    "key": "unknown",
-    "type": "text",
-    "value": "未知待办"
-  },
-  "not_start": {
-    "key": "not_start",
-    "type": "text",
-    "value": "未开始"
-  },
-  "select_member": {
-    "key": "select_member",
-    "type": "text",
-    "value": "选择人员"
-  },
-  "locking": {
-    "key": "locking",
-    "type": "text",
-    "value": "上锁中"
-  },
-  "colocking": {
-    "key": "colocking",
-    "type": "text",
-    "value": "共锁中"
-  },
-  "unlocking": {
-    "key": "unlocking",
-    "type": "text",
-    "value": "解锁中"
-  },
-  "finished": {
-    "key": "finished",
-    "type": "text",
-    "value": "已结束"
-  },
-  "canceled": {
-    "key": "canceled",
-    "type": "text",
-    "value": "已取消"
-  },
-  "progressing": {
-    "key": "progressing",
-    "type": "text",
-    "value": "进行中"
-  },
-  "hydraulic_pressure": {
-    "key": "hydraulic_pressure",
-    "type": "text",
-    "value": "液压"
-  },
-  "electric_energy": {
-    "key": "electric_energy",
-    "type": "text",
-    "value": "电能"
-  },
-  "potential_energy": {
-    "key": "potential_energy",
-    "type": "text",
-    "value": "势能"
-  },
-  "heat_energy": {
-    "key": "heat_energy",
-    "type": "text",
-    "value": "热能"
-  },
-  "gas": {
-    "key": "gas",
-    "type": "text",
-    "value": "燃气"
-  },
-  "mechanical_energy": {
-    "key": "mechanical_energy",
-    "type": "text",
-    "value": "机械能"
-  },
-  "air_energy": {
-    "key": "air_energy",
-    "type": "text",
-    "value": "空气能"
-  },
-  "apply_master_key": {
-    "key": "apply_master_key",
-    "type": "text",
-    "value": "申请万能钥匙"
-  },
-  "apply_finish_job": {
-    "key": "apply_finish_job",
-    "type": "text",
-    "value": "申请结束作业"
-  },
-  "apply_scrap_slot": {
-    "key": "apply_scrap_slot",
-    "type": "text",
-    "value": "申请报废仓位"
-  },
-  "apply_scrap_lock": {
-    "key": "apply_scrap_lock",
-    "type": "text",
-    "value": "申请报废挂锁"
-  },
-  "apply_scrap_key": {
-    "key": "apply_scrap_key",
-    "type": "text",
-    "value": "申请报废钥匙"
-  },
-  "slot_damage": {
-    "key": "slot_damage",
-    "type": "text",
-    "value": "仓位损坏"
-  },
-  "lock_damage": {
-    "key": "lock_damage",
-    "type": "text",
-    "value": "挂锁损坏"
-  },
-  "key_damage": {
-    "key": "key_damage",
-    "type": "text",
-    "value": "钥匙损坏"
-  },
-  "job_cat_not_exec": {
-    "key": "job_cat_not_exec",
-    "type": "text",
-    "value": "作业票无法执行"
-  },
-  "pending": {
-    "key": "pending",
-    "type": "text",
-    "value": "待处理"
-  },
-  "processed": {
-    "key": "processed",
-    "type": "text",
-    "value": "已处理"
-  },
-  "canceld": {
-    "key": "canceld",
-    "type": "text",
-    "value": "已取消"
-  },
-  "key": {
-    "key": "key",
-    "type": "text",
-    "value": "钥匙"
-  },
-  "slot": {
-    "key": "slot",
-    "type": "text",
-    "value": "仓位"
-  },
-  "job": {
-    "key": "job",
-    "type": "text",
-    "value": "作业"
-  },
-  "job_exception": {
-    "key": "job_exception",
-    "type": "text",
-    "value": "作业异常"
-  },
-  "hardware_exception": {
-    "key": "hardware_exception",
-    "type": "text",
-    "value": "硬件异常"
-  },
-  "administrator": {
-    "key": "administrator",
-    "type": "text",
-    "value": "管理员"
-  },
-  "switch_layout": {
-    "key": "switch_layout",
-    "type": "text",
-    "value": "开关布局图"
-  },
-  "switch_information": {
-    "key": "switch_information",
-    "type": "text",
-    "value": "开关信息"
-  },
-  "switch_status": {
-    "key": "switch_status",
-    "type": "text",
-    "value": "开关状态:"
-  },
-  "switch_id": {
-    "key": "switch_id",
-    "type": "text",
-    "value": "编号:{0}"
-  },
-  "switch_open": {
-    "key": "switch_open",
-    "type": "text",
-    "value": "开启"
-  },
-  "switch_close": {
-    "key": "switch_close",
-    "type": "text",
-    "value": "关闭"
-  },
-  "switch_alarm": {
-    "key": "switch_alarm",
-    "type": "text",
-    "value": "警告"
-  },
-  "position": {
-    "key": "position",
-    "type": "text",
-    "value": "定位"
-  },
-  "default_map": {
-    "key": "default_map",
-    "type": "text",
-    "value": "默认地图"
-  },
-  "update_info": {
-    "key": "update_info",
-    "type": "text",
-    "value": "修改信息"
-  },
-  "add_to_map_x": {
-    "key": "add_to_map_x",
-    "type": "text",
-    "value": "坐标X:"
-  },
-  "please_set_point_coordinate_first": {
-    "key": "please_set_point_coordinate_first",
-    "type": "text",
-    "value": "请先设置点位坐标。"
-  },
-  "add_to_map_y": {
-    "key": "add_to_map_y",
-    "type": "text",
-    "value": "坐标Y:"
-  },
-  "add_to_map_point_serial_number": {
-    "key": "add_to_map_point_serial_number",
-    "type": "text",
-    "value": "开关序号:"
-  },
-  "add_to_map_point_name": {
-    "key": "add_to_map_point_name",
-    "type": "text",
-    "value": "点位名称:"
-  },
-  "please_input_x_in_map": {
-    "key": "please_input_x_in_map",
-    "type": "text",
-    "value": "请输入坐标X(最大1920)"
-  },
-  "please_input_y_in_map": {
-    "key": "please_input_y_in_map",
-    "type": "text",
-    "value": "请输入坐标X(最大1080)"
-  },
-  "please_input_point_serial_number": {
-    "key": "please_input_point_serial_number",
-    "type": "text",
-    "value": "请输入开关序号(0-31)"
-  },
-  "data_exception": {
-    "key": "data_exception",
-    "type": "text",
-    "value": "数据异常"
-  },
-  "remove": {
-    "key": "remove",
-    "type": "text",
-    "value": "移除"
-  },
-  "workstation_info": {
-    "key": "workstation_info",
-    "type": "text",
-    "value": "区域信息"
-  },
-  "year": {
-    "key": "year",
-    "type": "text",
-    "value": "年"
-  },
-  "month": {
-    "key": "month",
-    "type": "text",
-    "value": "月"
-  },
-  "day": {
-    "key": "day",
-    "type": "text",
-    "value": "日"
-  },
-  "hour": {
-    "key": "hour",
-    "type": "text",
-    "value": "时"
-  },
-  "min": {
-    "key": "min",
-    "type": "text",
-    "value": "分"
-  },
-  "sec": {
-    "key": "sec",
-    "type": "text",
-    "value": "秒"
-  },
-  "please_select_backup_file": {
-    "key": "please_select_backup_file",
-    "type": "text",
-    "value": "请先选择备份文件"
-  },
-  "export_selected_backup_file_confirm": {
-    "key": "export_selected_backup_file_confirm",
-    "type": "text",
-    "value": "将启动路径选择器,选择之后点击右下角选择进行导出"
-  },
-  "header_pulling": {
-    "key": "header_pulling",
-    "type": "text",
-    "value": "下拉可以刷新"
-  },
-  "header_refreshing": {
-    "key": "header_refreshing",
-    "type": "text",
-    "value": "正在刷新..."
-  },
-  "header_loading": {
-    "key": "header_loading",
-    "type": "text",
-    "value": "正在加载..."
-  },
-  "header_release": {
-    "key": "header_release",
-    "type": "text",
-    "value": "释放立即刷新"
-  },
-  "header_finish": {
-    "key": "header_finish",
-    "type": "text",
-    "value": "刷新完成"
-  },
-  "header_failed": {
-    "key": "header_failed",
-    "type": "text",
-    "value": "刷新失败"
-  },
-  "header_update": {
-    "key": "header_update",
-    "type": "text",
-    "value": "上次更新 M-d HH:mm"
-  },
-  "header_secondary": {
-    "key": "header_secondary",
-    "type": "text",
-    "value": "释放进入二楼"
-  },
-  "footer_pulling": {
-    "key": "footer_pulling",
-    "type": "text",
-    "value": "上拉加载更多"
-  },
-  "footer_release": {
-    "key": "footer_release",
-    "type": "text",
-    "value": "释放立即加载"
-  },
-  "footer_loading": {
-    "key": "footer_loading",
-    "type": "text",
-    "value": "正在刷新..."
-  },
-  "footer_refreshing": {
-    "key": "footer_refreshing",
-    "type": "text",
-    "value": "正在加载..."
-  },
-  "footer_finish": {
-    "key": "footer_finish",
-    "type": "text",
-    "value": "加载完成"
-  },
-  "footer_failed": {
-    "key": "footer_failed",
-    "type": "text",
-    "value": "加载失败"
-  },
-  "footer_nothing": {
-    "key": "footer_nothing",
-    "type": "text",
-    "value": "全部加载完成"
-  },
-  "set_default": {
-    "key": "set_default",
-    "type": "text",
-    "value": "设为默认"
-  },
-  "show_in_map": {
-    "key": "show_in_map",
-    "type": "text",
-    "value": "在地图中显示:"
-  },
-  "max_fingerprint_insert_tip": {
-    "key": "max_fingerprint_insert_tip",
-    "type": "text",
-    "value": "(指纹最多可录入{0}个)"
-  },
-  "fingerprint_limit_tip": {
-    "key": "fingerprint_limit_tip",
-    "type": "text",
-    "value": "指纹数量已达到上限"
-  },
-  "max_fingerprint_insert": {
-    "key": "max_fingerprint_insert",
-    "type": "text",
-    "value": "最大指纹录入数量:"
-  },
-  "auto_logout_time": {
-    "key": "auto_logout_time",
-    "type": "text",
-    "value": "自动登出时间(最低1,最高10,单位:分钟):"
-  },
-  "please_input_max_fingerprint_entries_size": {
-    "key": "please_input_max_fingerprint_entries_size",
-    "type": "text",
-    "value": "请输入最大指纹录入数量"
-  },
-  "please_input_auto_logout_time": {
-    "key": "please_input_auto_logout_time",
-    "type": "text",
-    "value": "请输入自动登出时间"
-  },
-  "please_input_auto_logout_time_correct": {
-    "key": "please_input_auto_logout_time_correct",
-    "type": "text",
-    "value": "请设置正确的自动登出时间"
-  },
-  "data_export": {
-    "key": "data_export",
-    "type": "text",
-    "value": "数据导出"
-  },
-  "data_export_tip": {
-    "key": "data_export",
-    "type": "text",
-    "value": "请选择您要导出的表,然后点击导出。"
-  },
-  "data_table": {
-    "key": "data_table",
-    "type": "text",
-    "value": "数据表"
-  },
-  "last_export_datetime": {
-    "key": "last_export_datetime",
-    "type": "text",
-    "value": "上次导出时间"
-  },
-  "please_select_data_you_want_to_export": {
-    "key": "please_select_data_you_want_to_export",
-    "type": "text",
-    "value": "请选择你需要导出的数据表。"
-  },
-  "confirm_exec": {
-    "key": "confirm_exec",
-    "type": "text",
-    "value": "执行确认"
-  },
-  "data_export_success_tip": {
-    "key": "data_export_success_tip",
-    "type": "text",
-    "value": "数据导出完成,请选择文件夹并点击右下角按钮进行保存。"
-  },
-  "data_export_error": {
-    "key": "data_export_error",
-    "type": "text",
-    "value": "数据导出失败。"
-  },
-  "user": {
-    "key": "user",
-    "type": "text",
-    "value": "用户"
-  },
-  "role": {
-    "key": "role",
-    "type": "text",
-    "value": "角色"
-  },
-  "workstation": {
-    "key": "workstation",
-    "type": "text",
-    "value": "区域"
-  },
-  "point": {
-    "key": "point",
-    "type": "text",
-    "value": "点位"
-  },
-  "sop": {
-    "key": "sop",
-    "type": "text",
-    "value": "SOP"
-  },
-  "exporting": {
-    "key": "exporting",
-    "type": "text",
-    "value": "导出中……"
-  },
-  "ticket_name": {
-    "key": "ticket_name",
-    "type": "text",
-    "value": "作业名称"
-  },
-  "data_in_backup": {
-    "key": "data_in_backup",
-    "type": "text",
-    "value": "数据备份中……"
-  },
-  "hardware_mode": {
-    "key": "hardware_mode",
-    "type": "text",
-    "value": "硬件模式(模式修改保存需要重启应用)"
-  },
-  "init_hardware_mode": {
-    "key": "hardware_mode",
-    "type": "text",
-    "value": "硬件模式"
-  },
-  "password": {
-    "key": "password",
-    "type": "text",
-    "value": "密码"
-  },
-  "password_hint": {
-    "key": "password_hint",
-    "type": "text",
-    "value": "6-20位:字母/数字/符号"
-  },
-  "all_slot_turn_on": {
-    "key": "all_slot_turn_on",
-    "type": "text",
-    "value": "全仓位开"
-  },
-  "all_slot_turn_off": {
-    "key": "all_slot_turn_off",
-    "type": "text",
-    "value": "全仓位关"
-  },
-  "all_new_lock_registration": {
-    "key": "all_new_lock_registration",
-    "type": "text",
-    "value": "录入所有新挂锁"
-  },
-  "todo_wait": {
-    "key": "todo_wait",
-    "type": "text",
-    "value": "等待:"
-  },
-  "excp_job_name_title": {
-    "key": "excp_job_name_title",
-    "type": "text",
-    "value": "异常作业名称"
-  },
-  "allow_colocker_login_to_colock": {
-    "key": "allow_colocker_login_to_colock",
-    "type": "text",
-    "value": "允许共锁人登录共锁"
-  },
-  "please_input_username_min_size": {
-    "key": "please_input_username_min_size",
-    "type": "text",
-    "value": "请输入最小用户名长度"
-  },
-  "username_min_size": {
-    "key": "username_min_size",
-    "type": "text",
-    "value": "最小用户名长度(1-6)"
-  }
-}

+ 0 - 34
app/src/main/assets/preset/preset_sys_role.json

@@ -66,39 +66,5 @@
     "updateTime": "2025-03-12 16:24:57",
     "remark": "打卡,第一次打卡进场,第二次打卡出场",
     "marsDataScope": "1"
-  },
-  {
-    "roleId": 5,
-    "roleName": "作业观察员",
-    "roleKey": "jtguard",
-    "roleSort": 5,
-    "dataScope": "1",
-    "menuCheckStrictly": 1,
-    "deptCheckStrictly": 1,
-    "status": "0",
-    "delFlag": "0",
-    "createBy": "admin",
-    "createTime": "2024-09-11 10:54:40",
-    "updateBy": "admin",
-    "updateTime": "2024-09-11 10:56:01",
-    "remark": "作业数据查询到处",
-    "marsDataScope": "1"
-  },
-  {
-    "roleId": 17,
-    "roleName": "系统配置员",
-    "roleKey": "sysconfig",
-    "roleSort": 0,
-    "dataScope": "1",
-    "menuCheckStrictly": 1,
-    "deptCheckStrictly": 1,
-    "status": "0",
-    "delFlag": "0",
-    "createBy": "mars",
-    "createTime": "2025-04-02 18:41:45",
-    "updateBy": "mars",
-    "updateTime": "2025-04-02 18:42:55",
-    "remark": "",
-    "marsDataScope": "1"
   }
 ]

+ 9 - 15
app/src/main/java/com/grkj/iscs/ISCSApplication.kt

@@ -11,36 +11,28 @@ import coil.ImageLoader
 import coil.decode.SvgDecoder
 import coil.memory.MemoryCache
 import com.drake.statelayout.StateConfig
+import com.grkj.data.config.ISCSConfig
 import com.grkj.data.data.EventConstants
 import com.grkj.data.database.DbReadyGate
 import com.grkj.data.di.LogicManager
-import com.grkj.iscs.common.GlobalManager
+import com.grkj.data.hardware.ble.BleUtil
+import com.grkj.data.hardware.modbus.ModBusController
 import com.grkj.iscs.features.splash.activity.SplashActivity
 import com.grkj.shared.model.EventBean
 import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.shared.utils.i18n.LanguageCatalog
 import com.grkj.shared.utils.i18n.LanguageStore
-import com.grkj.shared.utils.i18n.source.AssetsI18nSource
-import com.grkj.shared.utils.i18n.source.FileI18nSource
+import com.grkj.shared.utils.i18n.source.XmlResourcesI18nSource
 import com.grkj.ui_base.business.HardwareBusinessManager
-import com.grkj.data.config.ISCSConfig
-import com.grkj.data.data.MMKVConstants
-import com.grkj.data.enums.HardwareMode
 import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.data.hardware.ble.BleUtil
-import com.grkj.data.hardware.modbus.ModBusController
-import com.grkj.data.utils.event.StartListenerEvent
 import com.kongzue.dialogx.DialogX
 import com.scwang.smart.refresh.footer.ClassicsFooter
 import com.scwang.smart.refresh.header.ClassicsHeader
 import com.scwang.smart.refresh.layout.SmartRefreshLayout
-import com.sik.cronjob.managers.CronJobScanner
 import com.sik.sikcore.SIKCore
 import com.sik.sikcore.crash.GlobalCrashCatch
-import com.sik.sikcore.extension.getMMKVData
-import com.sik.sikcore.extension.toJson
 import com.sik.sikcore.log.LogUtils
 import com.sik.sikcore.thread.ThreadUtils
 import com.tencent.mmkv.MMKV
@@ -88,11 +80,12 @@ class ISCSApplication : Application() {
         }
         System.loadLibrary("sqlcipher")   // 新库必须手动加载
         MMKV.initialize(this)
+        I18nManager.attach(this)
         I18nManager.init(
             defaultLocale = LanguageStore.resolveEffectiveLocale(this),
             initialSources = arrayOf(
-                AssetsI18nSource(this, "i18n"),
-                FileI18nSource(this, "i18n")
+                XmlResourcesI18nSource()
+                // 还可以保留你原来的 JSON Source,作为兜底
             ),
             eagerLoad = true
         )
@@ -117,7 +110,7 @@ class ISCSApplication : Application() {
         }
     }
 
-    private fun initImageLoader(){
+    private fun initImageLoader() {
         val loader = ImageLoader.Builder(this)
             .components { add(SvgDecoder.Factory()) }  // 支持 SVG
             .memoryCache {
@@ -143,6 +136,7 @@ class ISCSApplication : Application() {
                     ModBusController.initDevicesStatus()
                 }
             }
+
             EventConstants.EVENT_START_LISTENER -> {
                 ThreadUtils.runOnIO {
                     HardwareBusinessManager.registerMainListener()

+ 4 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/QuickEntranceConfigDialog.kt

@@ -36,7 +36,10 @@ class QuickEntranceConfigDialog(private val save: (String) -> Unit) :
     OnBindView<FullScreenDialog>(R.layout.dialog_quick_entrance_config) {
     private var selectedQuickEntranceConfig = mutableListOf<QuickEntranceMenuItemEntity>()
     private val allQuickEntranceConfig: MutableList<QuickEntranceMenuItemEntity> =
-        RoleFunctionalPermissionsEnum.values().filter { it.level != 0 }.mapIndexed { index, value ->
+        RoleFunctionalPermissionsEnum.except(
+            RoleFunctionalPermissionsEnum.CARD_MANAGE,
+            RoleFunctionalPermissionsEnum.RFID_MANAGE,
+        ).filter { it.level != 0 }.mapIndexed { index, value ->
             QuickEntranceMenuItemEntity(
                 index,
                 QuickEntranceMenuItemEntity.getMenuIcon(value),

+ 6 - 9
app/src/main/java/com/grkj/iscs/features/main/dialog/ColockOperationTipDialog.kt → app/src/main/java/com/grkj/iscs/features/main/dialog/SwipCardOperationTipDialog.kt

@@ -2,21 +2,18 @@ package com.grkj.iscs.features.main.dialog
 
 import android.view.View
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogCheckFaceBinding
-import com.grkj.iscs.databinding.DialogColockOperationTipBinding
-import com.grkj.shared.utils.ArcSoftUtil
+import com.grkj.iscs.databinding.DialogSwipCardOperationTipBinding
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
-import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
-import com.sik.sikcore.SIKCore
 import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 检查人脸弹窗
  */
-class ColockOperationTipDialog() : OnBindView<CustomDialog>(R.layout.dialog_colock_operation_tip) {
+class SwipCardOperationTipDialog() :
+    OnBindView<CustomDialog>(R.layout.dialog_swip_card_operation_tip) {
     private val mPairList = mutableListOf(
         Pair(
             CommonUtils.getStr("please_swipe_card"),
@@ -24,10 +21,10 @@ class ColockOperationTipDialog() : OnBindView<CustomDialog>(R.layout.dialog_colo
         )
     )
 
-    private lateinit var mBinding: DialogColockOperationTipBinding
+    private lateinit var mBinding: DialogSwipCardOperationTipBinding
 
     override fun onBind(customDialog: CustomDialog, contentView: View) {
-        mBinding = DialogColockOperationTipBinding.bind(contentView)
+        mBinding = DialogSwipCardOperationTipBinding.bind(contentView)
         customDialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.scrim))
         mBinding.closeIv.setDebouncedClickListener {
             customDialog.dismiss()
@@ -45,7 +42,7 @@ class ColockOperationTipDialog() : OnBindView<CustomDialog>(R.layout.dialog_colo
          */
         @JvmStatic
         fun show(): CustomDialog {
-            return CustomDialog.show(ColockOperationTipDialog())
+            return CustomDialog.show(SwipCardOperationTipDialog())
         }
     }
 }

+ 48 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/SwipRfidOperationTipDialog.kt

@@ -0,0 +1,48 @@
+package com.grkj.iscs.features.main.dialog
+
+import android.view.View
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogSwipRfidOperationTipBinding
+import com.grkj.ui_base.skin.loadSkinIcon
+import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
+
+/**
+ * 刷rfid弹窗
+ */
+class SwipRfidOperationTipDialog() :
+    OnBindView<CustomDialog>(R.layout.dialog_swip_rfid_operation_tip) {
+    private val mPairList = mutableListOf(
+        Pair(
+            CommonUtils.getStr(com.grkj.ui_base.R.string.please_swipe_rfid),
+            "rfid.svg"
+        )
+    )
+
+    private lateinit var mBinding: DialogSwipRfidOperationTipBinding
+
+    override fun onBind(customDialog: CustomDialog, contentView: View) {
+        mBinding = DialogSwipRfidOperationTipBinding.bind(contentView)
+        customDialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.scrim))
+        mBinding.closeIv.setDebouncedClickListener {
+            customDialog.dismiss()
+        }
+        mBinding.llEasyContainer.visibility = View.VISIBLE
+        mBinding.ivIcon.loadSkinIcon(mPairList[0].second)
+        mBinding.tvTip.text = mPairList[0].first
+    }
+
+    companion object {
+        /**
+         * 根据类型显示弹框
+         *
+         * @param loginType 0:人脸 1:指纹 2:工卡
+         */
+        @JvmStatic
+        fun show(): CustomDialog {
+            return CustomDialog.show(SwipRfidOperationTipDialog())
+        }
+    }
+}

+ 8 - 8
app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt

@@ -134,8 +134,8 @@ class TextDropDownDialog(
             view: View,
             showSearchView: Boolean = false,
             onSelect: (TextDropDownEntity) -> Unit
-        ) {
-            CustomDialog.show(
+        ): CustomDialog {
+            return CustomDialog.show(
                 TextDropDownDialog(data, false, false, showSearchView, false, onSelect) { }
             ).setAlignBaseViewGravity(view, Gravity.BOTTOM or Gravity.CENTER).setWidth(view.width)
         }
@@ -149,8 +149,8 @@ class TextDropDownDialog(
             view: View,
             showSearchView: Boolean = false,
             onMultiSelect: (List<TextDropDownEntity>?) -> Unit
-        ) {
-            CustomDialog.show(
+        ): CustomDialog {
+            return CustomDialog.show(
                 TextDropDownDialog(data, true, false, showSearchView, false, {}) { selected ->
                     onMultiSelect(
                         selected
@@ -169,8 +169,8 @@ class TextDropDownDialog(
             showSearchView: Boolean = false,
             canSelectedParent: Boolean = true,
             onSelect: (TextDropDownEntity) -> Unit
-        ) {
-            CustomDialog.show(
+        ): CustomDialog {
+            return CustomDialog.show(
                 TextDropDownDialog(
                     data,
                     false,
@@ -192,8 +192,8 @@ class TextDropDownDialog(
             showSearchView: Boolean = false,
             canSelectedParent: Boolean = false,
             onMultiSelect: (List<TextDropDownEntity>?) -> Unit
-        ) {
-            CustomDialog.show(
+        ): CustomDialog {
+            return CustomDialog.show(
                 TextDropDownDialog(
                     data,
                     true,

+ 43 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt

@@ -6,12 +6,14 @@ import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikcore.extension.setDebouncedClickListener
 
@@ -24,11 +26,13 @@ import com.sik.sikcore.extension.setDebouncedClickListener
  */
 class AddPointDialog(
     private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
-    private val rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+    private var rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val apply: AddPointDialog.() -> Unit,
     private val onConfirm: (AddPointManageVo, CustomDialog) -> Unit
 ) : OnBindView<CustomDialog>(R.layout.dialog_add_point) {
 
     private lateinit var binding: DialogAddPointBinding
+    private var rfidSelectDialogShow: Boolean = false
 
     override fun onBind(dialog: CustomDialog, v: View) {
         binding = DialogAddPointBinding.bind(v)
@@ -61,10 +65,16 @@ class AddPointDialog(
         }
 
         binding.rfidTagTv.setDebouncedClickListener {
+            rfidSelectDialogShow = true
             TextDropDownDialog.showSingle(rfidTokenData, binding.rfidTagTv) { item ->
                 binding.rfidTagTv.text = item.getShowText()
                 binding.rfidTagTv.tag = item.getId()
-            }
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    rfidSelectDialogShow = false
+                    super.onDismiss(dialog)
+                }
+            })
         }
 
         // 关闭
@@ -84,6 +94,33 @@ class AddPointDialog(
                 onConfirm(vo, dialog)
             }
         }
+        apply()
+    }
+
+    /**
+     * 刷新点位数据
+     */
+    fun refreshRfidTokenData(
+        rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+        currentSelected: Long
+    ) {
+        this.rfidTokenData = rfidTokenData
+        binding.rfidTagTv.text =
+            rfidTokenData.find { (it.getId() ?: 0L) == currentSelected }?.getShowText()
+        binding.rfidTagTv.tag =
+            rfidTokenData.find { (it.getId() ?: 0L) == currentSelected }?.getId()
+        if (rfidSelectDialogShow) {
+            rfidSelectDialogShow = true
+            TextDropDownDialog.showSingle(rfidTokenData, binding.rfidTagTv) { item ->
+                binding.rfidTagTv.text = item.getShowText()
+                binding.rfidTagTv.tag = item.getId()
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    rfidSelectDialogShow = false
+                    super.onDismiss(dialog)
+                }
+            })
+        }
     }
 
     private fun checkData(): Boolean {
@@ -118,10 +155,11 @@ class AddPointDialog(
         fun show(
             workstationData: List<TextDropDownDialog.TextDropDownEntity>,
             rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+            apply: AddPointDialog.() -> Unit,
             onConfirm: (AddPointManageVo, CustomDialog) -> Unit
-        ) {
-            CustomDialog.show(
-                AddPointDialog(workstationData, rfidTokenData, onConfirm),
+        ): CustomDialog {
+            return CustomDialog.show(
+                AddPointDialog(workstationData, rfidTokenData, apply, onConfirm),
                 CustomDialog.ALIGN.CENTER
             )
         }

+ 44 - 7
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt

@@ -13,6 +13,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikcore.extension.setDebouncedClickListener
 
@@ -26,11 +27,13 @@ import com.sik.sikcore.extension.setDebouncedClickListener
 class UpdatePointDialog(
     private val pointVo: PointManageVo,
     private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
-    private val rfidData: List<TextDropDownDialog.TextDropDownEntity>,
+    private var rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val apply: UpdatePointDialog.() -> Unit,
     private val onConfirm: (UpdatePointManageVo, CustomDialog) -> Unit
 ) : OnBindView<CustomDialog>(R.layout.dialog_update_point) {
 
     private lateinit var binding: DialogUpdatePointBinding
+    private var rfidSelectDialogShow: Boolean = false
     private val powerTypeList by lazy {
         IsolationPointPowerTypeEnum.values().map {
             TextDropDownDialog.SimpleTextDropDownEntity(
@@ -63,7 +66,7 @@ class UpdatePointDialog(
             binding.workstationTv.text = it.getShowText()
             binding.workstationTv.tag = it.getId()
         }
-        rfidData.find { it.getId() == pointVo.rfidId }?.also {
+        rfidTokenData.find { it.getId() == pointVo.rfidId }?.also {
             binding.rfidTagTv.text = it.getShowText()
             binding.rfidTagTv.tag = it.getId()
         }
@@ -88,10 +91,16 @@ class UpdatePointDialog(
         }
         // RFID
         binding.rfidTagTv.setDebouncedClickListener {
-            TextDropDownDialog.showSingle(rfidData, binding.rfidTagTv) { item ->
+            rfidSelectDialogShow = true
+            TextDropDownDialog.showSingle(rfidTokenData, binding.rfidTagTv) { item ->
                 binding.rfidTagTv.text = item.getShowText()
                 binding.rfidTagTv.tag = item.getId()
-            }
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    rfidSelectDialogShow = false
+                    super.onDismiss(dialog)
+                }
+            })
         }
 
         // 关闭/取消
@@ -111,6 +120,33 @@ class UpdatePointDialog(
             )
             onConfirm(updateVo, dialog)
         }
+        apply()
+    }
+
+    /**
+     * 刷新点位数据
+     */
+    fun refreshRfidTokenData(
+        rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+        currentSelected: Long
+    ) {
+        this.rfidTokenData = rfidTokenData
+        binding.rfidTagTv.text =
+            rfidTokenData.find { (it.getId() ?: 0L) == currentSelected }?.getShowText()
+        binding.rfidTagTv.tag =
+            rfidTokenData.find { (it.getId() ?: 0L) == currentSelected }?.getId()
+        if (rfidSelectDialogShow) {
+            rfidSelectDialogShow = true
+            TextDropDownDialog.showSingle(rfidTokenData, binding.rfidTagTv) { item ->
+                binding.rfidTagTv.text = item.getShowText()
+                binding.rfidTagTv.tag = item.getId()
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    rfidSelectDialogShow = false
+                    super.onDismiss(dialog)
+                }
+            })
+        }
     }
 
     private fun validate(): Boolean {
@@ -146,10 +182,11 @@ class UpdatePointDialog(
             pointVo: PointManageVo,
             workstationData: List<TextDropDownDialog.TextDropDownEntity>,
             rfidData: List<TextDropDownDialog.TextDropDownEntity>,
+            apply: UpdatePointDialog.() -> Unit,
             onConfirm: (UpdatePointManageVo, CustomDialog) -> Unit
-        ) {
-            CustomDialog.show(
-                UpdatePointDialog(pointVo, workstationData, rfidData, onConfirm),
+        ): CustomDialog {
+            return CustomDialog.show(
+                UpdatePointDialog(pointVo, workstationData, rfidData, apply, onConfirm),
                 CustomDialog.ALIGN.CENTER
             )
         }

+ 84 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt

@@ -1,5 +1,6 @@
 package com.grkj.iscs.features.main.fragment.data_manage
 
+import android.app.Dialog
 import android.graphics.Color
 import androidx.fragment.app.viewModels
 import com.drake.brv.BindingAdapter
@@ -8,20 +9,26 @@ import com.drake.brv.utils.divider
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
+import com.grkj.data.data.EventConstants
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentPointManageBinding
 import com.grkj.iscs.databinding.ItemPointManagePointBinding
+import com.grkj.iscs.features.main.dialog.SwipRfidOperationTipDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.dialog.data_manage.AddPointDialog
 import com.grkj.iscs.features.main.dialog.data_manage.FilterPointDialog
 import com.grkj.iscs.features.main.dialog.data_manage.UpdatePointDialog
 import com.grkj.iscs.features.main.viewmodel.data_manage.PointManageViewModel
+import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.extension.tip
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
 import kotlin.getValue
@@ -32,6 +39,8 @@ import kotlin.getValue
 @AndroidEntryPoint
 class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
     private val viewModel: PointManageViewModel by viewModels()
+    private var addPointDialog: AddPointDialog? = null
+    private var updatePointDialog: UpdatePointDialog? = null
     override fun getLayoutId(): Int {
         return R.layout.fragment_point_manage
     }
@@ -48,6 +57,8 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             getPointData(false)
         }
         binding.addPoint.setDebouncedClickListener {
+            viewModel.startReadCard = true
+            viewModel.isDialogRead = true
             AddPointDialog.show(viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
@@ -71,6 +82,8 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                     dataId = it.rfidId,
                     dataText = "${it.rfidCode}(${it.rfid})"
                 )
+            }, {
+                addPointDialog = this
             }) { data, dialog ->
                 viewModel.validatePointData(data.rfidId ?: 0).observe(this) {
                     viewModel.addIsolationPoint(data).observe(this) {
@@ -98,7 +111,14 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                         }
                     }
                 }
-            }
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    viewModel.startReadCard = false
+                    viewModel.isDialogRead = false
+                    addPointDialog = null
+                    super.onDismiss(dialog)
+                }
+            })
         }
         binding.filterPoint.setDebouncedClickListener {
             FilterPointDialog.show(viewModel.workstationData.map {
@@ -167,11 +187,24 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             binding.selectAll.isChecked = viewModel.pointManageDataList.all { it.isSelected }
             setSelectAllListener()
         }
+        itemBinding.registerRfid.setDebouncedClickListener {
+            viewModel.startReadCard = true
+            viewModel.currentChangeRfidItem = item
+            SwipRfidOperationTipDialog.show().setDialogLifecycleCallback(object :
+                DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    viewModel.startReadCard = false
+                    super.onDismiss(dialog)
+                }
+            })
+        }
         itemBinding.root.setDebouncedClickListener {
             if (item.pointId in viewModel.inUsePointIds) {
                 showToast(CommonUtils.getStr("point_in_use"))
                 return@setDebouncedClickListener
             }
+            viewModel.startReadCard = true
+            viewModel.isDialogRead = true
             UpdatePointDialog.show(item, viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
@@ -195,6 +228,8 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                     dataId = it.rfidId,
                     dataText = "${it.rfidCode}(${it.rfid})"
                 )
+            }, {
+                updatePointDialog = this
             }) { data, dialog ->
                 viewModel.updateIsolationPoint(data).observe(this@PointMangeFragment) {
                     dialog.dismiss()
@@ -220,7 +255,14 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                         )
                     }
                 }
-            }
+            }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
+                override fun onDismiss(dialog: CustomDialog?) {
+                    viewModel.startReadCard = false
+                    viewModel.isDialogRead = false
+                    updatePointDialog = null
+                    super.onDismiss(dialog)
+                }
+            })
         }
     }
 
@@ -232,6 +274,46 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
         getPointData(nextPage = false)
     }
 
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        when (event.code) {
+            EventConstants.EVENT_RFID_CARD_READ -> {
+                if (!viewModel.startReadCard) {
+                    return
+                }
+                val rfid = (event.data as RFIDCardReadEvent).rfidNo
+                if (viewModel.isDialogRead) {
+                    viewModel.getOrCreateRfid(rfid).observe(this) {
+                        if (it == null) {
+                            showToast(CommonUtils.getStr(com.grkj.ui_base.R.string.rfid_already_bind))
+                            return@observe
+                        }
+                        val rfidTextDropDownData = viewModel.rfidTokenData.map {
+                            TextDropDownDialog.SimpleTextDropDownEntity(
+                                dataId = it.rfidId,
+                                dataText = "${it.rfidCode}(${it.rfid})"
+                            )
+                        }
+                        addPointDialog?.refreshRfidTokenData(rfidTextDropDownData, it)
+                        updatePointDialog?.refreshRfidTokenData(rfidTextDropDownData, it)
+                    }
+                } else {
+                    viewModel.changeRfid(rfid).observe(this) {
+                        if (it) {
+                            TipDialog.showSuccess(
+                                CommonUtils.getStr(com.grkj.ui_base.R.string.register_rfid_success),
+                                onConfirmClick = {
+                                    getPointData(nextPage = false)
+                                })
+                        } else {
+                            TipDialog.showError(CommonUtils.getStr(com.grkj.ui_base.R.string.rfid_already_bind))
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     private fun getPointData(nextPage: Boolean = true) {
         if (!nextPage) {
             showLoading()

+ 12 - 12
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/HardwareManageHomeFragment.kt

@@ -47,18 +47,18 @@ class HardwareManageHomeFragment : BaseFragment<FragmentHardwareManageHomeBindin
             I18nManager.t(RoleFunctionalPermissionsEnum.LOCK_MANAGE.description),
             RoleFunctionalPermissionsEnum.LOCK_MANAGE.functionalPermission
         ),
-        MenuItemEntity(
-            3,
-            "cards-blank.png",
-            I18nManager.t(RoleFunctionalPermissionsEnum.CARD_MANAGE.description),
-            RoleFunctionalPermissionsEnum.CARD_MANAGE.functionalPermission
-        ),
-        MenuItemEntity(
-            4,
-            "rfid.svg",
-            I18nManager.t(RoleFunctionalPermissionsEnum.RFID_MANAGE.description),
-            RoleFunctionalPermissionsEnum.RFID_MANAGE.functionalPermission
-        ),
+//        MenuItemEntity(
+//            3,
+//            "cards-blank.png",
+//            I18nManager.t(RoleFunctionalPermissionsEnum.CARD_MANAGE.description),
+//            RoleFunctionalPermissionsEnum.CARD_MANAGE.functionalPermission
+//        ),
+//        MenuItemEntity(
+//            4,
+//            "rfid.svg",
+//            I18nManager.t(RoleFunctionalPermissionsEnum.RFID_MANAGE.description),
+//            RoleFunctionalPermissionsEnum.RFID_MANAGE.functionalPermission
+//        ),
     )
 
     override fun getLayoutId(): Int {

+ 14 - 29
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt

@@ -84,9 +84,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                 }
             }
         }.models = viewModel.lastDockSnapshot
-        if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
-        ) {
+        if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true) {
             ISCSConfig.isDeviceRegistration = true
         }
         binding.tvAllSlotTurnOn.setDebouncedClickListener {
@@ -292,11 +290,9 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                     }?.dictValue
                 itemKeyBinding.ivKey.isSelected = itemKey.isExist
                 itemKeyBinding.switchLayout.isVisible =
-                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                 itemKeyBinding.detect.isVisible =
-                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                 itemKeyBinding.tvTurnOn.setDebouncedClickListener {
                     slotSwitch(true, itemKey)
                 }
@@ -323,8 +319,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                     )
                 }
                 itemKeyBinding.exceptionIv.setOnLongClickListener {
-                    if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                        MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                     ) {
                         TipDialog.showInfo(
                             CommonUtils.getStr("do_you_want_to_remove_exception"),
@@ -377,11 +372,9 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                     }?.dictValue
                 itemLockBinding.root.isSelected = itemLock.isExist
                 itemLockBinding.switchLayout.isVisible =
-                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                 itemLockBinding.detect.isVisible =
-                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                 itemLockBinding.tvTurnOn.setDebouncedClickListener {
                     slotSwitch(true, itemLock)
                 }
@@ -408,8 +401,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                     )
                 }
                 itemLockBinding.exceptionIv.setOnLongClickListener {
-                    if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                        MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                    if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                     ) {
                         TipDialog.showInfo(
                             CommonUtils.getStr("do_you_want_to_remove_exception"),
@@ -462,11 +454,9 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                             }?.dictValue
                         itemKeyBinding.ivKey.isSelected = itemPortable.isExist
                         itemKeyBinding.switchLayout.isVisible =
-                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                    MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                         itemKeyBinding.detect.isVisible =
-                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                    MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                         itemKeyBinding.tvTurnOn.setDebouncedClickListener {
                             slotSwitch(true, itemPortable)
                         }
@@ -493,8 +483,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                             )
                         }
                         itemKeyBinding.exceptionIv.setOnLongClickListener {
-                            if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                             ) {
                                 TipDialog.showInfo(
                                     CommonUtils.getStr("do_you_want_to_remove_exception"),
@@ -535,11 +524,9 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                             }?.dictValue
                         itemLockBinding.root.isSelected = itemPortable.isExist
                         itemLockBinding.switchLayout.isVisible =
-                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                    MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                         itemLockBinding.detect.isVisible =
-                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                    MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                         itemLockBinding.tvTurnOn.setDebouncedClickListener {
                             slotSwitch(true, itemPortable)
                         }
@@ -566,8 +553,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
                             )
                         }
                         itemLockBinding.exceptionIv.setOnLongClickListener {
-                            if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-                                MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+                            if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
                             ) {
                                 TipDialog.showInfo(
                                     CommonUtils.getStr("do_you_want_to_remove_exception"),
@@ -654,8 +640,7 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
 
     override fun onDestroyView() {
         viewModel.isDestroy = true
-        if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true ||
-            MainDomainData.roleKeys?.contains(RoleEnum.SYSCONFIG.roleKey) == true
+        if (MainDomainData.roleKeys?.contains(RoleEnum.ADMIN.roleKey) == true
         ) {
             ISCSConfig.isDeviceRegistration = false
         }

+ 6 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -16,6 +16,7 @@ import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.grkj.data.data.EventConstants
+import com.grkj.data.data.MMKVConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.data.Type
 import com.grkj.data.enums.LoginResultEnum
@@ -46,6 +47,7 @@ import com.grkj.ui_base.utils.removeBgTint
 import com.kongzue.dialogx.dialogs.BottomMenu
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.date.TimeUtils
+import com.sik.sikcore.extension.getMMKVData
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -455,7 +457,10 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         super.onEvent(event)
         when (event.code) {
             EventConstants.EVENT_RFID_CARD_READ -> {
-                if (MainDomainData.userInfo?.userName != viewModel.ticketData?.createBy) {
+                if (MainDomainData.userInfo?.userName != viewModel.ticketData?.createBy && !MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(
+                        false
+                    )
+                ) {
                     showToast(
                         CommonUtils.getStr("no_permission_to_handle")
                             .toString()

+ 3 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt

@@ -24,7 +24,7 @@ import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentMyTodoListBinding
 import com.grkj.iscs.databinding.ItemMyTodoBinding
 import com.grkj.iscs.features.main.dialog.CheckFaceDialog
-import com.grkj.iscs.features.main.dialog.ColockOperationTipDialog
+import com.grkj.iscs.features.main.dialog.SwipCardOperationTipDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.dialog.job_manage.TodoPointDetailDialog
 import com.grkj.iscs.features.main.viewmodel.job_manage.JobExecuteViewModel
@@ -333,7 +333,7 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
 
                             OperationTypeEnum.COLOCK -> {
                                 viewModel.startReadCard = true
-                                ColockOperationTipDialog.show().setDialogLifecycleCallback(object :
+                                SwipCardOperationTipDialog.show().setDialogLifecycleCallback(object :
                                     DialogLifecycleCallback<CustomDialog>() {
                                     override fun onDismiss(dialog: CustomDialog?) {
                                         viewModel.startReadCard = false
@@ -344,7 +344,7 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
 
                             OperationTypeEnum.RELEASE_COLOCK -> {
                                 viewModel.startReadCard = true
-                                ColockOperationTipDialog.show().setDialogLifecycleCallback(object :
+                                SwipCardOperationTipDialog.show().setDialogLifecycleCallback(object :
                                     DialogLifecycleCallback<CustomDialog>() {
                                     override fun onDismiss(dialog: CustomDialog?) {
                                         viewModel.startReadCard = false

+ 80 - 4
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt

@@ -2,6 +2,8 @@ package com.grkj.iscs.features.main.viewmodel.data_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.grkj.data.enums.CommonDictDataEnum
+import com.grkj.data.logic.IHardwareLogic
 import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.data.model.vo.PointManageFilterVo
@@ -10,9 +12,8 @@ import com.grkj.data.model.vo.UpdatePointManageVo
 import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.logic.IIsolationPointLogic
 import com.grkj.data.logic.IJobTicketLogic
-import com.grkj.data.logic.IRfidTokenLogic
 import com.grkj.data.logic.IWorkstationLogic
-import com.grkj.iscs.R
+import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.utils.CommonUtils
 import dagger.hilt.android.lifecycle.HiltViewModel
@@ -25,7 +26,7 @@ import javax.inject.Inject
 @HiltViewModel
 class PointManageViewModel @Inject constructor(
     val isolationPointRepository: IIsolationPointLogic,
-    val rfidTokenRepository: IRfidTokenLogic,
+    val hardwareLogic: IHardwareLogic,
     val workstationRepository: IWorkstationLogic,
     val jobTicketRepository: IJobTicketLogic
 ) : BaseViewModel() {
@@ -38,6 +39,17 @@ class PointManageViewModel @Inject constructor(
 
     var inUsePointIds: MutableList<Long> = mutableListOf()
 
+    /**
+     * 开始读卡
+     */
+    var startReadCard: Boolean = false
+    var isDialogRead: Boolean = false
+
+    /**
+     * 当前需要修改rfid的数据
+     */
+    lateinit var currentChangeRfidItem: PointManageVo
+
     /**
      * 删除选中隔离点
      */
@@ -95,7 +107,7 @@ class PointManageViewModel @Inject constructor(
     fun initDialogData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             workstationData = workstationRepository.getWorkstationManageData()
-            rfidTokenData = rfidTokenRepository.getRfidData()
+            rfidTokenData = hardwareLogic.getAllRfidData()
             emit(true)
         }
     }
@@ -125,4 +137,68 @@ class PointManageViewModel @Inject constructor(
             emit(true)
         }
     }
+
+    /**
+     * 修改rfid
+     */
+    fun changeRfid(rfid: String): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            var isRfidToken = hardwareLogic.getRfidDataByRfid(rfid)
+            if (isRfidToken == null) {
+                isRfidToken = IsRfidToken()
+                val defaultRfidCodeSize = hardwareLogic.getLastRFIDId()
+                isRfidToken.rfidCode = "RFID_${defaultRfidCodeSize + 1}"
+                isRfidToken.rfid = rfid
+                isRfidToken.status =
+                    CommonDictDataEnum.RFID_TOKEN_STATUS.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "normal"
+                        )
+                    }?.dictValue
+                val rfidId = hardwareLogic.addRfidTokenInfo(isRfidToken)
+                isolationPointRepository.updateRfidId(currentChangeRfidItem.pointId, rfidId)
+                emit(true)
+            } else {
+                val isIsolationPoint = isolationPointRepository.getPointByRfId(isRfidToken.rfidId)
+                if (isIsolationPoint != null) {
+                    emit(false)
+                } else {
+                    isolationPointRepository.updateRfidId(
+                        currentChangeRfidItem.pointId,
+                        isRfidToken.rfidId
+                    )
+                    emit(true)
+                }
+            }
+        }
+    }
+
+    fun getOrCreateRfid(rfid: String): LiveData<Long?> {
+        return liveData(Dispatchers.IO) {
+            var isRfidToken = hardwareLogic.getRfidDataByRfid(rfid)
+            if (isRfidToken == null) {
+                isRfidToken = IsRfidToken()
+                val defaultRfidCodeSize = hardwareLogic.getLastRFIDId()
+                isRfidToken.rfidCode = "RFID_${defaultRfidCodeSize + 1}"
+                isRfidToken.rfid = rfid
+                isRfidToken.status =
+                    CommonDictDataEnum.RFID_TOKEN_STATUS.commonDictRes.find {
+                        I18nManager.t(it.dictLabel) == I18nManager.t(
+                            "normal"
+                        )
+                    }?.dictValue
+                val rfidId = hardwareLogic.addRfidTokenInfo(isRfidToken)
+                rfidTokenData = hardwareLogic.getAllRfidData()
+                emit(rfidId)
+            } else {
+                rfidTokenData = hardwareLogic.getAllRfidData()
+                val isIsolationPoint = isolationPointRepository.getPointByRfId(isRfidToken.rfidId)
+                if (isIsolationPoint != null) {
+                    emit(null)
+                } else {
+                    emit(isRfidToken.rfidId)
+                }
+            }
+        }
+    }
 }

+ 2 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/MyTodoViewModel.kt

@@ -20,6 +20,7 @@ import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.DataBusiness
 import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.CustomDialog
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
 import javax.inject.Inject
@@ -196,7 +197,7 @@ class MyTodoViewModel @Inject constructor(
                 .toString()
 
             OperationTypeEnum.CONFIRM -> CommonUtils.getStr(
-               "handle_step_confirm", item.todoTitle.toString()
+                "handle_step_confirm", item.todoTitle.toString()
             ).toString()
 
             OperationTypeEnum.END -> CommonUtils.getStr("finish_job_tip").toString()

+ 11 - 2
app/src/main/res/layout-land/fragment_point_manage.xml

@@ -127,8 +127,8 @@
                 android:id="@+id/select_all"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                app:useMaterialThemeColors="true"
-                android:layout_gravity="center" />
+                android:layout_gravity="center"
+                app:useMaterialThemeColors="true" />
 
             <TextView
                 android:layout_width="0dp"
@@ -165,6 +165,15 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:i18nKey='@{"point_manage_rfid"}' />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/operation"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md" />
         </LinearLayout>
 
         <com.scwang.smart.refresh.layout.SmartRefreshLayout

+ 18 - 0
app/src/main/res/layout-land/item_point_manage_point.xml

@@ -50,5 +50,23 @@
             android:gravity="center"
             android:textColor="?attr/colorTextPrimary"
             android:textSize="@dimen/iscs_text_md" />
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:layout_weight="1">
+
+            <TextView
+                android:id="@+id/register_rfid"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:singleLine="true"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:text="@string/register_point_rfid"
+                android:textColor="?attr/colorTextClick"
+                android:textSize="@dimen/iscs_text_md" />
+        </LinearLayout>
     </LinearLayout>
 </layout>

+ 1 - 0
app/src/main/res/layout-land/item_quick_entrance_config.xml

@@ -10,6 +10,7 @@
         android:background="?attr/selectableItemBackground"
         android:gravity="center_horizontal"
         android:orientation="vertical"
+        android:minWidth="@dimen/menu_min_width"
         android:paddingHorizontal="@dimen/iscs_space_4">
 
         <FrameLayout

+ 1 - 0
app/src/main/res/layout-land/item_quick_entrance_not_config.xml

@@ -9,6 +9,7 @@
         android:layout_margin="@dimen/iscs_space_2"
         android:gravity="center_horizontal"
         android:paddingHorizontal="@dimen/iscs_space_4"
+        android:minWidth="@dimen/menu_min_width"
         android:orientation="vertical">
 
         <FrameLayout

+ 1 - 1
app/src/main/res/layout/dialog_change_lang.xml

@@ -25,6 +25,6 @@
             android:paddingHorizontal="@dimen/iscs_space_2"
             android:textColor="?attr/colorTextPrimary"
             android:textSize="@dimen/iscs_text_md"
-            app:i18nKey='@{"switch"}' />
+            app:i18nKey='@{"switch_tv"}' />
     </LinearLayout>
 </layout>

+ 0 - 0
app/src/main/res/layout-land/dialog_colock_operation_tip.xml → app/src/main/res/layout/dialog_swip_card_operation_tip.xml


+ 0 - 0
app/src/main/res/layout/dialog_colock_operation_tip.xml → app/src/main/res/layout/dialog_swip_rfid_operation_tip.xml


+ 8 - 0
app/src/main/res/layout/fragment_point_manage.xml

@@ -157,6 +157,14 @@
                 android:textColor="?attr/colorTextPrimary"
                 app:i18nKey='@{"point_manage_workstation"}'
                 android:textSize="@dimen/iscs_text_md" />
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:textColor="?attr/colorTextPrimary"
+                android:text="@string/operation"
+                android:textSize="@dimen/iscs_text_md" />
         </LinearLayout>
 
         <com.scwang.smart.refresh.layout.SmartRefreshLayout

+ 11 - 2
app/src/main/res/layout/fragment_user_manage.xml

@@ -129,8 +129,8 @@
                 android:id="@+id/select_all"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                app:useMaterialThemeColors="true"
-                android:layout_gravity="center" />
+                android:layout_gravity="center"
+                app:useMaterialThemeColors="true" />
 
             <TextView
                 android:layout_width="0dp"
@@ -158,6 +158,15 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:i18nKey='@{"user_manage_role"}' />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="2"
+                android:gravity="center"
+                android:text="@string/operation"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md" />
         </LinearLayout>
 
         <com.scwang.smart.refresh.layout.SmartRefreshLayout

+ 21 - 2
app/src/main/res/layout/item_point_manage_point.xml

@@ -12,8 +12,8 @@
             android:id="@+id/select"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            app:useMaterialThemeColors="true"
-            android:layout_gravity="center"/>
+            android:layout_gravity="center"
+            app:useMaterialThemeColors="true" />
 
         <TextView
             android:id="@+id/point_name"
@@ -41,5 +41,24 @@
             android:gravity="center"
             android:textColor="?attr/colorTextPrimary"
             android:textSize="@dimen/iscs_text_md" />
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:gravity="center"
+            android:layout_weight="1">
+
+            <TextView
+                android:id="@+id/register_rfid"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:singleLine="true"
+                android:text="@string/register_point_rfid"
+                android:textColor="?attr/colorTextClick"
+                android:textSize="@dimen/iscs_text_md" />
+        </LinearLayout>
     </LinearLayout>
 </layout>

+ 1 - 0
app/src/main/res/layout/item_quick_entrance_config.xml

@@ -10,6 +10,7 @@
         android:background="?attr/selectableItemBackground"
         android:gravity="center_horizontal"
         android:orientation="vertical"
+        android:minWidth="@dimen/menu_min_width"
         android:paddingHorizontal="@dimen/iscs_space_4">
 
         <FrameLayout

+ 1 - 0
app/src/main/res/layout/item_quick_entrance_not_config.xml

@@ -9,6 +9,7 @@
         android:layout_margin="@dimen/iscs_space_2"
         android:gravity="center_horizontal"
         android:orientation="vertical"
+        android:minWidth="@dimen/menu_min_width"
         android:paddingHorizontal="@dimen/iscs_space_4">
 
         <FrameLayout

+ 51 - 2
app/src/main/res/layout/item_user_manage_user.xml

@@ -12,8 +12,8 @@
             android:id="@+id/select"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            app:useMaterialThemeColors="true"
-            android:layout_gravity="center" />
+            android:layout_gravity="center"
+            app:useMaterialThemeColors="true" />
 
         <TextView
             android:id="@+id/nickname"
@@ -43,5 +43,54 @@
             android:singleLine="true"
             android:textColor="?attr/colorTextPrimary"
             android:textSize="@dimen/iscs_text_md" />
+
+        <com.google.android.flexbox.FlexboxLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            app:alignItems="center"
+            app:dividerDrawableHorizontal="@drawable/common_divider_small_space_horizontal"
+            app:flexDirection="row"
+            app:flexWrap="wrap"
+            app:justifyContent="center"
+            app:showDivider="middle">
+
+            <TextView
+                android:id="@+id/register_card"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:singleLine="true"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:text="@string/register_job_card"
+                android:textColor="?attr/colorTextClick"
+                android:textSize="@dimen/iscs_text_md" />
+
+            <TextView
+                android:id="@+id/register_fingerprint"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:singleLine="true"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:text="@string/register_fingerprint"
+                android:textColor="?attr/colorTextClick"
+                android:textSize="@dimen/iscs_text_md" />
+
+            <TextView
+                android:id="@+id/register_face"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:ellipsize="end"
+                android:gravity="center"
+                android:singleLine="true"
+                android:paddingHorizontal="@dimen/common_spacing"
+                android:text="@string/register_job_card"
+                android:textColor="?attr/colorTextClick"
+                android:textSize="@dimen/iscs_text_md" />
+        </com.google.android.flexbox.FlexboxLayout>
     </LinearLayout>
 </layout>

+ 7 - 0
app/src/main/res/values-en/strings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="register_job_card">Register Job Card</string>
+    <string name="register_fingerprint">Register Fingerprint</string>
+    <string name="register_face">Register Face</string>
+    <string name="register_point_rfid">录入RFID</string>
+</resources>

+ 7 - 0
app/src/main/res/values-zh/strings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="register_job_card">录入工卡</string>
+    <string name="register_fingerprint">录入指纹</string>
+    <string name="register_face">录入人脸</string>
+    <string name="register_point_rfid">录入RFID</string>
+</resources>

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="register_job_card">录入工卡</string>
+    <string name="register_fingerprint">录入指纹</string>
+    <string name="register_point_rfid">录入RFID</string>
+</resources>

+ 6 - 0
data/src/main/java/com/grkj/data/dao/HardwareDao.kt

@@ -194,6 +194,12 @@ interface HardwareDao {
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun addRfidToken(isRfidToken: List<IsRfidToken>)
 
+    /**
+     * 添加点位Rfid
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addRfidToken(isRfidToken: IsRfidToken): Long
+
     /**
      * 添加钥匙信息
      */

+ 6 - 0
data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt

@@ -130,4 +130,10 @@ select iip.point_id as pointId,
     @Query("select rfid_id from is_isolation_point where point_id in (:inUsePointIds)")
     fun getRfidIdByPointIds(inUsePointIds: List<Long>): List<Long>
 
+    /**
+     * 根据id获取点位数据
+     */
+    @Query("select * from is_isolation_point where point_id = :pointId")
+    fun getPointById(pointId: Long): IsIsolationPoint
+
 }

+ 6 - 0
data/src/main/java/com/grkj/data/dao/RfidTokenDao.kt

@@ -23,4 +23,10 @@ interface RfidTokenDao {
     @Query("select * from is_rfid_token where del_flag = 0")
     fun getRfidData(): List<IsRfidToken>
 
+    /**
+     * 根据rfid获取数据
+     */
+    @Query("select * from is_rfid_token where rfid = :rfid and del_flag = 0")
+    fun getRfidDataByRfid(rfid: String): IsRfidToken?
+
 }

+ 1 - 3
data/src/main/java/com/grkj/data/enums/RoleEnum.kt

@@ -9,7 +9,5 @@ enum class RoleEnum(val roleKey: String, val description: String) {
     ADMIN("admin", "admin"),
     JTDRAWER("jtdrawer", "jtdrawer"),
     JTLOCKER("jtlocker", "jtlocker"),
-    JTCOLOCKER("jtcolocker", "jtcolocker"),
-    JTGUARD("jtguard", "jtguard"),
-    SYSCONFIG("sysconfig", "sysconfig");
+    JTCOLOCKER("jtcolocker", "jtcolocker")
 }

+ 6 - 1
data/src/main/java/com/grkj/data/logic/IHardwareLogic.kt

@@ -164,7 +164,7 @@ interface IHardwareLogic {
     /**
      * 添加rfid标签信息
      */
-    fun addRfidTokenInfo(isRfidToken: IsRfidToken)
+    fun addRfidTokenInfo(isRfidToken: IsRfidToken): Long
 
     /**
      * 更新钥匙信息
@@ -429,4 +429,9 @@ interface IHardwareLogic {
      * 批量注册挂锁
      */
     fun saveLocksInfo(lockRfid: List<String>)
+
+    /**
+     * 获取所有rfid数据
+     */
+    fun getAllRfidData(): List<IsRfidToken>
 }

+ 5 - 0
data/src/main/java/com/grkj/data/logic/IIsolationPointLogic.kt

@@ -49,4 +49,9 @@ interface IIsolationPointLogic {
      */
     fun getPointByRfId(rfidId: Long): IsIsolationPoint?
 
+    /**
+     * 更新rfid数据
+     */
+    fun updateRfidId(pointId: Long, rfidId: Long)
+
 }

+ 5 - 0
data/src/main/java/com/grkj/data/logic/IRfidTokenLogic.kt

@@ -10,4 +10,9 @@ interface IRfidTokenLogic {
      * 获取rfid数据
      */
     fun getRfidData(): List<IsRfidToken>
+
+    /**
+     * 根据rfid获取数据
+     */
+    fun getRfidDataByRfid(rfid: String): IsRfidToken?
 }

+ 5 - 1
data/src/main/java/com/grkj/data/logic/impl/network/NetworkHardwareLogic.kt

@@ -152,7 +152,7 @@ class NetworkHardwareLogic  @Inject constructor() : BaseLogic(), IHardwareLogic
         TODO("Not yet implemented")
     }
 
-    override fun addRfidTokenInfo(isRfidToken: IsRfidToken) {
+    override fun addRfidTokenInfo(isRfidToken: IsRfidToken): Long {
         TODO("Not yet implemented")
     }
 
@@ -308,6 +308,10 @@ class NetworkHardwareLogic  @Inject constructor() : BaseLogic(), IHardwareLogic
         TODO("Not yet implemented")
     }
 
+    override fun getAllRfidData(): List<IsRfidToken> {
+        TODO("Not yet implemented")
+    }
+
     override fun updateMapPoint(pointToMapVo: PointToMapVo) {
         TODO("Not yet implemented")
     }

+ 4 - 0
data/src/main/java/com/grkj/data/logic/impl/network/NetworkIsolationPointLogic.kt

@@ -46,4 +46,8 @@ class NetworkIsolationPointLogic  @Inject constructor() : BaseLogic(), IIsolatio
     override fun getPointByRfId(rfidId: Long): IsIsolationPoint? {
         TODO("Not yet implemented")
     }
+
+    override fun updateRfidId(pointId: Long, rfidId: Long) {
+        TODO("Not yet implemented")
+    }
 }

+ 4 - 0
data/src/main/java/com/grkj/data/logic/impl/network/NetworkRfidTokenLogic.kt

@@ -14,4 +14,8 @@ class NetworkRfidTokenLogic  @Inject constructor() : BaseLogic(), IRfidTokenLogi
     override fun getRfidData(): List<IsRfidToken> {
         TODO("Not yet implemented")
     }
+
+    override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
+        TODO("Not yet implemented")
+    }
 }

+ 6 - 2
data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt

@@ -391,8 +391,12 @@ class HardwareLogic @Inject constructor(
         hardwareDao.addCard(isJobCard)
     }
 
-    override fun addRfidTokenInfo(isRfidToken: IsRfidToken) {
-        hardwareDao.addRfidToken(listOf(isRfidToken))
+    override fun addRfidTokenInfo(isRfidToken: IsRfidToken): Long {
+        return hardwareDao.addRfidToken(isRfidToken)
+    }
+
+    override fun getAllRfidData(): List<IsRfidToken> {
+        return hardwareDao.getAllRfidTokenData()
     }
 
     override fun updateKeyInfo(isKey: IsKey) {

+ 9 - 1
data/src/main/java/com/grkj/data/logic/impl/standard/IsolationPointLogic.kt

@@ -42,6 +42,12 @@ class IsolationPointLogic @Inject constructor(
         )
     }
 
+    override fun updateRfidId(pointId: Long, rfidId: Long) {
+        val isIsolationPoint = isolationPointDao.getPointById(pointId)
+        isIsolationPoint.rfidId = rfidId
+        isolationPointDao.updateIsolationPoint(isIsolationPoint)
+    }
+
     override fun addIsolationPoint(addPointManageVo: AddPointManageVo) {
         val isIsolationPoint = IsIsolationPoint()
         isIsolationPoint.pointName = addPointManageVo.pointName.toString()
@@ -64,7 +70,9 @@ class IsolationPointLogic @Inject constructor(
     }
 
     override fun getAllPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo> {
-        return isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId).filter { it.pointId !in getAllLockedPointManageDataWithWorkstationId(workstationId).map { it.pointId } }.toMutableList()
+        return isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId)
+            .filter { it.pointId !in getAllLockedPointManageDataWithWorkstationId(workstationId).map { it.pointId } }
+            .toMutableList()
     }
 
     override fun getAllLockedPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo> {

+ 4 - 0
data/src/main/java/com/grkj/data/logic/impl/standard/RfidTokenLogic.kt

@@ -15,4 +15,8 @@ class RfidTokenLogic @Inject constructor(val rfidTokenDao: RfidTokenDao): BaseLo
     override fun getRfidData(): List<IsRfidToken> {
         return rfidTokenDao.getRfidData()
     }
+
+    override fun getRfidDataByRfid(rfid: String): IsRfidToken? {
+        return rfidTokenDao.getRfidDataByRfid(rfid)
+    }
 }

+ 0 - 39
data/src/main/java/com/grkj/data/logic/impl/standard/SysMenuLogic.kt

@@ -103,45 +103,6 @@ class SysMenuLogic @Inject constructor(val sysMenuDao: SysMenuDao, val roleDao:
                         }
                         sysMenuDao.insertRoleMenus(roleMenuData)
                     }
-
-                    //作业观察员权限
-                    RoleEnum.JTGUARD.roleKey -> {
-                        val roleMenuData = mutableListOf<SysRoleMenu>().apply {
-                            for (permissionsEnum in RoleFunctionalPermissionsEnum.except(
-                                RoleFunctionalPermissionsEnum.DATA_HOME_MANAGE,
-                                RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE,
-                                RoleFunctionalPermissionsEnum.EXCEPTION_JOB,
-                                RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE,
-                                RoleFunctionalPermissionsEnum.SETTINGS,
-                            )) {
-                                sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
-                                    val sysRoleMenu = SysRoleMenu()
-                                    sysRoleMenu.roleId = roleData.roleId
-                                    sysRoleMenu.menuId = menuId
-                                    add(sysRoleMenu)
-                                }
-                            }
-                        }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
-                    }
-
-                    //系统配置员权限
-                    RoleEnum.SYSCONFIG.roleKey -> {
-                        val roleMenuData = mutableListOf<SysRoleMenu>().apply {
-                            for (permissionsEnum in RoleFunctionalPermissionsEnum.except(
-                                RoleFunctionalPermissionsEnum.JOB_TICKET_HOME_MANAGE,
-                                RoleFunctionalPermissionsEnum.EXCEPTION_HOME_MANAGE,
-                            )) {
-                                sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
-                                    val sysRoleMenu = SysRoleMenu()
-                                    sysRoleMenu.roleId = roleData.roleId
-                                    sysRoleMenu.menuId = menuId
-                                    add(sysRoleMenu)
-                                }
-                            }
-                        }
-                        sysMenuDao.insertRoleMenus(roleMenuData)
-                    }
                 }
             }
     }

+ 16 - 4
data/src/main/java/com/grkj/data/model/local/TodoStepJoin.kt

@@ -1,8 +1,10 @@
 package com.grkj.data.model.local
 
+import com.grkj.data.data.MMKVConstants
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.enums.StepAction
 import com.grkj.data.enums.TodoStatusEnum
+import com.sik.sikcore.extension.getMMKVData
 
 data class TodoStepJoin(
     // ----- 基础定位字段 -----
@@ -59,10 +61,20 @@ fun TodoStepJoin.isMyTodo(currentUserId: Long, currentUserName: String): Boolean
     if (enableLock && userRole == RoleEnum.JTLOCKER.roleKey && lockerUserId == currentUserId) return true
     if (enableUnlock && userRole == RoleEnum.JTLOCKER.roleKey && lockerUserId == currentUserId) return true
 
-    // ---- 判定共锁/解除共锁(由创建者) ----=
-    //todo 共锁人的共锁暂时不算代办 currentUserId in colockerUserId
-    if (enableColock && isCreator) return true
-    if (enableReleaseColock && isCreator) return true
+    // ---- 判定共锁/解除共锁(由创建者) ----
+    //根据配置判断,如果允许共锁人登录共锁只要共锁人列表包含当前人员的id,就是他的待办,否则不是。如果没开就还是判断创建人
+    if (enableColock && (MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(false) && colockerUserId.contains(
+            currentUserId
+        )) || (isCreator && !MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(
+            false
+        ))
+    ) return true
+    if (enableReleaseColock && (MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(false) && colockerUserId.contains(
+            currentUserId
+        )) || (isCreator && !MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(
+            false
+        ))
+    ) return true
 
     // ---- 判定结束作业(由创建者) ----
     if (enableEndJob && isCreator) return true

+ 124 - 59
shared/src/main/java/com/grkj/shared/utils/i18n/I18nManager.kt

@@ -1,5 +1,8 @@
 package com.grkj.shared.utils.i18n
 
+import android.content.Context
+import android.content.res.Configuration
+import android.content.res.Resources
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
@@ -7,6 +10,7 @@ import kotlinx.coroutines.asCoroutineDispatcher
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.launch
+import java.lang.ref.WeakReference
 import java.util.Locale
 import java.util.concurrent.Executors
 import java.util.concurrent.atomic.AtomicReference
@@ -14,14 +18,10 @@ import java.util.concurrent.atomic.AtomicReference
 /**
  * I18nManager
  *
- * - 负责:当前 Locale、词条查询、热切换、数据源聚合与(重)加载。
- * - 性能:所有加载/切换在单线程执行器(串行)中完成;查词为 O(1) 内存 Map。
- * - 线程安全:词典使用 AtomicReference 原子替换,无需加锁读。
- *
- * 使用:
- *  1) Application.onCreate() 调用 [init],提供默认 Locale 与初始数据源。
- *  2) UI 查询用 [t];切换语言调用 [setLocale]。
- *  3) 导入后调用 [reload] 或 [addSource],自动刷新观察者(DataBinding 已接上)。
+ * - 外观保持不变:locale、t(...)、init(...)、setLocale(...) 等 API 不动。
+ * - 实现调整:t(...) 优先从 Android Resources (strings.xml / plurals) 取值;
+ *            取不到再回落到旧的 JSON 词典(兼容渐进迁移)。
+ * - 切换语言:仍然通过 setLocale(...),并向外发出 dictTick 通知,UI(DataBinding)会自动刷新。
  */
 object I18nManager {
 
@@ -33,13 +33,13 @@ object I18nManager {
     private val _dictTick = kotlinx.coroutines.flow.MutableSharedFlow<Long>(replay = 1, extraBufferCapacity = 1)
     val dictTick: kotlinx.coroutines.flow.SharedFlow<Long> = _dictTick
 
-    /** 词典缓存(key -> I18nEntry),原子替换,读路径零锁 */
+    /** 词典缓存(key -> I18nEntry),原子替换,读路径零锁(作为 Resources 的兜底) */
     private val dictRef = AtomicReference<Map<String, I18nEntry>>(emptyMap())
 
     /** 已注册的数据源(后注册者覆盖先注册者) */
     val sources = mutableListOf<I18nSource>()
 
-    /** 串行后台执行器:避免并发构建词典产生抖动 */
+    /** 串行后台执行器 */
     private val singleExecutor = Executors.newSingleThreadExecutor { r ->
         Thread(r, "i18n-single").apply { isDaemon = true }
     }
@@ -47,13 +47,22 @@ object I18nManager {
     private val main = CoroutineScope(Dispatchers.Main.immediate)
     private var currentReloadJob: Job? = null
 
+    // ===== 新增:应用上下文(可选),用于构造指定 Locale 的 Resources =====
+    private var appCtxRef: WeakReference<Context>? = null
+
+    /** 可选:手动注入 Application/Context,提升可靠性(不调用也能工作,见反射兜底)。 */
+    @JvmStatic
+    fun attach(appContext: Context) {
+        appCtxRef = WeakReference(appContext.applicationContext)
+    }
+
+    // ====== 保持原 API:init(...) ======
     /**
      * 初始化框架(建议在 Application.onCreate 调用)
      *
      * @param defaultLocale 启动默认语言
-     * @param initialSources 初始数据源(如内置 assets、可写 files)
+     * @param initialSources 初始数据源(如内置 assets、可写 files、或 XmlResourcesI18nSource
      * @param eagerLoad 是否阻塞主线程同步加载首个词典(默认 true)
-     *        若你追求极致冷启动,可设为 false:主线程只设定 locale,后台构建;UI 首帧用 key 或 fallback,随后自动刷新。
      */
     @JvmStatic
     fun init(
@@ -66,19 +75,16 @@ object I18nManager {
         sources.addAll(initialSources)
 
         if (eagerLoad) {
-            // 同步加载,保证首帧即有文案
+            // 同步加载(仅用于 JSON 兜底);XML 路径无需预加载
             dictRef.set(I18nRepository.build(sources, defaultLocale))
         } else {
-            // 后台加载,首帧可降级,完成后触发一次刷新
             dictRef.set(emptyMap())
             reload()
         }
     }
 
     /**
-     * 注册新增数据源(例如:导入后将 FileCsvSource 放在最后覆盖)
-     * @param source 数据源
-     * @param refresh 是否立即重建词典(默认 true)
+     * 新增/替换数据源(后者覆盖先者);XML 场景通常不必调用。
      */
     @JvmStatic
     fun addSource(source: I18nSource, refresh: Boolean = true) {
@@ -87,9 +93,8 @@ object I18nManager {
     }
 
     /**
-     * 重新按当前 locale 构建词典。
-     * - 去重策略:后注册数据源覆盖先注册数据源的同名 key。
-     * - 原子替换:构建完成后一次性替换 dictRef,并在主线程发出 locale 的“自刷新”通知。
+     * 重新按当前 locale 构建 JSON 词典(仅作兜底)。
+     * - 原子替换 dictRef,并在主线程发出“词典更新”通知。
      */
     @JvmStatic
     fun reload() {
@@ -98,32 +103,22 @@ object I18nManager {
         currentReloadJob = bg.launch {
             val built = I18nRepository.build(sources, targetLocale)
             dictRef.set(built)
-            // 通知 UI:词典已更新(即使 locale 值没变)
             val v = dictVersion.incrementAndGet()
             main.launch { _dictTick.tryEmit(v) }
         }
     }
 
     /**
-     * 设置新的 Locale 并重建词典。
-     * - 切换速度:只重建一次 Map;UI 无需重启 Activity。
+     * 设置新的 Locale 并重建词典(JSON 兜底);同时触发 UI 刷新。
      */
     @JvmStatic
     fun setLocale(locale: Locale) {
         if (locale == _locale.value) return
-        _locale.value = locale // 先更新流,便于 UI 立刻拿到新 Locale(文本随后到)
+        _locale.value = locale
         reload()
     }
 
-    /**
-     * 翻译主入口:根据 key 返回文本。
-     *
-     * @param key 键名(建议命名空间:模块.页面.含义)
-     * @param args 命名占位({name}、{count}),自动转下标填充
-     * @param count 可选复数选择辅助(如 items.count)
-     * @param selectKey 可选选择分支(如 gender:male/female/other)
-     * @param fallback 兜底文本(缺 key 时使用;默认返回 key)
-     */
+    // ====== 对外主接口:翻译 ======
     @JvmStatic
     fun t(
         key: String,
@@ -132,35 +127,105 @@ object I18nManager {
         selectKey: String? = null,
         fallback: String? = null
     ): String {
-        val entry = dictRef.get()[key] ?: return fallback ?: key
-        return when (entry.type) {
-            I18nType.TEXT -> I18nFormatter.format(
-                entry.value ?: fallback ?: key,
-                args,
-                _locale.value
-            )
-
-            I18nType.PLURAL -> {
-                val n = count ?: 0
-                val form = PluralRules.pick(_locale.value, n)
-                val pattern = entry.plurals[form] ?: entry.plurals["other"]
-                ?: entry.value ?: fallback ?: key
-                I18nFormatter.format(
-                    pattern,
-                    (args ?: emptyMap()) + mapOf("count" to n),
-                    _locale.value
-                )
+        // 1) 先从 Resources(strings.xml / plurals)尝试
+        resolveFromResources(
+            key = key,
+            args = args,
+            count = count,
+            selectKey = selectKey
+        )?.let { return it }
+
+        // 2) 回落到 JSON 词典(与旧逻辑一致)
+        val entry = dictRef.get()[key]
+        if (entry != null) {
+            return when (entry.type) {
+                I18nType.TEXT -> I18nFormatter.format(entry.value ?: (fallback ?: key), args, _locale.value)
+                I18nType.PLURAL -> {
+                    val n = count ?: 0
+                    val form = PluralRules.pick(_locale.value, n)
+                    val pattern = entry.plurals[form] ?: entry.plurals["other"]
+                    ?: entry.value ?: fallback ?: key
+                    I18nFormatter.format(pattern, (args ?: emptyMap()) + mapOf("count" to n), _locale.value)
+                }
+                I18nType.SELECT -> {
+                    val sel = (selectKey ?: "other").lowercase()
+                    val pattern = entry.selects[sel] ?: entry.selects["other"]
+                    ?: entry.value ?: fallback ?: key
+                    I18nFormatter.format(pattern, args, _locale.value)
+                }
+            }
+        }
+
+        // 3) 最终兜底
+        return fallback ?: key
+    }
+
+    // ====== Resources 解析(XML 优先) ======
+
+    private fun resolveFromResources(
+        key: String,
+        args: Map<String, Any?>?,
+        count: Number?,
+        selectKey: String?
+    ): String? {
+        val res = resourcesFor(_locale.value) ?: return null
+        val pkg = resAppPackageName() ?: return null
+
+        // A) 复数:优先走 <plurals>
+        if (count != null) {
+            val pluralId = res.getIdentifier(key, "plurals", pkg)
+            if (pluralId != 0) {
+                val n = count.toInt()
+                val raw = runCatching { res.getQuantityString(pluralId, n) }.getOrNull() ?: return null
+                // 兼容 {count}/{name} 风格占位
+                return I18nFormatter.format(raw, (args ?: emptyMap()) + mapOf("count" to count), _locale.value)
             }
+        }
 
-            I18nType.SELECT -> {
-                val sel = (selectKey ?: "other").lowercase()
-                val pattern = entry.selects[sel] ?: entry.selects["other"]
-                ?: entry.value ?: fallback ?: key
-                I18nFormatter.format(pattern, args, _locale.value)
+        // B) select(XML 无原生):约定 key__male / key__female / key__other
+        val sel = selectKey?.lowercase()
+        if (!sel.isNullOrBlank()) {
+            val tried = arrayOf("${key}__${sel}", "${key}__other")
+            for (k in tried) {
+                val id = res.getIdentifier(k, "string", pkg)
+                if (id != 0) {
+                    val raw = runCatching { res.getString(id) }.getOrNull() ?: continue
+                    return I18nFormatter.format(raw, args, _locale.value)
+                }
             }
         }
+
+        // C) 普通 <string>
+        val stringId = res.getIdentifier(key, "string", pkg)
+        if (stringId != 0) {
+            val raw = runCatching { res.getString(stringId) }.getOrNull() ?: return null
+            return I18nFormatter.format(raw, args, _locale.value)
+        }
+
+        // 找不到
+        return null
     }
 
-    @JvmStatic
-    fun availableLocales(): Set<Locale> = LanguageRegistry.availableLocales()
-}
+    // 构造指定 Locale 的 Resources
+    private fun resourcesFor(locale: Locale): Resources? {
+        val ctx = appCtxRef?.get() ?: reflectAppContext() ?: return null
+        val base = ctx.resources
+        val cfg = Configuration(base.configuration)
+        cfg.setLocale(locale)
+        return ctx.createConfigurationContext(cfg).resources
+    }
+
+    // 取包名
+    private fun resAppPackageName(): String? {
+        val ctx = appCtxRef?.get() ?: reflectAppContext()
+        return ctx?.packageName
+    }
+
+    // 兜底:反射拿 Application Context,避免必须改动外层初始化代码
+    private fun reflectAppContext(): Context? = runCatching {
+        val app = Class.forName("android.app.AppGlobals")
+            .getMethod("getInitialApplication")
+            .invoke(null) as? android.app.Application
+        app?.applicationContext
+    }.getOrNull()
+}

+ 11 - 10
shared/src/main/java/com/grkj/shared/utils/i18n/I18nRepository.kt

@@ -16,16 +16,17 @@ object I18nRepository {
      * @param locale 目标 Locale
      */
     fun build(sources: List<I18nSource>, locale: Locale): Map<String, I18nEntry> {
-        if (sources.isEmpty()) return emptyMap()
-        val result = LinkedHashMap<String, I18nEntry>(4096) // 预估容量,减少扩容
-        for (src in sources) {
-            val block = src.load(locale) // IO/解析由 Source 自担
-            if (block.isNotEmpty()) {
-                // 后覆盖先
-                for ((k, v) in block) result[k] = v
-            }
-        }
-        return result
+//        if (sources.isEmpty()) return emptyMap()
+//        val result = LinkedHashMap<String, I18nEntry>(4096) // 预估容量,减少扩容
+//        for (src in sources) {
+//            val block = src.load(locale) // IO/解析由 Source 自担
+//            if (block.isNotEmpty()) {
+//                // 后覆盖先
+//                for ((k, v) in block) result[k] = v
+//            }
+//        }
+//        return result
+        return emptyMap()
     }
 }
 

+ 0 - 85
shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonImporter.kt

@@ -1,85 +0,0 @@
-package com.grkj.shared.utils.i18n.importer
-
-import android.content.Context
-import com.grkj.shared.utils.i18n.I18nManager
-import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.source.FileI18nSource
-import java.io.File
-import java.io.InputStream
-import java.util.Locale
-import java.util.zip.ZipInputStream
-
-/**
- * JSON/ZIP 导入器(只认 .json)
- * 目标目录:context.filesDir/<dirName>
- */
-class JsonImporter(
-    private val context: Context,
-    private val dirName: String = "i18n"
-) {
-
-    enum class MergeStrategy { REPLACE, UPSERT, KEEP_EXISTING }
-
-    private fun dir(): File = File(context.filesDir, dirName).apply { mkdirs() }
-
-    /** 导入单个 locale JSON:文件名固定 <locale>.json */
-    fun importJson(locale: Locale, input: InputStream, strategy: MergeStrategy): File {
-        val out = File(dir(), "${locale.toLanguageTag()}.json")
-        val tmp = File(out.parentFile, out.name + ".tmp")
-        tmp.outputStream().use { input.copyTo(it) }
-        applyMerge(out, tmp, strategy)
-        tmp.delete()
-        refreshSource()
-        return out
-    }
-
-    /** 导入合表 all.json(也可 ZIP 里带) */
-    fun importMerged(input: InputStream, fileName: String = "all.json", strategy: MergeStrategy): File {
-        val out = File(dir(), fileName)
-        val tmp = File(out.parentFile, out.name + ".tmp")
-        tmp.outputStream().use { input.copyTo(it) }
-        applyMerge(out, tmp, strategy)
-        tmp.delete()
-        refreshSource()
-        return out
-    }
-
-    /** 导入 ZIP:只处理 .json(<locale>.json / all.json) */
-    fun importZip(zip: InputStream, strategy: MergeStrategy): List<File> {
-        val outputs = mutableListOf<File>()
-        ZipInputStream(zip).use { zis ->
-            var e = zis.nextEntry
-            while (e != null) {
-                if (!e.isDirectory && e.name.endsWith(".json", true)) {
-                    val name = e.name.substringAfterLast('/')
-                    val out = File(dir(), name)
-                    val tmp = File(out.parentFile, "$name.tmp")
-                    tmp.outputStream().use { zis.copyTo(it) }
-                    applyMerge(out, tmp, strategy)
-                    tmp.delete()
-                    outputs.add(out)
-                }
-                e = zis.nextEntry
-            }
-        }
-        refreshSource()
-        return outputs
-    }
-
-    private fun refreshSource() {
-        I18nManager.addSource(fileSource(), refresh = true)
-    }
-
-    private fun fileSource(): I18nSource =
-        FileI18nSource(context, dirName = dirName, mergedFileName = "all.json")
-
-    private fun applyMerge(target: File, incoming: File, strategy: MergeStrategy) {
-        if (!target.exists() || strategy == MergeStrategy.REPLACE) {
-            incoming.copyTo(target, overwrite = true); return
-        }
-        val oldText = target.readText()
-        val newText = incoming.readText()
-        val merged = JsonMerger.merge(oldText, newText, strategy)
-        target.writeText(merged)
-    }
-}

+ 0 - 39
shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonMerger.kt

@@ -1,39 +0,0 @@
-package com.grkj.shared.utils.i18n.importer
-
-import org.json.JSONObject
-
-/**
- * JSON 合并器(单语 Map:{ key: EntryLike } 或 合表:{ "xx-XX": { ... } })
- * - 对于 all.json,请在 importer 层决定:直接 REPLACE or 细粒度合并。
- *   此处默认同样以 “按 key 合并” 的策略处理顶层对象(需要时可扩展)。
- */
-object JsonMerger {
-
-    fun merge(oldJson: String, newJson: String, strategy: JsonImporter.MergeStrategy): String {
-        if (oldJson.isBlank()) return normalize(newJson)
-        if (newJson.isBlank()) return normalize(oldJson)
-
-        if (strategy == JsonImporter.MergeStrategy.REPLACE) {
-            return normalize(newJson)
-        }
-
-        val oldObj = JSONObject(oldJson)
-        val newObj = JSONObject(newJson)
-
-        // 顶层合并(既适用于单语 map,也适用于合表 all.json 的顶层 locale map)
-        val result = JSONObject(oldObj.toString()) // clone
-        val it = newObj.keys()
-        while (it.hasNext()) {
-            val k = it.next()
-            when (strategy) {
-                JsonImporter.MergeStrategy.UPSERT -> result.put(k, newObj.get(k))
-                JsonImporter.MergeStrategy.KEEP_EXISTING -> if (!result.has(k)) result.put(k, newObj.get(k))
-                else -> {} // REPLACE 已在上面提前返回
-            }
-        }
-        return result.toString(2)
-    }
-
-    private fun normalize(json: String): String =
-        if (json.isBlank()) "{}" else JSONObject(json).toString(2)
-}

+ 0 - 158
shared/src/main/java/com/grkj/shared/utils/i18n/source/AssetsI18nSource.kt

@@ -1,158 +0,0 @@
-package com.grkj.shared.utils.i18n.source
-
-import android.content.Context
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.util.JsonUtils
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.io.BufferedReader
-import java.io.InputStreamReader
-import java.nio.charset.StandardCharsets
-import java.util.Locale
-
-/**
- * 只读 JSON 的 assets 词库:
- * - 单语:assets/<dir>/<locale>.json   (如 i18n/zh-CN.json)
- * - 合表:assets/<dir>/all.json        ({ "zh-CN": { ... }, "en-US": { ... } })
- * 若两者都存在,优先单语文件(查找更快)。
- */
-class AssetsI18nSource(
-    private val context: Context,
-    private val dir: String = "i18n",
-    private val mergedFileName: String = "all.json"
-) : I18nSource {
-
-    private val logger: Logger = LoggerFactory.getLogger(this::class.java)
-
-    private val cachedLocales: Set<Locale> by lazy { scanAvailableLocales() }
-
-    override fun load(locale: Locale): Map<String, I18nEntry> {
-        // 1) 单语优先:按照候选名匹配 locale.json
-        for (name in candidateNames(locale)) {
-            val path = "$dir/${name.replace(".csv", ".json")}"
-            if (!exists(path)) continue
-            open(path).use { input ->
-                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
-                    return JsonUtils.parseSingleLang(it)
-                }
-            }
-        }
-        // 2) 合表 all.json
-        val mergedPath = "$dir/$mergedFileName"
-        if (exists(mergedPath)) {
-            open(mergedPath).use { input ->
-                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
-                    return JsonUtils.parseMerged(it, locale)
-                }
-            }
-        }
-        return emptyMap()
-    }
-
-    override fun availableLocales(): Set<Locale> = cachedLocales
-
-    override fun hasLocale(locale: Locale): Boolean {
-        val tag = locale.toLanguageTag()
-        return cachedLocales.any { it.toLanguageTag().equals(tag, true) }
-    }
-
-    private fun exists(path: String): Boolean {
-        return runCatching { context.assets.open(path).close(); true }.getOrElse { false }
-    }
-
-    private fun open(path: String) = context.assets.open(path)
-
-    private fun scanAvailableLocales(): Set<Locale> {
-        // assets 目录:列出全部 json
-        val files = runCatching { context.assets.list(dir)?.toList().orEmpty() }.getOrDefault(emptyList())
-        val singleLocales = files.asSequence()
-            .filter { it.endsWith(".json", true) && !it.equals(mergedFileName, true) }
-            .map { it.substringBeforeLast('.') }
-            .mapNotNull { nameToLocaleOrNull(it) }
-            .toSet()
-
-        // 合表额外嗅探
-        val mergedPath = "$dir/$mergedFileName"
-        val mergedLocales = if (exists(mergedPath)) {
-            open(mergedPath).use { input ->
-                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use { br ->
-                    // 直接让 JsonUtils 选出 map,再取 key 集不太划算,这里简单读取文本做 key 枚举
-                    // 但为省事:直接 parseMerged 用一个虚拟 locale,然后从 chosen 分支推断会丢信息
-                    // 所以这里不走 parseMerged,简单粗暴交给 org.json
-                    try {
-                        val text = br.readText()
-                        val obj = org.json.JSONObject(text)
-                        obj.keys().asSequence().mapNotNull { nameToLocaleOrNull(it) }.toSet()
-                    } catch (_: Throwable) {
-                        emptySet()
-                    }
-                }
-            }
-        } else emptySet()
-
-        val all = (singleLocales + mergedLocales).toSet()
-        logger.info("AssetsI18nSource locales: ${all.joinToString { it.toLanguageTag() }}")
-        return all
-    }
-
-    // ---- 与 CSV 版本一致的候选名生成(只是扩展名换 json) ----
-
-    private fun candidateNames(locale: Locale): List<String> {
-        val (lang, script, region) = parseLangScriptRegion(locale)
-        val list = mutableListOf<String>()
-        if (lang.isEmpty()) return list
-
-        fun addName(l: String, s: String?, r: String?, sep: Char) {
-            val sb = StringBuilder(l)
-            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
-            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
-            sb.append(".json")
-            list += sb.toString()
-        }
-
-        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
-            addName(lang, script, region, '-'); addName(lang, script, region, '_')
-            addName(lang, script.lowercase(), region.lowercase(), '-')
-            addName(lang, script.lowercase(), region.lowercase(), '_')
-        }
-        if (!region.isNullOrEmpty()) {
-            addName(lang, null, region, '-'); addName(lang, null, region, '_')
-            addName(lang, null, region.lowercase(), '-'); addName(lang, null, region.lowercase(), '_')
-        }
-        if (!script.isNullOrEmpty()) {
-            addName(lang, script, null, '-'); addName(lang, script, null, '_')
-            addName(lang, script.lowercase(), null, '-'); addName(lang, script.lowercase(), null, '_')
-        }
-        list += "$lang.json"
-        return list.distinct()
-    }
-
-    private fun nameToLocaleOrNull(name: String): Locale? {
-        val norm = name.replace('_', '-')
-        val tag = when {
-            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
-            else -> return null
-        }
-        return try { Locale.forLanguageTag(tag) } catch (_: Throwable) { null }
-    }
-
-    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
-        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        var script = locale.script?.let {
-            if (it.isNotBlank()) it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) else null
-        }
-        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
-        if (script.isNullOrEmpty() || region == null) {
-            val parts = locale.toLanguageTag().replace('_','-').split('-').filter { it.isNotBlank() }
-            if (parts.isNotEmpty()) {
-                lang = parts.first().lowercase(Locale.ROOT)
-                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-                val rg = parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
-                if (script.isNullOrEmpty() && sc != null) script = sc.substring(0,1).uppercase(Locale.ROOT) + sc.substring(1).lowercase(Locale.ROOT)
-                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
-            }
-        }
-        return Triple(lang, script, region)
-    }
-}

+ 0 - 148
shared/src/main/java/com/grkj/shared/utils/i18n/source/FileI18nSource.kt

@@ -1,148 +0,0 @@
-package com.grkj.shared.utils.i18n.source
-
-import android.content.Context
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.util.JsonUtils
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.io.BufferedReader
-import java.io.File
-import java.io.FileInputStream
-import java.io.InputStreamReader
-import java.nio.charset.StandardCharsets
-import java.util.Locale
-
-/**
- * 只读 JSON 的 files 词库:
- * - 单语:files/<dir>/<locale>.json
- * - 合表:files/<dir>/all.json
- * 若两者都存在,优先单语。
- */
-class FileI18nSource(
-    private val context: Context,
-    private val dirName: String = "i18n",
-    private val mergedFileName: String = "all.json"
-) : I18nSource {
-
-    private val logger: Logger = LoggerFactory.getLogger(this::class.java)
-
-    @Volatile private var lastScanMillis: Long = 0L
-    @Volatile private var lastLocales: Set<Locale> = emptySet()
-    private val SCAN_INTERVAL_MS = 1500L
-
-    private fun dir(): File = File(context.filesDir, dirName).apply { mkdirs() }
-
-    override fun load(locale: Locale): Map<String, I18nEntry> {
-        val root = dir()
-        // 单语优先
-        for (name in candidateNames(locale)) {
-            val f = File(root, name.replace(".csv", ".json"))
-            if (!f.exists()) continue
-            FileInputStream(f).use { fis ->
-                BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
-                    return JsonUtils.parseSingleLang(it)
-                }
-            }
-        }
-        // 合表
-        val merged = File(root, mergedFileName)
-        if (merged.exists()) {
-            FileInputStream(merged).use { fis ->
-                BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
-                    return JsonUtils.parseMerged(it, locale)
-                }
-            }
-        }
-        return emptyMap()
-    }
-
-    override fun availableLocales(): Set<Locale> {
-        val now = System.currentTimeMillis()
-        if (now - lastScanMillis <= SCAN_INTERVAL_MS) return lastLocales
-        val root = dir()
-        val single = root.listFiles().orEmpty()
-            .filter { it.isFile && it.name.endsWith(".json", true) && !it.name.equals(mergedFileName, true) }
-            .map { it.nameWithoutExtension }
-            .mapNotNull { nameToLocaleOrNull(it) }
-            .toSet()
-        val merged = File(root, mergedFileName)
-        val mergedLocales = if (merged.exists()) {
-            runCatching {
-                FileInputStream(merged).use { fis ->
-                    BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use { br ->
-                        val obj = org.json.JSONObject(br.readText())
-                        obj.keys().asSequence().mapNotNull { nameToLocaleOrNull(it) }.toSet()
-                    }
-                }
-            }.getOrElse { emptySet() }
-        } else emptySet()
-        val all = (single + mergedLocales).toSet()
-        lastLocales = all
-        lastScanMillis = now
-        logger.info("FileI18nSource locales: ${all.joinToString { it.toLanguageTag() }}")
-        return all
-    }
-
-    override fun hasLocale(locale: Locale): Boolean {
-        val tag = locale.toLanguageTag()
-        return availableLocales().any { it.toLanguageTag().equals(tag, true) }
-    }
-
-    // 复用与 Assets 版一致的工具
-    private fun candidateNames(locale: Locale): List<String> {
-        val (lang, script, region) = parseLangScriptRegion(locale)
-        val list = mutableListOf<String>()
-        if (lang.isEmpty()) return list
-        fun addName(l: String, s: String?, r: String?, sep: Char) {
-            val sb = StringBuilder(l)
-            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
-            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
-            sb.append(".json")
-            list += sb.toString()
-        }
-        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
-            addName(lang, script, region, '-'); addName(lang, script, region, '_')
-            addName(lang, script.lowercase(), region.lowercase(), '-')
-            addName(lang, script.lowercase(), region.lowercase(), '_')
-        }
-        if (!region.isNullOrEmpty()) {
-            addName(lang, null, region, '-'); addName(lang, null, region, '_')
-            addName(lang, null, region.lowercase(), '-'); addName(lang, null, region.lowercase(), '_')
-        }
-        if (!script.isNullOrEmpty()) {
-            addName(lang, script, null, '-'); addName(lang, script, null, '_')
-            addName(lang, script.lowercase(), null, '-'); addName(lang, script.lowercase(), null, '_')
-        }
-        list += "$lang.json"
-        return list.distinct()
-    }
-
-    private fun nameToLocaleOrNull(name: String): Locale? {
-        val norm = name.replace('_', '-')
-        val tag = when {
-            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
-            else -> return null
-        }
-        return try { Locale.forLanguageTag(tag) } catch (_: Throwable) { null }
-    }
-
-    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
-        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        var script = locale.script?.let {
-            if (it.isNotBlank()) it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) else null
-        }
-        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
-        if (script.isNullOrEmpty() || region == null) {
-            val parts = locale.toLanguageTag().replace('_','-').split('-').filter { it.isNotBlank() }
-            if (parts.isNotEmpty()) {
-                lang = parts.first().lowercase(Locale.ROOT)
-                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-                val rg = parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
-                if (script.isNullOrEmpty() && sc != null) script = sc.substring(0,1).uppercase(Locale.ROOT) + sc.substring(1).lowercase(Locale.ROOT)
-                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
-            }
-        }
-        return Triple(lang, script, region)
-    }
-}

+ 25 - 0
shared/src/main/java/com/grkj/shared/utils/i18n/source/XmlResourcesI18nSource.kt

@@ -0,0 +1,25 @@
+package com.grkj.shared.utils.i18n.source
+
+import com.grkj.shared.utils.i18n.I18nEntry
+import com.grkj.shared.utils.i18n.I18nSource
+import java.util.Locale
+
+/**
+ * XmlResourcesI18nSource
+ *
+ * 用途:仅用于向 LanguageRegistry 暴露“可用语言列表”,不实际读取 XML 内容。
+ * 好处:不需要改 LanguageRegistry 的实现;init(...) 时把它放进 sources 即可。
+ */
+class XmlResourcesI18nSource(
+    private val supported: Set<String> = setOf(
+        "zh-CN",
+        "en-US"
+    )
+) : I18nSource {
+
+    override fun availableLocales(): Set<Locale> =
+        supported.map { Locale.forLanguageTag(it) }.toSet()
+
+    // 不实际加载;让 I18nManager.t() 直接从 Resources 读取。这里返回空 Map 即可。
+    override fun load(locale: Locale): Map<String, I18nEntry> = emptyMap()
+}

+ 0 - 210
shared/src/main/java/com/grkj/shared/utils/i18n/util/JsonUtils.kt

@@ -1,210 +0,0 @@
-package com.grkj.shared.utils.i18n.util
-
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nType
-import org.json.JSONObject
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.io.BufferedReader
-import java.util.Locale
-
-/**
- * 轻量 JSON 解析(取代 CsvUtils)
- * - 单语:文件内容为 { key: I18nEntryLike }
- * - 合表:文件内容为 { "<bcp47>": { key: I18nEntryLike }, ... },自动挑选最优 locale(lang/script/region)
- *
- * I18nEntryLike 形态:
- *   TEXT  : {"type":"text","value":"..."}
- *   PLURAL: {"type":"plural","plurals":{"one":"...","other":"..."}}   // 注意 key 区分大小写
- *   SELECT: {"type":"select","selects":{"male":"...","female":"...","other":"..."}} // key 建议小写
- */
-object JsonUtils {
-    private val logger: Logger = LoggerFactory.getLogger(JsonUtils::class.java)
-
-    // --------- 公共入口 ---------
-
-    /** 单语 JSON:{ key: I18nEntryLike } */
-    fun parseSingleLang(br: BufferedReader): Map<String, I18nEntry> {
-        val text = br.readTextNoBom()
-        if (text.isBlank()) return emptyMap()
-        val obj = JSONObject(text)
-        val out = LinkedHashMap<String, I18nEntry>(obj.length())
-
-        val names = obj.keys()
-        while (names.hasNext()) {
-            val key = names.next().trim()
-            if (key.isEmpty()) continue
-
-            val v = obj.opt(key)
-            val entry = when (v) {
-                is JSONObject -> jsonToEntry(key, v)
-                is String -> I18nEntry(key, I18nType.TEXT, value = v) // 兼容极简:value 直接是字符串
-                else -> null
-            }
-            if (entry != null) out[key] = entry
-        }
-        logger.info("Single JSON loaded: ${out.size} keys")
-        return out
-    }
-
-    /**
-     * 合表 JSON:{ "<bcp47>": { key: I18nEntryLike }, ... }
-     * 优先匹配 locale;若找不到匹配项,返回空 map。
-     */
-    fun parseMerged(br: BufferedReader, locale: Locale): Map<String, I18nEntry> {
-        val text = br.readTextNoBom()
-        if (text.isBlank()) return emptyMap()
-        val root = JSONObject(text)
-
-        if (root.length() == 0) return emptyMap()
-
-        // 1) 枚举所有顶层语言标签
-        val candidates = mutableListOf<String>()
-        val keys = root.keys()
-        while (keys.hasNext()) {
-            val tag = keys.next()
-            if (tag.isNullOrBlank()) continue
-            candidates += tag
-        }
-        if (candidates.isEmpty()) {
-            logger.warn("Merged JSON has no locale objects at top level")
-            return emptyMap()
-        }
-
-        // 2) 选择最佳 locale
-        val chosen = pickBestLocale(candidates, locale)
-        if (chosen == null) {
-            logger.warn("No compatible locale for ${locale.toLanguageTag()} in ${candidates.joinToString()}")
-            return emptyMap()
-        }
-
-        // 3) 解析该 locale 下的词条
-        val payload = root.optJSONObject(chosen) ?: return emptyMap()
-        val out = LinkedHashMap<String, I18nEntry>(payload.length())
-
-        val names = payload.keys()
-        while (names.hasNext()) {
-            val key = names.next().trim()
-            if (key.isEmpty()) continue
-            val v = payload.opt(key)
-            val entry = when (v) {
-                is JSONObject -> jsonToEntry(key, v)
-                is String -> I18nEntry(key, I18nType.TEXT, value = v)
-                else -> null
-            }
-            if (entry != null) out[key] = entry
-        }
-        logger.info("Merged JSON loaded: ${out.size} keys (locale=${locale.toLanguageTag()}, chosen=$chosen)")
-        return out
-    }
-
-    // --------- 私有工具 ---------
-
-    private fun BufferedReader.readTextNoBom(): String {
-        val sb = StringBuilder(16 * 1024)
-        var first = true
-        while (true) {
-            val line = this.readLine() ?: break
-            if (first) {
-                first = false
-                val s = line.removeBom()
-                sb.append(s)
-            } else {
-                sb.append('\n').append(line)
-            }
-        }
-        return sb.toString()
-    }
-
-    private fun String.removeBom(): String =
-        if (startsWith("\uFEFF")) substring(1) else this
-
-    private fun jsonToEntry(key: String, obj: JSONObject): I18nEntry? {
-        val type = obj.optString("type", "text").lowercase(Locale.ROOT)
-        return when (type) {
-            "text" -> {
-                val v = obj.optString("value", null)
-                I18nEntry(key, I18nType.TEXT, value = v)
-            }
-            "plural" -> {
-                val plurals = obj.optJSONObject("plurals")?.toMap() ?: emptyMap()
-                I18nEntry(key, I18nType.PLURAL, plurals = plurals)
-            }
-            "select" -> {
-                val selects = obj.optJSONObject("selects")?.toMap(lowerKey = true) ?: emptyMap()
-                I18nEntry(key, I18nType.SELECT, selects = selects)
-            }
-            else -> {
-                // 容错:如果没有 type,且有 value/plurals/selects 也能吃下
-                when {
-                    obj.has("value") -> I18nEntry(key, I18nType.TEXT, value = obj.optString("value"))
-                    obj.has("plurals") -> I18nEntry(key, I18nType.PLURAL, plurals = obj.optJSONObject("plurals")?.toMap() ?: emptyMap())
-                    obj.has("selects") -> I18nEntry(key, I18nType.SELECT, selects = obj.optJSONObject("selects")?.toMap(lowerKey = true) ?: emptyMap())
-                    else -> null
-                }
-            }
-        }
-    }
-
-    private fun JSONObject.toMap(lowerKey: Boolean = false): Map<String, String> {
-        val out = LinkedHashMap<String, String>(this.length())
-        val it = this.keys()
-        while (it.hasNext()) {
-            val kRaw = it.next()
-            val k = if (lowerKey) kRaw.lowercase(Locale.ROOT) else kRaw
-            out[k] = this.optString(kRaw, "")
-        }
-        return out
-    }
-
-    // ---- BCP-47 匹配 ----
-
-    private data class LR(val lang: String, val script: String?, val region: String?)
-
-    /** 解析 "zh-Hans-CN" / "en-US" / "zh_CN" → (lang, Script, REGION) */
-    private fun parseLR(tag: String): LR {
-        val p = tag.replace('_', '-').split('-').filter { it.isNotBlank() }
-        if (p.isEmpty()) return LR("", null, null)
-        val lang = p.first().lowercase(Locale.ROOT)
-        val script = p.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-            ?.let { it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
-        val region = p.firstOrNull {
-            (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() })
-        }?.uppercase(Locale.ROOT)
-        return LR(lang, script, region)
-    }
-
-    private fun localeLR(locale: Locale): LR {
-        val lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        val script = locale.script?.takeIf { it.isNotBlank() }
-            ?.let { it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
-        val region = locale.country?.takeIf { it.isNotBlank() }?.uppercase(Locale.ROOT)
-        val lr = LR(lang, script, region)
-        return if (lr.lang.isEmpty() || (lr.script == null && lr.region == null)) parseLR(locale.toLanguageTag()) else lr
-    }
-
-    /** 评分:lang 必须一致;命中 region +4,命中 script +2,只有 lang +1;满分 7(lang+script+region) */
-    private fun score(want: LR, got: LR): Int {
-        if (want.lang != got.lang) return -1
-        var s = 1
-        if (want.region != null && want.region == got.region) s += 4
-        if (want.script != null && want.script.equals(got.script, ignoreCase = true)) s += 2
-        return s
-    }
-
-    private fun pickBestLocale(headers: List<String>, locale: Locale): String? {
-        val want = localeLR(locale)
-        var best: String? = null
-        var bestScore = -1
-        headers.forEach { raw ->
-            val lr = parseLR(raw)
-            val sc = score(want, lr)
-            if (sc > bestScore) {
-                bestScore = sc
-                best = raw
-                if (sc >= 7) return raw // 满分提前返回
-            }
-        }
-        return best
-    }
-}

+ 14 - 3
ui-base/src/main/java/com/grkj/ui_base/utils/CommonUtils.kt

@@ -1,12 +1,9 @@
 package com.grkj.ui_base.utils
 
-import android.content.Context
-import android.content.res.Resources
 import android.util.TypedValue
 import android.view.ContextThemeWrapper
 import androidx.annotation.AttrRes
 import androidx.annotation.ColorInt
-import androidx.core.content.ContextCompat
 import androidx.core.content.res.ResourcesCompat
 import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.ui_base.R
@@ -26,6 +23,13 @@ object CommonUtils {
         return I18nManager.t(textKey)
     }
 
+    /**
+     * 获取资源文本
+     */
+    fun getStr(resId: Int): String {
+        return SIKCore.getApplication().getString(resId)
+    }
+
     /**
      * 获取资源文本
      */
@@ -34,6 +38,13 @@ object CommonUtils {
         return I18nManager.t(textKey, argMap)
     }
 
+    /**
+     * 获取资源文本
+     */
+    fun getStr(resId: Int, vararg args: Any?): String {
+        return SIKCore.getApplication().getString(resId, *args)
+    }
+
     // 兜底主题,可随时替换成你当前皮肤的主题 ID
     var defaultThemeResId: Int = R.style.Theme_ISCS_BASE_APP
 

+ 7 - 5
ui-base/src/main/res/values-en/strings.xml

@@ -166,7 +166,7 @@
     <string name="data_decrypt_failed">Data Decryption Failed</string>
     <string name="data_exception">Data exception</string>
     <string name="data_export">Data Export</string>
-    <string name="data_export">Please select the table you want to export and click Export.</string>
+    <string name="data_export_tip">Please select the table you want to export and click Export.</string>
     <string name="data_export_error">Data Export failed.</string>
     <string name="data_export_success_tip">Data Export completed. Please select a folder and click the bottom right button to save.</string>
     <string name="data_file_is_corrupted">Data File Corrupted</string>
@@ -228,7 +228,7 @@
     <string name="exception_type_tv">Exception Type</string>
     <string name="excp_job_name_title">Exception Job Name</string>
     <string name="expand_collapse">Expand all</string>
-    <string name="export_selected_backup_file_confirm">Launch the path selector, select and click on the bottom right corner to choose 'Export'</string>
+    <string name="export_selected_backup_file_confirm">Launch the path selector, select and click on the bottom right corner to choose Export</string>
     <string name="export_success">Export Successful</string>
     <string name="exporting">Exporting……</string>
     <string name="face_can_not_process">Face Recognition Engine Activation Failed, Recognition Unavailable</string>
@@ -293,7 +293,7 @@
     <string name="hardware_lock">Padlock</string>
     <string name="hardware_manage">Hardware</string>
     <string name="hardware_mode">Hardware mode (mode modification and saving require restarting the application)</string>
-    <string name="hardware_mode">Hardware Mode</string>
+    <string name="init_hardware_mode">Hardware Mode</string>
     <string name="hardware_unknown">Unknown</string>
     <string name="has_job_in_progress">Job in Progress Exists</string>
     <string name="has_locked">Locked</string>
@@ -305,7 +305,7 @@
     <string name="header_refreshing">Refreshing...</string>
     <string name="header_release">Release to refresh</string>
     <string name="header_secondary">Release to enter second floor</string>
-    <string name="header_update">'Last update' M-d HH:mm</string>
+    <string name="header_update">Last update M-d HH:mm</string>
     <string name="heat_energy">Thermal Energy</string>
     <string name="home">Home</string>
     <string name="home_overview_data_title">Overview Data</string>
@@ -569,6 +569,7 @@
     <string name="please_select_workstation">Please select area</string>
     <string name="please_set_point_coordinate_first">please_set_point_coordinate_first</string>
     <string name="please_swipe_card">Please swipe card</string>
+    <string name="please_swipe_rfid">Please swipe rfid</string>
     <string name="please_take_out_ready_device_first">Please remove devices with activated card locks first</string>
     <string name="please_wait_ticket_name_lock_complete">Please wait for [{0}] to complete locking</string>
     <string name="point">Point</string>
@@ -610,6 +611,7 @@
     <string name="reduce_colocker">Reduce co-locker ({0})</string>
     <string name="register_failed">Registration failed</string>
     <string name="register_success">Registration succeeded</string>
+    <string name="register_rfid_success">Registration RFID succeeded</string>
     <string name="release_colock">Release Co-lock</string>
     <string name="release_colocker">Release Co-locking</string>
     <string name="remark">Remark</string>
@@ -722,7 +724,7 @@
     <string name="start_to_send_ticket">Start sending job ticket...</string>
     <string name="status">Status</string>
     <string name="step_confirm_failed">Step confirmation failed</string>
-    <string name="switch">Switch</string>
+    <string name="switch_tv">Switch</string>
     <string name="switch_alarm">Alarm</string>
     <string name="switch_close">Locked</string>
     <string name="switch_id">ID:{0}</string>

+ 5 - 3
ui-base/src/main/res/values-zh/strings.xml

@@ -166,7 +166,7 @@
     <string name="data_decrypt_failed">数据解密失败</string>
     <string name="data_exception">数据异常</string>
     <string name="data_export">数据导出</string>
-    <string name="data_export">请选择您要导出的表,然后点击导出。</string>
+    <string name="data_export_tip">请选择您要导出的表,然后点击导出。</string>
     <string name="data_export_error">数据导出失败。</string>
     <string name="data_export_success_tip">数据导出完成,请选择文件夹并点击右下角按钮进行保存。</string>
     <string name="data_file_is_corrupted">数据文件已损坏</string>
@@ -293,7 +293,7 @@
     <string name="hardware_lock">挂锁</string>
     <string name="hardware_manage">硬件管理</string>
     <string name="hardware_mode">硬件模式(模式修改保存需要重启应用)</string>
-    <string name="hardware_mode">硬件模式</string>
+    <string name="init_hardware_mode">硬件模式</string>
     <string name="hardware_unknown">未知</string>
     <string name="has_job_in_progress">存在正在进行中的作业</string>
     <string name="has_locked">已上锁</string>
@@ -569,6 +569,7 @@
     <string name="please_select_workstation">请选择区域</string>
     <string name="please_set_point_coordinate_first">请先设置点位坐标。</string>
     <string name="please_swipe_card">请刷卡</string>
+    <string name="please_swipe_rfid">请刷RFID</string>
     <string name="please_take_out_ready_device_first">请先取出已开卡扣的设备</string>
     <string name="please_wait_ticket_name_lock_complete">请等待[{0}]上锁完成</string>
     <string name="point">点位</string>
@@ -610,6 +611,7 @@
     <string name="reduce_colocker">减少共锁人({0})</string>
     <string name="register_failed">注册失败</string>
     <string name="register_success">注册成功</string>
+    <string name="register_rfid_success">录入RFId成功</string>
     <string name="release_colock">解除共锁</string>
     <string name="release_colocker">解除共锁</string>
     <string name="remark">备注</string>
@@ -722,7 +724,7 @@
     <string name="start_to_send_ticket">开始下发工作票······</string>
     <string name="status">状态</string>
     <string name="step_confirm_failed">步骤确认失败</string>
-    <string name="switch">切换</string>
+    <string name="switch_tv">切换</string>
     <string name="switch_alarm">警告</string>
     <string name="switch_close">关闭</string>
     <string name="switch_id">编号:{0}</string>

+ 1 - 0
ui-base/src/main/res/values/attrs.xml

@@ -29,6 +29,7 @@
     <!-- 文本分级 -->
     <attr name="colorTextPrimary" format="color" />
     <attr name="colorTextSecondary" format="color" />
+    <attr name="colorTextClick" format="color" />
     <attr name="colorTextDisabled" format="color" />
 
     <!-- 首页入口 -->

+ 5 - 3
ui-base/src/main/res/values/strings.xml

@@ -166,7 +166,7 @@
     <string name="data_decrypt_failed">数据解密失败</string>
     <string name="data_exception">数据异常</string>
     <string name="data_export">数据导出</string>
-    <string name="data_export">请选择您要导出的表,然后点击导出。</string>
+    <string name="data_export_tip">请选择您要导出的表,然后点击导出。</string>
     <string name="data_export_error">数据导出失败。</string>
     <string name="data_export_success_tip">数据导出完成,请选择文件夹并点击右下角按钮进行保存。</string>
     <string name="data_file_is_corrupted">数据文件已损坏</string>
@@ -293,7 +293,7 @@
     <string name="hardware_lock">挂锁</string>
     <string name="hardware_manage">硬件管理</string>
     <string name="hardware_mode">硬件模式(模式修改保存需要重启应用)</string>
-    <string name="hardware_mode">硬件模式</string>
+    <string name="init_hardware_mode">硬件模式</string>
     <string name="hardware_unknown">未知</string>
     <string name="has_job_in_progress">存在正在进行中的作业</string>
     <string name="has_locked">已上锁</string>
@@ -569,6 +569,7 @@
     <string name="please_select_workstation">请选择区域</string>
     <string name="please_set_point_coordinate_first">请先设置点位坐标。</string>
     <string name="please_swipe_card">请刷卡</string>
+    <string name="please_swipe_rfid">请刷RFID</string>
     <string name="please_take_out_ready_device_first">请先取出已开卡扣的设备</string>
     <string name="please_wait_ticket_name_lock_complete">请等待[{0}]上锁完成</string>
     <string name="point">点位</string>
@@ -610,6 +611,7 @@
     <string name="reduce_colocker">减少共锁人({0})</string>
     <string name="register_failed">注册失败</string>
     <string name="register_success">注册成功</string>
+    <string name="register_rfid_success">录入RFId成功</string>
     <string name="release_colock">解除共锁</string>
     <string name="release_colocker">解除共锁</string>
     <string name="remark">备注</string>
@@ -722,7 +724,7 @@
     <string name="start_to_send_ticket">开始下发工作票······</string>
     <string name="status">状态</string>
     <string name="step_confirm_failed">步骤确认失败</string>
-    <string name="switch">切换</string>
+    <string name="switch_tv">切换</string>
     <string name="switch_alarm">警告</string>
     <string name="switch_close">关闭</string>
     <string name="switch_id">编号:{0}</string>

+ 1 - 0
ui-base/src/main/res/values/theme.xml

@@ -25,6 +25,7 @@
 
         <!-- 文本分级(用 @color,避免 Theme 直写 #) -->
         <item name="colorTextPrimary">@color/palette_text_primary_dark</item>
+        <item name="colorTextClick">@color/palette_blue</item>
         <item name="colorTextSecondary">@color/palette_text_secondary_dark</item>
         <item name="colorTextDisabled">@color/palette_text_disabled_dark</item>