[feedback]优化数据加载逻辑

[feedback]优化日志记录
This commit is contained in:
renwj
2022-03-21 14:48:55 +08:00
parent de51b9e399
commit 643596fb3e
4 changed files with 80 additions and 68 deletions

View File

@@ -30,6 +30,7 @@ internal class Repository {
net.get(if (isDriven) "被动" else "主动", itx, 1)
itx
.takeIf { it.isNotEmpty() }
?.sortedBy { it.sort }
?.also {
store.updateRecords(it, isDriven)
}

View File

@@ -25,7 +25,7 @@ internal class BadCaseNetModel {
}
?.body()?.also {
val data = it.data
if (data == null || it.total <= result.size) {
if (data == null || data.isEmpty() || it.total <= result.size) {
return@also
}
result += data

View File

@@ -15,6 +15,7 @@ internal class BadCaseResponse {
var id: String? = null
var reason: String? = null
var channel: String? = null
var sort: String? = null
/**
* 业务字段,不参与序列化和反序列化
@@ -23,7 +24,7 @@ internal class BadCaseResponse {
var isChecked: Boolean = false
override fun toString(): String {
return "Reason(id=$id, reason=$reason, channel=$channel, isChecked=$isChecked)"
return "Reason(id=$id, reason=$reason, channel=$channel, sort=$sort, isChecked=$isChecked)"
}
}
}

View File

@@ -24,7 +24,6 @@ import com.zhjt.mogo_core_function_devatools.feedback.biz.bean.Feedback.BadCase
import com.zhjt.mogo_core_function_devatools.feedback.biz.impl.FeedbackPresenter
import com.zhjt.mogo_core_function_devatools.feedback.callback.IFeedbackCallback
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import record_cache.RecordPanelOuterClass
import java.lang.IllegalStateException
import kotlin.Result.Companion
@@ -35,15 +34,6 @@ internal object FeedbackManager {
private var hideFloat: (() -> Unit)? = null
private val presenter by lazy { FeedbackPresenter() }
@OptIn(ExperimentalCoroutinesApi::class)
private var autoPilotCallback = Channel<AutoPilotRecord>(Channel.RENDEZVOUS)
@Synchronized
get() = if (field.isClosedForReceive || field.isClosedForSend) {
field = Channel(Channel.RENDEZVOUS)
field
} else field
fun showFeedbackWindow(ctx: Context) {
CallerHmiManager.showFloatWindow("Feedback", FeedBackView(ctx).also { itx ->
itx.registerCallback(object : IFeedbackCallback {
@@ -79,20 +69,32 @@ internal object FeedbackManager {
val listener = object : IMoGoAutopilotIdentifyListener {
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
super.onAutopilotRecordResult(recordPanel)
val newRecord = recordPanel.toRecord()
Log.d(TAG, "-- 收到工控机录制任务回调 -- $recordPanel")
if (newRecord.type == 1 && newRecord.id == taskId) {
if (newRecord.stat == 100 || newRecord.stat == 101) {
Log.d(TAG, "录制Bag完成, 触发结束录制全量日志 ...")
stopRecordLog(newRecord)
launch {
send(newRecord)
launch {
val newRecord = recordPanel.toRecord()
Log.d(TAG, "-- 收到工控机录制任务回调 -- $recordPanel")
if (newRecord.type == 1 && newRecord.id == taskId) {
when(newRecord.stat) {
100, 101 -> {
//成功结束录制
stopRecordLog(newRecord)
launch {
val ret = upload(record.context, badCase, checked, newRecord)
if (!ret) {
record.text = "开始录制"
record.setTag(R.id.feed_back_badcase_tag, 0)
}
}
}
300 -> {
//开始录制
startRecordLog(newRecord)
}
200 -> {
TipToast.shortTip("录制失败")
hideFloat?.invoke()
}
}
}
if (newRecord.stat == 300) {
Log.d(TAG, "录制Bag开始, 触发录制全量日志 ...")
startRecordLog(newRecord)
}
}
}
}
@@ -104,27 +106,36 @@ internal object FeedbackManager {
record.text = "结束录制"
record.setTag(R.id.feed_back_badcase_tag, 1)
record.setTag(R.id.feed_back_badcase_taskid_tag, taskId)
recordBag(1, taskId, 20)
Log.d(TAG, "延时20秒开始....")
delay(20000) //延时20秒
Log.d(TAG, "延时20秒结束....")
stopRecordBag(1, taskId)
upload(record.context, badCase, checked)
}.also {
record.setTag(R.id.feed_back_badcase_job, it)
recordBag(1, taskId)
launch {
Log.d(TAG, "延时20秒开始....")
delay(20000) //延时20秒
Log.d(TAG, "延时20秒结束....")
stopRecordBag(1, taskId)
}.also { itx ->
itx.invokeOnCompletion {
if (it is CancellationException) {
Log.d(TAG, "延时任务取消")
}
}
record.setTag(R.id.feed_back_badcase_job, itx)
}
}
}
override fun onStopBadCaseRecord(record: TextView) {
val data = itx.adapter.data ?: return
val badCase = data.firstOrNull() as? BadCase ?: return
val checked = badCase.reasons.find { it.isChecked } ?: throw IllegalStateException("这种状态不存在")
val tag = (record.getTag(R.id.feed_back_badcase_tag) as? Int) ?: throw IllegalStateException("这个状态不存在")
if (tag == 2) {
TipToast.shortTip("正在结束录制,请稍候...")
return
}
val taskId = (record.getTag(R.id.feed_back_badcase_taskid_tag) as? Int) ?: throw IllegalStateException("TaskId 不存在")
val oldJob = record.getTag(R.id.feed_back_badcase_job) as? Job
record.text = "正在结束录制"
record.setTag(R.id.feed_back_badcase_tag, 2)
oldJob?.safeCancel()
record.scope.launch {
stopRecordBag(1, taskId)
oldJob?.safeCancel()
upload(record.context, badCase, checked)
}
}
})
@@ -135,50 +146,49 @@ internal object FeedbackManager {
}
private fun startRecordLog(record: AutoPilotRecord) {
//val fileName = record.fileName
//添加全量日志开始录制
Log.d(TAG, "录制Bag开始, 触发录制全量日志 ...")
CallerDevaToolsManager.startCatchLog(1,record.fileName)
}
private fun stopRecordLog(newRecord: AutoPilotRecord) {
//val fileName = record.fileName
//添加全量日志结束录制
Log.d(TAG, "录制Bag完成, 触发结束录制全量日志 ...")
CallerDevaToolsManager.startCatchLog()
}
private suspend fun upload(ctx: Context, badCase: BadCase, checked: Reason) {
val result = receive()
val remark = badCase.remark.text
presenter.upload(mutableMapOf<String, String>().also { itx ->
itx["carLicense"] = MoGoAiCloudClientConfig.getInstance().sn
itx["filename"] = result.fileName ?: ""
itx["filesize"] = result.total.toString()
itx["key"] = result.key ?: ""
itx["reason"] = checked.reason ?: ""
itx["duration"] = result.duration.toInt().toString()
itx["timestamp"] = result.timestamp
itx["channel"] = "1"
if (!TextUtils.isEmpty(remark)) {
itx["remark"] = remark.toString()
}
}).also {
if (it == null || it.code != 200) {
ctx.toast("上报失败")
} else {
ctx.toast("上报成功")
hideFloat?.invoke()
private suspend fun upload(ctx: Context, badCase: BadCase, checked: Reason, record: AutoPilotRecord): Boolean {
try {
val remark = badCase.remark.text
return presenter.upload(mutableMapOf<String, String>().also { itx ->
itx["carLicense"] = MoGoAiCloudClientConfig.getInstance().sn
itx["filename"] = record.fileName ?: ""
itx["filesize"] = record.total.toString()
itx["key"] = record.key ?: ""
itx["reason"] = checked.reason ?: ""
itx["duration"] = record.duration.toInt().toString()
itx["timestamp"] = record.timestamp
itx["channel"] = "1"
if (!TextUtils.isEmpty(remark)) {
itx["remark"] = remark.toString()
}
}).let {
if (it == null || it.code != 200) {
ctx.toast("上报失败")
false
} else {
ctx.toast("上报成功")
hideFloat?.invoke()
true
}
}
} catch (t: Throwable) {
return false
}
}
private suspend fun send(record: AutoPilotRecord) = autoPilotCallback.send(record)
private suspend fun receive(): AutoPilotRecord = autoPilotCallback.receive()
private suspend fun recordBag(type: Int, id: Int, duration: Int) = suspendCancellableCoroutine<Unit> {
private suspend fun recordBag(type: Int, id: Int) = suspendCancellableCoroutine<Unit> {
val future = ThreadUtils.getIoPool().submit {
try {
CallerAutoPilotManager.recordPackage(type, id, duration)
CallerAutoPilotManager.recordPackage(type, id)
it.resumeWith(Result.success(Unit))
} catch (t: Throwable) {
it.resumeWith(Companion.failure(t))