Bläddra i källkod

refactor(更新)
- hilt集成
- 工作详情

周文健 5 månader sedan
förälder
incheckning
cc9faab5d4
53 ändrade filer med 858 tillägg och 266 borttagningar
  1. 2 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  2. 2 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt
  3. 3 5
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt
  4. 140 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  5. 3 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  6. 6 7
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/InProgressJobManageFragment.kt
  7. 1 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  8. 5 6
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageFragment.kt
  9. 65 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt
  10. 39 31
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  11. 3 7
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  12. 5 8
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  13. 1 1
      app/src/main/res/layout/dialog_drop_down_list.xml
  14. 3 3
      app/src/main/res/layout/fragment_home.xml
  15. 4 0
      app/src/main/res/layout/fragment_job_execute.xml
  16. 2 0
      app/src/main/res/values-en/strings.xml
  17. 2 0
      app/src/main/res/values-zh/strings.xml
  18. 2 0
      app/src/main/res/values/strings.xml
  19. 103 0
      data/src/main/java/com/grkj/data/dao/HardwareDao.kt
  20. 6 0
      data/src/main/java/com/grkj/data/dao/IsolationPointDao.kt
  21. 34 6
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  22. 7 2
      data/src/main/java/com/grkj/data/dao/WorkstationDao.kt
  23. 10 1
      data/src/main/java/com/grkj/data/database/ISCSDatabase.kt
  24. 77 0
      data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt
  25. 1 1
      data/src/main/java/com/grkj/data/enums/IsolationPointPowerTypeEnum.kt
  26. 1 1
      data/src/main/java/com/grkj/data/enums/JobTicketStatusEnum.kt
  27. 1 1
      data/src/main/java/com/grkj/data/enums/RoleEnum.kt
  28. 39 0
      data/src/main/java/com/grkj/data/model/dos/IsKey.kt
  29. 4 4
      data/src/main/java/com/grkj/data/model/dos/IsLock.kt
  30. 2 1
      data/src/main/java/com/grkj/data/model/dos/IsLockCabinet.kt
  31. 2 1
      data/src/main/java/com/grkj/data/model/dos/IsLockCabinetSlots.kt
  32. 1 1
      data/src/main/java/com/grkj/data/model/dos/IsLockType.kt
  33. 1 1
      data/src/main/java/com/grkj/data/model/dos/IsLockset.kt
  34. 1 1
      data/src/main/java/com/grkj/data/model/dos/IsLocksetType.kt
  35. 1 1
      data/src/main/java/com/grkj/data/model/dos/SysRole.kt
  36. 1 1
      data/src/main/java/com/grkj/data/model/dos/SysUserCharacteristicDo.kt
  37. 20 31
      data/src/main/java/com/grkj/data/model/res/CabinetSlotsRes.kt
  38. 16 13
      data/src/main/java/com/grkj/data/model/res/CommonDictRes.kt
  39. 9 9
      data/src/main/java/com/grkj/data/model/res/KeyInfoRes.kt
  40. 8 8
      data/src/main/java/com/grkj/data/model/res/KeyPageRes.kt
  41. 9 9
      data/src/main/java/com/grkj/data/model/res/LockInfoRes.kt
  42. 7 7
      data/src/main/java/com/grkj/data/model/res/LockPageRes.kt
  43. 8 13
      data/src/main/java/com/grkj/data/model/res/StepDetailRes.kt
  44. 4 3
      data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt
  45. 15 0
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  46. 107 15
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt
  47. 37 16
      data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt
  48. 3 4
      data/src/main/java/com/grkj/data/repository/impl/SopRepository.kt
  49. 9 10
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  50. 1 3
      ui-base/src/main/java/com/grkj/ui_base/business/DataBusiness.kt
  51. 6 9
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  52. 6 3
      ui-base/src/main/java/com/grkj/ui_base/dialog/LoadingDialog.kt
  53. 13 10
      ui-base/src/main/java/com/grkj/ui_base/dialog/TipDialog.kt

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

