Jelajahi Sumber

盲板信息拆出单独字段

bjb 3 bulan lalu
induk
melakukan
ffa80ee9d4

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

@@ -39,6 +39,8 @@ data class Node(
     val messageTemplateCode: String? = null,    // 站内信息
     val emailTemplateCode: String? = null,      // 邮件通知
     val appTemplateCode: String? = null,        // app消息推送
+    val deviceNumber: String? = null,           // 设备序列号
+    val attachments: String? = null,            // 携带的数据
 ) {
 
     /**
@@ -510,4 +512,10 @@ data class NodeConnection(
     val sourceHandle: String,
     val targetHandle: String,
     val type: String
-)
+)
+
+/**
+ * 拆除盲板需要的字段
+ */
+@Serializable
+data class Attachment(val name: String = "", val url: String = "")

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

@@ -739,7 +739,7 @@ fun FormUpload(
                     .fillMaxSize()
                     .padding(horizontal = 10.dp)
                     .clip(RoundedCornerShape(6.dp))
-                    .clickable {
+                    .clickable(enabled = enable) {
                         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
                             if (ctx.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                                 permissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)

+ 30 - 0
app/src/main/java/com/iscs/bozzys/ui/pages/detail/task/PageDetailTask.kt

@@ -95,6 +95,8 @@ class PageDetailTask : PageBase() {
                     .padding(16.dp)
             ) {
                 TaskInfo(task)
+                // 盲板表单数据存在即显示
+                if (state.mbForms.isNotEmpty() && state.node.checkCanOptionByPhone()) MbForm(vm)
                 // 表单数据存在即显示
                 if (state.forms.isNotEmpty() && state.node.checkCanOptionByPhone()) TaskForm(vm)
                 // 处理不能在手机上操作的
@@ -257,6 +259,34 @@ class PageDetailTask : PageBase() {
         }
     }
 
+    /**
+     * 盲板表单
+     */
+    @Composable
+    fun MbForm(vm: VMDetailTask) {
+        val state by vm.state.collectAsState()
+        CardBox(Modifier.padding(top = 10.dp)) {
+            Column(
+                Modifier
+                    .fillMaxWidth()
+                    .padding(10.dp)
+            ) {
+                Row(verticalAlignment = Alignment.CenterVertically) {
+                    Icon(
+                        painterResource(R.drawable.jobs),
+                        contentDescription = null,
+                        modifier = Modifier
+                            .padding(end = 5.dp)
+                            .size(16.dp),
+                        tint = MaterialTheme.colorScheme.primary
+                    )
+                    Text("补充信息", fontSize = 16.sp, fontWeight = FontWeight.Bold, color = Text)
+                }
+                FormBox(state.mbForms, {}, enabled = state.node.approvalStatus != "approved")
+            }
+        }
+    }
+
     /**
      * 设备相关的操作
      */

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

@@ -3,6 +3,7 @@ package com.iscs.bozzys.ui.pages.vm
 import androidx.lifecycle.viewModelScope
 import com.iscs.bozzys.api.ApiRequest
 import com.iscs.bozzys.api.ApiRequest.getResponse
+import com.iscs.bozzys.api.Attachment
 import com.iscs.bozzys.api.FormField
 import com.iscs.bozzys.api.Node
 import com.iscs.bozzys.api.Task
@@ -12,6 +13,7 @@ import com.iscs.bozzys.event.RefreshEventBus
 import com.iscs.bozzys.ui.common.VMBase
 import com.iscs.bozzys.ui.pages.compose.checkCanCommitReturnTips
 import com.iscs.bozzys.ui.pages.compose.getFormListByJsonList
+import com.iscs.bozzys.utils.SystemUtil
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.asStateFlow
@@ -36,6 +38,11 @@ class VMDetailTask : VMBase() {
     // 任务表单信息
     private lateinit var formInfo: TaskFormInfo
 
+    private val mbForms = listOf(
+        "{\"id\":\"field_1770613077797\",\"type\":\"input\",\"label\":\"盲板设备编号\",\"name\":\"deviceNumber\",\"required\":false,\"placeholder\":\"请输入盲板设备编号\",\"options\":[]}",
+        "{\"id\":\"field_1770613171131\",\"type\":\"upload\",\"label\":\"附件上传\",\"name\":\"attachments\",\"required\":false,\"placeholder\":\"\",\"options\":[],\"uploadType\":\"file\",\"maxCount\":5}"
+    )
+
     /**
      * 获取任务表单信息
      */
@@ -50,6 +57,20 @@ class VMDetailTask : VMBase() {
                     toast.emit("任务数据异常")
                     return@launch
                 }
+                // 盲板操作需要显示表单
+                if (listOf("0", "2").contains(taskInfo.isolationType)) {
+                    val forms = mbForms.getFormListByJsonList()
+                    forms.forEach { form ->
+                        if (form.name == "attachments") {
+                            val json = Json
+                            val list = json.decodeFromString<List<Attachment>>(taskInfo.attachments ?: "[]")
+                            form.value = list.map { a -> a.url }
+                        } else if (form.name == "deviceNumber") {
+                            form.value = listOf(taskInfo.deviceNumber ?: "")
+                        }
+                    }
+                    _state.value = _state.value.copy(mbForms = forms)
+                }
                 // 兼容它端返回的异样数据格式
                 if (!taskInfo.formData.isNullOrEmpty()) {
                     val json = Json { ignoreUnknownKeys = true }
@@ -100,6 +121,22 @@ class VMDetailTask : VMBase() {
             val fields = forms.map { json.encodeToString(it) }
             val formInfo = this@VMDetailTask.formInfo.copy(fields = fields)
             params["formData"] = json.encodeToString(formInfo)
+            // 处理特殊盲板操作数据
+            if (listOf("0", "2").contains(_state.value.node.isolationType)) {
+                // 这里做数据转换操作
+                _state.value.mbForms.forEach { form ->
+                    if (form.name == "attachments") {
+                        val list = arrayListOf<MutableMap<String, String>>()
+                        form.value.forEach { url ->
+                            val name = SystemUtil.getUrlFileName(url)
+                            list += mutableMapOf("name" to name, "url" to url)
+                        }
+                        params["attachments"] = json.encodeToString(list)
+                    } else if (form.name == "deviceNumber") {
+                        params["deviceNumber"] = form.value.getOrNull(0) ?: ""
+                    }
+                }
+            }
             loading.emit(StateLoading(show = true))
             ApiRequest.updateJobNodeApproval(params).onSuccess {
                 delay(1000)
@@ -120,5 +157,13 @@ class VMDetailTask : VMBase() {
 
 /**
  * 页面状态类
+ *
+ * @param forms     自定义表单数据
+ * @param mbForms   盲板表单数据
+ * @param node      当前节点数据
  */
-data class StateDetailTask(val forms: List<FormField> = listOf(), val node: Node = Node())
+data class StateDetailTask(
+    val forms: List<FormField> = listOf(),
+    val mbForms: List<FormField> = listOf(),
+    val node: Node = Node()
+)

+ 8 - 0
app/src/main/java/com/iscs/bozzys/utils/SystemUtil.kt

@@ -161,6 +161,14 @@ object SystemUtil {
         }
     }
 
+    /**
+     * 通过Url地址获取文件名
+     */
+    fun getUrlFileName(url: String): String {
+        val spl = url.split("/")
+        return spl[spl.size - 1]
+    }
+
 }
 
 /**