Selaa lähdekoodia

feat(异常管理、我的待办)
- 异常上报时,如果有关联数据源则将关联关系写入数据库
- 我的待办已完成列表增加处理时间筛选功能
- 我的待办列表增加排序,待接单、待处理列表按作业票ID升序,已完成列表按步骤更新时间降序

周文健 3 kuukautta sitten
vanhempi
sitoutus
628f72af0f

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

@@ -1,5 +1,6 @@
 package com.grkj.iscs.features.main.fragment.job_manage
 
+import android.widget.TextView
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.Lifecycle
@@ -22,6 +23,7 @@ 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.TextDropDownDialog
 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
@@ -32,9 +34,12 @@ 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.loper7.date_time_picker.dialog.CardDatePickerDialog
 import com.sik.sikcore.data.GlobalDataTempStore
+import com.sik.sikcore.date.TimeUtils
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
+import java.util.Date
 
 /**
  * 我的待办
@@ -52,6 +57,15 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
         )
     }
 
+    private val handleTimeData: List<String> by lazy {
+        listOf(
+            getString(R.string.all),
+            getString(R.string.handle_time_last_7_days),
+            getString(R.string.handle_time_last_30_days),
+            getString(R.string.handle_time_custom_time_range)
+        )
+    }
+
     override fun getLayoutId(): Int {
         return R.layout.fragment_my_todo_list
     }
@@ -73,6 +87,86 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
             }
         }
         setupTabs()
+        setupHandleTime()
+    }
+
+    /**
+     * 设置处理时间
+     */
+    private fun setupHandleTime() {
+        binding.handleTimeTv.text = getString(R.string.all)
+        binding.handleTimeTv.setDebouncedClickListener {
+            TextDropDownDialog.showSingle(
+                handleTimeData.map {
+                    TextDropDownDialog.SimpleTextDropDownEntity(dataText = it)
+                }, binding.handleTimeTv, false
+            ) {
+                val position = handleTimeData.indexOf(it.getShowText())
+                when (position) {
+                    0 -> binding.listRv.models =
+                        viewModel.doneData.sortedByDescending { it.stepUpdateTime }
+
+                    1 -> binding.listRv.models = viewModel.doneData.filter {
+                        val updateTimeDate = TimeUtils.parseDate(
+                            it.stepUpdateTime,
+                            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+                        )
+                        updateTimeDate?.let {
+                            TimeUtils.calcDayNum(it, Date()) <= 1
+                        } ?: false
+                    }.sortedByDescending { it.stepUpdateTime }
+
+                    2 -> binding.listRv.models = viewModel.doneData.filter {
+                        val updateTimeDate = TimeUtils.parseDate(
+                            it.stepUpdateTime,
+                            TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT
+                        )
+                        updateTimeDate?.let {
+                            TimeUtils.calcDayNum(it, Date()) <= 30
+                        } ?: false
+                    }.sortedByDescending { it.stepUpdateTime }
+
+                    3 -> {
+                        viewModel.startTime = ""
+                        viewModel.endTime = ""
+                        pickDateTime(timeView = binding.handleTimeTv)
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 选择时间
+     */
+    private fun pickDateTime(startTime: Boolean = true, timeView: TextView) {
+        CardDatePickerDialog.builder(requireContext()).setTitle(
+            if (startTime) CommonUtils.getStr(com.grkj.ui_base.R.string.start_time)
+                .toString() else CommonUtils.getStr(com.grkj.ui_base.R.string.end_time)
+                .toString()
+        ).setOnChoose { millisecond ->
+            val chooseTime = TimeUtils.formatDate(
+                Date(millisecond), TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+            )
+            if (TimeUtils.isTimeBefore(
+                    chooseTime,
+                    viewModel.startTime,
+                    TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+                )
+            ) {
+                PopTip.build().tip(R.string.start_time_must_large_then_end_time)
+                return@setOnChoose
+            }
+            val timeStr = TimeUtils.formatDate(
+                Date(millisecond), TimeUtils.DEFAULT_DATE_HOUR_MIN_FORMAT
+            )
+            timeView.text = timeStr
+            if (startTime) {
+                viewModel.startTime = timeStr
+            } else {
+                viewModel.endTime = timeStr
+            }
+        }.build().show()
     }
 
     private fun setupTabs() {
@@ -89,6 +183,7 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
 
         binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
             override fun onTabSelected(tab: TabLayout.Tab) {
+                binding.handleTimeLayout.isVisible = tab.position == 2
                 filterAndUpdate(tab)
             }
 
@@ -104,9 +199,9 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
         val (data, index) = when {
             tab != null -> {
                 val list = when (tab.position) {
-                    0 -> viewModel.waitData
-                    1 -> viewModel.todoData
-                    2 -> viewModel.doneData
+                    0 -> viewModel.waitData.sortedBy { it.ticketId }
+                    1 -> viewModel.todoData.sortedBy { it.ticketId }
+                    2 -> viewModel.doneData.sortedByDescending { it.stepUpdateTime }
                     else -> mutableListOf()
                 }
                 list to tab.position

+ 12 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionViewModel.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.features.main.viewmodel.exception_manage
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.data.DictConstants
+import com.grkj.data.model.dos.IsExceptionSourceStandard
 import com.grkj.data.model.dos.IsExceptionStandard
 import com.grkj.data.model.res.CommonDictRes
 import com.grkj.data.model.vo.IsExceptionStandardVo
@@ -15,6 +16,7 @@ import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.DataBusiness
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.utils.CommonUtils
+import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.extension.toJson
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
@@ -276,7 +278,8 @@ class ExceptionViewModel @Inject constructor(
                     lockData.map {
                         val exceptionSourceDataEntity =
                             ExceptionSourceDataEntity(itemGroupPosition = 1)
-                        exceptionSourceDataEntity.sourceDataText = "挂锁${it.lockNfc}(${ModbusBusinessManager.getLockSlotPosition(it.lockNfc ?: "")})"
+                        exceptionSourceDataEntity.sourceDataText =
+                            "挂锁${it.lockNfc}(${ModbusBusinessManager.getLockSlotPosition(it.lockNfc ?: "")})"
                         exceptionSourceDataEntity.sourceDataId = it.lockId
                         exceptionSourceDataEntity.sourceDataType =
                             exceptionSourceDataType.find { it.dictLabel == "挂锁" }?.dictValue?.toInt()
@@ -345,7 +348,14 @@ class ExceptionViewModel @Inject constructor(
             exceptionData.exceptionType = selectedExceptionType?.toInt() ?: 0
             exceptionData.exceptionDescription = selectedExceptionDescription
             exceptionData.processApplication = selectedProcessApplication
-            exceptionRepository.reportException(exceptionData)
+            val exceptionId = exceptionRepository.reportException(exceptionData)
+            selectedSourceData.filter { it.isSelected }.forEach {
+                val isExceptionSourceStandard = IsExceptionSourceStandard()
+                isExceptionSourceStandard.exceptionId = exceptionId
+                isExceptionSourceStandard.sourceDataId = it.sourceDataId
+                isExceptionSourceStandard.sourceDataType = it.sourceDataType
+                exceptionRepository.saveExceptionSourceData(isExceptionSourceStandard)
+            }
             emit(true)
         }
     }

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

@@ -43,6 +43,16 @@ import javax.inject.Inject
 class MyTodoViewModel @Inject constructor(
     val jobTicketRepository: IJobTicketRepository,
 ) : BaseViewModel() {
+
+    /**
+     * 开始时间
+     */
+    var startTime: String = ""
+
+    /**
+     * 结束时间
+     */
+    var endTime: String = ""
     var jobTicketStatus: List<CommonDictRes> = mutableListOf()
     var todoItemVos: MutableList<TodoItemVo> = mutableListOf()
     var waitData: MutableList<TodoItemVo> = mutableListOf()
@@ -97,7 +107,8 @@ class MyTodoViewModel @Inject constructor(
 
             // 剩余非当前步骤的 wait 步骤,最多 waitLimit 条
             val waitSteps =
-                pendingSteps.filter { it !in todoStep }.sortedBy { it.stepIndex } // 可选:stepIndex小的优先
+                pendingSteps.filter { it !in todoStep }
+                    .sortedBy { it.stepIndex } // 可选:stepIndex小的优先
                     .take(waitLimit)
 
             tempWait.addAll(waitSteps)

+ 1 - 0
app/src/main/res/layout/fragment_my_todo_list.xml

@@ -73,6 +73,7 @@
                 app:tabTextAppearance="@style/TabTextStyle" />
 
             <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/handle_time_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal">

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

@@ -504,5 +504,8 @@
     <string name="close">Close</string>
     <string name="handle_failed">Handle failed</string>
     <string name="handle_time">Handle Time:</string>
+    <string name="handle_time_last_7_days">Last 7 days</string>
+    <string name="handle_time_last_30_days">Last 30 days</string>
+    <string name="handle_time_custom_time_range">Custom time range</string>
 
 </resources>

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

@@ -504,5 +504,8 @@
     <string name="close">关闭</string>
     <string name="handle_failed">处理失败</string>
     <string name="handle_time">处理时间:</string>
+    <string name="handle_time_last_7_days">最近7天</string>
+    <string name="handle_time_last_30_days">最近30天</string>
+    <string name="handle_time_custom_time_range">自定义时间范围</string>
 
 </resources>

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

@@ -507,5 +507,8 @@
     <string name="close">关闭</string>
     <string name="handle_failed">处理失败</string>
     <string name="handle_time">处理时间:</string>
+    <string name="handle_time_last_7_days">最近7天</string>
+    <string name="handle_time_last_30_days">最近30天</string>
+    <string name="handle_time_custom_time_range">自定义时间范围</string>
 
 </resources>