Sfoglia il codice sorgente

refactor(更新)
- 点位分组新增以及界面修改

周文健 10 mesi fa
parent
commit
db78212d85
35 ha cambiato i file con 431 aggiunte e 221 eliminazioni
  1. 63 34
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt
  2. 30 48
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt
  3. 11 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  4. 11 5
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  5. 4 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  6. 15 9
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  7. 14 7
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  8. 4 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  9. 2 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  10. 13 8
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectMemberViewModel.kt
  11. 4 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectPointViewModel.kt
  12. 2 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  13. 7 6
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  14. 7 7
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  15. 17 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  16. 12 23
      app/src/main/res/layout-land/fragment_select_memeber.xml
  17. 49 0
      app/src/main/res/layout-land/item_locker_group.xml
  18. 1 1
      app/src/main/res/layout-land/item_point_group_show.xml
  19. 9 20
      app/src/main/res/layout/fragment_select_memeber.xml
  20. 50 0
      app/src/main/res/layout/item_locker_group.xml
  21. 1 1
      app/src/main/res/layout/item_point_group_show.xml
  22. 1 1
      app/src/main/res/values-en/strings.xml
  23. 1 0
      app/src/main/res/values-land/dimens.xml
  24. 1 1
      app/src/main/res/values-zh/strings.xml
  25. 1 0
      app/src/main/res/values/dimens.xml
  26. 1 1
      app/src/main/res/values/strings.xml
  27. 6 0
      data/src/main/java/com/grkj/data/dao/IsSopDao.kt
  28. 6 0
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  29. 16 0
      data/src/main/java/com/grkj/data/model/vo/JobTicketGroupDataVo.kt
  30. 5 4
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  31. 17 4
      data/src/main/java/com/grkj/data/repository/ISopRepository.kt
  32. 5 6
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepository.kt
  33. 12 4
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkSopRepository.kt
  34. 21 8
      data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt
  35. 12 7
      data/src/main/java/com/grkj/data/repository/impl/standard/SopRepository.kt

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

@@ -10,13 +10,15 @@ import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.grkj.data.enums.JobTicketStatusEnum
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 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.JobTicketGroupDataVo
+import com.grkj.data.model.vo.JobUserVo
+import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.features.main.viewmodel.common.SelectMemberViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.CommonUtils
@@ -35,8 +37,9 @@ import kotlin.getValue
 @AndroidEntryPoint
 class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
     private val viewModel: SelectMemberViewModel by viewModels()
-    private var selectedLockerData: MutableList<UserManageVo> = mutableListOf()
-    private var selectedColockerData: MutableList<UserManageVo> = mutableListOf()
+    private var selectedLockerData: MutableList<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> =
+        mutableListOf()
+    private var selectedColockerData: MutableList<JobUserVo> = mutableListOf()
     private var isLockerSelect = true
     private var canSelectColoker = true
     private var ticketId: Long? = null
@@ -79,35 +82,33 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             navController.popBackStack()
         }
         binding.lockerRv.linear(LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>(R.layout.item_locker_group)
             onBind {
-                onLockerRVBinding(this)
+                onGroupLockerRVBinding(this)
             }
         }
         binding.colockerRv.linear(LinearLayout.HORIZONTAL).setup {
-            addType<UserManageVo>(R.layout.item_select_member)
+            addType<JobUserVo>(R.layout.item_select_member)
             onBind {
                 onColockerRVBinding(this)
             }
         }
         binding.allUserRv.grid(6).setup {
-            addType<UserManageVo>(R.layout.item_select_all_member)
+            addType<JobUserVo>(R.layout.item_select_all_member)
             onBind {
                 onAllUserRVBinding(this)
             }
         }
         binding.selectColockerLayout.isVisible = canSelectColoker
-        binding.selectLockerTv.setDebouncedClickListener {
-            setLockerData()
-        }
         binding.selectColockerTv.setDebouncedClickListener {
+            binding.lockerRv.adapter?.notifyDataSetChanged()
             setColockerData()
         }
     }
 
     private fun BindingAdapter.BindingViewHolder.onAllUserRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemSelectAllMemberBinding>()
-        val item = holder.getModel<UserManageVo>()
+        val item = holder.getModel<JobUserVo>()
         itemBinding.lockerName.text = item.nickName
         itemBinding.lockerIcon.isSelected = item.isSelected
         (item.avatar
@@ -122,16 +123,9 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                 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
-                } else if (selectedLockerData.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
                 }
                 item.isSelected = false
-                if (isLockerSelect) {
-                    selectedLockerData.removeIf { it.userId == item.userId }
-                } else {
-                    selectedColockerData.removeIf { it.userId == item.userId }
-                }
+                selectedColockerData.removeIf { it.userId == item.userId }
             } else {
                 item.isSelected = true
                 if ((item.avatar
@@ -140,10 +134,14 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                     PopTip.build().tip(R.string.current_user_has_not_face_data)
                 }
                 if (isLockerSelect) {
-                    viewModel.userData.filter { it.userId in selectedLockerData.map { it.userId } }
-                        .forEach { it.isSelected = false }
-                    selectedLockerData.clear()
-                    selectedLockerData.add(item)
+                    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(
+                        item
+                    )
                 } else {
                     selectedColockerData.add(item)
                 }
@@ -157,9 +155,38 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         }
     }
 
