Browse Source

fix(作业管理)
- 移除点位详情中锁状态的隐藏逻辑,确保存储状态的点位始终显示锁状态
- 修复作业执行时,点位状态判断错误导致钥匙获取失败的问题

fix(作业执行)
- 修复按钮权限判断错误,确保正确的用户拥有操作权限

周文健 3 months ago
parent
commit
e85df5950b

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

@@ -43,6 +43,7 @@ class TodoPointDetailDialog(var ticketPoints: List<IsJobTicketPointsDataVo>) :
         itemBinding.pointName.text = item.pointName
         itemBinding.pointGroup.text = item.groupName
         itemBinding.pointFunction.text = item.pointFunction
+        itemBinding.lockStatusLayout.isVisible = item.pointStatus != "0"
         when (item.pointStatus) {
             "1" -> {
                 itemBinding.lockStatusTv.setTextColor(

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

@@ -372,6 +372,7 @@ class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
         itemBinding.pointName.text = item.pointName
         itemBinding.pointFunction.text = item.pointFunction
         itemBinding.pointGroup.text = item.groupName
+        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)

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

@@ -428,6 +428,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         itemBinding.pointName.text = item.pointName
         itemBinding.pointGroup.text = item.groupName
         itemBinding.pointFunction.text = item.pointFunction
+        itemBinding.lockStatusLayout.isVisible = item.pointStatus != "0"
         when (item.pointStatus) {
             "1" -> {
                 itemBinding.lockStatusTv.setTextColor(
@@ -607,7 +608,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             val currentWorkflowStep = viewModel.currentStepData
             if (currentWorkflowStep?.enableLock == true) {
                 logger.info("当前步骤上锁:${it.value.all { it.pointStatus == "0" || (viewModel.isUnlockFirst && it.pointStatus == "2") }}")
-                it.value.any { it.pointStatus == "0"|| (viewModel.isUnlockFirst && it.pointStatus == "2")  }
+                it.value.any { it.pointStatus == "0" || (viewModel.isUnlockFirst && it.pointStatus == "2") }
             } else if (currentWorkflowStep?.enableUnlock == true) {
                 logger.info("当前步骤解锁:${it.value.all { it.pointStatus == "1" }}")
                 it.value.any { it.pointStatus == "1" }
@@ -616,21 +617,21 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
         }.map { JobTicketGroupInfoVo(it.key.first, it.key.second) }.toMutableList()
         if (viewModel.currentStepData?.stepIndex == null) {
-            binding.finishJob.isVisible = true
+            binding.finishJob.isVisible = viewModel.isMyPermissionTodoConfirm()
         } else {
             val currentStep = viewModel.currentStepData
             //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
             binding.cancelJob.isVisible =
-                currentStep?.enableCancelJob == true && (viewModel.ticketPoints.all { it.pointStatus == "0" } || (viewModel.isUnlockFirst && currentStep?.enableCancelJob == true && viewModel.ticketPoints.all { it.pointStatus == "1" }))
+                viewModel.isMyPermissionTodoConfirm() && currentStep?.enableCancelJob == true && (viewModel.ticketPoints.all { it.pointStatus == "0" } || (viewModel.isUnlockFirst && currentStep?.enableCancelJob == true && viewModel.ticketPoints.all { it.pointStatus == "1" }))
             binding.toLock.isVisible =
-                    //步骤开启上锁,并且点位都还没有上锁
-                (currentStep?.enableLock == true && viewModel.ticketPoints.any { it.pointStatus == "0" || (viewModel.isUnlockFirst && it.pointStatus == "2") }) ||
-                        //步骤开启共锁,并且点位都不存在没有上锁的
-                        (currentStep?.enableColock == true && viewModel.ticketPoints.all { it.pointStatus == "1" }) || (currentStep?.enableLock == true && viewModel.isUnlockFirst && viewModel.ticketPoints.all { it.pointStatus == "2" })
+                viewModel.isMyPermissionTodoHardware() && (//步骤开启上锁,并且点位都还没有上锁
+                        (currentStep?.enableLock == true && viewModel.ticketPoints.any { it.pointStatus == "0" || (viewModel.isUnlockFirst && it.pointStatus == "2") }) ||
+                                //步骤开启共锁,并且点位都不存在没有上锁的
+                                (currentStep?.enableColock == true && viewModel.ticketPoints.all { it.pointStatus == "1" }) || (currentStep?.enableLock == true && viewModel.isUnlockFirst && viewModel.ticketPoints.all { it.pointStatus == "2" }))
             //步骤开启解锁,并且点位都已经上锁,并且如果支持共锁都已经解除
             binding.toUnlock.isVisible =
-                currentStep?.enableUnlock == true && viewModel.ticketPoints.any { 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" }))
+                viewModel.isMyPermissionTodoHardware() && (currentStep?.enableUnlock == true && viewModel.ticketPoints.any { 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" })))
         }
     }
 

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

@@ -6,6 +6,7 @@ import com.grkj.data.data.MainDomainData
 import com.grkj.data.di.RepositoryManager
 import com.grkj.data.enums.JobTicketStatusEnum
 import com.grkj.data.enums.RoleEnum
+import com.grkj.data.enums.StepAction
 import com.grkj.data.model.dos.IsJobTicketStep
 import com.grkj.data.model.dos.WorkflowMode
 import com.grkj.data.model.local.DeviceTakeUpdate
@@ -22,6 +23,8 @@ import com.grkj.data.model.vo.SysBiometricDataVo
 import com.grkj.data.logic.IJobTicketLogic
 import com.grkj.data.logic.IWorkflowLogic
 import com.grkj.data.logic.impl.standard.UserLogic
+import com.grkj.data.model.local.TodoStepJoin
+import com.grkj.data.model.local.hasAnyHardwareOperationFunction
 import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.BleBusinessManager
@@ -794,4 +797,66 @@ class JobExecuteViewModel @Inject constructor(
             }
         }
     }
+
+    /**
+     * 是否我的权限可以处理确认待办
+     */
+    fun isMyPermissionTodoConfirm(): Boolean {
+        val userId = MainDomainData.userInfo?.userId
+        val userName = MainDomainData.userInfo?.userName
+        if (userId == null || userName == null) {
+            return false
+        }
+        val isMyTodo = currentStepData?.isMyTodoConfirm(userId, userName) == true
+        return isMyTodo
+    }
+
+    fun IsJobTicketStepDataVo.isMyTodoConfirm(
+        currentUserId: Long,
+        currentUserName: String
+    ): Boolean {
+        val isCreator = createBy == currentUserName
+
+        // ---- 判定共锁/解除共锁(由创建者) ----=
+        //todo 共锁人的共锁暂时不算代办 currentUserId in colockerUserId
+        if (enableColock && isCreator) return true
+        if (enableReleaseColock && isCreator) return true
+
+        // ---- 判定结束作业(由创建者) ----
+        if (enableEndJob && isCreator) return true
+
+        // ---- 普通步骤确认 ----
+        val confirmToCurrentUser =
+            confirmUser == currentUserId || (isCreator && confirmUser == null)
+
+        return !hasAnyHardwareOperationFunction() && confirmToCurrentUser
+    }
+
+    /**
+     * 是否我的权限可以处理硬件待办
+     */
+    fun isMyPermissionTodoHardware(): Boolean {
+        val userId = MainDomainData.userInfo?.userId
+        val userName = MainDomainData.userInfo?.userName
+        if (userId == null || userName == null) {
+            return false
+        }
+        return currentStepData?.isMyTodoHardware(userId, userName) == true
+    }
+
+    fun IsJobTicketStepDataVo.isMyTodoHardware(
+        currentUserId: Long,
+        currentUserName: String
+    ): Boolean {
+        // ---- 判定锁/解锁 ----
+        if (enableLock && ticketUser.filter { it.userId == currentUserId }.map { it.userRole }
+                .contains(RoleEnum.JTLOCKER.roleKey)) return true
+        if (enableUnlock && ticketUser.filter { it.userId == currentUserId }.map { it.userRole }
+                .contains(RoleEnum.JTLOCKER.roleKey)) return true
+        return false
+    }
+
+    // WorkflowStep 扩展:判定是否包含任何硬件相关动作
+    fun IsJobTicketStepDataVo.hasAnyHardwareOperationFunction(): Boolean =
+        enableLock || enableColock || enableReleaseColock || enableUnlock
 }

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

@@ -977,7 +977,7 @@ object BleBusinessManager {
         vo.ticketPointsVOList?.filter { it.groupId == groupId && it.pointStatus == if (isLock && isUnlockFirst) "2" else if (isLock) "0" else "1" }
             ?.let { itList ->
                 itList.forEach { pointVO ->
-                    if (vo.noUnlockTicketPointsVOSet?.any { it.pointId == pointVO.pointId } == true) {
+                    if (vo.noUnlockTicketPointsVOSet?.any { it.pointId == pointVO.pointId } == true && !isLock) {
                         return@forEach
                     }
                     val task = WorkTicketSend.DataBO.DataListBO(