Parcourir la source

refactor(更新)
- 单解锁
- 解锁-上锁功能完成

周文健 il y a 4 mois
Parent
commit
d5f79c93bd
33 fichiers modifiés avec 271 ajouts et 169 suppressions
  1. 5 0
      app/src/main/java/com/grkj/iscs/common/DataTransferConstants.kt
  2. 10 3
      app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt
  3. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  4. 14 16
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  5. 11 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  6. 5 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  7. 5 0
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  8. 60 96
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  9. 7 4
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/LockedPointsFragment.kt
  10. 11 2
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/common/SelectPointViewModel.kt
  11. 3 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobViewModel.kt
  12. 2 1
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/LockedPointsViewModel.kt
  13. 3 0
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/SopViewModel.kt
  14. 1 1
      app/src/main/res/drawable/home_card_bg.xml
  15. 3 4
      app/src/main/res/layout-land/item_home_quick_entrance.xml
  16. 2 2
      app/src/main/res/layout/fragment_locked_point.xml
  17. 3 4
      app/src/main/res/layout/item_home_quick_entrance.xml
  18. 2 2
      app/src/main/res/layout/item_locked_points_point.xml
  19. 1 0
      app/src/main/res/values-en/strings.xml
  20. 1 0
      app/src/main/res/values-zh/strings.xml
  21. 1 0
      app/src/main/res/values/strings.xml
  22. 39 20
      data/src/main/java/com/grkj/data/dao/JobTicketDao.kt
  23. 24 6
      data/src/main/java/com/grkj/data/dao/WorkflowStepDao.kt
  24. 1 1
      data/src/main/java/com/grkj/data/model/dos/IsJobTicket.kt
  25. 4 0
      data/src/main/java/com/grkj/data/model/dos/IsJobTicketPoints.kt
  26. 31 0
      data/src/main/java/com/grkj/data/model/vo/LockedPointVo.kt
  27. 2 1
      data/src/main/java/com/grkj/data/repository/IJobTicketRepository.kt
  28. 2 1
      data/src/main/java/com/grkj/data/repository/impl/network/NetworkJobTicketRepository.kt
  29. 8 2
      data/src/main/java/com/grkj/data/repository/impl/standard/IsolationPointRepository.kt
  30. 4 1
      data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt
  31. 3 0
      ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt
  32. 1 0
      ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt
  33. 1 1
      ui-base/src/main/res/drawable/common_card_bg.xml

+ 5 - 0
app/src/main/java/com/grkj/iscs/common/DataTransferConstants.kt

@@ -10,6 +10,11 @@ object DataTransferConstants {
      */
     const val KEY_SELECTED_POINT_DATA = "key_selected_point_data"
 
+    /**
+     * 是否解锁优先
+     */
+    const val KEY_IS_UNLOCK_FIRST = "key_is_unlock_first"
+
     /**
      * 已经选择的上锁人/共锁人
      */

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

@@ -1,8 +1,6 @@
 package com.grkj.iscs.features.main.fragment.common
 
-import androidx.activity.viewModels
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.models
@@ -17,7 +15,7 @@ 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
+import kotlin.math.log
 
 /**
  * 选择点位界面
@@ -104,6 +102,15 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
             .getData(DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA) as Int
         binding.previewStepTitle.text = previewStepTitle
         binding.previewStepIv.setImageResource(previewStepIcon)
+        logger.info(
+            "参数是否存在:${
+                GlobalDataTempStore.getInstance().hasData(DataTransferConstants.KEY_IS_UNLOCK_FIRST)
+            }"
+        )
+        if (GlobalDataTempStore.getInstance().hasData(DataTransferConstants.KEY_IS_UNLOCK_FIRST)) {
+            viewModel.unlockFirst = GlobalDataTempStore.getInstance()
+                .getData(DataTransferConstants.KEY_IS_UNLOCK_FIRST) as Boolean
+        }
         viewModel.getPointData().observe(this) {
             binding.selectedPointRv.models = selectedPointData
             binding.unselectedPointRv.models = viewModel.pointManageData.apply {

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

@@ -34,7 +34,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     private val quickEntranceList = mutableListOf<MenuItemEntity>(
         MenuItemEntity(
             0,
-            R.mipmap.icon_data_manage_menu_user_manage,
+            R.mipmap.icon_job_manage_create_job,
             "新建作业",
             "quick_entrance:create_job"
         )

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

@@ -124,10 +124,10 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     })
             }
         }
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             setWorkstationData()
         }
-        binding.lockModeTv.setOnClickListener {
+        binding.lockModeTv.setDebouncedClickListener {
             setWorkflowModeData()
         }
         binding.noSelectedPointLayout.setDebouncedClickListener {
@@ -152,6 +152,12 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_job_manage_create_job
                 )
+            val isSaveSuccess = GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
+            logger.info("是否保存成功:${isSaveSuccess}")
             navController.navigate(R.id.action_createJobFragment_to_selectPointFragment)
         }
         binding.noSelectedMemberLayout.setDebouncedClickListener {
@@ -242,6 +248,12 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_job_manage_create_job
                 )
+            val isSaveSuccess = GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
+            logger.info("是否保存成功:${isSaveSuccess}")
             navController.navigate(R.id.action_createJobFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {
@@ -412,20 +424,6 @@ class CreateJobFragment : BaseFormFragment<FragmentCreateJobBinding>() {
         }
     }
 
-    private fun clearData() {
-        binding.jobNameEt.setText("")
-        selectedLockerData = listOf()
-        selectedColockerData = listOf()
-        selectedPointData = listOf()
-        selectedModeId = null
-        selectedWorkstationId = null
-        binding.saveSop.isChecked = false
-        binding.lockModeTv.text = ""
-        binding.workstationTv.text = ""
-        binding.noSelectedMemberLayout.isVisible = true
-        binding.noSelectedPointLayout.isVisible = true
-    }
-
     /**
      * 检查数据
      */

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

@@ -116,6 +116,12 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_job_manage_create_sop
                 )
