Prechádzať zdrojové kódy

1. 修复共锁人登录后无法显示待办的问题

bjb 1 mesiac pred
rodič
commit
e815351cc5

+ 6 - 5
data/src/main/java/com/grkj/data/domain/logic/impl/JobTicketLogic.kt

@@ -447,6 +447,8 @@ class JobTicketLogic @Inject constructor(
 
                 // 处理解除共锁
                 if (stepDef.enableReleaseColock) {
+                    // 先将前置条件补充
+                    if (previousStepJoin.isEmpty()) previousStepJoin.addAll(stepJoins)
                     collect(
                         buildTodoStepJoin(
                             stepDef, ticket, stepDef, lockerList, colockerList, pointDatas,
@@ -464,19 +466,18 @@ class JobTicketLogic @Inject constructor(
                     )
                 }
 
-                /* 3️⃣ 普通确认 / End‑Job */
-                val needConfirm =
-                    !stepDef.hasAnyHardwareOperationFunction() || stepDef.confirmType == 0
+                // 普通确认
+                val needConfirm = !stepDef.hasAnyHardwareOperationFunction() || stepDef.confirmType == 0
                 if (needConfirm) {
                     collect(
                         buildTodoStepJoin(
                             stepDef, ticket, stepDef, lockerList, colockerList, pointDatas,
                             null, "", null
-                        ).only(StepAction.CONFIRM) // ⚠️
+                        ).only(StepAction.CONFIRM)
                     )
                 }
 
-                /* ⭐ 将本 step 的 Todo 归档,并维护前置链 ⭐ */
+                // 将本 step 的待办归档,并维护前置链
                 result += stepJoins
 
                 if (currentStepId == stepDef.stepId) {

+ 18 - 7
data/src/main/java/com/grkj/data/entity/extension/TodoDataExtension.kt

@@ -10,11 +10,11 @@ import com.grkj.data.enums.TodoStatusEnum
 /**
  * 转换todo数据
  */
-fun TodoStepJoin.toTodoVo(sameTicketStepJoinData: List<TodoStepJoin>): TodoItemVo {
+fun TodoStepJoin.toTodoVo(sameTicketStepJoinData: List<TodoStepJoin>, index: Int = 0): TodoItemVo {
     val isCreator = createBy == MainDomainData.userInfo?.userName
     val type = OperationTypeEnum.fromJoin(this, isCreator)
     val temp = this
-    return TodoItemVo().apply {
+    val bean = TodoItemVo().apply {
         this.ticketId = temp.ticketId
         this.ticketName = temp.ticketName
         this.ticketStatus = temp.ticketStatus
@@ -54,6 +54,20 @@ fun TodoStepJoin.toTodoVo(sameTicketStepJoinData: List<TodoStepJoin>): TodoItemV
         this.stepTitleShort = temp.stepTitleShort
         this.stepDescription = temp.stepDescription
     }
+    if (!temp.previousTodoStepJoin.isNullOrEmpty() && index == 0) {
+        val preList: MutableList<TodoItemVo> = mutableListOf()
+        temp.previousTodoStepJoin?.forEach { join ->
+            if (join.enableAddColocker) { // 这里是共锁人操作,去重处理,发现有重复显示上锁的
+                if (!preList.any { it.enableColock == join.enableColock && it.enableReleaseColock == join.enableReleaseColock }) {
+                    preList += join.toTodoVo(sameTicketStepJoinData, 1)
+                }
+            } else {
+                preList += join.toTodoVo(sameTicketStepJoinData, 1)
+            }
+        }
+        bean.previousTodoItem = preList.ifEmpty { null }
+    }
+    return bean
 }
 
 fun splitTodoSteps(
@@ -90,12 +104,9 @@ fun splitTodoSteps(
             }
 
         /* —— 当前步骤 → todoData —— */
-        val todoStep =
-            pendingSteps.filter { it.isCurrentStep }.findPredecessors()
+        val todoStep = pendingSteps.filter { it.isCurrentStep }.findPredecessors()
         tempTodo += todoStep.second
-        doneSteps = doneSteps.toMutableList().apply {
-            addAll(todoStep.third)
-        }
+        doneSteps = doneSteps.toMutableList().apply { addAll(todoStep.third) }
 
         /* —— 其它待办 → waitData —— */
         val otherPending = pendingSteps.filter { it !in (todoStep.second + todoStep.third) }

+ 0 - 4
iscs_lock/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt

@@ -19,7 +19,6 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.data.MMKVConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.entity.local.LoginMenuEntity
 import com.grkj.data.enums.LoginResultEnum
@@ -52,7 +51,6 @@ import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.sik.sikcore.SIKCore
-import com.sik.sikcore.extension.saveMMKVData
 import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.shell.ShellUtils
 import com.sik.sikimage.ImageConvertUtils
@@ -79,8 +77,6 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
     }
 
     override fun initView() {
-        // 初始化设置共锁人不允许登录
-        MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.saveMMKVData(false)
         // ② 建一个 HLK 客户端(串口或你现有的 Modbus 封装)
         // val hlk = Hlk223Client(Hlk223Config.getProtocol(), "HLK-223")
         // ③ 想切到 HLK 路线(但保持对外 API 不变)

+ 31 - 7
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -349,6 +349,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         stepClickConfirm(adapter, item, workflowStep)
                     } else if (workflowStep.confirmType == 0 && ((viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
                         if (workflowStep.currentUserCanConfirm()) {
+                            // 不是作业票的创建者不允许在此共锁,或者允许共锁人登录后,除非当前允许共锁人登录且是共锁人本人,允许共锁
+                            if (!checkColockerEnable()) {
+                                showToast(CommonUtils.getStr("no_permission_to_handle"))
+                                return@observe
+                            }
                             InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                             CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
                                 if (it in listOf(
@@ -462,6 +467,11 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         val item = holder.getModel<IsJobTicketUserDataVo>()
         itemBinding.name.text = item.nickName
         itemBinding.root.setDebouncedClickListener {
+            // 不是作业票的创建者不允许在此共锁,或者允许共锁人登录后,除非当前允许共锁人登录且是共锁人本人,允许共锁
+            if (!checkColockerEnable()) {
+                showToast(CommonUtils.getStr("no_permission_to_handle"))
+                return@setDebouncedClickListener
+            }
             if (viewModel.canCoLock()) {
                 InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                 viewModel.getFaceByUserId(item.userId).observe(this) {
@@ -528,17 +538,31 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         itemBinding.lockStatusTv.text = item.lockerName
     }
 
+    /**
+     * 校验当前是否有共锁权限
+     */
+    private fun checkColockerEnable(): Boolean {
+        // 不是作业票的创建者不允许在此共锁,或者允许共锁人登录后,除非当前允许共锁人登录且是共锁人本人,允许共锁
+        if (MainDomainData.userInfo?.userName != viewModel.ticketData?.createBy) {
+            // 不是作业票的创建者,只有登录账号的本人才可以进行刷卡共锁操作
+            if (MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(false) && viewModel.ticketUser.filter { colocker ->
+                    colocker.userRole?.contains(RoleEnum.JTCOLOCKER.roleKey) == true
+                }.any { colocker -> colocker.userId == MainDomainData.userInfo?.userId }) {
+                // 允许进行操作
+            } else {
+                return false
+            }
+        }
+        return true
+    }
+
     override fun onEvent(event: EventBean<Any>) {
         super.onEvent(event)
         when (event.code) {
             EventConstants.EVENT_RFID_CARD_READ -> {
-                if (MainDomainData.userInfo?.userName != viewModel.ticketData?.createBy && !MMKVConstants.KEY_ALLOW_COLOCKER_COLOCK.getMMKVData(
-                        false
-                    )
-                ) {
-                    showToast(
-                        CommonUtils.getStr("no_permission_to_handle").toString()
-                    )
+                // 不是作业票的创建者不允许在此共锁,或者允许共锁人登录后,除非当前允许共锁人登录且是共锁人本人,允许共锁
+                if (!checkColockerEnable()) {
+                    showToast(CommonUtils.getStr("no_permission_to_handle"))
                     return
                 }
                 checkLayout(2)

+ 13 - 5
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
-import android.util.Log
 import android.widget.TextView
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
@@ -12,7 +11,6 @@ import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.google.android.material.tabs.TabLayout
-import com.google.gson.Gson
 import com.grkj.data.data.EventConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.data.Type
@@ -471,8 +469,14 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
                 colockerCardDialog?.dismiss()
                 // 检查当前登录用户是否
                 if (MainDomainData.userInfo?.userName != jobExecuteViewModel.ticketData?.createBy) {
-                    showToast(CommonUtils.getStr("no_permission_to_handle"))
-                    return
+                    // 如果当前登录的账号是作业共锁人,允许进行作业操作
+                    val colocker = jobExecuteViewModel.ticketUser.filter { colocker ->
+                        colocker.userRole?.contains(RoleEnum.JTCOLOCKER.roleKey) == true
+                    }.find { colocker -> colocker.userId == MainDomainData.userInfo?.userId }
+                    if (colocker == null) {
+                        showToast(CommonUtils.getStr("no_permission_to_handle"))
+                        return
+                    }
                 }
                 // 校验是否正在读卡中,不是返回
                 if (!viewModel.startReadCard) return
@@ -707,7 +711,11 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
                 }
             }
         }
-        getData()
+        if (jobExecuteViewModel.ticketId > 0) {
+            getJobTicketData(true) { getData() }
+        } else {
+            getData()
+        }
     }
 
     /**

+ 9 - 6
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/MyTodoViewModel.kt

@@ -1,7 +1,9 @@
 package com.grkj.iscs.features.main.viewmodel.job_manage
 
+import android.util.Log
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
+import com.google.gson.Gson
 import com.grkj.data.data.DictConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.domain.logic.IJobTicketLogic
@@ -70,9 +72,9 @@ class MyTodoViewModel @Inject constructor(
             jobTicketStatus = DataBusiness.fetchDict(DictConstants.KEY_JOB_TICKET_STATUS)
             val todoItemData = jobTicketRepository.getMyTodoList()
             val myTodoStepJoin = todoItemData.filter { it.isMyTodo(userId, userName) }
-            todoItemVos =
-                myTodoStepJoin.map { it.toTodoVo(todoItemData.filter { temp -> it.ticketId == temp.ticketId }) }
-                    .toMutableList()
+            todoItemVos = myTodoStepJoin.map {
+                it.toTodoVo(todoItemData.filter { temp -> it.ticketId == temp.ticketId })
+            }.toMutableList()
             splitTodoSteps(todoItemVos, 1)
             if (waitData.any { it.enableLock || it.enableUnlock } || todoData.any { it.enableLock || it.enableUnlock }) {
                 DataBusiness.checkMyTodoForHandleKey()
@@ -101,8 +103,7 @@ class MyTodoViewModel @Inject constructor(
             }
             val pendingSteps =
                 steps.filter {
-                    it.stepStatus == "0" || (it.stepStatus == "1" && it.enableEndJob
-                            && it.ticketStatus in listOf(
+                    it.stepStatus == "0" || (it.stepStatus == "1" && it.enableEndJob && it.ticketStatus in listOf(
                         JobTicketStatusEnum.SELECT_MEMBER.status,
                         JobTicketStatusEnum.LOCKING.status,
                         JobTicketStatusEnum.COLOCKING.status,
@@ -153,7 +154,9 @@ class MyTodoViewModel @Inject constructor(
         }
         tempWait.forEach {
             it.todoStatus = TodoStatusEnum.WAIT
-            it.previousTodoItem = tempTodo.filter { todoData -> it.ticketId == todoData.ticketId }
+            // 上一流程步骤不从这里配置
+            val preTodoList = tempTodo.filter { todoData -> it.ticketId == todoData.ticketId }
+            if (preTodoList.isNotEmpty()) it.previousTodoItem = preTodoList
         }
         tempDone.forEach {
             it.todoStatus = TodoStatusEnum.DONE

+ 0 - 2
iscs_lock/src/main/res/layout/fragment_settings.xml

@@ -199,7 +199,6 @@
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
-                android:visibility="gone"
                 app:i18nKey='@{"allow_colocker_login_to_colock"}'
                 app:markPosition="start"
                 app:required="true" />
@@ -207,7 +206,6 @@
             <CheckBox
                 android:id="@+id/allow_colocker_colock"
                 android:layout_width="wrap_content"
-                android:visibility="gone"
                 android:layout_height="wrap_content"
                 android:layout_below="@+id/allow_colocker_colock_tv"
                 android:layout_alignLeft="@+id/allow_colocker_colock_tv"

+ 6 - 2
shared/src/main/java/com/grkj/shared/utils/event/EventHelper.kt

@@ -11,7 +11,11 @@ object EventHelper {
      * 发送通知
      */
     @JvmStatic
-    fun sendEvent(eventBean: EventBean<*>) {
-        EventBus.getDefault().post(eventBean)
+    fun sendEvent(eventBean: EventBean<*>, isSticky: Boolean = false) {
+        if (isSticky) {
+            EventBus.getDefault().postSticky(eventBean)
+        } else {
+            EventBus.getDefault().post(eventBean)
+        }
     }
 }

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/utils/event/UpdateTicketProgressEvent.kt

@@ -1,7 +1,7 @@
 package com.grkj.ui_base.utils.event
 
-import com.grkj.shared.model.EventBean
 import com.grkj.data.data.EventConstants
+import com.grkj.shared.model.EventBean
 import com.grkj.shared.utils.event.EventHelper
 
 /**