feat(task): 添加任务详情获取功能并优化任务列表展示
- 在TaskSearchModel中将aiDescription字段设为可空默认值 - 添加GetTaskInfo相关请求响应模型和API接口 - 在ReviewActivity中增加提交延迟逻辑防止频繁操作 - 新增SprayingActivity用于天镜检验任务处理 - 实现任务详情获取并在界面中动态显示任务信息 - 优化TaskListActivity中的任务跳转逻辑和显示内容 - 修改WelcomeActivity启动页面直接进入任务列表 - 更新任务列表ViewModel中描述字段的处理逻辑 - 配置MyApplication中新增的网络请求组件实例 - 调整spraying界面布局中的任务信息展示内容
这个提交包含在:
父节点
4610076e50
当前提交
42b353c972
@ -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,16 +136,21 @@ class ReviewActivity : BaseListFormLayoutNormalActivity<ItemItem, ItemListVM, Ac
|
||||
}
|
||||
}
|
||||
}.flatMap { selectedHandler ->
|
||||
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())
|
||||
|
||||
@ -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/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"/>
|
||||
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户