-    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(holder: BindingAdapter.BindingViewHolder) {
+    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
+        itemBinding.groupTitleLayout.setDebouncedClickListener {
+            isLockerSelect = true
+            itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
+            itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
+            viewModel.currentSelectGroup = item.first
+            binding.allUserRv.models =
+                viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
+                    .filter { it.isSelected == false }
+            adapter.notifyDataSetChanged()
+        }
+        itemBinding.groupTitleLayout.isSelected =
+            isLockerSelect && item.first.groupId == viewModel.currentSelectGroup?.groupId
+        itemBinding.groupName.isSelected =
+            isLockerSelect && item.first.groupId == viewModel.currentSelectGroup?.groupId
+        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+            addType<JobUserVo>(R.layout.item_select_member)
+            onBind {
+                onLockerRVBinding(item.first, this)
+            }
+        }
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onLockerRVBinding(
+        groupData: JobTicketGroupDataVo,
+        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
@@ -170,11 +197,11 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             }
         } ?: itemBinding.lockerIcon.setImageResource(R.drawable.icon_select_member)
         itemBinding.root.setOnClickListener {
-            if (selectedLockerData.size == 1 && viewModel.jobTicketData != null && viewModel.jobTicketData?.ticketStatus != JobTicketStatusEnum.SELECT_MEMBER.status) {
+            if (selectedLockerData.find { it.first.groupId == groupData.groupId }?.second?.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
             }
-            selectedLockerData.removeIf { it.userId == item.userId }
+            selectedLockerData.find { it.first.groupId == groupData.groupId }?.second?.clear()
             viewModel.userData.find { it.userId == item.userId }?.isSelected = false
             adapter.notifyDataSetChanged()
             binding.allUserRv.adapter?.notifyDataSetChanged()
@@ -183,7 +210,7 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onColockerRVBinding(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
@@ -207,15 +234,16 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
 
     private fun setLockerData() {
         isLockerSelect = true
-        binding.selectMemberTip.text = CommonUtils.getStr(R.string.select_locker_tip)
+        binding.selectMemberTip.text =
+            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.userId }
+                    it.isSelected = it.userId in selectedLockerData.map { it.second }.flatten()
+                        .map { it.userId }
                 }
-                sortedBy { it.isSelected }
-            }
+            }.filter { it.isSelected == false }
     }
 
     private fun setColockerData() {
@@ -242,7 +270,8 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                 GlobalDataTempStore.getInstance()
                     .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
             if (tempSelectedLockerData is List<*>) {
-                selectedLockerData = (tempSelectedLockerData as List<UserManageVo>).toMutableList()
+                selectedLockerData =
+                    (tempSelectedLockerData as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>).toMutableList()
                 binding.lockerRv.models = selectedLockerData
             }
         }
@@ -254,7 +283,7 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
                     .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
             if (tempSelectedColockerData is List<*>) {
                 selectedColockerData =
-                    (tempSelectedColockerData as List<UserManageVo>).toMutableList()
+                    (tempSelectedColockerData as List<JobUserVo>).toMutableList()
                 binding.colockerRv.models = selectedColockerData
             }
         }

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

@@ -1,8 +1,6 @@
 package com.grkj.iscs.features.main.fragment.common
 
 import android.content.Context