@@ -6,7 +6,7 @@ import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.enums.IsolationPointPowerType
+import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import com.grkj.ui_base.utils.extension.tipDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import razerdp.basepopup.BasePopupWindow
@@ -76,7 +76,7 @@ class AddPointDialog(context: Context) : BasePopupWindow(context) {
 
     private fun setPointPowerType() {
         textDropDownDialog.setData(
-            IsolationPointPowerType.values().map {
+            IsolationPointPowerTypeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.name,
                     dataText = it.description

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

@@ -6,7 +6,7 @@ import com.grkj.data.model.vo.PointManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.enums.IsolationPointPowerType
+import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import razerdp.basepopup.BasePopupWindow
 
 /**
@@ -72,7 +72,7 @@ class FilterPointDialog(context: Context) : BasePopupWindow(context) {
 
     private fun setPointPowerType() {
         textDropDownDialog.setData(
-            IsolationPointPowerType.values().map {
+            IsolationPointPowerTypeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.name,
                     dataText = it.description

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

@@ -1,10 +1,8 @@
 package com.grkj.iscs.features.main.fragment.common
 
 import android.widget.LinearLayout
-import androidx.activity.viewModels
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
@@ -16,7 +14,7 @@ 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.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.iscs.features.main.viewmodel.common.SelectMemberViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.CommonUtils
@@ -154,7 +152,7 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         binding.selectMemberTip.text = CommonUtils.getStr(R.string.select_locker_tip)
         binding.lockerRv.models = selectedLockerData
         binding.allUserRv.models =
-            viewModel.userData.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }.apply {
+            viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }.apply {
                 forEach {
                     it.isSelected = it.userId in selectedLockerData.map { it.userId }
                 }
@@ -167,7 +165,7 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         binding.selectMemberTip.text = CommonUtils.getStr(R.string.select_colocker_tip)
         binding.colockerRv.models = selectedColockerData
         binding.allUserRv.models =
-            viewModel.userData.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }.apply {
+            viewModel.userData.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }.apply {
                 forEach {
                     it.isSelected = it.userId in selectedColockerData.map { it.userId }
                 }

+ 140 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt

@@ -1,6 +1,8 @@
 package com.grkj.iscs.features.main.fragment.home
 
 import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
@@ -8,17 +10,27 @@ import com.drake.brv.annotaion.ItemOrientation
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
+import com.grkj.data.enums.LockModeEnum
+import com.grkj.data.enums.LockStepEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.databinding.ItemHomeQuickEntranceBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.iscs.features.main.viewmodel.home.HomeViewModel
+import com.grkj.iscs.utils.getLockModeStr
+import com.grkj.iscs.utils.getLockModeType
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import com.grkj.ui_base.utils.event.JumpViewEvent
+import com.kongzue.dialogx.dialogs.PopTip
+import com.loper7.date_time_picker.dialog.CardDatePickerDialog
+import com.sik.sikcore.date.TimeUtils
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
+import java.util.Date
 import kotlin.getValue
 
 /**
@@ -27,6 +39,7 @@ import kotlin.getValue
 @AndroidEntryPoint
 class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     private val viewModel: HomeViewModel by viewModels()
+    private lateinit var textDropDownDialog: TextDropDownDialog
     private val quickEntranceList = mutableListOf<MenuItemEntity>(
         MenuItemEntity(
             0,
@@ -41,6 +54,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     }
 
     override fun initView() {
+        textDropDownDialog = TextDropDownDialog(requireContext())
+        textDropDownDialog.setWidthAsAnchorView(true)
         binding.quickEntranceRv.apply {
             linear(orientation = LinearLayout.HORIZONTAL)
         }.setup {
@@ -49,19 +64,138 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
                 onQuickEntranceBinding(this)
             }
         }
+        binding.realTimeDataZone.setDebouncedClickListener {
+            setWorkstationData(binding.realTimeDataZone) {
+                viewModel.realTimeDataZoneId = it.getId()
+            }
+        }
+        binding.lockMode.setDebouncedClickListener {
+            setLockModeData()
+        }
+        binding.overviewDataZone.setDebouncedClickListener {
+            setWorkstationData(binding.overviewDataZone) {
+                viewModel.overviewDataZoneId = it.getId()
+            }
+        }
         binding.ongoingJobNum.setDebouncedClickListener {
             BottomNavVisibilityEvent.sendBottomNavVisibilityEvent(false)
-            JumpViewEvent.sendJumpViewEvent(R.navigation.nav_job_manage, R.id.action_jobManageHomeFragment_to_createJobFragment)
+            JumpViewEvent.sendJumpViewEvent(
+                R.navigation.nav_job_manage,
+                R.id.action_jobManageHomeFragment_to_inProgressJobManageFragment
+            )
         }
         binding.allJobNum.setDebouncedClickListener {
             BottomNavVisibilityEvent.sendBottomNavVisibilityEvent(false)
-            JumpViewEvent.sendJumpViewEvent(R.navigation.nav_job_manage, R.id.action_jobManageHomeFragment_to_createJobFragment)
+            JumpViewEvent.sendJumpViewEvent(
+                R.navigation.nav_job_manage,
+                R.id.action_jobManageHomeFragment_to_jobManageFragment
+            )
         }
+        binding.startTime.setDebouncedClickListener {
+            pickDateTime(timeView = binding.startTime)
+        }
+        binding.endTime.setDebouncedClickListener {
+            if (binding.startTime.text.isEmpty()) {
+                PopTip.tip(R.string.please_select_start_time)
+                return@setDebouncedClickListener
+            }
+            pickDateTime(false, binding.endTime)
+        }
+    }
+
+    private fun pickDateTime(startTime: Boolean = true, timeView: TextView) {
+        CardDatePickerDialog.builder(requireContext())
+            .setTitle(
+                if (startTime) CommonUtils.getStr(com.grkj.ui_base.R.string.start_time)
+                    .toString() else CommonUtils.getStr(com.grkj.ui_base.R.string.end_time)
+                    .toString()
+            )
+            .setOnChoose { millisecond ->
+                val chooseTime = TimeUtils.formatDate(
+                    Date(millisecond),
+                    TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+                )
+                if (startTime && binding.endTime.text.isNotEmpty()) {
+                    if (TimeUtils.isTimeBefore(
+                            binding.endTime.text.toString(),
+                            chooseTime,
+                            TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+                        )
+                    ) {
+                        PopTip.tip(R.string.start_time_must_large_then_end_time)
+                        return@setOnChoose
+                    }
+                } else {
+                    if (TimeUtils.isTimeBefore(
+                            chooseTime,
+                            binding.startTime.text.toString(),
+                            TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+                        )
+                    ) {
+                        PopTip.tip(R.string.start_time_must_large_then_end_time)
+                        return@setOnChoose
+                    }
+                }
+                timeView.text = TimeUtils.formatDate(
+                    Date(millisecond),
+                    TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+                )
+                getHomeData()
+            }.build().show()
     }
 
     override fun initData() {
         super.initData()
         binding.quickEntranceRv.models = quickEntranceList
+        getHomeData()
+    }
+
+    private fun getHomeData() {
+        viewModel.getHomeData().observe(this) {
+            binding.ongoingJobNum.text = viewModel.inProgressJobNum.toString()
+            binding.lockedPointsNum.text = viewModel.lockedPointNum.toString()
+            binding.hardwareInUseNum.text = viewModel.usedHardwareNum.toString()
+            binding.allJobNum.text = viewModel.allJobNum.toString()
+            binding.allPointsNum.text = viewModel.allPointNum.toString()
+            binding.allHardwareNum.text = viewModel.allHardwareNum.toString()
+        }
+    }
+
+    private fun setWorkstationData(
+        workstationTv: TextView,
+        onSelected: (TextDropDownDialog.TextDropDownEntity) -> Unit
+    ) {
+        viewModel.getWorkstationData().observe(this) {
+            textDropDownDialog.setData(
+                viewModel.workstationData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(
+                        dataId = it.workstationId,
+                        dataText = it.workstationName
+                    )
+                })
+            textDropDownDialog.setOnItemSelectListener {
+                workstationTv.text = it.getShowText()
+                onSelected(it)
+                getHomeData()
+            }
+            textDropDownDialog.showPopupWindow(workstationTv)
+        }
+    }
+
+    private fun setLockModeData() {
+        textDropDownDialog.setData(
+            LockModeEnum.values().map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataTag = it.getLockModeType(),
+                    dataText = it.getLockModeStr()
+                )
+            })
+        textDropDownDialog.setOnItemSelectListener {
+            binding.lockMode.text = it.getShowText()
+            viewModel.selectedLockMode = it.getTag()
+            getHomeData()
+        }
+        textDropDownDialog.showPopupWindow(binding.lockMode)
     }
 
     private fun BindingAdapter.BindingViewHolder.onQuickEntranceBinding(holder: BindingAdapter.BindingViewHolder) {
@@ -78,7 +212,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
         when (menuType) {
             0 -> {
                 BottomNavVisibilityEvent.sendBottomNavVisibilityEvent(false)
-                JumpViewEvent.sendJumpViewEvent(R.navigation.nav_job_manage, R.id.action_jobManageHomeFragment_to_createJobFragment)
+                JumpViewEvent.sendJumpViewEvent(
+                    R.navigation.nav_job_manage,
+                    R.id.action_jobManageHomeFragment_to_createJobFragment
+                )
             }
         }
     }

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

@@ -3,7 +3,6 @@ package com.grkj.iscs.features.main.fragment.job_manage
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
@@ -18,7 +17,7 @@ import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.data.enums.LockModeEnum
 import com.grkj.data.enums.LockStepEnum
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.iscs.databinding.FragmentEditSopBinding
 import com.grkj.iscs.features.main.viewmodel.job_manage.SopViewModel
 import com.grkj.iscs.utils.getLockModeStr
@@ -262,12 +261,12 @@ class EditSopFragment : BaseFragment<FragmentEditSopBinding>() {
                 .find { it.getLockModeType() == selectedLockMode }?.description
             selectedLockerData = viewModel.selectedSopUserData.filter {
                 it.roleKeys.contains(
-                    RoleEnums.JTLOCKER.roleKey
+                    RoleEnum.JTLOCKER.roleKey
                 )
             }
             selectedColockerData = viewModel.selectedSopUserData.filter {
                 it.roleKeys.contains(
-                    RoleEnums.JTCOLOCKER.roleKey
+                    RoleEnum.JTCOLOCKER.roleKey
                 )
             }
             binding.lockerName.text = selectedLockerData.first().nickName

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

@@ -2,14 +2,13 @@ package com.grkj.iscs.features.main.fragment.job_manage
 
 import android.graphics.Color
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.divider
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.JobTicketStatusEnums
+import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
@@ -67,7 +66,7 @@ class InProgressJobManageFragment : BaseFragment<FragmentInProgressJobManageBind
         val itemBinding = holder.getBinding<ItemJobManageBinding>()
         val item = holder.getModel<JobTicketManageVo>()
         itemBinding.jobName.text = item.ticketName
-        itemBinding.status.text = JobTicketStatusEnums.getTicketStatusStr(item.ticketStatus)
+        itemBinding.status.text = JobTicketStatusEnum.getTicketStatusStr(item.ticketStatus)
         itemBinding.select.setOnCheckedChangeListener(null)
         itemBinding.select.isChecked = item.isSelected
         itemBinding.select.setOnCheckedChangeListener { _, checked ->
@@ -99,10 +98,10 @@ class InProgressJobManageFragment : BaseFragment<FragmentInProgressJobManageBind
             binding.refreshLayout.finishLoadMore()
             binding.listRv.models = viewModel.jobManageDataList.filter {
                 it.ticketStatus in listOf(
-                    JobTicketStatusEnums.SELECT_MEMBER,
-                    JobTicketStatusEnums.LOCKING,
-                    JobTicketStatusEnums.COLOCKING,
-                    JobTicketStatusEnums.UNLOCKING
+                    JobTicketStatusEnum.SELECT_MEMBER,
+                    JobTicketStatusEnum.LOCKING,
+                    JobTicketStatusEnum.COLOCKING,
+                    JobTicketStatusEnum.UNLOCKING
                 ).map { it.status }
             }
         }

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

@@ -230,6 +230,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             binding.jobNameTv.text = viewModel.ticketData.ticketName
             binding.listRv.models = viewModel.ticketPoints
             binding.stepRv.models = viewModel.ticketStep
+            viewModel.currentStepData = viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
             checkCurrentStep()
         }
     }

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

@@ -2,14 +2,13 @@ package com.grkj.iscs.features.main.fragment.job_manage
 
 import android.graphics.Color
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.divider
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.enums.JobTicketStatusEnums
+import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
@@ -110,7 +109,7 @@ class JobManageFragment : BaseFragment<FragmentJobManageBinding>() {
         val itemBinding = holder.getBinding<ItemJobManageBinding>()
         val item = holder.getModel<JobTicketManageVo>()
         itemBinding.jobName.text = item.ticketName
-        itemBinding.status.text = JobTicketStatusEnums.getTicketStatusStr(item.ticketStatus)
+        itemBinding.status.text = JobTicketStatusEnum.getTicketStatusStr(item.ticketStatus)
         itemBinding.select.setOnCheckedChangeListener(null)
         itemBinding.select.isChecked = item.isSelected
         itemBinding.select.setOnCheckedChangeListener { _, checked ->
@@ -122,15 +121,15 @@ class JobManageFragment : BaseFragment<FragmentJobManageBinding>() {
         itemBinding.view.setDebouncedClickListener {
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_JOB_TICKET_ID, item.ticketId)
-            if (item.ticketStatus == JobTicketStatusEnums.NOT_START.status) {
+            if (item.ticketStatus == JobTicketStatusEnum.NOT_START.status) {
                 if (item.sopId != null) {
                     navController.navigate(R.id.action_jobManageFragment_to_editSopJobFragment)
                 } else {
                     navController.navigate(R.id.action_jobManageFragment_to_editJobFragment)
                 }
-            } else if (item.ticketStatus == JobTicketStatusEnums.CANCELED.status) {
+            } else if (item.ticketStatus == JobTicketStatusEnum.CANCELED.status) {
                 PopTip.tip(R.string.job_canceled)
-            } else if (item.ticketStatus == JobTicketStatusEnums.FINISHED.status) {
+            } else if (item.ticketStatus == JobTicketStatusEnum.FINISHED.status) {
                 PopTip.tip(R.string.job_finished)
             } else {
                 navController.navigate(R.id.action_jobManageFragment_to_jobExecuteFragment)

+ 65 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt

@@ -1,10 +1,74 @@
 package com.grkj.iscs.features.main.viewmodel.home
 
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.liveData
+import com.grkj.data.model.dos.IsWorkstation
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.Dispatchers
 import javax.inject.Inject
 
 /**
  * 主界面界面模型
  */
-class HomeViewModel @Inject constructor() : BaseViewModel() {
+@HiltViewModel
+class HomeViewModel @Inject constructor(
+    val workstationRepository: IWorkstationRepository,
+    val jobTicketRepository: IJobTicketRepository,
+    val hardwareRepository: IHardwareRepository
+) :
+    BaseViewModel() {
+    var workstationData: List<IsWorkstation> = listOf()
+    var inProgressJobNum = 0
+    var lockedPointNum = 0
+    var usedHardwareNum = 0
+    var allJobNum = 0
+    var allPointNum = 0
+    var allHardwareNum = 0
+
+    /**
+     * 实时数据区域id
+     */
+    var realTimeDataZoneId: Long? = null
+
+    /**
+     * 总览数据区域id
+     */
+    var overviewDataZoneId: Long? = null
+
+    /**
+     * 锁定模式
+     */
+    var selectedLockMode: String = ""
+
+    /**
+     * 时间范围
+     */
+    var startTime: String = ""
+    var endTime: String = ""
+
+    /**
+     * 初始化岗位数据
+     */
+    fun getWorkstationData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            workstationData = workstationRepository.getWorkStationData()
+            emit(true)
+        }
+    }
+
+    /**
+     * 获取首页数据
+     */
+    fun getHomeData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            inProgressJobNum =
+                jobTicketRepository.getInProgressJobSize(realTimeDataZoneId, selectedLockMode)
+            allJobNum = jobTicketRepository.getAllJobSize(realTimeDataZoneId, startTime, endTime)
+            emit(true)
+        }
+    }
 }

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

@@ -3,8 +3,8 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.local.DeviceTakeUpdate
 import com.grkj.data.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketKeyDataVo
 import com.grkj.data.model.vo.IsJobTicketLockDataVo
@@ -13,9 +13,8 @@ import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
-import com.grkj.data.repository.impl.JobTicketRepository
-import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
+import com.grkj.ui_base.business.BleBusinessManager
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -31,7 +30,8 @@ import java.util.concurrent.atomic.AtomicInteger
  * 作业执行数据
  */
 @HiltViewModel
-class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicketRepository) : BaseViewModel() {
+class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicketRepository) :
+    BaseViewModel() {
     var ticketId: Long = 0
     lateinit var ticketData: IsJobTicketDataVo
     lateinit var ticketKey: List<IsJobTicketKeyDataVo>
@@ -57,9 +57,9 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
             ticketUser = jobTicketRepository.getJobTicketUserDataByTicketId(ticketId)
             val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
             selectedLockerData =
-                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
             selecteColockerData =
-                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             ticketStep.sortedBy { it.stepId }
             ticketStep.forEach {
                 it.position = ticketStep.indexOfFirst { stepVo -> it.stepId == stepVo.stepId }
@@ -78,29 +78,10 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
                 ticketData.ticketId, currentStepData, selectedLockerData, selecteColockerData
             )
             ticketStep = jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
-            emit(true)
-        }
-    }
-
-    /**
-     * 处理步骤
-     */
-    fun handleStep(isJobTicketStepDataVo: IsJobTicketStepDataVo): LiveData<Boolean> {
-        return liveData(Dispatchers.IO) {
-            when (isJobTicketStepDataVo.stepIndex) {
-                LockStepEnum.LOCK.type -> {
-
-                }
-
-                LockStepEnum.COLOCK.type -> {
-
-                }
-
-                LockStepEnum.UNLOCK.type -> {
-
-                }
-            }
-            ticketStep = jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
+            jobTicketRepository.updateTicketDataStatus(
+                ticketId,
+                (ticketStep.firstOrNull { it.stepStatus == "0" }?.stepIndex ?: -1) + 1
+            )
             emit(true)
         }
     }
