Parcourir la source

1. 发布作业页面开发完成
2. 流程节点编辑,表单内容显示异常的问题修复

bjb il y a 4 mois
Parent
commit
c3132d6428

+ 1 - 1
.idea/deploymentTargetSelector.xml

@@ -4,7 +4,7 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2025-12-30T07:14:50.054898300Z">
+        <DropdownSelection timestamp="2026-01-04T03:19:43.493054700Z">
           <Target type="DEFAULT_BOOT">
             <handle>
               <DeviceId pluginId="PhysicalDevice" identifier="serial=d8d12db95670c08" />

+ 77 - 26
app/src/main/java/com/iscs/bozzys/api/ApiBean.kt

@@ -137,9 +137,10 @@ data class Node(
     val createTime: Long = 0L,
     val approvalStatus: String = "",
     val approvalOpinion: String = "",
-    val isolationType: String? = null,
-    val isolationPoints: String? = null,
-    val nodeUserList: List<User>? = null,
+    val isolationType: String? = null,      // 隔离类型
+    val isolationPoints: String? = null,    // 解除隔离的点位
+    val isolationNodeUuid: String? = null,  // 解除隔离关联的节点uuid
+    val nodeUserList: List<User>? = null,   // 隔离和解除隔离关联的上锁人和共锁人
 ) {
 
     /**
@@ -164,21 +165,19 @@ data class Node(
      *
      * @param forms 表单数据
      */
-    fun buildSubmitParams(forms: List<FormField>, workFormList: List<TaskFormInfo>): MutableMap<String, Any> {
+    fun buildSubmitParams(forms: List<FormField>, workFormList: List<TaskFormInfo>): MutableMap<String, Any?> {
         val nodeName = forms.find { it.name == "nodeName" }?.value?.getOrNull(0) ?: ""
-        val params = mutableMapOf<String, Any>("nodeId" to id, "nodeName" to nodeName)
+        val params = mutableMapOf<String, Any?>("nodeId" to id, "nodeName" to nodeName)
         if (type != "createJob") {
             val workerUserId = forms.find { it.name == "workerUserId" }?.value?.getOrNull(0) ?: "0"
             val formId = forms.find { it.name == "formId" }?.value?.getOrNull(0) ?: "0"
             val findWork = workFormList.find { it.id == formId.toInt() }
-            val formData = if (findWork != null) {
-                Json.encodeToString(formData)
-            } else null
+            val formData = if (findWork != null) Json.encodeToString(findWork) else null
             params["workerUserId"] = workerUserId.toInt()
             params["formId"] = formId.toInt()
-            if (formData != null) params["formData"] = formData
+            params["formData"] = formData
             // 处理隔离点信息表单
-            if (type == "isolation") {
+            if (listOf("isolation", "releaseIsolation").contains(type)) {
                 val isolationType = forms.find { it.name == "isolationType" }?.value?.getOrNull(0) ?: "-1"
                 val isolationPoints = forms.find { it.name == "isolationPoints" }?.value ?: emptyList()
                 if (isolationType == "1") {
@@ -208,19 +207,43 @@ data class Node(
      *
      * @param forms
      */
-    fun updateNodeInfo(forms: List<FormField>): Node {
+    fun updateNodeInfo(forms: List<FormField>, nodes: List<NodeUI>): Node {
         val nodeName = forms.find { it.name == "nodeName" }?.value?.getOrNull(0) ?: ""
         if (type != "createJob") {
-            // 解析负责人
-            val workerUserId = forms.find { it.name == "workerUserId" }?.value?.getOrNull(0) ?: "0"
             // 解析关联表单
-            val formId = forms.find { it.name == "formId" }?.value?.getOrNull(0) ?: "0"
+            val formId = forms.find { it.name == "formId" }?.value?.getOrNull(0) ?: "-1"
             // 解析表单数据
-            val formData = forms.find { it.name == "formData" }?.value?.getOrNull(0) ?: ""
+            val formData = forms.find { it.name == "formData" }?.value?.getOrNull(0)
+            // 解析负责人
+            var workerUserId = forms.find { it.name == "workerUserId" }?.value?.getOrNull(0) ?: "0"
             // 解析隔离方式
-            val isolationType = forms.find { it.name == "isolationType" }?.value?.getOrNull(0)
-            // 解析节点
-            val isolationPoints = forms.find { it.name == "isolationPoints" }?.value ?: emptyList()
+            var isolationType = forms.find { it.name == "isolationType" }?.value?.getOrNull(0)
+            // 解析点位
+            var isolationPoints = forms.find { it.name == "isolationPoints" }?.value ?: emptyList()
+            // 解析上锁人
+            val locker = forms.find { it.name == "locker" }?.value?.getOrNull(0) ?: "-1"
+            // 解析共锁人
+            val group = forms.find { it.name == "group" }?.value ?: emptyList()
+            // 构建上锁人和共锁人列表
+            val userList = mutableListOf<User>()
+            if (locker.toInt() > 0) userList += User(userId = locker.toInt(), type = "jtlocker")
+            if (group.isNotEmpty()) group.forEach { userList += User(userId = it.toInt(), type = "jtcolocker") }
+            // 解析隔离节点
+            val isolationNode = forms.find { it.name == "isolationNode" }?.value?.getOrNull(0)
+            // 如果是解除隔离操作,隔离方式、隔离点位、负责人(或者上锁人、解锁人)需要从选中的点位中获取
+            if (type == "releaseIsolation") {
+                nodes.find { it.node?.uuid == isolationNode }?.node?.let {
+                    // 从节点中将数据copy到当前节点
+                    workerUserId = "${it.workerUserId}"
+                    isolationType = it.isolationType
+                    isolationPoints = if (it.isolationPoints.isNullOrEmpty()) {
+                        emptyList()
+                    } else {
+                        it.isolationPoints.replace("[", "").replace("]", "").split(",")
+                    }
+                    userList.addAll(it.nodeUserList ?: emptyList())
+                }
+            }
 
             return Node(
                 id = id,
@@ -239,7 +262,9 @@ data class Node(
                     prefix = "[",
                     postfix = "]",
                     separator = ","
-                )
+                ),
+                isolationNodeUuid = isolationNode,
+                nodeUserList = if (userList.isEmpty()) null else userList
             )
         }
         return Node(
@@ -272,6 +297,7 @@ data class Node(
         workFormList: List<TaskFormInfo>,
         isolationMethodList: List<Dict>,
         isolationList: List<IsolationPoint>,
+        nodes: List<NodeUI> = listOf(),
         isLocker: Boolean = false,
     ): List<FormField> {
         Log.d("NodeOption", "buildFormList -> $this")
@@ -311,7 +337,7 @@ data class Node(
             name = "formId",
             true,
             placeholder = listOf("请选择业务表单"),
-            options = workFormList.map { FormOption(it.name?:"", it.id.toString()) },
+            options = workFormList.map { FormOption(it.name ?: "", it.id.toString()) },
             value = if (formId > 0) listOf(formId.toString()) else listOf()
         )
         // 隔离配置
@@ -322,6 +348,26 @@ data class Node(
             val formField = list.find { it.name == "formId" }?.copy(required = false)
             list.removeIf { it.name == "formId" }
             formField?.let { list.add(it) }
+            val isolations = nodes.map { it.node }.filter { it != null && it.type == "isolation" }
+            var enabled = true
+            var isLockerTemp = isLocker
+            // 如果是解除隔离操作,这里只能选择当前流程中已经存在的隔离点位
+            if (type == "releaseIsolation") {
+                enabled = false
+                // 增加隔离点选择列表
+                list += FormField(
+                    id.toString(),
+                    type = "select",
+                    label = "选择隔离节点",
+                    name = "isolationNode",
+                    required = true,
+                    placeholder = listOf("请选择隔离节点"),
+                    options = isolations.map { FormOption(it?.nodeName ?: "", value = it?.uuid ?: "") },
+                    value = if (isolationNodeUuid.isNullOrEmpty()) listOf() else listOf(isolationNodeUuid)
+                )
+                // 如果是解除隔离的操作,这里需要先校验选择的节点是否是拆除
+                isLockerTemp = isolationType == "1"
+            }
             // 抽取隔离方式value值
             val valueOfIsolationType = if (isolationType.isNullOrEmpty()) {
                 listOf()
@@ -337,7 +383,8 @@ data class Node(
                 true,
                 placeholder = listOf("请选择隔离方式"),
                 options = isolationMethodList.map { FormOption(it.label, it.value) },
-                value = valueOfIsolationType
+                value = valueOfIsolationType,
+                enabled = enabled
             )
             // 抽取隔离点位value值
             val points = if (isolationPoints.isNullOrEmpty()) "" else isolationPoints.replace("[", "").replace("]", "")
@@ -366,9 +413,10 @@ data class Node(
                 listOf("请选择隔离点"),
                 multiSelect = true,
                 options = isolationList.map { FormOption(it.pointName, it.id.toString()) },
-                value = valueOfIsolationPoints
+                value = valueOfIsolationPoints,
+                enabled = enabled
             )
-            if (isLocker) {
+            if (isLockerTemp) {
                 val locker = nodeUserList?.find { it.type == "jtlocker" }
                 val group = nodeUserList?.filter { it.type == "jtcolocker" } ?: emptyList()
                 // 上锁人
@@ -380,7 +428,8 @@ data class Node(
                     true,
                     placeholder = listOf("请选择上锁人"),
                     options = lockerUserList.map { FormOption(it.nickname, it.id.toString()) },
-                    value = if (locker != null) listOf(locker.userId.toString()) else listOf()
+                    value = if (locker != null) listOf(locker.userId.toString()) else listOf(),
+                    enabled = enabled
                 )
                 // 共锁人
                 list += FormField(
@@ -392,7 +441,8 @@ data class Node(
                     placeholder = listOf("请选择共锁人"),
                     options = groupUserList.map { FormOption(it.nickname, it.id.toString()) },
                     value = if (group.isNotEmpty()) group.map { it.userId.toString() } else listOf(),
-                    multiSelect = true
+                    multiSelect = true,
+                    enabled = enabled
                 )
             } else {
                 // 负责人
@@ -404,7 +454,8 @@ data class Node(
                     true,
                     placeholder = listOf("请选择负责人"),
                     options = workerUserList.map { FormOption(it.nickname, it.id.toString()) },
-                    value = if (workerUserId > 0) listOf(workerUserId.toString()) else listOf()
+                    value = if (workerUserId > 0) listOf(workerUserId.toString()) else listOf(),
+                    enabled = enabled
                 )
             }
         }

+ 1 - 1
app/src/main/java/com/iscs/bozzys/api/ApiRequest.kt

@@ -228,7 +228,7 @@ object ApiRequest {
      *
      * @param params
      */
-    suspend fun updateJobNodeInfo(params: MutableMap<String, Any>): Result<Response<Boolean>> {
+    suspend fun updateJobNodeInfo(params: MutableMap<String, Any?>): Result<Response<Boolean>> {
         return requestApi { api.updateJobNodeInfo(params) }
     }
 

+ 1 - 1
app/src/main/java/com/iscs/bozzys/api/ApiService.kt

@@ -159,7 +159,7 @@ interface ApiService {
     @Headers("Content-Type: application/json")
     @PUT("/admin-api/iscs/workflow-work-node/updateWorkflowWorkNode")
     suspend fun updateJobNodeInfo(
-        @Body body: MutableMap<String, Any>,
+        @Body body: MutableMap<String, Any?>,
         @HeaderMap headers: Map<String, String> = ApiRequest.getUserHeaders()
     ): Response<Boolean>
 

+ 7 - 5
app/src/main/java/com/iscs/bozzys/ui/pages/compose/FormCompose.kt

@@ -116,7 +116,8 @@ fun FormContainer(forms: List<FormField>, onValueChange: (FormField) -> Unit, mo
                             onValueChange(form)
                         },
                         required = form.required,
-                        enable = form.enabled && enabled
+                        enable = form.enabled && enabled,
+                        placeholder = form.placeholder
                     )
                     // 起止日期选择
                     "daterange" -> FormDateRangeSelect(
@@ -616,13 +617,12 @@ fun FormDateSelect(
     label: String,
     value: List<String>,
     onSelectChange: (List<String>) -> Unit,
+    placeholder: List<String> = listOf(),
     required: Boolean = false,
     enable: Boolean = true
 ) {
     var date by remember {
-        mutableStateOf(
-            (value.getOrNull(0) ?: "").dateToTimestamp("yyyy/MM/dd HH:mm:ss")
-        )
+        mutableStateOf((value.getOrNull(0) ?: "").dateToTimestamp("yyyy/MM/dd HH:mm:ss"))
     }
     val picker = CardDatePickerDialog.builder(LocalContext.current)
         .setTitle("请选择日期")
@@ -671,7 +671,9 @@ fun FormDateSelect(
         }
 
         Text(
-            date.format("yyyy/MM/dd HH:mm"),
+            if (date <= 0) {
+                if (placeholder.getOrNull(0).isNullOrEmpty()) "请选择$label" else placeholder.getOrNull(0) ?: ""
+            } else date.format("yyyy/MM/dd HH:mm"),
             modifier = Modifier
                 .fillMaxWidth()
                 .height(46.dp)

+ 35 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/create/job/PagePushJob.kt

@@ -14,14 +14,21 @@ import androidx.compose.material3.Button
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.lifecycle.viewmodel.compose.viewModel
+import com.iscs.bozzys.api.FormOption
 import com.iscs.bozzys.ui.common.PageBase
 import com.iscs.bozzys.ui.common.Title
+import com.iscs.bozzys.ui.pages.compose.CardContainer
+import com.iscs.bozzys.ui.pages.compose.FormDateSelect
+import com.iscs.bozzys.ui.pages.compose.FormRadio
 import com.iscs.bozzys.ui.pages.vm.VMPushJob
+import com.iscs.bozzys.ui.theme.Text
 
 /**
  * 打开发布作业
@@ -41,12 +48,39 @@ class PagePushJob : PageBase() {
     override fun GetViews(pv: PaddingValues) {
         val vm: VMPushJob = viewModel()
         val id = intent.getIntExtra("id", 0)
+        val state by vm.state.collectAsState()
         LaunchedEffect(Unit) {
             vm.toast.showToast()
             vm.loading.showLoading()
         }
         Column(Modifier.fillMaxSize()) {
             Title(pv, "发布作业")
+            CardContainer(modifier = Modifier.padding(16.dp)) {
+                Column(
+                    modifier = Modifier
+                        .fillMaxWidth()
+                        .padding(10.dp)
+                ) {
+                    Text("发布作业设置", fontSize = 16.sp, color = Text, fontWeight = FontWeight.Bold)
+                    Text("请配置作业的执行时间并最终发布", fontSize = 14.sp, color = Text)
+                    FormRadio(
+                        label = "发布方式",
+                        value = listOf("0"),
+                        options = listOf(FormOption("立即发布", "0"), FormOption("定时发布", "1")),
+                        onSelectChange = {
+                            vm.updatePushType(it.getOrNull(0) ?: "0")
+                        },
+                        required = true
+                    )
+                    if (state.pushType == "1") FormDateSelect(
+                        label = "发布时间",
+                        value = listOf(),
+                        onSelectChange = {},
+                        required = true,
+                        placeholder = listOf("请选择发布时间")
+                    )
+                }
+            }
             Spacer(modifier = Modifier.weight(1f))
             Button(
                 onClick = {
@@ -55,7 +89,7 @@ class PagePushJob : PageBase() {
                     }
                 }, modifier = Modifier
                     .padding(horizontal = 16.dp)
-                    .padding(bottom = 10.dp)
+                    .padding(bottom = pv.calculateBottomPadding() + 10.dp)
                     .fillMaxWidth()
                     .height(46.dp),
                 shape = RoundedCornerShape(6.dp)

+ 3 - 2
app/src/main/java/com/iscs/bozzys/ui/pages/home/JobsCompose.kt

@@ -51,6 +51,7 @@ import com.iscs.bozzys.ui.common.Empty
 import com.iscs.bozzys.ui.pages.compose.JobListItem
 import com.iscs.bozzys.ui.pages.create.job.openPageCreateJob
 import com.iscs.bozzys.ui.pages.create.job.openPagePushJob
+import com.iscs.bozzys.ui.pages.edit.step.openPageEditStep
 import com.iscs.bozzys.ui.pages.vm.StatePage
 import com.iscs.bozzys.ui.pages.vm.VMHome
 import com.iscs.bozzys.ui.theme.Main
@@ -113,9 +114,9 @@ private fun TopToolBar(pv: PaddingValues, vm: VMHome) {
                             // ctx.openPageSelectJobType()
                             ctx.openPageCreateJob()
                             // 测试流程模板编辑数据
-                            // ctx.openPageEditStep(34)
+                            // ctx.openPageEditStep(69)
                             // 测试发布作业
-                            ctx.openPagePushJob(66)
+                            // ctx.openPagePushJob(71)
                         })
                         .padding(6.dp),
                     tint = Color.White

+ 1 - 0
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMDetailTask.kt

@@ -50,6 +50,7 @@ class VMDetailTask : VMBase() {
                     toast.emit("任务数据异常")
                     return@launch
                 }
+                // 兼容它端返回的异样数据格式
                 if (!taskInfo.formData.isNullOrEmpty()) {
                     val json = Json { ignoreUnknownKeys = true }
                     formInfo = json.decodeFromString<TaskFormInfo>(taskInfo.formData.ifEmpty { "{}" })

+ 21 - 31
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMEditStep.kt

@@ -158,6 +158,7 @@ class VMEditStep : VMBase() {
                 workFormList,
                 isolationMethodList,
                 isolationList,
+                _state.value.nodes.map { it.value },
                 isLocker = isLocker
             ) ?: emptyList()
         )
@@ -177,41 +178,28 @@ class VMEditStep : VMBase() {
      */
     fun onNodeFormChanged(form: FormField) {
         // 更新表单数据到节点对象中
-        val node = _state.value.node.value.node?.updateNodeInfo(_state.value.nodeForms) ?: return
+        val node = _state.value.node.value.node?.updateNodeInfo(_state.value.nodeForms, _state.value.nodes.map { it.value }) ?: return
         // 更新当前选中的节点和更新nodes列表中的数据
         _state.value = _state.value.copy(node = mutableStateOf(_state.value.node.value.copy(node = node)))
         _state.value.nodes[node.id.toString()] = _state.value.node.value.copy(node = node)
-        // 如果是隔离方式变化
-        if (form.name == "isolationType") {
+        // 如果是隔离方式/隔离节点选择变化
+        if (listOf("isolationType", "isolationNode").contains(form.name)) {
             val value = form.value.getOrNull(0) ?: "-1"
             val nodeUI = _state.value.node.value
-            if (value == "1") {
-                // 上锁人,这里要变换表单数据
-                _state.value = _state.value.copy(
-                    nodeForms = nodeUI.node?.buildFormList(
-                        workerUserList,
-                        lockerUserList,
-                        groupUserList,
-                        workFormList,
-                        isolationMethodList,
-                        isolationList,
-                        isLocker = true
-                    ) ?: emptyList()
-                )
-            } else {
-                // 盲板和拆除
-                _state.value = _state.value.copy(
-                    nodeForms = nodeUI.node?.buildFormList(
-                        workerUserList,
-                        lockerUserList,
-                        groupUserList,
-                        workFormList,
-                        isolationMethodList,
-                        isolationList,
-                        isLocker = false
-                    ) ?: emptyList()
-                )
-            }
+            // 是否上锁人
+            val isLocker = if (form.name == "isolationType") value == "1" else false
+            _state.value = _state.value.copy(
+                nodeForms = nodeUI.node?.buildFormList(
+                    workerUserList,
+                    lockerUserList,
+                    groupUserList,
+                    workFormList,
+                    isolationMethodList,
+                    isolationList,
+                    _state.value.nodes.map { it.value },
+                    isLocker = isLocker
+                ) ?: emptyList()
+            )
         }
     }
 
@@ -233,7 +221,8 @@ class VMEditStep : VMBase() {
                 // 增加视觉停留效果
                 delay(500)
                 // 更新当前编辑的节点
-                _state.value.nodes[node.id.toString()] = _state.value.node.value.copy(node = node.updateNodeInfo(forms))
+                _state.value.nodes[node.id.toString()] =
+                    _state.value.node.value.copy(node = node.updateNodeInfo(forms, _state.value.nodes.map { it.value }))
                 // 关闭Dialog
                 loading.emit(StateLoading())
                 _state.value = _state.value.copy(showFormDialog = false)
@@ -266,6 +255,7 @@ class VMEditStep : VMBase() {
                         workFormList,
                         isolationMethodList,
                         isolationList,
+                        _state.value.nodes.map { it.value },
                         isLocker = node.isolationType == "1"
                     )
                 )

+ 66 - 34
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMHome.kt

@@ -116,7 +116,9 @@ class VMHome : VMBase() {
                 return@launch
             }
             // 查询进行中的作业
-            val jobRsp = ApiRequest.getJobs(hashMapOf("pageNo" to 1, "pageSize" to 1, "status" to "running")).getOrElse { it.getResponse() }
+            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)
@@ -125,8 +127,11 @@ class VMHome : VMBase() {
                 return@launch
             }
             // 查询待审核的任务
-            val tasksRsp =
-                ApiRequest.getTasks(hashMapOf("pageNo" to 1, "pageSize" to 3, "approvalStatus" to "running")).getOrElse { it.getResponse() }
+            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)
                 delay(500)
@@ -148,7 +153,7 @@ class VMHome : VMBase() {
             // 更新进行中的任务数字
             updateUnReadCount(1, jobRsp.data?.total ?: 0)
             // 更新任务数字
-            updateUnReadCount(2, tasks.size)
+            updateUnReadCount(2, statisticsRsp.data?.inProgressCount ?: 0)
             delay(500)
             loading.emit(StateLoading())
             // 去加载作业和任务数据
@@ -164,20 +169,31 @@ class VMHome : VMBase() {
         if (_state.value.taskPage.isRefresh) return
         viewModelScope.launch {
             // 下拉即刷新
-            _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, "key" to page.keywords))
-                .onSuccess {
-                    if (page.page == 1) _state.value.taskList.clear()
-                    val tasks = it.data?.list ?: emptyList()
-                    _state.value.taskList.addAll(tasks)
-                    delay(1000)
-                    // 存储页面数据
-                    _state.value = _state.value.copy(taskPage = page.copy(isRefresh = false))
-                }.onFailure {
-                    delay(1000)
-                    _state.value = _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = false))
-                    toast.emit(it.getResponse<PageRsp<Task>>().msg)
-                }
+            _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,
+                    "key" to page.keywords
+                )
+            ).onSuccess {
+                if (page.page == 1) _state.value.taskList.clear()
+                val tasks = it.data?.list ?: emptyList()
+                _state.value.taskList.addAll(tasks)
+                delay(1000)
+                // 存储页面数据
+                _state.value = _state.value.copy(taskPage = page.copy(isRefresh = false))
+            }.onFailure {
+                delay(1000)
+                _state.value =
+                    _state.value.copy(taskPage = _state.value.taskPage.copy(isRefresh = false))
+                toast.emit(it.getResponse<PageRsp<Task>>().msg)
+            }
         }
     }
 
@@ -189,20 +205,31 @@ class VMHome : VMBase() {
         if (_state.value.jobPage.isRefresh) return
         viewModelScope.launch {
             // 下拉即刷新
-            _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, "name" to page.keywords))
-                .onSuccess {
-                    if (page.page == 1) _state.value.jobList.clear()
-                    val tasks = it.data?.list ?: emptyList()
-                    _state.value.jobList.addAll(tasks)
-                    // 存储页面数据
-                    delay(1000)
-                    _state.value = _state.value.copy(jobPage = page)
-                }.onFailure {
-                    delay(1000)
-                    _state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = false))
-                    toast.emit(it.getResponse<PageRsp<Job>>().msg)
-                }
+            _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,
+                    "name" to page.keywords
+                )
+            ).onSuccess {
+                if (page.page == 1) _state.value.jobList.clear()
+                val tasks = it.data?.list ?: emptyList()
+                _state.value.jobList.addAll(tasks)
+                // 存储页面数据
+                delay(1000)
+                _state.value = _state.value.copy(jobPage = page)
+            }.onFailure {
+                delay(1000)
+                _state.value =
+                    _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = false))
+                toast.emit(it.getResponse<PageRsp<Job>>().msg)
+            }
         }
     }
 
@@ -249,7 +276,6 @@ class VMHome : VMBase() {
 /**
  * @param navs              当前底部的导航列表
  * @param navigationId      当前选中的底部导航Id
- * @param username          用户名
  * @param isHomeTabRefresh  是否HomeTab页面刷新数据
  * @param homeTasks         首页进行中的任务
  * @param messageList       消息列表
@@ -306,4 +332,10 @@ data class NavBarItem(
  * @param keywords  关键字
  * @param isRefresh 是否正在刷新
  */
-data class StatePage(val page: Int = 1, val pageSize: Int = 10, val type: String = "", val keywords: String = "", val isRefresh: Boolean = false)
+data class StatePage(
+    val page: Int = 1,
+    val pageSize: Int = 10,
+    val type: String = "",
+    val keywords: String = "",
+    val isRefresh: Boolean = false
+)

+ 21 - 2
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMPushJob.kt

@@ -7,6 +7,8 @@ import com.iscs.bozzys.event.RefreshEvent
 import com.iscs.bozzys.event.RefreshEventBus
 import com.iscs.bozzys.ui.common.VMBase
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
 
 /**
@@ -14,13 +16,16 @@ import kotlinx.coroutines.launch
  */
 class VMPushJob : VMBase() {
 
+    private var _state = MutableStateFlow(StatePushJob())
+    val state = _state.asStateFlow()
+
     /**
      * 发布作业
      */
     fun onPush(id: Int, done: () -> Unit) {
         viewModelScope.launch {
             loading.emit(StateLoading(show = true))
-            ApiRequest.pushJob(mutableMapOf("startType" to "0", "workId" to id)).onSuccess {
+            ApiRequest.pushJob(mutableMapOf("startType" to _state.value.pushType, "workId" to id)).onSuccess {
                 delay(1000)
                 loading.emit(StateLoading())
                 toast.emit("发布成功")
@@ -35,4 +40,18 @@ class VMPushJob : VMBase() {
         }
     }
 
-}
+    /**
+     * 更新发布方式
+     */
+    fun updatePushType(pushType: String) {
+        _state.value = _state.value.copy(pushType = pushType)
+    }
+
+}
+
+/**
+ * 发布作业状态类
+ *
+ * @param pushType 发布方式 0-立即发布 1-定时发布
+ */
+data class StatePushJob(val pushType: String = "0")