Procházet zdrojové kódy

refactor(更新)
- 点位分组和上锁人分组完成

周文健 před 3 měsíci
rodič
revize
750beef8c2
61 změnil soubory, kde provedl 1170 přidání a 870 odebrání
  1. 12 17
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  2. 1 1
      app/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt
  3. 0 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  4. 86 57
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt
  5. 59 39
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt
  6. 3 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/WorkflowSettingFragment.kt
  7. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt
  8. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt
  9. 74 36
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  10. 115 84
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  11. 60 31
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  12. 93 43
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  13. 87 36
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  14. 61 31
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  15. 3 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  16. 2 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectMemberViewModel.kt
  17. 3 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectPointViewModel.kt
  18. 26 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionJobViewModel.kt
  19. 14 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  20. 23 6
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  21. 43 12
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  22. 6 5
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  23. 9 22
      app/src/main/res/layout-land/fragment_create_job.xml
  24. 10 23
      app/src/main/res/layout-land/fragment_create_sop.xml
  25. 10 23
      app/src/main/res/layout-land/fragment_create_sop_job.xml
  26. 14 27
      app/src/main/res/layout-land/fragment_edit_job.xml
  27. 10 23
      app/src/main/res/layout-land/fragment_edit_sop.xml
  28. 10 23
      app/src/main/res/layout-land/fragment_edit_sop_job.xml
  29. 1 1
      app/src/main/res/layout-land/fragment_select_memeber.xml
  30. 43 35
      app/src/main/res/layout-land/item_locker_group.xml
  31. 17 30
      app/src/main/res/layout/fragment_create_job.xml
  32. 14 27
      app/src/main/res/layout/fragment_create_sop.xml
  33. 10 23
      app/src/main/res/layout/fragment_create_sop_job.xml
  34. 10 23
      app/src/main/res/layout/fragment_edit_job.xml
  35. 10 23
      app/src/main/res/layout/fragment_edit_sop.xml
  36. 14 28
      app/src/main/res/layout/fragment_edit_sop_job.xml
  37. 1 1
      app/src/main/res/layout/fragment_select_memeber.xml
  38. 43 36
      app/src/main/res/layout/item_locker_group.xml
  39. 26 0
      app/src/main/res/layout/item_select_colocker_member.xml
  40. 2 2
      app/src/main/res/layout/item_select_member.xml
  41. 2 0
      app/src/main/res/values-en/strings.xml
  42. 1 0
      app/src/main/res/values-land/dimens.xml
  43. 2 0
      app/src/main/res/values-zh/strings.xml
  44. 1 0
      app/src/main/res/values/dimens.xml
  45. 2 0
      app/src/main/res/values/strings.xml
  46. 3 3
      data/src/main/java/com/grkj/data/dao/IsSopDao.kt
  47. 22 0
      data/src/main/java/com/grkj/data/data/Type.kt
  48. 1 1
      data/src/main/java/com/grkj/data/model/vo/IsJobTicketPointsDataVo.kt
  49. 6 1
      data/src/main/java/com/grkj/data/model/vo/JobPointVo.kt
  50. 11 8
      data/src/main/java/com/grkj/data/model/vo/JobTicketGroupDataVo.kt
  51. 16 0
      data/src/main/java/com/grkj/data/model/vo/JobTicketGroupInfoVo.kt
  52. 1 1
      data/src/main/java/com/grkj/data/model/vo/JobUserVo.kt
  53. 9 9
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  54. 2 2
      data/src/main/java/com/grkj/data/repository/ISopRepository.kt
  55. 9 9
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepository.kt
  56. 2 2
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkSopRepository.kt
  57. 27 26
      data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt
  58. 5 4
      data/src/main/java/com/grkj/data/repository/impl/standard/SopRepository.kt
  59. 1 1
      gradle/libs.versions.toml
  60. 16 0
      shared/src/main/java/com/grkj/shared/utils/extension/Data.kt
  61. 3 5
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

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

@@ -1,16 +1,11 @@
 package com.grkj.iscs.features.login.dialog
 
-import android.content.Intent
 import android.graphics.Bitmap
 import android.view.View
-import androidx.appcompat.widget.PopupMenu
 import androidx.lifecycle.LifecycleOwner
-import com.grkj.data.model.res.UserInfoRes
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogLoginBinding
-import com.grkj.iscs.features.login.activity.LoginActivity
 import com.grkj.iscs.features.login.viewmodel.LoginViewModel
-import com.grkj.iscs.features.main.activity.MainActivity
 import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.shared.utils.ArcSoftUtil.inDetecting
 import com.grkj.ui_base.config.ISCSConfig
@@ -21,11 +16,10 @@ import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikandroid.activity.ActivityTracker
 import com.sik.sikcore.SIKCore
