Selaa lähdekoodia

fix(作业管理):
- 待办数据完成
- aes秘钥添加

周文健 3 kuukautta sitten
vanhempi
sitoutus
db325c5dcd

+ 14 - 8
app/src/main/java/com/grkj/iscs/features/main/fragment/common/WorkflowSettingFragment.kt

@@ -98,6 +98,8 @@ class WorkflowSettingFragment : BaseFormFragment<FragmentWorkflowSettingBinding>
                     viewModel.currentConfirmRole = null
                     viewModel.currentConfirmMember = null
                 }
+                viewModel.currentStep?.confirmType =
+                    if (viewModel.currentConfirmType == WorkflowStepConfirmTypeEnum.AUTO_CONFIRM) 1 else 0
                 checkAndSetConfirmData()
             }
         }
@@ -117,7 +119,11 @@ class WorkflowSettingFragment : BaseFormFragment<FragmentWorkflowSettingBinding>
         }
         binding.stepConfirmMember.setDebouncedClickListener {
             val filterUsers =
-                viewModel.allUser.filter { it.roleKeys.contains(viewModel.currentConfirmRole) }
+                viewModel.allUser.filter {
+                    viewModel.currentConfirmRole.isNullOrEmpty() || it.roleKeys.contains(
+                        viewModel.currentConfirmRole
+                    )
+                }
             if (filterUsers.isEmpty()) {
                 PopTip.tip(R.string.current_role_no_user)
                 return@setDebouncedClickListener
@@ -150,12 +156,12 @@ class WorkflowSettingFragment : BaseFormFragment<FragmentWorkflowSettingBinding>
     }
 
     private fun checkData(): Boolean {
-        if (WorkflowStepConfirmTypeEnum.ROLE_CONFIRM == viewModel.currentConfirmType &&
-            viewModel.currentConfirmRole.isNullOrEmpty()
-        ) {
-            PopTip.tip(R.string.please_select_step_confirm_role)
-            return false
-        }
+//        if (WorkflowStepConfirmTypeEnum.ROLE_CONFIRM == viewModel.currentConfirmType &&
+//            viewModel.currentConfirmRole.isNullOrEmpty()
+//        ) {
+//            PopTip.tip(R.string.please_select_step_confirm_role)
+//            return false
+//        }
         return true
     }
 
@@ -260,7 +266,7 @@ class WorkflowSettingFragment : BaseFormFragment<FragmentWorkflowSettingBinding>
             if (it.confirmType != 0) {
                 viewModel.currentConfirmType = WorkflowStepConfirmTypeEnum.AUTO_CONFIRM
             } else {
-                if (it.confirmRoleCode == null) {
+                if (it.confirmUser == null) {
                     viewModel.currentConfirmType = WorkflowStepConfirmTypeEnum.CLICK_CONFIRM
                 } else {
                     viewModel.currentConfirmType = WorkflowStepConfirmTypeEnum.ROLE_CONFIRM

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

@@ -264,13 +264,6 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         )
                         return@observe
                     }
-                    if (MainDomainData.userInfo?.userName != viewModel.ticketData?.createBy) {
-                        showToast(
-                            CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle)
-                                .toString()
-                        )
-                        return@observe
-                    }
                     //自动确认并且是设置上锁人或者共锁人
                     if (workflowStep?.confirmType != 0 && (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)) {
                         stepClickConfirm(adapter, item, workflowStep)
@@ -608,7 +601,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
             //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
             binding.cancelJob.isVisible =
-                currentStep?.enableCancelJob == true && viewModel.ticketPoints.all { it.pointStatus == "0" } || (viewModel.isUnlockFirst && currentStep?.enableCancelJob == true && viewModel.ticketPoints.all { it.pointStatus == "1" })
+                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" }) ||
@@ -706,15 +699,8 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             viewModel.updateLockerAndColockerData().observe(this) {
                 val workflowStep =
                     viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
-                if ((workflowStep?.confirmType != 0 ||//自动确认
-                            (workflowStep.confirmRoleCode == null && workflowStep.confirmUser == null) ||//点击确认
-                            (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
-                                workflowStep.confirmRoleCode.toString()
-                            ) == true) ||//角色确认
-                            (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
-                                workflowStep.confirmRoleCode.toString()
-                            ) == true && workflowStep.confirmUser != null && MainDomainData.userInfo?.userId == workflowStep.confirmUser)) &&//人员确认
-                    (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)
+                if (workflowStep?.confirmType != 0 ||//自动确认
+                    (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
                 ) {
                     viewModel.currentStepData?.stepStatus = "1"
                     viewModel.currentStepData?.let {

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

@@ -2,22 +2,37 @@ package com.grkj.iscs.features.main.fragment.job_manage
 
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
 import com.drake.brv.BindingAdapter
 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.google.android.material.tabs.TabLayout
+import com.grkj.data.data.EventConstants
+import com.grkj.data.data.MainDomainData
+import com.grkj.data.data.Type
 import com.grkj.data.enums.OperationTypeEnum
+import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.dos.WorkflowStep
+import com.grkj.data.model.vo.IsJobTicketStepDataVo
 import com.grkj.data.model.vo.TodoItemVo
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentMyTodoListBinding
 import com.grkj.iscs.databinding.ItemMyTodoBinding
+import com.grkj.iscs.features.main.dialog.CheckFaceDialog
 import com.grkj.iscs.features.main.dialog.job_manage.TodoPointDetailDialog
+import com.grkj.iscs.features.main.viewmodel.job_manage.JobExecuteViewModel
 import com.grkj.iscs.features.main.viewmodel.job_manage.MyTodoViewModel
+import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.UiEvent
+import com.grkj.ui_base.utils.extension.tip
+import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
@@ -28,6 +43,7 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
     private val viewModel: MyTodoViewModel by viewModels()
+    private val jobExecuteViewModel: JobExecuteViewModel by viewModels()
     private var isFirstEnter: Boolean = true
     private val tabKey: List<String> by lazy {
         listOf(
@@ -145,8 +161,19 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
             item.previousTodoItem?.joinToString(",") { itemData -> "${itemData.todoType.todoTitle}${itemData.groupName?.let { if (it.isEmpty()) "(${itemData.todoContent})" else "(${it})" }}" }
         itemBinding.btnPointDetail.isVisible =
             item.todoType == OperationTypeEnum.LOCK_TAKE_KEY || item.todoType == OperationTypeEnum.UNLOCK_TAKE_KEY || item.todoType == OperationTypeEnum.LOCK_RETURN_KEY || item.todoType == OperationTypeEnum.UNLOCK_RETURN_KEY
-        itemBinding.btnHandle.isVisible =
+        itemBinding.btnHandle.isVisible = if (item.todoType == OperationTypeEnum.UNLOCK_TAKE_KEY) {
+            val currentStep =
+                jobExecuteViewModel.workflowSteps.find { it.stepId == jobExecuteViewModel.currentStepData?.workflowStepId }
+            val canUnLock = currentStep?.enableUnlock == true &&
+                    jobExecuteViewModel.ticketPoints.any { it.pointStatus == "1" } &&
+                    (jobExecuteViewModel.workflowModes.find { it.modeId == jobExecuteViewModel.ticketData?.modeId }?.isColockSupport == false ||
+                            (jobExecuteViewModel.workflowModes.find { it.modeId == jobExecuteViewModel.ticketData?.modeId }?.isColockSupport == true &&
+                                    jobExecuteViewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                                        .all { it.jobStatus == "2" }))
+            item.isCurrentStep && item.todoType != OperationTypeEnum.LOCK_RETURN_KEY && item.todoType != OperationTypeEnum.UNLOCK_RETURN_KEY && canUnLock
+        } else {
             item.isCurrentStep && item.todoType != OperationTypeEnum.LOCK_RETURN_KEY && item.todoType != OperationTypeEnum.UNLOCK_RETURN_KEY
+        }
         itemBinding.btnPointDetail.setDebouncedClickListener {
             viewModel.getTicketPointsData(item.ticketId).observe(this) {
                 TodoPointDetailDialog.show(it)
@@ -158,7 +185,34 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
                 return@setDebouncedClickListener
             }
             TipDialog.showInfo(viewModel.getHandleTip(item), onConfirmClick = {
-                viewModel.handleTodo(item).observe(this) {
+                jobExecuteViewModel.getWorkflowModes().observe(this) {
+                    jobExecuteViewModel.ticketId = item.ticketId
+                    getJobTicketData {
+                        when (item.todoType) {
+                            OperationTypeEnum.LOCK_TAKE_KEY -> item.groupId?.let {
+                                jobExecuteViewModel.toLock(it).observe(this) {}
+                            } ?: showToast(getString(R.string.not_group_can_lock))
+
+                            OperationTypeEnum.UNLOCK_TAKE_KEY -> item.groupId?.let {
+                                jobExecuteViewModel.toUnLock(it).observe(this) {}
+                            } ?: showToast(getString(R.string.not_group_can_unlock))
+
+                            OperationTypeEnum.CONFIRM -> {
+                                jobExecuteViewModel.currentStepData
+                                    ?.let { stepVo ->
+                                        stepClickConfirm(
+                                            stepVo,
+                                            jobExecuteViewModel.workflowSteps.find { it.stepId == stepVo.workflowStepId }
+                                        )
+                                    }
+                            }
+
+                            OperationTypeEnum.END -> jobExecuteViewModel.finishJob()
+                                .observe(this) {}
+
+                            else -> ""
+                        }
+                    }
 
                 }
             })
@@ -170,8 +224,182 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
         }
     }
 
+    override suspend fun initObservers() {
+        super.initObservers()
+        repeatOnLifecycle(Lifecycle.State.STARTED) {
+            viewModel.uiEvents.collect { ev ->
+                when (ev) {
+                    is UiEvent.FaceCheck -> {
+                        CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
+                            viewModel.onParamProvided(it)
+                        }
+                    }
+
+                    is UiEvent.FingerprintCheck -> {
+                        CheckFaceDialog.show(viewLifecycleOwner, viewModel, 1) {
+                            viewModel.onParamProvided(it)
+                        }
+                    }
+
+                    else -> {}
+                }
+            }
+        }
+    }
+
+    override fun onEvent(event: EventBean<Any>) {
+        super.onEvent(event)
+        when (event.code) {
+            EventConstants.EVENT_UPDATE_TICKET_PROGRESS -> {
+                getData()
+            }
+
+            EventConstants.EVENT_TICKET_FINISHED -> {
+                getData()
+            }
+        }
+    }
+
+    /**
+     * 点击确认
+     */
+    private fun stepClickConfirm(item: IsJobTicketStepDataVo, workflowStep: WorkflowStep?) {
+        if (!checkSelectMember(workflowStep)) {
+            if (jobExecuteViewModel.stepConditionsComplete(workflowStep)) {
+                item.stepStatus = "1"
+                jobExecuteViewModel.updateStepStatus(item).observe(this@MyTodoListFragment) {
+                    if (it == false) {
+                        showToast(getString(R.string.handle_failed))
+                    } else {
+                        getData()
+                    }
+                }
+            } else {
+                val errorTipData = jobExecuteViewModel.getStepErrorTip(workflowStep)
+                showToast(errorTipData.first)
+            }
+        }
+    }
+
+    /**
+     * 检查是否是选择人员
+     */
+    private fun checkSelectMember(
+        workflowStep: WorkflowStep?
+    ): Boolean {
+        val currentWorkflowStep = jobExecuteViewModel.getCurrentWorkflowStep()
+        if (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true && (currentWorkflowStep?.enableAddColocker == true || currentWorkflowStep?.enableReduceColocker == true)) {
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_CAN_SELECT_COLOCKER,
+                jobExecuteViewModel.workflowModes.find { it.modeId == jobExecuteViewModel.ticketData?.modeId }?.isColockSupport == true
+            )
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID,
+                jobExecuteViewModel.ticketData!!.workstationId
+            )
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA,
+                jobExecuteViewModel.selectedLockerData
+            )
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
+                jobExecuteViewModel.selecteColockerData
+            )
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
+                jobExecuteViewModel.ticketData!!.ticketName
+            )
+            GlobalDataTempStore.getInstance().saveData(
+                DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA, R.mipmap.icon_my_todo
+            )
+            GlobalDataTempStore.getInstance()
+                .saveData(DataTransferConstants.KEY_JOB_TICKET_ID, jobExecuteViewModel.ticketId)
+            navController.navigate(R.id.action_myTodoListFragment_to_selectMemberFragment)
+            return true
+        }
+        return false
+    }
+
+    /**
+     * 获取作业票相关数据
+     */
+    private fun getJobTicketData(dataGetDone: () -> Unit) {
+        jobExecuteViewModel.getJobTicketData().observe(this) {
+            if (it) {
+                jobExecuteViewModel.isUnlockFirst(jobExecuteViewModel.ticketData?.modeId!!)
+                    .observe(this) {}
+                jobExecuteViewModel.getWorkflowSteps(jobExecuteViewModel.ticketData?.modeId!!)
+                    .observe(this) {
+                        jobExecuteViewModel.currentStepData =
+                            jobExecuteViewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                        dataGetDone()
+                    }
+            } else {
+                TipDialog.showError(
+                    msg = CommonUtils.getStr(com.grkj.ui_base.R.string.ticket_data_error)
+                        .toString(),
+                )
+            }
+        }
+    }
+
     override fun onResume() {
         super.onResume()
+        if (!isFirstEnter) {
+
+            if (GlobalDataTempStore.getInstance()
+                    .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
+            ) {
+                jobExecuteViewModel.selectedLockerData = GlobalDataTempStore.getInstance().getData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, Type.lockerGroupType
+                ) ?: listOf()
+                jobExecuteViewModel.checkMemberFinish = true
+            }
+            if (GlobalDataTempStore.getInstance()
+                    .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
+            ) {
+                jobExecuteViewModel.selecteColockerData = GlobalDataTempStore.getInstance()
+                    .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
+                jobExecuteViewModel.checkMemberFinish = true
+            }
+            if (jobExecuteViewModel.checkMemberFinish) {
+                jobExecuteViewModel.updateLockerAndColockerData().observe(this) {
+                    val workflowStep =
+                        jobExecuteViewModel.workflowSteps.find { it.stepId == jobExecuteViewModel.currentStepData?.workflowStepId }
+                    if (workflowStep?.confirmType != 0 ||//自动确认
+                        (jobExecuteViewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
+                    ) {
+                        jobExecuteViewModel.currentStepData?.stepStatus = "1"
+                        jobExecuteViewModel.currentStepData?.let {
+                            jobExecuteViewModel.updateStepStatus(it)
+                                .observe(this@MyTodoListFragment) {
+
+                                }
+                        }
+                    }
+                    if (workflowStep?.enableAddColocker == true || workflowStep?.enableReduceColocker == true) {
+                        if (workflowStep.gotoStepAfterAddingColocker != null && jobExecuteViewModel.ticketUser.filter { it.userRole == RoleEnum.JTCOLOCKER.roleKey }
+                                .any { it.jobStatus == "0" }) {
+                            logger.info("跳转到步骤:${workflowStep.gotoStepAfterAddingColocker}")
+                            jobExecuteViewModel.ticketStep.filter {
+                                it.stepIndex >= workflowStep.gotoStepAfterAddingColocker!!
+                            }.sortedByDescending { it.stepIndex }.forEach {
+                                it.stepStatus = "0"
+                                jobExecuteViewModel.updateStepStatusBack(it)
+                                    .observe(this@MyTodoListFragment) {
+                                        if (it == false) {
+                                            PopTip.build().tip(R.string.step_confirm_failed)
+                                        } else {
+                                            jobExecuteViewModel.currentStepData =
+                                                jobExecuteViewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                                        }
+                                    }
+                            }
+                        }
+                    }
+                }
+            }
+        }
         getData()
     }
 
@@ -189,6 +417,20 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
             if (isFirstEnter) {
                 isFirstEnter = false
                 filterAndUpdate()
+            } else {
+                val data = when (binding.tabLayout.selectedTabPosition) {
+                    0 -> viewModel.waitData
+                    1 -> viewModel.todoData
+                    2 -> viewModel.doneData
+                    else -> mutableListOf()
+                }
+                // UI 渲染逻辑
+                if (data.isEmpty()) {
+                    binding.state.showEmpty()
+                } else {
+                    binding.state.showContent()
+                }
+                binding.listRv.models = data
             }
         }
     }

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

