Преглед изворни кода

1. 创建作业默认显示作业名称

bjb пре 1 месец
родитељ
комит
2e4b913d57

+ 2 - 2
app/src/main/java/com/iscs/bozzys/event/Event.kt

@@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.asSharedFlow
  */
 object AuthEventBus {
 
-    private val _events = MutableSharedFlow<AuthEvent>(extraBufferCapacity = 1)
+    private val _events = MutableSharedFlow<AuthEvent>(extraBufferCapacity = 5)
 
     val events = _events.asSharedFlow()
 
@@ -28,7 +28,7 @@ sealed class AuthEvent {
  * 刷新事件总线
  */
 object RefreshEventBus {
-    private val _events = MutableSharedFlow<RefreshEvent>(extraBufferCapacity = 1)
+    private val _events = MutableSharedFlow<RefreshEvent>(extraBufferCapacity = 5)
 
     val events = _events.asSharedFlow()
 

+ 1 - 1
app/src/main/java/com/iscs/bozzys/ui/dialog/ExceptReportDialog.kt

@@ -50,7 +50,7 @@ fun ExceptReportDialog(show: Boolean, mac: String, onConfirm: () -> Unit = {}, o
 
     // 表单基准数据
     val json = "[{\"id\":\"device_mac\",\"label\":\"异常设备\",\"value\":[\"$mac\"],\"type\":\"input\",\"placeholder\":[\"请输入异常的设备Mac\"],\"required\":true,\"enabled\":false},{\"id\":\"execpt_type\",\"label\":\"异常类别\",\"value\":[\"0\"],\"type\":\"select\",\"placeholder\":[\"请选择异常类别\"],\"required\":true,\"options\":[{\"label\":\"硬件故障\",\"value\":\"0\"},{\"label\":\"硬件丢失\",\"value\":\"1\"},{\"label\":\"作业取消\",\"value\":\"2\"},{\"label\":\"作业异常\",\"value\":\"3\"},{\"label\":\"其他异常\",\"value\":\"4\"}]},{\"id\":\"report_status\",\"label\":\"上报状态\",\"value\":[\"1\"],\"type\":\"radio\",\"placeholder\":[\"\"],\"required\":true,\"options\":[{\"label\":\"已上报\",\"value\":\"0\"},{\"label\":\"未上报\",\"value\":\"1\"}]},{\"id\":\"device_return\",\"label\":\"设备是否归还\",\"value\":[\"1\"],\"type\":\"radio\",\"placeholder\":[\"\"],\"required\":true,\"options\":[{\"label\":\"已归还\",\"value\":\"0\"},{\"label\":\"未归还\",\"value\":\"1\"}]},{\"id\":\"job_finish\",\"label\":\"作业任务是否完成\",\"value\":[\"1\"],\"type\":\"radio\",\"placeholder\":[\"\"],\"required\":true,\"options\":[{\"label\":\"已完成\",\"value\":\"0\"},{\"label\":\"未完成\",\"value\":\"1\"}]}]"
-    val forms = json.getFormListByJsonList(null)
+    val forms = json.getFormListByJsonList(null).toMutableList()
 
     LaunchedEffect(Unit) {
         ctx.setNavigationLight(false)

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

@@ -94,7 +94,7 @@ import kotlinx.serialization.json.Json
  * 表单容器,可以根据后台配置的表单格式进行解析各种表单
  */
 @Composable
-fun FormBox(forms: List<FormField>, onValueChange: (FormField) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true) {
+fun FormBox(forms: MutableList<FormField>, onValueChange: (FormField) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true) {
     Column(modifier = modifier) {
         forms.forEach { form ->
             key(form.id) {
@@ -233,7 +233,7 @@ fun FormInput(
     required: Boolean = false,
     enable: Boolean = true,
 ) {
-    var text by remember { mutableStateOf(value.getOrNull(0) ?: "") }
+    var text = value.getOrNull(0) ?: ""
     Column(
         Modifier
             .fillMaxWidth()
@@ -304,7 +304,7 @@ fun FormTextarea(
     required: Boolean = false,
     enable: Boolean = true,
 ) {
-    var text by remember { mutableStateOf(value.getOrNull(0) ?: "") }
+    var text = value.getOrNull(0) ?: ""
     Column(
         Modifier
             .fillMaxWidth()

+ 10 - 6
app/src/main/java/com/iscs/bozzys/ui/pages/create/job/PageCreateJob.kt

@@ -71,12 +71,16 @@ class PageCreateJob : PageBase() {
                     .verticalScroll(state = rememberScrollState())
             ) {
                 // 表单内容
-                if (state.forms.isNotEmpty()) CardBox(Modifier.padding(horizontal = 16.dp, vertical = 16.dp)) {
-                    FormBox(
-                        state.forms, { vm.onFormValueChanged(it) }, modifier = Modifier
-                            .padding(horizontal = 10.dp)
-                            .padding(top = 5.dp, bottom = 16.dp)
-                    )
+                if (state.forms.isNotEmpty()) {
+                    CardBox(Modifier.padding(horizontal = 16.dp, vertical = 16.dp)) {
+                        FormBox(
+                            state.forms,
+                            { vm.onFormValueChanged(it) },
+                            modifier = Modifier
+                                .padding(horizontal = 10.dp)
+                                .padding(top = 5.dp, bottom = 16.dp)
+                        )
+                    }
                 }
             }
             // 底部下一步按钮

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

@@ -91,7 +91,7 @@ fun HomeCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
         }) {
             Column(Modifier.fillMaxSize()) {
                 Box {
-                    TaskList(pv, vm)
+                    JobList(pv, vm)
                     TODO(vm)
                 }
             }
@@ -398,7 +398,7 @@ private fun TODO(vmHome: VMHome) {
  * 待办列表
  */
 @Composable
-private fun TaskList(pv: PaddingValues, vm: VMHome) {
+private fun JobList(pv: PaddingValues, vm: VMHome) {
     val ctx = LocalContext.current
     val state by vm.state.collectAsState()
     Column(

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

@@ -76,7 +76,7 @@ fun JobsCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
         ) {
             TopToolBar(pv, vm)
             FilterBar(vm)
-            TaskList(vm)
+            JobList(vm)
         }
     }
 }
@@ -319,7 +319,7 @@ private fun FilterBar(vm: VMHome) {
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-private fun TaskList(vm: VMHome) {
+private fun JobList(vm: VMHome) {
     val state by vm.state.collectAsState()
     // 监听顶部Item
     val listState = rememberLazyListState()
@@ -332,10 +332,14 @@ private fun TaskList(vm: VMHome) {
     // 监听列表是否滑动到底部
     val shouldLoadMore by remember {
         derivedStateOf {
-            val layoutInfo = listState.layoutInfo
-            val totalItems = layoutInfo.totalItemsCount
-            val lastVisibleItemIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
-            lastVisibleItemIndex >= totalItems - 2
+            try {
+                val layoutInfo = listState.layoutInfo
+                val totalItems = layoutInfo.totalItemsCount
+                val lastVisibleItemIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
+                lastVisibleItemIndex >= totalItems - 2
+            } catch (e: Exception) {
+                false
+            }
         }
     }
     // 处理加载更多数据

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

@@ -70,7 +70,7 @@ fun TasksCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
         ) {
             TopToolBar(pv, vm)
             FilterBar(vm)
-            TaskList(vm)
+            JobList(vm)
         }
     }
 }
@@ -261,7 +261,7 @@ private fun FilterBar(vm: VMHome) {
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-private fun TaskList(vm: VMHome) {
+private fun JobList(vm: VMHome) {
     val state by vm.state.collectAsState()
     // 监听顶部Item
     val listState = rememberLazyListState()

+ 19 - 16
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMCreateJob.kt

@@ -7,6 +7,7 @@ import com.iscs.bozzys.api.FormField
 import com.iscs.bozzys.api.FormOption
 import com.iscs.bozzys.ui.common.VMBase
 import com.iscs.bozzys.ui.pages.compose.getFormListByJsonList
+import com.iscs.bozzys.utils.DateUtil.format
 import com.iscs.bozzys.utils.LogUtil
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -37,28 +38,28 @@ class VMCreateJob : VMBase() {
         LogUtil.d("JobCreate", "创建时需要的表单 -> $json")
         viewModelScope.launch {
             val job = if (id > 0) ApiRequest.getJobById(id).getOrElse { it.getResponse() }.data else null
-            val forms = json.getFormListByJsonList(job)
+            val forms = json.getFormListByJsonList(job).toMutableList()
             _state.value = _state.value.copy(forms = forms)
             // 流程模板
             ApiRequest.getSopList(mutableMapOf("pageNo" to 1, "pageSize" to -1)).onSuccess {
                 val data = (it.data?.list ?: emptyList()).filter { sop -> sop.status == 1 }
                 val options = data.map { sop -> FormOption(sop.name, sop.id.toString()) }
                 val newForms = _state.value.forms.map { form -> if (form.id == "job_sop") form.copy(options = options) else form }
-                _state.value = _state.value.copy(forms = newForms)
+                _state.value = _state.value.copy(forms = newForms.toMutableList())
             }
             // 作业类型
             ApiRequest.getDictData(mutableMapOf("pageNo" to 1, "pageSize" to -1, "dictType" to "work_type")).onSuccess {
                 val data = it.data?.list ?: emptyList()
                 val options = data.map { dict -> FormOption(dict.label, dict.value) }
                 val newForms = _state.value.forms.map { form -> if (form.id == "job_type") form.copy(options = options) else form }
-                _state.value = _state.value.copy(forms = newForms)
+                _state.value = _state.value.copy(forms = newForms.toMutableList())
             }
             // 紧急程度
             ApiRequest.getDictData(mutableMapOf("pageNo" to 1, "pageSize" to -1, "dictType" to "urgency_level")).onSuccess {
                 val data = it.data?.list ?: emptyList()
                 val options = data.map { dict -> FormOption(dict.label, dict.value) }
                 val newForms = _state.value.forms.map { form -> if (form.id == "job_urgency_level") form.copy(options = options) else form }
-                _state.value = _state.value.copy(forms = newForms)
+                _state.value = _state.value.copy(forms = newForms.toMutableList())
             }
         }
     }
@@ -69,17 +70,19 @@ class VMCreateJob : VMBase() {
      * @param form  sop名称发生变化同步更新作业名称和作业内容
      */
     fun onFormValueChanged(form: FormField) {
-//        val value = form.options.find { it.value == form.value.getOrNull(0) }?.label
-//        if (form.id == "job_sop" && !value.isNullOrEmpty()) {
-//            val forms = _state.value.forms.map { f ->
-//                when (f.id) {
-//                    "job_name" -> f.copy(value = listOf(value))
-//                    "job_content" -> f.copy(value = listOf(value))
-//                    else -> f
-//                }
-//            }
-//            _state.value = _state.value.copy(forms = forms)
-//        }
+        val value = form.options.find { it.value == form.value.getOrNull(0) }?.label
+        if (form.id == "job_sop" && !value.isNullOrEmpty()) {
+            val forms = _state.value.forms.toMutableList()
+            _state.value = _state.value.copy(forms = mutableListOf())
+            val newForms = forms.map { f ->
+                when (f.id) {
+                    "job_name" -> f.copy(value = listOf("$value-${System.currentTimeMillis().format("MMddhhmm")}"))
+                    "job_content" -> f.copy(value = listOf(value))
+                    else -> f
+                }
+            }.toMutableList()
+            _state.value = _state.value.copy(forms = newForms)
+        }
     }
 
     /**
@@ -142,4 +145,4 @@ class VMCreateJob : VMBase() {
 /**
  * 表单数据
  */
-data class StateCreateJob(val forms: List<FormField> = listOf())
+data class StateCreateJob(val forms: MutableList<FormField> = mutableListOf())

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

@@ -60,7 +60,7 @@ class VMDetailTask : VMBase() {
                 }
                 // 盲板操作需要显示表单
                 if (listOf("0", "2").contains(taskInfo.isolationType)) {
-                    val forms = mbForms.getFormListByJsonList()
+                    val forms = mbForms.getFormListByJsonList().toMutableList()
                     forms.forEach { form ->
                         if (form.name == "attachments") {
                             val json = Json
@@ -81,14 +81,18 @@ class VMDetailTask : VMBase() {
                     if (!taskInfo.checkCanOptionByPhone()) {
                         formInfo = TaskFormInfo()
                     }
-                    _state.value = _state.value.copy(forms = formInfo.fields?.getFormListByJsonList() ?: emptyList(), node = taskInfo)
+                    _state.value =
+                        _state.value.copy(forms = (formInfo.fields?.getFormListByJsonList() ?: emptyList()).toMutableList(), node = taskInfo)
                     delay(500)
                     loading.emit(StateLoading())
                 } else {
                     ApiRequest.getTaskFormInfoByFormId(it.data?.formId ?: 0).onSuccess { formInfo ->
                         this@VMDetailTask.formInfo = formInfo.data ?: TaskFormInfo()
                         _state.value =
-                            _state.value.copy(forms = this@VMDetailTask.formInfo.fields?.getFormListByJsonList() ?: emptyList(), node = taskInfo)
+                            _state.value.copy(
+                                forms = (this@VMDetailTask.formInfo.fields?.getFormListByJsonList() ?: emptyList()).toMutableList(),
+                                node = taskInfo
+                            )
                         delay(500)
                         loading.emit(StateLoading())
                     }.onFailure { err ->
@@ -164,7 +168,7 @@ class VMDetailTask : VMBase() {
  * @param node      当前节点数据
  */
 data class StateDetailTask(
-    val forms: List<FormField> = listOf(),
-    val mbForms: List<FormField> = listOf(),
+    val forms: MutableList<FormField> = mutableListOf(),
+    val mbForms: MutableList<FormField> = mutableListOf(),
     val node: Node = Node()
 )

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

@@ -158,7 +158,7 @@ class VMEditStep : VMBase() {
         val isLocker = (nodeUI.node?.isolationType ?: "") == "1"
         _state.value = _state.value.copy(
             node = mutableStateOf(nodeUI),
-            nodeForms = nodeUI.node?.buildFormList(
+            nodeForms = (nodeUI.node?.buildFormList(
                 workerUserList,
                 lockerUserList,
                 groupUserList,
@@ -167,7 +167,7 @@ class VMEditStep : VMBase() {
                 isolationList,
                 _state.value.nodes.map { it.value },
                 isLocker = isLocker
-            ) ?: emptyList()
+            ) ?: emptyList()).toMutableList()
         )
     }
 
@@ -196,7 +196,7 @@ class VMEditStep : VMBase() {
             // 是否上锁人
             val isLocker = if (form.name == "isolationType") value == "1" else false
             _state.value = _state.value.copy(
-                nodeForms = nodeUI.node?.buildFormList(
+                nodeForms = (nodeUI.node?.buildFormList(
                     workerUserList,
                     lockerUserList,
                     groupUserList,
@@ -205,7 +205,7 @@ class VMEditStep : VMBase() {
                     isolationList,
                     _state.value.nodes.map { it.value },
                     isLocker = isLocker
-                ) ?: emptyList()
+                ) ?: emptyList()).toMutableList()
             )
         }
     }
@@ -304,7 +304,7 @@ data class StateEditStep(
     val enableEdit: Boolean = false,
     val nodes: SnapshotStateMap<String, NodeUI> = mutableStateMapOf(),
     val node: MutableState<NodeUI> = mutableStateOf(NodeUI("", Offset(0f, 0f))),
-    val nodeForms: List<FormField> = listOf(),
+    val nodeForms: MutableList<FormField> = mutableListOf(),
     val connections: List<Connection> = emptyList(),
     val showFormDialog: Boolean = false,
     val showTipsDialog: Boolean = false,

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

@@ -52,7 +52,7 @@ class VMHome : VMBase() {
     fun init() {
         initEvent()
         viewModelScope.launch {
-             _state.value = _state.value.copy(navs = listOf(TAB_HOME))
+            _state.value = _state.value.copy(navs = listOf(TAB_HOME))
             delay(500)
             refreshHome(true)
         }
@@ -198,7 +198,11 @@ class VMHome : VMBase() {
             loading.emit(StateLoading())
             delay(100)
             // 获取到用户信息后即刷新导航栏数据
-            val navs = if (permissionRsp.data?.roles.isAdmin()) { listOf(TAB_HOME, TAB_JOBS, TAB_TASKS, TAB_SETTINGS) } else { listOf(TAB_HOME, TAB_TASKS, TAB_SETTINGS) }
+            val navs = if (permissionRsp.data?.roles.isAdmin()) {
+                listOf(TAB_HOME, TAB_JOBS, TAB_TASKS, TAB_SETTINGS)
+            } else {
+                listOf(TAB_HOME, TAB_TASKS, TAB_SETTINGS)
+            }
             _state.value = _state.value.copy(
                 navs = navs,
                 homeTasks = ArrayList(tasksRsp.data?.list ?: emptyList()),
@@ -238,8 +242,10 @@ class VMHome : VMBase() {
                     _state.value.jobList.addAll(jobs)
                     // 存储页面数据
                     delay(1000)
-                    _state.value =
-                        _state.value.copy(jobPage = page.copy(isRefresh = false, noMore = (it.data?.total ?: 0) == newJobs.size))
+                    _state.value = _state.value.copy(
+                        jobPage = page.copy(isRefresh = false, noMore = (it.data?.total ?: 0) == newJobs.size),
+                        jobList = newJobs
+                    )
                 }.onFailure {
                     delay(1000)
                     _state.value = _state.value.copy(jobPage = _state.value.jobPage.copy(isRefresh = false))