Ver Fonte

refactor(更新)
- hilt集成

周文健 há 5 meses atrás
pai
commit
ff87d4a123
80 ficheiros alterados com 1167 adições e 286 exclusões
  1. 4 0
      app/build.gradle.kts
  2. 10 0
      app/src/main/java/com/grkj/iscs/ISCSApplication.kt
  3. 12 3
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  4. 4 2
      app/src/main/java/com/grkj/iscs/features/login/viewmodel/LoginViewModel.kt
  5. 27 0
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  6. 6 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectMemberFragment.kt
  7. 6 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt
  8. 2 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataManageHomeFragment.kt
  9. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  10. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  11. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  12. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt
  13. 2 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionManageHomeFragment.kt
  14. 2 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/HardwareManageHomeFragment.kt
  15. 6 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  16. 0 9
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeViewModel.kt
  17. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  18. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  19. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  20. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  21. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  22. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  23. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/InProgressJobManageFragment.kt
  24. 205 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  25. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageFragment.kt
  26. 2 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageHomeFragment.kt
  27. 5 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/SopManageFragment.kt
  28. 2 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoHomeFragment.kt
  29. 12 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt
  30. 5 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectMemberViewModel.kt
  31. 4 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectPointViewModel.kt
  32. 9 8
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt
  33. 5 3
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt
  34. 10 10
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  35. 4 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/WorkstationManageViewModel.kt
  36. 10 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt
  37. 155 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt
  38. 4 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobManageViewModel.kt
  39. 8 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  40. 8 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopJobViewModel.kt
  41. 4 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopManageViewModel.kt
  42. 8 4
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  43. 9 0
      app/src/main/res/drawable/bg_job_execute_step.xml
  44. 7 0
      app/src/main/res/drawable/bg_job_execute_step_index.xml
  45. 13 0
      app/src/main/res/drawable/icon_job_execute_arrow_right.xml
  46. 7 0
      app/src/main/res/drawable/icon_ticket_colock.xml
  47. 3 3
      app/src/main/res/layout/fragment_job_execute.xml
  48. 30 6
      app/src/main/res/layout/item_job_execute_point.xml
  49. 54 0
      app/src/main/res/layout/item_job_execute_step.xml
  50. 5 1
      app/src/main/res/navigation/nav_job_manage.xml
  51. 1 0
      app/src/main/res/values/colors.xml
  52. 1 0
      build.gradle.kts
  53. 3 0
      data/build.gradle.kts
  54. 33 11
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  55. 26 0
      data/src/main/java/com/grkj/data/di/AppEntryPoint.kt
  56. 70 0
      data/src/main/java/com/grkj/data/di/DatabaseModule.kt
  57. 38 0
      data/src/main/java/com/grkj/data/di/RepositoryManager.kt
  58. 75 0
      data/src/main/java/com/grkj/data/di/RepositoryModule.kt
  59. 15 0
      data/src/main/java/com/grkj/data/enums/LockModeEnum.kt
  60. 5 1
      data/src/main/java/com/grkj/data/model/vo/IsJobTicketStepDataVo.kt
  61. 25 0
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  62. 0 14
      data/src/main/java/com/grkj/data/repository/IStepRepository.kt
  63. 4 12
      data/src/main/java/com/grkj/data/repository/impl/HardwareRepository.kt
  64. 4 12
      data/src/main/java/com/grkj/data/repository/impl/IsolationPointRepository.kt
  65. 52 9
      data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt
  66. 4 12
      data/src/main/java/com/grkj/data/repository/impl/RfidTokenRepository.kt
  67. 4 12
      data/src/main/java/com/grkj/data/repository/impl/RoleRepository.kt
  68. 4 12
      data/src/main/java/com/grkj/data/repository/impl/SopRepository.kt
  69. 0 25
      data/src/main/java/com/grkj/data/repository/impl/StepRepository.kt
  70. 7 15
      data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt
  71. 4 12
      data/src/main/java/com/grkj/data/repository/impl/WorkstationRepository.kt
  72. 4 0
      shared/build.gradle.kts
  73. 4 0
      sync/build.gradle.kts
  74. 4 0
      ui-base/build.gradle.kts
  75. 8 28
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  76. 6 5
      ui-base/src/main/java/com/grkj/ui_base/business/DataBusiness.kt
  77. 3 7
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  78. 5 0
      ui-base/src/main/java/com/grkj/ui_base/data/EventConstants.kt
  79. 23 0
      ui-base/src/main/java/com/grkj/ui_base/utils/event/RFIDCardReadEvent.kt
  80. 6 10
      ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

+ 4 - 0
app/build.gradle.kts

