|
@@ -5,12 +5,17 @@ import androidx.lifecycle.viewModelScope
|
|
|
import com.iscs.bozzys.R
|
|
import com.iscs.bozzys.R
|
|
|
import com.iscs.bozzys.api.ApiRequest
|
|
import com.iscs.bozzys.api.ApiRequest
|
|
|
import com.iscs.bozzys.api.ApiRequest.getResponse
|
|
import com.iscs.bozzys.api.ApiRequest.getResponse
|
|
|
|
|
+import com.iscs.bozzys.api.ApiRequest.isCodeOk
|
|
|
import com.iscs.bozzys.api.Job
|
|
import com.iscs.bozzys.api.Job
|
|
|
import com.iscs.bozzys.api.Message
|
|
import com.iscs.bozzys.api.Message
|
|
|
|
|
+import com.iscs.bozzys.api.PageRsp
|
|
|
import com.iscs.bozzys.api.Task
|
|
import com.iscs.bozzys.api.Task
|
|
|
-import com.iscs.bozzys.ui.base.VMBase
|
|
|
|
|
|
|
+import com.iscs.bozzys.event.RefreshEvent
|
|
|
|
|
+import com.iscs.bozzys.event.RefreshEventBus
|
|
|
|
|
+import com.iscs.bozzys.ui.common.VMBase
|
|
|
import com.iscs.bozzys.ui.theme.Text
|
|
import com.iscs.bozzys.ui.theme.Text
|
|
|
import com.iscs.bozzys.utils.Storage
|
|
import com.iscs.bozzys.utils.Storage
|
|
|
|
|
+import kotlinx.coroutines.async
|
|
|
import kotlinx.coroutines.delay
|
|
import kotlinx.coroutines.delay
|
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
|
import kotlinx.coroutines.flow.asStateFlow
|
|
import kotlinx.coroutines.flow.asStateFlow
|
|
@@ -21,7 +26,11 @@ class VMHome : VMBase() {
|
|
|
private val _state = MutableStateFlow(StateHome())
|
|
private val _state = MutableStateFlow(StateHome())
|
|
|
val state = _state.asStateFlow()
|
|
val state = _state.asStateFlow()
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 页面初始化操作
|
|
|
|
|
+ */
|
|
|
fun init() {
|
|
fun init() {
|
|
|
|
|
+ initEvent()
|
|
|
viewModelScope.launch {
|
|
viewModelScope.launch {
|
|
|
val navs = listOf(
|
|
val navs = listOf(
|
|
|
NavBarItem(0, "首页", R.drawable.home),
|
|
NavBarItem(0, "首页", R.drawable.home),
|
|
@@ -32,90 +41,170 @@ class VMHome : VMBase() {
|
|
|
_state.value = _state.value.copy(navs = navs, username = Storage.readUserName())
|
|
_state.value = _state.value.copy(navs = navs, username = Storage.readUserName())
|
|
|
// 延时等待页面配置数据初步加载完成
|
|
// 延时等待页面配置数据初步加载完成
|
|
|
delay(500)
|
|
delay(500)
|
|
|
- getHomeTaskData(showLoading = true)
|
|
|
|
|
- // 获取作业列表
|
|
|
|
|
- getJobList(_state.value.jobPage)
|
|
|
|
|
- // 获取任务列表数据
|
|
|
|
|
- getTaskList(_state.value.taskPage)
|
|
|
|
|
|
|
+ refreshHome(true)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 初始化事件
|
|
|
|
|
+ */
|
|
|
|
|
+ private fun initEvent() {
|
|
|
|
|
+ viewModelScope.async {
|
|
|
|
|
+ RefreshEventBus.events.collect { event ->
|
|
|
|
|
+ when (event) {
|
|
|
|
|
+ is RefreshEvent.HomeData -> refreshHome()
|
|
|
|
|
+ else -> {}
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 更新底部选择的导航
|
|
|
|
|
+ */
|
|
|
fun navigationToId(id: Int) {
|
|
fun navigationToId(id: Int) {
|
|
|
val idx = _state.value.navs.indexOfFirst { it.id == id }
|
|
val idx = _state.value.navs.indexOfFirst { it.id == id }
|
|
|
_state.value = _state.value.copy(navigationId = idx)
|
|
_state.value = _state.value.copy(navigationId = idx)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- fun updateUnReadCount() {
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 更新未读消息
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param navId 导航id
|
|
|
|
|
+ * @param count 未读条数
|
|
|
|
|
+ */
|
|
|
|
|
+ fun updateUnReadCount(navId: Int, count: Int) {
|
|
|
// 更新未读消息数演示
|
|
// 更新未读消息数演示
|
|
|
- val navs = _state.value.navs.map { it.copy(count = 12) }
|
|
|
|
|
|
|
+ val navs = _state.value.navs.map { if (it.id == navId) it.copy(count = count) else it }
|
|
|
_state.value = _state.value.copy(navs = ArrayList(navs))
|
|
_state.value = _state.value.copy(navs = ArrayList(navs))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 刷新数据
|
|
|
|
|
+ */
|
|
|
fun onRefreshHomeTab() {
|
|
fun onRefreshHomeTab() {
|
|
|
_state.value = _state.value.copy(isHomeTabRefresh = true)
|
|
_state.value = _state.value.copy(isHomeTabRefresh = true)
|
|
|
// 下拉刷新,刷新数据
|
|
// 下拉刷新,刷新数据
|
|
|
- getHomeTaskData()
|
|
|
|
|
|
|
+ refreshHome()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 获取作业数据列表
|
|
|
|
|
|
|
+ * 获取首页数据
|
|
|
*/
|
|
*/
|
|
|
- fun getHomeTaskData(showLoading: Boolean = false) {
|
|
|
|
|
|
|
+ fun getHomeTaskData(showLoading: Boolean = false, done: () -> Unit = {}) {
|
|
|
viewModelScope.launch {
|
|
viewModelScope.launch {
|
|
|
loading.emit(StateLoading(show = showLoading))
|
|
loading.emit(StateLoading(show = showLoading))
|
|
|
- // pending 待处理
|
|
|
|
|
- // unaudited 未审核
|
|
|
|
|
- // approved 已审核
|
|
|
|
|
- // "approvalStatus" to "unaudited"
|
|
|
|
|
- ApiRequest.getTasks(hashMapOf("pageNo" to 1, "pageSize" to 3)).onSuccess {
|
|
|
|
|
- val list = it.data?.list ?: listOf()
|
|
|
|
|
- // 后面看需求是否需要限制
|
|
|
|
|
- // val maxLimitList = if (list.isEmpty()) list else list.subList(0, min(list.size, 3))
|
|
|
|
|
- _state.value = _state.value.copy(homeTasks = ArrayList(list), todoCountPending = it.data?.total ?: 0, isHomeTabRefresh = false)
|
|
|
|
|
|
|
+ // 查询顶部的任务个数
|
|
|
|
|
+ val statisticsRsp = ApiRequest.getTaskStatistics().getOrElse { it.getResponse() }
|
|
|
|
|
+ if (!statisticsRsp.code.isCodeOk()) {
|
|
|
|
|
+ _state.value = _state.value.copy(isHomeTabRefresh = false)
|
|
|
delay(500)
|
|
delay(500)
|
|
|
loading.emit(StateLoading())
|
|
loading.emit(StateLoading())
|
|
|
- }.onFailure {
|
|
|
|
|
|
|
+ toast.emit(statisticsRsp.msg)
|
|
|
|
|
+ return@launch
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查询进行中的作业
|
|
|
|
|
+ val jobRsp = ApiRequest.getJobs(hashMapOf("pageNo" to 1, "pageSize" to 1, "status" to "running")).getOrElse { it.getResponse() }
|
|
|
|
|
+ if (!jobRsp.code.isCodeOk()) {
|
|
|
|
|
+ _state.value = _state.value.copy(isHomeTabRefresh = false)
|
|
|
|
|
+ delay(500)
|
|
|
|
|
+ loading.emit(StateLoading())
|
|
|
|
|
+ toast.emit(jobRsp.msg)
|
|
|
|
|
+ return@launch
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查询待审核的任务
|
|
|
|
|
+ val tasksRsp =
|
|
|
|
|
+ ApiRequest.getTasks(hashMapOf("pageNo" to 1, "pageSize" to 3, "approvalStatus" to "running")).getOrElse { it.getResponse() }
|
|
|
|
|
+ if (!tasksRsp.code.isCodeOk()) {
|
|
|
_state.value = _state.value.copy(isHomeTabRefresh = false)
|
|
_state.value = _state.value.copy(isHomeTabRefresh = false)
|
|
|
delay(500)
|
|
delay(500)
|
|
|
loading.emit(StateLoading())
|
|
loading.emit(StateLoading())
|
|
|
- toast.emit(it.getResponse().msg)
|
|
|
|
|
|
|
+ toast.emit(statisticsRsp.msg)
|
|
|
|
|
+ return@launch
|
|
|
}
|
|
}
|
|
|
|
|
+ val tasks = tasksRsp.data?.list ?: emptyList()
|
|
|
|
|
+ // 后面看需求是否需要限制
|
|
|
|
|
+ // val maxLimitList = if (list.isEmpty()) list else list.subList(0, min(list.size, 3))
|
|
|
|
|
+ _state.value = _state.value.copy(
|
|
|
|
|
+ homeTasks = ArrayList(tasks),
|
|
|
|
|
+ todoCountRunning = statisticsRsp.data?.inProgressCount ?: 0,
|
|
|
|
|
+ todoCountFinish = statisticsRsp.data?.completedCount ?: 0,
|
|
|
|
|
+ isHomeTabRefresh = false
|
|
|
|
|
+ )
|
|
|
|
|
+ // 更新进行中的任务数字
|
|
|
|
|
+ updateUnReadCount(1, jobRsp.data?.total ?: 0)
|
|
|
|
|
+ // 更新任务数字
|
|
|
|
|
+ updateUnReadCount(2, tasks.size)
|
|
|
|
|
+ delay(500)
|
|
|
|
|
+ loading.emit(StateLoading())
|
|
|
|
|
+ // 去加载作业和任务数据
|
|
|
|
|
+ done()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 获取任务列表数据
|
|
|
|
|
|
|
+ * 获取任务列表数据,分页
|
|
|
*/
|
|
*/
|
|
|
fun getTaskList(page: StatePage) {
|
|
fun getTaskList(page: StatePage) {
|
|
|
|
|
+ // 正在刷新禁止重复进行
|
|
|
|
|
+ if (_state.value.taskPage.isRefresh) return
|
|
|
viewModelScope.launch {
|
|
viewModelScope.launch {
|
|
|
// 下拉即刷新
|
|
// 下拉即刷新
|
|
|
- _state.value = _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = true))
|
|
|
|
|
- ApiRequest.getTasks(hashMapOf("pageNo" to page.page, "pageSize" to page.pageSize)).onSuccess {
|
|
|
|
|
|
|
+ _state.value = _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = true, type = page.type))
|
|
|
|
|
+ ApiRequest.getTasks(hashMapOf("pageNo" to page.page, "pageSize" to page.pageSize, "approvalStatus" to page.type)).onSuccess {
|
|
|
if (page.page == 1) _state.value.taskList.clear()
|
|
if (page.page == 1) _state.value.taskList.clear()
|
|
|
val tasks = it.data?.list ?: emptyList()
|
|
val tasks = it.data?.list ?: emptyList()
|
|
|
_state.value.taskList.addAll(tasks)
|
|
_state.value.taskList.addAll(tasks)
|
|
|
|
|
+ delay(1000)
|
|
|
// 存储页面数据
|
|
// 存储页面数据
|
|
|
_state.value = _state.value.copy(taskPage = page)
|
|
_state.value = _state.value.copy(taskPage = page)
|
|
|
}.onFailure {
|
|
}.onFailure {
|
|
|
|
|
+ delay(1000)
|
|
|
_state.value = _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = false))
|
|
_state.value = _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = false))
|
|
|
- toast.emit(it.getResponse().msg)
|
|
|
|
|
|
|
+ toast.emit(it.getResponse<PageRsp<Task>>().msg)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取作业数据,分页
|
|
|
|
|
+ */
|
|
|
fun getJobList(page: StatePage) {
|
|
fun getJobList(page: StatePage) {
|
|
|
viewModelScope.launch {
|
|
viewModelScope.launch {
|
|
|
// 下拉即刷新
|
|
// 下拉即刷新
|
|
|
- _state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = true))
|
|
|
|
|
|
|
+ _state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = true, type = page.type))
|
|
|
ApiRequest.getJobs(hashMapOf("pageNo" to page.page, "pageSize" to page.pageSize, "status" to page.type)).onSuccess {
|
|
ApiRequest.getJobs(hashMapOf("pageNo" to page.page, "pageSize" to page.pageSize, "status" to page.type)).onSuccess {
|
|
|
if (page.page == 1) _state.value.jobList.clear()
|
|
if (page.page == 1) _state.value.jobList.clear()
|
|
|
val tasks = it.data?.list ?: emptyList()
|
|
val tasks = it.data?.list ?: emptyList()
|
|
|
_state.value.jobList.addAll(tasks)
|
|
_state.value.jobList.addAll(tasks)
|
|
|
// 存储页面数据
|
|
// 存储页面数据
|
|
|
|
|
+ delay(1000)
|
|
|
_state.value = _state.value.copy(jobPage = page)
|
|
_state.value = _state.value.copy(jobPage = page)
|
|
|
}.onFailure {
|
|
}.onFailure {
|
|
|
|
|
+ delay(1000)
|
|
|
_state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = false))
|
|
_state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = false))
|
|
|
- toast.emit(it.getResponse().msg)
|
|
|
|
|
|
|
+ toast.emit(it.getResponse<PageRsp<Job>>().msg)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 刷新首页全部数据
|
|
|
|
|
+ */
|
|
|
|
|
+ private fun refreshHome(showLoading: Boolean = false) {
|
|
|
|
|
+ viewModelScope.launch {
|
|
|
|
|
+ getHomeTaskData(showLoading = showLoading) {
|
|
|
|
|
+ val jobType = _state.value.jobPage.type.ifEmpty { "running" }
|
|
|
|
|
+ val taskType = _state.value.taskPage.type.ifEmpty { "running" }
|
|
|
|
|
+ // 刷新重置page
|
|
|
|
|
+ _state.value = _state.value.copy(
|
|
|
|
|
+ jobPage = _state.value.jobPage.copy(page = 1, type = jobType),
|
|
|
|
|
+ taskPage = _state.value.taskPage.copy(page = 1, type = taskType)
|
|
|
|
|
+ )
|
|
|
|
|
+ // 获取作业列表
|
|
|
|
|
+ getJobList(_state.value.jobPage)
|
|
|
|
|
+ // 获取任务列表数据
|
|
|
|
|
+ getTaskList(_state.value.taskPage)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -148,7 +237,6 @@ data class StateHome(
|
|
|
val taskList: MutableList<Task> = mutableListOf(),
|
|
val taskList: MutableList<Task> = mutableListOf(),
|
|
|
val jobPage: StatePage = StatePage(),
|
|
val jobPage: StatePage = StatePage(),
|
|
|
val jobList: MutableList<Job> = mutableListOf(),
|
|
val jobList: MutableList<Job> = mutableListOf(),
|
|
|
- val todoCountPending: Int = 0,
|
|
|
|
|
val todoCountRunning: Int = 0,
|
|
val todoCountRunning: Int = 0,
|
|
|
val todoCountFinish: Int = 0,
|
|
val todoCountFinish: Int = 0,
|
|
|
)
|
|
)
|
|
@@ -177,7 +265,7 @@ data class NavBarItem(
|
|
|
*
|
|
*
|
|
|
* @param page 当前页面
|
|
* @param page 当前页面
|
|
|
* @param pageSize 页面大小
|
|
* @param pageSize 页面大小
|
|
|
- * @param type 请求数据类型
|
|
|
|
|
|
|
+ * @param type 请求数据类型 unaudited 默认取进行中的
|
|
|
* @param isRefresh 是否正在刷新
|
|
* @param isRefresh 是否正在刷新
|
|
|
*/
|
|
*/
|
|
|
data class StatePage(val page: Int = 1, val pageSize: Int = 10, val type: String = "", val isRefresh: Boolean = false)
|
|
data class StatePage(val page: Int = 1, val pageSize: Int = 10, val type: String = "", val isRefresh: Boolean = false)
|