Bläddra i källkod

refactor(更新)
- 用户管理完成
- 角色管理除添加完成

周文健 5 månader sedan
förälder
incheckning
9bf15f9e29
96 ändrade filer med 1870 tillägg och 268 borttagningar
  1. 1 1
      app/build.gradle.kts
  2. 0 4
      app/src/main/java/com/grkj/iscs/ISCSApplication.kt
  3. 1 1
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  4. 1 1
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  5. 3 5
      app/src/main/java/com/grkj/iscs/features/login/viewmodel/LoginViewModel.kt
  6. 1 1
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  7. 19 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  8. 49 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  9. 53 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterRoleDialog.kt
  10. 6 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt
  11. 44 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UserDetailDialog.kt
  12. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataManageHomeFragment.kt
  13. 144 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  14. 79 39
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  15. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt
  16. 51 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/RoleManageViewModel.kt
  17. 38 7
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/UserManageViewModel.kt
  18. 8 0
      app/src/main/res/drawable/bg_text_drop_down.xml
  19. 1 1
      app/src/main/res/layout/dialog_add_user.xml
  20. 2 2
      app/src/main/res/layout/dialog_drop_down_list.xml
  21. 174 0
      app/src/main/res/layout/dialog_filter_role.xml
  22. 1 1
      app/src/main/res/layout/dialog_filter_user.xml
  23. 232 0
      app/src/main/res/layout/dialog_user_detail.xml
  24. 155 0
      app/src/main/res/layout/fragment_role_manage.xml
  25. 1 0
      app/src/main/res/layout/fragment_user_manage.xml
  26. 1 1
      app/src/main/res/layout/item_home_text_drop_down.xml
  27. 41 0
      app/src/main/res/layout/item_role_manage_role.xml
  28. 7 0
      app/src/main/res/navigation/nav_data_manage.xml
  29. 10 0
      app/src/main/res/values-en/strings.xml
  30. 10 0
      app/src/main/res/values-zh/strings.xml
  31. 10 0
      app/src/main/res/values/strings.xml
  32. 0 1
      data/build.gradle.kts
  33. 21 0
      data/src/main/java/com/grkj/data/converters/Converters.kt
  34. 9 0
      data/src/main/java/com/grkj/data/dao/HardwareDao.kt
  35. 70 0
      data/src/main/java/com/grkj/data/dao/RoleDao.kt
  36. 64 24
      data/src/main/java/com/grkj/data/dao/UserDao.kt
  37. 31 0
      data/src/main/java/com/grkj/data/dao/WorkstationDao.kt
  38. 11 5
      data/src/main/java/com/grkj/data/database/ISCSDatabase.kt
  39. 3 2
      data/src/main/java/com/grkj/data/model/dos/BaseBean.kt
  40. 3 3
      data/src/main/java/com/grkj/data/model/dos/IsJobCardDo.kt
  41. 16 0
      data/src/main/java/com/grkj/data/model/dos/IsUserWorkstation.kt
  42. 37 0
      data/src/main/java/com/grkj/data/model/dos/IsWorkstation.kt
  43. 1 1
      data/src/main/java/com/grkj/data/model/dos/SysRole.kt
  44. 1 1
      data/src/main/java/com/grkj/data/model/dos/SysUserCharacteristicDo.kt
  45. 8 7
      data/src/main/java/com/grkj/data/model/dos/SysUserDo.kt
  46. 2 2
      data/src/main/java/com/grkj/data/model/dos/SysUserRole.kt
  47. 1 1
      data/src/main/java/com/grkj/data/model/local/DeviceTakeUpdate.kt
  48. 1 1
      data/src/main/java/com/grkj/data/model/local/LoginMenuEntity.kt
  49. 1 1
      data/src/main/java/com/grkj/data/model/local/LoginUser.kt
  50. 1 1
      data/src/main/java/com/grkj/data/model/local/TabConfig.kt
  51. 1 1
      data/src/main/java/com/grkj/data/model/local/UpdateKeyReturn.kt
  52. 1 1
      data/src/main/java/com/grkj/data/model/local/WorkTicketGet.kt
  53. 1 1
      data/src/main/java/com/grkj/data/model/local/WorkTicketSend.kt
  54. 1 1
      data/src/main/java/com/grkj/data/model/req/LockPointUpdateReq.kt
  55. 1 1
      data/src/main/java/com/grkj/data/model/req/LockTakeUpdateReq.kt
  56. 1 1
      data/src/main/java/com/grkj/data/model/res/CabinetSlotsRes.kt
  57. 1 1
      data/src/main/java/com/grkj/data/model/res/CommonDictRes.kt
  58. 1 1
      data/src/main/java/com/grkj/data/model/res/KeyInfoRes.kt
  59. 1 1
      data/src/main/java/com/grkj/data/model/res/KeyPageRes.kt
  60. 1 1
      data/src/main/java/com/grkj/data/model/res/LockInfoRes.kt
  61. 1 1
      data/src/main/java/com/grkj/data/model/res/LockPageRes.kt
  62. 1 1
      data/src/main/java/com/grkj/data/model/res/StepDetailRes.kt
  63. 1 1
      data/src/main/java/com/grkj/data/model/res/SystemAttributePageRes.kt
  64. 1 1
      data/src/main/java/com/grkj/data/model/res/TicketDetailRes.kt
  65. 1 1
      data/src/main/java/com/grkj/data/model/res/UserInfoRes.kt
  66. 3 3
      data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt
  67. 10 0
      data/src/main/java/com/grkj/data/model/vo/RoleManageFilterVo.kt
  68. 25 0
      data/src/main/java/com/grkj/data/model/vo/RoleManageVo.kt
  69. 2 2
      data/src/main/java/com/grkj/data/model/vo/UserManageFilterVo.kt
  70. 5 5
      data/src/main/java/com/grkj/data/model/vo/UserManageVo.kt
  71. 14 9
      data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt
  72. 38 0
      data/src/main/java/com/grkj/data/repository/IRoleRepository.kt
  73. 2 2
      data/src/main/java/com/grkj/data/repository/IStepRepository.kt
  74. 2 2
      data/src/main/java/com/grkj/data/repository/ITicketRepository.kt
  75. 16 4
      data/src/main/java/com/grkj/data/repository/IUserRepository.kt
  76. 23 0
      data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt
  77. 0 16
      data/src/main/java/com/grkj/data/repository/StepRepository.kt
  78. 0 16
      data/src/main/java/com/grkj/data/repository/TicketRepository.kt
  79. 32 9
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt
  80. 59 0
      data/src/main/java/com/grkj/data/repository/impl/RoleRepository.kt
  81. 25 0
      data/src/main/java/com/grkj/data/repository/impl/StepRepository.kt
  82. 25 0
      data/src/main/java/com/grkj/data/repository/impl/TicketRepository.kt
  83. 31 6
      data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt
  84. 38 0
      data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt
  85. 0 1
      domain/.gitignore
  86. 0 18
      domain/build.gradle.kts
  87. 0 1
      settings.gradle.kts
  88. 1 0
      shared/build.gradle.kts
  89. 43 0
      shared/src/main/java/com/grkj/shared/utils/PinyinUtil.kt
  90. 0 1
      sync/build.gradle.kts
  91. 3 0
      ui-base/src/main/java/com/grkj/ui_base/base/BaseViewModel.kt
  92. 14 14
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  93. 5 5
      ui-base/src/main/java/com/grkj/ui_base/business/DataBusiness.kt
  94. 5 5
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  95. 5 5
      ui-base/src/main/java/com/grkj/ui_base/utils/SPUtils.kt
  96. 3 3
      ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

+ 1 - 1
app/build.gradle.kts

@@ -83,11 +83,11 @@ dependencies {
     implementation(libs.kotlinx.serialization.json)
     implementation(libs.sik.camera)
     implementation("com.github.loper7:DateTimePicker:0.6.3")
+    implementation("io.github.amrdeveloper:treeview:1.2.0")
     implementation(project(":sync"))
     implementation(project(":ui-base"))
     implementation(project(":data"))
     implementation(project(":shared"))
-    implementation(project(":domain"))
     testImplementation(libs.junit)
     androidTestImplementation(libs.androidx.junit)
     androidTestImplementation(libs.androidx.espresso.core)

+ 0 - 4
app/src/main/java/com/grkj/iscs/ISCSApplication.kt

@@ -39,10 +39,6 @@ class ISCSApplication : Application() {
                 context: Context,
                 layout: RefreshLayout
             ): RefreshHeader {
-                layout.setPrimaryColorsId(
-                    com.grkj.ui_base.R.color.common_tip_dialog_info,
-                    R.color.white
-                ) //全局设置主题颜色
                 return ClassicsHeader(context) //.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header
             }
         })

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt

@@ -16,7 +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.MainDomainData
-import com.grkj.domain.entity.local.LoginMenuEntity
+import com.grkj.data.model.local.LoginMenuEntity
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityLoginBinding
 import com.grkj.iscs.databinding.ItemLoginMethodBinding

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -3,7 +3,7 @@ package com.grkj.iscs.features.login.dialog
 import android.graphics.Bitmap
 import android.view.View
 import androidx.lifecycle.LifecycleOwner
-import com.grkj.domain.entity.res.UserInfoRes
+import com.grkj.data.model.res.UserInfoRes
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogLoginBinding
 import com.grkj.iscs.features.login.viewmodel.LoginViewModel

+ 3 - 5
app/src/main/java/com/grkj/iscs/features/login/viewmodel/LoginViewModel.kt

@@ -1,19 +1,17 @@
 package com.grkj.iscs.features.login.viewmodel
 
-import android.graphics.Bitmap
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.data.repository.UserRepository
-import com.grkj.domain.repository.IUserRepository
+import com.grkj.data.repository.impl.UserRepository
+import com.grkj.data.repository.IUserRepository
 import com.grkj.ui_base.base.BaseViewModel
-import com.grkj.ui_base.utils.event.LoadingEvent
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 登录界面模型
  */
 class LoginViewModel : BaseViewModel() {
-    private val userRepository: IUserRepository by lazy { UserRepository() }
+    private val userRepository: IUserRepository by lazy { UserRepository.instance }
 
     /**
      * 用户名登录

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -5,7 +5,7 @@ import android.view.View
 import androidx.core.view.get
 import androidx.core.view.isNotEmpty
 import com.grkj.data.data.MainDomainData
-import com.grkj.domain.entity.local.TabConfig
+import com.grkj.data.model.local.TabConfig
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityMainBinding
 import com.grkj.ui_base.base.BaseActivity

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

@@ -26,7 +26,7 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
 
     override fun onViewCreated(contentView: View) {
         super.onViewCreated(contentView)
-        setBackgroundView(null)
+        setBackground(null)
         binding = DialogDropDownListBinding.bind(contentView)
         binding.dropDownRv.linear().setup {
             addType<TextDropDownEntity>(R.layout.item_home_text_drop_down)
@@ -71,9 +71,27 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
      * 文本下拉弹窗数据实体接口
      */
     interface TextDropDownEntity {
+        /**
+         * 获取数据id
+         */
+        fun getId(): Long
+
         /**
          * 获取展示文本
          */
         fun getShowText(): String
     }
+
+    /**
+     * 简易结构
+     */
+    class SimpleTextDropDownEntity(var dataId: Long = 0, var dataText: String = "") : TextDropDownEntity {
+        override fun getId(): Long {
+            return dataId
+        }
+
+        override fun getShowText(): String {
+            return dataText
+        }
+    }
 }

+ 49 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/AddUserDialog.kt → app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt

@@ -1,10 +1,11 @@
-package com.grkj.iscs.features.main.dialog
+package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.content.Context
 import android.view.View