@@ -2,6 +2,8 @@ plugins {
     alias(libs.plugins.android.application)
     alias(libs.plugins.kotlin.android)
     id("org.jetbrains.kotlin.kapt")
+    id("com.google.devtools.ksp")
+    id("com.google.dagger.hilt.android")
 }
 
 android {
@@ -83,6 +85,8 @@ dependencies {
     implementation(libs.kotlinx.serialization.json)
     implementation(libs.sik.camera)
     implementation("com.github.loper7:DateTimePicker:0.6.3")
+    implementation("com.google.dagger:hilt-android:2.56.2")
+    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
     implementation(project(":sync"))
     implementation(project(":ui-base"))
     implementation(project(":data"))

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

@@ -3,6 +3,8 @@ package com.grkj.iscs
 import android.R
 import android.app.Application
 import android.content.Context
+import com.grkj.data.di.RepositoryManager
+import com.grkj.ui_base.utils.modbus.ModBusController
 import com.kongzue.dialogx.DialogX
 import com.scwang.smart.refresh.footer.ClassicsFooter
 import com.scwang.smart.refresh.header.ClassicsHeader
@@ -13,11 +15,14 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.DefaultRefreshFooterCreator
 import com.scwang.smart.refresh.layout.listener.DefaultRefreshHeaderCreator
 import com.sik.sikcore.SIKCore
+import com.sik.sikcore.thread.ThreadUtils
+import dagger.hilt.android.HiltAndroidApp
 
 
 /**
  * 启动入口
  */
+@HiltAndroidApp
 class ISCSApplication : Application() {
     /**
      * 程序创建
@@ -28,6 +33,11 @@ class ISCSApplication : Application() {
         SIKCore.init(this)
         //todo 模拟器不支持
 //        ArcSoftUtil.checkActiveStatus(this)
+
+        ThreadUtils.runOnIO {
+            ModBusController.initDevicesStatus()
+            RepositoryManager.init(this@ISCSApplication)
+        }
     }
 
     //static 代码段可以防止内存泄露

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

@@ -5,6 +5,7 @@ import android.graphics.Bitmap
 import android.view.InputDevice
 import android.view.KeyEvent
 import android.widget.LinearLayout
+import androidx.activity.viewModels
 import androidx.core.view.isVisible
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
@@ -33,12 +34,14 @@ import com.grkj.ui_base.utils.extension.toHexStrings
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikimage.ImageConvertUtils
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 登录页
  */
+@AndroidEntryPoint
 class LoginActivity : BaseActivity<ActivityLoginBinding>() {
-    private val viewModel: LoginViewModel by lazy { ViewModelProvider(this)[LoginViewModel::class] }
+    private val viewModel: LoginViewModel by viewModels()
 
     //登录方式列表
     private val loginMenuList: MutableList<LoginMenuEntity> = mutableListOf()
@@ -144,7 +147,10 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
         FingerprintUtil.start()
         FingerprintUtil.setScanListener(object : FingerprintUtil.OnScanListener {
             override fun onScan(bitmap: Bitmap) {
-                LoadingEvent.sendLoadingEvent(CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),true)
+                LoadingEvent.sendLoadingEvent(
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),
+                    true
+                )
                 viewModel.loginWithFingerprint(ImageConvertUtils.bitmapToBase64(bitmap).toString())
                     .observe(this@LoginActivity) { isSuccess ->
                         LoadingEvent.sendLoadingEvent()
@@ -172,7 +178,10 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
                 logger.info("Swipe card login Origin: $cardNo")
                 cardNo = cardNo.toLong().toByteArrays().toHexStrings(false)
                 logger.info("Swipe card login: $cardNo")
-                LoadingEvent.sendLoadingEvent(CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),true)
+                LoadingEvent.sendLoadingEvent(
+                    CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),
+                    true
+                )
                 viewModel.loginWithCard(cardNo).observe(this) { isSuccess ->
                     LoadingEvent.sendLoadingEvent()
                     if (isSuccess) {

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

@@ -5,13 +5,15 @@ import androidx.lifecycle.liveData
 import com.grkj.data.repository.impl.UserRepository
 import com.grkj.data.repository.IUserRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 登录界面模型
  */
-class LoginViewModel : BaseViewModel() {
-    private val userRepository: IUserRepository by lazy { UserRepository.instance }
+@HiltViewModel
+class LoginViewModel @Inject constructor(val userRepository: IUserRepository) : BaseViewModel() {
 
     /**
      * 用户名登录

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

@@ -1,7 +1,10 @@
 package com.grkj.iscs.features.main.activity
 
+import android.view.InputDevice
+import android.view.KeyEvent
 import android.view.Menu
 import android.view.View
+import androidx.activity.viewModels
 import androidx.core.view.get
 import androidx.core.view.isNotEmpty
 import androidx.core.view.isVisible
@@ -9,15 +12,22 @@ import com.grkj.data.data.MainDomainData
 import com.grkj.data.model.local.TabConfig
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.ActivityMainBinding
+import com.grkj.iscs.features.main.viewmodel.MainViewModel
 import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseActivity
 import com.grkj.ui_base.data.EventConstants
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import com.grkj.ui_base.utils.extension.toByteArrays
+import com.grkj.ui_base.utils.extension.toHexStrings
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 首页
  */
+@AndroidEntryPoint
 class MainActivity() : BaseActivity<ActivityMainBinding>() {
+    private val viewModel: MainViewModel by viewModels()
+    private var cardNo: String = ""
     private val tabConfigs = listOf(
         TabConfig(
             View.generateViewId(),
@@ -105,4 +115,21 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
             }
         }
     }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_UP && event.source == InputDevice.SOURCE_KEYBOARD) {
+            // 检测到回车开始处理
+            if (event.keyCode == 66) {
+                logger.info("Swipe card login Origin: $cardNo")
+                cardNo = cardNo.toLong().toByteArrays().toHexStrings(false)
+                logger.info("Swipe card login: $cardNo")
+
+                // 重置cardNo
+                cardNo = ""
+                return super.dispatchKeyEvent(event)
+            }
+            cardNo += event.keyCharacterMap.getDisplayLabel(event.keyCode)
+        }
+        return super.dispatchKeyEvent(event)
+    }
 }

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

@@ -1,7 +1,9 @@
 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
@@ -20,12 +22,15 @@ 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
+import kotlin.getValue
 
 /**
  * 选择人员界面
  */
+@AndroidEntryPoint
 class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
-    private val viewModel: SelectMemberViewModel by lazy { ViewModelProvider(this)[SelectMemberViewModel::class] }
+    private val viewModel: SelectMemberViewModel by viewModels()
     private var selectedLockerData: MutableList<UserManageVo> = mutableListOf()
     private var selectedColockerData: MutableList<UserManageVo> = mutableListOf()
     private var isLockerSelect = true

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

@@ -1,5 +1,7 @@
 package com.grkj.iscs.features.main.fragment.common
 
+import androidx.activity.viewModels
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
@@ -14,12 +16,15 @@ import com.grkj.iscs.features.main.viewmodel.common.SelectPointViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 选择点位界面
  */
+@AndroidEntryPoint
 class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
-    private val viewModel: SelectPointViewModel by lazy { ViewModelProvider(this)[SelectPointViewModel::class] }
+    private val viewModel: SelectPointViewModel by viewModels()
     private var selectedPointData: MutableList<PointManageVo> = mutableListOf()
     override fun getLayoutId(): Int {
         return R.layout.fragment_select_point

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

@@ -17,10 +17,12 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 数据管理首页
  */
+@AndroidEntryPoint
 class DataManageHomeFragment : BaseFragment<FragmentDataManageHomeBinding>() {
     private val menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.fragment.data_manage
 
 import android.graphics.Color
 import android.view.Gravity
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
@@ -22,12 +23,15 @@ import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 点位管理
  */
+@AndroidEntryPoint
 class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
-    private val viewModel: PointManageViewModel by lazy { ViewModelProvider(this)[PointManageViewModel::class] }
+    private val viewModel: PointManageViewModel by viewModels()
     private lateinit var filterPointDialog: FilterPointDialog
     private lateinit var addPointDialog: AddPointDialog
     override fun getLayoutId(): Int {

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.fragment.data_manage
 
 import android.graphics.Color
 import android.view.Gravity
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
@@ -20,12 +21,15 @@ import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 角色管理
  */
+@AndroidEntryPoint
 class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
-    private val viewModel: RoleManageViewModel by lazy { ViewModelProvider(this)[RoleManageViewModel::class] }
+    private val viewModel: RoleManageViewModel by viewModels()
     private lateinit var filterRoleDialog: FilterRoleDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_role_manage

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.fragment.data_manage
 
 import android.graphics.Color
 import android.view.Gravity
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
@@ -23,12 +24,15 @@ import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 用户管理
  */
+@AndroidEntryPoint
 class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
-    private val viewModel: UserManageViewModel by lazy { ViewModelProvider(this)[UserManageViewModel::class] }
+    private val viewModel: UserManageViewModel by viewModels()
     private lateinit var addUserDialog: AddUserDialog
     private lateinit var filterUserDialog: FilterUserDialog
     private lateinit var userDetailDialog: UserDetailDialog

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

@@ -1,6 +1,7 @@
 package com.grkj.iscs.features.main.fragment.data_manage
 
 import android.view.Gravity
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
@@ -16,13 +17,16 @@ import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
 import me.jessyan.autosize.utils.AutoSizeUtils
+import kotlin.getValue
 
 /**
  * 区域管理
  */
+@AndroidEntryPoint
 class WorkstationManageFragment : BaseFragment<FragmentWorkstationManageBinding>() {
-    private val viewModel: WorkstationManageViewModel by lazy { ViewModelProvider(this)[WorkstationManageViewModel::class] }
+    private val viewModel: WorkstationManageViewModel by viewModels()
     private lateinit var addWorkstationDialog: AddWorkstationDialog
     private val indentPx: Int by lazy { AutoSizeUtils.dp2px(requireContext(), 20f) }
     override fun getLayoutId(): Int {

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

@@ -13,10 +13,12 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 异常管理首页
  */
+@AndroidEntryPoint
 class ExceptionManageHomeFragment : BaseFragment<FragmentExceptionManageHomeBinding>() {
     private val menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(

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

@@ -13,10 +13,12 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 硬件管理首页
  */
+@AndroidEntryPoint
 class HardwareManageHomeFragment : BaseFragment<FragmentHardwareManageHomeBinding>() {
     private val menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(

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

@@ -1,6 +1,7 @@
 package com.grkj.iscs.features.main.fragment.home
 
 import android.widget.LinearLayout
+import androidx.fragment.app.viewModels
 import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.ItemOrientation
@@ -12,16 +13,20 @@ import com.grkj.iscs.databinding.FragmentHomeBinding
 import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.databinding.ItemHomeQuickEntranceBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
+import com.grkj.iscs.features.main.viewmodel.home.HomeViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
 import com.grkj.ui_base.utils.event.JumpViewEvent
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 首页
  */
+@AndroidEntryPoint
 class HomeFragment : BaseFragment<FragmentHomeBinding>() {
-    private val viewModel: HomeViewModel by lazy { ViewModelProvider(this)[HomeViewModel::class] }
+    private val viewModel: HomeViewModel by viewModels()
     private val quickEntranceList = mutableListOf<MenuItemEntity>(
         MenuItemEntity(
             0,

+ 0 - 9
app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeViewModel.kt

@@ -1,9 +0,0 @@
-package com.grkj.iscs.features.main.fragment.home
-
-import com.grkj.ui_base.base.BaseViewModel
-
-/**
- * 主界面界面模型
- */
-class HomeViewModel : BaseViewModel() {
-}

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

@@ -2,6 +2,7 @@ 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
@@ -28,17 +29,20 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.thread.ThreadUtils
+import dagger.hilt.android.AndroidEntryPoint
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.async
 import kotlinx.coroutines.withContext
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
+import kotlin.getValue
 
 /**
  * 新建作业
  */
+@AndroidEntryPoint
 class CreateJobFragment : BaseFragment<FragmentCreateJobBinding>() {
-    private val viewModel: JobViewModel by lazy { ViewModelProvider(this)[JobViewModel::class] }
+    private val viewModel: JobViewModel by viewModels()
     private var selectedLockMode: String? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()

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

@@ -2,6 +2,7 @@ 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
@@ -27,12 +28,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 新建SOP
  */
+@AndroidEntryPoint
 class CreateSopFragment : BaseFragment<FragmentCreateSopBinding>() {
-    private val viewModel: SopViewModel by lazy { ViewModelProvider(this)[SopViewModel::class] }
+    private val viewModel: SopViewModel by viewModels()
     private var selectedLockMode: String? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()

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

@@ -2,6 +2,7 @@ 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
@@ -25,12 +26,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 新建SOP作业
  */
+@AndroidEntryPoint
 class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
-    private val viewModel: SopJobViewModel by lazy { ViewModelProvider(this)[SopJobViewModel::class] }
+    private val viewModel: SopJobViewModel by viewModels()
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null

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

@@ -2,6 +2,7 @@ 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 androidx.navigation.NavOptions
 import com.drake.brv.BindingAdapter
@@ -28,12 +29,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 编辑作业
  */
+@AndroidEntryPoint
 class EditJobFragment : BaseFragment<FragmentEditJobBinding>() {
-    private val viewModel: JobViewModel by lazy { ViewModelProvider(this)[JobViewModel::class] }
+    private val viewModel: JobViewModel by viewModels()
     private var selectedLockMode: String? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()

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

@@ -2,6 +2,7 @@ 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
@@ -28,12 +29,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 修改SOP
  */
+@AndroidEntryPoint
 class EditSopFragment : BaseFragment<FragmentEditSopBinding>() {
-    private val viewModel: SopViewModel by lazy { ViewModelProvider(this)[SopViewModel::class] }
+    private val viewModel: SopViewModel by viewModels()
     private var selectedLockMode: String? = null
     private var selectedWorkstationId: Long? = null
     private var selectedPointData: List<PointManageVo> = mutableListOf()

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

@@ -2,6 +2,7 @@ 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 androidx.navigation.NavOptions
 import com.drake.brv.BindingAdapter
@@ -28,12 +29,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 编辑SOP作业
  */
+@AndroidEntryPoint
 class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
-    private val viewModel: SopJobViewModel by lazy { ViewModelProvider(this)[SopJobViewModel::class] }
+    private val viewModel: SopJobViewModel by viewModels()
     private var selectedWorkstationId: Long? = null
     private var selectedSopId: Long? = null
     private var selectedSop: SopManageVo? = null

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

@@ -1,6 +1,7 @@
 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
@@ -18,12 +19,15 @@ import com.grkj.iscs.features.main.viewmodel.job_manage.JobManageViewModel
 import com.grkj.ui_base.base.BaseFragment
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 进行中的作业管理
  */
+@AndroidEntryPoint
 class InProgressJobManageFragment : BaseFragment<FragmentInProgressJobManageBinding>() {
-    private val viewModel: JobManageViewModel by lazy { ViewModelProvider(this)[JobManageViewModel::class] }
+    private val viewModel: JobManageViewModel by viewModels()
     override fun getLayoutId(): Int {
         return R.layout.fragment_in_progress_job_manage
     }

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

@@ -1,26 +1,41 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
+import android.graphics.drawable.GradientDrawable
+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.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.data.model.vo.IsJobTicketPointsDataVo
+import com.grkj.data.model.vo.IsJobTicketStepDataVo
+import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentJobExecuteBinding
 import com.grkj.iscs.databinding.ItemJobExecutePointBinding
+import com.grkj.iscs.databinding.ItemJobExecuteStepBinding
 import com.grkj.iscs.features.main.viewmodel.job_manage.JobExecuteViewModel
+import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.data.EventConstants
+import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 作业执行界面
  */
+@AndroidEntryPoint
 class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
-    private val viewModel: JobExecuteViewModel by lazy { ViewModelProvider(this)[JobExecuteViewModel::class] }
+    private val viewModel: JobExecuteViewModel by viewModels()
 
     override fun getLayoutId(): Int {
         return R.layout.fragment_job_execute
@@ -33,17 +48,173 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         binding.listRv.linear().setup {
             addType<IsJobTicketPointsDataVo>(R.layout.item_job_execute_point)
             onBind {
-                onRVListBinding(this)
+                onPointsRVListBinding(this)
+            }
+        }
+        binding.stepRv.linear(orientation = LinearLayout.HORIZONTAL).setup {
+            addType<IsJobTicketStepDataVo>(R.layout.item_job_execute_step)
+            onBind {
+                onStepRVListBinding(this)
+            }
+        }
+        binding.cancelJob.setDebouncedClickListener {
+            viewModel.cancelJob().observe(this) {
+                navController.popBackStack()
+            }
+        }
+        binding.finishJob.setDebouncedClickListener {
+            viewModel.finishJob().observe(this) {
+                navController.popBackStack()
+            }
+        }
+        binding.toLock.setDebouncedClickListener {
+            viewModel.toLock().observe(this) {}
+        }
+        binding.toUnlock.setDebouncedClickListener {
+            viewModel.toUnLock().observe(this) {}
+        }
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onStepRVListBinding(holder: BindingAdapter.BindingViewHolder) {
+        val itemBinding = holder.getBinding<ItemJobExecuteStepBinding>()
+        val item = holder.getModel<IsJobTicketStepDataVo>()
+        itemBinding.stepIconIv.setImageResource(getStepIcon(item.stepIndex))
+        itemBinding.stepNameTv.text = item.stepContent
+        itemBinding.stepIndexTv.text = (item.position + 1).toString()
+        itemBinding.dividerIv.isVisible = item.stepId != viewModel.ticketStep.last().stepId
+        val bg = itemBinding.stepLayout.background
+        when (item.stepStatus) {
+            "1" -> {
+                if (bg is GradientDrawable) {
+                    bg.mutate()  // 拷贝一份,避免影响到其它引用了同一个 drawable 的 view
+                    bg.setColor(requireContext().getColor(R.color.color_b2f2bb))
+                }
+            }
+
+            "0" -> {
+                if (item.stepId == viewModel.ticketStep.first { it.stepStatus == "0" }.stepId) {
+                    if (bg is GradientDrawable) {
+                        bg.mutate()  // 拷贝一份,避免影响到其它引用了同一个 drawable 的 view
+                        bg.setColor(requireContext().getColor(R.color.color_ffec99))
+                    }
+                } else {
+                    itemBinding.stepLayout.backgroundTintList = null
+                }
+            }
+        }
+        //临时测试
+        itemBinding.stepLayout.setDebouncedClickListener {
+            if (item.stepIndex == LockStepEnum.SELECT_MEMBER.type) {
+                GlobalDataTempStore.getInstance().saveData(
+                    DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                    viewModel.ticketData.lockMode?.contains(
+                        LockStepEnum.COLOCK.type.toString()
+                    ) == true
+                )
+                GlobalDataTempStore.getInstance()
+                    .saveData(
+                        DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID,
+                        viewModel.ticketData.workstationId
+                    )
+                GlobalDataTempStore.getInstance()
+                    .saveData(
+                        DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                        viewModel.selectedLockerData
+                    )
+                GlobalDataTempStore.getInstance()
+                    .saveData(
+                        DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
+                        viewModel.selecteColockerData
+                    )
+                GlobalDataTempStore.getInstance()
+                    .saveData(
+                        DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                        viewModel.ticketData.ticketName
+                    )
+                GlobalDataTempStore.getInstance()
+                    .saveData(
+                        DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
+                        R.mipmap.icon_data_manage_menu_point_manage
+                    )
+                navController.navigate(R.id.action_jobExecuteFragment_to_selectMemberFragment)
             }
         }
     }
 
-    private fun BindingAdapter.BindingViewHolder.onRVListBinding(holder: BindingAdapter.BindingViewHolder) {
+    private fun getStepIcon(stepIndex: Int): Int {
+        return when (stepIndex) {
+            LockStepEnum.SELECT_MEMBER.type -> R.drawable.icon_select_member
+            LockStepEnum.LOCK.type -> R.drawable.icon_ticket_lock
+            LockStepEnum.COLOCK.type -> R.drawable.icon_ticket_colock
+            LockStepEnum.UNLOCK.type -> R.drawable.icon_ticket_unlock
+            else -> {
+                0
+            }
+        }
+    }
+
+    private fun BindingAdapter.BindingViewHolder.onPointsRVListBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemJobExecutePointBinding>()
         val item = holder.getModel<IsJobTicketPointsDataVo>()
         itemBinding.pointName.text = item.pointName
         itemBinding.pointFunction.text = item.pointFunction
+        itemBinding.lockStatusLayout.isVisible = item.pointStatus != "0"
+        if (item.pointStatus == "1") {
+            itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_locking)
+            itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_lock)
+            itemBinding.lockStatusTv.text =
+                requireContext().getText(com.grkj.ui_base.R.string.has_locked)
+        } else if (item.pointStatus == "2") {
+            itemBinding.lockStatusLayout.setBackgroundResource(R.drawable.bg_btn_job_execute_go_unlocking)
+            itemBinding.lockStatusIv.setImageResource(R.drawable.icon_ticket_unlock)
+            itemBinding.lockStatusTv.text =
+                requireContext().getText(com.grkj.ui_base.R.string.unlocked)
+        }
+    }
 
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        if (event.code == EventConstants.EVENT_RFID_CARD_READ) {
+            (event.data as RFIDCardReadEvent).let {
+                logger.info("读卡器获取卡片RFID:${it.rfidNo}")
+                if (viewModel.currentStepData?.stepIndex == LockStepEnum.COLOCK.type) {
+                    logger.info("添加共锁")
+                } else {
+                    logger.info("当前阶段无法共锁")
+                }
+            }
+        }
+    }
+
+    /**
+     * 检查当前步骤要显示的界面
+     */
+    private fun checkCurrentStep() {
+        binding.toLock.isVisible = false
+        binding.toUnlock.isVisible = false
+        binding.cancelJob.isVisible = false
+        binding.finishJob.isVisible = false
+        if (viewModel.currentStepData?.stepIndex == null) {
+            binding.finishJob.isVisible = true
+        } else {
+            when (viewModel.currentStepData?.stepIndex) {
+                LockStepEnum.SELECT_MEMBER.type -> {
+                    binding.cancelJob.isVisible = true
+                }
+
+                LockStepEnum.LOCK.type -> {
+                    binding.toLock.isVisible = true
+                }
+
+                LockStepEnum.COLOCK.type -> {
+
+                }
+
+                LockStepEnum.UNLOCK.type -> {
+                    binding.toUnlock.isVisible = true
+                }
+            }
+        }
     }
 
     override fun initData() {
@@ -58,6 +229,37 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         viewModel.getJobTicketData().observe(this) {
             binding.jobNameTv.text = viewModel.ticketData.ticketName
             binding.listRv.models = viewModel.ticketPoints
+            binding.stepRv.models = viewModel.ticketStep
+            checkCurrentStep()
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        if (GlobalDataTempStore.getInstance()
+                .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
+        ) {
+            viewModel.selectedLockerData = GlobalDataTempStore.getInstance()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
+                ?.let { return@let it as List<UserManageVo> } ?: listOf()
+            viewModel.checkMemberFinish = true
+        }
+        if (GlobalDataTempStore.getInstance()
+                .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
+        ) {
+            viewModel.selecteColockerData = GlobalDataTempStore.getInstance()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
+                ?.let { return@let it as List<UserManageVo> } ?: listOf()
+            viewModel.checkMemberFinish = true
+        }
+        if (viewModel.checkMemberFinish) {
+            viewModel.updateLockerAndColockerData().observe(this) {
+                viewModel.currentStepData?.stepStatus = "1"
+                viewModel.currentStepData =
+                    viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                checkCurrentStep()
+                binding.stepRv.adapter?.notifyDataSetChanged()
+            }
         }
     }
 }

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

@@ -1,6 +1,7 @@
 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
@@ -21,12 +22,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * 作业管理
  */
+@AndroidEntryPoint
 class JobManageFragment : BaseFragment<FragmentJobManageBinding>() {
-    private val viewModel: JobManageViewModel by lazy { ViewModelProvider(this)[JobManageViewModel::class] }
+    private val viewModel: JobManageViewModel by viewModels()
     override fun getLayoutId(): Int {
         return R.layout.fragment_job_manage
     }

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

@@ -13,10 +13,12 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.BottomNavVisibilityEvent
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 作业管理首页
  */
+@AndroidEntryPoint
 class JobManageHomeFragment : BaseFragment<FragmentJobManageHomeBinding>() {
     private val menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(

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

@@ -1,6 +1,7 @@
 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
@@ -22,12 +23,15 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
+import dagger.hilt.android.AndroidEntryPoint
+import kotlin.getValue
 
 /**
  * SOP管理
  */
+@AndroidEntryPoint
 class SopManageFragment : BaseFragment<FragmentSopManageBinding>() {
-    private val viewModel: SopManageViewModel by lazy { ViewModelProvider(this)[SopManageViewModel::class] }
+    private val viewModel: SopManageViewModel by viewModels()
     override fun getLayoutId(): Int {
         return R.layout.fragment_sop_manage
     }

+ 2 - 0
app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoHomeFragment.kt

@@ -16,10 +16,12 @@ import com.grkj.iscs.features.login.activity.LoginActivity
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.sik.sikcore.activity.ActivityTracker
+import dagger.hilt.android.AndroidEntryPoint
 
 /**
  * 用户信息菜单
  */
+@AndroidEntryPoint
 class UserInfoHomeFragment : BaseFragment<FragmentUserInfoHomeBinding>() {
     private val menuData: MutableList<MenuItemEntity> = mutableListOf(
         MenuItemEntity(

+ 12 - 0
app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -0,0 +1,12 @@
+package com.grkj.iscs.features.main.viewmodel
+
+import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+/**
+ * 首页界面模型
+ */
+@HiltViewModel
+class MainViewModel @Inject constructor(): BaseViewModel() {
+}

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

@@ -4,15 +4,17 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IUserRepository
-import com.grkj.data.repository.impl.UserRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 选择人员
  */
-class SelectMemberViewModel : BaseViewModel() {
-    private val userRepository: IUserRepository by lazy { UserRepository.instance }
+@HiltViewModel
+class SelectMemberViewModel @Inject constructor(val userRepository: IUserRepository) :
+    BaseViewModel() {
     var workstationId: Long = 0
 
     /**

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

@@ -6,13 +6,15 @@ import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.impl.IsolationPointRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 选择点位
  */
-class SelectPointViewModel : BaseViewModel() {
-    private val pointRepository: IIsolationPointRepository by lazy { IsolationPointRepository.instance }
+@HiltViewModel
+class SelectPointViewModel @Inject constructor(val pointRepository: IIsolationPointRepository) : BaseViewModel() {
     var pointManageData: MutableList<PointManageVo> = mutableListOf()
     var workstationId: Long = 0
 

+ 9 - 8
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt

@@ -9,19 +9,20 @@ import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.IRfidTokenRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.repository.impl.IsolationPointRepository
-import com.grkj.data.repository.impl.RfidTokenRepository
-import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
 
 /**
  * 隔离点管理界面模型
  */
-class PointManageViewModel : BaseViewModel() {
-    private val isolationPointRepository: IIsolationPointRepository by lazy { IsolationPointRepository.instance }
-    private val rfidTokenRepository: IRfidTokenRepository by lazy { RfidTokenRepository.instance }
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
+@HiltViewModel
+class PointManageViewModel @Inject constructor(
+    val isolationPointRepository: IIsolationPointRepository,
+    val rfidTokenRepository: IRfidTokenRepository,
+    val workstationRepository: IWorkstationRepository
+) : BaseViewModel() {
     private var current: Int = 0
     private var size: Int = 50
     var workstationData: List<IsWorkstation> = mutableListOf()
@@ -65,7 +66,7 @@ class PointManageViewModel : BaseViewModel() {
     fun addIsolationPoint(addPointManageVo: AddPointManageVo): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             val rfidId = rfidTokenRepository.addRfidToken(addPointManageVo.RFIDTag)
-            isolationPointRepository.addIsolationPoint(addPointManageVo,rfidId)
+            isolationPointRepository.addIsolationPoint(addPointManageVo, rfidId)
             emit(true)
         }
     }

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

@@ -5,15 +5,17 @@ import androidx.lifecycle.liveData
 import com.grkj.data.model.vo.RoleManageFilterVo
 import com.grkj.data.model.vo.RoleManageVo
 import com.grkj.data.repository.IRoleRepository
-import com.grkj.data.repository.impl.RoleRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
 
 /**
  * 角色管理界面模型
  */
-class RoleManageViewModel : BaseViewModel() {
-    private val roleRepository: IRoleRepository by lazy { RoleRepository.instance }
+@HiltViewModel
+class RoleManageViewModel @Inject constructor(val roleRepository: IRoleRepository) :
+    BaseViewModel() {
     private var current: Int = 0
     private var size: Int = 50
     var roleManageDataList: MutableList<RoleManageVo> = mutableListOf()

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

@@ -11,21 +11,21 @@ import com.grkj.data.repository.IHardwareRepository
 import com.grkj.data.repository.IRoleRepository
 import com.grkj.data.repository.IUserRepository
 import com.grkj.data.repository.IWorkstationRepository
-import com.grkj.data.repository.impl.HardwareRepository
-import com.grkj.data.repository.impl.RoleRepository
-import com.grkj.data.repository.impl.UserRepository
-import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
+import javax.inject.Inject
 
 /**
  * 用户管理界面模型
  */
-class UserManageViewModel : BaseViewModel() {
-    private val userRepository: IUserRepository by lazy { UserRepository.instance }
-    private val roleRepository: IRoleRepository by lazy { RoleRepository.instance }
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
-    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository.instance }
+@HiltViewModel
+class UserManageViewModel @Inject constructor(
+    val userRepository: IUserRepository,
+    val roleRepository: IRoleRepository,
+    val workstationRepository: IWorkstationRepository,
+    val hardwareRepository: IHardwareRepository
+) : BaseViewModel() {
     private var current: Int = 0
     private var size: Int = 50
     var userManageDataList: MutableList<UserManageVo> = mutableListOf()
@@ -73,7 +73,7 @@ class UserManageViewModel : BaseViewModel() {
             val userId = userRepository.addUserData(userData)
             workstationRepository.addUserWorkstationData(userId, userData.workstationId)
             roleRepository.addUserRoleData(userId, userData.roleId)
-            hardwareRepository.addCard(userId,userData)
+            hardwareRepository.addCard(userId, userData)
             emit(true)
         }
     }

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

@@ -6,13 +6,15 @@ import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IWorkstationRepository
 import com.grkj.data.repository.impl.WorkstationRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 岗位数据
  */
-class WorkstationManageViewModel : BaseViewModel() {
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository() }
+@HiltViewModel
+class WorkstationManageViewModel @Inject constructor(val workstationRepository: IWorkstationRepository) : BaseViewModel() {
     var workstationManageData: MutableList<WorkstationManageVo> = mutableListOf()
 
     /**

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

@@ -0,0 +1,10 @@
+package com.grkj.iscs.features.main.viewmodel.home
+
+import com.grkj.ui_base.base.BaseViewModel
+import javax.inject.Inject
+
+/**
+ * 主界面界面模型
+ */
+class HomeViewModel @Inject constructor() : BaseViewModel() {
+}

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

@@ -2,22 +2,36 @@ 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.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketKeyDataVo
 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.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.ModbusBusinessManager
+import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.LoadingEvent
+import com.grkj.ui_base.utils.modbus.DeviceConst
+import com.grkj.ui_base.utils.modbus.ModBusController
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
+import java.util.concurrent.atomic.AtomicInteger
 
 /**
  * 作业执行数据
  */
-class JobExecuteViewModel : BaseViewModel() {
-    private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
+@HiltViewModel
+class JobExecuteViewModel @Inject constructor(val jobTicketRepository: IJobTicketRepository) : BaseViewModel() {
     var ticketId: Long = 0
     lateinit var ticketData: IsJobTicketDataVo
     lateinit var ticketKey: List<IsJobTicketKeyDataVo>
@@ -25,6 +39,10 @@ class JobExecuteViewModel : BaseViewModel() {
     lateinit var ticketPoints: List<IsJobTicketPointsDataVo>
     lateinit var ticketStep: List<IsJobTicketStepDataVo>
     lateinit var ticketUser: List<IsJobTicketUserDataVo>
+    var selectedLockerData: List<UserManageVo> = mutableListOf()
+    var selecteColockerData: List<UserManageVo> = mutableListOf()
+    var checkMemberFinish: Boolean = false
+    var currentStepData: IsJobTicketStepDataVo? = null
 
     /**
      * 获取作业数据
@@ -37,6 +55,141 @@ class JobExecuteViewModel : BaseViewModel() {
             ticketPoints = jobTicketRepository.getJobTicketPointsDataByTicketId(ticketId)
             ticketStep = jobTicketRepository.getJobTicketStepDataByTicketId(ticketId)
             ticketUser = jobTicketRepository.getJobTicketUserDataByTicketId(ticketId)
+            val tempJobTicketUserId = jobTicketRepository.getTicketUsersByTicketId(ticketId)
+            selectedLockerData =
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTLOCKER.roleKey) }
+            selecteColockerData =
+                tempJobTicketUserId.filter { it.roleKeys.contains(RoleEnums.JTCOLOCKER.roleKey) }
+            ticketStep.sortedBy { it.stepId }
+            ticketStep.forEach {
+                it.position = ticketStep.indexOfFirst { stepVo -> it.stepId == stepVo.stepId }
+            }
+            currentStepData = ticketStep.firstOrNull()
+            emit(true)
+        }
+    }
+
+    /**
+     * 更新上锁人和共锁人数据
+     */
+    fun updateLockerAndColockerData(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketRepository.updateClockerAndColockerData(
+                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)
+            emit(true)
+        }
+    }
+
+    /**
+     * 取消作业
+     */
+    fun cancelJob(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketRepository.cancelJob(ticketId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 结束作业
+     */
+    fun finishJob(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            jobTicketRepository.finishJob(ticketId)
+            emit(true)
+        }
+    }
+
+    /**
+     * 去上锁
+     */
+    fun toLock(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
+            ModbusBusinessManager.checkEquipCount(ticketPoints.count {
+                it.pointStatus == "0" || (it.pointStatus == "2" && LockModeEnum.isUnLockFirst(
+                    ticketData.lockMode.toString()
+                ))
+            }, true) { keyMap, lockMap ->
+                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
+                    )
+                    return@checkEquipCount
+                }
+                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 waitOpenLockDockSize = lockMap.keys.size
+                val openedLockDockSize = AtomicInteger(0)
+                lockMap.keys.forEach { lockDockAddr ->
+                    lockMap[lockDockAddr]?.let { lockList ->
+                        ModBusController.controlLockBuckle(
+                            true, lockDockAddr, lockList.map { it.idx }.toMutableList()
+                        ) {
+                            lockList.forEach { lock ->
+                                ModbusBusinessManager.addDeviceTake(
+                                    DeviceConst.DEVICE_TYPE_LOCK, ticketId, lock.rfid
+                                )
+                            }
+                            openedLockDockSize.addAndGet(1)
+                            if (openedLockDockSize.get() >= waitOpenLockDockSize) {
+                                LoadingEvent.sendLoadingEvent(
+                                    CommonUtils.getStr(
+                                        com.grkj.ui_base.R.string.take_out_lock_tip,
+                                        args = listOf(
+                                            lockMap.values.flatten().count().toInt()
+                                        ).toTypedArray()
+                                    ),
+                                    true
+                                )
+                            }
+                        }
+                    }
+                }
+            }
+            emit(true)
+        }
+    }
+
+    /**
+     * 去解锁
+     */
+    fun toUnLock(): LiveData<Boolean> {
+        return liveData(Dispatchers.IO) {
             emit(true)
         }
     }

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

@@ -6,13 +6,15 @@ 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
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 作业管理
  */
-class JobManageViewModel : BaseViewModel() {
-    private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
+@HiltViewModel
+class JobManageViewModel @Inject constructor(val jobTicketRepository: IJobTicketRepository) : BaseViewModel() {
     var jobManageDataList: MutableList<JobTicketManageVo> = mutableListOf()
     private var current: Int = 0
     private var size: Int = 50

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

@@ -15,15 +15,19 @@ 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
 import kotlinx.coroutines.Dispatchers
 
 /**
  * 作业界面模型
  */
-class JobViewModel : BaseViewModel() {
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
-    private val sopRepository: ISopRepository by lazy { SopRepository.instance }
-    private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
+@HiltViewModel
+class JobViewModel @Inject constructor(
+    val workstationRepository: IWorkstationRepository,
+    val sopRepository: ISopRepository,
+    val jobTicketRepository: IJobTicketRepository
+) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var jobTicketData: JobTicketManageVo? = null
     var jobPointsData: List<PointManageVo> = mutableListOf()

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

@@ -15,15 +15,19 @@ 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
 import kotlinx.coroutines.Dispatchers
 
 /**
  * sop作业界面模型
  */
-class SopJobViewModel : BaseViewModel() {
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
-    private val sopRepository: ISopRepository by lazy { SopRepository.instance }
-    private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
+@HiltViewModel
+class SopJobViewModel @Inject constructor(
+    val workstationRepository: IWorkstationRepository,
+    val sopRepository: ISopRepository,
+    val jobTicketRepository: IJobTicketRepository
+) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var sopData: List<SopManageVo> = listOf()
     var sopPoints: List<PointManageVo> = listOf()

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

@@ -6,13 +6,15 @@ import com.grkj.data.model.vo.SopManageVo
 import com.grkj.data.repository.ISopRepository
 import com.grkj.data.repository.impl.SopRepository
 import com.grkj.ui_base.base.BaseViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
 
 /**
  * SOP管理
  */
-class SopManageViewModel : BaseViewModel() {
-    private val sopRepository: ISopRepository by lazy { SopRepository.instance }
+@HiltViewModel
+class SopManageViewModel @Inject constructor(val sopRepository: ISopRepository) : BaseViewModel() {
     var sopManageDataList: MutableList<SopManageVo> = mutableListOf()
     private var current: Int = 0
     private var size: Int = 50

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

@@ -11,14 +11,18 @@ import com.grkj.data.repository.IWorkstationRepository
 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
 import kotlinx.coroutines.Dispatchers
 
 /**
  * sop界面模型
  */
-class SopViewModel : BaseViewModel() {
-    private val workstationRepository: IWorkstationRepository by lazy { WorkstationRepository.instance }
-    private val sopRepository: ISopRepository by lazy { SopRepository.instance }
+@HiltViewModel
+class SopViewModel @Inject constructor(
+    val workstationRepository: IWorkstationRepository,
+    val sopRepository: ISopRepository
+) : BaseViewModel() {
     var workstationData: List<IsWorkstation> = listOf()
     var selectedSopData: SopManageVo? = null
     var selectedSopPointData: List<PointManageVo> = mutableListOf()
@@ -49,7 +53,7 @@ class SopViewModel : BaseViewModel() {
         return liveData(Dispatchers.IO) {
             sopRepository.deleteSopPointsBySopId(listOf(sopId))
             sopRepository.deleteSopUsersBySopId(listOf(sopId))
-            val sopId = sopRepository.saveSop(sopId,sopName, workstationId, lockMode)
+            val sopId = sopRepository.saveSop(sopId, sopName, workstationId, lockMode)
             sopRepository.saveSopPoint(selectedPointsData, sopId)
             sopRepository.saveSopUser(selectedLockerData, selectedColockerData, sopId)
             emit(true)

+ 9 - 0
app/src/main/res/drawable/bg_job_execute_step.xml

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

+ 7 - 0
app/src/main/res/drawable/bg_job_execute_step_index.xml

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

+ 13 - 0
app/src/main/res/drawable/icon_job_execute_arrow_right.xml

@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="24dp"
+    android:autoMirrored="true"
+    android:tint="#000000"
+    android:viewportWidth="18"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M0,24l18,-12 -18,-12v10z" />
+
+</vector>

+ 7 - 0
app/src/main/res/drawable/icon_ticket_colock.xml

@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
+      
+    <path android:fillColor="@android:color/white" android:pathData="M6,20V10h12v1c0.7,0 1.37,0.1 2,0.29V10c0,-1.1 -0.9,-2 -2,-2h-1V6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h6.26c-0.42,-0.6 -0.75,-1.28 -0.97,-2H6zM9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2H9V6z"/>
+      
+    <path android:fillColor="@android:color/white" android:pathData="M18,13c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S20.76,13 18,13zM19.65,20.35l-2.15,-2.15V15h1v2.79l1.85,1.85L19.65,20.35z"/>
+    
+</vector>

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

@@ -53,7 +53,8 @@
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/step_rv"
             android:layout_width="match_parent"
-            android:layout_height="260dp"
+            android:layout_height="190dp"
+            android:layout_marginHorizontal="10dp"
             android:layout_marginTop="30dp" />
 
         <LinearLayout
@@ -129,7 +130,6 @@
                 android:layout_marginLeft="10dp"
                 android:background="@drawable/bg_btn_job_execute_go_unlocking"
                 android:drawableLeft="@drawable/icon_ticket_unlock"
-                android:drawablePadding="10dp"
                 android:paddingHorizontal="10dp"
                 android:text="@string/go_unlocking"
                 android:textColor="@color/white"
@@ -151,7 +151,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="10dp"
-                android:background="@drawable/common_dialog_btn"
+                android:background="@drawable/bg_btn_job_execute_normal"
                 android:paddingHorizontal="10dp"
                 android:text="@string/finish_the_job"
                 android:textColor="@color/black"

+ 30 - 6
app/src/main/res/layout/item_job_execute_point.xml

@@ -26,13 +26,37 @@
             android:text="@string/point_manage_point_function"
             android:textSize="18sp" />
 
-        <TextView
-            android:id="@+id/lock_status"
+        <FrameLayout
             android:layout_width="0dp"
             android:layout_height="match_parent"
-            android:layout_weight="1"
-            android:gravity="center"
-            android:text="@string/lock_status"
-            android:textSize="18sp" />
+            android:layout_weight="1">
+
+            <LinearLayout
+                android:id="@+id/lock_status_layout"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:background="@drawable/bg_btn_job_execute_go_locking"
+                android:gravity="center"
+                android:orientation="horizontal"
+                android:paddingHorizontal="10dp"
+                android:paddingVertical="2dp">
+
+                <ImageView
+                    android:id="@+id/lock_status_iv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:src="@drawable/icon_ticket_lock" />
+
+                <TextView
+                    android:id="@+id/lock_status_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="5dp"
+                    android:text="@string/has_locked"
+                    android:textColor="@color/white"
+                    android:textSize="18sp" />
+            </LinearLayout>
+        </FrameLayout>
     </LinearLayout>
 </layout>

+ 54 - 0
app/src/main/res/layout/item_job_execute_step.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:orientation="horizontal">
+        <LinearLayout
+            android:id="@+id/step_layout"
+            android:layout_width="120dp"
+            android:layout_height="180dp"
+            android:layout_marginLeft="10dp"
+            android:background="@drawable/bg_job_execute_step"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <ImageView
+                android:id="@+id/step_icon_iv"
+                android:layout_width="70dp"
+                android:layout_height="70dp"
+                android:layout_marginTop="10dp" />
+
+            <TextView
+                android:id="@+id/step_name_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="@string/point_name_tv"
+                android:textSize="18sp" />
+
+            <TextView
+                android:id="@+id/step_index_tv"
+                android:layout_width="30dp"
+                android:layout_height="30dp"
+                android:layout_marginTop="10dp"
+                android:background="@drawable/bg_job_execute_step_index"
+                android:gravity="center"
+                android:includeFontPadding="false"
+                android:padding="5dp"
+                android:textSize="18sp"
+                tools:text="1" />
+        </LinearLayout>
+
+        <ImageView
+            android:id="@+id/divider_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:src="@drawable/icon_job_execute_arrow_right"/>
+    </LinearLayout>
+
+</layout>

+ 5 - 1
app/src/main/res/navigation/nav_job_manage.xml

@@ -140,7 +140,11 @@
     <fragment
         android:id="@+id/jobExecuteFragment"
         android:name="com.grkj.iscs.features.main.fragment.job_manage.JobExecuteFragment"
-        android:label="JobExecuteFragment" />
+        android:label="JobExecuteFragment" >
+        <action
+            android:id="@+id/action_jobExecuteFragment_to_selectMemberFragment"
+            app:destination="@id/selectMemberFragment" />
+    </fragment>
     <fragment
         android:id="@+id/inProgressJobManageFragment"
         android:name="com.grkj.iscs.features.main.fragment.job_manage.InProgressJobManageFragment"

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

@@ -5,6 +5,7 @@
     <color name="login_tip_circle_bg">#00ddfa</color>
     <color name="login_method_tv_color">#D7D2D2</color>
     <color name="color_7b7d7e">#7b7d7e</color>
+    <color name="color_b2f2bb">#b2f2bb</color>
     <color name="color_1daeff">#1daeff</color>
     <color name="color_d7d2d2">#d7d2d2</color>
     <color name="color_ffec99">#ffec99</color>

+ 1 - 0
build.gradle.kts

@@ -5,6 +5,7 @@ plugins {
     alias(libs.plugins.android.library) apply false
     alias(libs.plugins.jetbrains.kotlin.jvm) apply false
     alias(libs.plugins.kotlin.ksp) apply false
+    id("com.google.dagger.hilt.android") version "2.56.2" apply false
 }
 
 buildscript {

+ 3 - 0
data/build.gradle.kts

@@ -2,6 +2,7 @@ plugins {
     alias(libs.plugins.android.library)
     alias(libs.plugins.kotlin.android)
     alias(libs.plugins.kotlin.ksp)
+    id("com.google.dagger.hilt.android")
 }
 
 android {
@@ -46,4 +47,6 @@ dependencies {
     // 注解处理器(编译时生成 DAO/Database 实现)
     ksp(libs.androidx.room.compiler)           // 即 androidx.room:room-compiler :contentReference[oaicite:3]{index=3}
 
+    implementation("com.google.dagger:hilt-android:2.56.2")
+    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
 }

+ 33 - 11
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -5,6 +5,7 @@ import androidx.room.Insert
 import androidx.room.OnConflictStrategy
 import androidx.room.Query
 import androidx.room.TypeConverters
+import androidx.room.Update
 import com.grkj.data.converters.Converters
 import com.grkj.data.model.dos.IsJobTicket
 import com.grkj.data.model.dos.IsJobTicketKey
@@ -103,7 +104,8 @@ interface JobTicketDao {
     /**
      * 获取作业票分页
      */
-    @Query("""
+    @Query(
+        """
         select ticket_id as ticketId,
         ticket_name as ticketName,
         ticket_status as ticketStatus,
@@ -112,8 +114,9 @@ interface JobTicketDao {
         sop_id as sopId
         from is_job_ticket
         limit :size offset :offset
-    """)
-    fun getTicketDataPage(size: Int,offset: Int): List<JobTicketManageVo>
+    """
+    )
+    fun getTicketDataPage(size: Int, offset: Int): List<JobTicketManageVo>
 
     /**
      * 开始作业
@@ -159,7 +162,8 @@ interface JobTicketDao {
     /**
      * 根据作业id获取作业数据
      */
-    @Query("""
+    @Query(
+        """
         select ticket_id as ticketId,
         ticket_name as ticketName,
         ticket_status as ticketStatus,
@@ -168,7 +172,8 @@ interface JobTicketDao {
         sop_id as sopId
         from is_job_ticket
         where ticket_id = :ticketId
-    """)
+    """
+    )
     fun getTicketDataByTicketId(ticketId: Long): JobTicketManageVo?
 
     /**
@@ -211,12 +216,14 @@ interface JobTicketDao {
     /**
      * 根据作业id获取作业点位详细数据
      */
-    @Query("select istp.*, " +
-            "iip.point_name as pointName," +
-            "iip.remark as pointFunction " +
-            "from is_job_ticket_points istp " +
-            "left join is_isolation_point iip on istp.point_id = iip.point_id " +
-            "where ticket_id = :ticketId")
+    @Query(
+        "select istp.*, " +
+                "iip.point_name as pointName," +
+                "iip.remark as pointFunction " +
+                "from is_job_ticket_points istp " +
+                "left join is_isolation_point iip on istp.point_id = iip.point_id " +
+                "where ticket_id = :ticketId"
+    )
     fun getJobTicketPointsDataByTicketId(ticketId: Long): List<IsJobTicketPointsDataVo>
 
     /**
@@ -230,4 +237,19 @@ interface JobTicketDao {
      */
     @Query("select * from is_job_ticket_user where ticket_id = :ticketId")
     fun getJobTicketUserDataByTicketId(ticketId: Long): List<IsJobTicketUserDataVo>
+
+    /**
+     * 更新步骤
+     */
+    @Query("update is_job_ticket_step set step_status = :status where step_id = :stepId")
+    fun updateTicketStepStatus(
+        stepId: Long,
+        status: String
+    )
+
+    /**
+     * 更新作业状态
+     */
+    @Query("update is_job_ticket set ticket_status = :status where ticket_id = :ticketId")
+    fun updateTicketStatus(ticketId: Long, status: String)
 }

+ 26 - 0
data/src/main/java/com/grkj/data/di/AppEntryPoint.kt

@@ -0,0 +1,26 @@
+package com.grkj.data.di
+
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IIsolationPointRepository
+import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IRfidTokenRepository
+import com.grkj.data.repository.IRoleRepository
+import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkstationRepository
+import dagger.hilt.EntryPoint
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+
+@EntryPoint
+@InstallIn(SingletonComponent::class)
+interface AppEntryPoint {
+    fun hardwareRepo(): IHardwareRepository
+    fun isolationPointRepo(): IIsolationPointRepository
+    fun jobTicketRepo(): IJobTicketRepository
+    fun rfidTokenRepo(): IRfidTokenRepository
+    fun roleRepo(): IRoleRepository
+    fun sopRepo(): ISopRepository
+    fun userRepo(): IUserRepository
+    fun workstationRepo(): IWorkstationRepository
+}

+ 70 - 0
data/src/main/java/com/grkj/data/di/DatabaseModule.kt

@@ -0,0 +1,70 @@
+package com.grkj.data.di
+
+import android.content.Context
+import androidx.room.Room
+import com.grkj.data.dao.HardwareDao
+import com.grkj.data.dao.IsSopDao
+import com.grkj.data.dao.IsolationPointDao
+import com.grkj.data.dao.JobTicketDao
+import com.grkj.data.dao.RfidTokenDao
+import com.grkj.data.dao.RoleDao
+import com.grkj.data.dao.UserDao
+import com.grkj.data.dao.WorkstationDao
+import com.grkj.data.database.ISCSDatabase
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object DatabaseModule {
+
+    @Provides
+    @Singleton
+    fun provideDatabase(
+        @ApplicationContext ctx: Context
+    ): ISCSDatabase {
+        return Room.databaseBuilder(
+            ctx,
+            ISCSDatabase::class.java,
+            "iscs_database"
+        )
+            .createFromAsset("data.db")
+            .build()
+    }
+
+    @Provides
+    fun provideUserDao(db: ISCSDatabase): UserDao =
+        db.userDao()
+
+    @Provides
+    fun provideHardwareDao(db: ISCSDatabase): HardwareDao =
+        db.hardwareDao()
+
+    @Provides
+    fun provideRoleDao(db: ISCSDatabase): RoleDao =
+        db.roleDao()
+
+    @Provides
+    fun provideWorkstationDao(db: ISCSDatabase): WorkstationDao =
+        db.workstationDao()
+
+    @Provides
+    fun provideIsolationPointDao(db: ISCSDatabase): IsolationPointDao =
+        db.isolationPointDao()
+
+    @Provides
+    fun provideRfidTokenDao(db: ISCSDatabase): RfidTokenDao =
+        db.rfidTokenDao()
+
+    @Provides
+    fun provideIsSopDao(db: ISCSDatabase): IsSopDao =
+        db.isSopDao()
+
+    @Provides
+    fun provideJobTicketDao(db: ISCSDatabase): JobTicketDao =
+        db.jobTicketDao()
+}

+ 38 - 0
data/src/main/java/com/grkj/data/di/RepositoryManager.kt

@@ -0,0 +1,38 @@
+package com.grkj.data.di
+
+import android.app.Application
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IIsolationPointRepository
+import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IRfidTokenRepository
+import com.grkj.data.repository.IRoleRepository
+import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkstationRepository
+import dagger.hilt.android.EntryPointAccessors
+
+/**
+ * 仓储层管理
+ */
+object RepositoryManager {
+    lateinit var hardwareRepo: IHardwareRepository
+    lateinit var isolationPointRepo: IIsolationPointRepository
+    lateinit var jobTicketRepo: IJobTicketRepository
+    lateinit var rfidTokenRepo: IRfidTokenRepository
+    lateinit var roleRepo: IRoleRepository
+    lateinit var sopRepo: ISopRepository
+    lateinit var userRepo: IUserRepository
+    lateinit var workstationRepo: IWorkstationRepository
+
+    fun init(app: Application) {
+        val ep = EntryPointAccessors.fromApplication(app, AppEntryPoint::class.java)
+        hardwareRepo = ep.hardwareRepo()
+        isolationPointRepo = ep.isolationPointRepo()
+        jobTicketRepo = ep.jobTicketRepo()
+        rfidTokenRepo = ep.rfidTokenRepo()
+        roleRepo = ep.roleRepo()
+        sopRepo = ep.sopRepo()
+        userRepo = ep.userRepo()
+        workstationRepo = ep.workstationRepo()
+    }
+}

+ 75 - 0
data/src/main/java/com/grkj/data/di/RepositoryModule.kt

@@ -0,0 +1,75 @@
+package com.grkj.data.di
+
+import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.IIsolationPointRepository
+import com.grkj.data.repository.IJobTicketRepository
+import com.grkj.data.repository.IRfidTokenRepository
+import com.grkj.data.repository.IRoleRepository
+import com.grkj.data.repository.ISopRepository
+import com.grkj.data.repository.IUserRepository
+import com.grkj.data.repository.IWorkstationRepository
+import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.repository.impl.IsolationPointRepository
+import com.grkj.data.repository.impl.JobTicketRepository
+import com.grkj.data.repository.impl.RfidTokenRepository
+import com.grkj.data.repository.impl.RoleRepository
+import com.grkj.data.repository.impl.SopRepository
+import com.grkj.data.repository.impl.UserRepository
+import com.grkj.data.repository.impl.WorkstationRepository
+import dagger.Binds
+import dagger.Module
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+abstract class RepositoryModule {
+    @Binds
+    @Singleton
+    abstract fun bindHardwareRepository(
+        impl: HardwareRepository
+    ): IHardwareRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindIsolationPointRepository(
+        impl: IsolationPointRepository
+    ): IIsolationPointRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindJobTicketRepository(
+        impl: JobTicketRepository
+    ): IJobTicketRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindRfidTokenRepository(
+        impl: RfidTokenRepository
+    ): IRfidTokenRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindRoleRepository(
+        impl: RoleRepository
+    ): IRoleRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindSopRepository(
+        impl: SopRepository
+    ): ISopRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindUserRepository(
+        impl: UserRepository
+    ): IUserRepository
+
+    @Binds
+    @Singleton
+    abstract fun bindWorkstationRepository(
+        impl: WorkstationRepository
+    ): IWorkstationRepository
+}

+ 15 - 0
data/src/main/java/com/grkj/data/enums/LockModeEnum.kt

@@ -1,5 +1,7 @@
 package com.grkj.data.enums
 
+import com.grkj.data.model.res.LockInfoRes
+
 /**
  * 锁定模式
  */
@@ -22,4 +24,17 @@ enum class LockModeEnum(val lockMode: List<LockStepEnum>, val description: Strin
     ),
     LOCK_MODE_4(listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.LOCK), "上锁"),
     LOCK_MODE_5(listOf(LockStepEnum.SELECT_MEMBER, LockStepEnum.UNLOCK), "解锁");
+
+    companion object {
+        /**
+         * 是否解锁优先
+         */
+        @JvmStatic
+        fun isUnLockFirst(lockMode: String): Boolean {
+            val lockStep = lockMode.split(",")
+            val lockIndex = lockStep.indexOfFirst { it == LockStepEnum.LOCK.type.toString() }
+            val unLockIndex = lockStep.indexOfFirst { it == LockStepEnum.UNLOCK.type.toString() }
+            return unLockIndex < lockIndex
+        }
+    }
 }

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

@@ -1,8 +1,12 @@
 package com.grkj.data.model.vo
 
+import androidx.room.Ignore
 import com.grkj.data.model.dos.IsJobTicketStep
 
 /**
  * 作业步骤详细数据实体
  */
-class IsJobTicketStepDataVo : IsJobTicketStep()
+class IsJobTicketStepDataVo : IsJobTicketStep() {
+    @Ignore
+    var position: Int = 0
+}

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

@@ -1,5 +1,6 @@
 package com.grkj.data.repository
 
+import com.grkj.data.model.res.StepDetailRes
 import com.grkj.data.model.res.TicketDetailRes
 import com.grkj.data.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketKeyDataVo
@@ -106,4 +107,28 @@ interface IJobTicketRepository {
      * 根据作业id获取作业人员详细数据
      */
     fun getJobTicketUserDataByTicketId(ticketId: Long): List<IsJobTicketUserDataVo>
+
+    /**
+     * 更新上锁人和共锁人
+     */
+    fun updateClockerAndColockerData(
+        ticketId: Long,
+        currentStepData: IsJobTicketStepDataVo?,
+        selectedLockerData: List<UserManageVo>,
+        selectedColockerData: List<UserManageVo>
+    )
+
+    /**
+     * 获取步骤详情
+     */
+    fun getStepDetail(ticketId: Long, callback: (List<StepDetailRes>?) -> Unit)
+
+    /**
+     * 取消作业
+     */
+    fun cancelJob(ticketId: Long)
+    /**
+     * 结束作业
+     */
+    fun finishJob(ticketId: Long)
 }

+ 0 - 14
data/src/main/java/com/grkj/data/repository/IStepRepository.kt

@@ -1,14 +0,0 @@
-package com.grkj.data.repository
-
-import com.grkj.data.model.res.StepDetailRes
-
-/**
- * 步骤相关仓储层
- */
-interface IStepRepository {
-    /**
-     * 获取步骤详情
-     */
-    fun getStepDetail(ticketId: Long, callback: (List<StepDetailRes>?) -> Unit)
-
-}

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

@@ -13,22 +13,14 @@ import com.grkj.data.model.res.LockInfoRes
 import com.grkj.data.model.res.LockPageRes
 import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.shared.utils.Pinyin4jUtil
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 硬件仓储
  */
-class HardwareRepository : IHardwareRepository {
-    private val hardwareDao: HardwareDao by lazy { ISCSDatabase.instance.hardwareDao() }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: HardwareRepository by lazy {
-            HardwareRepository()
-        }
-    }
+@Singleton
+class HardwareRepository @Inject constructor(val hardwareDao: HardwareDao) : IHardwareRepository {
 
     /**
      * 获取锁信息

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

@@ -7,12 +7,14 @@ import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.data.model.vo.PointManageFilterVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.repository.IIsolationPointRepository
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 隔离点仓储实现
  */
-class IsolationPointRepository : IIsolationPointRepository {
-    private val isolationPointDao: IsolationPointDao by lazy { ISCSDatabase.instance.isolationPointDao() }
+@Singleton
+class IsolationPointRepository @Inject constructor(val isolationPointDao: IsolationPointDao) : IIsolationPointRepository {
 
     override fun deletePointByPointIds(pointIds: List<Long>) {
         isolationPointDao.deletePointByPointIds(pointIds)
@@ -50,14 +52,4 @@ class IsolationPointRepository : IIsolationPointRepository {
     override fun getAllPointManageDataWithWorkstationId(workstationId: Long): MutableList<PointManageVo> {
         return isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId)
     }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: IsolationPointRepository by lazy {
-            IsolationPointRepository()
-        }
-    }
 }

+ 52 - 9
data/src/main/java/com/grkj/data/repository/impl/JobTicketRepository.kt

@@ -11,6 +11,7 @@ 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.res.StepDetailRes
 import com.grkj.data.model.res.TicketDetailRes
 import com.grkj.data.model.vo.IsJobTicketDataVo
 import com.grkj.data.model.vo.IsJobTicketKeyDataVo
@@ -22,12 +23,14 @@ 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 javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 作业票实现
  */
-class JobTicketRepository : IJobTicketRepository {
-    private val jobTicketDao: JobTicketDao by lazy { ISCSDatabase.instance.jobTicketDao() }
+@Singleton
+class JobTicketRepository @Inject constructor(val jobTicketDao: JobTicketDao) : IJobTicketRepository {
     override fun createJob(
         selectedSopPoints: List<PointManageVo>,
         selectedLockerData: List<UserManageVo>,
@@ -244,13 +247,53 @@ class JobTicketRepository : IJobTicketRepository {
         return jobTicketDao.getJobTicketUserDataByTicketId(ticketId)
     }
 
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: JobTicketRepository by lazy {
-            JobTicketRepository()
+    override fun updateClockerAndColockerData(
+        ticketId: Long,
+        currentStepData: IsJobTicketStepDataVo?,
+        selectedLockerData: List<UserManageVo>,
+        selectedColockerData: List<UserManageVo>
+    ) {
+        jobTicketDao.deleteJobTicketUserByTicketIds(listOf(ticketId))
+        val ticketLockerUsers = selectedLockerData.map {
+            val isJobticketUser = IsJobTicketUser()
+            isJobticketUser.userId = it.userId
+            isJobticketUser.ticketId = ticketId
+            isJobticketUser.userName = it.userName
+            isJobticketUser.userRole = RoleEnums.JTLOCKER.roleKey
+            isJobticketUser
         }
+        val ticketColockerUsers = selectedColockerData.map {
+            val isJobticketUser = IsJobTicketUser()
+            isJobticketUser.userId = it.userId
+            isJobticketUser.ticketId = ticketId
+            isJobticketUser.userName = it.userName
+            isJobticketUser.userRole = RoleEnums.JTCOLOCKER.roleKey
+            isJobticketUser
+        }
+        jobTicketDao.saveIsJobTicketUser(ticketLockerUsers)
+        jobTicketDao.saveIsJobTicketUser(ticketColockerUsers)
+        currentStepData?.let {
+            jobTicketDao.updateTicketStepStatus(currentStepData.stepId, "1")
+        }
+    }
+
+    override fun getStepDetail(
+        ticketId: Long,
+        callback: (List<StepDetailRes>?) -> Unit
+    ) {
+        TODO("Not yet implemented")
+    }
+
+    override fun cancelJob(ticketId: Long) {
+        jobTicketDao.deleteJobTicketKeyByTicketIds(listOf(ticketId))
+        jobTicketDao.deleteJobTicketLockByTicketIds(listOf(ticketId))
+        jobTicketDao.deleteJobTicketPointsByTicketIds(listOf(ticketId))
+        jobTicketDao.deleteJobTicketStepByTicketIds(listOf(ticketId))
+        jobTicketDao.deleteJobTicketUserByTicketIds(listOf(ticketId))
+        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnums.CANCELED.status)
+    }
+
+    override fun finishJob(ticketId: Long) {
+        jobTicketDao.updateTicketStatus(ticketId, JobTicketStatusEnums.FINISHED.status)
     }
 }

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

@@ -5,25 +5,17 @@ import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.repository.IIsolationPointRepository
 import com.grkj.data.repository.IRfidTokenRepository
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * RFID标签仓储实现
  */
-class RfidTokenRepository : IRfidTokenRepository {
-    private val rfidTokenDao: RfidTokenDao by lazy { ISCSDatabase.instance.rfidTokenDao() }
+@Singleton
+class RfidTokenRepository @Inject constructor(val rfidTokenDao: RfidTokenDao): IRfidTokenRepository {
     override fun addRfidToken(rfidToken: String?): Long {
         val isRfidToken = IsRfidToken()
         isRfidToken.rfid = rfidToken ?: ""
         return rfidTokenDao.insertRfidToken(isRfidToken)
     }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: RfidTokenRepository by lazy {
-            RfidTokenRepository()
-        }
-    }
 }

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

@@ -7,12 +7,14 @@ import com.grkj.data.model.dos.SysUserRole
 import com.grkj.data.model.vo.RoleManageFilterVo
 import com.grkj.data.model.vo.RoleManageVo
 import com.grkj.data.repository.IRoleRepository
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 岗位仓储
  */
-class RoleRepository : IRoleRepository {
-    private val roleDao: RoleDao by lazy { ISCSDatabase.instance.roleDao() }
+@Singleton
+class RoleRepository @Inject constructor(val roleDao: RoleDao): IRoleRepository {
 
     override fun getRoleData(): List<SysRole> {
         return roleDao.getRoleData()
@@ -46,14 +48,4 @@ class RoleRepository : IRoleRepository {
             current * size
         )
     }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: RoleRepository by lazy {
-            RoleRepository()
-        }
-    }
 }

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

@@ -10,12 +10,14 @@ 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.ISopRepository
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * sop仓储实现
  */
-class SopRepository : ISopRepository {
-    private val isSopDao: IsSopDao by lazy { ISCSDatabase.instance.isSopDao() }
+@Singleton
+class SopRepository @Inject constructor(val isSopDao: IsSopDao): ISopRepository {
 
     override fun saveSop(
         sopId: Long,
@@ -99,14 +101,4 @@ class SopRepository : ISopRepository {
     override fun deleteSopUsersBySopId(sopIds: List<Long>) {
         isSopDao.deleteSopUsersBySopId(sopIds)
     }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: SopRepository by lazy {
-            SopRepository()
-        }
-    }
 }

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

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

+ 7 - 15
data/src/main/java/com/grkj/data/repository/impl/UserRepository.kt

@@ -12,25 +12,17 @@ import com.grkj.data.repository.IUserRepository
 import com.grkj.shared.utils.BCryptUtils
 import com.grkj.shared.utils.BiometricVerifier
 import com.grkj.shared.utils.Pinyin4jUtil
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 用户仓储层
  */
-class UserRepository : IUserRepository {
-    private val hardwareDao: HardwareDao by lazy { ISCSDatabase.instance.hardwareDao() }
-
-    private val userDao: UserDao by lazy { ISCSDatabase.instance.userDao() }
-
-    companion object {
-
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: UserRepository by lazy {
-            UserRepository()
-        }
-    }
+@Singleton
+class UserRepository @Inject constructor(
+    private val hardwareDao: HardwareDao,
+    private val userDao: UserDao
+)  : IUserRepository {
 
     override fun loginWithAccount(
         username: String, password: String

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

@@ -6,12 +6,14 @@ import com.grkj.data.model.dos.IsUserWorkstation
 import com.grkj.data.model.dos.IsWorkstation
 import com.grkj.data.model.vo.WorkstationManageVo
 import com.grkj.data.repository.IWorkstationRepository
+import javax.inject.Inject
+import javax.inject.Singleton
 
 /**
  * 岗位仓储
  */
-class WorkstationRepository : IWorkstationRepository {
-    private val workstationDao: WorkstationDao by lazy { ISCSDatabase.instance.workstationDao() }
+@Singleton
+class WorkstationRepository @Inject constructor(val workstationDao: WorkstationDao) : IWorkstationRepository {
 
     override fun getWorkStationData(): List<IsWorkstation> {
         return workstationDao.getWorkstationData()
@@ -85,14 +87,4 @@ class WorkstationRepository : IWorkstationRepository {
         sortRec(roots)
         return roots
     }
-
-    companion object {
-        /**
-         * 单例
-         */
-        @JvmStatic
-        val instance: WorkstationRepository by lazy {
-            WorkstationRepository()
-        }
-    }
 }

+ 4 - 0
shared/build.gradle.kts

@@ -1,6 +1,8 @@
 plugins {
     alias(libs.plugins.android.library)
     alias(libs.plugins.kotlin.android)
+    id("com.google.devtools.ksp")
+    id("com.google.dagger.hilt.android")
 }
 
 android {
@@ -51,6 +53,8 @@ dependencies {
     api("org.mindrot:jbcrypt:0.4")
     implementation("com.machinezoo.sourceafis:sourceafis:3.15.0")
     implementation("com.belerweb:pinyin4j:2.5.0")
+    implementation("com.google.dagger:hilt-android:2.56.2")
+    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
     testImplementation(libs.junit)
     api(
         fileTree(

+ 4 - 0
sync/build.gradle.kts

@@ -1,6 +1,8 @@
 plugins {
     alias(libs.plugins.android.library)
     alias(libs.plugins.kotlin.android)
+    id("com.google.devtools.ksp")
+    id("com.google.dagger.hilt.android")
 }
 
 android {
@@ -35,6 +37,8 @@ android {
 dependencies {
 
     implementation(libs.androidx.core.ktx)
+    implementation("com.google.dagger:hilt-android:2.56.2")
+    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
     implementation(project(":data"))
     testImplementation(libs.junit)
 }

+ 4 - 0
ui-base/build.gradle.kts

@@ -2,6 +2,8 @@ plugins {
     alias(libs.plugins.android.library)
     alias(libs.plugins.kotlin.android)
     id("org.jetbrains.kotlin.kapt")
+    id("com.google.devtools.ksp")
+    id("com.google.dagger.hilt.android")
 }
 
 android {
@@ -52,6 +54,8 @@ dependencies {
     implementation(libs.android.navigation.dynamic.features.fragment)
     implementation(libs.kotlinx.serialization.json)
     implementation(libs.sik.camera)
+    implementation("com.google.dagger:hilt-android:2.56.2")
+    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
     api(libs.android.autosize)
     api(libs.avi.library)
     api(libs.sik.extension.android)

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

@@ -4,6 +4,7 @@ import com.clj.fastble.BleManager
 import com.clj.fastble.data.BleDevice
 import com.clj.fastble.exception.BleException
 import com.google.gson.Gson
+import com.grkj.data.di.RepositoryManager
 import com.grkj.data.model.local.DeviceTakeUpdate
 import com.grkj.data.model.local.UpdateKeyReturn
 import com.grkj.data.model.local.WorkTicketGet
@@ -12,12 +13,6 @@ import com.grkj.data.model.local.WorkTicketSend.LockListBO
 import com.grkj.data.model.req.LockPointUpdateReq
 import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.res.TicketDetailRes
-import com.grkj.data.repository.IHardwareRepository
-import com.grkj.data.repository.IJobTicketRepository
-import com.grkj.data.repository.IStepRepository
-import com.grkj.data.repository.impl.HardwareRepository
-import com.grkj.data.repository.impl.JobTicketRepository
-import com.grkj.data.repository.impl.StepRepository
 import com.grkj.shared.config.Constants
 import com.grkj.ui_base.R
 import com.grkj.ui_base.data.DictConstants
@@ -50,21 +45,6 @@ import org.slf4j.LoggerFactory
 object BleBusinessManager {
     private val logger = LoggerFactory.getLogger(BleBusinessManager::class.java)
 
-    /**
-     * 硬件仓储
-     */
-    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository() }
-
-    /**
-     * 步骤仓储
-     */
-    private val stepRepository: IStepRepository by lazy { StepRepository() }
-
-    /**
-     * 工作票仓储
-     */
-    private val jobTicketRepository: IJobTicketRepository by lazy { JobTicketRepository.instance }
-
     /**
      * 处理工作票完成情况
      */
@@ -136,9 +116,9 @@ object BleBusinessManager {
 
             LoadingEvent.sendLoadingEvent()
             PopTip.tip(R.string.key_return_success)
-            if (hardwareRepository.canReturn()) {
+            if (RepositoryManager.hardwareRepo.canReturn()) {
                 // 上报点位钥匙绑定
-                hardwareRepository.updateLockPointBatch(updateList) { isSuccess, msg ->
+                RepositoryManager.hardwareRepo.updateLockPointBatch(updateList) { isSuccess, msg ->
                     if (isSuccess || msg == CommonUtils.getStr(R.string.lock_nfc_lost)) {
                         data.taskCode?.toLong()?.let {
                             UpdateTicketProgressEvent.sendUpdateTicketProgressEvent(it)
@@ -151,7 +131,7 @@ object BleBusinessManager {
                 }
 
                 // 上报钥匙归还
-                hardwareRepository.updateKeyReturn(
+                RepositoryManager.hardwareRepo.updateKeyReturn(
                     data.taskCode?.toLong()!!, keyNfc!!, SIKCore.getApplication().serialNo()
                 ) { isSuccess, msg ->
                     if (!isSuccess && msg != CommonUtils.getStr(R.string.ticket_lost)) {
@@ -177,7 +157,7 @@ object BleBusinessManager {
      */
     fun handleVirtualKeyGive(taskCode: Long, keyNfc: String, done: () -> Unit) {
         // 上报钥匙取出
-        hardwareRepository.updateKeyTake(
+        RepositoryManager.hardwareRepo.updateKeyTake(
             taskCode,
             keyNfc,
             SIKCore.getApplication().serialNo()
@@ -193,7 +173,7 @@ object BleBusinessManager {
      */
     fun handleVirtualKeyReturn(taskCode: Long, keyNfc: String, done: () -> Unit) {
         // 上报钥匙归还
-        hardwareRepository.updateKeyReturn(
+        RepositoryManager.hardwareRepo.updateKeyReturn(
             taskCode, keyNfc, SIKCore.getApplication().serialNo()
         ) { isSuccess, msg ->
             if (!isSuccess && msg != CommonUtils.getStr(R.string.ticket_lost)
@@ -270,13 +250,13 @@ object BleBusinessManager {
                     val updateBo =
                         ModbusBusinessManager.mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_KEY && key.rfid == it.nfc }
                     updateBo?.let { itBO ->
-                        stepRepository.getStepDetail(itBO.ticketId) {
+                        RepositoryManager.jobTicketRepo.getStepDetail(itBO.ticketId) {
                             var step = 0
                             it?.filter { it.stepStatus == "1" }
                                 ?.maxByOrNull { it.stepIndex!! }?.stepIndex?.let {
                                     step = it
                                 }
-                            jobTicketRepository.getTicketDetail(itBO.ticketId) { ticketDetail ->
+                            RepositoryManager.jobTicketRepo.getTicketDetail(itBO.ticketId) { ticketDetail ->
                                 val role = ticketDetail?.ticketUserVOList?.find {
                                     it.userId == SPUtils.getLoginUser(SIKCore.getApplication())?.userId && it.userType == Constants.USER_TYPE_LOCKER
                                 }

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

@@ -1,5 +1,6 @@
 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
@@ -12,29 +13,29 @@ import kotlin.coroutines.resume
  * 数据业务
  */
 object DataBusiness {
-    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository() }
+
     // 1. 把 NetApi.get…Page 包成 suspend 函数
     suspend fun getSlotsPage(): CabinetSlotsRes? = suspendCancellableCoroutine { cont ->
-        hardwareRepository.getIsLockCabinetSlotsPage { slots ->
+        RepositoryManager.hardwareRepo.getIsLockCabinetSlotsPage { slots ->
             cont.resume(slots)
         }
     }
 
     suspend fun getLocksPage(): LockPageRes? = suspendCancellableCoroutine { cont ->
-        hardwareRepository.getIsLockPage { locks ->
+        RepositoryManager.hardwareRepo.getIsLockPage { locks ->
             cont.resume(locks)
         }
     }
 
     suspend fun getKeyPage(): KeyPageRes? = suspendCancellableCoroutine { cont ->
-        hardwareRepository.getIsKeyPage { keys ->
+        RepositoryManager.hardwareRepo.getIsKeyPage { keys ->
             cont.resume(keys)
         }
     }
 
     // 2. 把原本同步的字典查询留在 IO 线程
     suspend fun <T> fetchDict(key: String): List<T> =suspendCancellableCoroutine { cont ->
-        hardwareRepository.getDictData(key) { dictData ->
+        RepositoryManager.hardwareRepo.getDictData(key) { dictData ->
             cont.resume(dictData)
         }
     }

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

@@ -1,6 +1,7 @@
 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
@@ -34,11 +35,6 @@ import org.slf4j.LoggerFactory
 object ModbusBusinessManager {
     private val logger = LoggerFactory.getLogger(ModbusBusinessManager::class.java)
 
-    /**
-     * 硬件仓储
-     */
-    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository() }
-
     // 设备待取列表(需要报给后台的列表,等实际取完再上报)
     val mDeviceTakeList = mutableListOf<DeviceTakeUpdate>()
 
@@ -71,7 +67,7 @@ object ModbusBusinessManager {
                     ?.let { info ->
                         LoadingEvent.sendLoadingEvent()
                         SPUtils.takeKey(info.ticketId)
-                        hardwareRepository.updateKeyTake(
+                        RepositoryManager.hardwareRepo.updateKeyTake(
                             info.ticketId, info.nfc, SIKCore.getApplication().serialNo()!!
                         ) { isSuccess ->
                             if (isSuccess) {
@@ -101,7 +97,7 @@ object ModbusBusinessManager {
             1 -> {
                 mDeviceTakeList.find { it.deviceType == DeviceConst.DEVICE_TYPE_LOCK && it.nfc == deviceTakeUpdateBO.nfc }
                     ?.let { info ->
-                        hardwareRepository.updateLockTake(
+                        RepositoryManager.hardwareRepo.updateLockTake(
                             mutableListOf(
                                 LockTakeUpdateReq(
                                     info.ticketId, info.nfc, SIKCore.getApplication().serialNo()!!

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

@@ -48,5 +48,10 @@ object EventConstants {
      */
     const val EVENT_DEVICE_TAKE: Int = 100_003_003
 
+    /**
+     * RFID读卡事件
+     */
+    const val EVENT_RFID_CARD_READ: Int = 100_003_004
+
 
 }

+ 23 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/event/RFIDCardReadEvent.kt

@@ -0,0 +1,23 @@
+package com.grkj.ui_base.utils.event
+
+import com.grkj.shared.model.EventBean
+import com.grkj.ui_base.data.EventConstants
+
+/**
+ * RFID读取事件
+ */
+class RFIDCardReadEvent(val rfidNo: String) {
+    companion object {
+        /**
+         * 发送当前模式通知
+         */
+        @JvmStatic
+        fun sendRFIDCardReadEvent(rfidNo: String) {
+            val rfidCardReadEventBean = EventBean<RFIDCardReadEvent>(
+                EventConstants.EVENT_RFID_CARD_READ,
+                RFIDCardReadEvent(rfidNo)
+            )
+            EventHelper.sendEvent(rfidCardReadEventBean)
+        }
+    }
+}

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

@@ -1,9 +1,10 @@
 package com.grkj.ui_base.utils.modbus
 
 import com.clj.fastble.BleManager
-import com.grkj.data.repository.impl.HardwareRepository
+import com.grkj.data.di.RepositoryManager
 import com.grkj.data.model.res.CabinetSlotsRecord
 import com.grkj.data.repository.IHardwareRepository
+import com.grkj.data.repository.impl.HardwareRepository
 import com.grkj.ui_base.R
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.Executor
@@ -25,11 +26,6 @@ import kotlin.coroutines.suspendCoroutine
 object ModBusController {
     private val logger: Logger = LoggerFactory.getLogger(ModBusController::class.java)
 
-    /**
-     * 硬件仓储
-     */
-    private val hardwareRepository: IHardwareRepository by lazy { HardwareRepository() }
-
     /**
      * 是否初始化完成
      */
@@ -184,7 +180,7 @@ object ModBusController {
                         val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                         logger.info("初始化锁具 RFID : $rfid")
                         updateLockRfid(dockBean.addr, idx, rfid)
-                        hardwareRepository.getLockInfo(rfid) {
+                        RepositoryManager.hardwareRepo.getLockInfo(rfid) {
                             updateLockNewHardware(dockBean.addr, idx, it == null)
                         }
                     }
@@ -215,7 +211,7 @@ object ModBusController {
                             // 更新rfid
                             updateKeyRfid(dockBean.addr, key.idx, rfid)
                             // 蓝牙准备操作
-                            hardwareRepository.getKeyInfo(rfid) {
+                            RepositoryManager.hardwareRepo.getKeyInfo(rfid) {
                                 logger.info("getKeyInfo : $rfid - ${it?.macAddress}")
                                 updateKeyNewHardware(dockBean.addr, key.idx, it == null)
                                 if (it != null && !it.macAddress.isNullOrEmpty()) {
@@ -322,7 +318,7 @@ object ModBusController {
         }
         res.forEach { bytes ->
             val dockBean = updateExtraLockStatus(bytes) ?: return@forEach
-            if (!hardwareRepository.canReturn()) {
+            if (!RepositoryManager.hardwareRepo.canReturn()) {
                 return@forEach
             }
             when (dockBean.type) {
@@ -377,7 +373,7 @@ object ModBusController {
 
         res.forEach { bytes ->
             val dockBean = updateLockStatus(bytes) ?: return@forEach
-            if (!hardwareRepository.canReturn()) {
+            if (!RepositoryManager.hardwareRepo.canReturn()) {
                 return@forEach
             }
             when (dockBean.type) {