Эх сурвалжийг харах

refactor(更新):
- 用户管理新增和编辑用户时增加密码字段,旧数据默认密码123456
- 作业票删除相关操作改为软删除
- 优化数据导出页面标题和图标
- 修复ModBus模式下钥匙开锁失败问题
- 修复地图上长按点位弹窗不显示问题
- 蓝牙扫描超时时间调整为10秒
- 角色编辑弹窗角色名称支持国际化显示
- 预设流程模式和流程步骤的名称改为英文
- 开启Debug模式
- 新增国际化文本
- 调整部分UI样式和日志输出

周文健 2 сар өмнө
parent
commit
614656b260
32 өөрчлөгдсөн 313 нэмэгдсэн , 183 устгасан
  1. 10 0
      app/src/main/assets/i18n/en-US.json
  2. 10 0
      app/src/main/assets/i18n/zh-CN.json
  3. 12 12
      app/src/main/assets/preset/preset_workflow_mode.json
  4. 88 88
      app/src/main/assets/preset/preset_workflow_step.json
  5. 9 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  6. 8 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  7. 10 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  8. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  9. 30 31
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/SwitchLayoutFragment.kt
  10. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  11. 2 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt
  12. 1 1
      app/src/main/res/layout-land/fragment_backup_and_restore.xml
  13. 1 1
      app/src/main/res/layout/dialog_add_role.xml
  14. 27 1
      app/src/main/res/layout/dialog_add_user.xml
  15. 35 9
      app/src/main/res/layout/dialog_update_user.xml
  16. 3 3
      app/src/main/res/layout/fragment_backup_and_restore.xml
  17. 2 2
      app/src/main/res/layout/fragment_data_export.xml
  18. 3 1
      app/src/main/res/layout/item_backup.xml
  19. 1 1
      data/src/main/java/com/grkj/data/config/ISCSConfig.kt
  20. 33 17
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  21. 2 0
      data/src/main/java/com/grkj/data/dao/UserDao.kt
  22. 1 1
      data/src/main/java/com/grkj/data/hardware/ble/BleUtil.kt
  23. 1 1
      data/src/main/java/com/grkj/data/hardware/modbus/ModBusHardwareHelper.kt
  24. 6 6
      data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt
  25. 3 2
      data/src/main/java/com/grkj/data/logic/impl/standard/JobTicketLogic.kt
  26. 2 0
      data/src/main/java/com/grkj/data/logic/impl/standard/UserLogic.kt
  27. 1 0
      data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt
  28. 4 0
      data/src/main/java/com/grkj/data/model/vo/IsJobTicketPointsDataVo.kt
  29. 1 1
      data/src/main/java/com/grkj/data/model/vo/PointManageVo.kt
  30. 1 0
      data/src/main/java/com/grkj/data/model/vo/UpdateUserDataVo.kt
  31. 2 0
      data/src/main/java/com/grkj/data/model/vo/UserManageVo.kt
  32. 2 0
      ui-base/src/main/java/com/grkj/ui_base/business/HardwareBusinessManager.kt

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

@@ -4117,5 +4117,15 @@
     "key": "hardware_mode",
     "key": "hardware_mode",
     "type": "text",
     "type": "text",
     "value": "Hardware mode (mode modification and saving require restarting the application)"
     "value": "Hardware mode (mode modification and saving require restarting the application)"
+  },
+  "password": {
+    "key": "password",
+    "type": "text",
+    "value": "Password"
+  },
+  "password_hint": {
+    "key": "password_hint",
+    "type": "text",
+    "value": "6–20: letters/numbers/symbols"
   }
   }
 }
 }

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

@@ -4123,5 +4123,15 @@
     "key": "hardware_mode",
     "key": "hardware_mode",
     "type": "text",
     "type": "text",
     "value": "硬件模式(模式修改保存需要重启应用)"
     "value": "硬件模式(模式修改保存需要重启应用)"
+  },
+  "password": {
+    "key": "password",
+    "type": "text",
+    "value": "密码"
+  },
+  "password_hint": {
+    "key": "password_hint",
+    "type": "text",
+    "value": "6-20位:字母/数字/符号"
   }
   }
 }
 }

+ 12 - 12
app/src/main/assets/preset/preset_workflow_mode.json

@@ -3,8 +3,8 @@
     "modeId": 1,
     "modeId": 1,
     "modeCode": "1",
     "modeCode": "1",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "上锁-共锁-解锁",
-    "modeTitle": "上锁-共锁-解锁",
+    "modeName": "Lock-CoLock-UnLock",
+    "modeTitle": "Lock-CoLock-UnLock",
     "modeDescription": "包含上锁-共锁-解锁步骤",
     "modeDescription": "包含上锁-共锁-解锁步骤",
     "isColockSupport": true,
     "isColockSupport": true,
     "creator": "admin",
     "creator": "admin",
@@ -19,8 +19,8 @@
     "modeId": 2,
     "modeId": 2,
     "modeCode": "2",
     "modeCode": "2",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "上锁-解锁",
-    "modeTitle": "上锁-解锁",
+    "modeName": "Lock-UnLock",
+    "modeTitle": "Lock-UnLock",
     "modeDescription": "包含上锁-解锁步骤",
     "modeDescription": "包含上锁-解锁步骤",
     "isColockSupport": false,
     "isColockSupport": false,
     "creator": "admin",
     "creator": "admin",
@@ -35,8 +35,8 @@
     "modeId": 3,
     "modeId": 3,
     "modeCode": "3",
     "modeCode": "3",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "解锁-上锁",
-    "modeTitle": "解锁-上锁",
+    "modeName": "UnLock-Lock",
+    "modeTitle": "UnLock-Lock",
     "modeDescription": "包含解锁-上锁步骤",
     "modeDescription": "包含解锁-上锁步骤",
     "isColockSupport": false,
     "isColockSupport": false,
     "creator": "admin",
     "creator": "admin",
@@ -51,8 +51,8 @@
     "modeId": 4,
     "modeId": 4,
     "modeCode": "4",
     "modeCode": "4",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "上锁",
-    "modeTitle": "上锁",
+    "modeName": "Lock",
+    "modeTitle": "Lock",
     "modeDescription": "包含上锁步骤",
     "modeDescription": "包含上锁步骤",
     "isColockSupport": false,
     "isColockSupport": false,
     "creator": "admin",
     "creator": "admin",
@@ -67,8 +67,8 @@
     "modeId": 5,
     "modeId": 5,
     "modeCode": "5",
     "modeCode": "5",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "解锁",
-    "modeTitle": "解锁",
+    "modeName": "UnLock",
+    "modeTitle": "UnLock",
     "modeDescription": "包含解锁步骤",
     "modeDescription": "包含解锁步骤",
     "isColockSupport": false,
     "isColockSupport": false,
     "creator": "admin",
     "creator": "admin",
@@ -83,8 +83,8 @@
     "modeId": 6,
     "modeId": 6,
     "modeCode": "6",
     "modeCode": "6",
     "isPreset": true,
     "isPreset": true,
-    "modeName": "LOTO八大步骤(玛氏)",
-    "modeTitle": "LOTO八大步骤(玛氏)",
+    "modeName": "LOTO Eight Steps",
+    "modeTitle": "LOTO Eight Steps",
     "modeDescription": "LOTO八大步骤(玛氏)",
     "modeDescription": "LOTO八大步骤(玛氏)",
     "isColockSupport": true,
     "isColockSupport": true,
     "creator": "admin",
     "creator": "admin",

+ 88 - 88
app/src/main/assets/preset/preset_workflow_step.json

@@ -4,11 +4,11 @@
     "modeId": 1,
     "modeId": 1,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "选择人员",
-    "stepTitle": "选择人员",
-    "stepTitleShort": "选择人员",
+    "stepName": "Select Member",
+    "stepTitle": "Select Member",
+    "stepTitleShort": "Select Member",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "选择人员",
+    "stepDescription": "Select Member",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -35,11 +35,11 @@
     "modeId": 1,
     "modeId": 1,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "上锁",
-    "stepTitle": "上锁",
-    "stepTitleShort": "上锁",
+    "stepName": "Lock",
+    "stepTitle": "Lock",
+    "stepTitleShort": "Lock",
     "stepIcon": "lock.svg",
     "stepIcon": "lock.svg",
-    "stepDescription": "上锁",
+    "stepDescription": "Lock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -66,11 +66,11 @@
     "modeId": 1,
     "modeId": 1,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 3,
     "stepIndex": 3,
-    "stepName": "共锁",
-    "stepTitle": "共锁",
-    "stepTitleShort": "共锁",
+    "stepName": "CoLock",
+    "stepTitle": "CoLock",
+    "stepTitleShort": "CoLock",
     "stepIcon": "access-control.svg",
     "stepIcon": "access-control.svg",
-    "stepDescription": "共锁",
+    "stepDescription": "CoLock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -97,11 +97,11 @@
     "modeId": 1,
     "modeId": 1,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 4,
     "stepIndex": 4,