@@ -130,17 +111,22 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
      */
     fun toLock(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            LoadingEvent.sendLoadingEvent(
+                CommonUtils.getStr(com.grkj.ui_base.R.string.check_key_and_lock),
+                true
+            )
             ModbusBusinessManager.checkEquipCount(ticketPoints.count {
                 it.pointStatus == "0" || (it.pointStatus == "2" && LockModeEnum.isUnLockFirst(
                     ticketData.lockMode.toString()
                 ))
             }, true) { keyMap, lockMap ->
+                LoadingEvent.sendLoadingEvent()
                 if (lockMap.isEmpty()) {
                     TipDialog.show(
                         CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed).toString(),
                         CommonUtils.getStr(com.grkj.ui_base.R.string.lock_is_not_enough).toString(),
                         TipDialog.DialogType.ERROR,
-                        countDownTime = 10
+                        countDownTime = 10,
                     )
                     return@checkEquipCount
                 }
@@ -190,6 +176,28 @@ class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicke
      */
     fun toUnLock(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
+            LoadingEvent.sendLoadingEvent(
+                CommonUtils.getStr(com.grkj.ui_base.R.string.check_key_and_lock),
+                true
+            )
+            ModbusBusinessManager.checkEquipCount(0, true) { keyMap, _ ->
+                LoadingEvent.sendLoadingEvent()
+                if (keyMap == null) {
+                    TipDialog.show(
+                        CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed).toString(),
+                        CommonUtils.getStr(com.grkj.ui_base.R.string.no_available_key).toString(),
+                        TipDialog.DialogType.ERROR,
+                        countDownTime = 10
+                    )
+                    return@checkEquipCount
+                }
+                val deviceTakeUpdate = DeviceTakeUpdate(
+                    DeviceConst.DEVICE_TYPE_KEY,
+                    ticketId,
+                    keyMap.second?.rfid ?: ""
+                )
+                BleBusinessManager.handleGiveKey(deviceTakeUpdate)
+            }
             emit(true)
         }
     }

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

@@ -2,7 +2,7 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
@@ -10,10 +10,6 @@ import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.repository.impl.IsolationPointRepository
-import com.grkj.data.repository.impl.JobTicketRepository
-import com.grkj.data.repository.impl.SopRepository
-import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
@@ -139,9 +135,9 @@ class JobViewModel @Inject constructor(
                 jobTicketRepository.getTicketPointsByTicketId(ticketId)
             val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
             jobLockerData =
-                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
             jobColockerData =
-                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             emit(true)
         }
     }

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

@@ -8,12 +8,9 @@ import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.repository.impl.SopRepository
-import com.grkj.data.repository.impl.WorkstationRepository
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.repository.IJobTicketRepository
-import com.grkj.data.repository.impl.JobTicketRepository
 import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