-import android.view.View
-import android.view.View.OnFocusChangeListener
 import android.view.inputmethod.InputMethodManager
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
@@ -13,6 +11,7 @@ import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.grkj.data.model.vo.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentSelectPointBinding
@@ -20,7 +19,6 @@ 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 dagger.hilt.android.AndroidEntryPoint
@@ -58,9 +56,11 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         }
         binding.addGroup.setDebouncedClickListener {
             viewModel.selectedPointData.add(
-                getString(
-                    R.string.new_group,
-                    viewModel.selectedPointData.size
+                JobTicketGroupDataVo(
+                    groupName = getString(
+                        R.string.new_group,
+                        viewModel.selectedPointData.size
+                    )
                 ) to mutableListOf()
             )
             binding.pointGroupRv.adapter?.notifyDataSetChanged()
@@ -72,7 +72,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 linear(LinearLayout.HORIZONTAL)
             }
         }.setup {
-            addType<Pair<String, List<JobPointVo>>>(R.layout.item_point_group)
+            addType<Pair<JobTicketGroupDataVo, List<JobPointVo>>>(R.layout.item_point_group)
             onBind {
                 onPointGroupRVBinding(this)
             }
@@ -81,18 +81,19 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupBinding>()
-        val item = holder.getModel<Pair<String, List<JobPointVo>>>()
+        val item = holder.getModel<Pair<JobTicketGroupDataVo, List<JobPointVo>>>()
         itemBinding.groupTitleLayout.setDebouncedClickListener {
             itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
             itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
             itemBinding.deleteGroup.isSelected = itemBinding.groupTitleLayout.isSelected
-            viewModel.currentSelectGroup = item.first
+            viewModel.currentSelectGroupId = item.first.groupId
             adapter.notifyDataSetChanged()
         }
-        itemBinding.groupTitleLayout.isSelected = item.first == viewModel.currentSelectGroup
-        itemBinding.groupName.isSelected = item.first == viewModel.currentSelectGroup
-        itemBinding.deleteGroup.isSelected = item.first == viewModel.currentSelectGroup
-        itemBinding.groupName.setText(item.first)
+        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)
         itemBinding.deleteGroup.isVisible = viewModel.selectedPointData.size > 1
         itemBinding.deleteGroup.setDebouncedClickListener {
             item.second.forEach { selectedPoint ->
@@ -106,7 +107,6 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         }
         itemBinding.editOrSave.setDebouncedClickListener {
             if (itemBinding.editOrSave.text == getString(R.string.edit)) {
-                itemBinding.editOrSave.tag = itemBinding.groupName.text.toString()
                 itemBinding.groupName.isEnabled = true
                 itemBinding.groupName.isFocusable = true
                 itemBinding.groupName.isFocusableInTouchMode = true
@@ -117,34 +117,15 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 imm.showSoftInput(itemBinding.groupName, InputMethodManager.SHOW_IMPLICIT)
                 itemBinding.editOrSave.text = getString(R.string.save)
             } else {
-                if (itemBinding.groupName.text != itemBinding.editOrSave.tag && viewModel.selectedPointData.find { it.first == itemBinding.groupName.text.toString() } == null) {
-                    itemBinding.groupName.isFocusable = false
-                    itemBinding.groupName.isEnabled = false
-                    itemBinding.groupName.isFocusableInTouchMode = false
-                    // 关闭软键盘
-                    val imm =
-                        requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-                    imm.hideSoftInputFromWindow(itemBinding.groupName.windowToken, 0)
-                    val oldGroupName = itemBinding.editOrSave.tag
-                    val groupData =
-                        viewModel.selectedPointData.find { it.first == oldGroupName }?.second
-                            ?: mutableListOf()
-                    viewModel.selectedPointData.removeIf { it.first == oldGroupName }
-                    if (viewModel.currentSelectGroup == oldGroupName) {
-                        viewModel.currentSelectGroup = itemBinding.groupName.text.toString()
-                    }
-                    viewModel.selectedPointData.add(itemBinding.groupName.text.toString() to groupData)
-                    itemBinding.editOrSave.text = getString(R.string.edit)
-                } else if (viewModel.selectedPointData.find { it.first == itemBinding.groupName.text.toString() } != null) {
-                    showToast(CommonUtils.getStr(R.string.group_name_already_exists).toString())
-                } else if (itemBinding.groupName.text == itemBinding.editOrSave.tag) {
-                    itemBinding.groupName.isFocusable = false
-                    itemBinding.groupName.isFocusableInTouchMode = false
-                    // 关闭软键盘
-                    val imm =
-                        requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-                    imm.hideSoftInputFromWindow(itemBinding.groupName.windowToken, 0)
-                }
+                itemBinding.groupName.isFocusable = false
+                itemBinding.groupName.isEnabled = false
+                itemBinding.groupName.isFocusableInTouchMode = false
+                // 关闭软键盘
+                val imm =
+                    requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+                imm.hideSoftInputFromWindow(itemBinding.groupName.windowToken, 0)
+                item.first.groupName = itemBinding.groupName.text.toString()
+                itemBinding.editOrSave.text = getString(R.string.edit)
 
                 adapter?.notifyDataSetChanged()
             }
@@ -158,7 +139,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
     }
 
     private fun BindingAdapter.BindingViewHolder.onSelectedPointRVBinding(
-        groupName: String,
+        groupData: JobTicketGroupDataVo,
         holder: BindingAdapter.BindingViewHolder
     ) {
         val itemBinding = holder.getBinding<ItemSelectPointBinding>()
@@ -167,7 +148,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         itemBinding.pointIcon.isSelected = false
         itemBinding.root.setDebouncedClickListener {
             if (item.isSelected) {
-                viewModel.selectedPointData.find { it.first == groupName }?.second?.removeIf { it.pointId == item.pointId }
+                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 }
@@ -183,7 +164,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
         itemBinding.pointIcon.isSelected = item.isSelected
         itemBinding.root.setDebouncedClickListener {
             item.isSelected = true
-            viewModel.selectedPointData.find { it.first == viewModel.currentSelectGroup }?.second?.add(
+            viewModel.selectedPointData.find { it.first.groupId == viewModel.currentSelectGroupId }?.second?.add(
                 item
             )
             binding.unselectedPointRv.models =
@@ -201,15 +182,16 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
             GlobalDataTempStore.getInstance().getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
         if (tempSelectedPointData is List<*>) {
             viewModel.selectedPointData =
-                tempSelectedPointData.filterIsInstance<Pair<String, MutableList<JobPointVo>>>()
+                tempSelectedPointData.filterIsInstance<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>()
                     .toMutableList()
         }
         if (viewModel.selectedPointData.isEmpty()) {
             val emptyOriginGroupName = getString(R.string.selected_point_info_title)
+            val jobTicketGroupVo = JobTicketGroupDataVo(groupName = emptyOriginGroupName)
             viewModel.selectedPointData.add(
-                emptyOriginGroupName to mutableListOf()
+                jobTicketGroupVo to mutableListOf()
             )
-            viewModel.currentSelectGroup = emptyOriginGroupName
+            viewModel.currentSelectGroupId = jobTicketGroupVo.groupId
         }
         val previewStepTitle = GlobalDataTempStore.getInstance()
             .getData(DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA) as String

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

@@ -13,6 +13,7 @@ import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
@@ -46,8 +47,8 @@ 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<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_job
@@ -507,7 +508,7 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
@@ -523,9 +524,15 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobPointVo>>> }
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> }
                 ?: 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())
+            }
+        }
         binding.noSelectedMemberLayout.isVisible =
             selectedColockerData.isEmpty() && selectedLockerData.isEmpty()
         binding.noSelectedPointLayout.isVisible = selectedPointData.isEmpty()

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

@@ -11,6 +11,7 @@ import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
@@ -41,8 +42,8 @@ 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<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop
@@ -396,7 +397,7 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
@@ -406,13 +407,18 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
                 ?.let { return@let it as List<JobUserVo> } ?: 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<String, MutableList<JobPointVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: 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())
+            }
         }
         binding.noSelectedMemberLayout.isVisible =
             selectedColockerData.isEmpty() && selectedLockerData.isEmpty()

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

