Bladeren bron

refactor(更新)
- 角色管理修改完成
- 用户管理的区域和角色改为多选
- 菜单界面的权限配置完成

周文健 5 maanden geleden
bovenliggende
commit
e5cbe50082
49 gewijzigde bestanden met toevoegingen van 469 en 192 verwijderingen
  1. 4 2
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  2. 13 19
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  3. 43 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  4. 15 8
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  5. 3 0
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt
  6. 5 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  7. 46 22
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  8. 17 9
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataManageHomeFragment.kt
  9. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  10. 24 23
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  11. 11 7
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionManageHomeFragment.kt
  12. 15 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/HardwareManageHomeFragment.kt
  13. 21 17
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt
  14. 5 5
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt
  15. 37 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  16. 5 0
      app/src/main/res/drawable/icon_check.xml
  17. 2 2
      app/src/main/res/layout/activity_main.xml
  18. 5 4
      app/src/main/res/layout/dialog_add_user.xml
  19. 1 0
      app/src/main/res/layout/dialog_filter_user.xml
  20. 1 0
      app/src/main/res/layout/dialog_update_user.xml
  21. 22 6
      app/src/main/res/layout/item_home_text_drop_down.xml
  22. 2 0
      app/src/main/res/values-en/strings.xml
  23. 2 0
      app/src/main/res/values-zh/strings.xml
  24. 2 0
      app/src/main/res/values/strings.xml
  25. 6 1
      data/src/main/java/com/grkj/data/dao/HardwareDao.kt
  26. 4 3
      data/src/main/java/com/grkj/data/dao/RoleDao.kt
  27. 3 3
      data/src/main/java/com/grkj/data/dao/SysMenuDao.kt
  28. 7 0
      data/src/main/java/com/grkj/data/dao/UserDao.kt
  29. 1 1
      data/src/main/java/com/grkj/data/dao/WorkstationDao.kt
  30. 4 0
      data/src/main/java/com/grkj/data/model/dos/SysUserDo.kt
  31. 2 2
      data/src/main/java/com/grkj/data/model/vo/AddUserDataVo.kt
  32. 13 0
      data/src/main/java/com/grkj/data/model/vo/UpdateUserDataVo.kt
  33. 1 1
      data/src/main/java/com/grkj/data/model/vo/UserManageFilterVo.kt
  34. 11 0
      data/src/main/java/com/grkj/data/repository/BaseRepository.kt
  35. 6 1
      data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt
  36. 1 1
      data/src/main/java/com/grkj/data/repository/IRoleRepository.kt
  37. 6 0
      data/src/main/java/com/grkj/data/repository/IUserRepository.kt
  38. 1 1
      data/src/main/java/com/grkj/data/repository/IWorkstationRepository.kt
  39. 10 6
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt
  40. 2 1
      data/src/main/java/com/grkj/data/repository/impl/IsolationPointRepository.kt
  41. 2 1
      data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt
  42. 2 1
      data/src/main/java/com/grkj/data/repository/impl/RfidTokenRepository.kt
  43. 14 8
      data/src/main/java/com/grkj/data/repository/impl/RoleRepository.kt
  44. 2 1
      data/src/main/java/com/grkj/data/repository/impl/SopRepository.kt
  45. 2 1
      data/src/main/java/com/grkj/data/repository/impl/SysMenuRepository.kt
  46. 43 11
      data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt
  47. 11 6
      data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt
  48. 8 0
      ui-base/src/main/java/com/grkj/ui_base/config/ISCSConfig.kt
  49. 5 0
      ui-base/src/main/java/com/grkj/ui_base/data/MMKVConstants.kt

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

@@ -58,9 +58,11 @@ class LoginDialog(
                 return@setOnClickListener
             }
             LoadingEvent.sendLoadingEvent(CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),true)
+            val username = if (mBinding.etAccount.text.toString()=="1")"罗成" else "zwj"
+            val password = if (mBinding.etAccount.text.toString()=="1")"123456" else "zwj"
             viewModel.loginWithAccount(
-                "罗成",
-                "123456"
+                username,
+                password,
 //                mBinding.etAccount.text.toString(),
 //                mBinding.etPassword.text.toString()
             ).observe(lifecycleOwner) {

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

@@ -9,9 +9,11 @@ import androidx.core.view.get
 import androidx.core.view.isNotEmpty
 import androidx.core.view.isVisible
 import com.grkj.data.data.MainDomainData
+import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.data.model.local.TabConfig
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityMainBinding
+import com.grkj.iscs.features.main.entity.RoleManageFunctionalPermissionsEntity
 import com.grkj.iscs.features.main.viewmodel.MainViewModel
 import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseActivity
@@ -32,37 +34,37 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
         TabConfig(
             View.generateViewId(),
             R.navigation.nav_home,
-            "主页",
+            RoleFunctionalPermissionsEnum.HOME.description,
             R.mipmap.icon_bottom_menu_home,
-            "PERM_HOME"
+            RoleFunctionalPermissionsEnum.HOME.functionalPermission
         ),
         TabConfig(
             View.generateViewId(),
             R.navigation.nav_data_manage,
-            "数据管理",
+            RoleFunctionalPermissionsEnum.DATA_HOME_MANAGE.description,
             R.mipmap.icon_bottom_menu_data_manage,
-            "PERM_DATA_MANAGE"
+            RoleFunctionalPermissionsEnum.DATA_HOME_MANAGE.functionalPermission
         ),
         TabConfig(
             View.generateViewId(),
             R.navigation.nav_job_manage,
-            "作业管理",
+            RoleFunctionalPermissionsEnum.JOB_TICKET_HOME_MANAGE.description,
             R.mipmap.icon_bottom_menu_job_manage,
-            "PERM_JOB_MANAGE"
+            RoleFunctionalPermissionsEnum.JOB_TICKET_HOME_MANAGE.functionalPermission
         ),
         TabConfig(
             View.generateViewId(),
             R.navigation.nav_hardware_manage,
-            "硬件管理",
+            RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE.description,
             R.mipmap.icon_bottom_menu_hardware_manage,
-            "PERM_HARDWARE_MANAGE"
+            RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE.functionalPermission
         ),
         TabConfig(
             View.generateViewId(),
             R.navigation.nav_exception_manage,
-            "异常管理",
+            RoleFunctionalPermissionsEnum.EXCEPTION_HOME_MANAGE.description,
             R.mipmap.icon_bottom_menu_exception_manage,
-            "PERM_EXCEPTION_MANAGE"
+            RoleFunctionalPermissionsEnum.EXCEPTION_HOME_MANAGE.functionalPermission
         ),
     )
 
@@ -78,16 +80,8 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
         // 动态构造底部菜单(可加权限过滤)
         binding.bottomNav.isItemActiveIndicatorEnabled = false
         binding.bottomNav.menu.clear()