@@ -61,9 +58,9 @@ class SopJobViewModel @Inject constructor(
     fun loadSopData(sopId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             val tempSopUsers = sopRepository.getSopUsersBySopId(sopId)
-            sopLockerData = tempSopUsers.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+            sopLockerData = tempSopUsers.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
             sopColockerData =
-                tempSopUsers.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+                tempSopUsers.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             sopPoints = sopRepository.getSopPointsBySopId(sopId)
             emit(true)
         }
@@ -142,9 +139,9 @@ class SopJobViewModel @Inject constructor(
             workstationData = workstationRepository.getWorkStationData()
             sopData = sopRepository.getSopDataByWorkstationId(jobTicketData?.workstationId ?: 0)
             val sopJobUsers = jobTicketRepository.getTicketUsersByTicketId(ticketId)
-            sopLockerData = sopJobUsers.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+            sopLockerData = sopJobUsers.filter { it.roleKeys.contains(RoleEnum.JTLOCKER.roleKey) }
             sopColockerData =
-                sopJobUsers.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+                sopJobUsers.filter { it.roleKeys.contains(RoleEnum.JTCOLOCKER.roleKey) }
             sopPoints = jobTicketRepository.getTicketPointsByTicketId(ticketId)
             emit(true)
         }

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

@@ -2,7 +2,7 @@
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
     <FrameLayout
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
         <androidx.recyclerview.widget.RecyclerView

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

@@ -83,7 +83,7 @@
 
                         <TextView
                             android:id="@+id/real_time_data_zone"
-                            android:layout_width="180dp"
+                            android:layout_width="230dp"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="10dp"
                             android:background="@drawable/bg_common_input"
@@ -110,7 +110,7 @@
 
                         <TextView
                             android:id="@+id/lock_mode"
-                            android:layout_width="180dp"
+                            android:layout_width="230dp"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="10dp"
                             android:background="@drawable/bg_common_input"
@@ -318,7 +318,7 @@
 
                         <TextView
                             android:id="@+id/overview_data_zone"
-                            android:layout_width="180dp"
+                            android:layout_width="230dp"
                             android:layout_height="wrap_content"
                             android:layout_marginLeft="10dp"
                             android:background="@drawable/bg_common_input"

+ 4 - 0
app/src/main/res/layout/fragment_job_execute.xml

@@ -121,6 +121,7 @@
                 android:paddingHorizontal="10dp"
                 android:text="@string/go_locking"
                 android:textColor="@color/white"
+                android:visibility="gone"
                 android:textSize="20sp" />
 
             <TextView
@@ -133,6 +134,7 @@
                 android:paddingHorizontal="10dp"
                 android:text="@string/go_unlocking"
                 android:textColor="@color/white"
+                android:visibility="gone"
                 android:textSize="20sp" />
 
             <TextView
@@ -144,6 +146,7 @@
                 android:paddingHorizontal="10dp"
                 android:text="@string/cancel_the_job"
                 android:textColor="@color/black"
+                android:visibility="gone"
                 android:textSize="20sp" />
 
             <TextView
@@ -155,6 +158,7 @@
                 android:paddingHorizontal="10dp"
                 android:text="@string/finish_the_job"
                 android:textColor="@color/black"
+                android:visibility="gone"
                 android:textSize="20sp" />
         </LinearLayout>
     </LinearLayout>

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

@@ -150,4 +150,6 @@
     <string name="in_progress_job_manage_title">In progress job</string>
     <string name="job_lost">Job lost</string>
     <string name="point_name_tv">Point name</string>
+    <string name="please_select_start_time">please select start time first</string>
+    <string name="start_time_must_large_then_end_time">start time must large then end time</string>
 </resources>

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

@@ -150,4 +150,6 @@
     <string name="in_progress_job_manage_title">进行中的作业</string>
     <string name="job_lost">作业丢失</string>
     <string name="point_name_tv">隔离点</string>
+    <string name="please_select_start_time">请先选择开始时间</string>
+    <string name="start_time_must_large_then_end_time">开始时间必须大于结束时间</string>
 </resources>

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

@@ -149,4 +149,6 @@
     <string name="in_progress_job_manage_title">进行中的作业</string>
     <string name="job_lost">作业丢失</string>
     <string name="point_name_tv">隔离点</string>
+    <string name="please_select_start_time">请先选择开始时间</string>
+    <string name="start_time_must_large_then_end_time">开始时间必须大于结束时间</string>
 </resources>

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

@@ -5,6 +5,11 @@ import androidx.room.Insert
 import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import com.grkj.data.model.dos.IsJobCard
+import com.grkj.data.model.dos.IsJobTicketKey
+import com.grkj.data.model.dos.IsKey
+import com.grkj.data.model.dos.IsLock
+import com.grkj.data.model.dos.IsLockCabinetSlots
+import com.sik.sikcore.date.TimeUtils
 
 /**
  * 硬件数据库查询
@@ -22,4 +27,102 @@ interface HardwareDao {
      */
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     fun addCard(isJobCard: IsJobCard)
+
+    /**
+     * 根据rfid获取钥匙信息
+     */
+    @Query("select * from is_lock where lock_nfc = :rfid")
+    fun getLockInfoByRfid(rfid: String): IsLock
+
+    /**
+     * 根据钥匙rfid获取钥匙信息
+     */
+    @Query("select * from is_key where key_nfc = :rfid")
+    fun getKeyInfoByRfid(rfid: String): IsKey
+
+    /**
+     * 更新钥匙取出
+     */
+    @Query("update is_job_ticket_key set key_id = :keyId,key_status = '1',collect_time = :takeTime,update_time = :takeTime where ticket_id = :ticketId")
+    fun updateKeyTake(ticketId: Long, keyId: Long, takeTime: String)
+
+    /**
+     * 更新钥匙归还
+     */
+    @Query("update is_job_ticket_key set key_id = :keyId,key_status = '2',give_back_time = :giveBackTime,update_time = :giveBackTime where ticket_id = :ticketId")
+    fun updateKeyReturn(ticketId: Long, keyId: Long, giveBackTime: String)
+
+    /**
+     * 更新挂锁取出
+     */
+    @Query("update is_job_ticket_lock set lock_status = '1',update_time = :updateTime where ticket_id = :ticketId and lock_id = :lockId")
+    fun updateLockTake(
+        ticketId: Long?, lockId: Long, updateTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
+
+    /**
+     * 更新点位上锁状态
+     */
+    @Query(
+        "update is_job_ticket_points " +
+                "set point_status = :status," +
+                "lock_id = :lockId," +
+                "locked_by_key_id = :keyId," +
+                "lock_time = :nowTime," +
+                "update_time = :nowTime " +
+                "where ticket_id = :ticketId and point_id = :pointId"
+    )
+    fun updatePointLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int,
+        nowTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
+
+    /**
+     * 更新点位解锁锁状态
+     */
+    @Query(
+        "update is_job_ticket_points " +
+                "set point_status = :status," +
+                "lock_id = :lockId," +
+                "unlocked_by_key_id = :keyId," +
+                "unlock_time = :nowTime," +
+                "update_time = :nowTime " +
+                "where ticket_id = :ticketId and point_id = :pointId"
+    )
+    fun updatePointUnLockData(
+        ticketId: Long,
+        keyId: Long,
+        lockId: Long,
+        pointId: Long,
+        status: Int,
+        nowTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
+
+    /**
+     * 获取所有挂锁数据
+     */
+    @Query("select * from is_lock")
+    fun getAllLockData(): List<IsLock>
+
+    /**
+     * 获取所有钥匙数据
+     */
+    @Query("select * from is_key")
+    fun getAllKeyData(): List<IsKey>
+
+    /**
+     * 获取所有锁仓数据
+     */
+    @Query("select * from is_lock_cabinet_slots")
+    fun getAllLockCabinetSlots(): List<IsLockCabinetSlots>
 }

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

@@ -84,4 +84,10 @@ interface IsolationPointDao {
     )
     fun getAllPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo>
 
+    /**
+     * 根据点位nfc获取点位数据
+     */
+    @Query("select iip.* from is_isolation_point iip left join is_rfid_token irt on iip.rfid_id=irt.rfid_id where irt.rfid = :pointNfc")
+    fun getPointByPointNfc(pointNfc: String?): IsIsolationPoint?
+
 }

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

@@ -22,6 +22,7 @@ import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
+import com.sik.sikcore.date.TimeUtils
 
 /**
  * 作业票数据库操作
@@ -113,6 +114,7 @@ interface JobTicketDao {
         lock_mode as lockMode,
         sop_id as sopId
         from is_job_ticket
+        order by update_time desc 
         limit :size offset :offset
     """
     )
@@ -121,8 +123,12 @@ interface JobTicketDao {
     /**
      * 开始作业
      */
-    @Query("update is_job_ticket set ticket_status = :status where ticket_id = :jobTicketId")
-    fun startJob(jobTicketId: Long?, status: String)
+    @Query("update is_job_ticket set ticket_status = :status,update_time = :updateTime where ticket_id = :jobTicketId")
+    fun startJob(
+        jobTicketId: Long?, status: String, updateTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
 
     /**
      * 根据作业id获取作业人员数据
@@ -241,15 +247,37 @@ interface JobTicketDao {
     /**
      * 更新步骤
      */
-    @Query("update is_job_ticket_step set step_status = :status where step_id = :stepId")
+    @Query("update is_job_ticket_step set step_status = :status,update_time = :updateTime where step_id = :stepId")
     fun updateTicketStepStatus(
         stepId: Long,
-        status: String
+        status: String, updateTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
     )
 
     /**
      * 更新作业状态
      */
-    @Query("update is_job_ticket set ticket_status = :status where ticket_id = :ticketId")
-    fun updateTicketStatus(ticketId: Long, status: String)
+    @Query("update is_job_ticket set ticket_status = :status,update_time = :updateTime where ticket_id = :ticketId")
+    fun updateTicketStatus(
+        ticketId: Long, status: String, updateTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
+
+    /**
+     * 获取工作中的作业数量
+     */
+    @Query("select count(1) from is_job_ticket where ticket_status in ('1','2','3','4') " +
+            "AND (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " +
+            "AND (trim(:lockMode) = '' OR lock_mode like '%'|| :lockMode ||'%')")
+    fun getInProgressJobSize(workstationId: Long?, lockMode: String): Int
+
+    /**
+     * 获取所有作业数量
+     */
+    @Query("select count(1) from is_job_ticket where (:workstationId IS NULL OR trim(:workstationId) = '' OR workstation_id = :workstationId) " +
+            "AND (:startTime IS NULL OR trim(:startTime) = '' OR (create_time >= :startTime OR update_time >= :startTime)) " +
+            "AND (:endTime IS NULL OR trim(:endTime) = '' OR (create_time <= :endTime OR update_time <= :endTime)) ")
+    fun getAllJobSize(workstationId: Long?, startTime: String?, endTime: String?): Int
 }

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

@@ -6,6 +6,7 @@ import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
+import com.sik.sikcore.date.TimeUtils
 
 /**
  * 岗位数据
@@ -45,6 +46,10 @@ interface WorkstationDao {
     /**
      * 根据区域id更新排序
      */
-    @Query("update is_workstation set order_num = :orderNum where workstation_id = :workstationId")
-    fun updateWorkstationOrderNumById(workstationId: Long, orderNum: Int?)
+    @Query("update is_workstation set order_num = :orderNum,update_time= :updateTime where workstation_id = :workstationId")
+    fun updateWorkstationOrderNumById(
+        workstationId: Long, orderNum: Int?, updateTime: String = TimeUtils.nowString(
+            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+        )
+    )
 }

+ 10 - 1
data/src/main/java/com/grkj/data/database/ISCSDatabase.kt

@@ -19,6 +19,13 @@ import com.grkj.data.model.dos.IsJobTicketLock
 import com.grkj.data.model.dos.IsJobTicketPoints
 import com.grkj.data.model.dos.IsJobTicketStep
 import com.grkj.data.model.dos.IsJobTicketUser
+import com.grkj.data.model.dos.IsKey
+import com.grkj.data.model.dos.IsLock
+import com.grkj.data.model.dos.IsLockCabinet
+import com.grkj.data.model.dos.IsLockCabinetSlots
+import com.grkj.data.model.dos.IsLockType
+import com.grkj.data.model.dos.IsLockset
+import com.grkj.data.model.dos.IsLocksetType
 import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.dos.IsSop
 import com.grkj.data.model.dos.IsSopPoints
@@ -38,7 +45,9 @@ import com.sik.sikcore.SIKCore
     entities = [
         IsJobCard::class, SysUserDo::class, SysUserCharacteristicDo::class,
         SysRole::class, SysUserRole::class, IsUserWorkstation::class, IsWorkstation::class, IsIsolationPoint::class, IsRfidToken::class,
-        IsSop::class, IsSopUser::class, IsSopPoints::class, IsJobTicket::class, IsJobTicketKey::class, IsJobTicketLock::class, IsJobTicketPoints::class, IsJobTicketStep::class, IsJobTicketUser::class,
+        IsSop::class, IsSopUser::class, IsSopPoints::class, IsJobTicket::class, IsJobTicketKey::class, IsJobTicketLock::class,
+        IsJobTicketPoints::class, IsJobTicketStep::class, IsJobTicketUser::class,
+        IsKey::class, IsLock::class, IsLockCabinet::class, IsLockCabinetSlots::class, IsLocksetType::class, IsLockset::class,
     ],
     version = ISCSMigrations.VERSION
 )

+ 77 - 0
data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt

