|
@@ -2,22 +2,37 @@ package com.grkj.iscs.features.main.fragment.job_manage
|
|
|
|
|
|
|
|
import androidx.core.view.isVisible
|
|
import androidx.core.view.isVisible
|
|
|
import androidx.fragment.app.viewModels
|
|
import androidx.fragment.app.viewModels
|
|
|
|
|
+import androidx.lifecycle.Lifecycle
|
|
|
|
|
+import androidx.lifecycle.repeatOnLifecycle
|
|
|
import com.drake.brv.BindingAdapter
|
|
import com.drake.brv.BindingAdapter
|
|
|
import com.drake.brv.utils.grid
|
|
import com.drake.brv.utils.grid
|
|
|
import com.drake.brv.utils.linear
|
|
import com.drake.brv.utils.linear
|
|
|
import com.drake.brv.utils.models
|
|
import com.drake.brv.utils.models
|
|
|
import com.drake.brv.utils.setup
|
|
import com.drake.brv.utils.setup
|
|
|
import com.google.android.material.tabs.TabLayout
|
|
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.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.data.model.vo.TodoItemVo
|
|
|
import com.grkj.iscs.R
|
|
import com.grkj.iscs.R
|
|
|
import com.grkj.iscs.common.DataTransferConstants
|
|
import com.grkj.iscs.common.DataTransferConstants
|
|
|
import com.grkj.iscs.databinding.FragmentMyTodoListBinding
|
|
import com.grkj.iscs.databinding.FragmentMyTodoListBinding
|
|
|
import com.grkj.iscs.databinding.ItemMyTodoBinding
|
|
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.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.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.base.BaseFragment
|
|
|
import com.grkj.ui_base.dialog.TipDialog
|
|
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.data.GlobalDataTempStore
|
|
|
import com.sik.sikcore.extension.setDebouncedClickListener
|
|
import com.sik.sikcore.extension.setDebouncedClickListener
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
@@ -28,6 +43,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
|
|
@AndroidEntryPoint
|
|
@AndroidEntryPoint
|
|
|
class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
|
|
class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
|
|
|
private val viewModel: MyTodoViewModel by viewModels()
|
|
private val viewModel: MyTodoViewModel by viewModels()
|
|
|
|
|
+ private val jobExecuteViewModel: JobExecuteViewModel by viewModels()
|
|
|
private var isFirstEnter: Boolean = true
|
|
private var isFirstEnter: Boolean = true
|
|
|
private val tabKey: List<String> by lazy {
|
|
private val tabKey: List<String> by lazy {
|
|
|
listOf(
|
|
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})" }}" }
|
|
item.previousTodoItem?.joinToString(",") { itemData -> "${itemData.todoType.todoTitle}${itemData.groupName?.let { if (it.isEmpty()) "(${itemData.todoContent})" else "(${it})" }}" }
|
|
|
itemBinding.btnPointDetail.isVisible =
|
|
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
|
|
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
|
|
item.isCurrentStep && item.todoType != OperationTypeEnum.LOCK_RETURN_KEY && item.todoType != OperationTypeEnum.UNLOCK_RETURN_KEY
|
|
|
|
|
+ }
|
|
|
itemBinding.btnPointDetail.setDebouncedClickListener {
|
|
itemBinding.btnPointDetail.setDebouncedClickListener {
|
|
|
viewModel.getTicketPointsData(item.ticketId).observe(this) {
|
|
viewModel.getTicketPointsData(item.ticketId).observe(this) {
|
|
|
TodoPointDetailDialog.show(it)
|
|
TodoPointDetailDialog.show(it)
|
|
@@ -158,7 +185,34 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
|
|
|
return@setDebouncedClickListener
|
|
return@setDebouncedClickListener
|
|
|
}
|
|
}
|
|
|
TipDialog.showInfo(viewModel.getHandleTip(item), onConfirmClick = {
|
|
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() {
|
|
override fun onResume() {
|
|
|
super.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()
|
|
getData()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -189,6 +417,20 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
|
|
|
if (isFirstEnter) {
|
|
if (isFirstEnter) {
|
|
|
isFirstEnter = false
|
|
isFirstEnter = false
|
|
|
filterAndUpdate()
|
|
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
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|