-    "stepName": "解锁",
-    "stepTitle": "解锁",
-    "stepTitleShort": "解锁",
+    "stepName": "UnLock",
+    "stepTitle": "UnLock",
+    "stepTitleShort": "UnLock",
     "stepIcon": "unlock.svg",
     "stepIcon": "unlock.svg",
-    "stepDescription": "解锁",
+    "stepDescription": "UnLock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -128,11 +128,11 @@
     "modeId": 2,
     "modeId": 2,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "选择人员",
-    "stepTitle": "选择人员",
-    "stepTitleShort": "选择人员",
+    "stepName": "Select Member",
+    "stepTitle": "Select Member",
+    "stepTitleShort": "Select Member",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "选择人员",
+    "stepDescription": "Select Member",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -159,11 +159,11 @@
     "modeId": 2,
     "modeId": 2,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "上锁",
-    "stepTitle": "上锁",
-    "stepTitleShort": "上锁",
+    "stepName": "Lock",
+    "stepTitle": "Lock",
+    "stepTitleShort": "Lock",
     "stepIcon": "lock.svg",
     "stepIcon": "lock.svg",
-    "stepDescription": "上锁",
+    "stepDescription": "Lock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -190,11 +190,11 @@
     "modeId": 2,
     "modeId": 2,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 3,
     "stepIndex": 3,
-    "stepName": "解锁",
-    "stepTitle": "解锁",
-    "stepTitleShort": "解锁",
+    "stepName": "UnLock",
+    "stepTitle": "UnLock",
+    "stepTitleShort": "UnLock",
     "stepIcon": "unlock.svg",
     "stepIcon": "unlock.svg",
-    "stepDescription": "解锁",
+    "stepDescription": "UnLock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -221,11 +221,11 @@
     "modeId": 3,
     "modeId": 3,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "选择人员",
-    "stepTitle": "选择人员",
-    "stepTitleShort": "选择人员",
+    "stepName": "Select Member",
+    "stepTitle": "Select Member",
+    "stepTitleShort": "Select Member",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "选择人员",
+    "stepDescription": "Select Member",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -252,11 +252,11 @@
     "modeId": 3,
     "modeId": 3,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "解锁",
-    "stepTitle": "解锁",
-    "stepTitleShort": "解锁",
+    "stepName": "UnLock",
+    "stepTitle": "UnLock",
+    "stepTitleShort": "UnLock",
     "stepIcon": "unlock.svg",
     "stepIcon": "unlock.svg",
-    "stepDescription": "解锁",
+    "stepDescription": "UnLock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -283,11 +283,11 @@
     "modeId": 3,
     "modeId": 3,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 3,
     "stepIndex": 3,
-    "stepName": "上锁",
-    "stepTitle": "上锁",
-    "stepTitleShort": "上锁",
+    "stepName": "Lock",
+    "stepTitle": "Lock",
+    "stepTitleShort": "Lock",
     "stepIcon": "lock.svg",
     "stepIcon": "lock.svg",
-    "stepDescription": "上锁",
+    "stepDescription": "Lock",
     "confirmType": 1,
     "confirmType": 1,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -314,11 +314,11 @@
     "modeId": 4,
     "modeId": 4,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "选择人员",
-    "stepTitle": "选择人员",
-    "stepTitleShort": "选择人员",
+    "stepName": "Select Member",
+    "stepTitle": "Select Member",
+    "stepTitleShort": "Select Member",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "选择人员",
+    "stepDescription": "Select Member",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -345,11 +345,11 @@
     "modeId": 4,
     "modeId": 4,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "上锁",
-    "stepTitle": "上锁",
-    "stepTitleShort": "上锁",
+    "stepName": "Lock",
+    "stepTitle": "Lock",
+    "stepTitleShort": "Lock",
     "stepIcon": "lock.svg",
     "stepIcon": "lock.svg",
-    "stepDescription": "上锁",
+    "stepDescription": "Lock",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -376,11 +376,11 @@
     "modeId": 5,
     "modeId": 5,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "选择人员",
-    "stepTitle": "选择人员",
-    "stepTitleShort": "选择人员",
+    "stepName": "Select Member",
+    "stepTitle": "Select Member",
+    "stepTitleShort": "Select Member",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "选择人员",
+    "stepDescription": "Select Member",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -407,11 +407,11 @@
     "modeId": 5,
     "modeId": 5,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "解锁",
-    "stepTitle": "解锁",
-    "stepTitleShort": "解锁",
+    "stepName": "UnLock",
+    "stepTitle": "UnLock",
+    "stepTitleShort": "UnLock",
     "stepIcon": "unlock.svg",
     "stepIcon": "unlock.svg",
-    "stepDescription": "解锁",
+    "stepDescription": "UnLock",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -438,11 +438,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 1,
     "stepIndex": 1,
-    "stepName": "识别工作内容",
-    "stepTitle": "识别工作内容",
-    "stepTitleShort": "识别工作内容",
+    "stepName": "Identify Task",
+    "stepTitle": "Identify Task",
+    "stepTitleShort": "Identify Task",
     "stepIcon": "ballot-check.svg",
     "stepIcon": "ballot-check.svg",
-    "stepDescription": "识别工作内容",
+    "stepDescription": "Identify Task",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -469,11 +469,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 2,
     "stepIndex": 2,
-    "stepName": "判断能量源与隔离方式",
-    "stepTitle": "判断能量源与隔离方式",
-    "stepTitleShort": "判断能量源与隔离方式",
+    "stepName": "Assess Energy & Isolation",
+    "stepTitle": "Assess Energy & Isolation",
+    "stepTitleShort": "Assess Energy & Isolation",
     "stepIcon": "bolt.svg",
     "stepIcon": "bolt.svg",
-    "stepDescription": "判断能量源与隔离方式",
+    "stepDescription": "Assess Energy & Isolation",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -500,11 +500,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 3,
     "stepIndex": 3,
-    "stepName": "通知所有受影响的人员",
-    "stepTitle": "通知所有受影响的人员",
-    "stepTitleShort": "通知所有受影响的人员",
+    "stepName": "Notify Affected",
+    "stepTitle": "Notify Affected",
+    "stepTitleShort": "Notify Affected",
     "stepIcon": "users-alt.svg",
     "stepIcon": "users-alt.svg",
-    "stepDescription": "通知所有受影响的人员",
+    "stepDescription": "Notify Affected",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -531,11 +531,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 4,
     "stepIndex": 4,
-    "stepName": "正常操作停机",
-    "stepTitle": "正常操作停机",
-    "stepTitleShort": "正常操作停机",
+    "stepName": "Normal Shutdown",
+    "stepTitle": "Normal Shutdown",
+    "stepTitleShort": "Normal Shutdown",
     "stepIcon": "power.svg",
     "stepIcon": "power.svg",
-    "stepDescription": "正常操作停机",
+    "stepDescription": "Normal Shutdown",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -562,11 +562,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 5,
     "stepIndex": 5,
-    "stepName": "上锁并挂牌",
-    "stepTitle": "上锁并挂牌",
-    "stepTitleShort": "上锁并挂牌",
+    "stepName": "Lock & Tag",
+    "stepTitle": "Lock & Tag",
+    "stepTitleShort": "Lock & Tag",
     "stepIcon": "lock.svg",
     "stepIcon": "lock.svg",
-    "stepDescription": "上锁并挂牌",
+    "stepDescription": "Lock & Tag",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": "jtlocker",
     "confirmRoleCode": "jtlocker",
     "confirmUser": null,
     "confirmUser": null,
@@ -593,11 +593,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 6,
     "stepIndex": 6,
-    "stepName": "能量隔离证实",
-    "stepTitle": "能量隔离证实",
-    "stepTitleShort": "能量隔离证实",
+    "stepName": "Verify Isolation",
+    "stepTitle": "Verify Isolation",
+    "stepTitleShort": "Verify Isolation",
     "stepIcon": "bolt-slash.svg",
     "stepIcon": "bolt-slash.svg",
-    "stepDescription": "能量隔离证实",
+    "stepDescription": "Verify Isolation",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -624,11 +624,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 7,
     "stepIndex": 7,
-    "stepName": "取锁前检查",
-    "stepTitle": "取锁前检查",
-    "stepTitleShort": "取锁前检查",
+    "stepName": "Pre-Removal Check",
+    "stepTitle": "Pre-Removal Check",
+    "stepTitleShort": "Pre-Removal Check",
     "stepIcon": "shield-check.svg",
     "stepIcon": "shield-check.svg",
-    "stepDescription": "取锁前检查",
+    "stepDescription": "Pre-Removal Check",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,
@@ -655,11 +655,11 @@
     "modeId": 6,
     "modeId": 6,
     "stepTemplateId": null,
     "stepTemplateId": null,
     "stepIndex": 8,
     "stepIndex": 8,
-    "stepName": "拆锁恢复开关",
-    "stepTitle": "拆锁恢复开关",
-    "stepTitleShort": "拆锁恢复开关",
+    "stepName": "Remove Lock & Restore",
+    "stepTitle": "Remove Lock & Restore",
+    "stepTitleShort": "Remove Lock & Restore",
     "stepIcon": "rotate-left.svg",
     "stepIcon": "rotate-left.svg",
