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://22fs132201.imwork.net";
// public static String baseUrl = "http://192.168.6.20"; // public static String baseUrl = "http://192.168.6.20";
// 意图识别
public static AppComponent appComponent1; public static AppComponent appComponent1;
// 喷涂
public static AppComponent appComponent2;
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext())); appComponent = HttpManager.getAppComponent(baseUrl, new HeaderInterceptor(getApplicationContext()));
appComponent1 = HttpManager.getAppComponent("https://22v1322u01.vicp.fun", 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())); // 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(); initSdk();

查看文件

@ -20,5 +20,5 @@ data class TaskSearchItem(
val taskType: String, val taskType: String,
val params: Map<String, String>?, val params: Map<String, String>?,
val processStatus: 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.ApiResponse
import com.nova.brain.glass.model.data.BackToData import com.nova.brain.glass.model.data.BackToData
import com.nova.brain.glass.model.data.BackToRequest 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.RecognizeData
import com.nova.brain.glass.model.data.PushToNextData import com.nova.brain.glass.model.data.PushToNextData
import com.nova.brain.glass.model.data.PushToNextRequest import com.nova.brain.glass.model.data.PushToNextRequest
@ -58,4 +60,7 @@ interface Service {
@POST("/cbrain-gateway/cbrain-execute/cbrain-execute/workflow/instance/backTo") @POST("/cbrain-gateway/cbrain-execute/cbrain-execute/workflow/instance/backTo")
fun backTo(@Body body: BackToRequest): Observable<ApiResponse<BackToData>> 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.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, ActivityReviewBinding>() { class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, ActivityReviewBinding>() {
override fun getLayoutId(): Int = R.layout.activity_review override fun getLayoutId(): Int = R.layout.activity_review
@ -100,6 +101,7 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
isSubmitting = true isSubmitting = true
submitDisposable?.dispose() submitDisposable?.dispose()
val service = HttpManager.getApi(Service::class.java) val service = HttpManager.getApi(Service::class.java)
val firstPushToNextAt = System.currentTimeMillis()
submitDisposable = service.pushToNext( submitDisposable = service.pushToNext(
PushToNextRequest( PushToNextRequest(
workProcessInstanceId = workProcessInstanceId, workProcessInstanceId = workProcessInstanceId,
@ -134,16 +136,21 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
} }
} }
}.flatMap { selectedHandler -> }.flatMap { selectedHandler ->
service.pushToNext( val elapsed = System.currentTimeMillis() - firstPushToNextAt
PushToNextRequest( val remainingDelayMs = (600L - elapsed).coerceAtLeast(0L)
workProcessInstanceId = workProcessInstanceId, Observable.timer(remainingDelayMs, TimeUnit.MILLISECONDS)
currentActivityId = currentActivityId, .flatMap {
needHandle = 0, service.pushToNext(
innerRequest = true, PushToNextRequest(
comment = "拟同意", workProcessInstanceId = workProcessInstanceId,
selectedHandler = selectedHandler currentActivityId = currentActivityId,
) needHandle = 0,
) innerRequest = true,
comment = "拟同意",
selectedHandler = selectedHandler
)
)
}
} }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())

查看文件

@ -3,6 +3,7 @@ package com.nova.brain.glass.ui
import android.content.Intent import android.content.Intent
import android.os.Environment import android.os.Environment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.nova.brain.glass.MyApplication
import com.nova.brain.glass.R import com.nova.brain.glass.R
import com.nova.brain.glass.databinding.ActivitySprayingBinding import com.nova.brain.glass.databinding.ActivitySprayingBinding
import com.nova.brain.glass.helper.GlassMediaServiceHelper 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.OfflineCmdServiceHelper
import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.helper.SprayingPhotoManager
import com.nova.brain.glass.model.ItemItem 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.nova.brain.glass.viewmodel.SprayingVM
import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution
import com.rokid.security.system.server.media.callback.PhotoFileCallback 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.CommonPagedAdapter
import com.xuqm.base.adapter.ViewHolder import com.xuqm.base.adapter.ViewHolder
import com.xuqm.base.common.LogHelper import com.xuqm.base.common.LogHelper
import com.xuqm.base.di.manager.HttpManager
import com.xuqm.base.extensions.showMessage import com.xuqm.base.extensions.showMessage
import com.xuqm.base.ui.BaseListFormLayoutNormalActivity 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.io.File
import java.util.UUID import java.util.UUID
@ -28,6 +35,12 @@ class SprayingActivity :
override fun fullscreen(): Boolean = true override fun fullscreen(): Boolean = true
override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL 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 { private val listener = object : OfflineCmdListener {
override fun onOfflineCmd(cmd: String) { override fun onOfflineCmd(cmd: String) {
@ -100,6 +113,33 @@ class SprayingActivity :
override fun initData() { override fun initData() {
super.initData() super.initData()
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) 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() { override fun onResume() {
@ -116,6 +156,12 @@ class SprayingActivity :
GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback) 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 var isPhoto = false
private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_photo) { private val adapter = object : CommonPagedAdapter<ItemItem>(R.layout.item_photo) {
override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) {

查看文件

@ -126,14 +126,14 @@ class TaskListActivity :
when (item.taskType) { when (item.taskType) {
"复材MES任务" -> startActivity( "复材MES任务" -> startActivity(
Intent(this, FoActivity::class.java) Intent(this, FoActivity::class.java)
.putExtra("aiDescription", item.aiDescription) .putExtra("aiDescription", item.displayDesc())
.putExtra("taskType", item.taskType) .putExtra("taskType", item.taskType)
) )
"审核任务" -> startActivity( "审核任务" -> startActivity(
Intent(this, ReviewActivity::class.java) Intent(this, ReviewActivity::class.java)
.putExtra("taskId", item.id) .putExtra("taskId", item.id)
.putExtra("taskType", item.taskType) .putExtra("taskType", item.taskType)
.putExtra("content", item.aiDescription) .putExtra("content", item.displayDesc())
.putExtra( .putExtra(
"workProcessInstanceId", "workProcessInstanceId",
item.params.firstNotBlank("processInstanceId", "work_process_instance_id") 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}") else -> Log.d("TaskListActivity", "unknown taskType: ${item.taskType}")
} }
} }
@ -212,7 +218,7 @@ class TaskListActivity :
TaskExtraItem( TaskExtraItem(
taskId = item.id, taskId = item.id,
taskType = item.taskType, taskType = item.taskType,
desc = item.aiDescription, desc = item.displayDesc(),
numberNo = index + 1 numberNo = index + 1
) )
} }
@ -224,11 +230,13 @@ class TaskListActivity :
override fun convert(holder: ViewHolder, item: TaskItem, position: Int) { override fun convert(holder: ViewHolder, item: TaskItem, position: Int) {
val displayPosition = (position - pageStartPosition + 1).coerceAtLeast(1) val displayPosition = (position - pageStartPosition + 1).coerceAtLeast(1)
holder 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) } .setClickListener(R.id.tv_title) { openTask(position) }
} }
} }
private fun TaskItem.displayDesc(): String = aiDescription.ifBlank { taskType }
override fun adapter(): BasePagedAdapter<TaskItem> = adapter override fun adapter(): BasePagedAdapter<TaskItem> = adapter
override fun onDestroy() { override fun onDestroy() {

查看文件

@ -51,7 +51,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
vm = ViewModelProvider(this)[WelcomeVM::class.java] vm = ViewModelProvider(this)[WelcomeVM::class.java]
window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
binding.tv.setOnClickListener { binding.tv.setOnClickListener {
triggerRecognize() startActivity(Intent(this, TaskListActivity::class.java))
} }
} }

查看文件

@ -30,12 +30,13 @@ class TaskListVM : BaseListViewModel<TaskItem>() {
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe({ response -> .subscribe({ response ->
val items = response.data?.list?.map { val items = response.data?.list?.map {
val description = it.aiDescription?.takeIf { text -> text.isNotBlank() } ?: it.taskType
TaskItem( TaskItem(
id = it.id, id = it.id,
taskType = it.taskType, taskType = it.taskType,
params = it.params ?: emptyMap(), params = it.params ?: emptyMap(),
processStatus = it.processStatus, processStatus = it.processStatus,
aiDescription = it.aiDescription aiDescription = description
) )
} ?: emptyList() } ?: emptyList()
currentItems = items currentItems = items

查看文件

@ -14,7 +14,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="67dp" android:layout_marginTop="67dp"
android:background="@drawable/bg_item" android:background="@drawable/bg_item"
android:text="装配工序喷涂识别:您还有10项任务未完成" android:text="您还有10项任务未完成"
android:textColor="#ff40FF5E" android:textColor="#ff40FF5E"
android:textSize="20sp" android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -39,7 +39,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginVertical="3dp" android:layout_marginVertical="3dp"
android:gravity="center" android:gravity="center"
android:text="任务1:管线编号与机身喷码核对" android:text="任务1:itemName"
android:textColor="#ff40FF5E" android:textColor="#ff40FF5E"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
@ -55,7 +55,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="任务编号20293989-001" android:text="AO/AAOaoNumber"
android:textColor="#ff40FF5E" android:textColor="#ff40FF5E"
android:textSize="14sp"/> android:textSize="14sp"/>
@ -65,7 +65,7 @@
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:text="制造供应商:中航成飞民用飞机有限责任公司" android:text="工序号productionInfoId"
android:textColor="#ff40FF5E" android:textColor="#ff40FF5E"
android:textSize="14sp"/> android:textSize="14sp"/>
@ -75,7 +75,7 @@
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="4dp" android:layout_marginVertical="4dp"
android:text="任务创建时间2026-03-09 16:00:00" android:text="架次frameTime"
android:textColor="#ff40FF5E" android:textColor="#ff40FF5E"
android:textSize="14sp"/> android:textSize="14sp"/>