@@ -11,6 +11,7 @@ import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
@@ -42,8 +43,8 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null
-    private var selectedPointData: List<Pair<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop_job
@@ -356,7 +357,7 @@ class CreateSopJobFragment : BaseFormFragment<FragmentCreateSopJobBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()

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

@@ -11,6 +11,7 @@ import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
@@ -41,8 +42,8 @@ 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<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_job
@@ -382,10 +383,10 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                     viewModel.workflowModes.find { it.modeId == selectedModeId }
                         ?.modeTitle
                 binding.jobNameEt.setText(viewModel.jobTicketData?.ticketName)
-                selectedPointData = viewModel.jobPointsData.groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
-                selectedLockerData = viewModel.jobLockerData.groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                selectedPointData = viewModel.jobPointsData.groupBy { it.groupId to it.groupName }
+                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
+                selectedLockerData = viewModel.jobLockerData.groupBy { it.groupId to it.groupName }
+                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
                 selectedColockerData = viewModel.jobColockerData
                 binding.pointRv.models = viewModel.jobPointsData
                 viewModel.jobLockerData.firstOrNull()?.let {
@@ -409,9 +410,14 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.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())
+            }
         }
-
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
         ) {
@@ -425,7 +431,7 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobPointVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: listOf()
         }
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData

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

@@ -12,6 +12,7 @@ import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
@@ -42,8 +43,8 @@ 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<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop
@@ -335,8 +336,8 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
             .getData(DataTransferConstants.KEY_EDIT_SOP_SOP_ID) as Long
         viewModel.getWorkflowModes().observe(this) {
             viewModel.getSopDataBySopId(sopId).observe(this) {
-                selectedPointData = viewModel.selectedSopPointData.groupBy { it.groupName }
-                    .map { it.key to it.value.toMutableList() }
+                selectedPointData = viewModel.selectedSopPointData.groupBy { it.groupId to it.groupName }
+                    .map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
                 selectedModeId = viewModel.selectedSopData?.modeId
                 selectedWorkstationId = viewModel.selectedSopData?.workstationId
                 binding.workstationTv.text = viewModel.selectedSopData?.workstationName
@@ -347,7 +348,7 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                     it.roleKeys.contains(
                         RoleEnum.JTLOCKER.roleKey
                     )
-                }.groupBy { it.groupName }.map { it.key to it.value.toMutableList() }
+                }.groupBy { it.groupId to it.groupName }.map { JobTicketGroupDataVo(it.key.first,it.key.second) to it.value.toMutableList() }
                 selectedColockerData = viewModel.selectedSopUserData.filter {
                     it.roleKeys.contains(
                         RoleEnum.JTCOLOCKER.roleKey
@@ -374,7 +375,7 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
         }
 
         if (GlobalDataTempStore.getInstance()
@@ -390,7 +391,13 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
         ) {
             selectedPointData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_POINT_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobPointVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> } ?: listOf()
+        }
+        if (selectedPointData.isNotEmpty() && selectedLockerData.size != selectedPointData.size) {
+            selectedLockerData = selectedPointData.map {
+                it.first to (selectedLockerData.find { lockerGroup -> it.first == lockerGroup.first }?.second
+                    ?: mutableListOf())
+            }
         }
         if (selectedColockerData.isNotEmpty()) {
             binding.colockerRv.models = selectedColockerData

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

@@ -11,6 +11,7 @@ import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 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.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
@@ -43,8 +44,8 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null
-    private var selectedPointData: List<Pair<String, MutableList<JobPointVo>>> = mutableListOf()
-    private var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    private var selectedPointData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = mutableListOf()
+    private var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     private var selectedColockerData: List<JobUserVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop_job
@@ -381,7 +382,7 @@ class EditSopJobFragment : BaseFormFragment<FragmentEditSopJobBinding>() {
         ) {
             selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
         }
         if (GlobalDataTempStore.getInstance()
                 .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)

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

@@ -33,6 +33,7 @@ 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
@@ -664,7 +665,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         ) {
             viewModel.selectedLockerData = GlobalDataTempStore.getInstance()
                 .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-                ?.let { return@let it as List<Pair<String, MutableList<JobUserVo>>> } ?: listOf()
+                ?.let { return@let it as List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> } ?: listOf()
             viewModel.checkMemberFinish = true
         }
         if (GlobalDataTempStore.getInstance()

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

@@ -2,15 +2,15 @@ package com.grkj.iscs.features.main.viewmodel.common
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.data.model.dos.IsJobTicketUser
-import com.grkj.data.model.dos.SysUserCharacteristicDo
 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.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.IUserRepository
 import com.grkj.ui_base.base.BaseViewModel
+import com.sik.sikcore.data.BeanUtils
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
 import javax.inject.Inject
@@ -28,19 +28,24 @@ class SelectMemberViewModel @Inject constructor(
     var ticketUsers: List<IsJobTicketUserDataVo> = listOf()
     var jobTicketData: IsJobTicketDataVo? = null
     var userBiometricDataVo: List<SysBiometricDataVo> = mutableListOf()
+    var currentSelectGroup: JobTicketGroupDataVo? = null
 
     /**
      * 用户数据
      */
-    var userData: List<UserManageVo> = mutableListOf()
+    var userData: List<JobUserVo> = mutableListOf()
 
     /**
      * 获取用户数据
      */
     fun getUserData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            userData = userRepository.getAllUserDataWithWorkstation(workstationId)
-            userBiometricDataVo = userRepository.getUserBiometricDataByUserIds(userData.map { it.userId })
+            userData = BeanUtils.copyList(
+                userRepository.getAllUserDataWithWorkstation(workstationId),
+                JobUserVo::class.java
+            )?.filterNotNull() ?: mutableListOf()
+            userBiometricDataVo =
+                userRepository.getUserBiometricDataByUserIds(userData.map { it.userId })
             emit(true)
         }
     }