@@ -0,0 +1,77 @@
+package com.grkj.data.enums
+
+import com.grkj.data.model.res.CommonDictRes
+import com.grkj.data.model.res.SimpleCommonDictRes
+
+/**
+ * 字典枚举
+ */
+enum class CommonDictDataEnum(val dictKey: String, val commonDictRes: List<CommonDictRes>) {
+    SLOT_STATUS(
+        "slot_status",
+        listOf(SimpleCommonDictRes("可用", "0"), SimpleCommonDictRes("异常", "1"))
+    ),
+    IS_OCCUPIED_STATUS(
+        "isOccupied_status",
+        listOf(SimpleCommonDictRes("是", "1"), SimpleCommonDictRes("否", "0"))
+    ),
+    JOB_CARD_REASON(
+        "job_card_reason",
+        listOf(
+            SimpleCommonDictRes("工卡丢失", "0"),
+            SimpleCommonDictRes("工卡损坏", "1"),
+            SimpleCommonDictRes("-", "2")
+        )
+    ),
+    PADLOCK_REASON(
+        "padlock_reason", listOf(
+            SimpleCommonDictRes("挂锁损坏", "0"),
+            SimpleCommonDictRes("挂锁丢失", "1"),
+            SimpleCommonDictRes("-", "2")
+        )
+    ),
+    PADLOCK_STATUS(
+        "padlock_status", listOf(
+            SimpleCommonDictRes("异常", "0"),
+            SimpleCommonDictRes("正常", "1"),
+        )
+    ),
+    KEY_REASON(
+        "key_reason", listOf(
+            SimpleCommonDictRes("钥匙损坏", "0"),
+            SimpleCommonDictRes("钥匙丢失", "1"),
+            SimpleCommonDictRes("-", "2")
+        )
+    ),
+    KEY_STATUS(
+        "key_status", listOf(
+            SimpleCommonDictRes("异常", "0"),
+            SimpleCommonDictRes("正常", "1"),
+        )
+    ),
+    SWITCH_STATUS(
+        "switch_status", listOf(
+            SimpleCommonDictRes("关闭", "0"),
+            SimpleCommonDictRes("打开", "1"),
+            SimpleCommonDictRes("停止", "2"),
+            SimpleCommonDictRes("未知", "null"),
+        )
+    ),
+    SLOT_TYPE(
+        "slot_type", listOf(
+            SimpleCommonDictRes("钥匙", "0"),
+            SimpleCommonDictRes("锁", "1"),
+        )
+    ),
+    ;
+
+    companion object {
+        /**
+         * 获取字典数据
+         */
+        @JvmStatic
+        fun getCommonDictRes(dictKey: String): List<CommonDictRes> {
+            return values().find { it.dictKey == dictKey }?.commonDictRes ?: listOf()
+        }
+    }
+}

+ 1 - 1
data/src/main/java/com/grkj/data/enums/IsolationPointPowerType.kt → data/src/main/java/com/grkj/data/enums/IsolationPointPowerTypeEnum.kt

@@ -3,7 +3,7 @@ package com.grkj.data.enums
 /**
  * 能量源
  */