-        val userPerms = mutableListOf<String>(
-            "PERM_HOME",
-            "PERM_DATA_MANAGE",
-            "PERM_JOB_MANAGE",
-            "PERM_HARDWARE_MANAGE",
-            "PERM_EXCEPTION_MANAGE"
-        )
         tabConfigs.forEachIndexed { index, cfg ->
-            if (userPerms.contains(cfg.permission)) {
-                logger.info("菜单:${index},${cfg}")
+            if (MainDomainData.permissions.contains(cfg.permission)) {
                 binding.bottomNav.menu.add(Menu.NONE, cfg.id, index, cfg.title).setIcon(cfg.icon)
             }
         }

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.dialog
 
 import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
@@ -19,6 +20,8 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
     private lateinit var binding: DialogDropDownListBinding
     private var textSize = AutoSizeUtils.dp2px(context, 12f)
     private var onItemSelectedListener: (TextDropDownEntity) -> Unit = {}
+    private var onItemMultiSelectedListener: (List<TextDropDownEntity>?) -> Unit = {}
+    private var multiSelect: Boolean = false
 
     init {
         setContentView(R.layout.dialog_drop_down_list)
@@ -40,9 +43,19 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
         val itemBinding = holder.getBinding<ItemHomeTextDropDownBinding>()
         val item = holder.getModel<TextDropDownEntity>()
         itemBinding.dropDownText.text = item.getShowText()
+        itemBinding.checkIv.isVisible = item.isSelected()
         itemBinding.root.setOnClickListener {
-            onItemSelectedListener(item)
-            dismiss()
+            if (multiSelect) {
+                item.setSelected(!item.isSelected())
+                itemBinding.checkIv.isVisible = item.isSelected()
+                onItemMultiSelectedListener(
+                    binding.dropDownRv.models?.filterIsInstance<TextDropDownEntity>()
+                        ?.filter { it.isSelected() }?.toList()
+                )
+            } else {
+                onItemSelectedListener(item)
+                dismiss()
+            }
         }
     }
 
@@ -64,9 +77,18 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
      * 选择监听
      */
     fun setOnItemSelectListener(onItemSelected: (TextDropDownEntity) -> Unit) {
+        multiSelect = false
         this.onItemSelectedListener = onItemSelected
     }
 
+    /**
+     * 多选监听
+     */
+    fun setOnItemMultiSelectListener(onItemMultiSelect: (List<TextDropDownEntity>?) -> Unit) {
+        multiSelect = true
+        this.onItemMultiSelectedListener = onItemMultiSelect
+    }
+
     /**
      * 文本下拉弹窗数据实体接口
      */
@@ -90,6 +112,16 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
          * 获取保存的数据
          */
         fun getData(): Any?
+
+        /**
+         * 是否选中
+         */
+        fun isSelected(): Boolean
+
+        /**
+         * 设置是否选中
+         */
+        fun setSelected(isSelect: Boolean)
     }
 
     /**
@@ -101,6 +133,7 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
         val dataTag: String = "",
         var dataText: String = ""
     ) : TextDropDownEntity {
+        var isSelect: Boolean = false
         override fun getId(): Long {
             return dataId
         }
@@ -116,5 +149,13 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
         override fun getData(): Any? {
             return dataObject
         }
+
+        override fun isSelected(): Boolean {
+            return isSelect
+        }
+
+        override fun setSelected(isSelect: Boolean) {
+            this.isSelect = isSelect
+        }
     }
 }

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

@@ -2,10 +2,12 @@ package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 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.config.ISCSConfig
 import com.grkj.ui_base.utils.extension.tipDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import razerdp.basepopup.BasePopupWindow
@@ -18,8 +20,8 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
     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 selectedRoleData: List<TextDropDownDialog.TextDropDownEntity>? = null
+    private var selectedWorkstationData: List<TextDropDownDialog.TextDropDownEntity>? = null
     private var onConfirm: (AddUserDataVo) -> Unit = {}
 
     init {
@@ -31,19 +33,24 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
     override fun onViewCreated(contentView: View) {
         super.onViewCreated(contentView)
         binding = DialogAddUserBinding.bind(contentView)
+        binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
         binding.roleTv.setOnClickListener {
             textDropDownDialog.setData(roleData)
-            textDropDownDialog.setOnItemSelectListener {
+            textDropDownDialog.setOnItemMultiSelectListener {
                 selectedRoleData = it
-                binding.roleTv.text = it.getShowText()
+                if (it?.isEmpty() == true) {
+                    binding.roleTv.text = ""
+                } else {
+                    binding.roleTv.text = it?.joinToString(",") { it.getShowText() }
+                }
             }
             textDropDownDialog.showPopupWindow(binding.roleTv)
         }
         binding.workstationNameTv.setOnClickListener {
             textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemSelectListener {
+            textDropDownDialog.setOnItemMultiSelectListener {
                 selectedWorkstationData = it
-                binding.workstationNameTv.text = it.getShowText()
+                binding.workstationNameTv.text =  it?.joinToString(",") { it.getShowText() }
             }
             textDropDownDialog.showPopupWindow(binding.workstationNameTv)
         }
@@ -54,8 +61,8 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
                 val addUserData = AddUserDataVo(
                     binding.nicknameEt.text.toString(),
                     binding.cardcodeEt.text.toString(),
-                    selectedRoleData?.getId() ?: 0,
-                    selectedWorkstationData?.getId() ?: 0,
+                    selectedRoleData?.map { it.getId() } ?: listOf(),
+                    selectedWorkstationData?.map { it.getId() } ?: listOf(),
                     binding.statusRg.checkedRadioButtonId == binding.activateRb.id
                 )
                 onConfirm(addUserData)

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

@@ -2,9 +2,11 @@ package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterUserBinding
+import com.grkj.ui_base.config.ISCSConfig
 import razerdp.basepopup.BasePopupWindow
 
 /**
@@ -21,6 +23,7 @@ class FilterUserDialog(context: Context) : BasePopupWindow(context) {
     override fun onViewCreated(contentView: View) {
         super.onViewCreated(contentView)
         binding = DialogFilterUserBinding.bind(contentView)
+        binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
         binding.closeIv.setOnClickListener { dismiss() }
         binding.confirm.setOnClickListener {
             val filterData = UserManageFilterVo(

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

@@ -70,7 +70,6 @@ class UpdateRoleDialog(context: Context) : BasePopupWindow(context) {
             if (binding.allSelected.isChecked) {
                 selectAllOrNone(true, roleManageFunctionalPermissionsData)
             } else {
-
                 setSelectedData(roleManageFunctionalPermissionsData)
             }
             binding.roleListRv.models = roleManageFunctionalPermissionsData
@@ -187,12 +186,16 @@ class UpdateRoleDialog(context: Context) : BasePopupWindow(context) {
         }
         itemBinding.roleTv.text = item.description
         itemBinding.roleCb.setOnCheckedChangeListener(null)
-        itemBinding.roleCb.isChecked = item.isSelected
+        itemBinding.roleCb.isChecked = item.isSelected || item.children.any { it.isSelected }
         itemBinding.roleCb.setOnCheckedChangeListener { _, isChecked ->
             item.isSelected = isChecked
             if (item.children.isNotEmpty()) {
                 selectAllOrNone(isChecked, item.children)
             }
+            holder.findParentViewHolder()?.let {
+                val parentItem = it.getModel<RoleManageFunctionalPermissionsEntity>()
+                parentItem.isSelected = parentItem.children.any { it.isSelected }
+            }
             if (isChecked) {
                 selectedPermission.add(item.functionalPermission)
             } else {

+ 46 - 22
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UserDetailDialog.kt → app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt

@@ -2,49 +2,60 @@ package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogUserDetailBinding
+import com.grkj.iscs.databinding.DialogUpdateUserBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.extension.tipDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import razerdp.basepopup.BasePopupWindow
 
 /**
- * 新用户
+ * 新用户
  */