-import com.grkj.domain.entity.vo.AddUserDataVo
+import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddUserBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.ui_base.utils.extension.tipDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import razerdp.basepopup.BasePopupWindow
@@ -14,15 +15,38 @@ import razerdp.basepopup.BasePopupWindow
  */
 class AddUserDialog(context: Context) : BasePopupWindow(context) {
     private lateinit var binding: DialogAddUserBinding
+    private var textDropDownDialog: TextDropDownDialog
+    private var roleData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
+    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
+    private var selectedRoleData: TextDropDownDialog.TextDropDownEntity? = null
+    private var selectedWorkstationData: TextDropDownDialog.TextDropDownEntity? = null
     private var onConfirm: (AddUserDataVo) -> Unit = {}
 
     init {
         setContentView(R.layout.dialog_add_user)
+        textDropDownDialog = TextDropDownDialog(context)
+        textDropDownDialog.setWidthAsAnchorView(true)
     }
 
     override fun onViewCreated(contentView: View) {
         super.onViewCreated(contentView)
         binding = DialogAddUserBinding.bind(contentView)
+        binding.roleTv.setOnClickListener {
+            textDropDownDialog.setData(roleData)
+            textDropDownDialog.setOnItemSelectListener {
+                selectedRoleData = it
+                binding.roleTv.text = it.getShowText()
+            }
+            textDropDownDialog.showPopupWindow(binding.roleTv)
+        }
+        binding.workstationNameTv.setOnClickListener {
+            textDropDownDialog.setData(workstationData)
+            textDropDownDialog.setOnItemSelectListener {
+                selectedWorkstationData = it
+                binding.workstationNameTv.text = it.getShowText()
+            }
+            textDropDownDialog.showPopupWindow(binding.workstationNameTv)
+        }
         binding.cancel.setOnClickListener { dismiss() }
         binding.closeIv.setOnClickListener { dismiss() }
         binding.confirm.setOnClickListener {
@@ -30,11 +54,17 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
                 val addUserData = AddUserDataVo(
                     binding.nicknameEt.text.toString(),
                     binding.cardcodeEt.text.toString(),
-                    binding.roleTv.text.toString(),
-                    binding.areaTv.text.toString(),
+                    selectedRoleData?.getId() ?: 0,
+                    selectedWorkstationData?.getId() ?: 0,
                     binding.statusRg.checkedRadioButtonId == binding.activateRb.id
                 )
                 onConfirm(addUserData)
+                binding.nicknameEt.setText("")
+                binding.cardcodeEt.setText("")
+                binding.roleTv.text = ""
+                binding.workstationNameTv.text = ""
+                binding.activateRb.isChecked = false
+                binding.deactivateRb.isChecked = false
                 dismiss()
             }
         }
@@ -56,7 +86,7 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
             PopTip.build().tipDialog(R.string.please_select_role)
             return false
         }
-        if (binding.areaTv.text.trim().toString().isEmpty()) {
+        if (binding.workstationNameTv.text.trim().toString().isEmpty()) {
             PopTip.build().tipDialog(R.string.please_select_area)
             return false
         }
@@ -67,6 +97,20 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
         return true
     }
 
+    /**
+     * 设置角色数据
+     */
+    fun setRoleData(roleData: List<TextDropDownDialog.TextDropDownEntity>) {
+        this.roleData = roleData
+    }
+
+    /**
+     * 设置岗位数据
+     */
+    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
+        this.workstationData = workstationData
+    }
+
     /**
      * 设置确认监听
      */

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

@@ -0,0 +1,53 @@
+package com.grkj.iscs.features.main.dialog.data_manage
+
+import android.content.Context
+import android.view.View
+import com.grkj.data.model.vo.RoleManageFilterVo
+import com.grkj.data.model.vo.UserManageFilterVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogFilterRoleBinding
+import com.grkj.iscs.databinding.DialogFilterUserBinding
+import razerdp.basepopup.BasePopupWindow
+
+/**
+ * 筛选角色
+ */
+class FilterRoleDialog(context: Context) : BasePopupWindow(context) {
+    private var onConfirm: (RoleManageFilterVo) -> Unit = {}
+    private lateinit var binding: DialogFilterRoleBinding
+
+    init {
+        setContentView(R.layout.dialog_filter_role)
+    }
+
+    override fun onViewCreated(contentView: View) {
+        super.onViewCreated(contentView)
+        binding = DialogFilterRoleBinding.bind(contentView)
+        binding.closeIv.setOnClickListener { dismiss() }
+        binding.confirm.setOnClickListener {
+            val filterData = RoleManageFilterVo(
+                binding.roleNameTv.text.toString(),
+                binding.roleKeyEt.text.toString(),
+                if (binding.statusRg.checkedRadioButtonId == -1) {
+                    null
+                } else {
+                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+                }
+            )
+            onConfirm(filterData)
+            dismiss()
+            binding.roleNameTv.setText("")
+            binding.roleKeyEt.setText("")
+        }
+        binding.cancel.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    /**
+     * 设置确认事件
+     */
+    fun setOnConfirmListener(onConfirm: (RoleManageFilterVo) -> Unit) {
+        this.onConfirm = onConfirm
+    }
+}

+ 6 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/FilterUserDialog.kt → app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt

@@ -1,8 +1,8 @@
-package com.grkj.iscs.features.main.dialog
+package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.content.Context
 import android.view.View
-import com.grkj.domain.entity.vo.UserManageFilterVo
+import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterUserBinding
 import razerdp.basepopup.BasePopupWindow
@@ -26,7 +26,7 @@ class FilterUserDialog(context: Context) : BasePopupWindow(context) {
             val filterData = UserManageFilterVo(
                 binding.nicknameEt.text.toString(),
                 binding.cardcodeEt.text.toString(),
-                binding.areaEt.text.toString(),
+                binding.workstationEt.text.toString(),
                 if (binding.statusRg.checkedRadioButtonId == -1) {
                     null
                 } else {
@@ -35,6 +35,9 @@ class FilterUserDialog(context: Context) : BasePopupWindow(context) {
             )
             onConfirm(filterData)
             dismiss()
+            binding.nicknameEt.setText("")
+            binding.cardcodeEt.setText("")
+            binding.workstationEt.setText("")
         }
         binding.cancel.setOnClickListener {
             dismiss()

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

@@ -0,0 +1,44 @@
+package com.grkj.iscs.features.main.dialog.data_manage
+
+import android.content.Context
+import android.view.View
+import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UserManageVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.DialogUserDetailBinding
+import razerdp.basepopup.BasePopupWindow
+
+/**
+ * 新增用户
+ */
+class UserDetailDialog(context: Context) : BasePopupWindow(context) {
+    private lateinit var binding: DialogUserDetailBinding
+    private var onConfirm: (AddUserDataVo) -> Unit = {}
+
+    init {
+        setContentView(R.layout.dialog_user_detail)
+    }
+
+    override fun onViewCreated(contentView: View) {
+        super.onViewCreated(contentView)
+        binding = DialogUserDetailBinding.bind(contentView)
+        binding.cancel.setOnClickListener { dismiss() }
+        binding.closeIv.setOnClickListener { dismiss() }
+        binding.confirm.setOnClickListener {
+            dismiss()
+        }
+    }
+
+    /**
+     * 设置用户数据
+     */
+    fun setUserData(userData: UserManageVo) {
+        binding.nicknameTv.text = userData.nickName
+        binding.cardcodeTv.text = userData.cardCodes.joinToString(",")
+        binding.roleTv.text = userData.roleNames.filter { it != null }.joinToString(",")
+        binding.workstationNameTv.text =
+            userData.workstationNames.filter { it != null }.joinToString(",")
+        binding.activateRb.isChecked = userData.getStatus()
+        binding.deactivateRb.isChecked = !userData.getStatus()
+    }
+}

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

@@ -91,7 +91,7 @@ class DataManageHomeFragment : BaseFragment<FragmentDataManageHomeBinding>() {
             }
 
             1 -> {
-
+                navController.navigate(R.id.action_dataManageHomeFragment_to_roleManageFragment)
             }
 
             2 -> {

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

@@ -1,7 +1,150 @@
 package com.grkj.iscs.features.main.fragment.data_manage
 
+import android.graphics.Color
+import android.view.Gravity
+import androidx.lifecycle.ViewModelProvider
+import com.drake.brv.BindingAdapter
+import com.drake.brv.annotaion.DividerOrientation
+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.model.vo.RoleManageVo
+import com.grkj.iscs.R
+import com.grkj.iscs.databinding.FragmentRoleManageBinding
+import com.grkj.iscs.databinding.ItemRoleManageRoleBinding
+import com.grkj.iscs.features.main.dialog.data_manage.FilterRoleDialog
+import com.grkj.iscs.features.main.viewmodel.user_manage.RoleManageViewModel
+import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
+
 /**
  * 角色管理
  */
-class RoleManageFragment {
+class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
+    private val viewModel: RoleManageViewModel by lazy { ViewModelProvider(this)[RoleManageViewModel::class] }
+    private lateinit var filterRoleDialog: FilterRoleDialog
+    override fun getLayoutId(): Int {
+        return R.layout.fragment_role_manage
+    }
+
+    override fun initView() {
+        filterRoleDialog = FilterRoleDialog(requireContext())
+        filterRoleDialog.popupGravity = Gravity.CENTER
+        binding.back.setOnClickListener { navController.popBackStack() }
+        filterRoleDialog.setOnConfirmListener {
+            viewModel.roleFilterData = it
+            getRoleData(nextPage = false)
+        }
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
+        binding.deleteUser.setDebouncedClickListener {
+            deleteSelectUser()
+        }
+        binding.addUser.setDebouncedClickListener {
+            PopTip.tip("功能开发中")
+        }
+        binding.filterUser.setDebouncedClickListener {
+            filterRoleDialog.showPopupWindow()
+        }
+        binding.refreshLayout.setOnRefreshListener {
+            viewModel.roleFilterData = null
+            getRoleData(nextPage = false)
+        }
+        binding.refreshLayout.setOnLoadMoreListener {
+            getRoleData()
+        }
+        binding.userListRv.linear().divider {
+            this.setColor(Color.BLACK)
+            this.startVisible = false
+            this.endVisible = true
+            this.orientation = DividerOrientation.VERTICAL
+        }.setup {
+            addType<RoleManageVo>(R.layout.item_role_manage_role)
+            onBind {
+                onRoleDataBinding(this)
+            }
+        }
+        setSelectAllListener()
+    }
+
+    private fun setSelectAllListener() {
+        binding.selectAll.setOnCheckedChangeListener { v, checked ->
+            viewModel.roleManageDataList.forEach { it.isSelected = checked }
+            binding.userListRv.adapter?.notifyDataSetChanged()
+        }
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onRoleDataBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemRoleManageRoleBinding>()
+        val item = holder.getModel<RoleManageVo>()
+        itemBinding.roleNum.text = item.roleSort.toString()
+        itemBinding.roleName.text = item.roleName
+        itemBinding.roleKeyTv.text = item.roleKey
+        itemBinding.select.setOnCheckedChangeListener(null)
+        itemBinding.select.isChecked = item.isSelected
+        itemBinding.select.setOnCheckedChangeListener { _, checked ->
+            item.isSelected = checked
+            binding.selectAll.setOnCheckedChangeListener(null)
+            binding.selectAll.isChecked = viewModel.roleManageDataList.all { it.isSelected }
+            setSelectAllListener()
+        }
+    }
+
+    override fun initData() {
+        super.initData()
+        viewModel.roleFilterData = null
+        getRoleData(nextPage = false)
+    }
+
+    private fun getRoleData(nextPage: Boolean = true) {
+        viewModel.getRoleData(viewModel.roleFilterData, nextPage).observe(this) {
+            if (!nextPage) {
+                viewModel.roleFilterData = null
+                binding.selectAll.setOnCheckedChangeListener(null)
+                binding.selectAll.isChecked = false
+                setSelectAllListener()
+            }
+            binding.refreshLayout.finishRefresh()
+            binding.refreshLayout.finishLoadMore()
+            binding.userListRv.models = viewModel.roleManageDataList
+        }
+    }
+
+    private fun deleteSelectUser() {
+        if (viewModel.roleManageDataList.none { it.isSelected }) {
+            PopTip.tip(R.string.please_select_role)
+            return
+        }
+        TipDialog.show(
+            msg = CommonUtils.getStr(R.string.check_delete_role).toString(),
+            countDownTime = 10,
+            onConfirmClick = {
+                viewModel.deleteSelectedRoles(viewModel.roleManageDataList.filter { it.isSelected }
+                    .map { it.roleId }).observe(this) {
+                    if (it) {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.SUCCESS,
+                            msg = CommonUtils.getStr(R.string.role_manage_delete_succeed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                        getRoleData(false)
+                    } else {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(R.string.role_manage_delete_failed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                    }
+                }
+            })
+    }
 }

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

@@ -9,13 +9,14 @@ 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.domain.entity.vo.UserManageFilterVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentUserManageBinding
 import com.grkj.iscs.databinding.ItemUserManageUserBinding
-import com.grkj.iscs.features.main.dialog.AddUserDialog
-import com.grkj.iscs.features.main.dialog.FilterUserDialog
+import com.grkj.iscs.features.main.dialog.data_manage.AddUserDialog
+import com.grkj.iscs.features.main.dialog.data_manage.FilterUserDialog
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.iscs.features.main.dialog.data_manage.UserDetailDialog
 import com.grkj.iscs.features.main.viewmodel.user_manage.UserManageViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
@@ -30,6 +31,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
     private val viewModel: UserManageViewModel by lazy { ViewModelProvider(this)[UserManageViewModel::class] }
     private lateinit var addUserDialog: AddUserDialog
     private lateinit var filterUserDialog: FilterUserDialog
+    private lateinit var userDetailDialog: UserDetailDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_user_manage
     }
@@ -39,8 +41,11 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         addUserDialog.popupGravity = Gravity.CENTER
         filterUserDialog = FilterUserDialog(requireContext())
         filterUserDialog.popupGravity = Gravity.CENTER
+        userDetailDialog = UserDetailDialog(requireContext())
+        userDetailDialog.popupGravity = Gravity.CENTER
         filterUserDialog.setOnConfirmListener {
-            getUserData(it)
+            viewModel.userFilterData = it
+            getUserData(nextPage = false)
         }
         addUserDialog.setOnConfirmListener {
             viewModel.addUser(it).observe(this) {
@@ -51,7 +56,10 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                         dialogType = TipDialog.DialogType.SUCCESS,
                         msg = CommonUtils.getStr(R.string.add_user_succeed).toString(),
                         countDownTime = 10,
-                        showConfirm = false
+                        showConfirm = false,
+                        onCancelClick = {
+                            getUserData(false)
+                        }
                     )
                 } else {
                     TipDialog.show(
@@ -60,37 +68,58 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                         dialogType = TipDialog.DialogType.ERROR,
                         msg = CommonUtils.getStr(R.string.add_user_failed).toString(),
                         countDownTime = 10,
-                        showConfirm = false
+                        showConfirm = false,
+                        onCancelClick = {
+                            getUserData(false)
+                        }
                     )
                 }
             }
         }
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
+        }
         binding.deleteUser.setDebouncedClickListener {
             deleteSelectUser()
         }
         binding.addUser.setDebouncedClickListener {
-            addUserDialog.showPopupWindow()
+            viewModel.initRoleAndWorkStationData().observe(this) {
+                addUserDialog.setRoleData(viewModel.roleData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        it.roleId,
+                        it.roleName
+                    )
+                })
+                addUserDialog.setWorkstationData(viewModel.workstationData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        it.workstationId,
+                        it.workstationName
+                    )
+                })
+                addUserDialog.showPopupWindow()
+            }
         }
         binding.filterUser.setDebouncedClickListener {
             filterUserDialog.showPopupWindow()
         }
         binding.refreshLayout.setOnRefreshListener {
+            viewModel.userFilterData = null
             getUserData(nextPage = false)
         }
         binding.refreshLayout.setOnLoadMoreListener {
             getUserData()
         }
         binding.userListRv.linear().divider {
-                this.setColor(Color.BLACK)
-                this.startVisible = false
-                this.endVisible = false
-                this.orientation = DividerOrientation.VERTICAL
-            }.setup {
-                addType<UserManageVo>(R.layout.item_user_manage_user)
-                onBind {
-                    onUserDataBinding(this)
-                }
+            this.setColor(Color.BLACK)
+            this.startVisible = false
+            this.endVisible = true
+            this.orientation = DividerOrientation.VERTICAL
+        }.setup {
+            addType<UserManageVo>(R.layout.item_user_manage_user)
+            onBind {
+                onUserDataBinding(this)
             }
+        }
         setSelectAllListener()
     }
 