@@ -579,7 +579,7 @@ class JobExecuteViewModel @Inject constructor(
     fun stepConditionsComplete(workflowStep: WorkflowStep?): Boolean {
         return when {
             //一个步骤4个状态
-            workflowStep?.enableLock == true && workflowStep.enableColock && workflowStep.enableUnlock == true && workflowStep.enableReleaseColock -> lockStepLocked(
+            workflowStep?.enableLock == true && workflowStep.enableColock && workflowStep.enableUnlock && workflowStep.enableReleaseColock -> lockStepLocked(
                 workflowStep
             ) && coLockStepLocked(workflowStep) && releaseCoLockStepUnLocked(workflowStep) && unLockStepLocked(
                 workflowStep
@@ -589,28 +589,28 @@ class JobExecuteViewModel @Inject constructor(
                 workflowStep
             ) && coLockStepLocked(workflowStep) && releaseCoLockStepUnLocked(workflowStep)
             //共锁、解除共锁、解锁一个步骤
-            workflowStep?.enableColock == true && workflowStep.enableUnlock == true && workflowStep.enableReleaseColock -> coLockStepLocked(
+            workflowStep?.enableColock == true && workflowStep.enableUnlock && workflowStep.enableReleaseColock -> coLockStepLocked(
                 workflowStep
             ) && releaseCoLockStepUnLocked(workflowStep) && unLockStepLocked(
                 workflowStep
             )
             //上锁、解锁一个步骤
-            workflowStep?.enableLock == true && workflowStep.enableUnlock == true -> lockStepLocked(
+            workflowStep?.enableLock == true && workflowStep.enableUnlock -> lockStepLocked(
                 workflowStep
             ) && unLockStepLocked(workflowStep)
 
             //上锁、共锁一个步骤
-            workflowStep?.enableLock == true && workflowStep.enableColock == true -> lockStepLocked(
+            workflowStep?.enableLock == true && workflowStep.enableColock -> lockStepLocked(
                 workflowStep
             ) && coLockStepLocked(workflowStep)
 
             //共锁、解除共锁一个步骤
-            workflowStep?.enableColock == true && workflowStep.enableReleaseColock == true -> releaseCoLockStepUnLocked(
+            workflowStep?.enableColock == true && workflowStep.enableReleaseColock -> releaseCoLockStepUnLocked(
                 workflowStep
             )
 
             //解除共锁、解锁一个步骤
-            workflowStep?.enableUnlock == true && workflowStep.enableReleaseColock == true -> unLockStepLocked(
+            workflowStep?.enableUnlock == true && workflowStep.enableReleaseColock -> unLockStepLocked(
                 workflowStep
             ) && releaseCoLockStepUnLocked(workflowStep)
 
@@ -748,7 +748,8 @@ class JobExecuteViewModel @Inject constructor(
     fun canCheckStep(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             val workflowStep = workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
-            if (ticketData?.createBy != MainDomainData.userInfo?.userName || workflowStep?.currentUserCanConfirm() == true) {
+            logger.info("检查是否可以确认步骤:${ticketData?.createBy != MainDomainData.userInfo?.userName},${workflowStep?.currentUserCanConfirm() == false}")
+            if (ticketData?.createBy != MainDomainData.userInfo?.userName || workflowStep?.currentUserCanConfirm() == false) {
                 ThreadUtils.runOnMain {
                     PopTip.build()
                         .tip(CommonUtils.getStr(com.grkj.ui_base.R.string.no_permission_to_handle))

+ 35 - 24
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/MyTodoViewModel.kt

@@ -4,20 +4,36 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.data.DictConstants
 import com.grkj.data.data.MainDomainData
+import com.grkj.data.di.RepositoryManager
+import com.grkj.data.di.RepositoryManager.workflowRepository
 import com.grkj.data.enums.OperationTypeEnum
-import com.grkj.data.model.dos.IsJobTicketPoints
+import com.grkj.data.enums.RoleEnum
+import com.grkj.data.model.dos.WorkflowStep
+import com.grkj.data.model.local.DeviceTakeUpdate
 import com.grkj.data.model.local.TodoStepJoin
 import com.grkj.data.model.local.isMyTodo
 import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.vo.IsJobTicketPointsDataVo
+import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.TodoItemVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.iscs.R
 import com.grkj.ui_base.base.BaseViewModel
+import com.grkj.ui_base.business.BleBusinessManager
 import com.grkj.ui_base.business.DataBusiness
+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.event.UiEvent
+import com.grkj.ui_base.utils.extension.tip
+import com.grkj.ui_base.utils.modbus.DeviceConst
+import com.grkj.ui_base.utils.modbus.ModBusController
+import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.thread.ThreadUtils
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
+import java.util.concurrent.atomic.AtomicInteger
 import javax.inject.Inject
 
 /**
@@ -61,8 +77,7 @@ class MyTodoViewModel @Inject constructor(
     }
 
     private fun splitTodoSteps(
-        all: List<TodoItemVo>,
-        waitLimit: Int = Int.MAX_VALUE // 支持限制 waitData 条数
+        all: List<TodoItemVo>, waitLimit: Int = Int.MAX_VALUE // 支持限制 waitData 条数
     ) {
         // 初始化容器
         val tempTodo = mutableListOf<TodoItemVo>()
@@ -106,9 +121,8 @@ class MyTodoViewModel @Inject constructor(
             this.stepId = temp.stepId
             this.workflowStepId = temp.workflowStepId
             this.stepIndex = temp.stepIndex
-            this.isCurrentStep =
-                sameTicketStepJoinData.filter { it.stepStatus == "0" }
-                    .minByOrNull { it.stepIndex }?.stepIndex == temp.stepIndex
+            this.isCurrentStep = sameTicketStepJoinData.filter { it.stepStatus == "0" }
+                .minByOrNull { it.stepIndex }?.stepIndex == temp.stepIndex
             this.todoStatus = when {
                 temp.stepStatus == "0" && this.isCurrentStep -> CommonUtils.getStr(R.string.todo_header)
                 temp.stepStatus == "0" && !this.isCurrentStep -> CommonUtils.getStr(R.string.wait_header)
@@ -123,18 +137,25 @@ class MyTodoViewModel @Inject constructor(
             this.stepStatus = temp.stepStatus
             this.stepUpdateTime = temp.stepUpdateTime
             this.createTime = temp.ticketStartTime
+            this.enableSetLocker = temp.enableSetLocker
+            this.enableSetColocker = temp.enableSetColocker
+            this.enableAddColocker = temp.enableAddColocker
+            this.enableReduceColocker = temp.enableReduceColocker
+            this.enableLock = temp.enableLock
+            this.enableColock = temp.enableColock
+            this.enableReleaseColock = temp.enableReleaseColock
+            this.enableUnlock = temp.enableUnlock
+            this.enableEndJob = temp.enableEndJob
+            this.confirmUser = temp.confirmUser
+            this.confirmRoleCode = temp.confirmRoleCode
+            this.stepTitle = temp.stepTitle
+            this.stepTitleShort = temp.stepTitleShort
+            this.stepDescription = temp.stepDescription
             this.previousTodoItem =
                 temp.previousTodoStepJoin?.map { it.toTodoVo(sameTicketStepJoinData) }
         }
     }
 
-    /**
-     * 处理上锁取钥匙
-     */
-    fun handleLockTakeKey(todoItemVo: TodoItemVo) {
-
-    }
-
     /**
      * 获取处理提醒
      */
@@ -147,8 +168,7 @@ class MyTodoViewModel @Inject constructor(
                 .toString()
 
             OperationTypeEnum.CONFIRM -> CommonUtils.getStr(
-                R.string.handle_step_confirm,
-                item.todoTitle.toString()
+                R.string.handle_step_confirm, item.todoTitle.toString()
             ).toString()
 
             OperationTypeEnum.END -> CommonUtils.getStr(R.string.finish_job_tip).toString()
@@ -156,15 +176,6 @@ class MyTodoViewModel @Inject constructor(
         }
     }
 
-    /**
-     * 处理待办
-     */
-    fun handleTodo(item: TodoItemVo): LiveData<Boolean> {
-        return liveData(Dispatchers.IO) {
-
-        }
-    }
-
     /**
      * 获取点位数据
      */

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

@@ -223,7 +223,7 @@
                         app:layout_constraintHorizontal_chainStyle="packed"
                         app:layout_constraintTop_toBottomOf="@+id/step_confirm_type_tv"
                         app:markPosition="end"
-                        app:required="true" />
+                        app:required="false" />
 
                     <TextView
                         android:id="@+id/step_confirm_role"

+ 3 - 0
app/src/main/res/navigation/nav_job_manage.xml

@@ -209,5 +209,8 @@
         <action
             android:id="@+id/action_myTodoListFragment_to_nav_exception_job_manage"
             app:destination="@id/exceptionJobFragment2" />
+        <action
+            android:id="@+id/action_myTodoListFragment_to_selectMemberFragment"
+            app:destination="@id/selectMemberFragment" />
     </fragment>
 </navigation>

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

@@ -502,5 +502,6 @@
     <string name="item_my_todo_complete_time_title">Completion time:</string>
     <string name="point_detail">Point Detail</string>
     <string name="close">Close</string>
+    <string name="handle_failed">Handle failed</string>
 
 </resources>

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

@@ -502,5 +502,6 @@
     <string name="item_my_todo_complete_time_title">完成时间:</string>
     <string name="point_detail">点位明细</string>
     <string name="close">关闭</string>
+    <string name="handle_failed">处理失败</string>
 
 </resources>

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

@@ -505,5 +505,6 @@
     <string name="item_my_todo_complete_time_title">完成时间:</string>
     <string name="point_detail">点位明细</string>
     <string name="close">关闭</string>
+    <string name="handle_failed">处理失败</string>
 
 </resources>

+ 7 - 13
data/src/main/java/com/grkj/data/model/dos/WorkflowStep.kt

@@ -160,21 +160,15 @@ data class WorkflowStep(
      */
     @Ignore
     fun currentUserCanConfirm(): Boolean {
-        if (confirmRoleCode == null && confirmUser == null) {
-            return true
-        }
-        if (confirmRoleCode != null && confirmUser == null && MainDomainData.roleKeys?.contains(
-                confirmRoleCode!!
-            ) == true
-        ) {
-            return true
-        }
-        if (confirmRoleCode != null && confirmUser != null && MainDomainData.roleKeys?.contains(
-                confirmRoleCode!!
-            ) == true && MainDomainData.userInfo?.userId == confirmUser
-        ) {
+        if (confirmUser == null || MainDomainData.userInfo?.userId == confirmUser) {
             return true
         }
+//        if (confirmRoleCode != null && confirmUser == null && MainDomainData.roleKeys?.contains(
+//                confirmRoleCode!!
+//            ) == true
+//        ) {
+//            return true
+//        }
         return false
     }
 

+ 7 - 3
data/src/main/java/com/grkj/data/model/local/TodoStepJoin.kt

@@ -19,6 +19,8 @@ data class TodoStepJoin(
     // ----- WorkflowStep 信息(判定动作) -----
     val enableSetLocker: Boolean,
     val enableSetColocker: Boolean,
+    val enableAddColocker: Boolean,
+    val enableReduceColocker: Boolean,
     val enableLock: Boolean,
     val enableColock: Boolean,
     val enableReleaseColock: Boolean,
@@ -50,8 +52,8 @@ fun TodoStepJoin.isMyTodo(currentUserId: Long, currentUserName: String): Boolean
     if (enableUnlock && userRole == RoleEnum.JTLOCKER.roleKey && lockerUserId == currentUserId) return true
 
     // ---- 判定共锁/解除共锁(由创建者) ----
-    if (enableColock && isCreator) return true
-    if (enableReleaseColock && isCreator) return true
+//    if (enableColock && isCreator) return true
+//    if (enableReleaseColock && isCreator) return true
 
     // ---- 判定结束作业(由创建者) ----
     if (enableEndJob && isCreator) return true
@@ -65,5 +67,7 @@ fun TodoStepJoin.isMyTodo(currentUserId: Long, currentUserName: String): Boolean
 
 // WorkflowStep 扩展:判定是否包含任何硬件相关动作
 fun TodoStepJoin.hasAnyHardwareOperationFunction(): Boolean =
-    enableLock || enableColock || enableReleaseColock || enableUnlock
+    enableLock ||
+//            enableColock || enableReleaseColock ||
+            enableUnlock
 

+ 16 - 0
data/src/main/java/com/grkj/data/model/vo/TodoItemVo.kt

@@ -91,4 +91,20 @@ class TodoItemVo {
      * 上一步待办
      */
     var previousTodoItem: List<TodoItemVo>? = null
+
+    // ----- WorkflowStep 信息(判定动作) -----
+    var enableSetLocker: Boolean = false
+    var enableSetColocker: Boolean = false
+    var enableAddColocker: Boolean = false
+    var enableReduceColocker: Boolean = false
+    var enableLock: Boolean = false
+    var enableColock: Boolean = false
+    var enableReleaseColock: Boolean = false
+    var enableUnlock: Boolean = false
+    var enableEndJob: Boolean = false
+    var confirmUser: Long? = null
+    var confirmRoleCode: String? = null
+    var stepTitle: String? = ""
+    var stepTitleShort: String? = ""
+    var stepDescription: String? = ""
 }

+ 43 - 6
data/src/main/java/com/grkj/data/repository/impl/standard/JobTicketRepository.kt

@@ -281,6 +281,9 @@ class JobTicketRepository @Inject constructor(
             val ticketSteps = stepInstances.filter { it.ticketId == ticketId }
             val workflowSteps = modeSteps[ticket.modeId] ?: emptyList()
             val previousStepJoin: MutableList<TodoStepJoin> = mutableListOf()
+            val currentStepId =
+                ticketSteps.filter { isJobTicketStep -> isJobTicketStep.stepStatus == "0" }
+                    .minByOrNull { isJobTicketStep -> isJobTicketStep.stepIndex }?.stepId
             ticketSteps.sortedBy { it.stepIndex }.forEach { step ->
                 val workflowStep =
                     workflowSteps.firstOrNull { it.stepId == step.workflowStepId } ?: return@forEach
@@ -311,9 +314,10 @@ class JobTicketRepository @Inject constructor(
                                     it.previousTodoStepJoin = previousStepJoin.toList()
                                 }
                             }
-                            previousStepJoin.clear()
                             result += groupStepJoin
-                            previousStepJoin.addAll(groupStepJoin)
+                            if (currentStepId == step.stepId) {
+                                previousStepJoin.addAll(groupStepJoin)
+                            }
                         } else {
                             val keysStepJoin = keys.map { key ->
                                 buildTodoStepJoin(
@@ -330,9 +334,10 @@ class JobTicketRepository @Inject constructor(
                                     it.previousTodoStepJoin = previousStepJoin.toList()
                                 }
                             }
-                            previousStepJoin.clear()
                             result += keysStepJoin
-                            previousStepJoin.addAll(keysStepJoin)
+                            if (currentStepId == step.stepId) {
+                                previousStepJoin.addAll(keysStepJoin)
+                            }
                         }
                     }
 
@@ -344,7 +349,9 @@ class JobTicketRepository @Inject constructor(
 //                        }
 //                        previousStepJoin.clear()
 //                        result +=temp
-//                        previousStepJoin.add(temp)
+//                        if (currentStepId == step.stepId) {
+//                            previousStepJoin.add(temp)
+//                        }
 
                     }
 
@@ -364,7 +371,9 @@ class JobTicketRepository @Inject constructor(
                         }
                         previousStepJoin.clear()
                         result += temp
-                        previousStepJoin.add(temp)
+                        if (currentStepId == step.stepId) {
+                            previousStepJoin.add(temp)
+                        }
                     }
                 }
             }
@@ -401,6 +410,8 @@ class JobTicketRepository @Inject constructor(
 
             enableSetLocker = workflowStep.enableSetLocker,
             enableSetColocker = workflowStep.enableSetColocker,
+            enableAddColocker = workflowStep.enableAddColocker,
+            enableReduceColocker = workflowStep.enableReduceColocker,
             enableLock = workflowStep.enableLock,
             enableColock = workflowStep.enableColock,
             enableReleaseColock = workflowStep.enableReleaseColock,
@@ -610,6 +621,32 @@ class JobTicketRepository @Inject constructor(
 
     override fun startJob(jobTicketId: Long?) {
         jobTicketDao.startJob(jobTicketId, "1")
+        val ticketStep = jobTicketDao.getJobTicketStepDataByTicketId(jobTicketId ?: 0)
+        val ticketData = jobTicketDao.getTicketDataByTicketId(jobTicketId ?: 0)
+        val workflowSteps = workflowStepDao.getStepsByMode(ticketData?.modeId ?: 0)
+        for (stepDataVo in ticketStep) {
+            val workflowStep = workflowSteps.find { it.stepId == stepDataVo.workflowStepId }
+            //如果是自动确认并且没有操作的功能,则更新步骤
+            if (workflowStep?.confirmType != 0 && workflowStep?.hasAnyOperationFunction() == false) {
+                stepDataVo.stepStatus = "1"
+                BeanUtils.copyProperties(
+                    stepDataVo, IsJobTicketStep::class.java
+                )?.let { jobTicketStep ->
+                    updateTicketStepData(jobTicketStep)
+                    val currentWorkflowStep = workflowSteps.find {
+                        it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
+                    }
+                    ticketData?.ticketStatus = currentWorkflowStep?.getTicketStatus() ?: ""
+                    updateTicketDataStatus(
+                        jobTicketId ?: 0,
+                        currentWorkflowStep?.getTicketStatus()?.toInt()
+                            ?: JobTicketStatusEnum.PROGRESSING.status.toInt()
+                    )
+                }
+            } else {
+                break
+            }
+        }
     }
 
     override fun getTicketUsersByTicketId(ticketId: Long): List<JobUserVo> {

+ 1 - 1
shared/src/main/cpp/shared.cpp

@@ -20,5 +20,5 @@
 extern "C"
 JNIEXPORT jstring JNICALL
 Java_com_grkj_shared_config_AESConfig_aesKey(JNIEnv *env, jobject thiz) {
-    return env->NewStringUTF("htD3aLklkYBR3ndN");
+    return env->NewStringUTF("e3d8c4a0f72b1e9d8a5f06c3b4910d7a");
 }

+ 2 - 2
shared/src/main/java/com/grkj/shared/config/AESConfig.kt

@@ -14,7 +14,7 @@ class AESConfig : IEncryptConfig {
         System.loadLibrary("iscs_shared")
     }
 
-    companion object{
+    companion object {
         @JvmStatic
         val defaultConfig: AESConfig by lazy { AESConfig() }
     }
@@ -24,7 +24,7 @@ class AESConfig : IEncryptConfig {
     }
 
     override fun key(): ByteArray {
-        return aesKey().toByteArray()
+        return aesKey().substring(0, 16).toByteArray()
     }
 
     override fun mode(): EncryptMode {