-class UserDetailDialog(context: Context) : BasePopupWindow(context) {
-    private lateinit var binding: DialogUserDetailBinding
+class UpdateUserDialog(context: Context) : BasePopupWindow(context) {
+    private lateinit var binding: DialogUpdateUserBinding
     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 = {}
+    private var selectedRoleData: MutableList<TextDropDownDialog.TextDropDownEntity>? =
+        mutableListOf()
+    private var selectedWorkstationData: MutableList<TextDropDownDialog.TextDropDownEntity>? =
+        mutableListOf()
+    private var onConfirm: (UpdateUserDataVo) -> Unit = {}
+    private var userId: Long = 0
 
     init {
-        setContentView(R.layout.dialog_user_detail)
+        setContentView(R.layout.dialog_update_user)
         textDropDownDialog = TextDropDownDialog(context)
         textDropDownDialog.setWidthAsAnchorView(true)
     }
 
     override fun onViewCreated(contentView: View) {
         super.onViewCreated(contentView)
-        binding = DialogUserDetailBinding.bind(contentView)
+        binding = DialogUpdateUserBinding.bind(contentView)
+        binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
         binding.roleTv.setOnClickListener {
             textDropDownDialog.setData(roleData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectedRoleData = it
-                binding.roleTv.text = it.getShowText()
+            textDropDownDialog.setOnItemMultiSelectListener {
+                selectedRoleData = it?.toMutableList()
+                if (it?.isEmpty() == true) {
+                    binding.roleTv.text = ""
+                } else {
+                    binding.roleTv.text = it?.joinToString(",") { it.getShowText() }
+                }
             }
             textDropDownDialog.showPopupWindow(binding.roleTv)
         }
         binding.workstationNameTv.setOnClickListener {
             textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectedWorkstationData = it
-                binding.workstationNameTv.text = it.getShowText()
+            textDropDownDialog.setOnItemMultiSelectListener {
+                selectedWorkstationData = it?.toMutableList()
+                binding.workstationNameTv.text = it?.joinToString(",") { it.getShowText() }
             }
             textDropDownDialog.showPopupWindow(binding.workstationNameTv)
         }
@@ -52,20 +63,20 @@ class UserDetailDialog(context: Context) : BasePopupWindow(context) {
         binding.closeIv.setOnClickListener { dismiss() }
         binding.confirm.setOnClickListener {
             if (checkData()) {
-                val addUserData = AddUserDataVo(
+                val updateUserData = UpdateUserDataVo(
+                    userId,
                     binding.nicknameEt.text.toString(),
                     binding.cardcodeEt.text.toString(),
-                    selectedRoleData?.getId() ?: 0,
-                    selectedWorkstationData?.getId() ?: 0,
+                    selectedRoleData?.map { it.getId() } ?: listOf(),
+                    selectedWorkstationData?.map { it.getId() } ?: listOf(),
                     binding.statusRg.checkedRadioButtonId == binding.activateRb.id
                 )
-                onConfirm(addUserData)
+                onConfirm(updateUserData)
                 binding.nicknameEt.setText("")
                 binding.cardcodeEt.setText("")
                 binding.roleTv.text = ""
                 binding.workstationNameTv.text = ""
-                binding.activateRb.isChecked = false
-                binding.deactivateRb.isChecked = false
+                binding.statusRg.clearCheck()
                 dismiss()
             }
         }
@@ -115,7 +126,7 @@ class UserDetailDialog(context: Context) : BasePopupWindow(context) {
     /**
      * 设置确认监听
      */
-    fun setOnConfirmListener(onConfirm: (AddUserDataVo) -> Unit) {
+    fun setOnConfirmListener(onConfirm: (UpdateUserDataVo) -> Unit) {
         this.onConfirm = onConfirm
     }
 
@@ -123,11 +134,24 @@ class UserDetailDialog(context: Context) : BasePopupWindow(context) {
      * 设置用户数据
      */
     fun setUserData(userData: UserManageVo) {
+        userId = userData.userId
         binding.nicknameEt.setText(userData.nickName)
         binding.cardcodeEt.setText(userData.cardCodes.joinToString(","))
         binding.roleTv.text = userData.roleNames.filter { it != null }.joinToString(",")
+        roleData.forEach {
+            if (userData.roleNames.contains(it.getShowText())) {
+                it.setSelected(userData.roleNames.contains(it.getShowText()))
+                selectedRoleData?.add(it)
+            }
+        }
         binding.workstationNameTv.text =
             userData.workstationNames.filter { it != null }.joinToString(",")
+        workstationData.forEach {
+            if (userData.workstationNames.contains(it.getShowText())) {
+                it.setSelected(userData.workstationNames.contains(it.getShowText()))
+                selectedWorkstationData?.add(it)
+            }
+        }
         binding.activateRb.isChecked = userData.getStatus()
         binding.deactivateRb.isChecked = !userData.getStatus()
     }

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

@@ -11,11 +11,14 @@ import com.drake.brv.utils.setup
 import com.google.android.material.badge.BadgeDrawable
 import com.google.android.material.badge.BadgeUtils
 import com.google.android.material.badge.ExperimentalBadgeUtils
+import com.grkj.data.data.MainDomainData
+import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentDataManageHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -24,30 +27,30 @@ import dagger.hilt.android.AndroidEntryPoint
  */
 @AndroidEntryPoint
 class DataManageHomeFragment : BaseFragment<FragmentDataManageHomeBinding>() {
-    private val menuData: MutableList<MenuItemEntity> = mutableListOf(
+    private var menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(
             0,
             R.mipmap.icon_data_manage_menu_user_manage,
-            "用户管理",
-            "data_manage:user_manage"
+            RoleFunctionalPermissionsEnum.USER_MANAGE.description,
+            RoleFunctionalPermissionsEnum.USER_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             1,
             R.mipmap.icon_data_manage_menu_role_manage,
-            "角色管理",
-            "data_manage:role_manage"
+            RoleFunctionalPermissionsEnum.ROLE_MANAGE.description,
+            RoleFunctionalPermissionsEnum.ROLE_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             2,
             R.mipmap.icon_data_manage_menu_area_manage,
-            "区域管理",
-            "data_manage:area_manage"
+            RoleFunctionalPermissionsEnum.WORKSTATION_MANAGE.description,
+            RoleFunctionalPermissionsEnum.WORKSTATION_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             3,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "点位管理",
-            "data_manage:point_manage"
+            RoleFunctionalPermissionsEnum.POINT_MANAGE.description,
+            RoleFunctionalPermissionsEnum.POINT_MANAGE.functionalPermission
         ),
     )
 
@@ -73,6 +76,11 @@ class DataManageHomeFragment : BaseFragment<FragmentDataManageHomeBinding>() {
 
     override fun initData() {
         super.initData()
+        if (!ISCSConfig.isWorkstationOn) {
+            menuData.removeIf { it.type == 2 }
+        }
+        menuData =
+            menuData.filter { MainDomainData.permissions.contains(it.permission) }.toMutableList()
         binding.homeMenuRv.models = menuData
     }
 

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

@@ -153,7 +153,7 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
     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.roleNum.text = item.roleId.toString()
         itemBinding.roleName.text = item.roleName
         itemBinding.roleKeyTv.text = item.roleKey
         itemBinding.select.setOnCheckedChangeListener(null)

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

@@ -3,7 +3,6 @@ package com.grkj.iscs.features.main.fragment.data_manage
 import android.graphics.Color
 import android.view.Gravity
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.divider
@@ -17,7 +16,7 @@ import com.grkj.iscs.databinding.ItemUserManageUserBinding
 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.dialog.data_manage.UpdateUserDialog
 import com.grkj.iscs.features.main.viewmodel.data_manage.UserManageViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
@@ -35,7 +34,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
     private val viewModel: UserManageViewModel by viewModels()
     private lateinit var addUserDialog: AddUserDialog
     private lateinit var filterUserDialog: FilterUserDialog
-    private lateinit var userDetailDialog: UserDetailDialog
+    private lateinit var updateUserDialog: UpdateUserDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_user_manage
     }
@@ -45,8 +44,8 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         addUserDialog.popupGravity = Gravity.CENTER
         filterUserDialog = FilterUserDialog(requireContext())
         filterUserDialog.popupGravity = Gravity.CENTER
-        userDetailDialog = UserDetailDialog(requireContext())
-        userDetailDialog.popupGravity = Gravity.CENTER
+        updateUserDialog = UpdateUserDialog(requireContext())
+        updateUserDialog.popupGravity = Gravity.CENTER
         filterUserDialog.setOnConfirmListener {
             viewModel.userFilterData = it
             getUserData(nextPage = false)
@@ -80,14 +79,14 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                 }
             }
         }
-        userDetailDialog.setOnConfirmListener {
-            viewModel.addUser(it).observe(this) {
+        updateUserDialog.setOnConfirmListener {
+            viewModel.updateUser(it).observe(this) {
                 if (it) {
                     TipDialog.show(
                         title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
                             .toString(),
                         dialogType = TipDialog.DialogType.SUCCESS,
-                        msg = CommonUtils.getStr(R.string.add_user_succeed).toString(),
+                        msg = CommonUtils.getStr(R.string.update_user_succeed).toString(),
                         countDownTime = 10,
                         showConfirm = false,
                         onCancelClick = {
@@ -99,7 +98,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                         title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
                             .toString(),
                         dialogType = TipDialog.DialogType.ERROR,
-                        msg = CommonUtils.getStr(R.string.add_user_failed).toString(),
+                        msg = CommonUtils.getStr(R.string.update_user_failed).toString(),
                         countDownTime = 10,
                         showConfirm = false,
                         onCancelClick = {
@@ -178,20 +177,22 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             setSelectAllListener()
         }
         itemBinding.root.setOnClickListener {
-            userDetailDialog.setRoleData(viewModel.roleData.map {
-                TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataId = it.roleId,
-                    dataText = it.roleName
-                )
-            })
-            userDetailDialog.setWorkstationData(viewModel.workstationData.map {
-                TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataId = it.workstationId,
-                    dataText = it.workstationName
-                )
-            })
-            userDetailDialog.setUserData(item)
-            userDetailDialog.showPopupWindow()
+            viewModel.getRoleAndWorkStationData().observe(this@UserManageFragment) {
+                updateUserDialog.setRoleData(viewModel.roleData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.roleId,
+                        dataText = it.roleName
+                    )
+                })
+                updateUserDialog.setWorkstationData(viewModel.workstationData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.workstationId,
+                        dataText = it.workstationName
+                    )
+                })
+                updateUserDialog.setUserData(item)
+                updateUserDialog.showPopupWindow()
+            }
         }
     }
 

+ 11 - 7
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionManageHomeFragment.kt

@@ -7,6 +7,8 @@ import com.drake.brv.utils.grid
 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.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentExceptionManageHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
@@ -20,24 +22,24 @@ import dagger.hilt.android.AndroidEntryPoint
  */
 @AndroidEntryPoint
 class ExceptionManageHomeFragment : BaseFragment<FragmentExceptionManageHomeBinding>() {
-    private val menuData: MutableList<MenuItemEntity> = mutableListOf(
+    private var menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(
             0,
             R.mipmap.icon_data_manage_menu_user_manage,
-            "异常上报",
-            "exception_manage:exception_report"
+            RoleFunctionalPermissionsEnum.EXCEPTION_REPORT.description,
+            RoleFunctionalPermissionsEnum.EXCEPTION_REPORT.functionalPermission
         ),
         MenuItemEntity(
             1,
             R.mipmap.icon_data_manage_menu_role_manage,
-            "异常管理",
-            "exception_manage:exception_manage"
+            RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE.description,
+            RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             2,
             R.mipmap.icon_data_manage_menu_area_manage,
-            "异常作业",
-            "exception_manage:exception_job"
+            RoleFunctionalPermissionsEnum.EXCEPTION_JOB.description,
+            RoleFunctionalPermissionsEnum.EXCEPTION_JOB.functionalPermission
         ),
     )
     override fun getLayoutId(): Int {
@@ -62,6 +64,8 @@ class ExceptionManageHomeFragment : BaseFragment<FragmentExceptionManageHomeBind
 
     override fun initData() {
         super.initData()
+        menuData =
+            menuData.filter { MainDomainData.permissions.contains(it.permission) }.toMutableList()
         binding.homeMenuRv.models = menuData
     }
 

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

@@ -7,6 +7,8 @@ import com.drake.brv.utils.grid
 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.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentHardwareManageHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
@@ -20,36 +22,36 @@ import dagger.hilt.android.AndroidEntryPoint
  */
 @AndroidEntryPoint
 class HardwareManageHomeFragment : BaseFragment<FragmentHardwareManageHomeBinding>() {
-    private val menuData: MutableList<MenuItemEntity> = mutableListOf(
+    private var menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(
             0,
             R.mipmap.icon_data_manage_menu_user_manage,
-            "仓位管理",
-            "hardware_manage:slot_manage"
+            RoleFunctionalPermissionsEnum.SLOT_MANAGE.description,
+            RoleFunctionalPermissionsEnum.SLOT_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             1,
             R.mipmap.icon_data_manage_menu_role_manage,
-            "钥匙管理",
-            "hardware_manage:key_manage"
+            RoleFunctionalPermissionsEnum.KEY_MANAGE.description,
+            RoleFunctionalPermissionsEnum.KEY_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             2,
             R.mipmap.icon_data_manage_menu_area_manage,
-            "挂锁管理",
-            "hardware_manage:lock_manage"
+            RoleFunctionalPermissionsEnum.LOCK_MANAGE.description,
+            RoleFunctionalPermissionsEnum.LOCK_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             3,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "卡片管理",
-            "hardware_manage:card_manage"
+            RoleFunctionalPermissionsEnum.CARD_MANAGE.description,
+            RoleFunctionalPermissionsEnum.CARD_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             4,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "RFID管理",
-            "hardware_manage:rfid_manage"
+            RoleFunctionalPermissionsEnum.RFID_MANAGE.description,
+            RoleFunctionalPermissionsEnum.RFID_MANAGE.functionalPermission
         ),
     )
 
@@ -75,6 +77,8 @@ class HardwareManageHomeFragment : BaseFragment<FragmentHardwareManageHomeBindin
 
     override fun initData() {
         super.initData()
+        menuData =
+            menuData.filter { MainDomainData.permissions.contains(it.permission) }.toMutableList()
         binding.homeMenuRv.models = menuData
     }
 

+ 21 - 17
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt

@@ -7,6 +7,8 @@ import com.drake.brv.utils.grid
 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.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentJobManageHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
@@ -20,54 +22,54 @@ import dagger.hilt.android.AndroidEntryPoint
  */
 @AndroidEntryPoint
 class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
-    private val menuData: MutableList<MenuItemEntity> = mutableListOf(
+    private var menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(
             0,
             R.mipmap.icon_data_manage_menu_user_manage,
-            "进行中的作业",
-            "job_manage:ongoing_job"
+            RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB.description,
+            RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB.functionalPermission
         ),
         MenuItemEntity(
             1,
             R.mipmap.icon_data_manage_menu_role_manage,
-            "新建SOP",
-            "job_manage:create_sop"
+            RoleFunctionalPermissionsEnum.CREATE_SOP.description,
+            RoleFunctionalPermissionsEnum.CREATE_SOP.functionalPermission
         ),
         MenuItemEntity(
             2,
             R.mipmap.icon_data_manage_menu_area_manage,
-            "SOP管理",
-            "job_manage:sop_manage"
+            RoleFunctionalPermissionsEnum.SOP_MANAGE.description,
+            RoleFunctionalPermissionsEnum.SOP_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             3,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "异常作业",
-            "job_manage:exception_job"
+            RoleFunctionalPermissionsEnum.EXCEPTION_JOB.description,
+            RoleFunctionalPermissionsEnum.EXCEPTION_JOB.functionalPermission
         ),
         MenuItemEntity(
             4,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "新建作业",
-            "job_manage:create_job"
+            RoleFunctionalPermissionsEnum.CREATE_JOB.description,
+            RoleFunctionalPermissionsEnum.CREATE_JOB.functionalPermission
         ),
         MenuItemEntity(
             5,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "作业管理",
-            "job_manage:job_manage"
+            RoleFunctionalPermissionsEnum.JOB_MANAGE.description,
+            RoleFunctionalPermissionsEnum.JOB_MANAGE.functionalPermission
         ),
         MenuItemEntity(
             6,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "新建SOP作业",
-            "job_manage:create_sop_job"
+            RoleFunctionalPermissionsEnum.CREATE_SOP_JOB.description,
+            RoleFunctionalPermissionsEnum.CREATE_SOP_JOB.functionalPermission
         ),
         MenuItemEntity(
             7,
             R.mipmap.icon_data_manage_menu_point_manage,
-            "锁定中的点位",
-            "job_manage:locked_point"
+            RoleFunctionalPermissionsEnum.LOCKED_POINT.description,
+            RoleFunctionalPermissionsEnum.LOCKED_POINT.functionalPermission
         ),
     )
 
@@ -93,6 +95,8 @@ class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
 
     override fun initData() {
         super.initData()
+        menuData =
+            menuData.filter { MainDomainData.permissions.contains(it.permission) }.toMutableList()
         binding.homeMenuRv.models = menuData
     }
 

+ 5 - 5
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt

@@ -71,7 +71,7 @@ class RoleManageViewModel @Inject constructor(
                 roleKey = roleDataEntity.roleKeys
                 status = roleDataEntity.status
                 menuData =
-                    sysMenus.filter { it.menuName in roleDataEntity.functionalPermissions.map { it.description } }
+                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.map { it.functionalPermission } }
             })
             emit(true)
         }
@@ -89,7 +89,7 @@ class RoleManageViewModel @Inject constructor(
                 roleKey = roleDataEntity.roleKeys
                 status = roleDataEntity.status
                 menuData =
-                    sysMenus.filter { it.menuName in roleDataEntity.functionalPermissions.map { it.description } }
+                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.map { it.functionalPermission } }
             })
             emit(true)
         }
@@ -102,11 +102,11 @@ class RoleManageViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             val functionalPermissions =
                 RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-            var selectedMenuNames =
-                sysMenuRepository.getSysMenusByRoleId(roleId).map { it.menuName }
+            var selectedPermissions =
+                sysMenuRepository.getSysMenusByRoleId(roleId).map { it.perms }
             fun setSelectedFunctionalPermissions(dataList: List<RoleManageFunctionalPermissionsEntity>) {
                 dataList.forEach {
-                    it.isSelected = it.description in selectedMenuNames
+                    it.isSelected = it.functionalPermission in selectedPermissions
                     setSelectedFunctionalPermissions(it.children)
                 }
             }

+ 37 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt

@@ -5,6 +5,7 @@ import androidx.lifecycle.liveData
 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.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IHardwareRepository
@@ -71,9 +72,15 @@ class UserManageViewModel @Inject constructor(
     fun addUser(userData: AddUserDataVo): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             val userId = userRepository.addUserData(userData)
-            workstationRepository.addUserWorkstationData(userId, userData.workstationId)
+            userData.workstationId?.let {
+                workstationRepository.addUserWorkstationData(userId, it)
+            }
             roleRepository.addUserRoleData(userId, userData.roleId)
-            hardwareRepository.addCard(userId, userData)
+            hardwareRepository.addCard(
+                userId,
+                userData.cardCode,
+                userData.nickname
+            )
             emit(true)
         }
     }
@@ -88,4 +95,32 @@ class UserManageViewModel @Inject constructor(
             emit(true)
         }
     }
+
+    /**
+     * 更新用户
+     */
+    fun updateUser(updateUserDataVo: UpdateUserDataVo): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            userRepository.updateUserData(updateUserDataVo)
+            workstationRepository.deleteUserWorkstationByUserIds(listOf(updateUserDataVo.userId))
+            roleRepository.deleteUserRoleByUserId(listOf(updateUserDataVo.userId))
+            hardwareRepository.deleteCardByUserIdAndCardCode(
+                updateUserDataVo.userId,
+                updateUserDataVo.cardCode
+            )
+            updateUserDataVo.workstationId?.let {
+                workstationRepository.addUserWorkstationData(
+                    updateUserDataVo.userId,
+                    it
+                )
+            }
+            roleRepository.addUserRoleData(updateUserDataVo.userId, updateUserDataVo.roleId)
+            hardwareRepository.addCard(
+                updateUserDataVo.userId,
+                updateUserDataVo.cardCode,
+                updateUserDataVo.nickname
+            )
+            emit(true)
+        }
+    }
 }