@@ -105,7 +134,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         val itemBinding = holder.getBinding<ItemUserManageUserBinding>()
         val item = holder.getModel<UserManageVo>()
         itemBinding.nickname.text = item.nickName
-        itemBinding.cardCode.text = item.cardCode
+        itemBinding.cardCode.text = item.cardCodes.joinToString(",")
         itemBinding.select.setOnCheckedChangeListener(null)
         itemBinding.select.isChecked = item.isSelected
         itemBinding.select.setOnCheckedChangeListener { _, checked ->
@@ -114,17 +143,26 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             binding.selectAll.isChecked = viewModel.userManageDataList.all { it.isSelected }
             setSelectAllListener()
         }
+        itemBinding.view.setOnClickListener {
+            userDetailDialog.setUserData(item)
+            userDetailDialog.showPopupWindow()
+        }
     }
 
     override fun initData() {
         super.initData()
+        viewModel.userFilterData = null
         getUserData(nextPage = false)
     }
 
-    private fun getUserData(
-        filterData: UserManageFilterVo? = null, nextPage: Boolean = true
-    ) {
-        viewModel.getUserData(filterData, nextPage).observe(this) {
+    private fun getUserData(nextPage: Boolean = true) {
+        viewModel.getUserData(viewModel.userFilterData, nextPage).observe(this) {
+            if (!nextPage) {
+                viewModel.userFilterData = null
+                binding.selectAll.setOnCheckedChangeListener(null)
+                binding.selectAll.isChecked = false
+                setSelectAllListener()
+            }
             binding.refreshLayout.finishRefresh()
             binding.refreshLayout.finishLoadMore()
             binding.userListRv.models = viewModel.userManageDataList
@@ -140,25 +178,27 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             msg = CommonUtils.getStr(R.string.check_delete_user).toString(),
             countDownTime = 10,
             onConfirmClick = {
-                viewModel.deleteSelectedUsers().observe(this) {
-                        if (it) {
-                            TipDialog.show(
-                                dialogType = TipDialog.DialogType.SUCCESS,
-                                msg = CommonUtils.getStr(R.string.user_manage_delete_succeed)
-                                    .toString(),
-                                showConfirm = false,
-                                countDownTime = 10
-                            )
-                        } else {
-                            TipDialog.show(
-                                dialogType = TipDialog.DialogType.ERROR,
-                                msg = CommonUtils.getStr(R.string.user_manage_delete_failed)
-                                    .toString(),
-                                showConfirm = false,
-                                countDownTime = 10
-                            )
-                        }
+                viewModel.deleteSelectedUsers(viewModel.userManageDataList.filter { it.isSelected }
+                    .map { it.userId }).observe(this) {
+                    if (it) {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.SUCCESS,
+                            msg = CommonUtils.getStr(R.string.user_manage_delete_succeed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
+                        getUserData(false)
+                    } else {
+                        TipDialog.show(
+                            dialogType = TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(R.string.user_manage_delete_failed)
+                                .toString(),
+                            showConfirm = false,
+                            countDownTime = 10
+                        )
                     }
+                }
             })
     }
 }

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

@@ -3,5 +3,5 @@ package com.grkj.iscs.features.main.fragment.data_manage
 /**
  * 区域管理
  */
-class AreaManageFragment {
+class WorkstationManageFragment {
 }

+ 51 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/RoleManageViewModel.kt

@@ -0,0 +1,51 @@
+package com.grkj.iscs.features.main.viewmodel.user_manage
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.model.vo.RoleManageFilterVo
+import com.grkj.data.model.vo.RoleManageVo
+import com.grkj.data.repository.IRoleRepository
+import com.grkj.data.repository.impl.RoleRepository
+import com.grkj.ui_base.base.BaseViewModel
+import kotlinx.coroutines.Dispatchers
+
+/**
+ * 用户管理界面模型
+ */
+class RoleManageViewModel : BaseViewModel() {
+    private val roleRepository: IRoleRepository by lazy { RoleRepository.instance }
+    private var current: Int = 0
+    private var size: Int = 50
+    var roleManageDataList: MutableList<RoleManageVo> = mutableListOf()
+    var roleFilterData: RoleManageFilterVo? = null
+
+    /**
+     * 删除选中角色
+     */
+    fun deleteSelectedRoles(roleIds: List<Long>): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            roleRepository.deleteRoleByRoleIds(roleIds)
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取角色数据
+     */
+    fun getRoleData(
+        filterData: RoleManageFilterVo? = null,
+        nextPage: Boolean = true
+    ): LiveData<Boolean> {
+        if (nextPage) {
+            current += 1
+        } else {
+            current = 0
+            roleManageDataList.clear()
+        }
+        return liveData(Dispatchers.IO) {
+            val roleManageDataPage = roleRepository.getRoleManagerData(filterData, current, size)
+            roleManageDataList.addAll(roleManageDataPage)
+            emit(true)
+        }
+    }
+}

+ 38 - 7
app/src/main/java/com/grkj/iscs/features/main/viewmodel/user_manage/UserManageViewModel.kt

@@ -2,11 +2,19 @@ package com.grkj.iscs.features.main.viewmodel.user_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.domain.entity.vo.UserManageFilterVo
-import com.grkj.domain.entity.vo.AddUserDataVo
+import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.model.dos.SysRole
+import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.data.model.vo.UserManageVo
-import com.grkj.data.repository.UserRepository
-import com.grkj.domain.repository.IUserRepository
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IRoleRepository
+import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkstationRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.repository.impl.RoleRepository
+import com.grkj.data.repository.impl.UserRepository
+import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
 import kotlinx.coroutines.Dispatchers
 
@@ -14,16 +22,25 @@ import kotlinx.coroutines.Dispatchers
  * 用户管理界面模型
  */
 class UserManageViewModel : BaseViewModel() {
-    private val userRepository: IUserRepository by lazy { UserRepository() }
+    private val userRepository: IUserRepository by lazy { UserRepository.instance }
+    private val roleRepository: IRoleRepository by lazy { RoleRepository.instance }
+    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
+    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository.instance }
     private var current: Int = 0
     private var size: Int = 50
     var userManageDataList: MutableList<UserManageVo> = mutableListOf()
+    var userFilterData: UserManageFilterVo? = null
+    var roleData: List<SysRole> = listOf()
+    var workstationData: List<IsWorkstation> = listOf()
 
     /**
      * 删除选中用户
      */
-    fun deleteSelectedUsers(): LiveData<Boolean> {
+    fun deleteSelectedUsers(userIds: List<Long>): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            userRepository.deleteUserById(userIds)
+            roleRepository.deleteUserRoleByUserId(userIds)
+            workstationRepository.deleteUserWorkstationByUserIds(userIds)
             emit(true)
         }
     }
@@ -43,7 +60,6 @@ class UserManageViewModel : BaseViewModel() {
         }
         return liveData(Dispatchers.IO) {
             val userManageDataPage = userRepository.getUserManagerData(filterData, current, size)
-                .map { it as UserManageVo }
             userManageDataList.addAll(userManageDataPage)
             emit(true)
         }
@@ -54,6 +70,21 @@ class UserManageViewModel : BaseViewModel() {
      */
     fun addUser(userData: AddUserDataVo): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            val userId = userRepository.addUserData(userData)
+            workstationRepository.addUserWorkstationData(userId, userData.workstationId)
+            roleRepository.addUserRoleData(userId, userData.roleId)
+            hardwareRepository.addCard(userId,userData)
+            emit(true)
+        }
+    }
+
+    /**
+     * 初始化角色和岗位数据
+     */
+    fun initRoleAndWorkStationData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            roleData = roleRepository.getRoleData()
+            workstationData = workstationRepository.getWorkStationData()
             emit(true)
         }
     }