+            val isSaveSuccess = GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
+            logger.info("是否保存成功:${isSaveSuccess}")
             navController.navigate(R.id.action_createSopFragment_to_selectPointFragment)
         }
         binding.noSelectedMemberLayout.setDebouncedClickListener {
@@ -203,6 +209,11 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_job_manage_create_sop
                 )
+            GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
             navController.navigate(R.id.action_createSopFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {

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

@@ -150,6 +150,11 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                 DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                 R.mipmap.icon_data_manage_menu_point_manage
             )
+            GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
             navController.navigate(R.id.action_editJobFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {

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

@@ -142,6 +142,11 @@ class EditSopFragment : BaseFormFragment<FragmentEditSopBinding>() {
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_data_manage_menu_point_manage
                 )
+            GlobalDataTempStore.getInstance()
+                .saveData(
+                    DataTransferConstants.KEY_IS_UNLOCK_FIRST,
+                    viewModel.isUnlockFirst
+                )
             navController.navigate(R.id.action_editSopFragment_to_selectPointFragment)
         }
         binding.selectMemberTv.setDebouncedClickListener {

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

@@ -212,8 +212,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         //点击确认的时候需要
         itemBinding.stepLayout.setDebouncedClickListener {
-            val workflowStep =
-                viewModel.workflowSteps.find { it.stepId == item.workflowStepId }
+            val workflowStep = viewModel.workflowSteps.find { it.stepId == item.workflowStepId }
             viewModel.canCheckStep().observe(this@JobExecuteFragment) {
                 if (it) {
 
@@ -229,27 +228,18 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         )
                         return@observe
                     }
-                    if (workflowStep?.confirmType != 0 &&
-                        (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)
-                    ) {
+                    if (workflowStep?.confirmType != 0 && (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)) {
                         stepClickConfirm(adapter, item, workflowStep)
-                    } else if (workflowStep?.confirmType == 0 &&
-                        workflowStep.confirmRoleCode == null &&
-                        workflowStep.confirmUser == null
-                    ) {
+                    } else if (workflowStep?.confirmType == 0 && workflowStep.confirmRoleCode == null && workflowStep.confirmUser == null) {
                         stepClickConfirm(adapter, item, workflowStep)
-                    } else if (workflowStep?.confirmType == 0 &&
-                        (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
+                    } else if (workflowStep?.confirmType == 0 && (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
                             workflowStep.confirmRoleCode!!
-                        ) == true) &&
-                        workflowStep.confirmUser == null
+                        ) == true) && workflowStep.confirmUser == null
                     ) {
                         stepClickConfirm(adapter, item, workflowStep)
-                    } else if (workflowStep?.confirmType == 0 &&
-                        (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
+                    } else if (workflowStep?.confirmType == 0 && (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
                             workflowStep.confirmRoleCode!!
-                        ) == true) &&
-                        (workflowStep.confirmUser != null && MainDomainData.userInfo?.userId == workflowStep.confirmUser)
+                        ) == true) && (workflowStep.confirmUser != null && MainDomainData.userInfo?.userId == workflowStep.confirmUser)
                     ) {
                         stepClickConfirm(adapter, item, workflowStep)
                     } else {
@@ -265,9 +255,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
     }
 
     private fun stepClickConfirm(
-        adapter: BindingAdapter,
-        item: IsJobTicketStepDataVo,
-        workflowStep: WorkflowStep?
+        adapter: BindingAdapter, item: IsJobTicketStepDataVo, workflowStep: WorkflowStep?
     ) {
         if (!checkSelectMember(workflowStep)) {
             if (viewModel.stepConditionsComplete(workflowStep)) {
@@ -287,8 +275,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                             }
                             adapter.notifyDataSetChanged()
                         }
-                    }
-                )
+                    })
             } else {
                 val errorTipData = viewModel.getStepErrorTip(workflowStep)
                 PopTip.tip(errorTipData.first)
@@ -303,39 +290,31 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         workflowStep: WorkflowStep?
     ): Boolean {
         val currentWorkflowStep = viewModel.getCurrentWorkflowStep()
-        if (workflowStep?.enableSetLocker == true ||
-            workflowStep?.enableSetColocker == true &&
-            (currentWorkflowStep?.enableAddColocker == true || currentWorkflowStep?.enableReduceColocker == true)
-        ) {
+        if (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true && (currentWorkflowStep?.enableAddColocker == true || currentWorkflowStep?.enableReduceColocker == true)) {
             GlobalDataTempStore.getInstance().saveData(
                 DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
                 viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == 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
-                )
+            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
+            )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_JOB_TICKET_ID, viewModel.ticketId)
             navController.navigate(R.id.action_jobExecuteFragment_to_selectMemberFragment)
@@ -415,17 +394,14 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     val currentWorkflowStep =
                         viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
                     //当前步骤能加共锁并且锁已经上锁或者当前步骤能解共锁并且锁已经上锁
-                    if ((currentWorkflowStep?.enableColock == true || currentWorkflowStep?.enableReleaseColock == true) &&
-                        viewModel.ticketPoints.all { it.pointStatus == "1" }
-                    ) {
+                    if ((currentWorkflowStep?.enableColock == true || currentWorkflowStep?.enableReleaseColock == true) && viewModel.ticketPoints.all { it.pointStatus == "1" }) {
                         viewModel.getUserIdByCardRfid(it.rfidNo).observe(this) { userId ->
                             userId?.let {
-                                val isJobCardUser =
-                                    viewModel.ticketUser.filter {
-                                        it.userRole?.contains(
-                                            RoleEnum.JTCOLOCKER.roleKey
-                                        ) == true
-                                    }.find { it.userId == userId }
+                                val isJobCardUser = viewModel.ticketUser.filter {
+                                    it.userRole?.contains(
+                                        RoleEnum.JTCOLOCKER.roleKey
+                                    ) == true
+                                }.find { it.userId == userId }
                                 isJobCardUser?.let { colocker ->
                                     if (colocker.jobStatus == "0" && currentWorkflowStep.enableColock) {
                                         logger.info("添加共锁")
@@ -433,8 +409,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                                             msg = CommonUtils.getStr(
                                                 com.grkj.ui_base.R.string.confirm_to_colock,
                                                 colocker.nickName
-                                            )
-                                                .toString(), countDownTime = 10, onConfirmClick = {
+                                            ).toString(), countDownTime = 10, onConfirmClick = {
                                                 colocker.jobStatus = "1"
                                                 viewModel.colockerStatusChange(colocker)
                                                     .observe(this) {
@@ -453,8 +428,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                                             msg = CommonUtils.getStr(
                                                 com.grkj.ui_base.R.string.confirm_to_uncolock,
                                                 colocker.nickName
-                                            )
-                                                .toString(), countDownTime = 10, onConfirmClick = {
+                                            ).toString(), countDownTime = 10, onConfirmClick = {
                                                 colocker.jobStatus = "2"
                                                 viewModel.colockerStatusChange(colocker)
                                                     .observe(this) {
@@ -492,8 +466,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     showCancel = false,
                     onConfirmClick = {
                         navController.popBackStack()
-                    }
-                )
+                    })
             }
         }
     }
@@ -544,29 +517,23 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         } else {
             val currentStep =
                 viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
-            when {
-                //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
-                (currentStep?.enableCancelJob == true && viewModel.ticketPoints.any { it.pointStatus != "0" }) -> {
-                    binding.cancelJob.isVisible = true
-                }
-                //步骤开启上锁,并且点位都还没有上锁
-                currentStep?.enableLock == true && viewModel.ticketPoints.any { it.pointStatus == "0" } -> {
-                    binding.toLock.isVisible = true
-                }
-                //步骤开启共锁,并且点位都不存在没有上锁的
-                currentStep?.enableColock == true && viewModel.ticketPoints.all { it.pointStatus != "0" } -> {
-
-                }
-                //步骤开启解锁,并且点位都已经上锁,并且如果支持共锁都已经解除
+            //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
+            binding.cancelJob.isVisible =
+                currentStep?.enableCancelJob == true && viewModel.ticketPoints.all { it.pointStatus == "0" }
+            binding.toLock.isVisible =
+                    //步骤开启上锁,并且点位都还没有上锁
+                (currentStep?.enableLock == true && viewModel.ticketPoints.any { it.pointStatus == "0" }) ||
+                        //步骤开启共锁,并且点位都不存在没有上锁的
+                        (currentStep?.enableColock == true && viewModel.ticketPoints.all { it.pointStatus != "0" }) ||
+                        (currentStep?.enableLock == true && viewModel.isUnlockFirst && viewModel.ticketPoints.all { it.pointStatus == "2" })
+            //步骤开启解锁,并且点位都已经上锁,并且如果支持共锁都已经解除
+            binding.toUnlock.isVisible =
                 currentStep?.enableUnlock == true &&
                         viewModel.ticketPoints.all { it.pointStatus == "1" } &&
                         (viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == false ||
                                 (viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.isColockSupport == true &&
                                         viewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
-                                            .all { it.jobStatus == "2" })) -> {
-                    binding.toUnlock.isVisible = true
-                }
-            }
+                                            .all { it.jobStatus == "2" }))
         }
     }
 
@@ -617,22 +584,19 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         viewModel.ticketUser.let {
             binding.waitToColockRv.models =
                 it.filter { it.jobStatus == "0" && it.userRole == RoleEnum.JTCOLOCKER.roleKey }
-            binding.waitToColock.text =
-                getString(
-                    R.string.wait_to_colock,
-                    it.count { it.jobStatus == "0" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
+            binding.waitToColock.text = getString(
+                R.string.wait_to_colock,
+                it.count { it.jobStatus == "0" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
             binding.alreadyColockRv.models =
                 it.filter { it.jobStatus == "1" && it.userRole == RoleEnum.JTCOLOCKER.roleKey }
-            binding.alreadyColock.text =
-                getString(
-                    R.string.already_colock,
-                    it.count { it.jobStatus == "1" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
+            binding.alreadyColock.text = getString(
+                R.string.already_colock,
+                it.count { it.jobStatus == "1" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
             binding.alreadyUncolockRv.models =
                 it.filter { it.jobStatus == "2" && it.userRole == RoleEnum.JTCOLOCKER.roleKey }
-            binding.alreadyUncolock.text =
-                getString(
-                    R.string.already_uncolock,
-                    it.count { it.jobStatus == "2" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
+            binding.alreadyUncolock.text = getString(
+                R.string.already_uncolock,
+                it.count { it.jobStatus == "2" && it.userRole == RoleEnum.JTCOLOCKER.roleKey })
         }
     }
 

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

@@ -9,6 +9,8 @@ import com.drake.brv.utils.divider
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
+import com.grkj.data.enums.JobTicketStatusEnum
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentLockedPointBinding
@@ -52,7 +54,7 @@ class LockedPointsFragment : BaseFragment<FragmentLockedPointBinding>() {
             this.endVisible = true
             this.orientation = DividerOrientation.VERTICAL
         }.setup {
-            addType<PointManageVo>(R.layout.item_locked_points_point)
+            addType<LockedPointVo>(R.layout.item_locked_points_point)
             onBind {
                 onRoleDataBinding(this)
             }
@@ -61,10 +63,11 @@ class LockedPointsFragment : BaseFragment<FragmentLockedPointBinding>() {
 
     private fun BindingAdapter.BindingViewHolder.onRoleDataBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemLockedPointsPointBinding>()
-        val item = holder.getModel<PointManageVo>()
+        val item = holder.getModel<LockedPointVo>()
         itemBinding.pointName.text = item.pointName.toString()
-        itemBinding.pointFunction.text = item.pointFunction
-        itemBinding.workstation.text = item.workstationName
+        itemBinding.jobName.text = item.ticketName
+        itemBinding.jobStatus.text =
+            JobTicketStatusEnum.getTicketStatusStr(item.ticketStatus ?: "")
     }
 
     override fun initData() {

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

@@ -8,21 +8,30 @@ import com.grkj.ui_base.base.BaseViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 import kotlinx.coroutines.Dispatchers
+import kotlin.math.log
 
 /**
  * 选择点位
  */
 @HiltViewModel
-class SelectPointViewModel @Inject constructor(val pointRepository: IIsolationPointRepository) : BaseViewModel() {
+class SelectPointViewModel @Inject constructor(val pointRepository: IIsolationPointRepository) :
+    BaseViewModel() {
     var pointManageData: MutableList<PointManageVo> = mutableListOf()
     var workstationId: Long = 0
+    var unlockFirst: Boolean = false
 
     /**
      * 获取点位数据
      */
     fun getPointData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            pointManageData = pointRepository.getAllPointManageDataWithWorkstationId(workstationId)
+            logger.info("解锁优先:${unlockFirst}")
+            pointManageData = if (unlockFirst) {
+                pointRepository.getAllLockedPointManageDataWithWorkstationId(workstationId)
+            } else {
+                pointRepository.getAllPointManageDataWithWorkstationId(workstationId)
+            }
+            logger.info("pointManageData:${pointManageData}")
             emit(true)
         }
     }

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

@@ -39,6 +39,7 @@ class JobViewModel @Inject constructor(
     var workflowModes: List<WorkflowMode> = mutableListOf()
     var workflowSteps: List<WorkflowStep> = mutableListOf()
     var userBiometricDataVo: List<SysBiometricDataVo> = mutableListOf()
+    var isUnlockFirst: Boolean = false
 
     /**
      * 初始化岗位数据
@@ -181,6 +182,8 @@ class JobViewModel @Inject constructor(
     fun getWorkflowSteps(modeId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             workflowSteps = workflowRepository.getStepsByMode(modeId)
+            isUnlockFirst = workflowRepository.isUnlockBeforeLock(modeId)
+            logger.info("是否解锁优先:${isUnlockFirst}")
             emit(true)
         }
     }

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

@@ -2,6 +2,7 @@ package com.grkj.iscs.features.main.viewmodel.job_manage
 
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.ui_base.base.BaseViewModel
@@ -17,7 +18,7 @@ class LockedPointsViewModel @Inject constructor(val jobTicketRepository: IJobTic
     BaseViewModel() {
     private var current: Int = 0
     private var size: Int = 50
-    var lockedPoints: List<PointManageVo>? = listOf()
+    var lockedPoints: List<LockedPointVo>? = listOf()
 
     /**
      * 获取锁定中的点位

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

@@ -35,6 +35,7 @@ class SopViewModel @Inject constructor(
     var workflowModes: List<WorkflowMode> = mutableListOf()
     var workflowSteps: List<WorkflowStep> = mutableListOf()
     var userBiometricDataVo: List<SysBiometricDataVo> = mutableListOf()
+    var isUnlockFirst = false
 
     /**
      * 初始化岗位数据
@@ -109,6 +110,8 @@ class SopViewModel @Inject constructor(
     fun getWorkflowSteps(modeId: Long): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             workflowSteps = workflowRepository.getStepsByMode(modeId)
+            isUnlockFirst = workflowRepository.isUnlockBeforeLock(modeId)
+            logger.info("是否解锁优先:${isUnlockFirst}")
             emit(true)
         }
     }

+ 1 - 1
app/src/main/res/drawable/home_card_bg.xml

@@ -4,6 +4,6 @@
     <stroke
         android:width="@dimen/divider_line_space"
         android:color="@color/black" />
-    <solid android:color="@color/color_e9ecf4" />
+    <solid android:color="@color/white" />
     <corners android:radius="2dp" />
 </shape>

+ 3 - 4
app/src/main/res/layout-land/item_home_quick_entrance.xml

@@ -18,8 +18,7 @@
                 android:id="@+id/home_menu_iv"
                 android:layout_width="@dimen/home_item_quick_entrance_iv"
                 android:layout_height="@dimen/home_item_quick_entrance_iv"
-                android:layout_gravity="center"
-                app:tint="@color/black" />
+                android:layout_gravity="center" />
         </FrameLayout>
 
         <TextView
@@ -28,7 +27,7 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/common_spacing_small"
             android:textColor="@color/black"
-            tools:text="创建作业"
-            android:textSize="@dimen/home_item_quick_entrace_text_size" />
+            android:textSize="@dimen/home_item_quick_entrace_text_size"
+            tools:text="创建作业" />
     </LinearLayout>
 </layout>

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

@@ -75,7 +75,7 @@
                 android:layout_height="match_parent"
                 android:layout_weight="1"
                 android:gravity="center"
-                android:text="@string/point_manage_point_function"
+                android:text="@string/job_name"
                 android:textSize="@dimen/common_text_size" />
 
             <TextView
@@ -83,7 +83,7 @@
                 android:layout_height="match_parent"
                 android:layout_weight="1"
                 android:gravity="center"
-                android:text="@string/point_manage_workstation"
+                android:text="@string/job_status"
                 android:textSize="@dimen/common_text_size" />
         </LinearLayout>
 

+ 3 - 4
app/src/main/res/layout/item_home_quick_entrance.xml

@@ -18,8 +18,7 @@
                 android:id="@+id/home_menu_iv"
                 android:layout_width="@dimen/home_item_quick_entrance_iv"
                 android:layout_height="@dimen/home_item_quick_entrance_iv"
-                android:layout_gravity="center"
-                app:tint="@color/black" />
+                android:layout_gravity="center" />
         </FrameLayout>
 
         <TextView
@@ -28,7 +27,7 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/common_spacing_small"
             android:textColor="@color/black"
-            tools:text="创建作业"
-            android:textSize="@dimen/home_item_quick_entrace_text_size" />
+            android:textSize="@dimen/home_item_quick_entrace_text_size"
+            tools:text="创建作业" />
     </LinearLayout>
 </layout>

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

@@ -16,7 +16,7 @@
             android:textSize="@dimen/common_text_size" />
 
         <TextView
-            android:id="@+id/point_function"
+            android:id="@+id/job_name"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
@@ -24,7 +24,7 @@
             android:textSize="@dimen/common_text_size" />
 
         <TextView
-            android:id="@+id/workstation"
+            android:id="@+id/job_status"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"

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

@@ -444,5 +444,6 @@
     <string name="please_select_process_application">please select process application</string>
     <string name="verify_failed">Verify failed</string>
     <string name="current_user_has_not_face_data">The current user does not have facial data</string>
+    <string name="job_status">Job status</string>
 
 </resources>

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

@@ -444,5 +444,6 @@
     <string name="please_select_process_application">请选择处理申请</string>
     <string name="verify_failed">验证失败</string>
     <string name="current_user_has_not_face_data">当前用户不存在人脸数据</string>
+    <string name="job_status">作业状态</string>
 
 </resources>

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

@@ -447,5 +447,6 @@
     <string name="please_select_process_application">请选择处理申请</string>
     <string name="verify_failed">验证失败</string>
     <string name="current_user_has_not_face_data">当前用户不存在人脸数据</string>
+    <string name="job_status">作业状态</string>
 
 </resources>

+ 39 - 20
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -22,6 +22,7 @@ import com.grkj.data.model.vo.IsJobTicketPointsVO
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.sik.sikcore.date.TimeUtils
@@ -329,24 +330,21 @@ interface JobTicketDao {
      */
     @Query(
         """
-        select iip.point_id as pointId,
-        iip.point_name as pointName,
-        iip.remark as pointFunction,
-        iw.workstation_name as workstationName,
-        iw.workstation_id as workstationId,
-        irt.rfid as rfidToken,
-        irt.rfid_id as rfidId,
-        iip.power_type as powerType
-        from is_job_ticket_points ijtp
-        left join  is_isolation_point iip on ijtp.point_id = iip.point_id
-        left join is_rfid_token irt on iip.rfid_id = irt.rfid_id
-        left join is_workstation iw on iip.workstation_id=iw.workstation_id
+        select ijtp.record_id,
+            ijtp.ticket_id,
+            ijtp.point_id,
+            ijt.ticket_name,
+            ijt.ticket_status,
+            iip.point_name
+        from is_job_ticket_points ijtp 
+        left join is_job_ticket ijt on ijtp.ticket_id=ijt.ticket_id
+        left join is_isolation_point iip on iip.point_id = ijtp.point_id
         where ijtp.point_status = "1"
         order by ijtp.update_time desc
         limit :size offset :offset
     """
     )
-    fun getLockedPointsData(size: Int, offset: Int): List<PointManageVo>
+    fun getLockedPointsData(size: Int, offset: Int): List<LockedPointVo>
 
     /**
      * 更新共锁人状态
@@ -459,12 +457,34 @@ interface JobTicketDao {
      */
     @Query(
         """
-        select ijtp.* from is_job_ticket_points ijtp 
-        left join is_job_ticket ijt on ijtp.ticket_id = ijt.ticket_id
-        where ijtp.point_status = "1" 
-        and ijt.ticket_status = 5
-        and ijt.ex_status is null
-        and ijtp.point_id in (:workstationPointIds)
+       WITH all_events AS (
+          SELECT
+            ijtp.*
+          FROM is_job_ticket_points ijtp
+          JOIN is_job_ticket       ijt
+            ON ijtp.ticket_id = ijt.ticket_id
+          WHERE
+            ijtp.point_id IN (:workstationPointIds)
+        ),
+        latest_per_point AS (
+          SELECT
+            point_id,
+            MAX(update_time) AS max_time
+          FROM all_events
+          GROUP BY point_id
+        )
+        SELECT
+          a.*
+        FROM all_events a
+        JOIN latest_per_point l
+          ON a.point_id    = l.point_id
+         AND a.update_time = l.max_time
+         left join is_job_ticket ijt on ijt.ticket_id = a.ticket_id
+        WHERE
+          -- 最新的工单状态必须是 5,否则整个点位直接排除
+          ijt.ticket_status = 5
+          -- 如果是 5,则再判断点位状态为 1 才保留
+          AND a.point_status = '1';
     """
     )
     fun getAllLockedPointDataWithoutExceptionJob(workstationPointIds: List<Long>): List<IsJobTicketPoints>
@@ -482,5 +502,4 @@ interface JobTicketDao {
     """
     )
     fun getAllLockedPointDataWithExceptionJob(workstationPointIds: List<Long>): List<IsJobTicketPoints>
-
 }

+ 24 - 6
data/src/main/java/com/grkj/data/dao/WorkflowStepDao.kt

@@ -44,14 +44,32 @@ interface WorkflowStepDao {
      * 判定在同一模式下 "解锁" 步骤是否排在 "上锁" 步骤之前
      * 通过比较两者的最小 step_index
      */
-    @Query(
-        "SELECT CASE WHEN " +
-                "(SELECT MIN(step_index) FROM is_workflow_step WHERE mode_id = :modeId AND enable_unlock = 1) < " +
-                "(SELECT MIN(step_index) FROM is_workflow_step WHERE mode_id = :modeId AND enable_lock = 1) " +
-                "THEN 1 ELSE 0 END"
-    )
+    @Query("""
+    SELECT CASE
+      -- 如果没有“解锁”步骤,直接返回 false
+      WHEN (SELECT MIN(step_index)
+            FROM is_workflow_step
+            WHERE mode_id = :modeId AND enable_unlock = 1) IS NULL
+        THEN 0
+      -- 如果没有“上锁”步骤,视为“解锁”先于“上锁”
+      WHEN (SELECT MIN(step_index)
+            FROM is_workflow_step
+            WHERE mode_id = :modeId AND enable_lock = 1) IS NULL
+        THEN 1
+      -- 两者都存在时,比较最小索引
+      WHEN (SELECT MIN(step_index)
+            FROM is_workflow_step
+            WHERE mode_id = :modeId AND enable_unlock = 1)
+         < (SELECT MIN(step_index)
+            FROM is_workflow_step
+            WHERE mode_id = :modeId AND enable_lock = 1)
+        THEN 1
+      ELSE 0
+    END
+    """)
     fun isUnlockBeforeLock(modeId: Long): Boolean
 
+
     @Query("select * from is_workflow_mode")
     fun getWorkflowModes(): List<WorkflowMode>
 

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

@@ -44,7 +44,7 @@ open class IsJobTicket : BaseBean() {
     @ColumnInfo("ticket_content")
     var ticketContent: String? = null
 
-    //(0未开始 1待上锁 2进行中 3待解锁 4已解锁 5已结束6已取消)
+    //(0未开始 1待上锁 2进行中 3待解锁 4已解锁 5已结束 6已取消 7进行中)
     @ColumnInfo("ticket_status")
     var ticketStatus: String? = "0"
 

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

@@ -55,5 +55,9 @@ open class IsJobTicketPoints : BaseBean() {
     @ColumnInfo("del_flag")
     var delFlag: String? = "0"
 
+    override fun toString(): String {
+        return "IsJobTicketPoints(recordId=$recordId, ticketId=$ticketId, workshopId=$workshopId, workareaId=$workareaId, machineryId=$machineryId, workstationId=$workstationId, unlockTime=$unlockTime, pointId=$pointId, pointStatus=$pointStatus, lockId=$lockId, lockedByKeyId=$lockedByKeyId, unlockedByKeyId=$unlockedByKeyId, lockTime=$lockTime, prePointId=$prePointId, delFlag=$delFlag)"
+    }
+
 
 }

+ 31 - 0
data/src/main/java/com/grkj/data/model/vo/LockedPointVo.kt

@@ -0,0 +1,31 @@
+package com.grkj.data.model.vo
+
+import androidx.room.ColumnInfo
+import androidx.room.Ignore
+
+/**
+ * 锁定点位数据
+ */
+class LockedPointVo {
+    @ColumnInfo("record_id")
+    var recordId: Long = 0
+
+    @ColumnInfo("ticket_id")
+    var ticketId: Long = 0
+
+    @ColumnInfo("point_id")
+    var pointId: Long? = null
+
+    @ColumnInfo("point_name")
+    var pointName: String? = null
+
+    @ColumnInfo("ticket_name")
+    var ticketName: String = ""
+
+    //(0未开始 1待上锁 2进行中 3待解锁 4已解锁 5已结束 6已取消 7进行中)
+    @ColumnInfo("ticket_status")
+    var ticketStatus: String? = "0"
+
+    @Ignore
+    var isSelected: Boolean = false
+}

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

@@ -12,6 +12,7 @@ import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 
@@ -178,7 +179,7 @@ interface IJobTicketRepository {
     /**
      * 获取锁定中的点位
      */
-    fun getLockedPointsData(current: Int, size: Int): List<PointManageVo>
+    fun getLockedPointsData(current: Int, size: Int): List<LockedPointVo>
 
     /**
      * 更新共锁人状态

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

@@ -12,6 +12,7 @@ import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.BaseRepository
@@ -172,7 +173,7 @@ class NetworkJobTicketRepository  @Inject constructor() : BaseRepository(), IJob
     override fun getLockedPointsData(
         current: Int,
         size: Int
-    ): List<PointManageVo> {
+    ): List<LockedPointVo> {
         TODO("Not yet implemented")
     }
 

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

@@ -72,7 +72,13 @@ class IsolationPointRepository @Inject constructor(
             isolationPointDao.getAllPointManageDataWithWorkstationId(workstationId)
         val allLockedPointData =
             jobTicketDao.getAllLockedPointDataWithoutExceptionJob(allPointManageData.map { it.pointId })
-        return allPointManageData.filter { it.pointId in allLockedPointData.map { it.pointId } }
-            .toMutableList()
+        logger.info("上锁的非异常作业点位:${allLockedPointData}")
+        val filterPointManageData =
+            allPointManageData.filter { it.pointId in allLockedPointData.map { it.pointId } }
+        filterPointManageData.forEach { pointVo ->
+            pointVo.lockId =
+                allLockedPointData.find { pointVo.pointId == it.pointId }?.lockId ?: 0
+        }
+        return filterPointManageData.toMutableList()
     }
 }

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

@@ -25,6 +25,7 @@ import com.grkj.data.model.vo.IsJobTicketPointsDataVo
 import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.JobTicketManageVo
+import com.grkj.data.model.vo.LockedPointVo
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.BaseRepository
@@ -67,6 +68,7 @@ class JobTicketRepository @Inject constructor(
             isJobTicketPoint.pointId = it.pointId
             isJobTicketPoint.workstationId = workstationId
             isJobTicketPoint.pointStatus = if (isUnlockFirst) "1" else "0"
+            isJobTicketPoint.lockId = it.lockId
             isJobTicketPoint
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints)
@@ -142,6 +144,7 @@ class JobTicketRepository @Inject constructor(
             isJobTicketPoint.pointId = it.pointId
             isJobTicketPoint.workstationId = workstationId
             isJobTicketPoint.pointStatus = if (isUnlockFirst) "1" else "0"
+            isJobTicketPoint.lockId = it.lockId
             isJobTicketPoint
         }
         val ticketPointIds = jobTicketDao.saveIsJobTicketPoints(ticketPoints)
@@ -394,7 +397,7 @@ class JobTicketRepository @Inject constructor(
         return jobTicketDao.getAllInProgressJob()
     }
 
-    override fun getLockedPointsData(current: Int, size: Int): List<PointManageVo> {
+    override fun getLockedPointsData(current: Int, size: Int): List<LockedPointVo> {
         return jobTicketDao.getLockedPointsData(size, current * size)
     }
 

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

@@ -373,6 +373,9 @@ object ModbusBusinessManager {
                     }
                 }
             }
+            Executor.delayOnMain(200) {
+                listeners.forEach { it.callBack(dockBean) }
+            }
         }
         Executor.delayOnMain(200) {
             if (!ISCSConfig.isInit) {

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

@@ -155,6 +155,7 @@ object BleConnectionManager {
         if (connectNow) {
             logger.warn("蓝牙连接-立即连接 mac: $mac")
             unregisterConnectListener(mac)
+            currentConnectingMac = null
         }
         // 重复注册检查
         if (currentConnectingMac == mac) {

+ 1 - 1
ui-base/src/main/res/drawable/common_card_bg.xml

@@ -4,6 +4,6 @@
     <stroke
         android:width="@dimen/divider_line_space"
         android:color="@color/black" />
-    <solid android:color="@color/white" />
+    <solid android:color="@color/common_bg_white_90" />
     <corners android:radius="2dp" />
 </shape>