Browse Source

refactor(更新)
- 界面的点击流程完成

周文健 4 months ago
parent
commit
e65ee8536d

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

@@ -82,7 +82,8 @@ class InProgressJobManageFragment : BaseFragment<FragmentInProgressJobManageBind
                     JobTicketStatusEnum.SELECT_MEMBER,
                     JobTicketStatusEnum.LOCKING,
                     JobTicketStatusEnum.COLOCKING,
-                    JobTicketStatusEnum.UNLOCKING
+                    JobTicketStatusEnum.UNLOCKING,
+                    JobTicketStatusEnum.PROGRESSING
                 ).map { it.status }
             }
         }

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

@@ -27,6 +27,7 @@ import com.grkj.iscs.features.main.viewmodel.job_manage.JobExecuteViewModel
 import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.data.data.EventConstants
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.model.dos.WorkflowStep
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
@@ -136,7 +137,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         binding.dataTitleTv.text = when (index) {
             0 -> CommonUtils.getStr(
                 R.string.job_execute_step_description,
-                viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }?.stepTitle
+                viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }?.stepTitle
                     ?: ""
             ).toString()
 
@@ -164,7 +165,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             }
 
             "0" -> {
-                if (item.stepId == viewModel.ticketStep.first { it.stepStatus == "0" }.stepId) {
+                if (item.stepId == viewModel.currentStepData?.stepId) {
                     if (bg is GradientDrawable) {
                         bg.mutate()  // 拷贝一份,避免影响到其它引用了同一个 drawable 的 view
                         bg.setColor(requireContext().getColor(R.color.color_ffec99))
@@ -176,57 +177,108 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         //点击确认的时候需要
         itemBinding.stepLayout.setDebouncedClickListener {
-            if (viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableSetLocker == true ||
-                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableSetColocker == true ||
-                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableAddColocker == true ||
-                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.enableReduceColocker == true
+            if (item.stepId != viewModel.currentStepData?.stepId) {
+                return@setDebouncedClickListener
+            }
+            val workflowStep =
+                viewModel.workflowSteps.find { it.stepId == item.workflowStepId }
+            if (workflowStep?.confirmType == 0 &&
+                workflowStep.confirmRoleCode == null &&
+                workflowStep.confirmUser == null
             ) {
-                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
-                    )
-                navController.navigate(R.id.action_jobExecuteFragment_to_selectMemberFragment)
-            } else if (viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.confirmType == 0 &&
-                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.confirmRoleCode == null &&
-                viewModel.workflowSteps.find { it.stepIndex == item.stepStatus.toInt() }?.confirmUser == null
+                stepClickConfirm(adapter, item, workflowStep)
+            } else if (workflowStep?.confirmType == 0 &&
+                (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
+                    workflowStep.confirmRoleCode!!
+                ) == true) &&
+                workflowStep.confirmUser == null
             ) {
-                item.stepStatus = "1"
-                viewModel.updateStepStatus(item).observe(this@JobExecuteFragment) {
-                    if (it == false) {
-                        PopTip.tip(R.string.step_confirm_failed)
-                    } else {
-                        adapter.notifyDataSetChanged()
+                stepClickConfirm(adapter, item, workflowStep)
+            } else if (workflowStep?.confirmType == 0 &&
+                (workflowStep.confirmRoleCode != null && MainDomainData.roleKeys?.contains(
+                    workflowStep.confirmRoleCode!!
+                ) == true) &&
+                (workflowStep.confirmUser != null && MainDomainData.userInfo?.userId == workflowStep.confirmUser)
+            ) {
+                stepClickConfirm(adapter, item, workflowStep)
+            } else {
+                PopTip.tip(com.grkj.ui_base.R.string.no_permission_to_handle)
+            }
+        }
+    }
+
+    private fun stepClickConfirm(
+        adapter: BindingAdapter,
+        item: IsJobTicketStepDataVo,
+        workflowStep: WorkflowStep?
+    ) {
+        if (!checkSelectMember(workflowStep)) {
+            if (viewModel.stepConditionsComplete(workflowStep)) {
+                TipDialog.showInfo(
+                    msg = CommonUtils.getStr(
+                        com.grkj.ui_base.R.string.action_confirm_content,
+                        workflowStep?.stepTitleShort.toString()
+                    ).toString(), onConfirmClick = {
+                        item.stepStatus = "1"
+                        viewModel.updateStepStatus(item).observe(this@JobExecuteFragment) {
+                            if (it == false) {
+                                PopTip.tip(R.string.step_confirm_failed)
+                            } else {
+                                checkCurrentStep()
+                            }
+                            adapter.notifyDataSetChanged()
+                        }
                     }
-                }
+                )
+            } else {
+                PopTip.tip(com.grkj.ui_base.R.string.current_step_can_not_be_process)
             }
         }
     }
 
+    private fun checkSelectMember(
+        workflowStep: WorkflowStep?
+    ): Boolean {
+        val currentWorkflowStep = viewModel.getCurrentWorkflowStep()
+        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
+                )
+            navController.navigate(R.id.action_jobExecuteFragment_to_selectMemberFragment)
+            return true
+        }
+        return false
+    }
+
     private fun onColockerRVListBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemJobExecuteColockBinding>()
         val item = holder.getModel<IsJobTicketUserDataVo>()
@@ -301,7 +353,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             EventConstants.EVENT_RFID_CARD_READ -> {
                 (event.data as RFIDCardReadEvent).let {
                     logger.info("读卡器获取卡片RFID:${it.rfidNo}")
-                    if (viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }?.enableColock == true &&
+                    if (viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }?.enableColock == true &&
                         viewModel.ticketPoints.none { it.pointStatus == "0" }
                     ) {
                         viewModel.getUserIdByCardRfid(it.rfidNo).observe(this) { userId ->
@@ -383,7 +435,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
             binding.finishJob.isVisible = true
         } else {
             val currentStep =
-                viewModel.workflowSteps.find { it.stepIndex == viewModel.currentStepData?.stepIndex }
+                viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
             when {
                 //步骤开启取消作业,并且点位还没有上锁,显示取消作业按钮
                 (currentStep?.enableCancelJob == true && viewModel.ticketPoints.any { it.pointStatus != "0" }) -> {
@@ -435,7 +487,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     viewModel.currentStepData =
                         viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
                     binding.stepDescriptionTv.text =
-                        viewModel.workflowModes.find { it.modeId == viewModel.ticketData?.modeId }?.modeDescription
+                        viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }?.stepDescription
                     refreshTicketUser()
                     checkCurrentStep()
                     binding.lockInfo.text =
@@ -500,11 +552,33 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         }
         if (viewModel.checkMemberFinish) {
             viewModel.updateLockerAndColockerData().observe(this) {
-                viewModel.currentStepData?.stepStatus = "1"
-                viewModel.currentStepData =
-                    viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
-                checkCurrentStep()
-                binding.stepRv.adapter?.notifyDataSetChanged()
+                val workflowStep =
+                    viewModel.workflowSteps.find { it.stepId == viewModel.currentStepData?.workflowStepId }
+                if ((workflowStep?.confirmType != 0 || (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)
+                ) {
+                    viewModel.currentStepData?.stepStatus = "1"
+                    viewModel.currentStepData =
+                        viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                    checkCurrentStep()
+                    binding.stepRv.adapter?.notifyDataSetChanged()
+                }
+                if (workflowStep?.enableAddColocker == true || workflowStep?.enableReduceColocker == true) {
+                    if (workflowStep.gotoStepAfterAddingColocker != null) {
+                        viewModel.ticketStep.filter {
+                            it.workflowStepId in viewModel.workflowSteps.filter { it.stepIndex > workflowStep.gotoStepAfterAddingColocker!! }
+                                .map { it.stepId }
+                        }.forEach {
+                            it.stepStatus = "0"
+                        }
+                        viewModel.currentStepData =
+                            viewModel.ticketStep.firstOrNull { it.stepStatus == "0" }
+                        binding.stepRv.adapter?.notifyDataSetChanged()
+                    }
+                }
             }
         }
     }

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

@@ -17,12 +17,10 @@ import com.grkj.data.model.vo.IsJobTicketUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.data.repository.IJobTicketRepository
 import com.grkj.data.repository.IWorkflowRepository
-import com.grkj.data.repository.impl.WorkflowRepository
 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.ModbusBusinessManager
-import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.LoadingEvent
@@ -57,6 +55,13 @@ class JobExecuteViewModel @Inject constructor(
     var workflowSteps: List<WorkflowStep> = mutableListOf()
     var isUnlockFirst: Boolean = false
 
+    /**
+     * 获取当前流程步骤数据
+     */
+    fun getCurrentWorkflowStep(): WorkflowStep? {
+        return workflowSteps.find { it.stepId == currentStepData?.workflowStepId }
+    }
+
     /**
      * 获取作业数据
      */
@@ -346,10 +351,11 @@ class JobExecuteViewModel @Inject constructor(
                 jobTicketStepDataVo, IsJobTicketStep::class.java
             )
             ticketStepData?.let {
+                currentStepData = ticketStep.find { it.stepIndex == ticketStepData.stepIndex + 1 }
                 jobTicketRepository.updateTicketStepData(it)
                 val workflowSteps = workflowRepository.getStepsByMode(ticketData!!.modeId)
                 val currentWorkflowStep = workflowSteps.find {
-                    it.stepId == ticketStep.firstOrNull { it.stepStatus == "0" }?.workflowStepId
+                    it.stepId == currentStepData?.workflowStepId
                 }
                 jobTicketRepository.updateTicketDataStatus(
                     ticketId, currentWorkflowStep?.getTicketStatus()?.toInt() ?: 0
@@ -358,4 +364,54 @@ class JobExecuteViewModel @Inject constructor(
             } ?: emit(false)
         }
     }
+
+    /**
+     * 上锁步骤是否上锁完成
+     */
+    private fun lockStepLocked(workflowStep: WorkflowStep?): Boolean {
+        return workflowStep?.enableLock == true && ticketPoints.all { it.pointStatus == "1" }
+    }
+
+    /**
+     * 共锁步骤是否共锁完成
+     */
+    private fun coLockStepLocked(workflowStep: WorkflowStep?): Boolean {
+        return workflowStep?.enableColock == true && ticketUser.all { it.jobStatus == "1" }
+    }
+
+    /**
+     * 解除共锁步骤是否解锁完成
+     */
+    private fun releaseCoLockStepUnLocked(workflowStep: WorkflowStep?): Boolean {
+        return workflowStep?.enableReleaseColock == true && ticketUser.all { it.jobStatus == "2" }
+    }
+
+    /**
+     * 解锁步骤是否解锁完成
+     */
+    private fun unLockStepLocked(workflowStep: WorkflowStep?): Boolean {
+        return workflowStep?.enableUnlock == true && ticketPoints.all { it.pointStatus == "2" }
+    }
+
+    /**
+     * 步骤条件是否完成
+     */
+    fun stepConditionsComplete(workflowStep: WorkflowStep?): Boolean {
+        return when {
+            workflowStep?.enableLock == true && workflowStep.enableColock == true -> lockStepLocked(
+                workflowStep
+            ) && coLockStepLocked(workflowStep)
+
+            workflowStep?.enableUnlock == true && workflowStep.enableReleaseColock == true -> unLockStepLocked(
+                workflowStep
+            ) && releaseCoLockStepUnLocked(workflowStep)
+
+            workflowStep?.enableLock == true -> lockStepLocked(workflowStep)
+            workflowStep?.enableColock == true -> coLockStepLocked(workflowStep)
+            workflowStep?.enableReleaseColock == true -> releaseCoLockStepUnLocked(workflowStep)
+            workflowStep?.enableUnlock == true -> unLockStepLocked(workflowStep)
+            workflowStep?.hasAnyHardwareOperationFunction() == false -> true
+            else -> false
+        }
+    }
 }

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

@@ -3,7 +3,7 @@
 
     <LinearLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="match_parent"
         android:layout_marginLeft="@dimen/common_spacing"
         android:layout_marginTop="@dimen/common_spacing"
         android:gravity="center"

+ 1 - 6
data/src/main/java/com/grkj/data/dao/JobTicketDao.kt

@@ -309,12 +309,7 @@ interface JobTicketDao {
      * 获取工作中的作业数量
      */
     @Query(
-        "select count(1) from is_job_ticket ijt where EXISTS ( " +
-                "  SELECT 1 " +
-                "  FROM is_job_ticket_step ijts" +
-                "  WHERE ijts.ticket_id   = ijt.ticket_id" +
-                "    AND ijts.step_status > 0" +
-                ")"
+        "select count(1) from is_job_ticket ijt where ijt.ticket_status in (1,2,3,4,7)"
     )
     fun getInProgressJobSize(): Int
 

+ 2 - 1
data/src/main/java/com/grkj/data/enums/JobTicketStatusEnum.kt

@@ -11,7 +11,8 @@ enum class JobTicketStatusEnum(val status: String, val description: String) {
     COLOCKING("3", "共锁中"),
     UNLOCKING("4", "解锁中"),
     FINISHED("5", "已结束"),
-    CANCELED("6", "已取消");
+    CANCELED("6", "已取消"),
+    PROGRESSING("7","进行中");
 
     companion object {
         /**

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

@@ -134,7 +134,7 @@ data class WorkflowStep(
             enableLock -> JobTicketStatusEnum.LOCKING.status
             enableColock || enableReleaseColock -> JobTicketStatusEnum.COLOCKING.status
             enableUnlock -> JobTicketStatusEnum.UNLOCKING.status
-            else -> "0"
+            else -> JobTicketStatusEnum.PROGRESSING.status
         }
     }
 
@@ -145,4 +145,12 @@ data class WorkflowStep(
     fun hasAnyOperationFunction(): Boolean {
         return enableSetLocker || enableSetColocker || enableLock || enableColock || enableAddColocker || enableReduceColocker || enableReleaseColock || enableUnlock || enableEndJob
     }
+
+    /**
+     * 是否有任何需要硬件操作的功能
+     */
+    @Ignore
+    fun hasAnyHardwareOperationFunction(): Boolean {
+        return enableLock || enableColock || enableReleaseColock || enableUnlock
+    }
 }

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

@@ -163,6 +163,7 @@
     <string name="please_select_locker">Please select locker</string>
     <string name="has_locked">Locked</string>
     <string name="action_confirm_shut_down">Confirm to perform shutdown operation?</string>
+    <string name="action_confirm_content">Confirm to perform %1$s operation?</string>
     <string name="action_confirm_lock">Confirm to perform lockout tagout?</string>
     <string name="action_confirm_power_isolation">Confirm to verify energy isolation?</string>
     <string name="action_confirm_check_before_unlocking">Confirm to perform pre-unlock check?</string>

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

@@ -163,6 +163,7 @@
     <string name="please_select_locker">请选择上锁人</string>
     <string name="has_locked">已上锁</string>
     <string name="action_confirm_shut_down">确定要执行停机操作吗?</string>
+    <string name="action_confirm_content">确定要执行%1$s吗?</string>
     <string name="action_confirm_lock">确定要执行上锁挂牌吗?</string>
     <string name="action_confirm_power_isolation">确定要执行能量隔离证实吗?</string>
     <string name="action_confirm_check_before_unlocking">确定要执行取锁前检查吗?</string>

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

@@ -163,6 +163,7 @@
     <string name="please_select_locker">请选择上锁人</string>
     <string name="has_locked">已上锁</string>
     <string name="action_confirm_shut_down">确定要执行停机操作吗?</string>
+    <string name="action_confirm_content">确定要执行%1$s吗?</string>
     <string name="action_confirm_lock">确定要执行上锁挂牌吗?</string>
     <string name="action_confirm_power_isolation">确定要执行能量隔离证实吗?</string>
     <string name="action_confirm_check_before_unlocking">确定要执行取锁前检查吗?</string>