@@ -60,8 +65,8 @@ class SelectMemberViewModel @Inject constructor(
     /**
      * 获取作业票数据
      */
-    fun getTicketData(ticketId: Long?): LiveData<Boolean>{
-        return liveData(Dispatchers.IO){
+    fun getTicketData(ticketId: Long?): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
             ticketId?.let {
                 jobTicketData = jobTicketRepository.getJobTicketDataByTicketId(ticketId)
             }

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

@@ -3,6 +3,7 @@ package com.grkj.iscs.features.main.viewmodel.common
 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.repository.IIsolationPointRepository
 import com.grkj.ui_base.base.BaseViewModel
 import com.sik.sikcore.data.BeanUtils
@@ -19,8 +20,9 @@ class SelectPointViewModel @Inject constructor(val pointRepository: IIsolationPo
     var pointManageData: MutableList<JobPointVo> = mutableListOf()
     var workstationId: Long = 0
     var unlockFirst: Boolean = false
-    var selectedPointData: MutableList<Pair<String, MutableList<JobPointVo>>> = mutableListOf()
-    var currentSelectGroup: String = ""
+    var selectedPointData: MutableList<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> =
+        mutableListOf()
+    var currentSelectGroupId: Long = 0L
 
     /**
      * 获取点位数据

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

@@ -16,6 +16,7 @@ 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.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
 import com.grkj.data.repository.IJobTicketRepository
@@ -55,7 +56,7 @@ class JobExecuteViewModel @Inject constructor(
     lateinit var ticketPoints: List<IsJobTicketPointsDataVo>
     lateinit var ticketStep: List<IsJobTicketStepDataVo>
     lateinit var ticketUser: List<IsJobTicketUserDataVo>
-    var selectedLockerData: List<Pair<String, MutableList<JobUserVo>>> = mutableListOf()
+    var selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = mutableListOf()
     var selecteColockerData: List<JobUserVo> = mutableListOf()
     var checkMemberFinish: Boolean = false
     var currentStepData: IsJobTicketStepDataVo? = null

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

@@ -7,6 +7,7 @@ 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.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SysBiometricDataVo
@@ -55,8 +56,8 @@ class JobViewModel @Inject constructor(
      * 保存作业
      */
     fun saveSop(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         workstationId: Long,
@@ -75,8 +76,8 @@ class JobViewModel @Inject constructor(
      * 创建作业
      */
     fun createJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         sopId: Long?,
@@ -101,8 +102,8 @@ class JobViewModel @Inject constructor(
      * 保存作业
      */
     fun saveJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         workflowModeId: Long,
         sopId: Long?,

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

@@ -7,11 +7,11 @@ 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.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.SysBiometricDataVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IUserRepository
@@ -35,8 +35,8 @@ class SopJobViewModel @Inject constructor(
 ) : BaseViewModel(userRepository) {
     var workstationData: List<IsWorkstation> = listOf()
     var sopData: List<SopManageVo> = listOf()
-    var sopPoints: List<Pair<String, MutableList<JobPointVo>>> = listOf()
-    var sopLockerData: List<Pair<String, MutableList<JobUserVo>>> = listOf()
+    var sopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>> = listOf()
+    var sopLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>> = listOf()
     var sopColockerData: List<JobUserVo> = listOf()
     var jobTicketData: JobTicketManageVo? = null
     var workflowModes: List<WorkflowMode> = mutableListOf()
@@ -84,8 +84,8 @@ class SopJobViewModel @Inject constructor(
      * 创建sop作业
      */
     fun createSopJob(
-        selectedSopPoints: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedSopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -110,8 +110,8 @@ class SopJobViewModel @Inject constructor(
      * 创建sop作业
      */
     fun saveSopJob(
-        selectedSopPoints: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedSopPoints: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,

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

@@ -2,10 +2,12 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+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.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.SysBiometricDataVo
@@ -51,8 +53,8 @@ class SopViewModel @Inject constructor(
      * 保存sop
      */
     fun saveSop(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         workstationId: Long,
@@ -62,7 +64,20 @@ class SopViewModel @Inject constructor(
         return liveData(Dispatchers.IO) {
             sopRepository.deleteSopPointsBySopId(listOf(sopId))
             sopRepository.deleteSopUsersBySopId(listOf(sopId))
+            sopRepository.deleteSopGroupBySopId(listOf(sopId))
             val sopId = sopRepository.saveSop(sopId, sopName, workstationId, modeId)
+            selectedPointsData.forEach {
+                val isSopGroup = IsSopGroup()
+                isSopGroup.groupName = it.first.groupName
+                isSopGroup.sopId = sopId
+                val groupId = sopRepository.saveSopGroup(isSopGroup)
+                it.second.forEach { pointVo ->
+                    pointVo.groupId = groupId
+                }
+                selectedLockerData.find { it.first.groupId == it.first.groupId }?.second?.forEach { locker ->
+                    locker.groupId = groupId
+                }
+            }
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(true)

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

@@ -29,14 +29,14 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 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" />
 
             <ImageView
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
-                android:scaleType="fitXY"
                 android:paddingHorizontal="@dimen/common_spacing"
+                android:scaleType="fitXY"
                 android:src="@mipmap/icon_title_arrow_divider" />
 
             <ImageView
@@ -50,8 +50,8 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_member_title"
                 android:textColor="@color/black"
-                android:textStyle="bold"
-                android:textSize="@dimen/normal_text_size_18" />
+                android:textSize="@dimen/normal_text_size_18"
+                android:textStyle="bold" />
 
             <View
                 android:layout_width="0dp"
@@ -98,10 +98,10 @@
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
+                    android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:divider="@drawable/divider_table"
                     android:orientation="horizontal"
-                    android:layout_weight="1"
                     android:showDividers="middle">
 
                     <LinearLayout
@@ -120,17 +120,6 @@
                             android:textColor="@color/black"
                             android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:id="@+id/select_locker_tv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:layout_marginBottom="@dimen/common_spacing"
-                            android:background="@drawable/bg_select_member_btn"
-                            android:paddingHorizontal="@dimen/common_spacing_2x"
-                            android:paddingVertical="@dimen/common_spacing_small"
-                            android:text="@string/select"
-                            android:textSize="@dimen/common_btn_text_size"
-                            android:textColor="@color/white" />
                     </LinearLayout>
 
                     <androidx.recyclerview.widget.RecyclerView
@@ -143,10 +132,10 @@
                     android:id="@+id/select_colocker_layout"
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
+                    android:layout_weight="1"
                     android:background="@drawable/home_card_bg"
                     android:divider="@drawable/divider_table"
                     android:orientation="horizontal"
-                    android:layout_weight="1"
                     android:showDividers="middle">
 
                     <LinearLayout
@@ -174,8 +163,8 @@
                             android:paddingHorizontal="@dimen/common_spacing_2x"
                             android:paddingVertical="@dimen/common_spacing_small"
                             android:text="@string/select"
-                            android:textSize="@dimen/common_btn_text_size"
-                            android:textColor="@color/white" />
+                            android:textColor="@color/white"
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
 
@@ -189,9 +178,9 @@
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:layout_weight="1"
-                android:layout_marginTop="@dimen/common_spacing_2x"
                 android:layout_marginHorizontal="@dimen/common_spacing_2x"
+                android:layout_marginTop="@dimen/common_spacing_2x"
+                android:layout_weight="1"
                 android:orientation="vertical">
 
                 <TextView
@@ -206,8 +195,8 @@
                     android:id="@+id/all_user_rv"
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
-                    android:layout_marginBottom="@dimen/common_spacing_2x"
                     android:layout_marginTop="@dimen/common_spacing"
+                    android:layout_marginBottom="@dimen/common_spacing_2x"
                     android:layout_weight="1"
                     android:background="@drawable/home_card_bg" />
             </LinearLayout>

+ 49 - 0
app/src/main/res/layout-land/item_locker_group.xml

@@ -0,0 +1,49 @@
+<?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_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">
+
+        <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">
+
+            <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>
+
+        <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="match_parent"
+            android:layout_height="match_parent"
+            android:paddingBottom="@dimen/common_spacing" />
+    </LinearLayout>
+</layout>

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

@@ -20,7 +20,7 @@
             android:orientation="horizontal"
             android:paddingVertical="@dimen/common_spacing_small">
 
-            <EditText
+            <TextView
                 android:id="@+id/group_name"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"

+ 9 - 20
app/src/main/res/layout/fragment_select_memeber.xml

@@ -29,14 +29,14 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 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" />
 
             <ImageView
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
-                android:scaleType="fitXY"
                 android:paddingHorizontal="@dimen/common_spacing"
+                android:scaleType="fitXY"
                 android:src="@mipmap/icon_title_arrow_divider" />
 
             <ImageView
@@ -50,8 +50,8 @@
                 android:layout_marginLeft="@dimen/common_spacing"
                 android:text="@string/select_member_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" />
 
             <View
                 android:layout_width="0dp"
@@ -118,22 +118,11 @@
                             android:textColor="@color/black"
                             android:textSize="@dimen/normal_text_size_18" />
 
-                        <TextView
-                            android:id="@+id/select_locker_tv"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:layout_marginBottom="@dimen/common_spacing"
-                            android:background="@drawable/bg_select_member_btn"
-                            android:paddingHorizontal="@dimen/common_spacing_2x"
-                            android:paddingVertical="@dimen/common_spacing_small"
-                            android:text="@string/select"
-                            android:textSize="@dimen/common_btn_text_size"
-                            android:textColor="@color/white" />
                     </LinearLayout>
 
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/locker_rv"
-                        android:layout_width="wrap_content"
+                        android:layout_width="match_parent"
                         android:layout_height="wrap_content" />
                 </LinearLayout>
 
@@ -172,14 +161,14 @@
                             android:paddingHorizontal="@dimen/common_spacing_2x"
                             android:paddingVertical="@dimen/common_spacing_small"
                             android:text="@string/select"
-                            android:textSize="@dimen/common_btn_text_size"
-                            android:textColor="@color/white" />
+                            android:textColor="@color/white"
+                            android:textSize="@dimen/common_btn_text_size" />
                     </LinearLayout>
 
 
                     <androidx.recyclerview.widget.RecyclerView
                         android:id="@+id/colocker_rv"
-                        android:layout_width="wrap_content"
+                        android:layout_width="match_parent"
                         android:layout_height="match_parent" />
                 </LinearLayout>
             </LinearLayout>

+ 50 - 0
app/src/main/res/layout/item_locker_group.xml

@@ -0,0 +1,50 @@
+<?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_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">
+
+        <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">
+
+            <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>
+
+        <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="match_parent"
+            android:layout_height="match_parent"
+            android:paddingBottom="@dimen/common_spacing" />
+    </LinearLayout>
+</layout>

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

@@ -19,7 +19,7 @@
             android:orientation="horizontal"
             android:paddingVertical="@dimen/common_spacing_small">
 
-            <EditText
+            <TextView
                 android:id="@+id/group_name"
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"

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

@@ -95,7 +95,7 @@
     <string name="please_select_member">please select member</string>
     <string name="please_must_select_at_least_one_point">You need to add at least one point</string>
     <string name="select_member_title">select member</string>
-    <string name="select_locker_tip">Please select locker from the following personnel</string>
+    <string name="select_locker_tip">Please select [%s] locker from the following personnel</string>
     <string name="select_colocker_tip">Please select colocker from the following personnel</string>
     <string name="select_point_title">Select Point</string>
     <string name="selected_point_info_title">selected point info</string>

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

@@ -104,4 +104,5 @@
     <dimen name="badge_text_size">28sp</dimen>
     <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>
 </resources>

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

@@ -95,7 +95,7 @@
     <string name="please_select_member">您可以选择添加人员</string>
     <string name="please_must_select_at_least_one_point">您至少需要添加一个点位</string>
     <string name="select_member_title">选择人员</string>
-    <string name="select_locker_tip">请在以下人员中选择上锁人</string>
+    <string name="select_locker_tip">请在以下人员中选择[%s]上锁人</string>
     <string name="select_colocker_tip">请在以下人员中选择共锁人</string>
     <string name="select_point_title">选择点位</string>
     <string name="selected_point_info_title">已选择的点位信息</string>

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

@@ -104,4 +104,5 @@
     <dimen name="badge_text_size">18sp</dimen>
     <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>
 </resources>

+ 1 - 1
app/src/main/res/values/strings.xml

@@ -94,7 +94,7 @@
     <string name="please_select_member">您可以选择添加人员</string>
     <string name="please_must_select_at_least_one_point">您至少需要添加一个点位</string>
     <string name="select_member_title">选择人员</string>
-    <string name="select_locker_tip">请在以下人员中选择上锁人</string>
+    <string name="select_locker_tip">请在以下人员中选择[%s]上锁人</string>
     <string name="select_colocker_tip">请在以下人员中选择共锁人</string>
     <string name="select_point_title">选择点位</string>
     <string name="selected_point_info_title">已选择的点位信息</string>

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

@@ -192,4 +192,10 @@ interface IsSopDao {
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun saveSopGroup(group: IsSopGroup): Long
+
+    /**
+     * 根据sopId删除sop分组
+     */
+    @Query("delete from is_sop_group where sop_id in (:sopIds)")
+    fun deleteSopGroupBySopId(sopIds: List<Long>)
 }

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

@@ -626,4 +626,10 @@ interface JobTicketDao {
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun saveIsJobTicketGroup(group: IsJobTicketGroup): Long
+
+    /**
+     * 根据作业id删除分组
+     */
+    @Query("delete from is_job_ticket_group where ticket_id in (:ticketIds)")
+    fun deleteJobTicketGroupByTicketIds(ticketIds: List<Long>)
 }

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

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

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

@@ -13,6 +13,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.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.LockedPointVo
@@ -25,8 +26,8 @@ interface IJobTicketRepository {
      * 创建作业
      */
     fun createJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -38,8 +39,8 @@ interface IJobTicketRepository {
      * 保存作业
      */
     fun saveJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,

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

@@ -1,10 +1,10 @@
 package com.grkj.data.repository
 
+import com.grkj.data.model.dos.IsSopGroup
 import com.grkj.data.model.vo.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
-import com.grkj.data.model.vo.UserManageVo
 
 /**
  * sop仓储层
@@ -18,13 +18,16 @@ interface ISopRepository {
     /**
      * 保存sop点位
      */
-    fun saveSopPoint(selectedSopPint: List<Pair<String, MutableList<JobPointVo>>>, sopId: Long)
+    fun saveSopPoint(
+        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        sopId: Long
+    )
 
     /**
      * 保存sop人员
      */
     fun saveSopUser(
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     )
@@ -68,4 +71,14 @@ interface ISopRepository {
      * 根据sopId列表删除用户数据
      */
     fun deleteSopUsersBySopId(sopIds: List<Long>)
+
+    /**
+     * 保存sop分组
+     */
+    fun saveSopGroup(group: IsSopGroup): Long
+
+    /**
+     * 根据sopId列表删除sop分组
+     */
+    fun deleteSopGroupBySopId(sopIds: List<Long>)
 }

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

@@ -13,11 +13,10 @@ 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.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.LockedPointVo
-import com.grkj.data.model.vo.PointManageVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.IJobTicketRepository
 import javax.inject.Inject
@@ -29,8 +28,8 @@ import javax.inject.Singleton
 @Singleton
 class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJobTicketRepository{
     override fun createJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -41,8 +40,8 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
     }
 
     override fun saveJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,

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

@@ -1,10 +1,10 @@
 package com.grkj.data.repository.impl.network
 
+import com.grkj.data.model.dos.IsSopGroup
 import com.grkj.data.model.vo.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobUserVo
-import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.SopManageVo
-import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.BaseRepository
 import com.grkj.data.repository.ISopRepository
 import javax.inject.Inject
@@ -24,15 +24,23 @@ class NetworkSopRepository @Inject constructor()  : BaseRepository(), ISopReposi
         TODO("Not yet implemented")
     }
 
+    override fun saveSopGroup(group: IsSopGroup): Long {
+        TODO("Not yet implemented")
+    }
+
+    override fun deleteSopGroupBySopId(sopIds: List<Long>) {
+        TODO("Not yet implemented")
+    }
+
     override fun saveSopPoint(
-        selectedSopPint: List<Pair<String, MutableList<JobPointVo>>>,
+        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
         sopId: Long
     ) {
         TODO("Not yet implemented")
     }
 
     override fun saveSopUser(
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     ) {

+ 21 - 8
data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt

@@ -29,6 +29,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.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.LockedPointVo
@@ -51,8 +52,8 @@ class JobTicketRepository @Inject constructor(
     val exceptionDao: ExceptionDao
 ) : BaseRepository(), IJobTicketRepository {
     override fun createJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -69,8 +70,11 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.groupName = it.first
+            isJobTicketGroup.groupName = it.first.groupName
             val groupId = jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
+            selectedLockerData.find { lockerGroup -> lockerGroup.first.groupId == it.first.groupId }?.second?.forEach { locker ->
+                locker.groupId = groupId
+            }
             it.second.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
@@ -134,8 +138,8 @@ class JobTicketRepository @Inject constructor(
     }
 
     override fun saveJob(
-        selectedPointsData: List<Pair<String, MutableList<JobPointVo>>>,
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedPointsData: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         modeId: Long,
         sopId: Long?,
@@ -148,6 +152,7 @@ class JobTicketRepository @Inject constructor(
         jobTicketDao.deleteJobTicketPointsByTicketIds(listOf(ticketId))
         jobTicketDao.deleteJobTicketStepByTicketIds(listOf(ticketId))
         jobTicketDao.deleteJobTicketUserByTicketIds(listOf(ticketId))
+        jobTicketDao.deleteJobTicketGroupByTicketIds(listOf(ticketId))
         val isJobTicket = IsJobTicket()
         isJobTicket.ticketId = ticketId
         isJobTicket.ticketName = jobName
@@ -159,8 +164,12 @@ class JobTicketRepository @Inject constructor(
         val ticketPoints = selectedPointsData.map {
             val isJobTicketGroup = IsJobTicketGroup()
             isJobTicketGroup.ticketId = ticketId
-            isJobTicketGroup.groupName = it.first
+            isJobTicketGroup.id = it.first.groupId
+            isJobTicketGroup.groupName = it.first.groupName
             val groupId = jobTicketDao.saveIsJobTicketGroup(isJobTicketGroup)
+            selectedLockerData.find { lockerGroup -> it.first.groupId == lockerGroup.first.groupId }?.second?.forEach {
+                it.groupId = groupId
+            }
             it.second.map {
                 val isJobTicketPoint = IsJobTicketPoints()
                 isJobTicketPoint.ticketId = ticketId
@@ -401,9 +410,13 @@ class JobTicketRepository @Inject constructor(
         selectedColockerData: List<JobUserVo>
     ) {
         val existsUsers = jobTicketDao.getJobTicketUserDataByTicketId(ticketId)
-        jobTicketDao.deleteJobTicketUserByUserIds(existsUsers.filter { it.userId !in (selectedLockerData.map { it.second }.flatten() + selectedColockerData).map { it.userId } }
+        jobTicketDao.deleteJobTicketUserByUserIds(existsUsers.filter {
+            it.userId !in (selectedLockerData.map { it.second }
+                .flatten() + selectedColockerData).map { it.userId }
+        }
             .map { it.userId })
-        val newLockUser = selectedLockerData.map { it.second }.flatten().filter { it.userId !in existsUsers.map { it.userId } }
+        val newLockUser = selectedLockerData.map { it.second }.flatten()
+            .filter { it.userId !in existsUsers.map { it.userId } }
         val newCoLockUser =
             selectedColockerData.filter { it.userId !in existsUsers.map { it.userId } }
         val ticketLockerUsers = newLockUser.map {

+ 12 - 7
data/src/main/java/com/grkj/data/repository/impl/standard/SopRepository.kt

@@ -7,6 +7,7 @@ import com.grkj.data.model.dos.IsSopGroup
 import com.grkj.data.model.dos.IsSopPoints
 import com.grkj.data.model.dos.IsSopUser
 import com.grkj.data.model.vo.JobPointVo
+import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobUserVo
 import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.repository.BaseRepository
@@ -35,27 +36,31 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao) : BaseRepository
     }
 
     override fun saveSopPoint(
-        selectedSopPint: List<Pair<String, MutableList<JobPointVo>>>,
+        selectedSopPint: List<Pair<JobTicketGroupDataVo, MutableList<JobPointVo>>>,
         sopId: Long
     ) {
         val isSopPoints = selectedSopPint.map {
-            val isSopGroup = IsSopGroup()
-            isSopGroup.groupName = it.first
-            isSopGroup.sopId = sopId
-            val groupId = isSopDao.saveSopGroup(isSopGroup)
             it.second.map { pointVo ->
                 val isSopPoint = IsSopPoints()
                 isSopPoint.sopId = sopId
                 isSopPoint.pointId = pointVo.pointId
-                isSopPoint.groupId = groupId
+                isSopPoint.groupId = pointVo.groupId
                 isSopPoint
             }
         }
         isSopDao.saveSopPoints(isSopPoints.flatten())
     }
 
+    override fun saveSopGroup(group: IsSopGroup): Long {
+        return isSopDao.saveSopGroup(group)
+    }
+
+    override fun deleteSopGroupBySopId(sopIds: List<Long>) {
+        isSopDao.deleteSopGroupBySopId(sopIds)
+    }
+
     override fun saveSopUser(
-        selectedLockerData: List<Pair<String, MutableList<JobUserVo>>>,
+        selectedLockerData: List<Pair<JobTicketGroupDataVo, MutableList<JobUserVo>>>,
         selectedColockerData: List<JobUserVo>,
         sopId: Long
     ) {