feat(task): 添加任务详情获取功能并优化任务列表展示

- 在TaskSearchModel中将aiDescription字段设为可空默认值
- 添加GetTaskInfo相关请求响应模型和API接口
- 在ReviewActivity中增加提交延迟逻辑防止频繁操作
- 新增SprayingActivity用于天镜检验任务处理
- 实现任务详情获取并在界面中动态显示任务信息
- 优化TaskListActivity中的任务跳转逻辑和显示内容
- 修改WelcomeActivity启动页面直接进入任务列表
- 更新任务列表ViewModel中描述字段的处理逻辑
- 配置MyApplication中新增的网络请求组件实例
- 调整spraying界面布局中的任务信息展示内容
这个提交包含在:
徐勤民 2026-04-18 17:05:51 +08:00
父节点 4610076e50
当前提交 42b353c972
共有 10 个文件被更改,包括 126 次插入24 次删除

查看文件

@ -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();

查看文件

@ -20,5 +20,5 @@ data class TaskSearchItem(
val taskType: String,
val params: Map<String, String>?,
val processStatus: String,
val aiDescription: String
val aiDescription: String? = null
)

查看文件

@ -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<TaskFormItem>? = null
)
data class TaskFormItem(
val formId: String? = null,
val itemName: String? = null,
val toolType: String? = null,
val name: String? = null,
val type: String? = null
)

查看文件

@ -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<ApiResponse<BackToData>>
@POST("/skyscopicsecond-api/api/aiGlasses/getTaskInfo")
fun getTaskInfo(@Body body: GetTaskInfoRequest): Observable<GetTaskInfoResponse>
}

查看文件

@ -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<ItemItem, ItemListVM, ActivityReviewBinding>() {
override fun getLayoutId(): Int = R.layout.activity_review
@ -100,6 +101,7 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
isSubmitting = true
submitDisposable?.dispose()
val service = HttpManager.getApi(Service::class.java)
val firstPushToNextAt = System.currentTimeMillis()
submitDisposable = service.pushToNext(
PushToNextRequest(
workProcessInstanceId = workProcessInstanceId,
@ -134,6 +136,10 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
}
}
}.flatMap { selectedHandler ->
val elapsed = System.currentTimeMillis() - firstPushToNextAt
val remainingDelayMs = (600L - elapsed).coerceAtLeast(0L)
Observable.timer(remainingDelayMs, TimeUnit.MILLISECONDS)
.flatMap {
service.pushToNext(
PushToNextRequest(
workProcessInstanceId = workProcessInstanceId,
@ -145,6 +151,7 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
)
)
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doFinally { isSubmitting = false }

查看文件

@ -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<ItemItem>(R.layout.item_photo) {
override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {

查看文件

@ -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<TaskItem> = adapter
override fun onDestroy() {

查看文件

@ -51,7 +51,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
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))
}
}

查看文件

@ -30,12 +30,13 @@ class TaskListVM : BaseListViewModel<TaskItem>() {
.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

查看文件

@ -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/AAOaoNumber"
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"/>