+ 5 - 0
app/src/main/res/drawable/icon_check.xml

@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
+      
+    <path android:fillColor="@android:color/white" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
+    
+</vector>

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

@@ -80,9 +80,9 @@
             android:layout_height="90dp"
             android:layout_alignParentBottom="true"
             android:layout_gravity="bottom"
-            android:background="@color/white80"
+            android:background="@color/white"
             android:textSize="20sp"
-            app:itemBackground="@color/white80"
+            app:itemBackground="@color/white"
             app:itemIconSize="40dp"
             app:itemIconTint="@color/nav_item_color"
             app:itemTextColor="@color/nav_item_color"

+ 5 - 4
app/src/main/res/layout/dialog_add_user.xml

@@ -133,6 +133,7 @@
             </LinearLayout>
 
             <LinearLayout
+                android:id="@+id/workstation_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="20dp"
@@ -187,16 +188,16 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginLeft="10dp"
-                        android:textSize="18sp"
-                        android:text="@string/user_manage_filter_activate" />
+                        android:text="@string/user_manage_filter_activate"
+                        android:textSize="18sp" />
 
                     <RadioButton
                         android:id="@+id/deactivate_rb"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginLeft="10dp"
-                        android:textSize="18sp"
-                        android:text="@string/user_manage_filter_deactivate" />
+                        android:text="@string/user_manage_filter_deactivate"
+                        android:textSize="18sp" />
                 </RadioGroup>
             </LinearLayout>
         </LinearLayout>

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

