diff --git a/app/src/main/java/com/nova/brain/glass/model/data/SprayingSubmitData.kt b/app/src/main/java/com/nova/brain/glass/model/data/SprayingSubmitData.kt new file mode 100644 index 0000000..46c10e2 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/model/data/SprayingSubmitData.kt @@ -0,0 +1,12 @@ +package com.nova.brain.glass.model.data + +data class SubmitTaskRequest( + val id: String +) + +data class SubmitTaskResponse( + val code: Int, + val message: String, + val data: Any? = null +) + diff --git a/app/src/main/java/com/nova/brain/glass/repository/Service.kt b/app/src/main/java/com/nova/brain/glass/repository/Service.kt index 4a35340..9044d1a 100644 --- a/app/src/main/java/com/nova/brain/glass/repository/Service.kt +++ b/app/src/main/java/com/nova/brain/glass/repository/Service.kt @@ -8,6 +8,8 @@ import com.nova.brain.glass.model.data.BackToRequest import com.nova.brain.glass.model.data.GetTaskInfoRequest import com.nova.brain.glass.model.data.GetTaskInfoResponse import com.nova.brain.glass.model.data.RecognizeData +import com.nova.brain.glass.model.data.SubmitTaskRequest +import com.nova.brain.glass.model.data.SubmitTaskResponse import com.nova.brain.glass.model.data.PushToNextData import com.nova.brain.glass.model.data.PushToNextRequest import com.nova.brain.glass.model.data.RecommendBackNodeData @@ -19,11 +21,14 @@ import com.nova.brain.glass.model.TaskSearchResponse import com.nova.brain.glass.model.data.TopicData import com.nova.brain.glass.model.data.TopicModel import io.reactivex.Observable +import okhttp3.MultipartBody import okhttp3.RequestBody import okhttp3.ResponseBody import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.Headers +import retrofit2.http.Multipart +import retrofit2.http.Part import retrofit2.http.POST import retrofit2.http.Streaming @@ -63,4 +68,11 @@ interface Service { @POST("/skyscopicsecond-api/api/aiGlasses/getTaskInfo") fun getTaskInfo(@Body body: GetTaskInfoRequest): Observable + @Multipart + @POST("/skyscopicsecond-api/api/aiGlasses/batchUpload") + fun batchUpload(@Part multipartFile: MultipartBody.Part): Observable + + @POST("/api/aiGlasses/submitTask") + fun submitTask(@Body body: SubmitTaskRequest): Observable + } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt index 7cc08db..2adb51e 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingActivity.kt @@ -3,7 +3,6 @@ package com.nova.brain.glass.ui import android.content.Intent import android.os.Environment import androidx.recyclerview.widget.RecyclerView -import com.nova.brain.glass.MyApplication import com.nova.brain.glass.R import com.nova.brain.glass.databinding.ActivitySprayingBinding import com.nova.brain.glass.helper.GlassMediaServiceHelper @@ -11,8 +10,6 @@ import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.model.ItemItem -import com.nova.brain.glass.model.data.GetTaskInfoRequest -import com.nova.brain.glass.repository.Service import com.nova.brain.glass.viewmodel.SprayingVM import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.system.server.media.callback.PhotoFileCallback @@ -20,12 +17,8 @@ import com.xuqm.base.adapter.BasePagedAdapter import com.xuqm.base.adapter.CommonPagedAdapter import com.xuqm.base.adapter.ViewHolder import com.xuqm.base.common.LogHelper -import com.xuqm.base.di.manager.HttpManager import com.xuqm.base.extensions.showMessage import com.xuqm.base.ui.BaseListFormLayoutNormalActivity -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers import java.io.File import java.util.UUID @@ -35,7 +28,6 @@ class SprayingActivity : override fun fullscreen(): Boolean = true override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL - private var taskInfoDisposable: Disposable? = null private val taskId: String by lazy { intent.getStringExtra("taskId") .orEmpty() @@ -99,6 +91,7 @@ class SprayingActivity : SprayingPhotoManager.addPhoto(path) startActivity(Intent(this@SprayingActivity, SprayingOCRActivity::class.java).apply { putExtra("path", path) + putExtra("taskId", taskId) }) finish() // runOnUiThread { @@ -114,32 +107,19 @@ class SprayingActivity : super.initData() window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding.tvTaskHeader.text = "您还有10项任务未完成" - fetchTaskInfo() - } - - private fun fetchTaskInfo() { - if (taskId.isBlank()) return - taskInfoDisposable?.dispose() - taskInfoDisposable = HttpManager.getApi(MyApplication.appComponent2, Service::class.java) - .getTaskInfo(GetTaskInfoRequest(id = taskId)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ response -> - if (response.code == 200) { - val taskInfo = response.data - val formList = taskInfo?.productionFormDtoList.orEmpty() - binding.tvTaskHeader.text = "您还有${formList.size}项任务未完成" - val firstForm = formList.firstOrNull() - binding.title.text = "任务1:${firstForm?.itemName.orEmpty()}" - binding.content1.text = "AO/AAO:${taskInfo?.aoNumber.orEmpty()}" - binding.content2.text = "工序号:${taskInfo?.productionInfoId.orEmpty()}" - binding.content3.text = "架次:${taskInfo?.frameTime.orEmpty()}" - } else { - (if (response.message.isBlank()) "任务信息获取失败" else response.message).showMessage() - } - }, { e -> - (e.message ?: "任务信息获取失败").showMessage() - }) + viewModel.taskInfo.observe(this) { info -> + binding.tvTaskHeader.text = "您还有${info.taskCount}项任务未完成" + binding.title.text = "任务1:${info.itemName}" + binding.content1.text = "AO/AAO:${info.aoNumber}" + binding.content2.text = "工序号:${info.productionInfoId}" + binding.content3.text = "架次:${info.frameTime}" + } + viewModel.taskInfoError.observe(this) { message -> + if (message.isNotBlank()) { + message.showMessage() + } + } + viewModel.fetchTaskInfo(taskId) } override fun onResume() { @@ -157,7 +137,6 @@ class SprayingActivity : } override fun onDestroy() { - taskInfoDisposable?.dispose() super.onDestroy() window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt index e94f7b1..3c1dde8 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt @@ -1,7 +1,6 @@ package com.nova.brain.glass.ui import android.content.Intent -import android.os.CountDownTimer import android.os.Environment import android.view.WindowManager import androidx.core.view.doOnLayout @@ -14,6 +13,7 @@ import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.viewmodel.UploadState import com.nova.brain.glass.viewmodel.SprayingOCRVM import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.system.server.media.callback.PhotoFileCallback @@ -33,6 +33,7 @@ class SprayingOCRActivity : override fun fullscreen(): Boolean = true override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL + private val taskId: String by lazy { intent.getStringExtra("taskId").orEmpty() } private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { @@ -42,6 +43,7 @@ class SprayingOCRActivity : finish() } "开始", "拍照", "开始拍照", "开始任务", "重拍", "重新拍", "在拍一次" -> { + viewModel.cancelUpload() runOnUiThread { binding.hint.text = "拍照中,请稍后..." } @@ -55,15 +57,12 @@ class SprayingOCRActivity : } fun takePhoto() { - resultCountdown?.cancel() - resultCountdown = null val fileName = "test_${System.currentTimeMillis()}.png" val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val file = File(publicPicturesDir, fileName) GlassMediaServiceHelper.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath) } private val photoCallbackId = UUID.randomUUID().toString() - private var resultCountdown: CountDownTimer? = null private val imageDecodeExecutor = Executors.newSingleThreadExecutor() private val mPhotoFileCallback = object : PhotoFileCallback.Stub() { @@ -92,6 +91,7 @@ class SprayingOCRActivity : runOnUiThread { binding.hint.text = "单击或语音输入“重拍”,可重新拍摄" showPhoto(path) + viewModel.startUpload(path) } } } @@ -101,8 +101,32 @@ class SprayingOCRActivity : override fun initData() { super.initData() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + viewModel.uploadState.observe(this) { state -> + binding.tvTaskHeader.text = when (state) { + UploadState.UPLOADING -> "附件上传中,请稍后..." + UploadState.SUCCESS -> "附件上传成功" + UploadState.FAILED -> "附件上传失败,请重拍" + UploadState.IDLE -> "OCR识别中,请稍后..." + } + } + viewModel.uploadError.observe(this) { message -> + if (message.isNotBlank()) { + binding.hint.text = "单击或语音输入“重拍”,可重新拍摄" + message.showMessage() + } + } + viewModel.uploadSuccessPath.observe(this) { path -> + if (path.isNullOrBlank()) return@observe + viewModel.clearUploadSuccessPath() + startActivity(Intent(this@SprayingOCRActivity, SprayingResultActivity::class.java).apply { + putExtra("path", path) + putExtra("taskId", taskId) + }) + finish() + } intent.getStringExtra("path")?.apply { showPhoto(this) + viewModel.startUpload(this) } } @@ -115,13 +139,13 @@ class SprayingOCRActivity : } override fun onPause() { super.onPause() - resultCountdown?.cancel() OfflineCmdServiceHelper.removeListenerSprayingOCR() OfflineCmdServiceHelper.removeOnLineListener(listener) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) } override fun onDestroy() { + viewModel.cancelUpload() super.onDestroy() binding.content.setImageDrawable(null) } @@ -134,6 +158,7 @@ class SprayingOCRActivity : .setClickListener(R.id.photo) { when (item.text) { "重拍" -> { + viewModel.cancelUpload() runOnUiThread { binding.hint.text = "拍照中,请稍后..." } @@ -158,24 +183,8 @@ class SprayingOCRActivity : return@runOnUiThread } binding.content.setImageBitmap(bitmap) - restartResultCountdown(path) } } } } - - private fun restartResultCountdown(path: String) { - resultCountdown?.cancel() - resultCountdown = object : CountDownTimer(5_000, 1_000) { - override fun onTick(millisUntilFinished: Long) { - } - - override fun onFinish() { - startActivity(Intent(this@SprayingOCRActivity, SprayingResultActivity::class.java).apply { - putExtra("path", path) - }) - finish() - } - }.start() - } } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt index f72e2db..4bf4613 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingResultActivity.kt @@ -1,9 +1,13 @@ package com.nova.brain.glass.ui import android.app.Activity +import android.app.AlertDialog import android.content.Intent import android.graphics.Paint import android.os.Environment +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater import android.view.WindowManager import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.doOnLayout @@ -16,6 +20,7 @@ import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.viewmodel.SubmitTaskState import com.nova.brain.glass.viewmodel.SprayingResultVM import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.system.server.media.callback.PhotoFileCallback @@ -35,8 +40,15 @@ class SprayingResultActivity : override fun fullscreen(): Boolean = true override fun getRecyclerOrientation(): Int = RecyclerView.HORIZONTAL + private val taskId: String by lazy { + intent.getStringExtra("taskId") + .orEmpty() + .ifBlank { "1493291302287048704" } + } private val imageDecodeExecutor = Executors.newSingleThreadExecutor() private var status = true + private var successDialog: AlertDialog? = null + private val uiHandler = Handler(Looper.getMainLooper()) private val manualResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) { @@ -69,11 +81,7 @@ class SprayingResultActivity : } SprayingFinishActivity.ACTION_SUBMIT -> { - SprayingPhotoManager.clear() - startActivity(Intent(this, TaskListActivity::class.java).apply { - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - }) - finish() + viewModel.submitTask(taskId) } } } @@ -151,6 +159,7 @@ class SprayingResultActivity : this@SprayingResultActivity, SprayingOCRActivity::class.java ).apply { putExtra("path", path) + putExtra("taskId", taskId) }) finish() } @@ -161,6 +170,27 @@ class SprayingResultActivity : override fun initData() { super.initData() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + viewModel.submitTaskState.observe(this) { state -> + when (state) { + SubmitTaskState.LOADING -> { + binding.hint.text = "提交中,请稍后..." + } + SubmitTaskState.SUCCESS -> { + viewModel.resetSubmitTaskState() + showSuccessDialogThenBackToTaskList() + } + SubmitTaskState.FAILED -> { + binding.hint.text = "单击或语音输入“结束任务”,进入任务确认" + viewModel.resetSubmitTaskState() + } + SubmitTaskState.IDLE -> Unit + } + } + viewModel.submitTaskError.observe(this) { message -> + if (message.isNotBlank()) { + message.showMessage() + } + } intent.getStringExtra("path")?.apply { showResultImage(this) setStatusImage() @@ -197,6 +227,8 @@ class SprayingResultActivity : GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) } override fun onDestroy() { + uiHandler.removeCallbacksAndMessages(null) + successDialog?.dismiss() super.onDestroy() binding.iv.setImageDrawable(null) } @@ -255,4 +287,26 @@ class SprayingResultActivity : } } } + + private fun showSuccessDialogThenBackToTaskList() { + successDialog?.dismiss() + val contentView = LayoutInflater.from(this).inflate(R.layout.dialog_review, null) + successDialog = AlertDialog.Builder(this) + .setView(contentView) + .setCancelable(false) + .create() + .also { dialog -> + dialog.window?.setBackgroundDrawableResource(android.R.color.transparent) + dialog.show() + } + uiHandler.postDelayed({ + successDialog?.dismiss() + successDialog = null + SprayingPhotoManager.clear() + startActivity(Intent(this, TaskListActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + }) + finish() + }, 1000L) + } } diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingOCRVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingOCRVM.kt index f5b9cb9..1d44bbf 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingOCRVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingOCRVM.kt @@ -1,10 +1,34 @@ package com.nova.brain.glass.viewmodel +import androidx.lifecycle.MutableLiveData +import com.nova.brain.glass.MyApplication import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.repository.Service +import com.xuqm.base.di.manager.HttpManager import com.xuqm.base.viewmodel.BaseListViewModel import com.xuqm.base.viewmodel.callback.Response +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import java.io.File +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody + +enum class UploadState { + IDLE, + UPLOADING, + SUCCESS, + FAILED +} class SprayingOCRVM: BaseListViewModel() { + val uploadState = MutableLiveData(UploadState.IDLE) + val uploadError = MutableLiveData() + val uploadSuccessPath = MutableLiveData() + private var uploadingPath: String? = null + private var uploadDisposable: Disposable? = null + override fun loadData( page: Int, onResponse: Response @@ -13,4 +37,47 @@ class SprayingOCRVM: BaseListViewModel() { add(ItemItem("重拍")) }) } -} \ No newline at end of file + + fun startUpload(path: String) { + cancelUpload() + val file = File(path) + if (!file.exists() || !file.isFile) { + uploadState.value = UploadState.FAILED + uploadError.value = "附件上传失败" + return + } + + uploadingPath = path + uploadState.value = UploadState.UPLOADING + val requestFile = file.asRequestBody("application/octet-stream".toMediaTypeOrNull()) + val multipartFile = MultipartBody.Part.createFormData("multipartFile", file.name, requestFile) + val disposable = HttpManager.getApi(MyApplication.appComponent2, Service::class.java) + .batchUpload(multipartFile) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (uploadingPath != path) return@subscribe + uploadState.value = UploadState.SUCCESS + uploadSuccessPath.value = path + }, { e -> + if (uploadingPath != path) return@subscribe + uploadState.value = UploadState.FAILED + uploadError.value = e.message ?: "附件上传失败" + }) + uploadDisposable = disposable + add(disposable) + } + + fun cancelUpload() { + uploadingPath = null + uploadDisposable?.dispose() + uploadDisposable = null + if (uploadState.value == UploadState.UPLOADING) { + uploadState.value = UploadState.IDLE + } + } + + fun clearUploadSuccessPath() { + uploadSuccessPath.value = null + } +} diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingResultVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingResultVM.kt index 50f63c0..c2ac7c8 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingResultVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingResultVM.kt @@ -1,10 +1,27 @@ package com.nova.brain.glass.viewmodel +import androidx.lifecycle.MutableLiveData +import com.nova.brain.glass.MyApplication import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.model.data.SubmitTaskRequest +import com.nova.brain.glass.repository.Service +import com.xuqm.base.di.manager.HttpManager import com.xuqm.base.viewmodel.BaseListViewModel import com.xuqm.base.viewmodel.callback.Response +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +enum class SubmitTaskState { + IDLE, + LOADING, + SUCCESS, + FAILED +} class SprayingResultVM: BaseListViewModel() { + val submitTaskState = MutableLiveData(SubmitTaskState.IDLE) + val submitTaskError = MutableLiveData() + override fun loadData( page: Int, onResponse: Response @@ -15,4 +32,36 @@ class SprayingResultVM: BaseListViewModel() { add(ItemItem("人工更正结果")) }) } -} \ No newline at end of file + + fun submitTask(taskId: String) { + if (taskId.isBlank()) { + submitTaskState.value = SubmitTaskState.FAILED + submitTaskError.value = "缺少任务ID,无法提交" + return + } + if (submitTaskState.value == SubmitTaskState.LOADING) return + submitTaskState.value = SubmitTaskState.LOADING + add( + HttpManager.getApi(MyApplication.appComponent2, Service::class.java) + .submitTask(SubmitTaskRequest(id = taskId)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ response -> + if (response.code == 200) { + submitTaskState.value = SubmitTaskState.SUCCESS + } else { + submitTaskState.value = SubmitTaskState.FAILED + submitTaskError.value = + if (response.message.isBlank()) "提交失败" else response.message + } + }, { e -> + submitTaskState.value = SubmitTaskState.FAILED + submitTaskError.value = e.message ?: "提交失败" + }) + ) + } + + fun resetSubmitTaskState() { + submitTaskState.value = SubmitTaskState.IDLE + } +} diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt index 6f61a34..839b733 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/SprayingVM.kt @@ -1,10 +1,28 @@ package com.nova.brain.glass.viewmodel +import androidx.lifecycle.MutableLiveData +import com.nova.brain.glass.MyApplication import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.model.data.GetTaskInfoRequest +import com.nova.brain.glass.repository.Service +import com.xuqm.base.di.manager.HttpManager import com.xuqm.base.viewmodel.BaseListViewModel import com.xuqm.base.viewmodel.callback.Response +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +data class SprayingTaskUiData( + val taskCount: Int, + val itemName: String, + val aoNumber: String, + val productionInfoId: String, + val frameTime: String +) class SprayingVM: BaseListViewModel() { + val taskInfo = MutableLiveData() + val taskInfoError = MutableLiveData() + override fun loadData( page: Int, onResponse: Response @@ -13,4 +31,33 @@ class SprayingVM: BaseListViewModel() { add(ItemItem("开始任务")) }) } -} \ No newline at end of file + + fun fetchTaskInfo(taskId: String) { + if (taskId.isBlank()) return + add( + HttpManager.getApi(MyApplication.appComponent2, Service::class.java) + .getTaskInfo(GetTaskInfoRequest(id = taskId)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ response -> + if (response.code == 200) { + val taskInfo = response.data + val formList = taskInfo?.productionFormDtoList.orEmpty() + val firstForm = formList.firstOrNull() + this.taskInfo.value = SprayingTaskUiData( + taskCount = formList.size, + itemName = firstForm?.itemName.orEmpty(), + aoNumber = taskInfo?.aoNumber.orEmpty(), + productionInfoId = taskInfo?.productionInfoId.orEmpty(), + frameTime = taskInfo?.frameTime.orEmpty() + ) + } else { + taskInfoError.value = + if (response.message.isBlank()) "任务信息获取失败" else response.message + } + }, { e -> + taskInfoError.value = e.message ?: "任务信息获取失败" + }) + ) + } +}