+ 8 - 0
app/src/main/res/drawable/bg_text_drop_down.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <stroke
+        android:width="1dp"
+        android:color="@color/black" />
+</shape>

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

@@ -148,7 +148,7 @@
                     android:textSize="18sp" />
 
                 <TextView
-                    android:id="@+id/area_tv"
+                    android:id="@+id/workstation_name_tv"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginLeft="10dp"

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

@@ -7,8 +7,8 @@
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/drop_down_rv"
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:background="@drawable/black_stroke_bg" />
+            android:background="@drawable/bg_text_drop_down" />
     </FrameLayout>
 </layout>

+ 174 - 0
app/src/main/res/layout/dialog_filter_role.xml

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="400dp"
+        android:layout_height="300dp"
+        android:background="@drawable/common_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/user_manage_filter_title"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <ImageView
+                android:id="@+id/close_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingHorizontal="10dp"
+                android:src="@drawable/icon_close" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/role_manage_role_name"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/role_name_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_role_name"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/role_manage_permission_string"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <EditText
+                    android:id="@+id/role_key_et"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_permission_characters"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="56dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_filter_status"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <RadioGroup
+                    android:id="@+id/status_rg"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <RadioButton
+                        android:id="@+id/activate_rb"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:text="@string/user_manage_filter_activate" />
+
+                    <RadioButton
+                        android:id="@+id/deactivate_rb"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:text="@string/user_manage_filter_deactivate" />
+                </RadioGroup>
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

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

@@ -119,7 +119,7 @@
                     android:textSize="18sp" />
 
                 <EditText
-                    android:id="@+id/area_et"
+                    android:id="@+id/workstation_et"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginLeft="10dp"

+ 232 - 0
app/src/main/res/layout/dialog_user_detail.xml

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="400dp"
+        android:layout_height="600dp"
+        android:background="@drawable/common_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="@string/user_manage_user_detail_title"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <ImageView
+                android:id="@+id/close_iv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingHorizontal="10dp"
+                android:src="@drawable/icon_close" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_nickname"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/nickname_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_nickname"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_card_code"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/cardcode_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_input_card_code"
+                    android:maxLines="1"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:singleLine="true"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_role"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/role_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_select_role"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_area"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/workstation_name_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="10dp"
+                    android:background="@drawable/bg_common_input"
+                    android:hint="@string/please_select_area"
+                    android:paddingHorizontal="10dp"
+                    android:paddingVertical="2dp"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="20dp"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingHorizontal="16dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/user_manage_filter_status"
+                    android:textColor="@color/black"
+                    android:textSize="18sp" />
+
+                <RadioGroup
+                    android:id="@+id/status_rg"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <RadioButton
+                        android:id="@+id/activate_rb"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:enabled="false"
+                        android:text="@string/user_manage_filter_activate" />
+
+                    <RadioButton
+                        android:id="@+id/deactivate_rb"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="10dp"
+                        android:enabled="false"
+                        android:text="@string/user_manage_filter_deactivate" />
+                </RadioGroup>
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            android:orientation="horizontal"
+            android:padding="10dp">
+
+            <TextView
+                android:id="@+id/confirm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/confirm"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+            <TextView
+                android:id="@+id/cancel"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/cancel"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+    </LinearLayout>
+</layout>

+ 155 - 0
app/src/main/res/layout/fragment_role_manage.xml

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="20dp"
+        android:background="@drawable/home_card_bg"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/title_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="5dp">
+
+            <ImageView
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:src="@mipmap/icon_data_manage_menu_user_manage" />
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:layout_weight="1"
+                android:text="@string/role_manage_title"
+                android:textColor="@color/black"
+                android:textSize="24sp" />
+
+            <TextView
+                android:id="@+id/back"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/back"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@color/black" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:paddingHorizontal="10dp"
+            android:paddingVertical="10dp">
+
+
+            <TextView
+                android:id="@+id/add_user"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/insert"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <TextView
+                android:id="@+id/delete_user"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/delete"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+
+
+            <View
+                android:layout_width="0dp"
+                android:layout_height="0dp"
+                android:layout_weight="1" />
+
+            <TextView
+                android:id="@+id/filter_user"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:background="@drawable/common_dialog_btn"
+                android:paddingHorizontal="20dp"
+                android:text="@string/filter"
+                android:textColor="@color/black"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginTop="10dp"
+            android:background="@drawable/common_card_bg"
+            android:divider="@drawable/divider_table"
+            android:showDividers="middle">
+
+            <CheckBox
+                android:id="@+id/select_all"
+                android:layout_width="30dp"
+                android:layout_height="30dp"
+                android:layout_gravity="center"
+                android:layout_margin="10dp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/role_manage_role_num"
+                android:textSize="18sp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/role_manage_role_name"
+                android:textSize="18sp" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="@string/role_manage_permission_string"
+                android:textSize="18sp" />
+        </LinearLayout>
+
+        <com.scwang.smart.refresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginHorizontal="20dp"
+            android:layout_marginBottom="10dp">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/user_list_rv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/common_card_bg" />
+        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+    </LinearLayout>
+</layout>

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

@@ -32,6 +32,7 @@
                 android:textSize="24sp" />
 
             <TextView
+                android:id="@+id/back"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="10dp"

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

@@ -3,7 +3,7 @@
 
     <TextView
         android:id="@+id/drop_down_text"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingHorizontal="8dp"
         android:paddingVertical="4dp"

+ 41 - 0
app/src/main/res/layout/item_role_manage_role.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:divider="@drawable/divider_table"
+        android:showDividers="middle">
+
+        <CheckBox
+            android:id="@+id/select"
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:layout_gravity="center"
+            android:layout_margin="10dp" />
+
+        <TextView
+            android:id="@+id/role_num"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+
+        <TextView
+            android:id="@+id/role_name"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+
+        <TextView
+            android:id="@+id/role_key_tv"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:textSize="18sp" />
+    </LinearLayout>
+</layout>

+ 7 - 0
app/src/main/res/navigation/nav_data_manage.xml

@@ -11,9 +11,16 @@
         <action
             android:id="@+id/action_dataManageHomeFragment_to_userManageFragment"
             app:destination="@id/userManageFragment" />
+        <action
+            android:id="@+id/action_dataManageHomeFragment_to_roleManageFragment"
+            app:destination="@id/roleManageFragment" />
     </fragment>
     <fragment
         android:id="@+id/userManageFragment"
         android:name="com.grkj.iscs.features.main.fragment.data_manage.UserManageFragment"
         android:label="UserManageFragment" />
+    <fragment
+        android:id="@+id/roleManageFragment"
+        android:name="com.grkj.iscs.features.main.fragment.data_manage.RoleManageFragment"
+        android:label="RoleManageFragment" />
 </navigation>

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

@@ -44,4 +44,14 @@
     <string name="add_user_failed">New user failed</string>
     <string name="user_manage_detail">Detail</string>
     <string name="user_manage_view">View</string>
+    <string name="role_manage_title">Role manage</string>
+    <string name="user_manage_user_detail_title">User detail</string>
+    <string name="role_manage_role_name">Role name</string>
+    <string name="please_input_role_name">please input role name</string>
+    <string name="role_manage_permission_string">Permission characters</string>
+    <string name="please_input_permission_characters">please input permission characters</string>
+    <string name="role_manage_delete_succeed">Role delete succeed</string>
+    <string name="role_manage_delete_failed">Role delete failed</string>
+    <string name="check_delete_role">Do you want to delete selected roles?</string>
+    <string name="role_manage_role_num">Role NO.</string>
 </resources>

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

@@ -44,4 +44,14 @@
     <string name="add_user_failed">新增用户失败</string>
     <string name="user_manage_detail">详情</string>
     <string name="user_manage_view">查看</string>
+    <string name="role_manage_title">角色管理</string>
+    <string name="user_manage_user_detail_title">用户详情</string>
+    <string name="role_manage_role_name">角色名称</string>
+    <string name="please_input_role_name">请输入角色名称</string>
+    <string name="role_manage_permission_string">权限字符</string>
+    <string name="please_input_permission_characters">请输入权限字符</string>
+    <string name="role_manage_delete_succeed">角色已删除</string>
+    <string name="role_manage_delete_failed">无法删除角色</string>
+    <string name="check_delete_role">您确认要删除角色吗</string>
+    <string name="role_manage_role_num">角色编号</string>
 </resources>

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

@@ -43,4 +43,14 @@
     <string name="add_user_failed">新增用户失败</string>
     <string name="user_manage_detail">详情</string>
     <string name="user_manage_view">查看</string>
+    <string name="role_manage_title">角色管理</string>
+    <string name="user_manage_user_detail_title">用户详情</string>
+    <string name="role_manage_role_name">角色名称</string>
+    <string name="please_input_role_name">请输入角色名称</string>
+    <string name="role_manage_permission_string">权限字符</string>
+    <string name="please_input_permission_characters">请输入权限字符</string>
+    <string name="role_manage_delete_succeed">角色已删除</string>
+    <string name="role_manage_delete_failed">无法删除角色</string>
+    <string name="check_delete_role">您确认要删除角色吗</string>
+    <string name="role_manage_role_num">角色编号</string>
 </resources>

+ 0 - 1
data/build.gradle.kts