-import com.sik.sikcore.activity.ActivityTracker
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
-import com.sik.sikimage.ImageUtils
 
 /**
  * 登录弹窗
@@ -190,20 +184,21 @@ class LoginDialog(
             ArcSoftUtil.checkCamera(
                 context.windowManager,
                 mBinding.preview!!
-            ) { bitmap,userId ->
+            ) { bitmap, userId ->
                 viewModel.loginWithUserId(userId).observe(lifecycleOwner) {
                     if (it == false) {
-                        viewModel.loginWithFace(ImageConvertUtils.bitmapToBase64(bitmap).toString()).observe(lifecycleOwner){
-                            if (it == false) {
-                                ThreadUtils.runOnMainDelayed(1000) {
-                                    inDetecting = false
-                                    inFaceChecking = false
+                        viewModel.loginWithFace(ImageConvertUtils.bitmapToBase64(bitmap).toString())
+                            .observe(lifecycleOwner) {
+                                if (it == false) {
+                                    ThreadUtils.runOnMainDelayed(1000) {
+                                        inDetecting = false
+                                        inFaceChecking = false
+                                    }
+                                } else {
+                                    ArcSoftUtil.stop()
                                 }
-                            } else {
-                                ArcSoftUtil.stop()
+                                callBack?.invoke(it)
                             }
-                            callBack?.invoke(it)
-                        }
                     } else {
                         ArcSoftUtil.stop()
                         callBack?.invoke(it)

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

@@ -20,7 +20,7 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikcore.SIKCore
-import com.sik.sikcore.activity.ActivityTracker
+import com.sik.sikandroid.activity.ActivityTracker
 import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils

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

@@ -2,8 +2,6 @@ package com.grkj.iscs.features.main.dialog.data_manage
 
 import android.view.View
 import androidx.core.view.isVisible
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.findViewTreeLifecycleOwner
 import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddUserBinding
@@ -14,7 +12,6 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
-import com.sik.sikcore.activity.ActivityTracker
 
 /**
  * 新增用户对话框,基于 DialogX,支持多选角色和岗位

+ 86 - 57
app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt

@@ -5,10 +5,12 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
@@ -16,9 +18,12 @@ import com.grkj.iscs.databinding.FragmentSelectMemeberBinding
 import com.grkj.iscs.databinding.ItemSelectAllMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.iscs.databinding.ItemLockerGroupBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.features.main.viewmodel.common.SelectMemberViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.CommonUtils
@@ -37,7 +42,7 @@ import kotlin.getValue
 @AndroidEntryPoint
 class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
     private val viewModel: SelectMemberViewModel by viewModels()
-    private var selectedLockerData: MutableList<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> =
+    private var selectedLockerData: MutableList<JobTicketGroupDataVo<JobUserVo>> =
         mutableListOf()
     private var selectedColockerData: MutableList<JobUserVo> = mutableListOf()
     private var isLockerSelect = true
@@ -49,23 +54,29 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
 
     override fun initView() {
         ticketId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long?
+            .getData(DataTransferConstants.KEY_JOB_TICKET_ID)
         val previewStepIcon = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) as Int
+            .getData<Int>(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA)
         val previewStepTitle = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) as String
+            .getData<String>(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA)
         canSelectColoker = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_CAN_SELECT_COLOCKER) as Boolean
+            .getData<Boolean>(DataTransferConstants.KEY_CAN_SELECT_COLOCKER) == true
         binding.previewStepTitle.text = previewStepTitle
-        binding.previewStepIv.setImageResource(previewStepIcon)
+        binding.previewStepIv.setImageResource(previewStepIcon ?: 0)
         binding.back.setDebouncedClickListener {
             navController.popBackStack()
         }
         binding.cancel.setDebouncedClickListener {
+            logger.info(
+                "上锁人是否有数据:${
+                    GlobalDataTempStore.getInstance()
+                        .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
+                }"
+            )
             navController.popBackStack()
         }
         binding.confirm.setDebouncedClickListener {
-            if (selectedLockerData.isEmpty()) {
+            if (selectedLockerData.flatMap { it.jobTicketGroupMemberList }.isEmpty()) {
                 PopTip.build().tip(com.grkj.ui_base.R.string.please_select_locker)
                 return@setDebouncedClickListener
             }
@@ -81,14 +92,14 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             )
             navController.popBackStack()
         }
-        binding.lockerRv.linear(LinearLayout.HORIZONTAL).setup {
-            addType<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>(R.layout.item_locker_group)
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
             onBind {
                 onGroupLockerRVBinding(this)
             }
         }
         binding.colockerRv.linear(LinearLayout.HORIZONTAL).setup {
-            addType<JobUserVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onColockerRVBinding(this)
             }
@@ -118,14 +129,27 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                 itemBinding.lockerIcon.load(avatar)
             }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             if (item.isSelected) {
                 if (!isLockerSelect && (selectedColockerData.size == 1 || (viewModel.ticketUsers.isNotEmpty() && viewModel.ticketUsers.find { it.userId == item.userId }?.jobStatus == "1"))) {
                     PopTip.build().tip(com.grkj.ui_base.R.string.can_not_remove_current_colocker)
-                    return@setOnClickListener
+                    return@setDebouncedClickListener
+                }
+                if (isLockerSelect) {
+                    selectedLockerData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId }?.jobTicketGroupMemberList?.clear()
+                    selectedLockerData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId }?.jobTicketGroupMemberList?.add(
+                        item
+                    )
+                    binding.allUserRv.models =
+                        viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
+                            .filter {
+                                it.userId !in selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                                    .map { it.userId }
+                            }
+                } else {
+                    item.isSelected = false
+                    selectedColockerData.removeIf { it.userId == item.userId }
                 }
-                item.isSelected = false
-                selectedColockerData.removeIf { it.userId == item.userId }
             } else {
                 item.isSelected = true
                 if ((item.avatar
@@ -134,14 +158,16 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                     PopTip.build().tip(R.string.current_user_has_not_face_data)
                 }
                 if (isLockerSelect) {
-                    viewModel.userData.filter {
-                        it.userId in (selectedLockerData.find { viewModel.currentSelectGroup?.groupId == it.first.groupId }?.second?.map { it.userId }
-                            ?: mutableListOf())
-                    }.forEach { it.isSelected = false }
-                    selectedLockerData.find { it.first.groupId == viewModel.currentSelectGroup?.groupId }?.second?.clear()
-                    selectedLockerData.find { it.first.groupId == viewModel.currentSelectGroup?.groupId }?.second?.add(
+                    selectedLockerData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId }?.jobTicketGroupMemberList?.clear()
+                    selectedLockerData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId }?.jobTicketGroupMemberList?.add(
                         item
                     )
+                    binding.allUserRv.models =
+                        viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
+                            .filter {
+                                it.userId !in selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                                    .map { it.userId }
+                            }
                 } else {
                     selectedColockerData.add(item)
                 }
@@ -157,32 +183,34 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
-        val item = holder.getModel<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>()
-        itemBinding.groupName.text = item.first.groupName
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupTitleLayout.setDebouncedClickListener {
             isLockerSelect = true
             itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
             itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
-            viewModel.currentSelectGroup = item.first
+            viewModel.currentSelectGroup = item.jobTicketGroupInfo
             binding.allUserRv.models =
                 viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
-                    .filter { it.isSelected == false }
+                    .filter {
+                        it.userId !in selectedLockerData.flatMap { it.jobTicketGroupMemberList }.map { it.userId }
+                    }
             adapter.notifyDataSetChanged()
         }
         itemBinding.groupTitleLayout.isSelected =
-            isLockerSelect && item.first.groupId == viewModel.currentSelectGroup?.groupId
+            isLockerSelect && item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId
         itemBinding.groupName.isSelected =
-            isLockerSelect && item.first.groupId == viewModel.currentSelectGroup?.groupId
+            isLockerSelect && item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId
         itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
             addType<JobUserVo>(R.layout.item_select_member)
             onBind {
-                onLockerRVBinding(item.first, this)
+                onLockerRVBinding(item.jobTicketGroupInfo, this)
             }
-        }
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
-        groupData: JobTicketGroupDataVo,
+        groupData: JobTicketGroupInfoVo,
         holder: BindingAdapter.BindingViewHolder
     ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
@@ -196,20 +224,24 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                 itemBinding.lockerIcon.load(avatar)
             }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
-        itemBinding.root.setOnClickListener {
-            if (selectedLockerData.find { it.first.groupId == groupData.groupId }?.second?.size == 1 && viewModel.jobTicketData != null && viewModel.jobTicketData?.ticketStatus != JobTicketStatusEnum.SELECT_MEMBER.status) {
+        itemBinding.root.setDebouncedClickListener {
+            if (selectedLockerData.find { it.jobTicketGroupInfo.groupId == groupData.groupId }?.jobTicketGroupMemberList?.size == 1 && viewModel.jobTicketData != null && viewModel.jobTicketData?.ticketStatus != JobTicketStatusEnum.SELECT_MEMBER.status) {
                 PopTip.build().tip(com.grkj.ui_base.R.string.can_not_remove_current_locker)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
-            selectedLockerData.find { it.first.groupId == groupData.groupId }?.second?.clear()
+            selectedLockerData.find { it.jobTicketGroupInfo.groupId == groupData.groupId }?.jobTicketGroupMemberList?.clear()
             viewModel.userData.find { it.userId == item.userId }?.isSelected = false
             adapter.notifyDataSetChanged()
-            binding.allUserRv.adapter?.notifyDataSetChanged()
+            binding.allUserRv.models =
+                viewModel.userData.filter {
+                    it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) && it.userId !in selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                        .map { it.userId }
+                }
         }
     }
 
     private fun BindingAdapter.BindingViewHolder.onColockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
-        val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
         val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
@@ -220,10 +252,10 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                 itemBinding.lockerIcon.load(avatar)
             }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             if (selectedColockerData.size == 1 || (viewModel.ticketUsers.isNotEmpty() && viewModel.ticketUsers.find { it.userId == item.userId }?.jobStatus == "1")) {
                 PopTip.build().tip(com.grkj.ui_base.R.string.can_not_remove_current_colocker)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             selectedColockerData.removeIf { it.userId == item.userId }
             viewModel.userData.find { it.userId == item.userId }?.isSelected = false
@@ -238,12 +270,10 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             getString(R.string.select_locker_tip, viewModel.currentSelectGroup?.groupName ?: "")
         binding.lockerRv.models = selectedLockerData
         binding.allUserRv.models =
-            viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }.apply {
-                forEach {
-                    it.isSelected = it.userId in selectedLockerData.map { it.second }.flatten()
-                        .map { it.userId }
-                }
-            }.filter { it.isSelected == false }
+            viewModel.userData.filter {
+                it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) && it.userId !in selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                    .map { it.userId }
+            }
     }
 
     private fun setColockerData() {
@@ -262,30 +292,29 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
     override fun initData() {
         super.initData()
         viewModel.workstationId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID) as Long
+            .getData<Long>(DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID) ?: 0
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
-            val tempSelectedLockerData =
+            selectedLockerData =
                 GlobalDataTempStore.getInstance()
-                    .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-            if (tempSelectedLockerData is List<*>) {
-                selectedLockerData =
-                    (tempSelectedLockerData as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>).toMutableList()
-                binding.lockerRv.models = selectedLockerData
+                    .getData(
+                        DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                        Type.lockerGroupType
+                    ) ?: mutableListOf()
+            binding.lockerRv.models = selectedLockerData
+            if (selectedLockerData.isNotEmpty()) {
+                viewModel.currentSelectGroup = selectedLockerData.firstOrNull()?.jobTicketGroupInfo
             }
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
-            val tempSelectedColockerData =
+            selectedColockerData =
                 GlobalDataTempStore.getInstance()
-                    .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-            if (tempSelectedColockerData is List<*>) {
-                selectedColockerData =
-                    (tempSelectedColockerData as List<JobUserVo>).toMutableList()
-                binding.colockerRv.models = selectedColockerData
-            }
+                    .getData<List<JobUserVo>>(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
+                    ?.toMutableList() ?: mutableListOf()
+            binding.colockerRv.models = selectedColockerData
         }
         viewModel.getUserData().observe(this) {
             setLockerData()

+ 59 - 39
app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt

@@ -10,8 +10,10 @@ 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.Type
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentSelectPointBinding
@@ -19,8 +21,10 @@ import com.grkj.iscs.databinding.ItemPointGroupBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.viewmodel.common.SelectPointViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.CommonUtils
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import com.sik.sikcore.extension.toJson
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
@@ -57,11 +61,13 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         binding.addGroup.setDebouncedClickListener {
             viewModel.selectedPointData.add(
                 JobTicketGroupDataVo(
-                    groupName = getString(
-                        R.string.new_group,
-                        viewModel.selectedPointData.size
-                    )
-                ) to mutableListOf()
+                    JobTicketGroupInfoVo(
+                        groupName = getString(
+                            R.string.new_group,
+                            viewModel.selectedPointData.size
+                        )
+                    ), mutableListOf()
+                )
             )
             binding.pointGroupRv.adapter?.notifyDataSetChanged()
         }
@@ -72,7 +78,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<JobTicketGroupDataVo, List<JobPointVo>>>(R.layout.item_point_group)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group)
             onBind {
                 onPointGroupRVBinding(this)
             }
@@ -81,26 +87,35 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupBinding>()
-        val item = holder.getModel<Pair<JobTicketGroupDataVo, List<JobPointVo>>>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
         itemBinding.groupTitleLayout.setDebouncedClickListener {
             itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
             itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
             itemBinding.deleteGroup.isSelected = itemBinding.groupTitleLayout.isSelected
-            viewModel.currentSelectGroupId = item.first.groupId
+            viewModel.currentSelectGroupId = item.jobTicketGroupInfo.groupId
+            adapter.notifyDataSetChanged()
+        }
+        itemBinding.groupName.setDebouncedClickListener {
+            itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
+            itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
+            itemBinding.deleteGroup.isSelected = itemBinding.groupTitleLayout.isSelected
+            viewModel.currentSelectGroupId = item.jobTicketGroupInfo.groupId
             adapter.notifyDataSetChanged()
         }
         itemBinding.groupTitleLayout.isSelected =
-            item.first.groupId == viewModel.currentSelectGroupId
-        itemBinding.groupName.isSelected = item.first.groupId == viewModel.currentSelectGroupId
-        itemBinding.deleteGroup.isSelected = item.first.groupId == viewModel.currentSelectGroupId
-        itemBinding.groupName.setText(item.first.groupName)
+            item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId
+        itemBinding.groupName.isSelected =
+            item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId
+        itemBinding.deleteGroup.isSelected =
+            item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId
+        itemBinding.groupName.setText(item.jobTicketGroupInfo.groupName)
         itemBinding.deleteGroup.isVisible = viewModel.selectedPointData.size > 1
         itemBinding.deleteGroup.setDebouncedClickListener {
-            item.second.forEach { selectedPoint ->
+            item.jobTicketGroupMemberList.forEach { selectedPoint ->
                 viewModel.pointManageData.find { it.pointId == selectedPoint.pointId }?.isSelected =
                     false
             }
-            viewModel.selectedPointData.removeIf { it.first == item.first }
+            viewModel.selectedPointData.removeIf { it.jobTicketGroupInfo.groupId == item.jobTicketGroupInfo.groupId }
             binding.unselectedPointRv.models =
                 viewModel.pointManageData.filter { it.isSelected == false }
             adapter.notifyDataSetChanged()
@@ -117,6 +132,10 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 imm.showSoftInput(itemBinding.groupName, InputMethodManager.SHOW_IMPLICIT)
                 itemBinding.editOrSave.text = getString(R.string.save)
             } else {
+                if (itemBinding.groupName.text.toString().isEmpty()){
+                    showToast(getString(R.string.group_name_must_not_empty))
+                    return@setDebouncedClickListener
+                }
                 itemBinding.groupName.isFocusable = false
                 itemBinding.groupName.isEnabled = false
                 itemBinding.groupName.isFocusableInTouchMode = false
@@ -124,7 +143,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 val imm =
                     requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                 imm.hideSoftInputFromWindow(itemBinding.groupName.windowToken, 0)
-                item.first.groupName = itemBinding.groupName.text.toString()
+                item.jobTicketGroupInfo.groupName = itemBinding.groupName.text.toString()
                 itemBinding.editOrSave.text = getString(R.string.edit)
 
                 adapter?.notifyDataSetChanged()
@@ -133,13 +152,13 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
-                onSelectedPointRVBinding(item.first, this)
+                onSelectedPointRVBinding(item.jobTicketGroupInfo, this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(
-        groupData: JobTicketGroupDataVo,
+        groupData: JobTicketGroupInfoVo,
         holder: BindingAdapter.BindingViewHolder
     ) {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
@@ -147,12 +166,10 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         itemBinding.pointName.text = item.pointName
         itemBinding.pointIcon.isSelected = false
         itemBinding.root.setDebouncedClickListener {
-            if (item.isSelected) {
-                viewModel.selectedPointData.find { it.first.groupId == groupData.groupId }?.second?.removeIf { it.pointId == item.pointId }
-                viewModel.pointManageData.find { it.pointId == item.pointId }?.isSelected = false
-                binding.unselectedPointRv.models =
-                    viewModel.pointManageData.filter { it.isSelected == false }
-            }
+            viewModel.selectedPointData.find { it.jobTicketGroupInfo.groupId == groupData.groupId }?.jobTicketGroupMemberList?.removeIf { it.pointId == item.pointId }
+            viewModel.pointManageData.find { it.pointId == item.pointId }?.isSelected = false
+            binding.unselectedPointRv.models =
+                viewModel.pointManageData.filter { it.isSelected == false }
             adapter.notifyDataSetChanged()
         }
     }
@@ -163,8 +180,12 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         itemBinding.pointName.text = item.pointName
         itemBinding.pointIcon.isSelected = item.isSelected
         itemBinding.root.setDebouncedClickListener {
+            if (viewModel.selectedPointData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId } == null) {
+                showToast(CommonUtils.getStr(R.string.please_select_group).toString())
+                return@setDebouncedClickListener
+            }
             item.isSelected = true
-            viewModel.selectedPointData.find { it.first.groupId == viewModel.currentSelectGroupId }?.second?.add(
+            viewModel.selectedPointData.find { it.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId }?.jobTicketGroupMemberList?.add(
                 item
             )
             binding.unselectedPointRv.models =
@@ -177,26 +198,25 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
     override fun initData() {
         super.initData()
         viewModel.workstationId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID) as Long
-        val tempSelectedPointData =
-            GlobalDataTempStore.getInstance().getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-        if (tempSelectedPointData is List<*>) {
-            viewModel.selectedPointData =
-                tempSelectedPointData.filterIsInstance<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>()
-                    .toMutableList()
-        }
+            .getData(DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID) ?: 0
+        viewModel.selectedPointData =
+            GlobalDataTempStore.getInstance()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_POINT_DATA,
+                    Type.pointGroupType
+                ) ?: mutableListOf()
         if (viewModel.selectedPointData.isEmpty()) {
             val emptyOriginGroupName = getString(R.string.selected_point_info_title)
-            val jobTicketGroupVo = JobTicketGroupDataVo(groupName = emptyOriginGroupName)
+            val jobTicketGroupVo = JobTicketGroupInfoVo(groupName = emptyOriginGroupName)
             viewModel.selectedPointData.add(
-                jobTicketGroupVo to mutableListOf()
+                JobTicketGroupDataVo(jobTicketGroupVo,mutableListOf())
             )
             viewModel.currentSelectGroupId = jobTicketGroupVo.groupId
         }
         val previewStepTitle = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) as String
+            .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) ?: ""
         val previewStepIcon = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) as Int
+            .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) ?: 0
         binding.previewStepTitle.text = previewStepTitle
         binding.previewStepIv.setImageResource(previewStepIcon)
         logger.info(
@@ -206,14 +226,14 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         )
         if (GlobalDataTempStore.getInstance().hasData(DataTransferConstants.KEY_IS_UNLOCK_FIRST)) {
             viewModel.unlockFirst = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_IS_UNLOCK_FIRST) as Boolean
+                .getData<Boolean>(DataTransferConstants.KEY_IS_UNLOCK_FIRST) == true
         }
         viewModel.getPointData().observe(this) {
             binding.pointGroupRv.models = viewModel.selectedPointData
             binding.unselectedPointRv.models = viewModel.pointManageData.apply {
                 forEach {
                     it.isSelected =
-                        it.pointId in viewModel.selectedPointData.flatMap { it.second }
+                        it.pointId in viewModel.selectedPointData.flatMap { it.jobTicketGroupMemberList }
                             .map { it.pointId }
                 }
             }.filter { it.isSelected == false }

+ 3 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/common/WorkflowSettingFragment.kt

@@ -227,11 +227,11 @@ class WorkflowSettingFragment : BaseFormFragment<FragmentWorkflowSettingBinding>
     override fun initData() {
         super.initData()
         viewModel.modeId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_WORKFLOW_SETTING_MODE_ID) as Long
+            .getData(DataTransferConstants.KEY_WORKFLOW_SETTING_MODE_ID) ?: 0
         val previewStepTitle = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) as String
+            .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) ?: ""
         val previewStepIcon = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) as Int
+            .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) ?: 0
         binding.previewStepTitle.text = previewStepTitle
         binding.previewStepIv.setImageResource(previewStepIcon)
         viewModel.getSettingData().observe(this) {

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt

@@ -72,7 +72,7 @@ class ExceptionDetailFragment : BaseFragment<FragmentExceptionDetailBinding>() {
     override fun initData() {
         super.initData()
         viewModel.exceptionData = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_EXCEPTION_DATA) as IsExceptionStandardVo
+            .getData(DataTransferConstants.KEY_EXCEPTION_DATA)
         viewModel.getDictData().observe(this) {
             viewModel.getExceptionSourceName().observe(this) {
                 binding.handleException.isVisible =

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt

@@ -396,9 +396,9 @@ class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
             return
         }
         val ticketId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_JOB_TICKET_ID)
+            .getData<Long>(DataTransferConstants.KEY_JOB_TICKET_ID)
         val exceptionId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_EXCEPTION_ID)
+            .getData<Int>(DataTransferConstants.KEY_EXCEPTION_ID)
         if (ticketId == null) {
             PopTip.tip(R.string.job_lost)
             navController.popBackStack()

+ 74 - 36
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt

@@ -1,27 +1,29 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.content.Context
-import android.view.inputmethod.InputMethodManager
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.google.gson.Gson
+import com.grkj.data.data.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateJobBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
-import com.grkj.iscs.databinding.ItemPointGroupBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -33,11 +35,13 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.file
 import com.sik.sikcore.extension.setDebouncedClickListener
+import com.sik.sikcore.extension.toJson
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
 import dagger.hilt.android.AndroidEntryPoint
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
+import kotlin.math.log
 
 /**
  * 新建作业
@@ -47,8 +51,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
     private val viewModel: JobViewModel by viewModels()
     private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_job
@@ -310,13 +316,19 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
+            onBind {
+                onGroupLockerRVBinding(this)
+            }
+        }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -468,9 +480,37 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -484,14 +524,14 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -507,53 +547,51 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType
+                ) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> }
-                ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_POINT_DATA,
+                    Type.pointGroupType
+                ) ?: listOf()
         }
         if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
             selectedLockerData = selectedPointData.map {
-                it.first to (selectedLockerData.find { lockerGroup -> it.first.groupId == lockerGroup.first.groupId }?.second
-                    ?: mutableListOf())
+                JobTicketGroupDataVo(
+                    it.jobTicketGroupInfo,
+                    selectedLockerData.find { lockerGroup -> it.jobTicketGroupInfo.groupId == lockerGroup.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList
+                        ?: mutableListOf()
+                )
             }
         }
         binding.noSelectedMemberLayout.isVisible =
-            selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
+            selectedColockerData.isEmpty() && selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                .isEmpty()
         binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()
-        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.second } + selectedColockerData).map { it.userId })
+        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.jobTicketGroupMemberList } + selectedColockerData).map { it.userId })
             .observe(this) {
                 if (selectedColockerData.isNotEmpty()) {
                     binding.colockerRv.models = selectedColockerData
                 }
-                //todo 上锁人分组
-//                if (selectedLockerData.isNotEmpty()) {
-//                    val userData = selectedLockerData.first()
-//                    binding.lockerName.text = userData.nickName
-//                    (userData.avatar
-//                        ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                        if (it.isNotEmpty()) {
-//                            val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                            binding.lockerIv.load(avatar)
-//                        }
-//                    } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//                }
+                if (selectedLockerData.isNotEmpty()) {
+                    binding.lockerRv.models = selectedLockerData
+                }
             }
+        logger.info("点位数据2:${selectedPointData.toJson()}")
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData
         }

+ 115 - 84
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt

@@ -5,21 +5,24 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.PointManageVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateSopBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -42,8 +45,10 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
     private val viewModel: SopViewModel by viewModels()
     private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop
@@ -104,21 +109,21 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
-                )
+                DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
+            )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_SELECTED_POINT_DATA, selectedPointData)
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_sop_title).toString()
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                CommonUtils.getStr(R.string.create_sop_title).toString()
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_job_manage_create_sop
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                R.mipmap.icon_job_manage_create_sop
+            )
             val isSaveSuccess = GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_IS_UNLOCK_FIRST, viewModel.isUnlockFirst
-                )
+                DataTransferConstants.KEY_IS_UNLOCK_FIRST, viewModel.isUnlockFirst
+            )
             logger.info("是否保存成功:${isSaveSuccess}")
             navController.navigate(R.id.action_createSopFragment_to_selectPointFragment)
         }
@@ -136,24 +141,24 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
-                )
+                DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
+            )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
-                )
+                DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
+            )
             GlobalDataTempStore.getInstance().saveData(
                 DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
             )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_sop_title).toString()
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                CommonUtils.getStr(R.string.create_sop_title).toString()
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_job_manage_create_sop
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                R.mipmap.icon_job_manage_create_sop
+            )
             navController.navigate(R.id.action_createSopFragment_to_selectMemberFragment)
         }
         binding.workflowModeSettingTv.setDebouncedClickListener {
@@ -162,16 +167,16 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_WORKFLOW_SETTING_MODE_ID, selectedModeId ?: 0
-                )
+                DataTransferConstants.KEY_WORKFLOW_SETTING_MODE_ID, selectedModeId ?: 0
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_sop_title).toString()
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                CommonUtils.getStr(R.string.create_sop_title).toString()
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_job_manage_create_sop
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                R.mipmap.icon_job_manage_create_sop
+            )
             navController.navigate(R.id.action_createSopFragment_to_workflowSettingFragment)
         }
         binding.selectPointTv.setDebouncedClickListener {
@@ -180,21 +185,21 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 return@setDebouncedClickListener
             }
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
-                )
+                DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
+            )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_SELECTED_POINT_DATA, selectedPointData)
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_sop_title).toString()
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                CommonUtils.getStr(R.string.create_sop_title).toString()
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_job_manage_create_sop
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                R.mipmap.icon_job_manage_create_sop
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_IS_UNLOCK_FIRST, viewModel.isUnlockFirst
-                )
+                DataTransferConstants.KEY_IS_UNLOCK_FIRST, viewModel.isUnlockFirst
+            )
             navController.navigate(R.id.action_createSopFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {
@@ -211,21 +216,21 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
             )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
-                )
+                DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
+            )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
-                )
+                DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
-                    CommonUtils.getStr(R.string.create_sop_title).toString()
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                CommonUtils.getStr(R.string.create_sop_title).toString()
+            )
             GlobalDataTempStore.getInstance().saveData(
-                    DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
-                    R.mipmap.icon_job_manage_create_sop
-                )
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                R.mipmap.icon_job_manage_create_sop
+            )
             navController.navigate(R.id.action_createSopFragment_to_selectMemberFragment)
         }
         binding.pointRv.apply {
@@ -235,19 +240,19 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
-        binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
             onBind {
-                onSelectedMemberRVBinding(this)
+                onGroupLockerRVBinding(this)
             }
         }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -357,9 +362,37 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -373,14 +406,14 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -396,50 +429,48 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType
+                ) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_POINT_DATA,
+                    Type.pointGroupType
+                ) ?: listOf()
         }
         if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
             selectedLockerData = selectedPointData.map {
-                it.first to (selectedLockerData.find { lockerGroup -> it.first.groupId == lockerGroup.first.groupId }?.second
-                    ?: mutableListOf())
+                JobTicketGroupDataVo(
+                    it.jobTicketGroupInfo,
+                    selectedLockerData.find { lockerGroup -> it.jobTicketGroupInfo.groupId == lockerGroup.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList
+                        ?: mutableListOf()
+                )
             }
         }
         binding.noSelectedMemberLayout.isVisible =
-            selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
+            selectedColockerData.isEmpty() && selectedLockerData.flatMap { it.jobTicketGroupMemberList }
+                .isEmpty()
         binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()
-        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.second } + selectedColockerData).map { it.userId })
+        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.jobTicketGroupMemberList } + selectedColockerData).map { it.userId })
             .observe(this) {
                 if (selectedColockerData.isNotEmpty()) {
                     binding.colockerRv.models = selectedColockerData
                 }
-                //todo 上锁人分组
-//            if (selectedLockerData.isNotEmpty()) {
-//                val userData = selectedLockerData.first()
-//                binding.lockerName.text = userData.nickName
-//                (userData.avatar
-//                    ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                    if (it.isNotEmpty()) {
-//                        val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                        binding.lockerIv.load(avatar)
-//                    }
-//                } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//            }
+                if (selectedLockerData.isNotEmpty()) {
+                    binding.lockerRv.models = selectedLockerData
+                }
             }
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData

+ 60 - 31
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt

@@ -5,21 +5,25 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentCreateSopJobBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -43,8 +47,10 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop_job
@@ -184,13 +190,19 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
+            onBind {
+                onGroupLockerRVBinding(this)
+            }
+        }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -317,9 +329,37 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -333,14 +373,14 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -356,37 +396,27 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
         binding.noSelectedMemberLayout.isVisible =
-            selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
+            selectedColockerData.isEmpty() && selectedLockerData.flatMap { it.jobTicketGroupMemberList }.isEmpty()
         binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()
-        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.second } + selectedColockerData).map { it.userId })
+        viewModel.getUserBiometricDataByUserIds((selectedLockerData.flatMap { it.jobTicketGroupMemberList } + selectedColockerData).map { it.userId })
             .observe(this) {
                 if (selectedColockerData.isNotEmpty()) {
                     binding.colockerRv.models = selectedColockerData
                 }
-                //todo 上锁人分组
-//            if (selectedLockerData.isNotEmpty()) {
-//                val userData = selectedLockerData.first()
-//                binding.lockerName.text = userData.nickName
-//                (userData.avatar
-//                    ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                    if (it.isNotEmpty()) {
-//                        val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                        binding.lockerIv.load(avatar)
-//                    }
-//                } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//            }
+                if (selectedLockerData.isNotEmpty()) {
+                    binding.lockerRv.models = selectedLockerData
+                }
             }
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData
@@ -447,11 +477,10 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
             selectedLockerData = viewModel.sopLockerData
             selectedPointData = viewModel.sopPoints
             binding.pointRv.models = selectedPointData
-            //todo 分组上锁人
-//            binding.lockerName.text = selectedLockerData.first().nickName
+            binding.lockerRv.models = selectedLockerData
             binding.colockerRv.models = selectedColockerData
             binding.noSelectedMemberLayout.isVisible =
-                selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
+                selectedColockerData.isEmpty() && selectedLockerData.flatMap { it.jobTicketGroupMemberList }.isEmpty()
             binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()
         }
     }

+ 93 - 43
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt

@@ -5,20 +5,24 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditJobBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -31,6 +35,7 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.file
 import com.sik.sikcore.extension.setDebouncedClickListener
+import com.sik.sikcore.extension.toJson
 import com.sik.sikimage.ImageConvertUtils
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -42,8 +47,10 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
     private val viewModel: JobViewModel by viewModels()
     private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_job
@@ -199,13 +206,19 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
+            onBind {
+                onGroupLockerRVBinding(this)
+            }
+        }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -331,9 +344,37 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -347,14 +388,14 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -367,9 +408,9 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
     override fun initData() {
         super.initData()
         val ticketId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
+            .getData<Long>(DataTransferConstants.KEY_JOB_TICKET_ID)
         viewModel.getWorkflowModes().observe(this) {
-            viewModel.getJobData(ticketId).observe(this) {
+            viewModel.getJobData(ticketId ?: 0).observe(this) {
                 binding.workstationTv.text =
                     viewModel.workstationData.find { it.workstationId == viewModel.jobTicketData?.workstationId }?.workstationName
                 selectedWorkstationId = viewModel.jobTicketData?.workstationId
@@ -384,15 +425,27 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                         ?.modeTitle
                 binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
                 selectedPointData = viewModel.jobPointsData.groupBy { it.groupId to it.groupName }
-                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(
+                                it.key.first,
+                                it.key.second
+                            ), it.value.toMutableList()
+                        )
+                    }
                 selectedLockerData = viewModel.jobLockerData.groupBy { it.groupId to it.groupName }
-                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(
+                                it.key.first,
+                                it.key.second
+                            ), it.value.toMutableList()
+                        )
+                    }
                 selectedColockerData = viewModel.jobColockerData
-                binding.pointRv.models = viewModel.jobPointsData
-                viewModel.jobLockerData.firstOrNull()?.let {
-                    binding.lockerName.text = it.nickName
-                }
-                binding.colockerRv.models = viewModel.jobColockerData
+                binding.pointRv.models = selectedPointData
+                binding.lockerRv.models = selectedLockerData
+                binding.colockerRv.models = selectedColockerData
                 binding.selectColockerLayout.isVisible =
                     viewModel.workflowModes.find { it.modeId == selectedModeId }?.isColockSupport == true
                 viewModel.getWorkflowSteps(selectedModeId!!).observe(this) {
@@ -409,45 +462,42 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
-        }
-        if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
-            selectedLockerData = selectedPointData.map {
-                it.first to (selectedLockerData.find { lockerGroup ->it.first.groupId == lockerGroup.first.groupId }?.second
-                    ?: mutableListOf())
-            }
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType
+                ) ?: listOf()
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_POINT_DATA,
+                    Type.pointGroupType
+                ) ?: listOf()
+        }
+        if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
+            selectedLockerData = selectedPointData.map {
+                JobTicketGroupDataVo(
+                    it.jobTicketGroupInfo,
+                    selectedLockerData.find { lockerGroup -> it.jobTicketGroupInfo.groupId == lockerGroup.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList
+                        ?: mutableListOf()
+                )
+            }
         }
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData
         }
-        //todo 上锁人分组
-//        if (selectedLockerData.isNotEmpty()) {
-//            val userData = selectedLockerData.first()
-//            binding.lockerName.text = userData.nickName
-//            (userData.avatar
-//                ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                if (it.isNotEmpty()) {
-//                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                    binding.lockerIv.load(avatar)
-//                }
-//            } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//        }
+        if (selectedLockerData.isNotEmpty()) {
+            binding.lockerRv.models = selectedLockerData
+        }
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData
         }

+ 87 - 36
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt

@@ -5,21 +5,25 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditSopBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -43,8 +47,10 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
     private val viewModel: SopViewModel by viewModels()
     private var selectedModeId: Long? = null
     private var selectedWorkstationId: Long? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop
@@ -197,13 +203,19 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
+            onBind {
+                onGroupLockerRVBinding(this)
+            }
+        }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -297,9 +309,37 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -313,14 +353,14 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -333,11 +373,19 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
     override fun initData() {
         super.initData()
         val sopId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_EDIT_SOP_SOP_ID) as Long
+            .getData(DataTransferConstants.KEY_EDIT_SOP_SOP_ID) ?: 0L
         viewModel.getWorkflowModes().observe(this) {
             viewModel.getSopDataBySopId(sopId).observe(this) {
-                selectedPointData = viewModel.selectedSopPointData.groupBy { it.groupId to it.groupName }
-                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
+                selectedPointData =
+                    viewModel.selectedSopPointData.groupBy { it.groupId to it.groupName }
+                        .map {
+                            JobTicketGroupDataVo(
+                                JobTicketGroupInfoVo(
+                                    it.key.first,
+                                    it.key.second
+                                ), it.value.toMutableList()
+                            )
+                        }
                 selectedModeId = viewModel.selectedSopData?.modeId
                 selectedWorkstationId = viewModel.selectedSopData?.workstationId
                 binding.workstationTv.text = viewModel.selectedSopData?.workstationName
@@ -348,14 +396,20 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                     it.roleKeys.contains(
                         RoleEnum.JTLOCKER.roleKey
                     )
-                }.groupBy { it.groupId to it.groupName }.map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
+                }.groupBy { it.groupId to it.groupName }.map {
+                    JobTicketGroupDataVo(
+                        JobTicketGroupInfoVo(
+                            it.key.first,
+                            it.key.second
+                        ), it.value.toMutableList()
+                    )
+                }
                 selectedColockerData = viewModel.selectedSopUserData.filter {
                     it.roleKeys.contains(
                         RoleEnum.JTCOLOCKER.roleKey
                     )
                 }
-                //todo 上锁人分组
-//                binding.lockerName.text = selectedLockerData.first().nickName
+                binding.lockerRv.models = selectedLockerData
                 binding.colockerRv.models = selectedColockerData
                 binding.pointRv.models = selectedPointData
                 binding.selectColockerLayout.isVisible =
@@ -374,46 +428,43 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType
+                ) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_POINT_DATA,
+                    Type.pointGroupType
+                ) ?: listOf()
         }
         if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
             selectedLockerData = selectedPointData.map {
-                it.first to (selectedLockerData.find { lockerGroup -> it.first == lockerGroup.first }?.second
-                    ?: mutableListOf())
+                JobTicketGroupDataVo(
+                    it.jobTicketGroupInfo,
+                    (selectedLockerData.find { lockerGroup -> it.jobTicketGroupInfo == lockerGroup.jobTicketGroupInfo }?.jobTicketGroupMemberList
+                        ?: mutableListOf())
+                )
             }
         }
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData
         }
-        //上锁人分组
-//        if (selectedLockerData.isNotEmpty()) {
-//            val userData = selectedLockerData.first()
-//            binding.lockerName.text = userData.nickName
-//            (userData.avatar
-//                ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                if (it.isNotEmpty()) {
-//                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                    binding.lockerIv.load(avatar)
-//                }
-//            } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//        }
+        if (selectedLockerData.isNotEmpty()) {
+            binding.lockerRv.models = selectedLockerData
+        }
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData
         }

+ 61 - 31
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt

@@ -5,21 +5,25 @@ import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import coil.load
 import com.drake.brv.BindingAdapter
+import com.drake.brv.utils.dividerSpace
 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.Type
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentEditSopJobBinding
 import com.grkj.iscs.databinding.ItemJobWorkflowStepBinding
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemPointGroupShowBinding
+import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
@@ -44,8 +48,10 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null
-    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<JobTicketGroupDataVo<JobPointVo>> =
+        mutableListOf()
+    private var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> =
+        mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop_job
@@ -182,13 +188,19 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group_show)
+            addType<JobTicketGroupDataVo<JobPointVo>>(R.layout.item_point_group_show)
             onBind {
                 onPointGroupRVBinding(this)
             }
         }
+        binding.lockerRv.linear(LinearLayout.HORIZONTAL).dividerSpace(10).setup {
+            addType<JobTicketGroupDataVo<JobUserVo>>(R.layout.item_locker_group)
+            onBind {
+                onGroupLockerRVBinding(this)
+            }
+        }
         binding.colockerRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_colocker_member)
             onBind {
                 onSelectedMemberRVBinding(this)
             }
@@ -310,9 +322,37 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         return true
     }
 
-    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun BindingAdapter.BindingViewHolder.onGroupLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
+        val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(this)
+            }
+        }.models = item.jobTicketGroupMemberList
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        holder: BindingAdapter.BindingViewHolder
+    ) {
         val itemBinding = holder.getBinding<ItemSelectMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
+        itemBinding.lockerName.text = item.nickName
+        itemBinding.lockerIcon.isSelected = true
+        (item.avatar
+            ?: viewModel.userBiometricDataVo.find { it.userId == item.userId }?.content)?.let {
+            if (it.isNotEmpty()) {
+                val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
+                itemBinding.lockerIcon.load(avatar)
+            }
+        } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onSelectedMemberRVBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemSelectColockerMemberBinding>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = true
         (item.avatar
@@ -326,14 +366,14 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupShowBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
-        itemBinding.groupName.setText(item.first)
+        val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
+        itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
         itemBinding.groupPointRv.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(this)
             }
-        }.models = item.second
+        }.models = item.jobTicketGroupMemberList
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -346,7 +386,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
     override fun initData() {
         super.initData()
         val ticketId = GlobalDataTempStore.getInstance()
-            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
+            .getData(DataTransferConstants.KEY_JOB_TICKET_ID) ?: 0L
         viewModel.getWorkflowModes().observe(this) {
 
             viewModel.getSopJobData(ticketId).observe(this) {
@@ -362,8 +402,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 selectedLockerData = viewModel.sopLockerData
                 selectedColockerData = viewModel.sopColockerData
                 binding.pointRv.models = selectedPointData
-                //todo 上锁人分组
-//                binding.lockerName.text = selectedLockerData.first().nickName
+                binding.lockerRv.models = selectedLockerData
                 binding.colockerRv.models = selectedColockerData
                 binding.selectColockerLayout.isVisible =
                     viewModel.workflowModes.find { it.modeId == selectedSop?.modeId }?.isColockSupport == true
@@ -381,31 +420,23 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                    Type.lockerGroupType
+                ) ?: listOf()
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             selectedColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
         }
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData
         }
-        //todo 上锁人分组
-//        if (selectedLockerData.isNotEmpty()) {
-//            val userData = selectedLockerData.first()
-//            binding.lockerName.text = userData.nickName
-//            (userData.avatar
-//                ?: viewModel.userBiometricDataVo.find { it.userId == userData.userId }?.content)?.let {
-//                if (it.isNotEmpty()) {
-//                    val avatar = ImageConvertUtils.base64ToBitmap(it.file().readText())
-//                    binding.lockerIv.load(avatar)
-//                }
-//            } ?: binding.lockerIv.setImageResource(R.drawable.icon_select_member)
-//        }
+        if (selectedLockerData.isNotEmpty()) {
+            binding.lockerRv.models = selectedLockerData
+        }
         if (selectedPointData.isNotEmpty()) {
             binding.pointRv.models = selectedPointData
         }
@@ -461,8 +492,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
             selectedLockerData = viewModel.sopLockerData
             selectedPointData = viewModel.sopPoints
             binding.pointRv.models = selectedPointData
-            //todo 上锁人分组
-//            binding.lockerName.text = selectedLockerData.first().nickName
+            binding.lockerRv.models = selectedLockerData
             binding.colockerRv.models = selectedColockerData
         }
     }

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

@@ -6,8 +6,6 @@ import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
@@ -20,7 +18,6 @@ import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentJobExecuteBinding
@@ -33,8 +30,6 @@ import com.grkj.ui_base.base.BaseFragment
 import com.grkj.data.data.EventConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.model.dos.WorkflowStep
-import com.grkj.data.model.vo.JobTicketGroupDataVo
-import com.grkj.data.model.vo.JobUserVo
 import com.grkj.iscs.features.main.dialog.CheckFaceDialog
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.dialog.TipDialog
@@ -48,7 +43,6 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.coroutines.flow.count
 import kotlin.getValue
 
 /**
@@ -604,7 +598,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         viewModel.getWorkflowModes().observe(this) {
             viewModel.ticketId = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_JOB_TICKET_ID) as Long
+                .getData(DataTransferConstants.KEY_JOB_TICKET_ID)?:0L
             getData()
         }
     }
@@ -664,16 +658,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
         ) {
             viewModel.selectedLockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)?: listOf()
             viewModel.checkMemberFinish = true
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
             viewModel.selecteColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-                ?.let { return@let it as List<JobUserVo> } ?: listOf()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)?: listOf()
             viewModel.checkMemberFinish = true
         }
         if (viewModel.checkMemberFinish) {

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectMemberViewModel.kt

@@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
-import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
 import com.grkj.data.repository.IJobTicketRepository
@@ -28,7 +28,7 @@ class SelectMemberViewModel @Inject constructor(
     var ticketUsers: List<IsJobTicketUserDataVo> = listOf()
     var jobTicketData: IsJobTicketDataVo? = null
     var userBiometricDataVo: List<SysBiometricDataVo> = mutableListOf()
-    var currentSelectGroup: JobTicketGroupDataVo? = null
+    var currentSelectGroup: JobTicketGroupInfoVo? = null
 
     /**
      * 用户数据

+ 3 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectPointViewModel.kt

@@ -4,6 +4,8 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
+import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.ui_base.base.BaseViewModel
 import com.sik.sikcore.data.BeanUtils
@@ -20,7 +22,7 @@ class SelectPointViewModel @Inject constructor(val pointRepository: IIsolationPo
     var pointManageData: MutableList<JobPointVo> = mutableListOf()
     var workstationId: Long = 0
     var unlockFirst: Boolean = false
-    var selectedPointData: MutableList<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> =
+    var selectedPointData: MutableList<JobTicketGroupDataVo<JobPointVo>> =
         mutableListOf()
     var currentSelectGroupId: Long = 0L
 

+ 26 - 4
app/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionJobViewModel.kt

@@ -17,6 +17,8 @@ import com.grkj.data.model.vo.IsJobTicketLockDataVo
 import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.repository.IExceptionRepository
 import com.grkj.data.repository.IJobTicketRepository
@@ -226,14 +228,24 @@ class ExceptionJobViewModel @Inject constructor(
             }
             val jobTicketPoints =
                 jobTicketRepository.getTicketPointsByTicketId(ticketId).groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(groupName = it.key),
+                            it.value.toMutableList()
+                        )
+                    }
             val jobTicketUsers = jobTicketRepository.getJobTicketUserDataByTicketId(ticketId)
             val locker =
                 userRepository.getJobUserDataByUserIdAndTicketId(
                     ticketId,
                     jobTicketUsers.filter { it.userRole == RoleEnum.JTLOCKER.roleKey }
                         .map { it.userId }).groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(groupName = it.key),
+                            it.value.toMutableList()
+                        )
+                    }
             val coLocker =
                 userRepository.getJobUserDataByUserIdAndTicketId(
                     ticketId,
@@ -266,14 +278,24 @@ class ExceptionJobViewModel @Inject constructor(
             }
             val jobTicketPoints =
                 jobTicketRepository.getTicketPointsByTicketId(ticketId).groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(groupName = it.key),
+                            it.value.toMutableList()
+                        )
+                    }
             val jobTicketUsers = jobTicketRepository.getJobTicketUserDataByTicketId(ticketId)
             val locker =
                 userRepository.getJobUserDataByUserIdAndTicketId(
                     ticketId,
                     jobTicketUsers.filter { it.userRole == RoleEnum.JTLOCKER.roleKey }
                         .map { it.userId }).groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(groupName = it.key),
+                            it.value.toMutableList()
+                        )
+                    }
             val coLocker =
                 userRepository.getJobUserDataByUserIdAndTicketId(
                     ticketId,

+ 14 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt

@@ -17,6 +17,7 @@ import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
 import com.grkj.data.repository.IJobTicketRepository
@@ -56,7 +57,7 @@ class JobExecuteViewModel @Inject constructor(
     lateinit var ticketPoints: List<IsJobTicketPointsDataVo>
     lateinit var ticketStep: List<IsJobTicketStepDataVo>
     lateinit var ticketUser: List<IsJobTicketUserDataVo>
-    var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
+    var selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>> = mutableListOf()
     var selecteColockerData: List<JobUserVo> = mutableListOf()
     var checkMemberFinish: Boolean = false
     var currentStepData: IsJobTicketStepDataVo? = null
@@ -90,7 +91,12 @@ class JobExecuteViewModel @Inject constructor(
             val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
             selectedLockerData =
                 tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
-                    .groupBy { it.groupName }.map { it.key to it.value.toMutableList() }
+                    .groupBy { it.groupId to it.groupName }.map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(it.key.first, it.key.second),
+                            it.value.toMutableList()
+                        )
+                    }
             selecteColockerData =
                 tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             ticketStep.sortedBy { it.stepIndex }
@@ -111,7 +117,12 @@ class JobExecuteViewModel @Inject constructor(
             val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
             selectedLockerData =
                 tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
-                    .groupBy { it.groupName }.map { it.key to it.value.toMutableList() }
+                    .groupBy { it.groupId to it.groupName }.map {
+                        JobTicketGroupDataVo(JobTicketGroupInfoVo(
+                            it.key.first,
+                            it.key.second
+                        ),it.value.toMutableList())
+                    }
             selecteColockerData =
                 tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             emit(true)

+ 23 - 6
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt

@@ -3,11 +3,13 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.dos.IsSopGroup
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
@@ -56,8 +58,8 @@ class JobViewModel @Inject constructor(
      * 保存作业
      */
     fun saveSop(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         workstationId: Long,
@@ -65,7 +67,22 @@ class JobViewModel @Inject constructor(
         sopId: Long = 0
     ): LiveData<Long> {
         return liveData(Dispatchers.IO) {
+            sopRepository.deleteSopPointsBySopId(listOf(sopId))
+            sopRepository.deleteSopUsersBySopId(listOf(sopId))
+            sopRepository.deleteSopGroupBySopId(listOf(sopId))
             val sopId = sopRepository.saveSop(sopId, sopName, workstationId, workflowModeId)
+            selectedPointsData.forEach {
+                val isSopGroup = IsSopGroup()
+                isSopGroup.groupName = it.jobTicketGroupInfo.groupName ?: ""
+                isSopGroup.sopId = sopId
+                val groupId = sopRepository.saveSopGroup(isSopGroup)
+                it.jobTicketGroupMemberList.forEach {
+                    it.groupId = groupId
+                }
+                selectedLockerData.find { lockerGroup -> lockerGroup.jobTicketGroupInfo.groupId == it.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList?.forEach {
+                    it.groupId=groupId
+                }
+            }
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(sopId)
@@ -76,8 +93,8 @@ class JobViewModel @Inject constructor(
      * 创建作业
      */
     fun createJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         sopId: Long?,
@@ -102,8 +119,8 @@ class JobViewModel @Inject constructor(
      * 保存作业
      */
     fun saveJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         sopId: Long?,

+ 43 - 12
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt

@@ -8,6 +8,7 @@ import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
@@ -21,6 +22,7 @@ import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
 import javax.inject.Inject
+import kotlin.collections.groupBy
 
 /**
  * sop作业界面模型
@@ -35,8 +37,8 @@ class SopJobViewModel @Inject constructor(
 ) : BaseViewModel(userRepository) {
     var workstationData: List<IsWorkstation> = listOf()
     var sopData: List<SopManageVo> = listOf()
-    var sopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = listOf()
-    var sopLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = listOf()
+    var sopPoints: List<JobTicketGroupDataVo<JobPointVo>> = listOf()
+    var sopLockerData: List<JobTicketGroupDataVo<JobUserVo>> = listOf()
     var sopColockerData: List<JobUserVo> = listOf()
     var jobTicketData: JobTicketManageVo? = null
     var workflowModes: List<WorkflowMode> = mutableListOf()
@@ -71,11 +73,26 @@ class SopJobViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             val tempSopUsers = sopRepository.getSopUsersBySopId(sopId)
             sopLockerData = tempSopUsers.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
-                .groupBy { it.groupName }.map { it.key to it.value.toMutableList() }
+                .groupBy { it.groupId to it.groupName }.map {
+                    JobTicketGroupDataVo(
+                        JobTicketGroupInfoVo(
+                            it.key.first,
+                            it.key.second
+                        ), it.value.toMutableList()
+                    )
+                }
             sopColockerData =
                 tempSopUsers.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
-            sopPoints = sopRepository.getSopPointsBySopId(sopId).groupBy { it.groupName }
-                .map { it.key to it.value.toMutableList() }
+            sopPoints =
+                sopRepository.getSopPointsBySopId(sopId).groupBy { it.groupId to it.groupName }
+                    .map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(
+                                it.key.first,
+                                it.key.second
+                            ), it.value.toMutableList()
+                        )
+                    }
             emit(true)
         }
     }
@@ -84,8 +101,8 @@ class SopJobViewModel @Inject constructor(
      * 创建sop作业
      */
     fun createSopJob(
-        selectedSopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedSopPoints: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -110,8 +127,8 @@ class SopJobViewModel @Inject constructor(
      * 创建sop作业
      */
     fun saveSopJob(
-        selectedSopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedSopPoints: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -156,12 +173,26 @@ class SopJobViewModel @Inject constructor(
             userBiometricDataVo =
                 userRepository.getUserBiometricDataByUserIds(sopJobUsers.map { it.userId })
             sopLockerData = sopJobUsers.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
-                .groupBy { it.groupName }.map { it.key to it.value.toMutableList() }
+                .groupBy { it.groupId to it.groupName }.map {
+                    JobTicketGroupDataVo(
+                        JobTicketGroupInfoVo(
+                            it.key.first,
+                            it.key.second
+                        ), it.value.toMutableList()
+                    )
+                }
             sopColockerData =
                 sopJobUsers.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             sopPoints =
-                jobTicketRepository.getTicketPointsByTicketId(ticketId).groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                jobTicketRepository.getTicketPointsByTicketId(ticketId)
+                    .groupBy { it.groupId to it.groupName }.map {
+                        JobTicketGroupDataVo(
+                            JobTicketGroupInfoVo(
+                                it.key.first,
+                                it.key.second
+                            ), it.value.toMutableList()
+                        )
+                    }
             emit(true)
         }
     }

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt

@@ -8,6 +8,7 @@ import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.SysBiometricDataVo
@@ -53,8 +54,8 @@ class SopViewModel @Inject constructor(
      * 保存sop
      */
     fun saveSop(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         workstationId: Long,
@@ -68,13 +69,13 @@ class SopViewModel @Inject constructor(
             val sopId = sopRepository.saveSop(sopId, sopName, workstationId, modeId)
             selectedPointsData.forEach {
                 val isSopGroup = IsSopGroup()
-                isSopGroup.groupName = it.first.groupName
+                isSopGroup.groupName = it.jobTicketGroupInfo.groupName ?: ""
                 isSopGroup.sopId = sopId
                 val groupId = sopRepository.saveSopGroup(isSopGroup)
-                it.second.forEach { pointVo ->
+                it.jobTicketGroupMemberList.forEach { pointVo ->
                     pointVo.groupId = groupId
                 }
-                selectedLockerData.find { it.first.groupId == it.first.groupId }?.second?.forEach { locker ->
+                selectedLockerData.find { lockerGroup -> lockerGroup.jobTicketGroupInfo.groupId == it.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList?.forEach { locker ->
                     locker.groupId = groupId
                 }
             }

+ 9 - 22
app/src/main/res/layout-land/fragment_create_job.xml

@@ -395,7 +395,8 @@
                             android:orientation="horizontal">
 
                             <LinearLayout
-                                android:layout_width="wrap_content"
+                                android:layout_width="0dp"
+                                android:layout_weight="1"
                                 android:layout_height="match_parent"
                                 android:background="@drawable/home_card_bg"
                                 android:orientation="vertical">
@@ -404,6 +405,7 @@
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
                                     android:gravity="center"
+                                    android:layout_gravity="center"
                                     android:paddingHorizontal="@dimen/common_spacing_2x"
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
@@ -415,28 +417,12 @@
                                     android:layout_height="@dimen/divider_line_space"
                                     android:background="@color/black" />
 
-                                <LinearLayout
-                                    android:layout_width="match_parent"
+
+                                <androidx.recyclerview.widget.RecyclerView
+                                    android:id="@+id/locker_rv"
+                                    android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
-                                    android:gravity="center"
-                                    android:orientation="vertical"
-                                    android:paddingBottom="@dimen/common_spacing">
-
-                                    <ImageView
-                                        android:id="@+id/locker_iv"
-                                        android:layout_width="@dimen/icon_member_size"
-                                        android:layout_height="@dimen/icon_member_size"
-                                        android:layout_marginTop="@dimen/common_spacing"
-                                        android:src="@mipmap/icon_selected_member" />
-
-                                    <TextView
-                                        android:id="@+id/locker_name"
-                                        android:layout_width="wrap_content"
-                                        android:layout_height="wrap_content"
-                                        android:gravity="center"
-                                        android:textColor="@color/black"
-                                        android:textSize="@dimen/common_btn_text_size" />
-                                </LinearLayout>
+                                    android:layout_gravity="center" />
                             </LinearLayout>
 
                             <LinearLayout
@@ -455,6 +441,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
                                     android:textColor="@color/black"
+                                    android:layout_gravity="center"
                                     android:textSize="@dimen/normal_text_size_18" />
 
                                 <View

+ 10 - 23
app/src/main/res/layout-land/fragment_create_sop.xml

@@ -395,7 +395,8 @@
                             android:orientation="horizontal">
 
                             <LinearLayout
-                                android:layout_width="wrap_content"
+                                android:layout_width="0dp"
+                                android:layout_weight="1"
                                 android:layout_height="match_parent"
                                 android:background="@drawable/home_card_bg"
                                 android:orientation="vertical">
@@ -407,6 +408,7 @@
                                     android:paddingHorizontal="@dimen/common_spacing_2x"
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
+                                    android:layout_gravity="center"
                                     android:textColor="@color/black"
                                     android:textSize="@dimen/normal_text_size_18" />
 
@@ -415,33 +417,17 @@
                                     android:layout_height="@dimen/divider_line_space"
                                     android:background="@color/black" />
 
-                                <LinearLayout
-                                    android:layout_width="match_parent"
+
+                                <androidx.recyclerview.widget.RecyclerView
+                                    android:id="@+id/locker_rv"
+                                    android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
-                                    android:gravity="center"
-                                    android:orientation="vertical"
-                                    android:paddingBottom="@dimen/common_spacing">
-
-                                    <ImageView
-                                        android:id="@+id/locker_iv"
-                                        android:layout_width="@dimen/icon_member_size"
-                                        android:layout_height="@dimen/icon_member_size"
-                                        android:layout_marginTop="@dimen/common_spacing"
-                                        android:src="@mipmap/icon_selected_member"/>
-
-                                    <TextView
-                                        android:id="@+id/locker_name"
-                                        android:layout_width="wrap_content"
-                                        android:layout_height="wrap_content"
-                                        android:gravity="center"
-                                        android:textColor="@color/black"
-                                        android:textSize="@dimen/common_btn_text_size" />
-                                </LinearLayout>
+                                    android:layout_gravity="center" />
                             </LinearLayout>
 
                             <LinearLayout
                                 android:id="@+id/select_colocker_layout"
-                                android:layout_width="match_parent"
+                                android:layout_width="0dp"
                                 android:layout_height="match_parent"
                                 android:layout_weight="1"
                                 android:background="@drawable/home_card_bg"
@@ -454,6 +440,7 @@
                                     android:paddingHorizontal="@dimen/common_spacing_2x"
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
+                                    android:layout_gravity="center"
                                     android:textColor="@color/black"
                                     android:textSize="@dimen/normal_text_size_18" />
 

+ 10 - 23
app/src/main/res/layout-land/fragment_create_sop_job.xml

@@ -378,7 +378,8 @@
                             android:orientation="horizontal">
 
                             <LinearLayout
-                                android:layout_width="wrap_content"
+                                android:layout_width="0dp"
+                                android:layout_weight="1"
                                 android:layout_height="match_parent"
                                 android:background="@drawable/home_card_bg"
                                 android:orientation="vertical">
@@ -387,6 +388,7 @@
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
                                     android:gravity="center"
+                                    android:layout_gravity="center"
                                     android:paddingHorizontal="@dimen/common_spacing_2x"
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/locker"
@@ -398,33 +400,17 @@
                                     android:layout_height="@dimen/divider_line_space"
                                     android:background="@color/black" />
 
-                                <LinearLayout
-                                    android:layout_width="match_parent"
+
+                                <androidx.recyclerview.widget.RecyclerView
+                                    android:id="@+id/locker_rv"
+                                    android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
-                                    android:gravity="center"
-                                    android:orientation="vertical"
-                                    android:paddingBottom="@dimen/common_spacing">
-
-                                    <ImageView
-                                        android:id="@+id/locker_iv"
-                                        android:layout_width="@dimen/icon_member_size"
-                                        android:layout_height="@dimen/icon_member_size"
-                                        android:layout_marginTop="@dimen/common_spacing"
-                                        android:src="@mipmap/icon_selected_member" />
-
-                                    <TextView
-                                        android:id="@+id/locker_name"
-                                        android:layout_width="wrap_content"
-                                        android:layout_height="wrap_content"
-                                        android:gravity="center"
-                                        android:textColor="@color/black"
-                                        android:textSize="@dimen/common_btn_text_size" />
-                                </LinearLayout>
+                                    android:layout_gravity="center" />
                             </LinearLayout>
 
                             <LinearLayout
                                 android:id="@+id/select_colocker_layout"
-                                android:layout_width="match_parent"
+                                android:layout_width="0dp"
                                 android:layout_height="match_parent"
                                 android:layout_weight="1"
                                 android:background="@drawable/home_card_bg"
@@ -438,6 +424,7 @@
                                     android:paddingVertical="@dimen/common_spacing"
                                     android:text="@string/colocker"
                                     android:textColor="@color/black"
+                                    android:layout_gravity="center"
                                     android:textSize="@dimen/normal_text_size_18" />
 
                                 <View

+ 14 - 27
app/src/main/res/layout-land/fragment_edit_job.xml

@@ -28,8 +28,8 @@
                 android:layout_weight="1"
                 android:text="@string/edit_job_title"
                 android:textColor="@color/black"
-                android:textStyle="bold"
-                android:textSize="@dimen/normal_text_size_25" />
+                android:textSize="@dimen/normal_text_size_25"
+                android:textStyle="bold" />
 
             <TextView
                 android:id="@+id/back"
@@ -239,8 +239,8 @@
                             android:id="@+id/workflow_rv"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
-                            android:scrollbars="horizontal"
-                            android:paddingHorizontal="@dimen/common_spacing" />
+                            android:paddingHorizontal="@dimen/common_spacing"
+                            android:scrollbars="horizontal" />
                     </FrameLayout>
                 </LinearLayout>
             </LinearLayout>
@@ -351,8 +351,9 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
+                            android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
 
@@ -360,6 +361,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:gravity="center"
+                                android:layout_gravity="center"
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
@@ -371,33 +373,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member"/>
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -411,6 +397,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

+ 10 - 23
app/src/main/res/layout-land/fragment_edit_sop.xml

@@ -345,7 +345,8 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
+                            android:layout_weight="1"
                             android:layout_height="match_parent"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
@@ -357,6 +358,7 @@
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
+                                android:layout_gravity="center"
                                 android:textColor="@color/black"
                                 android:textSize="@dimen/normal_text_size_18" />
 
@@ -365,33 +367,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -405,6 +391,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

+ 10 - 23
app/src/main/res/layout-land/fragment_edit_sop_job.xml

@@ -339,7 +339,8 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
+                            android:layout_weight="1"
                             android:layout_height="match_parent"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
@@ -351,6 +352,7 @@
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
+                                android:layout_gravity="center"
                                 android:textColor="@color/black"
                                 android:textSize="@dimen/normal_text_size_18" />
 
@@ -359,33 +361,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -399,6 +385,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

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

@@ -125,7 +125,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/locker_rv"
                         android:layout_width="wrap_content"
-                        android:layout_height="wrap_content" />
+                        android:layout_height="match_parent" />
                 </LinearLayout>
 
                 <LinearLayout

+ 43 - 35
app/src/main/res/layout-land/item_locker_group.xml

@@ -1,49 +1,57 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/common_spacing"
-        android:background="@drawable/home_card_bg"
-        android:gravity="center_vertical"
-        android:minWidth="@dimen/item_locker_group_min_width"
-        android:orientation="vertical">
+        android:layout_height="match_parent"
+        android:padding="@dimen/common_spacing">
 
         <LinearLayout
-            android:id="@+id/group_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:background="@drawable/bg_item_group_title_layout"
+            android:background="@drawable/home_card_bg"
             android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:paddingVertical="@dimen/common_spacing_small">
+            android:minWidth="@dimen/item_locker_group_min_width"
+            android:layout_gravity="center_vertical"
+            android:orientation="vertical">
 
-            <TextView
-                android:id="@+id/group_name"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@drawable/bg_group_name_input_selector"
-                android:enabled="false"
-                android:focusable="false"
-                android:focusableInTouchMode="false"
-                android:gravity="center"
-                android:paddingHorizontal="@dimen/common_spacing"
-                android:text="@string/selected_point_info_title"
-                android:textColor="@color/text_color_item_group_title_text"
-                android:textSize="@dimen/normal_text_size_18" />
+            <LinearLayout
+                android:id="@+id/group_title_layout"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_item_group_title_layout"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingVertical="@dimen/common_spacing_small">
 
-        </LinearLayout>
+                <TextView
+                    android:id="@+id/group_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/bg_group_name_input_selector"
+                    android:enabled="false"
+                    android:focusable="false"
+                    android:focusableInTouchMode="false"
+                    android:gravity="center"
+                    android:paddingHorizontal="@dimen/common_spacing"
+                    android:text="@string/selected_point_info_title"
+                    android:textColor="@color/text_color_item_group_title_text"
+                    android:textSize="@dimen/normal_text_size_18" />
 
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/divider_line_space"
-            android:background="@color/black" />
+            </LinearLayout>
 
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/group_locker_rv"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingBottom="@dimen/common_spacing" />
-    </LinearLayout>
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/divider_line_space"
+                android:background="@color/black" />
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/group_locker_rv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:minHeight="@dimen/item_locker_group_min_width"
+                android:paddingBottom="@dimen/common_spacing" />
+        </LinearLayout>
+    </FrameLayout>
 </layout>

+ 17 - 30
app/src/main/res/layout/fragment_create_job.xml

@@ -28,8 +28,8 @@
                 android:layout_weight="1"
                 android:text="@string/create_job_title"
                 android:textColor="@color/black"
-                android:textStyle="bold"
-                android:textSize="@dimen/normal_text_size_25" />
+                android:textSize="@dimen/normal_text_size_25"
+                android:textStyle="bold" />
 
             <TextView
                 android:id="@+id/back"
@@ -198,10 +198,10 @@
                     <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
                         android:layout_marginLeft="@dimen/common_spacing"
                         android:layout_weight="1"
                         android:text="@string/workflow_mode"
-                        android:layout_gravity="center_vertical"
                         android:textColor="@color/black"
                         android:textSize="@dimen/normal_text_size_18" />
 
@@ -231,8 +231,8 @@
                         android:id="@+id/workflow_rv"
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
-                        android:scrollbars="horizontal"
-                        android:paddingHorizontal="@dimen/common_spacing"/>
+                        android:paddingHorizontal="@dimen/common_spacing"
+                        android:scrollbars="horizontal" />
 
                     <TextView
                         android:id="@+id/select_workflow_tip"
@@ -267,10 +267,10 @@
                     <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
                         android:layout_marginLeft="@dimen/common_spacing"
                         android:layout_weight="1"
                         android:text="@string/point_info_title"
-                        android:layout_gravity="center_vertical"
                         android:textColor="@color/black"
                         android:textSize="@dimen/normal_text_size_18" />
 
@@ -346,10 +346,10 @@
                     <TextView
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
                         android:layout_marginLeft="@dimen/common_spacing"
                         android:layout_weight="1"
                         android:text="@string/member_info_title"
-                        android:layout_gravity="center_vertical"
                         android:textColor="@color/black"
                         android:textSize="@dimen/normal_text_size_18" />
 
@@ -381,14 +381,16 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
+                            android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
 
                             <TextView
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
+                                android:layout_gravity="center"
                                 android:gravity="center"
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
@@ -401,33 +403,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -440,6 +426,7 @@
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
+                                android:layout_gravity="center"
                                 android:textColor="@color/black"
                                 android:textSize="@dimen/normal_text_size_18" />
 

+ 14 - 27
app/src/main/res/layout/fragment_create_sop.xml

@@ -28,8 +28,8 @@
                 android:layout_weight="1"
                 android:text="@string/create_sop_title"
                 android:textColor="@color/black"
-                android:textStyle="bold"
-                android:textSize="@dimen/normal_text_size_25" />
+                android:textSize="@dimen/normal_text_size_25"
+                android:textStyle="bold" />
 
             <TextView
                 android:id="@+id/back"
@@ -233,8 +233,8 @@
                         android:id="@+id/workflow_rv"
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
-                        android:scrollbars="horizontal"
-                        android:paddingHorizontal="@dimen/common_spacing" />
+                        android:paddingHorizontal="@dimen/common_spacing"
+                        android:scrollbars="horizontal" />
 
                     <TextView
                         android:id="@+id/select_workflow_tip"
@@ -389,8 +389,9 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
+                            android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
 
@@ -398,6 +399,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:gravity="center"
+                                android:layout_gravity="center"
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
@@ -409,33 +411,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -449,6 +435,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

+ 10 - 23
app/src/main/res/layout/fragment_create_sop_job.xml

@@ -369,7 +369,8 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
+                            android:layout_weight="1"
                             android:layout_height="match_parent"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
@@ -381,6 +382,7 @@
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
+                                android:layout_gravity="center"
                                 android:textColor="@color/black"
                                 android:textSize="@dimen/normal_text_size_18" />
 
@@ -389,33 +391,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -429,6 +415,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

+ 10 - 23
app/src/main/res/layout/fragment_edit_job.xml

@@ -344,7 +344,8 @@
                         android:orientation="horizontal">
 
                         <LinearLayout
-                            android:layout_width="wrap_content"
+                            android:layout_width="0dp"
+                            android:layout_weight="1"
                             android:layout_height="match_parent"
                             android:background="@drawable/home_card_bg"
                             android:orientation="vertical">
@@ -353,6 +354,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:gravity="center"
+                                android:layout_gravity="center"
                                 android:paddingHorizontal="@dimen/common_spacing_2x"
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/locker"
@@ -364,33 +366,17 @@
                                 android:layout_height="@dimen/divider_line_space"
                                 android:background="@color/black" />
 
-                            <LinearLayout
-                                android:layout_width="match_parent"
+
+                            <androidx.recyclerview.widget.RecyclerView
+                                android:id="@+id/locker_rv"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
-                                android:gravity="center"
-                                android:orientation="vertical"
-                                android:paddingBottom="@dimen/common_spacing">
-
-                                <ImageView
-                                    android:id="@+id/locker_iv"
-                                    android:layout_width="@dimen/icon_member_size"
-                                    android:layout_height="@dimen/icon_member_size"
-                                    android:layout_marginTop="@dimen/common_spacing"
-                                    android:src="@mipmap/icon_selected_member" />
-
-                                <TextView
-                                    android:id="@+id/locker_name"
-                                    android:layout_width="wrap_content"
-                                    android:layout_height="wrap_content"
-                                    android:gravity="center"
-                                    android:textColor="@color/black"
-                                    android:textSize="@dimen/common_btn_text_size" />
-                            </LinearLayout>
+                                android:layout_gravity="center" />
                         </LinearLayout>
 
                         <LinearLayout
                             android:id="@+id/select_colocker_layout"
-                            android:layout_width="match_parent"
+                            android:layout_width="0dp"
                             android:layout_height="match_parent"
                             android:layout_weight="1"
                             android:background="@drawable/home_card_bg"
@@ -404,6 +390,7 @@
                                 android:paddingVertical="@dimen/common_spacing"
                                 android:text="@string/colocker"
                                 android:textColor="@color/black"
+                                android:layout_gravity="center"
                                 android:textSize="@dimen/normal_text_size_18" />
 
                             <View

+ 10 - 23
app/src/main/res/layout/fragment_edit_sop.xml

@@ -338,7 +338,8 @@
                     android:orientation="horizontal">
 
                     <LinearLayout
-                        android:layout_width="wrap_content"
+                        android:layout_width="0dp"
+                        android:layout_weight="1"
                         android:layout_height="match_parent"
                         android:background="@drawable/home_card_bg"
                         android:orientation="vertical">
@@ -350,6 +351,7 @@
                             android:paddingHorizontal="@dimen/common_spacing_2x"
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/locker"
+                            android:layout_gravity="center"
                             android:textColor="@color/black"
                             android:textSize="@dimen/normal_text_size_18" />
 
@@ -358,33 +360,17 @@
                             android:layout_height="@dimen/divider_line_space"
                             android:background="@color/black" />
 
-                        <LinearLayout
-                            android:layout_width="match_parent"
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/locker_rv"
+                            android:layout_width="wrap_content"
                             android:layout_height="match_parent"
-                            android:gravity="center"
-                            android:orientation="vertical"
-                            android:paddingBottom="@dimen/common_spacing">
-
-                            <ImageView
-                                android:id="@+id/locker_iv"
-                                android:layout_width="@dimen/icon_member_size"
-                                android:layout_height="@dimen/icon_member_size"
-                                android:layout_marginTop="@dimen/common_spacing"
-                                android:src="@mipmap/icon_selected_member" />
-
-                            <TextView
-                                android:id="@+id/locker_name"
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:gravity="center"
-                                android:textColor="@color/black"
-                                android:textSize="@dimen/common_btn_text_size" />
-                        </LinearLayout>
+                            android:layout_gravity="center" />
                     </LinearLayout>
 
                     <LinearLayout
                         android:id="@+id/select_colocker_layout"
-                        android:layout_width="match_parent"
+                        android:layout_width="0dp"
                         android:layout_height="match_parent"
                         android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
@@ -398,6 +384,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
+                            android:layout_gravity="center"
                             android:textSize="@dimen/normal_text_size_18" />
 
                         <View

+ 14 - 28
app/src/main/res/layout/fragment_edit_sop_job.xml

@@ -29,8 +29,8 @@
                 android:layout_weight="1"
                 android:text="@string/edit_sop_job_title"
                 android:textColor="@color/black"
-                android:textStyle="bold"
-                android:textSize="@dimen/normal_text_size_25" />
+                android:textSize="@dimen/normal_text_size_25"
+                android:textStyle="bold" />
 
             <TextView
                 android:id="@+id/back"
@@ -80,7 +80,6 @@
                 android:background="@color/black" />
 
 
-
             <androidx.constraintlayout.widget.ConstraintLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
@@ -236,8 +235,8 @@
                         android:id="@+id/workflow_rv"
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
-                        android:scrollbars="horizontal"
-                        android:paddingHorizontal="@dimen/common_spacing" />
+                        android:paddingHorizontal="@dimen/common_spacing"
+                        android:scrollbars="horizontal" />
                 </FrameLayout>
             </LinearLayout>
 
@@ -331,14 +330,16 @@
                     android:orientation="horizontal">
 
                     <LinearLayout
-                        android:layout_width="wrap_content"
+                        android:layout_width="0dp"
                         android:layout_height="match_parent"
+                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:orientation="vertical">
 
                         <TextView
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
+                            android:layout_gravity="center"
                             android:gravity="center"
                             android:paddingHorizontal="@dimen/common_spacing_2x"
                             android:paddingVertical="@dimen/common_spacing"
@@ -351,33 +352,17 @@
                             android:layout_height="@dimen/divider_line_space"
                             android:background="@color/black" />
 
-                        <LinearLayout
-                            android:layout_width="match_parent"
+
+                        <androidx.recyclerview.widget.RecyclerView
+                            android:id="@+id/locker_rv"
+                            android:layout_width="wrap_content"
                             android:layout_height="match_parent"
-                            android:gravity="center"
-                            android:orientation="vertical"
-                            android:paddingBottom="@dimen/common_spacing">
-
-                            <ImageView
-                                android:id="@+id/locker_iv"
-                                android:layout_width="@dimen/icon_member_size"
-                                android:layout_height="@dimen/icon_member_size"
-                                android:layout_marginTop="@dimen/common_spacing"
-                                android:src="@mipmap/icon_selected_member" />
-
-                            <TextView
-                                android:id="@+id/locker_name"
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:gravity="center"
-                                android:textColor="@color/black"
-                                android:textSize="@dimen/common_btn_text_size" />
-                        </LinearLayout>
+                            android:layout_gravity="center" />
                     </LinearLayout>
 
                     <LinearLayout
                         android:id="@+id/select_colocker_layout"
-                        android:layout_width="match_parent"
+                        android:layout_width="0dp"
                         android:layout_height="match_parent"
                         android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
@@ -391,6 +376,7 @@
                             android:paddingVertical="@dimen/common_spacing"
                             android:text="@string/colocker"
                             android:textColor="@color/black"
+                            android:layout_gravity="center"
                             android:textSize="@dimen/normal_text_size_18" />
 
                         <View

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

@@ -123,7 +123,7 @@
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/locker_rv"
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content" />
+                        android:layout_height="match_parent" />
                 </LinearLayout>
 
 

+ 43 - 36
app/src/main/res/layout/item_locker_group.xml

@@ -1,50 +1,57 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <LinearLayout
+    <FrameLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/common_spacing"
-        android:layout_marginHorizontal="@dimen/common_spacing"
-        android:background="@drawable/home_card_bg"
-        android:gravity="center_vertical"
-        android:minWidth="@dimen/item_locker_group_min_width"
-        android:orientation="vertical">
+        android:layout_height="match_parent"
+        android:padding="@dimen/common_spacing">
 
         <LinearLayout
-            android:id="@+id/group_title_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:background="@drawable/bg_item_group_title_layout"
+            android:layout_gravity="center_vertical"
+            android:background="@drawable/home_card_bg"
             android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:paddingVertical="@dimen/common_spacing_small">
+            android:minWidth="@dimen/item_locker_group_min_width"
+            android:orientation="vertical">
 
-            <TextView
-                android:id="@+id/group_name"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@drawable/bg_group_name_input_selector"
-                android:enabled="false"
-                android:focusable="false"
-                android:focusableInTouchMode="false"
-                android:gravity="center"
-                android:paddingHorizontal="@dimen/common_spacing"
-                android:text="@string/selected_point_info_title"
-                android:textColor="@color/text_color_item_group_title_text"
-                android:textSize="@dimen/normal_text_size_18" />
+            <LinearLayout
+                android:id="@+id/group_title_layout"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:background="@drawable/bg_item_group_title_layout"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:paddingVertical="@dimen/common_spacing_small">
 
-        </LinearLayout>
+                <TextView
+                    android:id="@+id/group_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:background="@drawable/bg_group_name_input_selector"
+                    android:enabled="false"
+                    android:focusable="false"
+                    android:focusableInTouchMode="false"
+                    android:gravity="center"
+                    android:paddingHorizontal="@dimen/common_spacing"
+                    android:text="@string/selected_point_info_title"
+                    android:textColor="@color/text_color_item_group_title_text"
+                    android:textSize="@dimen/normal_text_size_18" />
 
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/divider_line_space"
-            android:background="@color/black" />
+            </LinearLayout>
 
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/group_locker_rv"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingBottom="@dimen/common_spacing" />
-    </LinearLayout>
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/divider_line_space"
+                android:background="@color/black" />
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/group_locker_rv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:minHeight="@dimen/locker_item_min_height"
+                android:paddingBottom="@dimen/common_spacing" />
+        </LinearLayout>
+    </FrameLayout>
 </layout>

+ 26 - 0
app/src/main/res/layout/item_select_colocker_member.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/common_spacing"
+        android:layout_marginTop="@dimen/common_spacing"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/locker_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/icon_select_member" />
+
+        <TextView
+            android:id="@+id/locker_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textColor="@color/black"
+            android:textSize="@dimen/common_btn_text_size" />
+    </LinearLayout>
+</layout>

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

@@ -11,8 +11,8 @@
 
         <ImageView
             android:id="@+id/locker_icon"
-            android:layout_width="@dimen/icon_member_size"
-            android:layout_height="@dimen/icon_member_size"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
             android:src="@drawable/icon_select_member" />
 
         <TextView

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

@@ -470,5 +470,7 @@
     <string name="edit">Edit</string>
     <string name="group_name_already_exists">Group name already exists</string>
     <string name="point_manage_point_group">Group name</string>
+    <string name="please_select_group">Please select group</string>
+    <string name="group_name_must_not_empty">Group name must not empty</string>
 
 </resources>

+ 1 - 0
app/src/main/res/values-land/dimens.xml

@@ -105,4 +105,5 @@
     <dimen name="selected_point_info_layout_width">400dp</dimen>
     <dimen name="common_rv_min_height">200dp</dimen>
     <dimen name="item_locker_group_min_width">100dp</dimen>
+    <dimen name="locker_item_min_height">50dp</dimen>
 </resources>

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

@@ -470,5 +470,7 @@
     <string name="edit">编辑</string>
     <string name="group_name_already_exists">分组名称已存在</string>
     <string name="point_manage_point_group">分组名称</string>
+    <string name="please_select_group">请选择分组</string>
+    <string name="group_name_must_not_empty">分组名称不能为空</string>
 
 </resources>

+ 1 - 0
app/src/main/res/values/dimens.xml

@@ -105,4 +105,5 @@
     <dimen name="selected_point_info_layout_width">400dp</dimen>
     <dimen name="common_rv_min_height">200dp</dimen>
     <dimen name="item_locker_group_min_width">100dp</dimen>
+    <dimen name="locker_item_min_height">50dp</dimen>
 </resources>

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

@@ -473,5 +473,7 @@
     <string name="edit">编辑</string>
     <string name="group_name_already_exists">分组名称已存在</string>
     <string name="point_manage_point_group">分组名称</string>
+    <string name="please_select_group">请选择分组</string>
+    <string name="group_name_must_not_empty">分组名称不能为空</string>
 
 </resources>

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

@@ -73,14 +73,14 @@ interface IsSopDao {
         null as pointStatus,
         iip.power_type as powerType,
         isp.group_id as groupId,
-        ijtg.group_name as groupName
+        isg.group_name as groupName
         from is_sop_points isp
         left join  is_isolation_point iip on isp.point_id = iip.point_id
         left join is_rfid_token irt on iip.rfid_id = irt.rfid_id
         left join is_workstation iw on iip.workstation_id=iw.workstation_id
-        left join is_job_ticket_group ijtg on ijtg.id = isp.group_id
+        left join is_sop_group isg on isg.id = isp.group_id
         where isp.del_flag = 0
-        and sop_id = :sopId
+        and isp.sop_id = :sopId
     """
     )
     fun getSopPointsBySopId(sopId: Long): List<JobPointVo>

+ 22 - 0
data/src/main/java/com/grkj/data/data/Type.kt

@@ -0,0 +1,22 @@
+package com.grkj.data.data
+
+import com.google.gson.reflect.TypeToken
+import com.grkj.data.model.vo.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobUserVo
+/**
+ * 类型
+ */
+object Type {
+    /**
+     * 点位分组类型
+     */
+    val pointGroupType =
+        object : TypeToken<@JvmSuppressWildcards  List<@JvmSuppressWildcards  JobTicketGroupDataVo<@JvmSuppressWildcards JobPointVo>>>() {}.type
+
+    /**
+     * 上锁人分组类型
+     */
+    val lockerGroupType =
+        object : TypeToken<@JvmSuppressWildcards  List<@JvmSuppressWildcards  JobTicketGroupDataVo<@JvmSuppressWildcards JobUserVo>>>() {}.type
+}

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

@@ -8,5 +8,5 @@ import com.grkj.data.model.dos.IsJobTicketPoints
 class IsJobTicketPointsDataVo : IsJobTicketPoints() {
     var pointName: String? = ""
     var pointFunction: String? = ""
-    var groupName: String = ""
+    var groupName: String? = ""
 }

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

@@ -13,7 +13,7 @@ class JobPointVo {
     var rfidToken: String? = ""
     var rfidId: Long? = 0
     var groupId: Long = 0
-    var groupName: String = ""
+    var groupName: String? = ""
     var workstationId: Long? = 0
     var powerType: String? = ""
     var pointStatus: String? = null
@@ -23,4 +23,9 @@ class JobPointVo {
 
     @Ignore
     var isSelected: Boolean = false
+
+    override fun toString(): String {
+        return "JobPointVo(pointId=$pointId, pointName=$pointName, pointFunction=$pointFunction, workstationName=$workstationName, rfidToken=$rfidToken, rfidId=$rfidId, groupId=$groupId, groupName='$groupName', workstationId=$workstationId, powerType=$powerType, pointStatus=$pointStatus, lockId=$lockId, isSelected=$isSelected)"
+    }
+
 }

+ 11 - 8
data/src/main/java/com/grkj/data/model/vo/JobTicketGroupDataVo.kt

@@ -1,16 +1,19 @@
 package com.grkj.data.model.vo
 
 /**
- * 作业分组数据
+ * 分组数据
  */
-data class JobTicketGroupDataVo(
+data class JobTicketGroupDataVo<T>(
     /**
-     * 分组id 临时的,不参与持久化
+     * 分组信息
      */
-    var groupId: Long = System.currentTimeMillis(),
-
+    val jobTicketGroupInfo: JobTicketGroupInfoVo,
     /**
-     * 分组名称
+     * 分组成员
      */
-    var groupName: String = ""
-)
+    val jobTicketGroupMemberList: MutableList<@JvmSuppressWildcards T>
+) {
+    override fun toString(): String {
+        return "JobTicketGroupDataVo(jobTicketGroupInfo=$jobTicketGroupInfo, jobTicketGroupMemberList=$jobTicketGroupMemberList)"
+    }
+}

+ 16 - 0
data/src/main/java/com/grkj/data/model/vo/JobTicketGroupInfoVo.kt

@@ -0,0 +1,16 @@
+package com.grkj.data.model.vo
+
+/**
+ * 作业分组数据
+ */
+data class JobTicketGroupInfoVo(
+    /**
+     * 分组id 临时的,不参与持久化
+     */
+    var groupId: Long = System.currentTimeMillis(),
+
+    /**
+     * 分组名称
+     */
+    var groupName: String? = ""
+)

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

@@ -10,7 +10,7 @@ class JobUserVo {
     var nickName: String = ""
     var userName: String = ""
     var groupId: Long = 0
-    var groupName: String = ""
+    var groupName: String? = ""
     var avatar: String? = null
     var cardCodes: List<String?> = listOf()
     var roleIds: List<Long?> = listOf()

+ 9 - 9
data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt

@@ -26,8 +26,8 @@ interface IJobTicketRepository {
      * 创建作业
      */
     fun createJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -39,8 +39,8 @@ interface IJobTicketRepository {
      * 保存作业
      */
     fun saveJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -134,7 +134,7 @@ interface IJobTicketRepository {
      */
     fun updateClockerAndColockerData(
         ticketId: Long,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>
     )
 
@@ -256,8 +256,8 @@ interface IJobTicketRepository {
      * 创建上锁作业
      */
     fun createLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,
@@ -268,8 +268,8 @@ interface IJobTicketRepository {
      * 创建解锁作业
      */
     fun createUnLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,

+ 2 - 2
data/src/main/java/com/grkj/data/repository/ISopRepository.kt

@@ -19,7 +19,7 @@ interface ISopRepository {
      * 保存sop点位
      */
     fun saveSopPoint(
-        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedSopPint: List<JobTicketGroupDataVo<JobPointVo>>,
         sopId: Long
     )
 
@@ -27,7 +27,7 @@ interface ISopRepository {
      * 保存sop人员
      */
     fun saveSopUser(
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     )

+ 9 - 9
data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepository.kt

@@ -28,8 +28,8 @@ import javax.inject.Singleton
 @Singleton
 class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJobTicketRepository{
     override fun createJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -40,8 +40,8 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
     }
 
     override fun saveJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -124,7 +124,7 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
 
     override fun updateClockerAndColockerData(
         ticketId: Long,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>
     ) {
         TODO("Not yet implemented")
@@ -245,8 +245,8 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
     }
 
     override fun createLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,
@@ -256,8 +256,8 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
     }
 
     override fun createUnLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,

+ 2 - 2
data/src/main/java/com/grkj/data/repository/impl/network/NetworkSopRepository.kt

@@ -33,14 +33,14 @@ class NetworkSopRepository @Inject constructor()  : BaseRepository(), ISopReposi
     }
 
     override fun saveSopPoint(
-        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedSopPint: List<JobTicketGroupDataVo<JobPointVo>>,
         sopId: Long
     ) {
         TODO("Not yet implemented")
     }
 
     override fun saveSopUser(
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     ) {

+ 27 - 26
data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt

@@ -52,8 +52,8 @@ class JobTicketRepository @Inject constructor(
     val exceptionDao: ExceptionDao
 ) : BaseRepository(), IJobTicketRepository {
     override fun createJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -70,12 +70,12 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.groupName = it.first.groupName
+            isJobTicketGroup.groupName = it.jobTicketGroupInfo.groupName?:""
             val groupId = jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
-            selectedLockerData.find { lockerGroup -> lockerGroup.first.groupId == it.first.groupId }?.second?.forEach { locker ->
+            selectedLockerData.find { lockerGroup -> lockerGroup.jobTicketGroupInfo.groupId == it.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList?.forEach { locker ->
                 locker.groupId = groupId
             }
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
                 isJobTicketPoint.pointId = it.pointId
@@ -88,7 +88,7 @@ class JobTicketRepository @Inject constructor(
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints.flatten())
         val ticketLockerUsers = selectedLockerData.map {
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobticketUser = IsJobTicketUser()
                 isJobticketUser.userId = it.userId
                 isJobticketUser.ticketId = ticketId
@@ -138,8 +138,8 @@ class JobTicketRepository @Inject constructor(
     }
 
     override fun saveJob(
-        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -164,13 +164,13 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.id = it.first.groupId
-            isJobTicketGroup.groupName = it.first.groupName
+            isJobTicketGroup.id = it.jobTicketGroupInfo.groupId
+            isJobTicketGroup.groupName = it.jobTicketGroupInfo.groupName?:""
             val groupId = jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
-            selectedLockerData.find { lockerGroup -> it.first.groupId == lockerGroup.first.groupId }?.second?.forEach {
+            selectedLockerData.find { lockerGroup -> it.jobTicketGroupInfo.groupId == lockerGroup.jobTicketGroupInfo.groupId }?.jobTicketGroupMemberList?.forEach {
                 it.groupId = groupId
             }
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
                 isJobTicketPoint.pointId = it.pointId
@@ -183,7 +183,7 @@ class JobTicketRepository @Inject constructor(
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints.flatten())
         val ticketLockerUsers = selectedLockerData.map {
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobticketUser = IsJobTicketUser()
                 isJobticketUser.userId = it.userId
                 isJobticketUser.ticketId = ticketId
@@ -333,6 +333,7 @@ class JobTicketRepository @Inject constructor(
         jobTicketDao.deleteJobTicketPointsByTicketIds(ticketIds)
         jobTicketDao.deleteJobTicketStepByTicketIds(ticketIds)
         jobTicketDao.deleteJobTicketUserByTicketIds(ticketIds)
+        jobTicketDao.deleteJobTicketGroupByTicketIds(ticketIds)
     }
 
     override fun getJobDataPage(
@@ -406,16 +407,16 @@ class JobTicketRepository @Inject constructor(
 
     override fun updateClockerAndColockerData(
         ticketId: Long,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>
     ) {
         val existsUsers = jobTicketDao.getJobTicketUserDataByTicketId(ticketId)
         jobTicketDao.deleteJobTicketUserByUserIds(existsUsers.filter {
-            it.userId !in (selectedLockerData.map { it.second }
+            it.userId !in (selectedLockerData.map { it.jobTicketGroupMemberList }
                 .flatten() + selectedColockerData).map { it.userId }
         }
             .map { it.userId })
-        val newLockUser = selectedLockerData.map { it.second }.flatten()
+        val newLockUser = selectedLockerData.map { it.jobTicketGroupMemberList }.flatten()
             .filter { it.userId !in existsUsers.map { it.userId } }
         val newCoLockUser =
             selectedColockerData.filter { it.userId !in existsUsers.map { it.userId } }
@@ -710,8 +711,8 @@ class JobTicketRepository @Inject constructor(
     }
 
     override fun createLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,
@@ -728,10 +729,10 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.groupName = it.first
+            isJobTicketGroup.groupName = it.jobTicketGroupInfo.groupName?:""
             isJobTicketGroup
             jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
                 isJobTicketPoint.pointId = it.pointId
@@ -743,7 +744,7 @@ class JobTicketRepository @Inject constructor(
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints.flatten())
         val ticketLockerUsers = selectedLockerData.map {
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobticketUser = IsJobTicketUser()
                 isJobticketUser.userId = it.userId
                 isJobticketUser.ticketId = ticketId
@@ -789,8 +790,8 @@ class JobTicketRepository @Inject constructor(
     }
 
     override fun createUnLockJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<JobTicketGroupDataVo<JobPointVo>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long?,
         workstationId: Long,
@@ -807,10 +808,10 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.groupName = it.first
+            isJobTicketGroup.groupName = it.jobTicketGroupInfo.groupName?:""
             isJobTicketGroup
             jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
                 isJobTicketPoint.pointId = it.pointId
@@ -822,7 +823,7 @@ class JobTicketRepository @Inject constructor(
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints.flatten())
         val ticketLockerUsers = selectedLockerData.map {
-            it.second.map {
+            it.jobTicketGroupMemberList.map {
                 val isJobticketUser = IsJobTicketUser()
                 isJobticketUser.userId = it.userId
                 isJobticketUser.ticketId = ticketId

+ 5 - 4
data/src/main/java/com/grkj/data/repository/impl/standard/SopRepository.kt

@@ -36,11 +36,11 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao) : BaseRepository
     }
 
     override fun saveSopPoint(
-        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedSopPint: List<JobTicketGroupDataVo<JobPointVo>>,
         sopId: Long
     ) {
         val isSopPoints = selectedSopPint.map {
-            it.second.map { pointVo ->
+            it.jobTicketGroupMemberList.map { pointVo ->
                 val isSopPoint = IsSopPoints()
                 isSopPoint.sopId = sopId
                 isSopPoint.pointId = pointVo.pointId
@@ -60,12 +60,12 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao) : BaseRepository
     }
 
     override fun saveSopUser(
-        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
+        selectedLockerData: List<JobTicketGroupDataVo<JobUserVo>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     ) {
         val isSopLockerUsers = selectedLockerData.map {
-            it.second.map { userVo ->
+            it.jobTicketGroupMemberList.map { userVo ->
                 val isSopUser = IsSopUser()
                 isSopUser.userId = userVo.userId
                 isSopUser.userName = userVo.userName
@@ -103,6 +103,7 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao) : BaseRepository
         isSopDao.deleteSopBySopId(sopIds)
         isSopDao.deleteSopPointsBySopId(sopIds)
         isSopDao.deleteSopUsersBySopId(sopIds)
+        isSopDao.deleteSopGroupBySopId(sopIds)
     }
 
     override fun getSopDataPage(current: Int, size: Int): List<SopManageVo> {

+ 1 - 1
gradle/libs.versions.toml

@@ -11,7 +11,7 @@ material = "1.10.0"
 activity = "1.8.0"
 constraintlayout = "2.1.4"
 jetbrainsKotlinJvm = "2.0.21"
-sikextension = "1.1.50"
+sikextension = "1.1.57"
 sikcamera = "1.0.11"
 sikcronjob = "1.0.3"
 sikfontmanager = "1.0.2"

+ 16 - 0
shared/src/main/java/com/grkj/shared/utils/extension/Data.kt

@@ -0,0 +1,16 @@
+package com.grkj.shared.utils.extension
+
+import com.google.gson.reflect.TypeToken
+import com.sik.sikcore.data.GlobalDataTempStore
+
+/**
+ * 获取复杂数据
+ */
+inline fun <reified T> GlobalDataTempStore.getComplexData(
+    key: String,
+    isDeleteAfterGet: Boolean = true
+): T? {
+    val type = object : TypeToken<T>() {}.type
+    val json = this.nativeGetData(key, isDeleteAfterGet)
+    return gson.fromJson(json, type)
+}

+ 3 - 5
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

@@ -5,17 +5,15 @@ import android.bluetooth.BluetoothGatt
 import com.clj.fastble.BleManager
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
+import com.grkj.shared.utils.extension.startsWith
+import com.grkj.shared.utils.extension.toHexStrings
 import com.grkj.ui_base.R
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.LoadingEvent
-import com.grkj.shared.utils.extension.startsWith
-import com.grkj.shared.utils.extension.toHexStrings
 import com.grkj.ui_base.utils.modbus.ModBusController
-import com.kongzue.dialogx.dialogs.PopTip
-import com.sik.sikcore.activity.ActivityTracker
+import com.sik.sikandroid.activity.ActivityTracker
 import com.sik.sikcore.bluetooth.BLEScanner
-import com.sik.sikcore.bluetooth.BluetoothManager
 import com.sik.sikcore.bluetooth.IBluetoothScanCallback
 import com.sik.sikcore.thread.ThreadUtils
 import kotlinx.coroutines.Dispatchers