-enum class IsolationPointPowerType(val description: String) {
+enum class IsolationPointPowerTypeEnum(val description: String) {
     ZS("注塑"),
     JJG("机加工"),
     ZZ("组装"),

+ 1 - 1
data/src/main/java/com/grkj/data/enums/JobTicketStatusEnums.kt → data/src/main/java/com/grkj/data/enums/JobTicketStatusEnum.kt

@@ -4,7 +4,7 @@ package com.grkj.data.enums
  * 作业状态
  * (0未开始 1待上锁 2进行中 3待解锁 4已解锁 5已结束6已取消)
  */
-enum class JobTicketStatusEnums(val status: String, val description: String) {
+enum class JobTicketStatusEnum(val status: String, val description: String) {
     NOT_START("0", "未开始"),
     SELECT_MEMBER("1", "选择人员"),
     LOCKING("2", "上锁中"),

+ 1 - 1
data/src/main/java/com/grkj/data/enums/RoleEnums.kt → data/src/main/java/com/grkj/data/enums/RoleEnum.kt

@@ -3,7 +3,7 @@ package com.grkj.data.enums
 /**
  * 角色枚举
  */
-enum class RoleEnums(val roleKey: String, val description: String) {
+enum class RoleEnum(val roleKey: String, val description: String) {
     ADMIN("admin", "超级管理员"),
     JTDRAWER("jtdrawer", "作业管理员"),
     JTLOCKER("jtlocker", "作业负责人"),

+ 39 - 0
data/src/main/java/com/grkj/data/model/dos/IsKey.kt

@@ -0,0 +1,39 @@
+package com.grkj.data.model.dos
+
+import androidx.room.*
+
+@Entity(tableName = "is_key")
+class IsKey : BaseBean() {
+
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "key_id")
+    var keyId: Int = 0
+
+    @ColumnInfo(name = "key_code")
+    var keyCode: String = ""
+
+    @ColumnInfo(name = "key_name")
+    var keyName: String = ""
+
+    @ColumnInfo(name = "hardware_id")
+    var hardwareId: Int? = null
+
+    @ColumnInfo(name = "key_nfc")
+    var keyNfc: String? = null
+
+    @ColumnInfo(name = "mac_address")
+    var macAddress: String? = null
+
+    @ColumnInfo(name = "del_flag")
+    var delFlag: String? = "0"
+
+    @ColumnInfo(name = "key_spec")
+    var keySpec: String? = null
+
+    @ColumnInfo(name = "ex_status")
+    var exStatus: String? = null
+
+    @ColumnInfo(name = "ex_remark")
+    var exRemark: String? = null
+
+}

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

@@ -7,7 +7,7 @@ class IsLock : BaseBean() {
 
     @PrimaryKey(autoGenerate = true)
     @ColumnInfo(name = "lock_id")
-    var lockId: Int = 0
+    var lockId: Long = 0
 
     @ColumnInfo(name = "lock_code")
     var lockCode: String = ""
@@ -16,16 +16,16 @@ class IsLock : BaseBean() {
     var lockName: String = ""
 
     @ColumnInfo(name = "lock_type_id")
-    var lockTypeId: Int? = null
+    var lockTypeId: Long? = null
 
     @ColumnInfo(name = "hardware_id")
-    var hardwareId: Int? = null
+    var hardwareId: Long? = null
 
     @ColumnInfo(name = "lock_nfc")
     var lockNfc: String? = null
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "lock_spec")
     var lockSpec: String? = null

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

@@ -30,11 +30,12 @@ class IsLockCabinet : BaseBean() {
     @ColumnInfo(name = "cabinet_picture")
     var cabinetPicture: String? = null
 
+    @JvmField
     @ColumnInfo(name = "is_online")
     var isOnline: String? = null
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "status")
     var status: String? = null

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

@@ -24,6 +24,7 @@ class IsLockCabinetSlots : BaseBean() {
     @ColumnInfo(name = "col")
     var col: String? = null
 
+    @JvmField
     @ColumnInfo(name = "is_occupied")
     var isOccupied: String? = null
 
@@ -31,7 +32,7 @@ class IsLockCabinetSlots : BaseBean() {
     var occupiedBy: Int? = null
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "status")
     var status: String? = null

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

@@ -28,7 +28,7 @@ class IsLockType : BaseBean() {
     var hardwareTypeId: Int = 0
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "parent_type_id")
     var parentTypeId: Int? = null

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

@@ -28,7 +28,7 @@ class IsLockset : BaseBean() {
     var locksetRfid: Int? = null
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "lockset_spec")
     var locksetSpec: String? = null

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

@@ -28,7 +28,7 @@ class IsLocksetType : BaseBean() {
     var materialsTypeId: Int = 0
 
     @ColumnInfo(name = "del_flag")
-    var delFlag: String = "0"
+    var delFlag: String? = "0"
 
     @ColumnInfo(name = "parent_type_id")
     var parentTypeId: Int? = null

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

@@ -64,7 +64,7 @@ class SysRole : BaseBean() {
      * 删除标志(0代表存在 2代表删除)
      */
     @ColumnInfo("del_flag")
-    var delFlag: String? = null
+    var delFlag: String? = "0"
 
     @ColumnInfo("mars_data_scope")
     var marsDataScope: String? = null

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

@@ -39,7 +39,7 @@ class SysUserCharacteristicDo : BaseBean() {
     var orderNum: Int? = null
 
     @ColumnInfo("del_flag")
-    var delFlag: String? = null
+    var delFlag: String? = "0"
 
     @ColumnInfo("mat_rows")
     var matRows: Int? = null

+ 20 - 31
data/src/main/java/com/grkj/data/model/res/CabinetSlotsRes.kt

@@ -4,38 +4,27 @@ package com.grkj.data.model.res
  * 锁柜-仓位返回实体
  */
 data class CabinetSlotsRes(
-    val countId: String,
+    val total: Int,
+    val size: Int,
     val current: Int,
-    val maxLimit: Int,
-    val optimizeCountSql: Boolean?,
-    val orders: List<Order>?,
-    val pages: Int,
     val records: List<CabinetSlotsRecord>,
-    val searchCount: Boolean,
-    val size: Int,
-    val total: Int
-)
-
-data class CabinetSlotsRecord(
-    val cabinetId: Int?,
-    val col: String?,
-    val createBy: String?,
-    val createTime: String?,
-    val delFlag: String?,
-    val isOccupied: String?,
-    val occupiedBy: Int?,
-    val paramMap: Map<String, String>?,
-    val remark: String?,
-    val row: String?,
-    val slotCode: String?,
-    val slotId: Long?,
-    val slotType: String?,
-    val status: String?,
-    val updateBy: String?,
-    val updateTime: String?
 )
 
-data class Order(
-    val asc: Boolean?,
-    val column: String?
-)
+class CabinetSlotsRecord {
+    val cabinetId: Long? = 0
+    val col: String? = ""
+    val createBy: String? = ""
+    val createTime: String? = ""
+    val delFlag: String? = ""
+    val isOccupied: String? = ""
+    val occupiedBy: Int? = 0
+    val paramMap: Map<String, String>? = hashMapOf()
+    val remark: String? = ""
+    val row: String? = ""
+    val slotCode: String? = ""
+    val slotId: Long? = 0
+    val slotType: String? = ""
+    val status: String? = ""
+    val updateBy: String? = ""
+    val updateTime: String? = ""
+}

+ 16 - 13
data/src/main/java/com/grkj/data/model/res/CommonDictRes.kt

@@ -1,15 +1,18 @@
 package com.grkj.data.model.res
 
-data class CommonDictRes(
-    val createBy: String?,
-    val createTime: String?,
-    val default: Boolean?,
-    val dictCode: String?,
-    val dictLabel: String?,
-    val dictSort: String?,
-    val dictType: String?,
-    val dictValue: String?,
-    val isDefault: String?,
-    val listClass: String?,
-    val status: String?
-)
+sealed class CommonDictRes {
+    var createBy: String = ""
+    var createTime: String = ""
+    var default: Boolean = false
+    var dictCode: String = ""
+    open var dictLabel: String = ""
+    var dictSort: String = ""
+    var dictType: String = ""
+    open var dictValue: String = ""
+    var isDefault: String = ""
+    var listClass: String = ""
+    var status: String = ""
+}
+
+class SimpleCommonDictRes(override var dictLabel: String, override var dictValue: String) :
+    CommonDictRes()

+ 9 - 9
data/src/main/java/com/grkj/data/model/res/KeyInfoRes.kt

@@ -3,12 +3,12 @@ package com.grkj.data.model.res
 /**
  * 钥匙信息
  */
-data class KeyInfoRes(
-    val keyId: Long?,
-    val keyCode: String?,
-    val keyName: String?,
-    val hardwareId: Long?,
-    val keyNfc: String?,
-    val macAddress: String?,
-    val delFlag: String?
-)
+class KeyInfoRes {
+    val keyId: Long? = 0
+    val keyCode: String? = ""
+    val keyName: String? = ""
+    val hardwareId: Long? = 0
+    val keyNfc: String? = ""
+    val macAddress: String? = ""
+    val delFlag: String? = ""
+}

+ 8 - 8
data/src/main/java/com/grkj/data/model/res/KeyPageRes.kt

@@ -7,11 +7,11 @@ data class KeyPageRes(
     val records: List<KeyPageItem>
 )
 
-data class KeyPageItem(
-    val keyId: String?,
-    val keyNfc: String?,
-    val macAddress: String?,
-    val keyName: String?,
-    val exStatus: String?,
-    val exRemark: String?
-)
+class KeyPageItem {
+    val keyId: Long? = 0
+    val keyNfc: String? = ""
+    val macAddress: String? = ""
+    val keyName: String? = ""
+    val exStatus: String? = ""
+    val exRemark: String? = ""
+}

+ 9 - 9
data/src/main/java/com/grkj/data/model/res/LockInfoRes.kt

@@ -3,12 +3,12 @@ package com.grkj.data.model.res
 /**
  * 锁信息
  */
-data class LockInfoRes(
-    val lockId: Long?,
-    val lockCode: String?,
-    val lockName: String?,
-    val lockTypeId: Long?,
-    val hardwareId: Long?,
-    val lockNfc: String?,
-    val delFlag: String?
-)
+class LockInfoRes{
+    val lockId: Long? = 0
+    val lockCode: String? = ""
+    val lockName: String? = ""
+    val lockTypeId: Long? = 0
+    val hardwareId: Long? = 0
+    val lockNfc: String? = ""
+    val delFlag: String? = ""
+}

+ 7 - 7
data/src/main/java/com/grkj/data/model/res/LockPageRes.kt

@@ -7,10 +7,10 @@ data class LockPageRes(
     val records: List<LockPageItem>
 )
 
-data class LockPageItem(
-    val lockId: String?,
-    val lockNfc: String?,
-    val lockName: String?,
-    val exStatus: String?,
-    val exRemark: String?
-)
+class LockPageItem{
+    val lockId: String? = ""
+    val lockNfc: String? = ""
+    val lockName: String? = ""
+    val exStatus: String? = ""
+    val exRemark: String? = ""
+}

+ 8 - 13
data/src/main/java/com/grkj/data/model/res/StepDetailRes.kt

@@ -1,21 +1,16 @@
 package com.grkj.data.model.res
 
-data class StepDetailRes(
-    val stepId: Long?,
+class StepDetailRes {
+    val stepId: Long? = 0
 
-    val ticketId: Long?,
+    val ticketId: Long? = 0
 
-    val stepIndex: Int?,
+    val stepIndex: Int? = 0
 
-    val stepStatus: String?,
+    val stepStatus: String? = ""
 
-    val stepContent: String?,
+    val stepContent: String? = ""
 
-    val androidStepContent: String?,
+    val androidStepContent: String? = ""
 
-    val lockNum: Int?,
-
-    val userNum: Int?,
-
-    val conflictJobNum: Int?
-)
+}

+ 4 - 3
data/src/main/java/com/grkj/data/repository/IHardwareRepository.kt

@@ -3,6 +3,7 @@ package com.grkj.data.repository
 import com.grkj.data.model.req.LockPointUpdateReq
 import com.grkj.data.model.req.LockTakeUpdateReq
 import com.grkj.data.model.res.CabinetSlotsRes
+import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.res.KeyInfoRes
 import com.grkj.data.model.res.KeyPageRes
 import com.grkj.data.model.res.LockInfoRes
@@ -31,13 +32,13 @@ interface IHardwareRepository {
     /**
      * 上报钥匙取出
      */
-    fun updateKeyTake(taskCode: Long, keyNfc: String, serialNo: String, callback: (Boolean) -> Unit)
+    fun updateKeyTake(ticketId: Long, keyNfc: String, serialNo: String, callback: (Boolean) -> Unit)
 
     /**
      * 上报钥匙归还
      */
     fun updateKeyReturn(
-        taskCode: Long,
+        ticketId: Long,
         keyNfc: String,
         serialNo: String,
         callback: (Boolean, String) -> Unit
@@ -74,7 +75,7 @@ interface IHardwareRepository {
     /**
      * 获取字典数据
      */
-    fun <T> getDictData(dictKey: String, callback: (List<T>) -> Unit)
+    fun getDictData(dictKey: String, callback: (List<CommonDictRes>) -> Unit)
 
     /**
      * 创建卡片

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

@@ -131,4 +131,19 @@ interface IJobTicketRepository {
      * 结束作业
      */
     fun finishJob(ticketId: Long)
+
+    /**
+     * 更新作业状态
+     */
+    fun updateTicketDataStatus(ticketId: Long, ticketStatus: Int)
+
+    /**
+     * 获取正在进行中的作业数量
+     */
+    fun getInProgressJobSize(workstationId: Long?, selectedLockMode: String): Int
+
+    /**
+     * 获取全部作业数量
+     */
+    fun getAllJobSize(workstationId: Long?, startTime: String, endTime: String): Int
 }

+ 107 - 15
data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt

@@ -1,18 +1,26 @@
 package com.grkj.data.repository.impl
 
 import com.grkj.data.dao.HardwareDao
+import com.grkj.data.dao.IsolationPointDao
 import com.grkj.data.database.ISCSDatabase
+import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsJobCard
 import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.model.req.LockPointUpdateReq
 import com.grkj.data.model.req.LockTakeUpdateReq
+import com.grkj.data.model.res.CabinetSlotsRecord
 import com.grkj.data.model.res.CabinetSlotsRes
+import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.res.KeyInfoRes
+import com.grkj.data.model.res.KeyPageItem
 import com.grkj.data.model.res.KeyPageRes
 import com.grkj.data.model.res.LockInfoRes
+import com.grkj.data.model.res.LockPageItem
 import com.grkj.data.model.res.LockPageRes
 import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.shared.utils.Pinyin4jUtil
+import com.sik.sikcore.data.BeanUtils
+import com.sik.sikcore.date.TimeUtils
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -20,7 +28,10 @@ import javax.inject.Singleton
  * 硬件仓储
  */
 @Singleton
-class HardwareRepository @Inject constructor(val hardwareDao: HardwareDao) : IHardwareRepository {
+class HardwareRepository @Inject constructor(
+    val hardwareDao: HardwareDao,
+    val isolationPointDao: IsolationPointDao
+) : IHardwareRepository {
 
     /**
      * 获取锁信息
@@ -29,7 +40,19 @@ class HardwareRepository @Inject constructor(val hardwareDao: HardwareDao) : IHa
         rfid: String,
         callback: (LockInfoRes?) -> Unit
     ) {
+        callback(getLockInfo(rfid))
+    }
 
+    /**
+     * 获取锁信息
+     */
+    private fun getLockInfo(rfid: String): LockInfoRes? {
+        val isLock = hardwareDao.getLockInfoByRfid(rfid)
+        var lockInfoRes: LockInfoRes? = null
+        isLock?.let {
+            lockInfoRes = BeanUtils.convert(it)
+        }
+        return lockInfoRes
     }
 
     /**
@@ -39,65 +62,134 @@ class HardwareRepository @Inject constructor(val hardwareDao: HardwareDao) : IHa
         rfid: String,
         callback: (KeyInfoRes?) -> Unit
     ) {
+        callback(getKeyInfo(rfid))
+    }
 
+    private fun getKeyInfo(rfid: String): KeyInfoRes? {
+        val isKey = hardwareDao.getKeyInfoByRfid(rfid)
+        var keyInfoRes: KeyInfoRes? = null
+        isKey?.let {
+            keyInfoRes = BeanUtils.convert(it)
+        }
+        return keyInfoRes
     }
 
     /**
      * 是否可以归还
      */
     override fun canReturn(): Boolean {
-        TODO("Not yet implemented")
+        return true
     }
 
     override fun updateKeyTake(
-        taskCode: Long,
+        ticketId: Long,
         keyNfc: String,
         serialNo: String,
         callback: (Boolean) -> Unit
     ) {
-        TODO("Not yet implemented")
+        val keyInfo = getKeyInfo(keyNfc)
+        keyInfo?.keyId?.let {
+            hardwareDao.updateKeyTake(
+                ticketId,
+                keyInfo.keyId,
+                TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+            )
+            callback(true)
+        } ?: run {
+            callback(false)
+        }
     }
 
     override fun updateKeyReturn(
-        taskCode: Long,
+        ticketId: Long,
         keyNfc: String,
         serialNo: String,
         callback: (Boolean, String) -> Unit
     ) {
-        TODO("Not yet implemented")
+        val keyInfo = getKeyInfo(keyNfc)
+        keyInfo?.keyId?.let {
+            hardwareDao.updateKeyReturn(
+                ticketId,
+                keyInfo.keyId,
+                TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+            )
+            callback(true, "")
+        } ?: run {
+            callback(false, "{\"msg\":\"作业票数据丢失啦!\",\"code\":500}")
+        }
     }
 
     override fun updateLockPointBatch(
-        reqs: MutableList<LockPointUpdateReq>,
+        lockPointUpdateData: MutableList<LockPointUpdateReq>,
         callback: (Boolean, String) -> Unit
     ) {
-        TODO("Not yet implemented")
+        lockPointUpdateData.forEach { info ->
+            val keyInfo = getKeyInfo(info.keyNfc ?: "")
+            val lockInfo = getLockInfo(info.lockNfc ?: "")
+            val pointInfo = isolationPointDao.getPointByPointNfc(info.pointNfc)
+            if (info.target == 0) {
+                hardwareDao.updatePointLockData(
+                    info.ticketId ?: 0,
+                    keyInfo?.keyId ?: 0,
+                    lockInfo?.lockId ?: 0,
+                    pointInfo?.pointId ?: 0,
+                    (info.target ?: -1) + 1
+                )
+            } else {
+                hardwareDao.updatePointUnLockData(
+                    info.ticketId ?: 0,
+                    keyInfo?.keyId ?: 0,
+                    lockInfo?.lockId ?: 0,
+                    pointInfo?.pointId ?: 0,
+                    (info.target ?: -1) + 1
+                )
+            }
+        }
     }
 
     override fun updateLockTake(
         lockTakeList: MutableList<LockTakeUpdateReq>,
         callback: (Boolean) -> Unit
     ) {
-        TODO("Not yet implemented")
+        lockTakeList.forEach { lockTakeInfo ->
+            lockTakeInfo.lockNfc?.let {
+                val lockInfo = getLockInfo(it)
+                lockInfo?.lockId?.let { lockId ->
+                    hardwareDao.updateLockTake(lockTakeInfo.ticketId, lockId)
+                }
+            }
+        }
+        callback(true)
     }
 
     override fun getIsLockCabinetSlotsPage(callback: (CabinetSlotsRes?) -> Unit) {
-        TODO("Not yet implemented")
+        val allLockCabinetSlots =
+            hardwareDao.getAllLockCabinetSlots().map { BeanUtils.convert<CabinetSlotsRecord>(it) }
+        callback(
+            CabinetSlotsRes(
+                allLockCabinetSlots.size,
+                allLockCabinetSlots.size,
+                0,
+                allLockCabinetSlots
+            )
+        )
     }
 
     override fun getIsLockPage(callback: (LockPageRes?) -> Unit) {
-        TODO("Not yet implemented")
+        val allLockData = hardwareDao.getAllLockData().map { BeanUtils.convert<LockPageItem>(it) }
+        callback(LockPageRes(allLockData.size, allLockData.size, 0, allLockData))
     }
 
     override fun getIsKeyPage(callback: (KeyPageRes?) -> Unit) {
-        TODO("Not yet implemented")
+        val allKeyData = hardwareDao.getAllKeyData().map { BeanUtils.convert<KeyPageItem>(it) }
+        callback(KeyPageRes(allKeyData.size, allKeyData.size, 0, allKeyData))
     }
 
-    override fun <T> getDictData(
+    override fun getDictData(
         dictKey: String,
-        callback: (List<T>) -> Unit
+        callback: (List<CommonDictRes>) -> Unit
     ) {
-        TODO("Not yet implemented")
+        callback(CommonDictDataEnum.getCommonDictRes(dictKey))
     }
 
     override fun addCard(userId: Long, userData: AddUserDataVo) {

+ 37 - 16
data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt

@@ -1,10 +1,10 @@
 package com.grkj.data.repository.impl
 
 import com.grkj.data.dao.JobTicketDao
-import com.grkj.data.database.ISCSDatabase
-import com.grkj.data.enums.JobTicketStatusEnums
+import com.grkj.data.enums.JobTicketStatusEnum
+import com.grkj.data.enums.LockModeEnum
 import com.grkj.data.enums.LockStepEnum
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsJobTicket
 import com.grkj.data.model.dos.IsJobTicketKey
 import com.grkj.data.model.dos.IsJobTicketLock
@@ -23,6 +23,7 @@ import com.grkj.data.model.vo.JobTicketManageVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
+import com.sik.sikcore.data.BeanUtils
 import javax.inject.Inject
 import javax.inject.Singleton
 
@@ -30,7 +31,8 @@ import javax.inject.Singleton
  * 作业票实现
  */
 @Singleton
-class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) : IJobTicketRepository {
+class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
+    IJobTicketRepository {
     override fun createJob(
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
@@ -51,6 +53,8 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobTicketPoint.ticketId = ticketId
             isJobTicketPoint.pointId = it.pointId
             isJobTicketPoint.workstationId = workstationId
+            isJobTicketPoint.pointStatus =
+                if (LockModeEnum.isUnLockFirst(lockMode.toString())) "1" else "0"
             isJobTicketPoint
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints)
@@ -59,7 +63,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTLOCKER.roleKey
             isJobticketUser
         }
         val ticketColockerUsers = selectedColockerData.map {
@@ -67,7 +71,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTCOLOCKER.roleKey
             isJobticketUser
         }
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
@@ -90,10 +94,10 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
         }
         jobTicketDao.saveIsJobTicketLock(ticketLocks)
         val ticketStep = mutableListOf<IsJobTicketStep>().apply {
-            lockMode?.split(",")?.forEachIndexed { index, stepType ->
+            lockMode?.split(",")?.forEach { stepType ->
                 val isJobTicketStep = IsJobTicketStep()
                 isJobTicketStep.ticketId = ticketId
-                isJobTicketStep.stepIndex = index
+                isJobTicketStep.stepIndex = stepType.toInt()
                 isJobTicketStep.stepContent =
                     LockStepEnum.values().find { it.type == stepType.toInt() }?.description
                 isJobTicketStep.androidStepContent =
@@ -131,6 +135,8 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobTicketPoint.ticketId = ticketId
             isJobTicketPoint.pointId = it.pointId
             isJobTicketPoint.workstationId = workstationId
+            isJobTicketPoint.pointStatus =
+                if (LockModeEnum.isUnLockFirst(lockMode.toString())) "1" else "0"
             isJobTicketPoint
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints)
@@ -139,7 +145,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTLOCKER.roleKey
             isJobticketUser
         }
         val ticketColockerUsers = selectedColockerData.map {
@@ -147,7 +153,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTCOLOCKER.roleKey
             isJobticketUser
         }
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
@@ -208,7 +214,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
     }
 
     override fun startJob(jobTicketId: Long?) {
-        jobTicketDao.startJob(jobTicketId, JobTicketStatusEnums.SELECT_MEMBER.status)
+        jobTicketDao.startJob(jobTicketId, JobTicketStatusEnum.SELECT_MEMBER.status)
     }
 
     override fun getTicketUsersByTicketId(ticketId: Long): List<UserManageVo> {
@@ -259,7 +265,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTLOCKER.roleKey
             isJobticketUser
         }
         val ticketColockerUsers = selectedColockerData.map {
@@ -267,7 +273,7 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
             isJobticketUser.userId = it.userId
             isJobticketUser.ticketId = ticketId
             isJobticketUser.userName = it.userName
-            isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
+            isJobticketUser.userRole = RoleEnum.JTCOLOCKER.roleKey
             isJobticketUser
         }
         jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
@@ -281,7 +287,10 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
         ticketId: Long,
         callback: (List<StepDetailRes>?) -> Unit
     ) {
-        TODO("Not yet implemented")
+        val stepDataList = jobTicketDao.getJobTicketStepDataByTicketId(ticketId)
+        callback(stepDataList.map {
+            BeanUtils.convert<StepDetailRes>(it)
+        })
     }
 
     override fun cancelJob(ticketId: Long) {
@@ -290,10 +299,22 @@ class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) :
         jobTicketDao.deleteJobTicketPointsByTicketIds(listOf(ticketId))
         jobTicketDao.deleteJobTicketStepByTicketIds(listOf(ticketId))
         jobTicketDao.deleteJobTicketUserByTicketIds(listOf(ticketId))
-        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnums.CANCELED.status)
+        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnum.CANCELED.status)
     }
 
     override fun finishJob(ticketId: Long) {
-        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnums.FINISHED.status)
+        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnum.FINISHED.status)
+    }
+
+    override fun updateTicketDataStatus(ticketId: Long, ticketStatus: Int) {
+        jobTicketDao.updateTicketStatus(ticketId, ticketStatus.toString())
+    }
+
+    override fun getAllJobSize(worstationId: Long?, startTime: String, endTime: String): Int {
+        return jobTicketDao.getAllJobSize(worstationId,startTime,endTime)
+    }
+
+    override fun getInProgressJobSize(workstationId: Long?, selectedLockMode: String): Int {
+        return jobTicketDao.getInProgressJobSize(workstationId,selectedLockMode)
     }
 }

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

@@ -1,8 +1,7 @@
 package com.grkj.data.repository.impl
 
 import com.grkj.data.dao.IsSopDao
-import com.grkj.data.database.ISCSDatabase
-import com.grkj.data.enums.RoleEnums
+import com.grkj.data.enums.RoleEnum
 import com.grkj.data.model.dos.IsSop
 import com.grkj.data.model.dos.IsSopPoints
 import com.grkj.data.model.dos.IsSopUser
@@ -52,7 +51,7 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao): ISopRepository
             val isSopUser = IsSopUser()
             isSopUser.userId = it.userId
             isSopUser.userName = it.userName
-            isSopUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isSopUser.userRole = RoleEnum.JTLOCKER.roleKey
             isSopUser.sopId = sopId
             isSopUser
         }
@@ -60,7 +59,7 @@ class SopRepository @Inject constructor(val isSopDao: IsSopDao): ISopRepository
             val isSopUser = IsSopUser()
             isSopUser.userId = it.userId
             isSopUser.userName = it.userName
-            isSopUser.userRole = RoleEnums.JTCOLOCKER.roleKey
+            isSopUser.userRole = RoleEnum.JTCOLOCKER.roleKey
             isSopUser.sopId = sopId
             isSopUser
         }

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

@@ -11,7 +11,6 @@ import com.grkj.data.model.local.WorkTicketGet
 import com.grkj.data.model.local.WorkTicketSend
 import com.grkj.data.model.local.WorkTicketSend.LockListBO
 import com.grkj.data.model.req.LockPointUpdateReq
-import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.res.TicketDetailRes
 import com.grkj.shared.config.Constants
 import com.grkj.ui_base.R
@@ -155,10 +154,10 @@ object BleBusinessManager {
     /**
      * 处理虚拟钥匙取出,如果作业的全部点位已经上锁更新钥匙的状态使用
      */
-    fun handleVirtualKeyGive(taskCode: Long, keyNfc: String, done: () -> Unit) {
+    fun handleVirtualKeyGive(ticketId: Long, keyNfc: String, done: () -> Unit) {
         // 上报钥匙取出
         RepositoryManager.hardwareRepo.updateKeyTake(
-            taskCode,
+            ticketId,
             keyNfc,
             SIKCore.getApplication().serialNo()
         ) { isSuccess ->
@@ -171,19 +170,19 @@ object BleBusinessManager {
     /**
      * 处理虚拟钥匙归还,如果作业的全部点位已经上锁更新钥匙的状态使用
      */
-    fun handleVirtualKeyReturn(taskCode: Long, keyNfc: String, done: () -> Unit) {
+    fun handleVirtualKeyReturn(ticketId: Long, keyNfc: String, done: () -> Unit) {
         // 上报钥匙归还
         RepositoryManager.hardwareRepo.updateKeyReturn(
-            taskCode, keyNfc, SIKCore.getApplication().serialNo()
+            ticketId, keyNfc, SIKCore.getApplication().serialNo()
         ) { isSuccess, msg ->
             if (!isSuccess && msg != CommonUtils.getStr(R.string.ticket_lost)
             ) {
                 SPUtils.saveUpdateKeyReturn(
-                    SIKCore.getApplication(), UpdateKeyReturn(taskCode, keyNfc)
+                    SIKCore.getApplication(), UpdateKeyReturn(ticketId, keyNfc)
                 )
             } else {
                 done()
-                UpdateTicketProgressEvent.sendUpdateTicketProgressEvent(taskCode)
+                UpdateTicketProgressEvent.sendUpdateTicketProgressEvent(ticketId)
             }
         }
     }
@@ -418,11 +417,11 @@ object BleBusinessManager {
             val keyPage = DataBusiness.getKeyPage()
             // —— 并行加载字典(或按需串行也行) ——
             val slotStatus =
-                async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_SLOT_STATUS) }
+                async { DataBusiness.fetchDict(DictConstants.KEY_SLOT_STATUS) }
             val keyStatus =
-                async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_KEY_STATUS) }
+                async { DataBusiness.fetchDict(DictConstants.KEY_KEY_STATUS) }
             val slotType =
-                async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_SLOT_TYPE) }
+                async { DataBusiness.fetchDict(DictConstants.KEY_SLOT_TYPE) }
 
             // 等待字典加载完成
             val slotStatusList = slotStatus.await()

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

@@ -1,11 +1,9 @@
 package com.grkj.ui_base.business
 
 import com.grkj.data.di.RepositoryManager
-import com.grkj.data.repository.impl.HardwareRepository
 import com.grkj.data.model.res.CabinetSlotsRes
 import com.grkj.data.model.res.KeyPageRes
 import com.grkj.data.model.res.LockPageRes
-import com.grkj.data.repository.IHardwareRepository
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
 
@@ -34,7 +32,7 @@ object DataBusiness {
     }
 
     // 2. 把原本同步的字典查询留在 IO 线程
-    suspend fun <T> fetchDict(key: String): List<T> =suspendCancellableCoroutine { cont ->
+    suspend fun fetchDict(key: String): List<com.grkj.data.model.res.CommonDictRes> =suspendCancellableCoroutine { cont ->
         RepositoryManager.hardwareRepo.getDictData(key) { dictData ->
             cont.resume(dictData)
         }

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

@@ -2,11 +2,8 @@ package com.grkj.ui_base.business
 
 import com.clj.fastble.BleManager
 import com.grkj.data.di.RepositoryManager
-import com.grkj.data.repository.impl.HardwareRepository
 import com.grkj.data.model.local.DeviceTakeUpdate
 import com.grkj.data.model.req.LockTakeUpdateReq
-import com.grkj.data.model.res.CommonDictRes
-import com.grkj.data.repository.IHardwareRepository
 import com.grkj.ui_base.R
 import com.grkj.ui_base.data.DictConstants
 import com.grkj.ui_base.utils.CommonUtils
@@ -158,7 +155,7 @@ object ModbusBusinessManager {
         callBack: (Pair<Byte, DockBean.KeyBean?>?, MutableMap<Byte, MutableList<DockBean.LockBean>>) -> Unit
     ) {
         // 你可以改成接收 CoroutineScope 或者直接在全局 Scope 启动
-        ThreadUtils.runOnMain {
+        ThreadUtils.runOnIO {
             LoadingEvent.sendLoadingEvent(CommonUtils.getStr(R.string.check_key_and_lock))
             try {
                 // —— 串行请求1 & 2 ——
@@ -167,13 +164,13 @@ object ModbusBusinessManager {
 
                 // —— 并行加载字典(或按需串行也行) ——
                 val lockStatus =
-                    async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_PAD_LOCK_STATUS) }
+                    async { DataBusiness.fetchDict(DictConstants.KEY_PAD_LOCK_STATUS) }
                 val slotStatus =
-                    async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_SLOT_STATUS) }
+                    async { DataBusiness.fetchDict(DictConstants.KEY_SLOT_STATUS) }
                 val slotType =
-                    async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_SLOT_TYPE) }
+                    async { DataBusiness.fetchDict(DictConstants.KEY_SLOT_TYPE) }
                 val keyStatus =
-                    async { DataBusiness.fetchDict<CommonDictRes>(DictConstants.KEY_KEY_STATUS) }
+                    async { DataBusiness.fetchDict(DictConstants.KEY_KEY_STATUS) }
 
                 // 等待字典加载完成
                 val lockStatusList = lockStatus.await()
@@ -200,7 +197,7 @@ object ModbusBusinessManager {
                         R.string.lock_is_not_enough
                     )
                     callBack(null, mutableMapOf())
-                    return@runOnMain
+                    return@runOnIO
                 }
 
                 // —— 如果需钥匙,再请求并计算 ——

+ 6 - 3
ui-base/src/main/java/com/grkj/ui_base/dialog/LoadingDialog.kt

@@ -8,6 +8,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.thread.ThreadUtils
 
 class LoadingDialog : OnBindView<CustomDialog>(R.layout.common_dialog_loading_progress) {
     private lateinit var binding: CommonDialogLoadingProgressBinding
@@ -35,9 +36,11 @@ class LoadingDialog : OnBindView<CustomDialog>(R.layout.common_dialog_loading_pr
 
         @JvmStatic
         fun show(msg: String? = null) {
-            loadingDialog = CustomDialog.show(LoadingDialog().apply {
-                setMessage(msg)
-            }, CustomDialog.ALIGN.CENTER)
+            ThreadUtils.runOnMain {
+                loadingDialog = CustomDialog.show(LoadingDialog().apply {
+                    setMessage(msg)
+                }, CustomDialog.ALIGN.CENTER)
+            }
         }
 
         @JvmStatic

+ 13 - 10
ui-base/src/main/java/com/grkj/ui_base/dialog/TipDialog.kt

@@ -8,6 +8,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikcore.SIKCore
+import com.sik.sikcore.thread.ThreadUtils
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
@@ -169,16 +170,18 @@ class TipDialog : OnBindView<CustomDialog>(R.layout.dialog_tip) {
             onConfirmClick: () -> Unit = {},
             onCancelClick: () -> Unit = {}
         ) {
-            CustomDialog.show(TipDialog().apply {
-                setTitle(title)
-                setMessage(msg)
-                setDialogType(dialogType)
-                showConfirm(showConfirm)
-                showCancel(showCancel)
-                setCountDownTime(countDownTime)
-                setOnConfirmClickListener(onConfirmClick)
-                setOnCancelClickListener(onCancelClick)
-            }, CustomDialog.ALIGN.CENTER)
+            ThreadUtils.runOnMain {
+                CustomDialog.show(TipDialog().apply {
+                    setTitle(title)
+                    setMessage(msg)
+                    setDialogType(dialogType)
+                    showConfirm(showConfirm)
+                    showCancel(showCancel)
+                    setCountDownTime(countDownTime)
+                    setOnConfirmClickListener(onConfirmClick)
+                    setOnCancelClickListener(onCancelClick)
+                }, CustomDialog.ALIGN.CENTER)
+            }
         }
     }
 }