@@ -104,6 +104,7 @@
             </LinearLayout>
 
             <LinearLayout
+                android:id="@+id/workstation_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="20dp"

+ 1 - 0
app/src/main/res/layout/dialog_user_detail.xml → app/src/main/res/layout/dialog_update_user.xml

@@ -133,6 +133,7 @@
             </LinearLayout>
 
             <LinearLayout
+                android:id="@+id/workstation_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="20dp"

+ 22 - 6
app/src/main/res/layout/item_home_text_drop_down.xml

@@ -1,12 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <TextView
-        android:id="@+id/drop_down_text"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingHorizontal="8dp"
-        android:paddingVertical="4dp"
-        android:textColor="@color/black"
-        android:textSize="24sp" />
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/drop_down_text"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingHorizontal="8dp"
+            android:paddingVertical="4dp"
+            android:textColor="@color/black"
+            android:textSize="24sp" />
+
+        <ImageView
+            android:id="@+id/check_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="10dp"
+            android:src="@drawable/icon_check"
+            android:visibility="gone" />
+    </LinearLayout>
 </layout>

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

@@ -158,4 +158,6 @@
     <string name="add_role_failed">New role failed</string>
     <string name="update_role_succeed">Update role succeed</string>
     <string name="update_role_failed">Update role failed</string>
+    <string name="update_user_succeed">Update user succeed</string>
+    <string name="update_user_failed">Update user failed</string>
 </resources>

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

@@ -158,4 +158,6 @@
     <string name="add_role_failed">新增角色失败</string>
     <string name="update_role_succeed">角色更新成功</string>
     <string name="update_role_failed">角色更新试下</string>