-    "stepDescription": "拆锁恢复开关",
+    "stepDescription": "Remove Lock & Restore",
     "confirmType": 0,
     "confirmType": 0,
     "confirmRoleCode": null,
     "confirmRoleCode": null,
     "confirmUser": null,
     "confirmUser": null,

+ 9 - 0
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt

@@ -7,6 +7,7 @@ import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddUserBinding
 import com.grkj.iscs.databinding.DialogAddUserBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.data.config.ISCSConfig
 import com.grkj.data.config.ISCSConfig
+import com.grkj.shared.utils.BCryptUtils
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.CustomDialog
@@ -69,9 +70,13 @@ class AddUserDialog(
         // 确认
         // 确认
         binding.confirm.setDebouncedClickListener {
         binding.confirm.setDebouncedClickListener {
             if (!checkData()) return@setDebouncedClickListener
             if (!checkData()) return@setDebouncedClickListener
+            val password = binding.passwordEt.text.trim().toString()
             val vo = AddUserDataVo(
             val vo = AddUserDataVo(
                 binding.usernameEt.text.trim().toString(),
                 binding.usernameEt.text.trim().toString(),
                 binding.nicknameEt.text.trim().toString(),
                 binding.nicknameEt.text.trim().toString(),
+                if (password.isEmpty()) BCryptUtils.encryptPassword("123456") else BCryptUtils.encryptPassword(
+                    password
+                ),
                 "",
                 "",
                 selectedRoles.mapNotNull { it.getId() },
                 selectedRoles.mapNotNull { it.getId() },
                 selectedWorkstations.mapNotNull { it.getId() },
                 selectedWorkstations.mapNotNull { it.getId() },
@@ -90,6 +95,10 @@ class AddUserDialog(
             PopTip.build().tip(CommonUtils.getStr("please_input_nickname"))
             PopTip.build().tip(CommonUtils.getStr("please_input_nickname"))
             return false
             return false
         }
         }
+        if (!binding.passwordEt.text.isNullOrBlank() && binding.passwordEt.text.toString().length !in 6..20) {
+            PopTip.build().tip(CommonUtils.getStr("password_hint"))
+            return false
+        }
         if (selectedRoles.isEmpty()) {
         if (selectedRoles.isEmpty()) {
             PopTip.build().tip(CommonUtils.getStr("please_select_role"))
             PopTip.build().tip(CommonUtils.getStr("please_select_role"))
             return false
             return false

+ 8 - 1
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt

@@ -44,7 +44,14 @@ class UpdateRoleDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.scrim))
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.scrim))
 
 
         // 预填数据
         // 预填数据
-        binding.roleNameEt.setText(updateEntity.roleName)
+
+        val i18NRoleName = CommonUtils.getStr(updateEntity.roleKeys ?: "")
+        if (i18NRoleName == updateEntity.roleKeys || i18NRoleName.isEmpty()) {
+            binding.roleNameEt.setText(updateEntity.roleName)
+        } else {
+            binding.roleNameEt.setText(i18NRoleName)
+        }
+
         binding.roleKeyEt.setText(updateEntity.roleKeys)
         binding.roleKeyEt.setText(updateEntity.roleKeys)
         binding.statusRg.clearCheck()
         binding.statusRg.clearCheck()
         updateEntity.status?.let { binding.activateRb.isChecked = it }
         updateEntity.status?.let { binding.activateRb.isChecked = it }

+ 10 - 2
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt

@@ -2,12 +2,13 @@ package com.grkj.iscs.features.main.dialog.data_manage
 
 
 import android.view.View
 import android.view.View
 import androidx.core.view.isVisible
 import androidx.core.view.isVisible
+import com.grkj.data.config.ISCSConfig
 import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateUserBinding
 import com.grkj.iscs.databinding.DialogUpdateUserBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.config.ISCSConfig
+import com.grkj.shared.utils.BCryptUtils
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.CustomDialog
@@ -58,7 +59,8 @@ class UpdateUserDialog(
         // 标记已选
         // 标记已选
         selectedRoles = roleData.filter { it.getShowText() in userVo.roleNames }.toMutableList()
         selectedRoles = roleData.filter { it.getShowText() in userVo.roleNames }.toMutableList()
         selectedWorkstations =
         selectedWorkstations =
-            workstationData.flatMap { it.findTreeData { it.getShowText() in userVo.workstationNames } }.toMutableList()
+            workstationData.flatMap { it.findTreeData { it.getShowText() in userVo.workstationNames } }
+                .toMutableList()
 
 
         // 角色多选
         // 角色多选
         binding.roleTv.setOnClickListener {
         binding.roleTv.setOnClickListener {
@@ -98,15 +100,21 @@ class UpdateUserDialog(
             val username = binding.usernameEt.text.trim().toString()
             val username = binding.usernameEt.text.trim().toString()
             val name = binding.nicknameEt.text.trim().toString()
             val name = binding.nicknameEt.text.trim().toString()
             val card = binding.cardcodeEt.text.trim().toString()
             val card = binding.cardcodeEt.text.trim().toString()
+            val password = binding.passwordEt.text.trim().toString()
             if (name.isBlank()) return@setDebouncedClickListener PopTip.build()
             if (name.isBlank()) return@setDebouncedClickListener PopTip.build()
                 .tip(CommonUtils.getStr("please_input_nickname"))
                 .tip(CommonUtils.getStr("please_input_nickname"))
             if (selectedRoles.isEmpty()) return@setDebouncedClickListener PopTip.build()
             if (selectedRoles.isEmpty()) return@setDebouncedClickListener PopTip.build()
                 .tip(CommonUtils.getStr("please_select_role"))
                 .tip(CommonUtils.getStr("please_select_role"))
             if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) return@setDebouncedClickListener PopTip.build()
             if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) return@setDebouncedClickListener PopTip.build()
                 .tip(CommonUtils.getStr("please_select_area"))
                 .tip(CommonUtils.getStr("please_select_area"))
+            if (!password.isNotEmpty() && password.length !in 6..20) {
+                PopTip.build().tip(CommonUtils.getStr("password_hint"))
+                return@setDebouncedClickListener
+            }
             val isActive = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             val isActive = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             val updateVo = UpdateUserDataVo(
             val updateVo = UpdateUserDataVo(
                 userVo.userId,
                 userVo.userId,
+                if (password.isNotEmpty()) BCryptUtils.encryptPassword(password) else userVo.password,
                 username,
                 username,
                 name,
                 name,
                 card,
                 card,

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt

@@ -139,7 +139,7 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
         val itemBinding = holder.getBinding<ItemRoleManageRoleBinding>()
         val itemBinding = holder.getBinding<ItemRoleManageRoleBinding>()
         val item = holder.getModel<RoleManageVo>()
         val item = holder.getModel<RoleManageVo>()
         itemBinding.roleNum.text = item.roleId.toString()
         itemBinding.roleNum.text = item.roleId.toString()
-        val i18NRoleName = I18nManager.t(item.roleKey ?: "")
+        val i18NRoleName = CommonUtils.getStr(item.roleKey ?: "")
         if (i18NRoleName == item.roleKey || i18NRoleName.isEmpty()) {
         if (i18NRoleName == item.roleKey || i18NRoleName.isEmpty()) {
             itemBinding.roleName.text = item.roleName
             itemBinding.roleName.text = item.roleName
         } else {
         } else {

+ 30 - 31
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/SwitchLayoutFragment.kt

@@ -169,20 +169,21 @@ class SwitchLayoutFragment : BaseFragment<FragmentSwitchLayoutBinding>() {
         itemBinding.root.setDebouncedClickListener {
         itemBinding.root.setDebouncedClickListener {
             stationLayer?.selectPoint(item.entityId)
             stationLayer?.selectPoint(item.entityId)
         }
         }
-        if (item.showInMap){
+        if (item.showInMap) {
             itemBinding.showInMap.loadSkinIcon("icon_show.png")
             itemBinding.showInMap.loadSkinIcon("icon_show.png")
-        }else{
+        } else {
             itemBinding.showInMap.loadSkinIcon("icon_hide.png")
             itemBinding.showInMap.loadSkinIcon("icon_hide.png")
         }
         }
         itemBinding.showInMap.setDebouncedClickListener {
         itemBinding.showInMap.setDebouncedClickListener {
             if (item.x == null || item.y == null) {
             if (item.x == null || item.y == null) {
                 showToast(CommonUtils.getStr("please_set_point_coordinate_first"))
                 showToast(CommonUtils.getStr("please_set_point_coordinate_first"))
-            }else{
-                viewModel.changeShowInMap(item.entityId?:0L, !item.showInMap).observe(this@SwitchLayoutFragment){
-                    getMap(currentWorkstationId)
-                    item.showInMap = !item.showInMap
-                    adapter.notifyDataSetChanged()
-                }
+            } else {
+                viewModel.changeShowInMap(item.entityId ?: 0L, !item.showInMap)
+                    .observe(this@SwitchLayoutFragment) {
+                        getMap(currentWorkstationId)
+                        item.showInMap = !item.showInMap
+                        adapter.notifyDataSetChanged()
+                    }
             }
             }
         }
         }
         itemBinding.addOrUpdateToMap.setDebouncedClickListener {
         itemBinding.addOrUpdateToMap.setDebouncedClickListener {
@@ -270,32 +271,30 @@ class SwitchLayoutFragment : BaseFragment<FragmentSwitchLayoutBinding>() {
             gestureDetector.onTouchEvent(event)
             gestureDetector.onTouchEvent(event)
             false
             false
         }
         }
+        if (stationLayer == null) {
+            stationLayer = CustomSwitchStationLayer(
+                binding.mapview, viewModel.mStationList ?: mutableListOf()
+            )
+            stationLayer?.onLongPressListener = { point, screenX, screenY, _, _ ->
+                val lp =
+                    binding.dialogPositionPoint.layoutParams as FrameLayout.LayoutParams
+                lp.leftMargin = screenX.toInt()
+                lp.topMargin = screenY.toInt()
+                binding.dialogPositionPoint.layoutParams = lp
+                binding.dialogPositionPoint.postDelayed({
+                    SwitchInfoDialog.show(
+                        binding.dialogPositionPoint, point.entityName,
+                        "${point.pointNfc}",
+                        point.status
+                    )
+                }, 100)
+            }
+            binding.mapview.addLayer(stationLayer)
+            stationLayer?.setRatio(viewModel.mapRatio)
+        }
         binding.mapview.setMapViewListener(object : MapViewListener {
         binding.mapview.setMapViewListener(object : MapViewListener {
             override fun onMapLoadSuccess() {
             override fun onMapLoadSuccess() {
                 binding.mapview.post {
                 binding.mapview.post {
-                    if (stationLayer != null) {
-                        binding.mapview.currentRotateDegrees = 0f
-                        return@post
-                    }
-                    stationLayer = CustomSwitchStationLayer(
-                        binding.mapview, viewModel.mStationList ?: mutableListOf()
-                    )
-                    stationLayer?.onLongPressListener = { point, screenX, screenY, _, _ ->
-                        val lp =
-                            binding.dialogPositionPoint.layoutParams as FrameLayout.LayoutParams
-                        lp.leftMargin = screenX.toInt()
-                        lp.topMargin = screenY.toInt()
-                        binding.dialogPositionPoint.layoutParams = lp
-                        binding.dialogPositionPoint.postDelayed({
-                            SwitchInfoDialog.show(
-                                binding.dialogPositionPoint, point.entityName,
-                                "${point.pointNfc}",
-                                point.status
-                            )
-                        },100)
-                    }
-                    binding.mapview.addLayer(stationLayer)
-                    stationLayer?.setRatio(viewModel.mapRatio)
                     binding.mapview.refresh()
                     binding.mapview.refresh()
                     ThreadUtils.runOnMainDelayed(500) {
                     ThreadUtils.runOnMainDelayed(500) {
                         if (positionPointId != null) {
                         if (positionPointId != null) {

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt

@@ -50,7 +50,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         binding.addUser.setDebouncedClickListener {
         binding.addUser.setDebouncedClickListener {
             viewModel.getRoleAndWorkStationData().observe(this) {
             viewModel.getRoleAndWorkStationData().observe(this) {
                 AddUserDialog.show(viewModel.roleData.map {
                 AddUserDialog.show(viewModel.roleData.map {
-                    val i18NRoleName = I18nManager.t(it.roleKey ?: "")
+                    val i18NRoleName = CommonUtils.getStr(it.roleKey ?: "")
                     val roleName = if (i18NRoleName == it.roleKey || i18NRoleName.isEmpty()) {
                     val roleName = if (i18NRoleName == it.roleKey || i18NRoleName.isEmpty()) {
                         it.roleName
                         it.roleName
                     } else {
                     } else {

+ 2 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -109,6 +109,7 @@ class MainViewModel @Inject constructor(
                                             ThreadUtils.runOnIO {
                                             ThreadUtils.runOnIO {
                                                 BleReturnDispatcher.submit(mac) { isConnect ->
                                                 BleReturnDispatcher.submit(mac) { isConnect ->
                                                     if (isConnect) {
                                                     if (isConnect) {
+                                                        logger.info("钥匙连接成功")
                                                         val bleBean =
                                                         val bleBean =
                                                             BleConnectionManager.getBleDeviceByMac(
                                                             BleConnectionManager.getBleDeviceByMac(
                                                                 mac
                                                                 mac
@@ -126,6 +127,7 @@ class MainViewModel @Inject constructor(
                                                             }
                                                             }
                                                         }
                                                         }
                                                     } else {
                                                     } else {
+                                                        logger.info("钥匙连接失败")
                                                         HardwareMode.getCurrentHardwareMode()
                                                         HardwareMode.getCurrentHardwareMode()
                                                             .controlKeyBuckle(true, mac) {
                                                             .controlKeyBuckle(true, mac) {
                                                                 showTip(
                                                                 showTip(

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

@@ -409,7 +409,7 @@
                     <TextView
                     <TextView
                         android:layout_width="0dp"
                         android:layout_width="0dp"
                         android:layout_height="match_parent"
                         android:layout_height="match_parent"
-                        android:layout_weight="2"
+                        android:layout_weight="1.5"
                         android:gravity="center"
                         android:gravity="center"
                         android:textSize="@dimen/iscs_text_md"
                         android:textSize="@dimen/iscs_text_md"
                         android:textColor="?attr/colorTextPrimary"
                         android:textColor="?attr/colorTextPrimary"

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

@@ -121,6 +121,7 @@
                 android:id="@+id/status_rg"
                 android:id="@+id/status_rg"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/normal_margin_left"
                 android:orientation="horizontal"
                 android:orientation="horizontal"
                 app:formRole="field">
                 app:formRole="field">
 
 
@@ -128,7 +129,6 @@
                     android:id="@+id/activate_rb"
                     android:id="@+id/activate_rb"
                     android:layout_width="wrap_content"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="@dimen/normal_margin_left"
                     android:textColor="?attr/colorTextPrimary"
                     android:textColor="?attr/colorTextPrimary"
                     android:textSize="@dimen/iscs_text_md"
                     android:textSize="@dimen/iscs_text_md"
                     app:i18nKey='@{"user_manage_filter_activate"}'
                     app:i18nKey='@{"user_manage_filter_activate"}'

+ 27 - 1
app/src/main/res/layout/dialog_add_user.xml

@@ -87,7 +87,7 @@
                 app:formRole="label"
                 app:formRole="label"
                 app:i18nKey='@{"nickname"}'
                 app:i18nKey='@{"nickname"}'
                 app:markPosition="start"
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
 
             <EditText
             <EditText
                 android:id="@+id/nickname_et"
                 android:id="@+id/nickname_et"
@@ -104,6 +104,32 @@
                 app:formRole="field"
                 app:formRole="field"
                 app:i18nHint='@{"please_input_nickname"}' />
                 app:i18nHint='@{"please_input_nickname"}' />
 
 
+            <com.grkj.ui_base.widget.RequiredTextView
+                android:id="@+id/password_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md"
+                app:formRole="label"
+                app:i18nKey='@{"password"}'
+                app:markPosition="start"
+                app:required="false" />
+
+            <EditText
+                android:id="@+id/password_et"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/iscs_space_2"
+                android:background="@drawable/bg_common_input"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/iscs_space_2"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md"
+                app:formRole="field"
+                app:i18nHint='@{"password_hint"}' />
+
             <com.grkj.ui_base.widget.RequiredTextView
             <com.grkj.ui_base.widget.RequiredTextView
                 android:id="@+id/role_title_tv"
                 android:id="@+id/role_title_tv"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"

+ 35 - 9
app/src/main/res/layout/dialog_update_user.xml

@@ -65,9 +65,9 @@
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="@dimen/iscs_space_2"
                 android:layout_marginLeft="@dimen/iscs_space_2"
-                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:background="@drawable/bg_common_input"
                 android:background="@drawable/bg_common_input"
                 android:maxLines="1"
                 android:maxLines="1"
+                android:minWidth="@dimen/add_to_map_input_min_width"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingHorizontal="@dimen/iscs_space_2"
                 android:paddingVertical="2dp"
                 android:paddingVertical="2dp"
                 android:singleLine="true"
                 android:singleLine="true"
@@ -83,9 +83,9 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
                 app:formRole="label"
+                app:i18nKey='@{"nickname"}'
                 app:markPosition="start"
                 app:markPosition="start"
-                app:required="true"
-                app:i18nKey='@{"nickname"}' />
+                app:required="true" />
 
 
             <EditText
             <EditText
                 android:id="@+id/nickname_et"
                 android:id="@+id/nickname_et"
@@ -102,6 +102,32 @@
                 app:formRole="field"
                 app:formRole="field"
                 app:i18nHint='@{"please_input_nickname"}' />
                 app:i18nHint='@{"please_input_nickname"}' />
 
 
+            <com.grkj.ui_base.widget.RequiredTextView
+                android:id="@+id/password_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md"
+                app:formRole="label"
+                app:i18nKey='@{"password"}'
+                app:markPosition="start"
+                app:required="true" />
+
+            <EditText
+                android:id="@+id/password_et"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/iscs_space_2"
+                android:background="@drawable/bg_common_input"
+                android:maxLines="1"
+                android:paddingHorizontal="@dimen/iscs_space_2"
+                android:paddingVertical="2dp"
+                android:singleLine="true"
+                android:textColor="?attr/colorTextPrimary"
+                android:textSize="@dimen/iscs_text_md"
+                app:formRole="field"
+                app:i18nHint='@{"password_hint"}' />
+
             <TextView
             <TextView
                 android:id="@+id/card_code_tv"
                 android:id="@+id/card_code_tv"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
@@ -132,9 +158,9 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
                 app:formRole="label"
+                app:i18nKey='@{"user_manage_role"}'
                 app:markPosition="start"
                 app:markPosition="start"
-                app:required="true"
-                app:i18nKey='@{"user_manage_role"}' />
+                app:required="true" />
 
 
             <TextView
             <TextView
                 android:id="@+id/role_tv"
                 android:id="@+id/role_tv"
@@ -159,9 +185,9 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
                 app:formRole="label"
+                app:i18nKey='@{"user_manage_area"}'
                 app:markPosition="start"
                 app:markPosition="start"
-                app:required="true"
-                app:i18nKey='@{"user_manage_area"}' />
+                app:required="true" />
 
 
             <TextView
             <TextView
                 android:id="@+id/workstation_name_tv"
                 android:id="@+id/workstation_name_tv"
@@ -184,9 +210,9 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
                 app:formRole="label"
+                app:i18nKey='@{"manage_filter_status"}'
                 app:markPosition="start"
                 app:markPosition="start"
-                app:required="true"
-                app:i18nKey='@{"manage_filter_status"}' />
+                app:required="true" />
 
 
             <RadioGroup
             <RadioGroup
                 android:id="@+id/status_rg"
                 android:id="@+id/status_rg"

+ 3 - 3
app/src/main/res/layout/fragment_backup_and_restore.xml

@@ -406,11 +406,11 @@
 
 
                     <TextView
                     <TextView
                         android:layout_width="0dp"
                         android:layout_width="0dp"
-                        android:layout_height="match_parent"
-                        android:layout_weight="2"
+                        android:layout_height="37dp"
+                        android:layout_weight="1.5"
                         android:gravity="center"
                         android:gravity="center"
-                        android:textSize="@dimen/iscs_text_md"
                         android:textColor="?attr/colorTextPrimary"
                         android:textColor="?attr/colorTextPrimary"
+                        android:textSize="@dimen/iscs_text_md"
                         app:i18nKey='@{"backup"}' />
                         app:i18nKey='@{"backup"}' />
 
 
                     <TextView
                     <TextView

+ 2 - 2
app/src/main/res/layout/fragment_data_export.xml

@@ -21,7 +21,7 @@
                 android:layout_width="@dimen/title_icon_size"
                 android:layout_width="@dimen/title_icon_size"
                 android:layout_height="@dimen/title_icon_size"
                 android:layout_height="@dimen/title_icon_size"
                 android:tint="?attr/colorPrimary"
                 android:tint="?attr/colorPrimary"
-                app:skinSrc='@{"ballot.svg"}' />
+                app:skinSrc='@{"icon_data_export.png"}' />
 
 
             <TextView
             <TextView
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
@@ -31,7 +31,7 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 android:textSize="@dimen/iscs_text_md"
                 android:textStyle="bold"
                 android:textStyle="bold"
-                app:i18nKey='@{"sop_manage_title"}' />
+                app:i18nKey='@{"data_export"}' />
 
 
             <TextView
             <TextView
                 android:id="@+id/back"
                 android:id="@+id/back"

+ 3 - 1
app/src/main/res/layout/item_backup.xml

@@ -19,8 +19,10 @@
             android:id="@+id/backup_name"
             android:id="@+id/backup_name"
             android:layout_width="0dp"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_height="match_parent"
-            android:layout_weight="2"
+            android:layout_weight="1.5"
             android:gravity="center"
             android:gravity="center"
+            android:singleLine="true"
+            android:ellipsize="end"
             android:textColor="?attr/colorTextPrimary"
             android:textColor="?attr/colorTextPrimary"
             android:textSize="@dimen/iscs_text_md" />
             android:textSize="@dimen/iscs_text_md" />
 
 

+ 1 - 1
data/src/main/java/com/grkj/data/config/ISCSConfig.kt

@@ -15,7 +15,7 @@ object ISCSConfig {
     /**
     /**
      * Debug模式
      * Debug模式
      */
      */
-    const val DEBUG: Boolean = false
+    const val DEBUG: Boolean = true
 
 
     /**
     /**
      * 是否在注册设备
      * 是否在注册设备

+ 33 - 17
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -73,43 +73,43 @@ interface JobTicketDao {
     /**
     /**
      * 根据作业票id删除作业票数据
      * 根据作业票id删除作业票数据
      */
      */
-    @Query("delete from is_job_ticket where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据作业票id删除作业票钥匙数据
      * 根据作业票id删除作业票钥匙数据
      */
      */
-    @Query("delete from is_job_ticket_key where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_key set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketKeyByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketKeyByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据作业票id删除作业票挂锁数据
      * 根据作业票id删除作业票挂锁数据
      */
      */
-    @Query("delete from is_job_ticket_lock where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_lock set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketLockByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketLockByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据作业票id删除作业票点位数据
      * 根据作业票id删除作业票点位数据
      */
      */
-    @Query("delete from is_job_ticket_points where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_points set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketPointsByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketPointsByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据作业票id删除作业票步骤数据
      * 根据作业票id删除作业票步骤数据
      */
      */
-    @Query("delete from is_job_ticket_step where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_step set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketStepByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketStepByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据作业票id删除作业票用户数据
      * 根据作业票id删除作业票用户数据
      */
      */
-    @Query("delete from is_job_ticket_user where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_user set del_flag = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketUserByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketUserByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
      * 根据用户id删除作业票用户数据
      * 根据用户id删除作业票用户数据
      */
      */
-    @Query("delete from is_job_ticket_user where user_id in (:userIds)")
+    @Query("update is_job_ticket_user set del_flag = 1 where user_id in (:userIds)")
     fun deleteJobTicketUserByUserIds(userIds: List<Long>)
     fun deleteJobTicketUserByUserIds(userIds: List<Long>)
 
 
     /**
     /**
@@ -129,6 +129,7 @@ interface JobTicketDao {
       remark
       remark
         FROM is_job_ticket ijt
         FROM is_job_ticket ijt
         WHERE (:isAdmin = 1 OR ex_status is NUll or ex_status NOT IN (:exStatusList))
         WHERE (:isAdmin = 1 OR ex_status is NUll or ex_status NOT IN (:exStatusList))
+        and ijt.del_flag = 0
         ORDER BY update_time DESC
         ORDER BY update_time DESC
         LIMIT :size OFFSET :offset
         LIMIT :size OFFSET :offset
     """
     """
@@ -207,6 +208,7 @@ interface JobTicketDao {
         remark
         remark
         from is_job_ticket ijt
         from is_job_ticket ijt
         where ticket_id = :ticketId
         where ticket_id = :ticketId
+        and ijt.del_flag = 0
     """
     """
     )
     )
     fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo?
     fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo?
@@ -350,7 +352,8 @@ interface JobTicketDao {
         "select count(1) from is_job_ticket where ticket_status in ('1','2','3','4','7') " +
         "select count(1) from is_job_ticket where ticket_status in ('1','2','3','4','7') " +
                 "AND (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " +
                 "AND (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " +
                 "AND (:modeId IS NULL OR trim(:modeId) = '' OR mode_id = :modeId) " +
                 "AND (:modeId IS NULL OR trim(:modeId) = '' OR mode_id = :modeId) " +
-                "AND (ex_status is NULL or ex_status not in (:exStatusList))"
+                "AND (ex_status is NULL or ex_status not in (:exStatusList)) " +
+                "and del_flag = 0"
     )
     )
     fun getInProgressJobSize(workstationId: Long?, modeId: Long?, exStatusList: List<String>): Int
     fun getInProgressJobSize(workstationId: Long?, modeId: Long?, exStatusList: List<String>): Int
 
 
@@ -359,7 +362,7 @@ interface JobTicketDao {
      */
      */
     @Query(
     @Query(
         """select count(1) from is_job_ticket ijt 
         """select count(1) from is_job_ticket ijt 
-            where ijt.ticket_status in (1,2,3,4,7) and (:isAdmin = 1 OR  ex_status is NUll or ex_status NOT IN (:exStatusList))
+            where ijt.ticket_status in (1,2,3,4,7) and (:isAdmin = 1 OR  ex_status is NUll or ex_status NOT IN (:exStatusList)) and ijt.del_flag = 0
         """
         """
     )
     )
     fun getInProgressJobSize(
     fun getInProgressJobSize(
@@ -371,7 +374,7 @@ interface JobTicketDao {
      * 获取所有作业数量
      * 获取所有作业数量
      */
      */
     @Query(
     @Query(
-        "select count(1) from is_job_ticket where (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " + "AND (:startTime IS NULL OR trim(:startTime) = '' OR (create_time >= :startTime OR update_time >= :startTime)) " + "AND (:endTime IS NULL OR trim(:endTime) = '' OR (create_time <= :endTime OR update_time <= :endTime)) "
+        "select count(1) from is_job_ticket where (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " + "AND (:startTime IS NULL OR trim(:startTime) = '' OR (create_time >= :startTime OR update_time >= :startTime)) " + "AND (:endTime IS NULL OR trim(:endTime) = '' OR (create_time <= :endTime OR update_time <= :endTime)) and del_flag = 0"
     )
     )
     fun getAllJobSize(workstationId: Long?, startTime: String?, endTime: String?): Int
     fun getAllJobSize(workstationId: Long?, startTime: String?, endTime: String?): Int
 
 
@@ -391,6 +394,7 @@ interface JobTicketDao {
         left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
         left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
         left join is_isolation_point iip on iip.point_id = ijtp.point_id
         left join is_isolation_point iip on iip.point_id = ijtp.point_id
         where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','5','7')
         where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','5','7')
+        and ijt.del_flag = 0
         order by ijtp.update_time desc
         order by ijtp.update_time desc
         limit :size offset :offset
         limit :size offset :offset
     """
     """
@@ -412,6 +416,7 @@ interface JobTicketDao {
         left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
         left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
         left join is_isolation_point iip on iip.point_id = ijtp.point_id
         left join is_isolation_point iip on iip.point_id = ijtp.point_id
         where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','5','7')
         where ijtp.point_status = "1" and ijt.ticket_status in ('1','2','3','4','5','7')
+        and ijt.del_flag = 0
         order by ijtp.update_time desc
         order by ijtp.update_time desc
     """
     """
     )
     )
@@ -442,6 +447,7 @@ interface JobTicketDao {
         and k.group_id = p.group_id
         and k.group_id = p.group_id
         and k.ticket_type = 0
         and k.ticket_type = 0
         and j.ticket_id != :ticketId
         and j.ticket_id != :ticketId
+        and j.del_flag = 0
         GROUP BY
         GROUP BY
         j.ticket_id
         j.ticket_id
     """
     """
@@ -488,6 +494,7 @@ interface JobTicketDao {
           AND p.point_id =:pointId
           AND p.point_id =:pointId
           AND p.lock_id = :lockId
           AND p.lock_id = :lockId
           AND p.ticket_id != :ticketId
           AND p.ticket_id != :ticketId
+          and t.del_flag = 0
     """
     """
     )
     )
     fun
     fun
@@ -516,7 +523,7 @@ interface JobTicketDao {
     /**
     /**
      * 获取所有进行中的作业
      * 获取所有进行中的作业
      */
      */
-    @Query("select * from is_job_ticket where ticket_status in ('1','2','3','4','7')")
+    @Query("select * from is_job_ticket where ticket_status in ('1','2','3','4','7') and del_flag = 0")
     fun getAllInProgressJob(): List<IsJobTicket>
     fun getAllInProgressJob(): List<IsJobTicket>
 
 
     /**
     /**
@@ -541,6 +548,7 @@ interface JobTicketDao {
         JOIN is_job_ticket        AS t
         JOIN is_job_ticket        AS t
           ON p.ticket_id = t.ticket_id
           ON p.ticket_id = t.ticket_id
         WHERE p.point_id IN (:workstationPointIds)
         WHERE p.point_id IN (:workstationPointIds)
+            and t.del_flag = 0
           -- 1) 最新已结束的那条
           -- 1) 最新已结束的那条
           AND p.update_time = (
           AND p.update_time = (
             SELECT MAX(p2.update_time)
             SELECT MAX(p2.update_time)
@@ -550,6 +558,7 @@ interface JobTicketDao {
             WHERE p2.point_id      = p.point_id
             WHERE p2.point_id      = p.point_id
               AND t2.ticket_status = 5
               AND t2.ticket_status = 5
               AND t2.ex_status is null
               AND t2.ex_status is null
+              and t2.del_flag = 0
           )
           )
           -- 2) 最新那条的状态必须是“上锁”
           -- 2) 最新那条的状态必须是“上锁”
           AND p.point_status  = 1
           AND p.point_status  = 1
@@ -562,6 +571,7 @@ interface JobTicketDao {
             WHERE p3.point_id      = p.point_id
             WHERE p3.point_id      = p.point_id
               AND t3.ticket_status <> 5
               AND t3.ticket_status <> 5
               AND t3.ex_status is null
               AND t3.ex_status is null
+              and t3.del_flag = 0
           )
           )
     """
     """
     )
     )
@@ -577,6 +587,7 @@ interface JobTicketDao {
         where ijtp.point_status = "1" 
         where ijtp.point_status = "1" 
         and ijt.ex_status is not null 
         and ijt.ex_status is not null 
         and ijtp.point_id in (:workstationPointIds)
         and ijtp.point_id in (:workstationPointIds)
+        and ijt.del_flag = 0
     """
     """
     )
     )
     fun getAllLockedPointDataWithExceptionJob(workstationPointIds: List<Long>): List<IsJobTicketPoints>
     fun getAllLockedPointDataWithExceptionJob(workstationPointIds: List<Long>): List<IsJobTicketPoints>
@@ -592,6 +603,7 @@ interface JobTicketDao {
         and ijt.ticket_status in ('1','2','3','4','7')
         and ijt.ticket_status in ('1','2','3','4','7')
         and (:selectedWorkflowMode IS NULL OR trim(:selectedWorkflowMode) = '' OR ijt.mode_id=:selectedWorkflowMode)
         and (:selectedWorkflowMode IS NULL OR trim(:selectedWorkflowMode) = '' OR ijt.mode_id=:selectedWorkflowMode)
         and (:realTimeDataZoneId IS NULL OR trim(:realTimeDataZoneId) = '' OR ijt.workstation_id = :realTimeDataZoneId)
         and (:realTimeDataZoneId IS NULL OR trim(:realTimeDataZoneId) = '' OR ijt.workstation_id = :realTimeDataZoneId)
+        and ijt.del_flag = 0
         group by ijtp.point_id
         group by ijtp.point_id
     """
     """
     )
     )
@@ -607,6 +619,7 @@ interface JobTicketDao {
         where ijt.ticket_status in ('1','2','3','4','7')
         where ijt.ticket_status in ('1','2','3','4','7')
         and (:workflowModeId IS NULL OR trim(:workflowModeId) = '' OR ijt.mode_id = :workflowModeId)
         and (:workflowModeId IS NULL OR trim(:workflowModeId) = '' OR ijt.mode_id = :workflowModeId)
         and (:workstationId IS NULL OR trim(:workstationId) = '' OR ijt.workstation_id = :workstationId)
         and (:workstationId IS NULL OR trim(:workstationId) = '' OR ijt.workstation_id = :workstationId)
+        and ijt.del_flag = 0
         group by ijtp.lock_id
         group by ijtp.lock_id
     """
     """
     )
     )
@@ -615,7 +628,7 @@ interface JobTicketDao {
     /**
     /**
      * 根据sopId获取作业
      * 根据sopId获取作业
      */
      */
-    @Query("select * from is_job_ticket where sop_id in (:sopIds)")
+    @Query("select * from is_job_ticket where sop_id in (:sopIds) and del_flag = 0")
     fun getTicketBySopIds(sopIds: List<Long>): List<IsJobTicket>
     fun getTicketBySopIds(sopIds: List<Long>): List<IsJobTicket>
 
 
     /**
     /**
@@ -627,6 +640,7 @@ interface JobTicketDao {
         from is_job_ticket ijt
         from is_job_ticket ijt
         left join is_job_ticket_points ijtp on ijt.ticket_id = ijtp.ticket_id
         left join is_job_ticket_points ijtp on ijt.ticket_id = ijtp.ticket_id
         where ijtp.point_id in (:pointIds) and ijtp.ticket_id != :ticketId and ijt.ticket_status in ('1','2','3','4','7')
         where ijtp.point_id in (:pointIds) and ijtp.ticket_id != :ticketId and ijt.ticket_status in ('1','2','3','4','7')
+        and ijt.del_flag = 0
     """
     """
     )
     )
     fun getProgressTicketIdsByPointsAndExceptTicketId(
     fun getProgressTicketIdsByPointsAndExceptTicketId(
@@ -674,7 +688,7 @@ interface JobTicketDao {
     /**
     /**
      * 根据作业id删除分组
      * 根据作业id删除分组
      */
      */
-    @Query("delete from is_job_ticket_group where ticket_id in (:ticketIds)")
+    @Query("update is_job_ticket_group set deleted = 1 where ticket_id in (:ticketIds)")
     fun deleteJobTicketGroupByTicketIds(ticketIds: List<Long>)
     fun deleteJobTicketGroupByTicketIds(ticketIds: List<Long>)
 
 
     /**
     /**
@@ -697,6 +711,7 @@ interface JobTicketDao {
                 su.user_id = :userId         -- 是创建者
                 su.user_id = :userId         -- 是创建者
              OR ijtu.user_id = :userId       -- 是参与人
              OR ijtu.user_id = :userId       -- 是参与人
           )
           )
+          and ijt.del_flag = 0
     """
     """
     )
     )
     fun getTicketThatUserJoin(userId: Long): List<IsJobTicket>
     fun getTicketThatUserJoin(userId: Long): List<IsJobTicket>
@@ -737,7 +752,7 @@ interface JobTicketDao {
     /**
     /**
      * 检查sop是否有进行中的作业
      * 检查sop是否有进行中的作业
      */
      */
-    @Query("select count(1) from is_job_ticket where sop_id = :sopId and ticket_status in ('1','2','3','4','7')")
+    @Query("select count(1) from is_job_ticket where sop_id = :sopId and ticket_status in ('1','2','3','4','7') and del_flag = 0")
     fun checkSopHasJobInProgress(sopId: Long): Int
     fun checkSopHasJobInProgress(sopId: Long): Int
 
 
     /**
     /**
@@ -802,6 +817,7 @@ interface JobTicketDao {
         select * from is_job_ticket_points ijtp
         select * from is_job_ticket_points ijtp
         left join is_job_ticket ijt on ijtp.ticket_id = ijt.ticket_id
         left join is_job_ticket ijt on ijtp.ticket_id = ijt.ticket_id
         where ijt.ticket_status in ('1','2','3','4','7')
         where ijt.ticket_status in ('1','2','3','4','7')
+        and ijt.del_flag = 0
     """
     """
     )
     )
     fun getAllInUsePoints(): List<IsJobTicketPoints>
     fun getAllInUsePoints(): List<IsJobTicketPoints>
@@ -809,19 +825,19 @@ interface JobTicketDao {
     /**
     /**
      * 检查用户是否在作业中
      * 检查用户是否在作业中
      */
      */
-    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_user ijtu on ijt.ticket_id = ijtu.ticket_id left join sys_user su on ijt.create_by = su.user_name where (su.user_id in (:userIds) or ijtu.user_id in (:userIds)) and ijt.ticket_status in ('1','2','3','4','7') ")
+    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_user ijtu on ijt.ticket_id = ijtu.ticket_id left join sys_user su on ijt.create_by = su.user_name where (su.user_id in (:userIds) or ijtu.user_id in (:userIds)) and ijt.ticket_status in ('1','2','3','4','7') and ijt.del_flag = 0")
     fun checkUserInProgressJob(userIds: List<Long>): Int
     fun checkUserInProgressJob(userIds: List<Long>): Int
 
 
     /**
     /**
      * 检查挂锁是否在使用
      * 检查挂锁是否在使用
      */
      */
-    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_points ijtp on ijt.ticket_id = ijtp.ticket_id where ijtp.lock_id in (:lockIds) and ijt.ticket_status in ('1','2','3','4','7')")
+    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_points ijtp on ijt.ticket_id = ijtp.ticket_id where ijtp.lock_id in (:lockIds) and ijt.ticket_status in ('1','2','3','4','7') and ijt.del_flag = 0")
     fun checkLockInUse(lockIds: List<Long>): Int
     fun checkLockInUse(lockIds: List<Long>): Int
 
 
     /**
     /**
      * 检查钥匙是否在使用
      * 检查钥匙是否在使用
      */
      */
-    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_key ijtk on ijt.ticket_id = ijtk.ticket_id where ijtk.key_id in (:keyIds) and ijtk.collect_time is not null and ijtk.give_back_time is null and ijt.ticket_status in ('1','2','3','4','7')")
+    @Query("select count(1) from is_job_ticket ijt left join is_job_ticket_key ijtk on ijt.ticket_id = ijtk.ticket_id where ijtk.key_id in (:keyIds) and ijtk.collect_time is not null and ijtk.give_back_time is null and ijt.ticket_status in ('1','2','3','4','7') and ijt.del_flag = 0")
     fun checkKeyInUse(keyIds: List<Long>): Int
     fun checkKeyInUse(keyIds: List<Long>): Int
 
 
     /**
     /**

+ 2 - 0
data/src/main/java/com/grkj/data/dao/UserDao.kt

@@ -65,6 +65,7 @@ interface UserDao {
       su.user_id                         AS userId,
       su.user_id                         AS userId,
       su.nick_name                       AS nickName,
       su.nick_name                       AS nickName,
       su.user_name                       AS userName,
       su.user_name                       AS userName,
+      su.password,
               su.avatar,
               su.avatar,
 
 
       -- 聚合所有卡号(如果没卡则结果里 cardCodes 会是 NULL 或空)
       -- 聚合所有卡号(如果没卡则结果里 cardCodes 会是 NULL 或空)
@@ -180,6 +181,7 @@ interface UserDao {
           su.user_id                         AS userId,
           su.user_id                         AS userId,
           su.nick_name                       AS nickName,
           su.nick_name                       AS nickName,
           su.user_name                       AS userName,
           su.user_name                       AS userName,
+          su.password,
               su.avatar,
               su.avatar,
     
     
           -- 聚合所有卡号(如果没卡则结果里 cardCodes 会是 NULL 或空)
           -- 聚合所有卡号(如果没卡则结果里 cardCodes 会是 NULL 或空)

+ 1 - 1
data/src/main/java/com/grkj/data/hardware/ble/BleUtil.kt

@@ -49,7 +49,7 @@ class BleUtil private constructor() {
             if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
             if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
                 //Android 12及以上不允许添加过滤器
                 //Android 12及以上不允许添加过滤器
                 val bleScanRuleConfig = BleScanRuleConfig.Builder()
                 val bleScanRuleConfig = BleScanRuleConfig.Builder()
-                    .setScanTimeOut(6_000L)
+                    .setScanTimeOut(10_000L)
                     .setDeviceName(BleConst.BLE_LOCAL_NAME)
                     .setDeviceName(BleConst.BLE_LOCAL_NAME)
                     .apply {
                     .apply {
                         BleScanRuleConfig.Builder().setScanSettings(ScanSettings.Builder().apply {
                         BleScanRuleConfig.Builder().setScanSettings(ScanSettings.Builder().apply {

+ 1 - 1
data/src/main/java/com/grkj/data/hardware/modbus/ModBusHardwareHelper.kt

@@ -204,7 +204,7 @@ class ModBusHardwareHelper : IHardwareHelper {
         done: ((ByteArray) -> Unit)?
         done: ((ByteArray) -> Unit)?
     ) {
     ) {
         ModBusController.controlKeyBuckle(
         ModBusController.controlKeyBuckle(
-            true,
+            isOpen,
             mac, done
             mac, done
         )
         )
     }
     }

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

@@ -144,16 +144,16 @@ class HardwareLogic @Inject constructor(
                             it.lockId !in isJobTicketPoints.filter { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
                             it.lockId !in isJobTicketPoints.filter { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
                                 .mapNotNull { it.lockId }
                                 .mapNotNull { it.lockId }
                         }
                         }
-                    logger.debug("作业票挂锁信息:${isJobTicketLock.toJson()}-${MainDomainData.deviceTakeTicketGroupBound[ticketId]}")
+                    logger.info("作业票挂锁信息:${isJobTicketLock.toJson()}-${MainDomainData.deviceTakeTicketGroupBound[ticketId]}")
                     val emptyTicketLockInfo =
                     val emptyTicketLockInfo =
-                        isJobTicketLock.first { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
-                    logger.debug("取出的挂锁信息:${lockTakeInfo.toJson()}")
+                        isJobTicketLock.firstOrNull { it.groupId == MainDomainData.deviceTakeTicketGroupBound[ticketId] }
+                    logger.info("取出的挂锁信息:${lockTakeInfo.toJson()}")
                     lockTakeInfo.lockNfc?.let {
                     lockTakeInfo.lockNfc?.let {
                         val lockInfo = getLockInfo(it)
                         val lockInfo = getLockInfo(it)
                         lockInfo?.lockId?.let { lockId ->
                         lockInfo?.lockId?.let { lockId ->
-                            emptyTicketLockInfo.lockNfc = it
-                            emptyTicketLockInfo.lockId = lockId
-                            emptyTicketLockInfo.updateTime =
+                            emptyTicketLockInfo?.lockNfc = it
+                            emptyTicketLockInfo?.lockId = lockId
+                            emptyTicketLockInfo?.updateTime =
                                 TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                                 TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                             val isJobTicketLock = BeanUtils.copyProperties(
                             val isJobTicketLock = BeanUtils.copyProperties(
                                 emptyTicketLockInfo,
                                 emptyTicketLockInfo,

+ 3 - 2
data/src/main/java/com/grkj/data/logic/impl/standard/JobTicketLogic.kt

@@ -123,6 +123,7 @@ class JobTicketLogic @Inject constructor(
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers.flatten())
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers.flatten())
         jobTicketDao.saveIsJobTicketUser(ticketColockerUsers)
         jobTicketDao.saveIsJobTicketUser(ticketColockerUsers)
         val ticketLocks = mutableListOf<IsJobTicketLock>().apply {
         val ticketLocks = mutableListOf<IsJobTicketLock>().apply {
+            logger.info("点位信息:${ticketPointSaveData}")
             ticketPointSaveData.forEach { point ->
             ticketPointSaveData.forEach { point ->
                 val isJobTicketLock = IsJobTicketLock()
                 val isJobTicketLock = IsJobTicketLock()
                 isJobTicketLock.ticketId = ticketId
                 isJobTicketLock.ticketId = ticketId
@@ -702,13 +703,13 @@ class JobTicketLogic @Inject constructor(
         val jobTicketKeyDataList =
         val jobTicketKeyDataList =
             BeanUtils.copyList(ticketKeyData, TicketDetailRes.JobTicketKeyVO::class.java)
             BeanUtils.copyList(ticketKeyData, TicketDetailRes.JobTicketKeyVO::class.java)
         ticketDetailRes?.ticketKeyVOList =
         ticketDetailRes?.ticketKeyVOList =
-            jobTicketKeyDataList?.filterIsInstance<TicketDetailRes.JobTicketKeyVO>() as MutableList<TicketDetailRes.JobTicketKeyVO>?
+            jobTicketKeyDataList as MutableList<TicketDetailRes.JobTicketKeyVO>?
         //填充挂锁数据
         //填充挂锁数据
         val ticketLockData = getJobTicketLockDataByTicketId(ticketId)
         val ticketLockData = getJobTicketLockDataByTicketId(ticketId)
         val jobTicketLockDataList =
         val jobTicketLockDataList =
             BeanUtils.copyList(ticketLockData, TicketDetailRes.JobTicketLockVO::class.java)
             BeanUtils.copyList(ticketLockData, TicketDetailRes.JobTicketLockVO::class.java)
         ticketDetailRes?.ticketLockVOList =
         ticketDetailRes?.ticketLockVOList =
-            jobTicketLockDataList?.filterIsInstance<TicketDetailRes.JobTicketLockVO>() as MutableList<TicketDetailRes.JobTicketLockVO>?
+            jobTicketLockDataList as MutableList<TicketDetailRes.JobTicketLockVO>?
         //填充用户数据
         //填充用户数据
         val ticketUserData = getJobTicketUserDataByTicketId(ticketId)
         val ticketUserData = getJobTicketUserDataByTicketId(ticketId)
         val jobTicketUserDataList =
         val jobTicketUserDataList =

+ 2 - 0
data/src/main/java/com/grkj/data/logic/impl/standard/UserLogic.kt

@@ -409,6 +409,7 @@ class UserLogic @Inject constructor(
     override fun addUserData(addUserDataVo: AddUserDataVo): Long {
     override fun addUserData(addUserDataVo: AddUserDataVo): Long {
         val sysUserDo = SysUserDo()
         val sysUserDo = SysUserDo()
         sysUserDo.userName = addUserDataVo.username
         sysUserDo.userName = addUserDataVo.username
+        sysUserDo.password = addUserDataVo.password
         sysUserDo.nickName = addUserDataVo.nickname
         sysUserDo.nickName = addUserDataVo.nickname
         sysUserDo.status = if (addUserDataVo.status) "0" else "2"
         sysUserDo.status = if (addUserDataVo.status) "0" else "2"
         sysUserDo.delFlag = "0"
         sysUserDo.delFlag = "0"
@@ -423,6 +424,7 @@ class UserLogic @Inject constructor(
         val sysUserDo = SysUserDo()
         val sysUserDo = SysUserDo()
         sysUserDo.userId = userDataVo.userId
         sysUserDo.userId = userDataVo.userId
         sysUserDo.userName = userDataVo.username
         sysUserDo.userName = userDataVo.username
+        sysUserDo.password = userDataVo.password
         sysUserDo.nickName = userDataVo.nickname
         sysUserDo.nickName = userDataVo.nickname
         sysUserDo.status = if (userDataVo.status) "0" else "2"
         sysUserDo.status = if (userDataVo.status) "0" else "2"
         sysUserDo.delFlag = "0"
         sysUserDo.delFlag = "0"

+ 1 - 0
data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt

@@ -6,6 +6,7 @@ package com.grkj.data.model.vo
 data class AddUserDataVo(
 data class AddUserDataVo(
     val username: String,
     val username: String,
     val nickname: String,
     val nickname: String,
+    val password: String,
     val cardCode: String?,
     val cardCode: String?,
     val roleId: List<Long>,
     val roleId: List<Long>,
     val workstationId: List<Long>?,
     val workstationId: List<Long>?,

+ 4 - 0
data/src/main/java/com/grkj/data/model/vo/IsJobTicketPointsDataVo.kt

@@ -10,4 +10,8 @@ class IsJobTicketPointsDataVo : IsJobTicketPoints() {
     var pointFunction: String? = ""
     var pointFunction: String? = ""
     var groupName: String? = ""
     var groupName: String? = ""
     var lockerName: String? = ""
     var lockerName: String? = ""
+    override fun toString(): String {
+        return "IsJobTicketPointsDataVo(parent(${super.toString()}),pointName=$pointName, pointFunction=$pointFunction, groupName=$groupName, lockerName=$lockerName)"
+    }
+
 }
 }

+ 1 - 1
data/src/main/java/com/grkj/data/model/vo/PointManageVo.kt

@@ -17,7 +17,7 @@ class PointManageVo {
     var pointStatus: String? = null
     var pointStatus: String? = null
 
 
     @Ignore
     @Ignore
-    var lockId: Long = 0
+    var lockId: Long? = null
 
 
     @Ignore
     @Ignore
     var isSelected: Boolean = false
     var isSelected: Boolean = false

+ 1 - 0
data/src/main/java/com/grkj/data/model/vo/UpdateUserDataVo.kt

@@ -6,6 +6,7 @@ package com.grkj.data.model.vo
 data class UpdateUserDataVo(
 data class UpdateUserDataVo(
     val userId: Long,
     val userId: Long,
     val username: String,
     val username: String,
+    val password: String,
     val nickname: String,
     val nickname: String,
     val cardCode: String,
     val cardCode: String,
     val roleId: List<Long>,
     val roleId: List<Long>,

+ 2 - 0
data/src/main/java/com/grkj/data/model/vo/UserManageVo.kt

@@ -1,6 +1,7 @@
 package com.grkj.data.model.vo
 package com.grkj.data.model.vo
 
 
 import androidx.room.Ignore
 import androidx.room.Ignore
+import com.grkj.shared.utils.BCryptUtils
 
 
 /**
 /**
  * 用户管理显示
  * 用户管理显示
@@ -9,6 +10,7 @@ class UserManageVo {
     var userId: Long = 0
     var userId: Long = 0
     var nickName: String = ""
     var nickName: String = ""
     var userName: String = ""
     var userName: String = ""
+    var password: String = BCryptUtils.encryptPassword("123456")
     var avatar: String? = null
     var avatar: String? = null
     var cardCodes: List<String?> = listOf()
     var cardCodes: List<String?> = listOf()
     var roleIds: List<Long?> = listOf()
     var roleIds: List<Long?> = listOf()

+ 2 - 0
ui-base/src/main/java/com/grkj/ui_base/business/HardwareBusinessManager.kt

@@ -156,6 +156,7 @@ object HardwareBusinessManager {
             DeviceConst.DEVICE_TYPE_KEY -> {
             DeviceConst.DEVICE_TYPE_KEY -> {
                 mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_KEY && it.nfc == deviceTakeUpdateBO.nfc }
                 mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_KEY && it.nfc == deviceTakeUpdateBO.nfc }
                     ?.let { info ->
                     ?.let { info ->
+                        logger.info("钥匙设备数据:${info}")
                         if (mDeviceTakeList.any { it.deviceType == DeviceConst.DEVICE_TYPE_LOCK && it.ticketId == info.ticketId }) {
                         if (mDeviceTakeList.any { it.deviceType == DeviceConst.DEVICE_TYPE_LOCK && it.ticketId == info.ticketId }) {
                             BleSendDispatcher.scheduleDisconnect(getKeyMacByRfid(info.nfc), 60_000)
                             BleSendDispatcher.scheduleDisconnect(getKeyMacByRfid(info.nfc), 60_000)
                             logger.info("存在未取出的挂锁,不继续操作")
                             logger.info("存在未取出的挂锁,不继续操作")
@@ -187,6 +188,7 @@ object HardwareBusinessManager {
             DeviceConst.DEVICE_TYPE_LOCK -> {
             DeviceConst.DEVICE_TYPE_LOCK -> {
                 mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_LOCK && it.nfc == deviceTakeUpdateBO.nfc }
                 mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_LOCK && it.nfc == deviceTakeUpdateBO.nfc }
                     ?.let { info ->
                     ?.let { info ->
+                        logger.info("挂锁设备数据:${info}")
                         LogicManager.hardwareLogic.updateLockTake(
                         LogicManager.hardwareLogic.updateLockTake(
                             mutableListOf(
                             mutableListOf(
                                 LockTakeUpdateReq(
                                 LockTakeUpdateReq(