@@ -37,7 +37,6 @@ dependencies {
 
     implementation(libs.androidx.core.ktx)
     implementation(project(":shared"))
-    api(project(":domain"))
     api(libs.sik.extension.net)
     testImplementation(libs.junit)
     // 引入 Room Runtime 和 KTX

+ 21 - 0
data/src/main/java/com/grkj/data/converters/Converters.kt

@@ -0,0 +1,21 @@
+package com.grkj.data.converters
+
+import androidx.room.TypeConverter
+
+class Converters {
+    @TypeConverter
+    fun fromIdString(value: String?): List<Long> =
+        value?.split(",")?.mapNotNull { it.toLongOrNull() } ?: emptyList()
+
+    @TypeConverter
+    fun idListToString(list: List<Long>?): String =
+        list?.joinToString(",") ?: ""
+
+    @TypeConverter
+    fun fromNameString(value: String?): List<String> =
+        value?.split(",") ?: emptyList()
+
+    @TypeConverter
+    fun nameListToString(list: List<String>?): String =
+        list?.joinToString(",") ?: ""
+}

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

@@ -1,7 +1,10 @@
 package com.grkj.data.dao
 
 import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
 import androidx.room.Query
+import com.grkj.data.model.dos.IsJobCardDo
 
 /**
  * 硬件数据库查询
@@ -13,4 +16,10 @@ interface HardwareDao {
      */
     @Query("select user_id from is_job_card where card_nfc = :cardNfc")
     fun getUserIdByCardNfc(cardNfc: String): Int?
+
+    /**
+     * 添加卡片
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun addCard(isJobCardDo: IsJobCardDo)
 }

+ 70 - 0
data/src/main/java/com/grkj/data/dao/RoleDao.kt

@@ -0,0 +1,70 @@
+package com.grkj.data.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.Query
+import ch.qos.logback.core.status.Status
+import com.grkj.data.model.dos.SysRole
+import com.grkj.data.model.dos.SysUserRole
+import com.grkj.data.model.vo.RoleManageVo
+
+/**
+ * 角色数据
+ */
+@Dao
+interface RoleDao {
+    /**
+     * 获取角色数据
+     */
+    @Query("select * from sys_role where del_flag = 0")
+    fun getRoleData(): List<SysRole>
+
+    /**
+     * 添加用户角色关联
+     */
+    @Insert
+    fun insertUserRole(sysUserRole: SysUserRole)
+
+    /**
+     * 根据用户id删除用户角色关联
+     */
+    @Query("delete from sys_user_role where user_id in (:userIds)")
+    fun deleteUserRoleByUserIds(userIds: List<Long>)
+
+    /**
+     * 根据角色id删除角色
+     */
+    @Query("delete from sys_role where role_id in (:roleIds)")
+    fun deleteRoleByRoleIds(roleIds: List<Long>)
+
+    /**
+     * 获取角色数据
+     */
+    @Query(
+        """
+    SELECT
+      role_id as roleId,
+      role_name as roleName,
+      role_key as roleKey,
+      role_sort as roleSort,
+      status
+    FROM sys_role
+    WHERE del_flag = 0
+      -- 只有当 nickname 不为 NULL 且非空才做模糊匹配
+      AND (:roleName       IS NULL OR trim(:roleName) = '' OR role_name       LIKE '%' || :roleName       || '%')
+      -- 只有当 cardCode 不为 NULL 且非空才做模糊匹配
+      AND (:permissionCharacters       IS NULL OR trim(:permissionCharacters) = '' OR role_key       LIKE '%' || :permissionCharacters       || '%')
+      -- 只有当 status 不为 NULL 才做等值匹配
+      AND (:status         IS NULL OR status          = :status)
+    LIMIT :size
+    OFFSET :offset
+  """
+    )
+    fun getRoleManageData(
+        roleName: String?,
+        permissionCharacters: String?,
+        status: String?,
+        size: Int,
+        offset: Int
+    ): List<RoleManageVo>
+}

+ 64 - 24
data/src/main/java/com/grkj/data/dao/UserDao.kt

@@ -1,17 +1,21 @@
 package com.grkj.data.dao
 
-import androidx.annotation.Size
+import android.health.connect.ReadRecordsRequestUsingIds
 import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
 import androidx.room.Query
+import androidx.room.TypeConverters
+import com.grkj.data.converters.Converters
 import com.grkj.data.model.dos.SysUserCharacteristicDo
 import com.grkj.data.model.dos.SysUserDo
 import com.grkj.data.model.vo.UserManageVo
-import com.grkj.domain.entity.vo.UserManageFilterVo
 
 /**
  * 用户数据库查询
  */
 @Dao
+@TypeConverters(Converters::class)    // 注册下面要写的 Converters
 interface UserDao {
     /**
      * 根据用户名查询用户数据
@@ -38,34 +42,70 @@ interface UserDao {
     fun getFaceData(): List<SysUserCharacteristicDo>
 
     /**
-     * 获取用户数据
+     * 获取用户管理列表(带动态过滤 & 角色聚合)
      */
-    @Query("""
-          SELECT
-              su.user_id   AS userId,
-              su.nick_name AS nickName,
-              sr.role_id   AS roleId,
-              sr.role_name AS roleName,
-              ijc.card_code AS cardCode,
-              su.status,
-              NULL AS workAreaId,
-              NULL AS workAreaName
-            FROM sys_user su
-            LEFT JOIN sys_user_role sur ON su.user_id = sur.user_id
-            LEFT JOIN sys_role       sr  ON sur.role_id   = sr.role_id
-            LEFT JOIN is_job_card   ijc ON ijc.user_id     = su.user_id
-            WHERE (:nickname  IS NULL OR su.nick_name LIKE '%' || :nickname  || '%')
-              AND (:cardCode  IS NULL OR ijc.card_code   LIKE '%' || :cardCode  || '%')
-              AND (:status    IS NULL OR su.status       = :status)
-              AND su.del_flag = 0
-            LIMIT  :size
-            OFFSET :offset
-    """)
+    @Query(
+        """
+    SELECT
+      su.user_id                         AS userId,
+      su.nick_name                       AS nickName,
+
+      -- 聚合所有卡号(如果没卡则结果里 cardCodes 会是 NULL 或空)
+      GROUP_CONCAT(DISTINCT ijc.card_code)       AS cardCodes,
+
+      GROUP_CONCAT(DISTINCT sr.role_id)           AS roleIds,
+      GROUP_CONCAT(DISTINCT sr.role_name)         AS roleNames,
+      GROUP_CONCAT(DISTINCT iw.workstation_id)    AS workstationIds,
+      GROUP_CONCAT(DISTINCT iw.workstation_name)  AS workstationNames,
+
+      su.status                            AS status
+    FROM sys_user su
+    LEFT JOIN sys_user_role sur ON su.user_id = sur.user_id
+    LEFT JOIN sys_role sr       ON sur.role_id = sr.role_id
+    LEFT JOIN is_job_card ijc   ON ijc.user_id = su.user_id
+    LEFT JOIN is_user_workstation iuw ON iuw.user_id = su.user_id
+    LEFT JOIN is_workstation iw ON iw.workstation_id = iuw.workstation_id
+    WHERE su.del_flag = 0
+
+      -- 只有当 nickname 不为 NULL 且非空才做模糊匹配
+      AND (:nickname       IS NULL OR trim(:nickname) = '' OR su.nick_name       LIKE '%' || :nickname       || '%')
+
+      -- 只有当 cardCode 不为 NULL 且非空才做模糊匹配
+      AND (:cardCode       IS NULL OR trim(:cardCode) = '' OR ijc.card_code       LIKE '%' || :cardCode       || '%')
+
+      -- 只有当 workstationName 不为 NULL 且非空才做模糊匹配
+      AND (:workstationName IS NULL OR trim(:workstationName) = '' OR iw.workstation_name LIKE '%' || :workstationName || '%')
+
+      -- 只有当 status 不为 NULL 才做等值匹配
+      AND (:status         IS NULL OR su.status          = :status)
+
+    GROUP BY
+      su.user_id,
+      su.nick_name,
+      su.status
+
+    LIMIT :size
+    OFFSET :offset
+  """
+    )
     fun getUserManagerData(
         nickname: String?,
         cardCode: String?,
+        workstationName: String?,
         status: Boolean?,
         offset: Int,
         size: Int
     ): List<UserManageVo>
+
+    /**
+     * 新增用户
+     */
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insert(sysUserDo: SysUserDo): Long
+
+    /**
+     * 删除用户
+     */
+    @Query("delete from sys_user where user_id in (:userIds)")
+    fun deleteUserByIds(userIds: List<Long>)
 }

+ 31 - 0
data/src/main/java/com/grkj/data/dao/WorkstationDao.kt

@@ -0,0 +1,31 @@
+package com.grkj.data.dao
+
+import androidx.room.Dao
+import androidx.room.Insert
+import androidx.room.Query
+import com.grkj.data.model.dos.IsUserWorkstation
+import com.grkj.data.model.dos.IsWorkstation
+
+/**
+ * 岗位数据
+ */
+@Dao
+interface WorkstationDao {
+    /**
+     * 获取岗位数据
+     */
+    @Query("select * from is_workstation where del_flag = 0")
+    fun getWorkstationData(): List<IsWorkstation>
+
+    /**
+     * 添加用户岗位关联数据
+     */
+    @Insert
+    fun insertUserWorkstation(workstation: IsUserWorkstation)
+
+    /**
+     * 根据用户id删除用户岗位关联
+     */
+    @Query("delete from is_user_workstation where user_id in (:userIds)")
+    fun deleteUserWorkstationByUserIds(userIds: List<Long>)
+}

+ 11 - 5
data/src/main/java/com/grkj/data/database/ISCSDatabase.kt

@@ -5,8 +5,12 @@ import androidx.room.Database
 import androidx.room.Room
 import androidx.room.RoomDatabase
 import com.grkj.data.dao.HardwareDao
+import com.grkj.data.dao.RoleDao
 import com.grkj.data.dao.UserDao
+import com.grkj.data.dao.WorkstationDao
 import com.grkj.data.model.dos.IsJobCardDo
+import com.grkj.data.model.dos.IsUserWorkstation
+import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.dos.SysRole
 import com.grkj.data.model.dos.SysUserCharacteristicDo
 import com.grkj.data.model.dos.SysUserDo
@@ -17,7 +21,7 @@ import com.sik.sikcore.SIKCore
  * 本地数据库
  */
 @Database(
-    entities = [IsJobCardDo::class, SysUserDo::class, SysUserCharacteristicDo::class, SysRole::class, SysUserRole::class],
+    entities = [IsJobCardDo::class, SysUserDo::class, SysUserCharacteristicDo::class, SysRole::class, SysUserRole::class, IsUserWorkstation::class, IsWorkstation::class],
     version = ISCSMigrations.VERSION
 )
 abstract class ISCSDatabase : RoomDatabase() {
@@ -28,13 +32,11 @@ abstract class ISCSDatabase : RoomDatabase() {
         @JvmStatic
         val instance: ISCSDatabase by lazy {
             Room.databaseBuilder(
-                SIKCore.getApplication(),
-                ISCSDatabase::class.java,
-                "iscs_database"
+                SIKCore.getApplication(), ISCSDatabase::class.java, "iscs_database"
             ).createFromAsset("data.db")
                 // 如需在主线程查询,可取消下行注释(不推荐):
                 // .allowMainThreadQueries()
-                .fallbackToDestructiveMigration(true)
+//                .fallbackToDestructiveMigration(true)
                 .build()
         }
     }
@@ -42,4 +44,8 @@ abstract class ISCSDatabase : RoomDatabase() {
     abstract fun userDao(): UserDao
 
     abstract fun hardwareDao(): HardwareDao
+
+    abstract fun roleDao(): RoleDao
+
+    abstract fun workstationDao(): WorkstationDao
 }

+ 3 - 2
data/src/main/java/com/grkj/data/model/dos/BaseBean.kt

@@ -2,6 +2,7 @@ package com.grkj.data.model.dos
 
 import androidx.room.ColumnInfo
 import androidx.room.Ignore
+import com.grkj.data.data.MainDomainData
 import com.sik.sikcore.date.TimeUtils
 import java.io.Serializable
 
@@ -12,7 +13,7 @@ import java.io.Serializable
  */
 open class BaseBean : Serializable {
     @ColumnInfo("create_by")
-    var createBy: String? = null
+    var createBy: String? = MainDomainData.userInfo?.userName
 
     @ColumnInfo("create_time")
     var createTime: String? = TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
@@ -21,7 +22,7 @@ open class BaseBean : Serializable {
      * 更新者
      */
     @ColumnInfo("update_by")
-    var updateBy: String? = null
+    var updateBy: String? = MainDomainData.userInfo?.userName
 
     /**
      * 更新时间

+ 3 - 3
data/src/main/java/com/grkj/data/model/dos/IsJobCardDo.kt

@@ -10,7 +10,7 @@ import com.sik.sikcore.date.TimeUtils
  */
 @Entity(tableName = "is_job_card")
 class IsJobCardDo : BaseBean() {
-    @PrimaryKey
+    @PrimaryKey(autoGenerate = true)
     @ColumnInfo("card_id")
     var cardId: Long = 0
 
@@ -24,7 +24,7 @@ class IsJobCardDo : BaseBean() {
     var cardNfc: String = ""
 
     @ColumnInfo("card_type")
-    var cardType: Int? = null
+    var cardType: Int? = 1
 
     @ColumnInfo("user_id")
     var userId: Long? = null
@@ -33,7 +33,7 @@ class IsJobCardDo : BaseBean() {
     var userName: String? = null
 
     @ColumnInfo("del_flag")
-    var delFlag: String? = null
+    var delFlag: String? = "0"
 
     @ColumnInfo("ex_status")
     var exStatus: String? = null

+ 16 - 0
data/src/main/java/com/grkj/data/model/dos/IsUserWorkstation.kt

@@ -0,0 +1,16 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+
+/**
+ * 用户角色关联
+ */
+@Entity(tableName = "is_user_workstation", primaryKeys = ["user_id", "workstation_id"])
+class IsUserWorkstation {
+    @ColumnInfo("user_id")
+    var userId: Long = 0
+
+    @ColumnInfo("workstation_id")
+    var workstationId: Long = 0
+}

+ 37 - 0
data/src/main/java/com/grkj/data/model/dos/IsWorkstation.kt

@@ -0,0 +1,37 @@
+package com.grkj.data.model.dos
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity("is_workstation")
+class IsWorkstation : BaseBean() {
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo("workstation_id")
+    var workstationId: Long = 0
+
+    @ColumnInfo("workstation_code")
+    var workstationCode: String? = null
+
+    @ColumnInfo("workstation_name")
+    var workstationName: String = ""
+
+    @ColumnInfo("workstation_type")
+    var workstationType: String? = null
+
+    @ColumnInfo("parent_id")
+    var parentId: Long? = null
+
+    @ColumnInfo("ancestors")
+    var ancestors: String? = null
+
+    @ColumnInfo("order_num")
+    var orderNum: Int? = null
+
+    @ColumnInfo("status")
+    var status: String? = null
+
+    @ColumnInfo("del_flag")
+    var delFlag: String? = null
+
+}

+ 1 - 1
data/src/main/java/com/grkj/data/model/dos/SysRole.kt

@@ -15,7 +15,7 @@ class SysRole : BaseBean() {
     /**
      * 角色ID
      */
-    @PrimaryKey
+    @PrimaryKey(autoGenerate = true)
     @ColumnInfo("role_id")
     var roleId: Long = 0
 

+ 1 - 1
data/src/main/java/com/grkj/data/model/dos/SysUserCharacteristicDo.kt

@@ -16,7 +16,7 @@ import androidx.room.PrimaryKey
     indices = [Index("type", name = "type_seq", orders = [Index.Order.ASC])]
 )
 class SysUserCharacteristicDo : BaseBean() {
-    @PrimaryKey
+    @PrimaryKey(autoGenerate = true)
     @ColumnInfo("record_id")
     var recordId: Long = 0
 

+ 8 - 7
data/src/main/java/com/grkj/data/model/dos/SysUserDo.kt

@@ -3,16 +3,17 @@ package com.grkj.data.model.dos
 import androidx.room.ColumnInfo
 import androidx.room.Entity
 import androidx.room.PrimaryKey
+import com.grkj.shared.utils.BCryptUtils
 import com.sik.sikcore.date.TimeUtils
 
 @Entity(tableName = "sys_user")
 class SysUserDo : BaseBean() {
-    @PrimaryKey
+    @PrimaryKey(autoGenerate = true)
     @ColumnInfo("user_id")
     var userId: Long = 0
 
     @ColumnInfo("dept_id")
-    var deptId: Long? = 0
+    var deptId: Long? = null
 
     @ColumnInfo("user_name")
     var userName: String = ""
@@ -21,7 +22,7 @@ class SysUserDo : BaseBean() {
     var nickName: String = ""
 
     @ColumnInfo("user_type")
-    var userType: String? = ""
+    var userType: String? = "00"
 
     @ColumnInfo("email")
     var email: String? = null
@@ -30,22 +31,22 @@ class SysUserDo : BaseBean() {
     var phoneNumber: String? = ""
 
     @ColumnInfo("sex")
-    var sex: String? = ""
+    var sex: String? = "0"
 
     @ColumnInfo("avatar")
     var avatar: String? = ""
 
     @ColumnInfo("password")
-    var password: String? = ""
+    var password: String? = BCryptUtils.encryptPassword("123456")
 
     @ColumnInfo("key_code")
-    var keyCode: String? = null
+    var keyCode: String? = "123456"
 
     @ColumnInfo("status")
     var status: String? = null
 
     @ColumnInfo("del_flag")
-    var delFlag: String? = null
+    var delFlag: String? = "0"
 
     @ColumnInfo("login_ip")
     var loginIp: String? = null

+ 2 - 2
data/src/main/java/com/grkj/data/model/dos/SysUserRole.kt

@@ -9,8 +9,8 @@ import androidx.room.Entity
 @Entity(tableName = "sys_user_role", primaryKeys = ["user_id", "role_id"])
 class SysUserRole {
     @ColumnInfo("user_id")
-    var userId: Int = 0
+    var userId: Long = 0
 
     @ColumnInfo("role_id")
-    var roleId: Int = 0
+    var roleId: Long = 0
 }

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/DeviceTakeUpdate.kt → data/src/main/java/com/grkj/data/model/local/DeviceTakeUpdate.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 /**
  * @param deviceType {@link [com.grkj.iscs.model.bo.DeviceTakeUpdateBO]<class>#[deviceType]}

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/LoginMenuEntity.kt → data/src/main/java/com/grkj/data/model/local/LoginMenuEntity.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 /**
  * 登录菜单实体

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/LoginUser.kt → data/src/main/java/com/grkj/data/model/local/LoginUser.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 data class LoginUser(
     val userId: Long?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/TabConfig.kt → data/src/main/java/com/grkj/data/model/local/TabConfig.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 /**
  * 底部页签

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/UpdateKeyReturn.kt → data/src/main/java/com/grkj/data/model/local/UpdateKeyReturn.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 data class UpdateKeyReturn(
     val ticketId: Long,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/WorkTicketGet.kt → data/src/main/java/com/grkj/data/model/local/WorkTicketGet.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 import kotlin.collections.forEach
 

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/local/WorkTicketSend.kt → data/src/main/java/com/grkj/data/model/local/WorkTicketSend.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.local
+package com.grkj.data.model.local
 
 /**
  * 工作票下发BO

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/req/LockPointUpdateReq.kt → data/src/main/java/com/grkj/data/model/req/LockPointUpdateReq.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.req
+package com.grkj.data.model.req
 
 data class LockPointUpdateReq(
     val ticketId: Long?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/req/LockTakeUpdateReq.kt → data/src/main/java/com/grkj/data/model/req/LockTakeUpdateReq.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.req
+package com.grkj.data.model.req
 
 data class LockTakeUpdateReq(
     val ticketId: Long?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/CabinetSlotsRes.kt → data/src/main/java/com/grkj/data/model/res/CabinetSlotsRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 /**
  * 锁柜-仓位返回实体

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/CommonDictRes.kt → data/src/main/java/com/grkj/data/model/res/CommonDictRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class CommonDictRes(
     val createBy: String?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/KeyInfoRes.kt → data/src/main/java/com/grkj/data/model/res/KeyInfoRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 /**
  * 钥匙信息

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/KeyPageRes.kt → data/src/main/java/com/grkj/data/model/res/KeyPageRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class KeyPageRes(
     val total: Int,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/LockInfoRes.kt → data/src/main/java/com/grkj/data/model/res/LockInfoRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 /**
  * 锁信息

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/LockPageRes.kt → data/src/main/java/com/grkj/data/model/res/LockPageRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class LockPageRes(
     val total: Int,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/StepDetailRes.kt → data/src/main/java/com/grkj/data/model/res/StepDetailRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class StepDetailRes(
     val stepId: Long?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/SystemAttributePageRes.kt → data/src/main/java/com/grkj/data/model/res/SystemAttributePageRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class SystemAttributePageRes(
     val countId: Any,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/TicketDetailRes.kt → data/src/main/java/com/grkj/data/model/res/TicketDetailRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 data class TicketDetailRes(
     val ticketId: Long?,

+ 1 - 1
domain/src/main/java/com/grkj/domain/entity/res/UserInfoRes.kt → data/src/main/java/com/grkj/data/model/res/UserInfoRes.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.res
+package com.grkj.data.model.res
 
 import java.io.Serializable
 

+ 3 - 3
domain/src/main/java/com/grkj/domain/entity/vo/AddUserDataVo.kt → data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.vo
+package com.grkj.data.model.vo
 
 /**
  * 添加用户
@@ -6,7 +6,7 @@ package com.grkj.domain.entity.vo
 data class AddUserDataVo(
     val nickname: String,
     val cardCode: String,
-    val role: String,
-    val area: String,
+    val roleId: Long,
+    val workstationId: Long,
     val status: Boolean
 )

+ 10 - 0
data/src/main/java/com/grkj/data/model/vo/RoleManageFilterVo.kt

@@ -0,0 +1,10 @@
+package com.grkj.data.model.vo
+
+/**
+ * 筛选角色
+ */
+data class RoleManageFilterVo(
+    val roleName: String?,
+    val permissionCharacters: String?,
+    val status: Boolean?
+)

+ 25 - 0
data/src/main/java/com/grkj/data/model/vo/RoleManageVo.kt

@@ -0,0 +1,25 @@
+package com.grkj.data.model.vo
+
+import androidx.room.Ignore
+
+/**
+ * 角色管理数据
+ */
+class RoleManageVo {
+
+    var roleId: Long = 0
+    var roleName: String = ""
+    var roleKey: String? = ""
+    var roleSort: Int = 0
+    var status: String? = "0"
+
+    @Ignore
+    var isSelected: Boolean = false
+
+    /**
+     * 是否正常
+     */
+    fun getStatus(): Boolean {
+        return status == "0"
+    }
+}

+ 2 - 2
domain/src/main/java/com/grkj/domain/entity/vo/UserManageFilterVo.kt → data/src/main/java/com/grkj/data/model/vo/UserManageFilterVo.kt

@@ -1,4 +1,4 @@
-package com.grkj.domain.entity.vo
+package com.grkj.data.model.vo
 
 /**
  * 筛选用户
@@ -6,6 +6,6 @@ package com.grkj.domain.entity.vo
 data class UserManageFilterVo(
     val nickname: String,
     val cardCode: String,
-    val area: String,
+    val workstationName: String,
     val status: Boolean?
 )

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

@@ -8,11 +8,11 @@ import androidx.room.Ignore
 class UserManageVo {
     var userId: Long = 0
     var nickName: String = ""
-    var cardCode: String? = ""
-    var roleId: Long = 0
-    var roleName: String? = ""
-    var workAreaId: Long? = null
-    var workAreaName: String? = null
+    var cardCodes: List<String?> = listOf()
+    var roleIds: List<Long?> = listOf()
+    var roleNames: List<String?> = listOf()
+    var workstationIds: List<Long?> = listOf()
+    var workstationNames: List<String?> = listOf()
     var status: String? = null
 
     @Ignore

+ 14 - 9
domain/src/main/java/com/grkj/domain/repository/IHardwareRepository.kt → data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt

@@ -1,13 +1,13 @@
-package com.grkj.domain.repository
+package com.grkj.data.repository
 
-import com.grkj.domain.entity.req.LockPointUpdateReq
-import com.grkj.domain.entity.req.LockTakeUpdateReq
-import com.grkj.domain.entity.res.CabinetSlotsRes
-import com.grkj.domain.entity.res.CommonDictRes
-import com.grkj.domain.entity.res.KeyInfoRes
-import com.grkj.domain.entity.res.KeyPageRes
-import com.grkj.domain.entity.res.LockInfoRes
-import com.grkj.domain.entity.res.LockPageRes
+import com.grkj.data.model.req.LockPointUpdateReq
+import com.grkj.data.model.req.LockTakeUpdateReq
+import com.grkj.data.model.res.CabinetSlotsRes
+import com.grkj.data.model.res.KeyInfoRes
+import com.grkj.data.model.res.KeyPageRes
+import com.grkj.data.model.res.LockInfoRes
+import com.grkj.data.model.res.LockPageRes
+import com.grkj.data.model.vo.AddUserDataVo
 
 /**
  * 硬件相关仓储
@@ -75,4 +75,9 @@ interface IHardwareRepository {
      * 获取字典数据
      */
     fun <T> getDictData(dictKey: String, callback: (List<T>) -> Unit)
+
+    /**
+     * 创建卡片
+     */
+    fun addCard(userId: Long, userData: AddUserDataVo)
 }

+ 38 - 0
data/src/main/java/com/grkj/data/repository/IRoleRepository.kt

@@ -0,0 +1,38 @@
+package com.grkj.data.repository
+
+import android.health.connect.ReadRecordsRequestUsingIds
+import androidx.work.impl.model.WorkGenerationalId
+import com.grkj.data.model.dos.SysRole
+import com.grkj.data.model.dos.SysUserRole
+import com.grkj.data.model.vo.RoleManageFilterVo
+import com.grkj.data.model.vo.RoleManageVo
+
+/**
+ * 角色仓储
+ */
+interface IRoleRepository {
+    /**
+     * 获取角色数据
+     */
+    fun getRoleData(): List<SysRole>
+
+    /**
+     * 添加用户角色关联
+     */
+    fun addUserRoleData(userId: Long, roleId: Long)
+
+    /**
+     * 根据用户id删除关联数据
+     */
+    fun deleteUserRoleByUserId(userIds: List<Long>)
+
+    /**
+     * 根据角色id删除角色
+     */
+    fun deleteRoleByRoleIds(roles: List<Long>)
+
+    /**
+     * 获取角色数据
+     */
+    fun getRoleManagerData(roleManageFilterVo: RoleManageFilterVo?, current: Int, size: Int): List<RoleManageVo>
+}

+ 2 - 2
domain/src/main/java/com/grkj/domain/repository/IStepRepository.kt → data/src/main/java/com/grkj/data/repository/IStepRepository.kt

@@ -1,6 +1,6 @@
-package com.grkj.domain.repository
+package com.grkj.data.repository
 
-import com.grkj.domain.entity.res.StepDetailRes
+import com.grkj.data.model.res.StepDetailRes
 
 /**
  * 步骤相关仓储层

+ 2 - 2
domain/src/main/java/com/grkj/domain/repository/ITicketRepository.kt → data/src/main/java/com/grkj/data/repository/ITicketRepository.kt

@@ -1,6 +1,6 @@
-package com.grkj.domain.repository
+package com.grkj.data.repository
 
-import com.grkj.domain.entity.res.TicketDetailRes
+import com.grkj.data.model.res.TicketDetailRes
 
 /**
  * 工作票仓储

+ 16 - 4
domain/src/main/java/com/grkj/domain/repository/IUserRepository.kt → data/src/main/java/com/grkj/data/repository/IUserRepository.kt

@@ -1,7 +1,9 @@
-package com.grkj.domain.repository
+package com.grkj.data.repository
 
-import com.grkj.domain.entity.vo.UserManageFilterVo
-import javax.print.attribute.standard.MediaSize
+import android.health.connect.ReadRecordsRequestUsingIds
+import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UserManageVo
+import com.grkj.data.model.vo.UserManageFilterVo
 
 /**
  * 用户仓储层
@@ -39,5 +41,15 @@ interface IUserRepository {
         userManageFilterData: UserManageFilterVo?,
         current: Int,
         size: Int
-    ): List<*>
+    ): List<UserManageVo>
+
+    /**
+     * 添加用户
+     */
+    fun addUserData(addUserDataVo: AddUserDataVo): Long
+
+    /**
+     * 根据用户id删除用户
+     */
+    fun deleteUserById(userIds: List<Long>)
 }

+ 23 - 0
data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt

@@ -0,0 +1,23 @@
+package com.grkj.data.repository
+
+import com.grkj.data.model.dos.IsWorkstation
+
+/**
+ * 岗位仓储
+ */
+interface IWorkstationRepository {
+    /**
+     * 获取岗位数据
+     */
+    fun getWorkStationData(): List<IsWorkstation>
+
+    /**
+     * 添加角色岗位关联
+     */
+    fun addUserWorkstationData(userId: Long, workstationId: Long)
+
+    /**
+     * 根据用户id删除数据
+     */
+    fun deleteUserWorkstationByUserIds(userIds: List<Long>)
+}

+ 0 - 16
data/src/main/java/com/grkj/data/repository/StepRepository.kt

@@ -1,16 +0,0 @@
-package com.grkj.data.repository
-
-import com.grkj.domain.entity.res.StepDetailRes
-import com.grkj.domain.repository.IStepRepository
-
-/**
- * 步骤仓储层实现
- */
-class StepRepository : IStepRepository {
-    override fun getStepDetail(
-        ticketId: Long,
-        callback: (List<StepDetailRes>?) -> Unit
-    ) {
-        TODO("Not yet implemented")
-    }
-}

+ 0 - 16
data/src/main/java/com/grkj/data/repository/TicketRepository.kt

@@ -1,16 +0,0 @@
-package com.grkj.data.repository
-
-import com.grkj.domain.entity.res.TicketDetailRes
-import com.grkj.domain.repository.ITicketRepository
-
-/**
- * 工作票仓储实现
- */
-class TicketRepository : ITicketRepository {
-    override fun getTicketDetail(
-        ticketId: Long,
-        callback: (TicketDetailRes?) -> Unit
-    ) {
-        TODO("Not yet implemented")
-    }
-}

+ 32 - 9
data/src/main/java/com/grkj/data/repository/HardwareRepository.kt → data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt

@@ -1,15 +1,20 @@
-package com.grkj.data.repository
+package com.grkj.data.repository.impl
 
+import androidx.room.Room
 import com.grkj.data.dao.HardwareDao
 import com.grkj.data.database.ISCSDatabase
-import com.grkj.domain.entity.req.LockPointUpdateReq
-import com.grkj.domain.entity.req.LockTakeUpdateReq
-import com.grkj.domain.entity.res.CabinetSlotsRes
-import com.grkj.domain.entity.res.KeyInfoRes
-import com.grkj.domain.entity.res.KeyPageRes
-import com.grkj.domain.entity.res.LockInfoRes
-import com.grkj.domain.entity.res.LockPageRes
-import com.grkj.domain.repository.IHardwareRepository
+import com.grkj.data.model.dos.IsJobCardDo
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.model.req.LockPointUpdateReq
+import com.grkj.data.model.req.LockTakeUpdateReq
+import com.grkj.data.model.res.CabinetSlotsRes
+import com.grkj.data.model.res.KeyInfoRes
+import com.grkj.data.model.res.KeyPageRes
+import com.grkj.data.model.res.LockInfoRes
+import com.grkj.data.model.res.LockPageRes
+import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.shared.utils.Pinyin4jUtil
+import com.sik.sikcore.SIKCore
 
 /**
  * 硬件仓储
@@ -17,6 +22,16 @@ import com.grkj.domain.repository.IHardwareRepository
 class HardwareRepository : IHardwareRepository {
     private val hardwareDao: HardwareDao by lazy { ISCSDatabase.instance.hardwareDao() }
 
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: HardwareRepository by lazy {
+            HardwareRepository()
+        }
+    }
+
     /**
      * 获取锁信息
      */
@@ -94,4 +109,12 @@ class HardwareRepository : IHardwareRepository {
     ) {
         TODO("Not yet implemented")
     }
+
+    override fun addCard(userId: Long, userData: AddUserDataVo) {
+        val isJobCard = IsJobCardDo()
+        isJobCard.userId = userId
+        isJobCard.cardCode = userData.cardCode
+        isJobCard.userName = Pinyin4jUtil.toInitials(userData.nickname)
+        hardwareDao.addCard(isJobCard)
+    }
 }

+ 59 - 0
data/src/main/java/com/grkj/data/repository/impl/RoleRepository.kt

@@ -0,0 +1,59 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.dao.RoleDao
+import com.grkj.data.database.ISCSDatabase
+import com.grkj.data.model.dos.SysRole
+import com.grkj.data.model.dos.SysUserRole
+import com.grkj.data.model.vo.RoleManageFilterVo
+import com.grkj.data.model.vo.RoleManageVo
+import com.grkj.data.repository.IRoleRepository
+
+/**
+ * 岗位仓储
+ */
+class RoleRepository : IRoleRepository {
+    private val roleDao: RoleDao by lazy { ISCSDatabase.instance.roleDao() }
+
+    override fun getRoleData(): List<SysRole> {
+        return roleDao.getRoleData()
+    }
+
+    override fun addUserRoleData(userId: Long, roleId: Long) {
+        val sysUserRole = SysUserRole()
+        sysUserRole.userId = userId
+        sysUserRole.roleId = roleId
+        roleDao.insertUserRole(sysUserRole)
+    }
+
+    override fun deleteUserRoleByUserId(userIds: List<Long>) {
+        roleDao.deleteUserRoleByUserIds(userIds)
+    }
+
+    override fun deleteRoleByRoleIds(roleIds: List<Long>) {
+        roleDao.deleteRoleByRoleIds(roleIds)
+    }
+
+    override fun getRoleManagerData(
+        roleManageFilterVo: RoleManageFilterVo?,
+        current: Int,
+        size: Int
+    ): List<RoleManageVo> {
+        return roleDao.getRoleManageData(
+            roleManageFilterVo?.roleName,
+            roleManageFilterVo?.permissionCharacters,
+            roleManageFilterVo?.status?.let { if (it == true) "0" else "1" },
+            size,
+            current * size
+        )
+    }
+
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: RoleRepository by lazy {
+            RoleRepository()
+        }
+    }
+}

+ 25 - 0
data/src/main/java/com/grkj/data/repository/impl/StepRepository.kt

@@ -0,0 +1,25 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.repository.IStepRepository
+import com.grkj.data.model.res.StepDetailRes
+
+/**
+ * 步骤仓储层实现
+ */
+class StepRepository : IStepRepository {
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: StepRepository by lazy {
+            StepRepository()
+        }
+    }
+    override fun getStepDetail(
+        ticketId: Long,
+        callback: (List<StepDetailRes>?) -> Unit
+    ) {
+        TODO("Not yet implemented")
+    }
+}

+ 25 - 0
data/src/main/java/com/grkj/data/repository/impl/TicketRepository.kt

@@ -0,0 +1,25 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.repository.ITicketRepository
+import com.grkj.data.model.res.TicketDetailRes
+
+/**
+ * 工作票仓储实现
+ */
+class TicketRepository : ITicketRepository {
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: TicketRepository by lazy {
+            TicketRepository()
+        }
+    }
+    override fun getTicketDetail(
+        ticketId: Long,
+        callback: (TicketDetailRes?) -> Unit
+    ) {
+        TODO("Not yet implemented")
+    }
+}

+ 31 - 6
data/src/main/java/com/grkj/data/repository/UserRepository.kt → data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt

@@ -1,18 +1,18 @@
-package com.grkj.data.repository
+package com.grkj.data.repository.impl
 
-import android.util.Base64
 import com.grkj.data.dao.HardwareDao
 import com.grkj.data.dao.UserDao
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.model.dos.SysUserDo
+import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.data.model.vo.UserManageVo
-import com.grkj.domain.entity.vo.UserManageFilterVo
-import com.grkj.domain.repository.IUserRepository
+import com.grkj.data.model.vo.UserManageFilterVo
+import com.grkj.data.repository.IUserRepository
 import com.grkj.shared.utils.BCryptUtils
 import com.grkj.shared.utils.BiometricVerifier
-import com.sik.sikcore.extension.file
-import com.sik.sikcore.string.RegexUtils
+import com.grkj.shared.utils.Pinyin4jUtil
+import org.slf4j.LoggerFactory
 
 /**
  * 用户仓储层
@@ -22,6 +22,17 @@ class UserRepository : IUserRepository {
 
     private val userDao: UserDao by lazy { ISCSDatabase.instance.userDao() }
 
+    companion object {
+
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: UserRepository by lazy {
+            UserRepository()
+        }
+    }
+
     override fun loginWithAccount(
         username: String, password: String
     ): Boolean {
@@ -124,9 +135,23 @@ class UserRepository : IUserRepository {
         return userDao.getUserManagerData(
             userManageFilterData?.nickname,
             userManageFilterData?.cardCode,
+            userManageFilterData?.workstationName,
             userManageFilterData?.status,
             current * size,
             size
         )
     }
+
+    override fun addUserData(addUserDataVo: AddUserDataVo): Long {
+        val sysUserDo = SysUserDo()
+        sysUserDo.userName = Pinyin4jUtil.toInitials(addUserDataVo.nickname)
+        sysUserDo.nickName = addUserDataVo.nickname
+        sysUserDo.status = if (addUserDataVo.status) "0" else "2"
+        sysUserDo.delFlag = "0"
+        return userDao.insert(sysUserDo)
+    }
+
+    override fun deleteUserById(userIds: List<Long>) {
+        userDao.deleteUserByIds(userIds)
+    }
 }

+ 38 - 0
data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt

@@ -0,0 +1,38 @@
+package com.grkj.data.repository.impl
+
+import com.grkj.data.dao.WorkstationDao
+import com.grkj.data.database.ISCSDatabase
+import com.grkj.data.model.dos.IsUserWorkstation
+import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.repository.IWorkstationRepository
+
+/**
+ * 岗位仓储
+ */
+class WorkstationRepository : IWorkstationRepository {
+    private val workstationDao: WorkstationDao by lazy { ISCSDatabase.instance.workstationDao() }
+
+    override fun getWorkStationData(): List<IsWorkstation> {
+        return workstationDao.getWorkstationData()
+    }
+
+    override fun addUserWorkstationData(userId: Long, workstationId: Long) {
+        val isUserWorkstation = IsUserWorkstation()
+        isUserWorkstation.userId = userId
+        isUserWorkstation.workstationId = workstationId
+        workstationDao.insertUserWorkstation(isUserWorkstation)
+    }
+
+    override fun deleteUserWorkstationByUserIds(userIds: List<Long>) {
+        workstationDao.deleteUserWorkstationByUserIds(userIds)
+    }
+    companion object {
+        /**
+         * 单例
+         */
+        @JvmStatic
+        val instance: WorkstationRepository by lazy {
+            WorkstationRepository()
+        }
+    }
+}

+ 0 - 1
domain/.gitignore

@@ -1 +0,0 @@
-/build

+ 0 - 18
domain/build.gradle.kts

@@ -1,18 +0,0 @@
-plugins {
-    id("java-library")
-    alias(libs.plugins.jetbrains.kotlin.jvm)
-}
-java {
-    sourceCompatibility = JavaVersion.VERSION_11
-    targetCompatibility = JavaVersion.VERSION_11
-}
-kotlin {
-    compilerOptions {
-        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11
-    }
-}
-
-dependencies {
-    // 领域层单元测试
-    testImplementation(libs.junit)
-}

+ 0 - 1
settings.gradle.kts

@@ -28,4 +28,3 @@ include(":shared")
 include(":data")
 include(":sync")
 include(":ui-base")
-include(":domain")

+ 1 - 0
shared/build.gradle.kts

@@ -50,6 +50,7 @@ dependencies {
     api(libs.sik.extension.encrypt)
     api("org.mindrot:jbcrypt:0.4")
     implementation("com.machinezoo.sourceafis:sourceafis:3.15.0")
+    implementation("com.belerweb:pinyin4j:2.5.0")
     testImplementation(libs.junit)
     api(
         fileTree(

+ 43 - 0
shared/src/main/java/com/grkj/shared/utils/PinyinUtil.kt

@@ -0,0 +1,43 @@
+package com.grkj.shared.utils
+
+import net.sourceforge.pinyin4j.PinyinHelper
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination
+
+object Pinyin4jUtil {
+    private val fmt = HanyuPinyinOutputFormat().apply {
+        caseType = HanyuPinyinCaseType.LOWERCASE     // 全部小写
+        toneType = HanyuPinyinToneType.WITHOUT_TONE  // 不带声调
+    }
+
+    /** 汉字转拼音,其他字符原样保留 */
+    fun toPinyin(input: String): String {
+        val sb = StringBuilder()
+        for (ch in input) {
+            if (ch.toInt() in 0x4E00..0x9FFF) {
+                try {
+                    val arr = PinyinHelper.toHanyuPinyinStringArray(ch, fmt)
+                    if (arr != null && arr.isNotEmpty()) {
+                        sb.append(arr[0]).append(" ")
+                    } else {
+                        sb.append(ch)
+                    }
+                } catch (e: BadHanyuPinyinOutputFormatCombination) {
+                    sb.append(ch)
+                }
+            } else {
+                sb.append(ch)
+            }
+        }
+        return sb.toString().trimEnd()
+    }
+
+    /** 取首字母大写 */
+    fun toInitials(input: String): String {
+        return toPinyin(input)
+            .split("\\s+".toRegex())
+            .joinToString("") { it.firstOrNull()?.lowercase().toString() }
+    }
+}

+ 0 - 1
sync/build.gradle.kts

@@ -36,6 +36,5 @@ dependencies {
 
     implementation(libs.androidx.core.ktx)
     implementation(project(":data"))
-    implementation(project(":domain"))
     testImplementation(libs.junit)
 }

+ 3 - 0
ui-base/src/main/java/com/grkj/ui_base/base/BaseViewModel.kt

@@ -1,9 +1,12 @@
 package com.grkj.ui_base.base
 
 import androidx.lifecycle.ViewModel
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
 
 /**
  * 界面模型基类
  */
 open class BaseViewModel : ViewModel() {
+    protected val logger: Logger = LoggerFactory.getLogger(this::class.java)
 }

+ 14 - 14
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -4,20 +4,20 @@ import com.clj.fastble.BleManager
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
 import com.google.gson.Gson
-import com.grkj.data.repository.HardwareRepository
-import com.grkj.data.repository.StepRepository
-import com.grkj.data.repository.TicketRepository
-import com.grkj.domain.entity.local.DeviceTakeUpdate
-import com.grkj.domain.entity.local.UpdateKeyReturn
-import com.grkj.domain.entity.local.WorkTicketGet
-import com.grkj.domain.entity.local.WorkTicketSend
-import com.grkj.domain.entity.local.WorkTicketSend.LockListBO
-import com.grkj.domain.entity.req.LockPointUpdateReq
-import com.grkj.domain.entity.res.CommonDictRes
-import com.grkj.domain.entity.res.TicketDetailRes
-import com.grkj.domain.repository.IHardwareRepository
-import com.grkj.domain.repository.IStepRepository
-import com.grkj.domain.repository.ITicketRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.repository.impl.StepRepository
+import com.grkj.data.repository.impl.TicketRepository
+import com.grkj.data.model.local.DeviceTakeUpdate
+import com.grkj.data.model.local.UpdateKeyReturn
+import com.grkj.data.model.local.WorkTicketGet
+import com.grkj.data.model.local.WorkTicketSend
+import com.grkj.data.model.local.WorkTicketSend.LockListBO
+import com.grkj.data.model.req.LockPointUpdateReq
+import com.grkj.data.model.res.CommonDictRes
+import com.grkj.data.model.res.TicketDetailRes
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IStepRepository
+import com.grkj.data.repository.ITicketRepository
 import com.grkj.ui_base.R
 import com.grkj.shared.config.Constants
 import com.grkj.ui_base.data.DictConstants

+ 5 - 5
ui-base/src/main/java/com/grkj/ui_base/business/DataBusiness.kt

@@ -1,10 +1,10 @@
 package com.grkj.ui_base.business
 
-import com.grkj.data.repository.HardwareRepository
-import com.grkj.domain.entity.res.CabinetSlotsRes
-import com.grkj.domain.entity.res.KeyPageRes
-import com.grkj.domain.entity.res.LockPageRes
-import com.grkj.domain.repository.IHardwareRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.model.res.CabinetSlotsRes
+import com.grkj.data.model.res.KeyPageRes
+import com.grkj.data.model.res.LockPageRes
+import com.grkj.data.repository.IHardwareRepository
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
 

+ 5 - 5
ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt

@@ -1,11 +1,11 @@
 package com.grkj.ui_base.business
 
 import com.clj.fastble.BleManager
-import com.grkj.data.repository.HardwareRepository
-import com.grkj.domain.entity.local.DeviceTakeUpdate
-import com.grkj.domain.entity.req.LockTakeUpdateReq
-import com.grkj.domain.entity.res.CommonDictRes
-import com.grkj.domain.repository.IHardwareRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.model.local.DeviceTakeUpdate
+import com.grkj.data.model.req.LockTakeUpdateReq
+import com.grkj.data.model.res.CommonDictRes
+import com.grkj.data.repository.IHardwareRepository
 import com.grkj.ui_base.R
 import com.grkj.ui_base.data.DictConstants
 import com.grkj.ui_base.utils.CommonUtils

+ 5 - 5
ui-base/src/main/java/com/grkj/ui_base/utils/SPUtils.kt

@@ -3,11 +3,11 @@ package com.grkj.ui_base.utils
 import android.content.Context
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
-import com.grkj.domain.entity.local.LoginUser
-import com.grkj.domain.entity.local.UpdateKeyReturn
-import com.grkj.domain.entity.req.LockPointUpdateReq
-import com.grkj.domain.entity.res.SystemAttributePageRes
-import com.grkj.domain.entity.res.UserInfoRes
+import com.grkj.data.model.local.LoginUser
+import com.grkj.data.model.local.UpdateKeyReturn
+import com.grkj.data.model.req.LockPointUpdateReq
+import com.grkj.data.model.res.SystemAttributePageRes
+import com.grkj.data.model.res.UserInfoRes
 import com.sik.sikcore.extension.getMMKVData
 import com.sik.sikcore.extension.saveMMKVData
 import com.tencent.mmkv.MMKV

+ 3 - 3
ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

@@ -1,9 +1,9 @@
 package com.grkj.ui_base.utils.modbus
 
 import com.clj.fastble.BleManager
-import com.grkj.data.repository.HardwareRepository
-import com.grkj.domain.entity.res.CabinetSlotsRecord
-import com.grkj.domain.repository.IHardwareRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.model.res.CabinetSlotsRecord
+import com.grkj.data.repository.IHardwareRepository
 import com.grkj.ui_base.R
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.Executor