From 42b353c972f4cc392383cdd644863c2697485af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Sat, 18 Apr 2026 17:05:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E8=AF=A6=E6=83=85=E8=8E=B7=E5=8F=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在TaskSearchModel中将aiDescription字段设为可空默认值 - 添加GetTaskInfo相关请求响应模型和API接口 - 在ReviewActivity中增加提交延迟逻辑防止频繁操作 - 新增SprayingActivity用于天镜检验任务处理 - 实现任务详情获取并在界面中动态显示任务信息 - 优化TaskListActivity中的任务跳转逻辑和显示内容 - 修改WelcomeActivity启动页面直接进入任务列表 - 更新任务列表ViewModel中描述字段的处理逻辑 - 配置MyApplication中新增的网络请求组件实例 - 调整spraying界面布局中的任务信息展示内容 --- .../com/nova/brain/glass/MyApplication.java | 6 +++ .../nova/brain/glass/model/TaskSearchModel.kt | 4 +- .../glass/model/data/SprayingTaskInfoData.kt | 29 ++++++++++++ .../nova/brain/glass/repository/Service.kt | 5 ++ .../com/nova/brain/glass/ui/ReviewActivity.kt | 27 +++++++---- .../nova/brain/glass/ui/SprayingActivity.kt | 46 +++++++++++++++++++ .../nova/brain/glass/ui/TaskListActivity.kt | 16 +++++-- .../nova/brain/glass/ui/WelcomeActivity.kt | 2 +- .../nova/brain/glass/viewmodel/TaskListVM.kt | 5 +- app/src/main/res/layout/activity_spraying.xml | 10 ++-- 10 files changed, 126 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/com/nova/brain/glass/model/data/SprayingTaskInfoData.kt diff --git a/app/src/main/java/com/nova/brain/glass/MyApplication.java b/app/src/main/java/com/nova/brain/glass/MyApplication.java index e5f3432..cbe8646 100644 --- a/app/src/main/java/com/nova/brain/glass/MyApplication.java +++ b/app/src/main/java/com/nova/brain/glass/MyApplication.java @@ -18,14 +18,20 @@ public class MyApplication extends App { public static String baseUrl = "http://22fs132201.imwork.net"; // public static String baseUrl = "http://192.168.6.20"; + // 意图识别 public static AppComponent appComponent1; + // 喷涂 + public static AppComponent appComponent2; @Override public void onCreate() { super.onCreate(); appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext())); appComponent1 = HttpManager.getAppComponent("https://22v1322u01.vicp.fun", new HeaderInterceptor(getApplicationContext())); + appComponent2 = HttpManager.getAppComponent("https://22v1322u01.vicp.fun", new HeaderInterceptor(getApplicationContext())); + // appComponent1 = HttpManager.getAppComponent("http://192.168.6.20:12119", new HeaderInterceptor(getApplicationContext())); +// appComponent2 = HttpManager.getAppComponent("http://192.168.6.156:10085", new HeaderInterceptor(getApplicationContext())); initSdk(); diff --git a/app/src/main/java/com/nova/brain/glass/model/TaskSearchModel.kt b/app/src/main/java/com/nova/brain/glass/model/TaskSearchModel.kt index 52a9f19..7cea928 100644 --- a/app/src/main/java/com/nova/brain/glass/model/TaskSearchModel.kt +++ b/app/src/main/java/com/nova/brain/glass/model/TaskSearchModel.kt @@ -20,5 +20,5 @@ data class TaskSearchItem( val taskType: String, val params: Map?, val processStatus: String, - val aiDescription: String -) \ No newline at end of file + val aiDescription: String? = null +) diff --git a/app/src/main/java/com/nova/brain/glass/model/data/SprayingTaskInfoData.kt b/app/src/main/java/com/nova/brain/glass/model/data/SprayingTaskInfoData.kt new file mode 100644 index 0000000..4422e37 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/model/data/SprayingTaskInfoData.kt @@ -0,0 +1,29 @@ +package com.nova.brain.glass.model.data + +data class GetTaskInfoRequest( + val id: String +) + +data class GetTaskInfoResponse( + val code: Int, + val message: String, + val data: TaskInfoData? = null +) + +data class TaskInfoData( + val id: String? = null, + val aoNumber: String? = null, + val productionInfoId: String? = null, + val productionId: String? = null, + val productionName: String? = null, + val frameTime: String? = null, + val productionFormDtoList: List? = null +) + +data class TaskFormItem( + val formId: String? = null, + val itemName: String? = null, + val toolType: String? = null, + val name: String? = null, + val type: String? = 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 6d842bc..4a35340 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 @@ -5,6 +5,8 @@ import com.nova.brain.glass.model.data.ChatData import com.nova.brain.glass.model.data.ApiResponse import com.nova.brain.glass.model.data.BackToData 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.PushToNextData import com.nova.brain.glass.model.data.PushToNextRequest @@ -58,4 +60,7 @@ interface Service { @POST("/cbrain-gateway/cbrain-execute/cbrain-execute/workflow/instance/backTo") fun backTo(@Body body: BackToRequest): Observable> + @POST("/skyscopicsecond-api/api/aiGlasses/getTaskInfo") + fun getTaskInfo(@Body body: GetTaskInfoRequest): Observable + } diff --git a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt index 741265c..5efad48 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt @@ -26,6 +26,7 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers +import java.util.concurrent.TimeUnit class ReviewActivity : BaseListFormLayoutNormalActivity() { override fun getLayoutId(): Int = R.layout.activity_review @@ -100,6 +101,7 @@ class ReviewActivity : BaseListFormLayoutNormalActivity - service.pushToNext( - PushToNextRequest( - workProcessInstanceId = workProcessInstanceId, - currentActivityId = currentActivityId, - needHandle = 0, - innerRequest = true, - comment = "拟同意", - selectedHandler = selectedHandler - ) - ) + val elapsed = System.currentTimeMillis() - firstPushToNextAt + val remainingDelayMs = (600L - elapsed).coerceAtLeast(0L) + Observable.timer(remainingDelayMs, TimeUnit.MILLISECONDS) + .flatMap { + service.pushToNext( + PushToNextRequest( + workProcessInstanceId = workProcessInstanceId, + currentActivityId = currentActivityId, + needHandle = 0, + innerRequest = true, + comment = "拟同意", + selectedHandler = selectedHandler + ) + ) + } } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 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 96abea1..7cc08db 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,6 +3,7 @@ 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 @@ -10,6 +11,8 @@ 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 @@ -17,8 +20,12 @@ 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 @@ -28,6 +35,12 @@ 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() + .ifBlank { "1495087454883938304" } + } private val listener = object : OfflineCmdListener { override fun onOfflineCmd(cmd: String) { @@ -100,6 +113,33 @@ class SprayingActivity : override fun initData() { 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() + }) } override fun onResume() { @@ -116,6 +156,12 @@ class SprayingActivity : GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) } + override fun onDestroy() { + taskInfoDisposable?.dispose() + super.onDestroy() + window.clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + private var isPhoto = false private val adapter = object : CommonPagedAdapter(R.layout.item_photo) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { diff --git a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt index fafbea1..0eff66b 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/TaskListActivity.kt @@ -126,14 +126,14 @@ class TaskListActivity : when (item.taskType) { "复材MES任务" -> startActivity( Intent(this, FoActivity::class.java) - .putExtra("aiDescription", item.aiDescription) + .putExtra("aiDescription", item.displayDesc()) .putExtra("taskType", item.taskType) ) "审核任务" -> startActivity( Intent(this, ReviewActivity::class.java) .putExtra("taskId", item.id) .putExtra("taskType", item.taskType) - .putExtra("content", item.aiDescription) + .putExtra("content", item.displayDesc()) .putExtra( "workProcessInstanceId", item.params.firstNotBlank("processInstanceId", "work_process_instance_id") @@ -148,6 +148,12 @@ class TaskListActivity : ) ) ) + "天镜检验任务" -> startActivity( + Intent(this, SprayingActivity::class.java) + .putExtra("taskId", item.params.firstNotBlank("taskId", "task_id", "id")) + .putExtra("aiDescription", item.displayDesc()) + .putExtra("taskType", item.taskType) + ) else -> Log.d("TaskListActivity", "unknown taskType: ${item.taskType}") } } @@ -212,7 +218,7 @@ class TaskListActivity : TaskExtraItem( taskId = item.id, taskType = item.taskType, - desc = item.aiDescription, + desc = item.displayDesc(), numberNo = index + 1 ) } @@ -224,11 +230,13 @@ class TaskListActivity : override fun convert(holder: ViewHolder, item: TaskItem, position: Int) { val displayPosition = (position - pageStartPosition + 1).coerceAtLeast(1) holder - .setText(R.id.tv_title, "${displayPosition}. ${item.aiDescription}【${item.processStatus}】") + .setText(R.id.tv_title, "${displayPosition}. ${item.displayDesc()}【${item.processStatus}】") .setClickListener(R.id.tv_title) { openTask(position) } } } + private fun TaskItem.displayDesc(): String = aiDescription.ifBlank { taskType } + override fun adapter(): BasePagedAdapter = adapter override fun onDestroy() { diff --git a/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt index 18be038..d399336 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt @@ -51,7 +51,7 @@ class WelcomeActivity : BaseActivity() { vm = ViewModelProvider(this)[WelcomeVM::class.java] window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding.tv.setOnClickListener { - triggerRecognize() + startActivity(Intent(this, TaskListActivity::class.java)) } } diff --git a/app/src/main/java/com/nova/brain/glass/viewmodel/TaskListVM.kt b/app/src/main/java/com/nova/brain/glass/viewmodel/TaskListVM.kt index e6af353..7c809ae 100644 --- a/app/src/main/java/com/nova/brain/glass/viewmodel/TaskListVM.kt +++ b/app/src/main/java/com/nova/brain/glass/viewmodel/TaskListVM.kt @@ -30,12 +30,13 @@ class TaskListVM : BaseListViewModel() { .observeOn(AndroidSchedulers.mainThread()) .subscribe({ response -> val items = response.data?.list?.map { + val description = it.aiDescription?.takeIf { text -> text.isNotBlank() } ?: it.taskType TaskItem( id = it.id, taskType = it.taskType, params = it.params ?: emptyMap(), processStatus = it.processStatus, - aiDescription = it.aiDescription + aiDescription = description ) } ?: emptyList() currentItems = items @@ -46,4 +47,4 @@ class TaskListVM : BaseListViewModel() { }) ) } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_spraying.xml b/app/src/main/res/layout/activity_spraying.xml index d6fd41c..f089fdd 100644 --- a/app/src/main/res/layout/activity_spraying.xml +++ b/app/src/main/res/layout/activity_spraying.xml @@ -14,7 +14,7 @@ android:layout_height="wrap_content" android:layout_marginTop="67dp" android:background="@drawable/bg_item" - android:text="装配工序喷涂识别:您还有10项任务未完成!" + android:text="您还有10项任务未完成" android:textColor="#ff40FF5E" android:textSize="20sp" app:layout_constraintEnd_toEndOf="parent" @@ -39,7 +39,7 @@ android:layout_gravity="center" android:layout_marginVertical="3dp" android:gravity="center" - android:text="任务1:管线编号与机身喷码核对" + android:text="任务1:itemName" android:textColor="#ff40FF5E" android:textSize="18sp" android:textStyle="bold" /> @@ -55,7 +55,7 @@ android:layout_height="wrap_content" android:layout_marginStart="15dp" android:layout_marginTop="4dp" - android:text="任务编号:20293989-001" + android:text="AO/AAO:aoNumber" android:textColor="#ff40FF5E" android:textSize="14sp"/> @@ -65,7 +65,7 @@ android:layout_marginStart="15dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" - android:text="制造供应商:中航成飞民用飞机有限责任公司" + android:text="工序号:productionInfoId" android:textColor="#ff40FF5E" android:textSize="14sp"/> @@ -75,7 +75,7 @@ android:layout_marginStart="15dp" android:layout_height="wrap_content" android:layout_marginVertical="4dp" - android:text="任务创建时间:2026-03-09 16:00:00" + android:text="架次:frameTime" android:textColor="#ff40FF5E" android:textSize="14sp"/>