+    <string name="update_user_succeed">用户更新成功</string>
+    <string name="update_user_failed">用户更新失败</string>
 </resources>

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

@@ -157,4 +157,6 @@
     <string name="add_role_failed">新增角色失败</string>
     <string name="update_role_succeed">角色更新成功</string>
     <string name="update_role_failed">角色更新试下</string>
+    <string name="update_user_succeed">用户更新成功</string>
+    <string name="update_user_failed">用户更新失败</string>
 </resources>

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

@@ -5,7 +5,6 @@ import androidx.room.Insert
 import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import com.grkj.data.model.dos.IsJobCard
-import com.grkj.data.model.dos.IsJobTicketKey
 import com.grkj.data.model.dos.IsKey
 import com.grkj.data.model.dos.IsLock
 import com.grkj.data.model.dos.IsLockCabinetSlots
@@ -125,4 +124,10 @@ interface HardwareDao {
      */
     @Query("select * from is_lock_cabinet_slots")
     fun getAllLockCabinetSlots(): List<IsLockCabinetSlots>
+
+    /**
+     * 根据用户id和卡片码删除数据
+     */
+    @Query("delete from is_job_card where user_id = :userId and card_code = :cardCode")
+    fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String)
 }

+ 4 - 3
data/src/main/java/com/grkj/data/dao/RoleDao.kt

@@ -23,8 +23,8 @@ interface RoleDao {
     /**
      * 添加用户角色关联
      */
-    @Insert
-    fun insertUserRole(sysUserRole: SysUserRole)
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    fun insertUserRole(sysUserRole: List<SysUserRole>)
 
     /**
      * 根据用户id删除用户角色关联
@@ -57,6 +57,7 @@ interface RoleDao {
       AND (:permissionCharacters       IS NULL OR trim(:permissionCharacters) = '' OR role_key       LIKE '%' || :permissionCharacters       || '%')
       -- 只有当 status 不为 NULL 才做等值匹配
       AND (:status         IS NULL OR status          = :status)
+      order by role_sort asc
     LIMIT :size
     OFFSET :offset
   """
@@ -79,5 +80,5 @@ interface RoleDao {
      * 根据用户id获取角色数据
      */
     @Query("select * from sys_role sr left join sys_user_role sur on sr.role_id = sur.role_id where sur.user_id = :userId")
-    fun getRoleDataByUserId(userId: Long): SysRole
+    fun getRoleDataByUserId(userId: Long): List<SysRole>
 }

+ 3 - 3
data/src/main/java/com/grkj/data/dao/SysMenuDao.kt

@@ -37,14 +37,14 @@ interface SysMenuDao {
      */
     @Query(
         """
-        SELECT GROUP_CONCAT(sm.perms, ',') AS roleKeys
+        SELECT DISTINCT sm.perms
         FROM sys_role_menu AS srm
         LEFT JOIN sys_menu AS sm
             ON srm.menu_id = sm.menu_id
-        WHERE srm.role_id = :roleId
+        WHERE srm.role_id in (:roleIds)
     """
     )
-    fun getPermissionsByRoleId(roleId: Long): MutableList<String?>
+    fun getPermissionsByRoleIds(roleIds: List<Long>): MutableList<String?>
 
     /**
      * 根据角色id删除

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

@@ -5,6 +5,7 @@ import androidx.room.Insert
 import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import androidx.room.TypeConverters
+import androidx.room.Update
 import com.grkj.data.converters.Converters
 import com.grkj.data.model.dos.SysUserCharacteristicDo
 import com.grkj.data.model.dos.SysUserDo
@@ -145,4 +146,10 @@ interface UserDao {
     """
     )
     fun getAllUserDataWithWorkstationId(workstationId: Long): List<UserManageVo>
+
+    /**
+     * 更新用户数据
+     */
+    @Update
+    fun updateUserData(userDo: SysUserDo)
 }

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

@@ -23,7 +23,7 @@ interface WorkstationDao {
      * 添加用户岗位关联数据
      */
     @Insert
-    fun insertUserWorkstation(workstation: IsUserWorkstation)
+    fun insertUserWorkstation(workstation: List<IsUserWorkstation>)
 
     /**
      * 根据用户id删除用户岗位关联

+ 4 - 0
data/src/main/java/com/grkj/data/model/dos/SysUserDo.kt

@@ -53,5 +53,9 @@ class SysUserDo : BaseBean() {
 
     @ColumnInfo("login_date")
     var loginData: String? = null
+    override fun toString(): String {
+        return "SysUserDo(userId=$userId, deptId=$deptId, userName='$userName', nickName='$nickName', userType=$userType, email=$email, phoneNumber=$phoneNumber, sex=$sex, avatar=$avatar, password=$password, keyCode=$keyCode, status=$status, delFlag=$delFlag, loginIp=$loginIp, loginData=$loginData)"
+    }
+
 
 }

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

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

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

@@ -0,0 +1,13 @@
+package com.grkj.data.model.vo
+
+/**
+ * 更新用户
+ */
+data class UpdateUserDataVo(
+    val userId: Long,
+    val nickname: String,
+    val cardCode: String,
+    val roleId: List<Long>,
+    val workstationId: List<Long>?,
+    val status: Boolean
+)

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

@@ -6,6 +6,6 @@ package com.grkj.data.model.vo
 data class UserManageFilterVo(
     val nickname: String,
     val cardCode: String,
-    val workstationName: String,
+    val workstationName: String?,
     val status: Boolean?
 )

+ 11 - 0
data/src/main/java/com/grkj/data/repository/BaseRepository.kt

@@ -0,0 +1,11 @@
+package com.grkj.data.repository
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+/**
+ * 基础仓储,主要还是通用的东西的初始化
+ */
+abstract class BaseRepository {
+    protected val logger: Logger = LoggerFactory.getLogger(this::class.java)
+}

+ 6 - 1
data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt

@@ -80,5 +80,10 @@ interface IHardwareRepository {
     /**
      * 创建卡片
      */
-    fun addCard(userId: Long, userData: AddUserDataVo)
+    fun addCard(userId: Long, cardCode: String, nickName: String)
+
+    /**
+     * 根据用户id和卡片码删除数据
+     */
+    fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String)
 }

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

@@ -21,7 +21,7 @@ interface IRoleRepository {
     /**
      * 添加用户角色关联
      */
-    fun addUserRoleData(userId: Long, roleId: Long)
+    fun addUserRoleData(userId: Long, roleIds: List<Long>)
 
     /**
      * 根据用户id删除关联数据

+ 6 - 0
data/src/main/java/com/grkj/data/repository/IUserRepository.kt

@@ -1,6 +1,7 @@
 package com.grkj.data.repository
 
 import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.model.vo.UserManageFilterVo
 
@@ -56,4 +57,9 @@ interface IUserRepository {
      * 根据用户id删除用户
      */
     fun deleteUserById(userIds: List<Long>)
+
+    /**
+     * 更新用户数据
+     */
+    fun updateUserData(userDataVo: UpdateUserDataVo)
 }

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

