package com.xw.yunwei.ui.task import android.app.Application import android.view.View import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.xw.common.base.BaseViewModel import com.xw.common.utils.LogUtils import com.xw.yunwei.R import com.xw.yunwei.databinding.ItemArrow2TextBinding import com.xw.yunwei.model.TaskStatisticInfo import com.xw.yunwei.net.TaskRepository import com.xw.yunwei.ui.task.list.TaskListFragment import org.koin.core.component.inject /** * 任务中心 ViewModel * * 管理任务筛选条件、任务列表 Fragment 实例、未读消息数量等业务数据, * 提供筛选参数转换及网络请求能力。 * * @author zmc */ class TaskVM(myApplication: Application) : BaseViewModel(myApplication) { companion object { /** 全局标识:是否需要刷新消息红点 */ val needRefresh = MutableLiveData(true) } /** 全部任务列表 Fragment */ val allTaskFragment by lazy { TaskListFragment.newInstance(null) } /** 待到达任务列表 Fragment */ val togoTaskFragment by lazy { TaskListFragment.newInstance(0) } /** 待处理任务列表 Fragment */ val todoTaskFragment by lazy { TaskListFragment.newInstance(1) } /** 已处理任务列表 Fragment */ val finishTaskFragment by lazy { TaskListFragment.newInstance(2) } val reassignmentTaskFragment by lazy { TaskListFragment.newInstance(4) } /** 任务数据仓库 */ val taskRepository: TaskRepository by inject() //选中任务类型下标 val selectTaskTypeIndex = MutableLiveData(0) //统计信息 val taskStatistic = MutableLiveData() /** 当前定位信息 */ var location: AMapLocation? = null /** 车牌号搜索关键字 */ // 车牌号 val plateNumber: MutableLiveData = MutableLiveData("") /** 筛选开始时间(yyyy-MM-dd) */ var startTime = "" /** 筛选结束时间(yyyy-MM-dd) */ var endTime = "" /** 派发时间筛选项 */ val filterTaskTime = listOf("今天", "昨天", "近一周", "近一月") /** 优先级筛选项 */ val filterTaskLevel = listOf("全部", "一级", "二级", "三级") /** 任务类型筛选项 */ val filterTaskType = listOf("全部", "事故", "常规") /** 排序优先筛选项 */ val filterTaskSort = listOf("任务优先级", "车牌号", "任务时间") /** 当前选中的派发时间 */ var selectTaskTime = filterTaskTime[2] /** 当前选中的优先级 */ var selectTaskLevel = filterTaskLevel[0] /** 当前选中的任务类型 */ var selectTaskType = filterTaskType[0] /** 当前选中的排序字段 */ var selectTaskSort = filterTaskSort[0] /** 排序规则:1 正序,2 倒序 */ var taskSort = 1 /** 排序视图绑定列表,用于动态更新 UI 状态 */ val sortViews = mutableListOf() //是否刷新列表 val needRefreshList = MutableLiveData(false) //是否已经筛选 fun hadFilter(): Boolean { return selectTaskTime != filterTaskTime[2] || selectTaskLevel != filterTaskLevel[0] || selectTaskType != filterTaskType[0] || selectTaskSort != filterTaskSort[0] || taskSort != 1 || startTime.isNotEmpty() || endTime.isNotEmpty() } /** * 获取派发类型对应的服务器参数 * * 若用户自定义了时间范围则返回 5;否则根据快捷选项返回对应编码。 * * @return 派发类型编码,null 表示未选择 */ fun getDistributeType(): Int? = when { startTime.isNotEmpty() || endTime.isNotEmpty() -> 5 selectTaskTime == "今天" -> 1 selectTaskTime == "昨天" -> 2 selectTaskTime == "近一周" -> 3 selectTaskTime == "近一月" -> 4 else -> null } /** * 获取紧急程度对应的服务器参数 * * @return 紧急程度编码,null 表示全部 */ fun getUrgencyLevel(): Int? = when (selectTaskLevel) { "一级" -> 0 "二级" -> 1 "三级" -> 2 else -> null } /** * 获取任务类别对应的服务器参数 * * @return 任务类别编码,null 表示全部 */ fun getTaskCategory(): Int? = when (selectTaskType) { "事故" -> 2 "常规" -> 1 else -> null } /** * 获取排序类型对应的服务器参数 * * @return 排序类型编码,null 表示未选择 */ fun getSortType(): Int? = when (selectTaskSort) { "任务优先级" -> 1 "车牌号" -> 2 "任务时间" -> 3 else -> null } /** * 获取未读消息数量 * * @param block 请求结果回调,参数为未读数量字符串 */ fun getUnreadCount(block: (String) -> Unit) { launchRequest(showLoading = false) { taskRepository.getUnreadCount().let { runOnMainThread { block(it ?: "") } } } } //更改任务类型 fun changeTaskType(index: Int) { selectTaskType = filterTaskType[index] selectTaskTypeIndex.postValue(index) } val onClick = View.OnClickListener { when (it.id) { R.id.back -> onBackPressed() R.id.rl_all -> { changeTaskType(0) statistic() needRefreshList.postValue(true) } R.id.rl_accident -> { changeTaskType(1) statistic() needRefreshList.postValue(true) } R.id.rl_normal -> { changeTaskType(2) statistic() needRefreshList.postValue(true) } } } //获取统计信息 fun statistic() { launchRequest(error = { code, msg -> LogUtils.e(TAG, "launchRequest: code = $code msg = $msg") }) { taskRepository.statistic( getDistributeType()?.toString(), startTime, endTime, getTaskCategory()?.toString(), getUrgencyLevel()?.toString(), plateNumber.value )?.also { taskStatistic.postValue(it) } } } }