@@ -15,7 +15,7 @@ interface IWorkstationRepository {
     /**
      * 添加角色岗位关联
      */
-    fun addUserWorkstationData(userId: Long, workstationId: Long)
+    fun addUserWorkstationData(userId: Long, workstationId: List<Long>)
 
     /**
      * 根据用户id删除数据

+ 10 - 6
data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt

@@ -2,7 +2,6 @@ package com.grkj.data.repository.impl
 
 import com.grkj.data.dao.HardwareDao
 import com.grkj.data.dao.IsolationPointDao
-import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsJobCard
 import com.grkj.data.repository.IHardwareRepository
@@ -17,7 +16,7 @@ import com.grkj.data.model.res.KeyPageRes
 import com.grkj.data.model.res.LockInfoRes
 import com.grkj.data.model.res.LockPageItem
 import com.grkj.data.model.res.LockPageRes
-import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.shared.utils.Pinyin4jUtil
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.date.TimeUtils
@@ -31,7 +30,7 @@ import javax.inject.Singleton
 class HardwareRepository @Inject constructor(
     val hardwareDao: HardwareDao,
     val isolationPointDao: IsolationPointDao
-) : IHardwareRepository {
+) : BaseRepository(), IHardwareRepository {
 
     /**
      * 获取锁信息
@@ -192,11 +191,16 @@ class HardwareRepository @Inject constructor(
         callback(CommonDictDataEnum.getCommonDictRes(dictKey))
     }
 
-    override fun addCard(userId: Long, userData: AddUserDataVo) {
+    override fun addCard(userId: Long, cardCode: String, nickName: String) {
         val isJobCard = IsJobCard()
         isJobCard.userId = userId
-        isJobCard.cardCode = userData.cardCode
-        isJobCard.userName = Pinyin4jUtil.toInitials(userData.nickname)
+        isJobCard.cardCode = cardCode
+        isJobCard.userName = Pinyin4jUtil.toInitials(nickName)
         hardwareDao.addCard(isJobCard)
     }
+
+    override fun deleteCardByUserIdAndCardCode(userId: Long, cardCode: String) {
+        hardwareDao.deleteCardByUserIdAndCardCode(userId,cardCode)
+    }
+
 }

+ 2 - 1
data/src/main/java/com/grkj/data/repository/impl/IsolationPointRepository.kt

@@ -6,6 +6,7 @@ import com.grkj.data.model.dos.IsIsolationPoint
 import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.data.model.vo.PointManageFilterVo
 import com.grkj.data.model.vo.PointManageVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IIsolationPointRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -14,7 +15,7 @@ import javax.inject.Singleton
  * 隔离点仓储实现
  */
 @Singleton
-class IsolationPointRepository @Inject constructor(val isolationPointDao: IsolationPointDao) : IIsolationPointRepository {
+class IsolationPointRepository @Inject constructor(val isolationPointDao: IsolationPointDao) : BaseRepository(), IIsolationPointRepository {
 
     override fun deletePointByPointIds(pointIds: List<Long>) {
         isolationPointDao.deletePointByPointIds(pointIds)

+ 2 - 1
data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt

@@ -22,6 +22,7 @@ import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IJobTicketRepository
 import com.sik.sikcore.data.BeanUtils
 import javax.inject.Inject
@@ -31,7 +32,7 @@ import javax.inject.Singleton
  * 作业票实现
  */
 @Singleton
-class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
+class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) : BaseRepository(),
     IJobTicketRepository {
     override fun createJob(
         selectedSopPoints: List<PointManageVo>,

+ 2 - 1
data/src/main/java/com/grkj/data/repository/impl/RfidTokenRepository.kt

@@ -3,6 +3,7 @@ package com.grkj.data.repository.impl
 import com.grkj.data.dao.RfidTokenDao
 import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.model.dos.IsRfidToken
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.IRfidTokenRepository
 import javax.inject.Inject
@@ -12,7 +13,7 @@ import javax.inject.Singleton
  * RFID标签仓储实现
  */
 @Singleton
-class RfidTokenRepository @Inject constructor(val rfidTokenDao: RfidTokenDao): IRfidTokenRepository {
+class RfidTokenRepository @Inject constructor(val rfidTokenDao: RfidTokenDao): BaseRepository(), IRfidTokenRepository {
     override fun addRfidToken(rfidToken: String?): Long {
         val isRfidToken = IsRfidToken()
         isRfidToken.rfid = rfidToken ?: ""

+ 14 - 8
data/src/main/java/com/grkj/data/repository/impl/RoleRepository.kt

@@ -9,6 +9,7 @@ import com.grkj.data.model.vo.AddRoleDo
 import com.grkj.data.model.vo.RoleManageFilterVo
 import com.grkj.data.model.vo.RoleManageVo
 import com.grkj.data.model.vo.UpdateRoleDo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IRoleRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -17,18 +18,23 @@ import javax.inject.Singleton
  * 岗位仓储
  */
 @Singleton
-class RoleRepository @Inject constructor(val roleDao: RoleDao,val sysMenuDao: SysMenuDao) :
+class RoleRepository @Inject constructor(val roleDao: RoleDao, val sysMenuDao: SysMenuDao) :
+    BaseRepository(),
     IRoleRepository {
 
     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 addUserRoleData(userId: Long, roleIds: List<Long>) {
+        val sysUserRoles = roleIds.map { roleId ->
+            val sysUserRole = SysUserRole()
+            sysUserRole.userId = userId
+            sysUserRole.roleId = roleId
+            sysUserRole
+        }
+        roleDao.insertUserRole(sysUserRoles)
+
     }
 
     override fun deleteUserRoleByUserId(userIds: List<Long>) {
@@ -61,7 +67,7 @@ class RoleRepository @Inject constructor(val roleDao: RoleDao,val sysMenuDao: Sy
         sysRole.dataScope = "1"
         val roleId = roleDao.insertRole(sysRole)
         val sysRoleMenu = mutableListOf<SysRoleMenu>().apply {
-            addRoleDo.menuData.forEach {data->
+            addRoleDo.menuData.forEach { data ->
                 val sysRoleMenu = SysRoleMenu()
                 sysRoleMenu.roleId = roleId
                 sysRoleMenu.menuId = data.menuId
@@ -81,7 +87,7 @@ class RoleRepository @Inject constructor(val roleDao: RoleDao,val sysMenuDao: Sy
         val roleId = roleDao.insertRole(sysRole)
         sysMenuDao.deleteByRoleId(updateRoleDo.roleId)
         val sysRoleMenu = mutableListOf<SysRoleMenu>().apply {
-            updateRoleDo.menuData.forEach {data->
+            updateRoleDo.menuData.forEach { data ->
                 val sysRoleMenu = SysRoleMenu()
                 sysRoleMenu.roleId = roleId
                 sysRoleMenu.menuId = data.menuId

+ 2 - 1
data/src/main/java/com/grkj/data/repository/impl/SopRepository.kt

@@ -8,6 +8,7 @@ import com.grkj.data.model.dos.IsSopUser
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.ISopRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -16,7 +17,7 @@ import javax.inject.Singleton
  * sop仓储实现
  */
 @Singleton
-class SopRepository @Inject constructor(val isSopDao: IsSopDao): ISopRepository {
+class SopRepository @Inject constructor(val isSopDao: IsSopDao): BaseRepository(), ISopRepository {
 
     override fun saveSop(
         sopId: Long,

+ 2 - 1
data/src/main/java/com/grkj/data/repository/impl/SysMenuRepository.kt

@@ -3,6 +3,7 @@ package com.grkj.data.repository.impl
 import com.grkj.data.dao.SysMenuDao
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.data.model.dos.SysMenu
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.ISysMenuRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -11,7 +12,7 @@ import javax.inject.Singleton
  * 菜单仓储实现
  */
 @Singleton
-class SysMenuRepository @Inject constructor(val sysMenuDao: SysMenuDao) : ISysMenuRepository {
+class SysMenuRepository @Inject constructor(val sysMenuDao: SysMenuDao) : BaseRepository(), ISysMenuRepository {
     override fun checkSysMenu() {
         // 找出所有顶层菜单(level == 0),依次递归插入/更新
         RoleFunctionalPermissionsEnum.values()

+ 43 - 11
data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt

@@ -7,8 +7,10 @@ import com.grkj.data.dao.UserDao
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.model.dos.SysUserDo
 import com.grkj.data.model.vo.AddUserDataVo
+import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.model.vo.UserManageFilterVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IUserRepository
 import com.grkj.shared.utils.BCryptUtils
 import com.grkj.shared.utils.BiometricVerifier
@@ -25,7 +27,7 @@ class UserRepository @Inject constructor(
     private val userDao: UserDao,
     private val roleDao: RoleDao,
     private val sysMenuDao: SysMenuDao
-)  : IUserRepository {
+) : BaseRepository(), IUserRepository {
 
     override fun loginWithAccount(
         username: String, password: String
@@ -41,9 +43,13 @@ class UserRepository @Inject constructor(
         val matched = BCryptUtils.matchPassword(password, sysUserDo?.password ?: "")
         if (matched) {
             MainDomainData.userInfo = sysUserDo
-            val roleData = roleDao.getRoleDataByUserId(sysUserDo.userId)
-            MainDomainData.roleKeys = roleData.roleKey
-            MainDomainData.permissions = sysMenuDao.getPermissionsByRoleId(roleData.roleId)
+            val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+            MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
+            MainDomainData.permissions =
+                sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+            logger.info("用户信息:{}", MainDomainData.userInfo.toString())
+            logger.info("用户角色:{}", MainDomainData.roleKeys)
+            logger.info("用户权限:{}", MainDomainData.permissions)
         }
         return matched
     }
@@ -54,9 +60,13 @@ class UserRepository @Inject constructor(
             val sysUserDo = userDao.getUserInfoByUserId(it)
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
-                val roleData = roleDao.getRoleDataByUserId(sysUserDo.userId)
-                MainDomainData.roleKeys = roleData.roleKey
-                MainDomainData.permissions = sysMenuDao.getPermissionsByRoleId(roleData.roleId)
+                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
+                MainDomainData.permissions =
+                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                logger.info("用户信息:{}", MainDomainData.userInfo.toString())
+                logger.info("用户角色:{}", MainDomainData.roleKeys)
+                logger.info("用户权限:{}", MainDomainData.permissions)
             }
             return userDao.getUserInfoByUserId(it) != null
         } ?: false
@@ -83,8 +93,13 @@ class UserRepository @Inject constructor(
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
                 val roleData = roleDao.getRoleDataByUserId(sysUserDo.userId)
-                MainDomainData.roleKeys = roleData.roleKey
-                MainDomainData.permissions = sysMenuDao.getPermissionsByRoleId(roleData.roleId)
+                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
+                MainDomainData.permissions =
+                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                logger.info("用户信息:{}", MainDomainData.userInfo.toString())
+                logger.info("用户角色:{}", MainDomainData.roleKeys)
+                logger.info("用户权限:{}", MainDomainData.permissions)
                 hasFingerprint = true
             } else {
                 hasFingerprint = false
@@ -116,8 +131,13 @@ class UserRepository @Inject constructor(
             if (sysUserDo != null) {
                 MainDomainData.userInfo = sysUserDo
                 val roleData = roleDao.getRoleDataByUserId(sysUserDo.userId)
-                MainDomainData.roleKeys = roleData.roleKey
-                MainDomainData.permissions = sysMenuDao.getPermissionsByRoleId(roleData.roleId)
+                val roleDatas = roleDao.getRoleDataByUserId(sysUserDo.userId)
+                MainDomainData.roleKeys = roleDatas.joinToString(",") { it.roleKey }
+                MainDomainData.permissions =
+                    sysMenuDao.getPermissionsByRoleIds(roleDatas.map { it.roleId })
+                logger.info("用户信息:{}", MainDomainData.userInfo.toString())
+                logger.info("用户角色:{}", MainDomainData.roleKeys)
+                logger.info("用户权限:{}", MainDomainData.permissions)
                 hasFace = true
             } else {
                 hasFace = false
@@ -156,11 +176,23 @@ class UserRepository @Inject constructor(
         val sysUserDo = SysUserDo()
         sysUserDo.userName = Pinyin4jUtil.toInitials(addUserDataVo.nickname)
         sysUserDo.nickName = addUserDataVo.nickname
+        sysUserDo.password = BCryptUtils.encryptPassword(sysUserDo.userName)
         sysUserDo.status = if (addUserDataVo.status) "0" else "2"
         sysUserDo.delFlag = "0"
         return userDao.insert(sysUserDo)
     }
 
+    override fun updateUserData(userDataVo: UpdateUserDataVo) {
+        val sysUserDo = SysUserDo()
+        sysUserDo.userId = userDataVo.userId
+        sysUserDo.userName = Pinyin4jUtil.toInitials(userDataVo.nickname)
+        sysUserDo.nickName = userDataVo.nickname
+        sysUserDo.password = BCryptUtils.encryptPassword(sysUserDo.userName)
+        sysUserDo.status = if (userDataVo.status) "0" else "2"
+        sysUserDo.delFlag = "0"
+        userDao.updateUserData(sysUserDo)
+    }
+
     override fun deleteUserById(userIds: List<Long>) {
         userDao.deleteUserByIds(userIds)
     }

+ 11 - 6
data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt

@@ -5,6 +5,7 @@ import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.vo.WorkstationManageVo
+import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IWorkstationRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -13,16 +14,20 @@ import javax.inject.Singleton
  * 岗位仓储
  */
 @Singleton
-class WorkstationRepository @Inject constructor(val workstationDao: WorkstationDao) : IWorkstationRepository {
+class WorkstationRepository @Inject constructor(val workstationDao: WorkstationDao) :
+    BaseRepository(), IWorkstationRepository {
 
     override fun getWorkStationData(): List<IsWorkstation> {
         return workstationDao.getWorkstationData()
     }
 
-    override fun addUserWorkstationData(userId: Long, workstationId: Long) {
-        val isUserWorkstation = IsUserWorkstation()
-        isUserWorkstation.userId = userId
-        isUserWorkstation.workstationId = workstationId
+    override fun addUserWorkstationData(userId: Long, workstationIds: List<Long>) {
+        val isUserWorkstation = workstationIds.map { workstationId ->
+            val isUserWorkstation = IsUserWorkstation()
+            isUserWorkstation.userId = userId
+            isUserWorkstation.workstationId = workstationId
+            isUserWorkstation
+        }
         workstationDao.insertUserWorkstation(isUserWorkstation)
     }
 
@@ -53,7 +58,7 @@ class WorkstationRepository @Inject constructor(val workstationDao: WorkstationD
     }
 
     override fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?) {
-        workstationDao.updateWorkstationOrderNumById(workstationId,orderNum)
+        workstationDao.updateWorkstationOrderNumById(workstationId, orderNum)
     }
 
     private fun buildTree(all: List<IsWorkstation>): List<WorkstationManageVo> {

+ 8 - 0
ui-base/src/main/java/com/grkj/ui_base/config/ISCSConfig.kt

@@ -1,5 +1,8 @@
 package com.grkj.ui_base.config
 
+import com.grkj.ui_base.data.MMKVConstants
+import com.sik.sikcore.extension.getMMKVData
+
 /**
  * 锁柜配置
  */
@@ -8,4 +11,9 @@ object ISCSConfig {
      * 是否是测试模式
      */
     var isTestMode: Boolean = false
+
+    /**
+     * 是否开启区域
+     */
+    val isWorkstationOn: Boolean get() = MMKVConstants.WORKSTATION_OPEN.getMMKVData(true)
 }

+ 5 - 0
ui-base/src/main/java/com/grkj/ui_base/data/MMKVConstants.kt

@@ -13,4 +13,9 @@ object MMKVConstants {
      * 串口配置
      */
     const val KEY_PORT_CONFIG = "key_port_config"
+
+    /**
+     * 区域是否打开
+     */
+    const val WORKSTATION_OPEN = "workstation_open"
 }