[6.6.0]数据闭环

This commit is contained in:
xuxinchao
2024-08-28 16:21:00 +08:00
parent 3a1c82a295
commit 27fbf1ecd0
13 changed files with 192 additions and 92 deletions

View File

@@ -619,8 +619,8 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener {
WorkOrderManager.workOrderManager.problemPadAdd(padAddProblemReq)
}
override fun getCategories(tenantId: Long, level: Int, parentId: Int) {
WorkOrderManager.workOrderManager.getCategories(tenantId, level, parentId)
override fun getCategories(tenantId: Long, level: Int, parentId: Int,type: Int,upType: Int) {
WorkOrderManager.workOrderManager.getCategories(tenantId, level, parentId,type, upType)
}
override fun queryAppUpgrade() {

View File

@@ -678,4 +678,11 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
this.lineName = lineName
}
/**
* 获取租户ID
*/
override fun onTenantIdUpdate(tenantId: Long) {
BadCaseConfig.tenantId = tenantId
}
}

View File

@@ -62,6 +62,9 @@ object BadCaseConfig {
//本次问题是否已经触发一键上报
@JvmField
var alreadyShowOneReport: Boolean = false
//租户ID
@JvmField
var tenantId: Long = 0
private const val resourceInitiative = "RESOURCE_INITIATIVE" //录包来源为主动录包
private const val resourceAiData = "RESOURCE_AI_DATA" //录包来源为AI数据采集

View File

@@ -59,6 +59,7 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.tts.base.SpeechUtils
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.workorder.adapter.OrderReasonAdapter
import kotlin.math.absoluteValue
@@ -120,6 +121,8 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
private var reportNote: String = "" //上报描述
private val reportType: Int = 2 //上报方式0小程序 1司机屏 2云端上报
private var source: Int = 0 //操作源0:类型1:原因
init {
initFloatWindow()
}
@@ -166,16 +169,16 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
rvFaultList.layoutManager = linearLayoutManager
orderReasonAdapter = OrderReasonAdapter()
orderReasonAdapter.setListener(object: OrderReasonAdapter.ReasonSelectListener{
override fun onSelectReason(reason: String, mSource: Int) {
override fun onSelectReason(reason: CategoryInfo, mSource: Int) {
if(mSource == 0){
//类型
tbFaultType.textOn = reason
tbFaultType.textOff = reason
tbFaultType.textOn = reason.name
tbFaultType.textOff = reason.name
tbFaultType.performClick()
}else{
//原因
tbFaultReason.textOn = reason
tbFaultReason.textOff = reason
tbFaultReason.textOn = reason.name
tbFaultReason.textOff = reason.name
tbFaultReason.performClick()
}
}
@@ -203,21 +206,14 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
(rvFaultList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tbFaultType
tbFaultReason.visibility = View.INVISIBLE
val list = ArrayList<String>()
list.add("一级分类1")
list.add("一级分类2")
list.add("一级分类3")
list.add("一级分类4")
list.add("一级分类5")
list.add("一级分类6")
list.add("一级分类7")
list.add("一级分类8")
list.add("一级分类9")
list.add("一级分类10")
list.add("一级分类11")
list.add("一级分类12")
list.add("一级分类13")
orderReasonAdapter.setData(list,0)
// val list = ArrayList<String>()
// list.add("一级分类1")
// orderReasonAdapter.setData(list,0)
source = 0
//获取故障二级分类即故障类型
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,2,1,1,0)
} else {
buttonView.setCompoundDrawables(null, null, iconDown, null)
//隐藏列表
@@ -232,21 +228,16 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
//展示列表
rvFaultList.visibility = View.VISIBLE
(rvFaultList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tbFaultReason
val list = ArrayList<String>()
list.add("二级分类1")
list.add("二级分类2")
list.add("二级分类3")
list.add("二级分类4")
list.add("二级分类5")
list.add("二级分类6")
list.add("二级分类7")
list.add("二级分类8")
list.add("二级分类9")
list.add("二级分类10")
list.add("二级分类11")
list.add("二级分类12")
list.add("二级分类13")
orderReasonAdapter.setData(list,1)
// val list = ArrayList<String>()
// list.add("二级分类1")
// orderReasonAdapter.setData(list,1)
source = 1
//获取故障三级分类即故障原因
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,3,1,1,0)
} else {
buttonView.setCompoundDrawables(null, null, iconDown, null)
//隐藏列表
@@ -308,6 +299,10 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
}
//上报
tvFaultReport.setOnClickListener{
//故障码列表赋值
BadCaseConfig.newFMInfoMsg?.fmInfoList?.forEach {
faultCodeList.add(it.faultId)
}
val geocodeSearch = GeocodeSearch(mActivity)
geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener {
override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) {
@@ -380,10 +375,6 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
}
}
/**
* 听写监听器。
*/
/**
* 听写监听器。
*/
@@ -530,6 +521,11 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
override fun getCategoriesSuccess(list: List<CategoryInfo>) {
super.getCategoriesSuccess(list)
ThreadUtils.runOnUiThread {
if(list.isNotEmpty()){
orderReasonAdapter.setData(list,source)
}
}
}
override fun getCategoriesError(msg: String) {

View File

@@ -16,10 +16,23 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.Group
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.deva.report.CategoryInfo
import com.mogo.eagle.core.data.deva.report.PadAddProblemReq
import com.mogo.eagle.core.data.deva.report.PadProblemInfo
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
@@ -56,6 +69,15 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
private var oneClickTimer: CountDownTimer ?= null
private var address: String = "" //故障地点
private var faultCodeList = ArrayList<String>() //故障码列表
private var level1Id: Int = 0 //一级分类ID
private var level2Id: Int = 0 //二级分类ID
private var level3Id: Int = 0 //三级分类ID
private var lineName: String = "" //行驶路线
private var reportNote: String = "" //上报描述
private val reportType: Int = 2 //上报方式0小程序 1司机屏 2云端上报
init {
initFloatWindow()
}
@@ -97,8 +119,31 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
//一键上报
ivOneClickReport.setOnClickListener {
hasReportOperate = true
//TODO
BadCaseConfig.newFMInfoMsg?.fmInfoList?.forEach {
faultCodeList.add(it.faultId)
}
val geocodeSearch = GeocodeSearch(mActivity)
geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener {
override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) {
regeocodeResult?.regeocodeAddress?.formatAddress?.let {
address = it
}
val padProblemList= ArrayList<PadProblemInfo>()
val padProblemInfo = PadProblemInfo(address,faultCodeList,millis2String(System.currentTimeMillis()),level1Id,
level2Id,level3Id,lineName,reportNote,reportType,
SharedPrefsMgr.getInstance().getString("och_account",""))
padProblemList.add(padProblemInfo)
val padAddProblemReq = PadAddProblemReq(padProblemList, AppConfigInfo.plateNumber)
CallerDevaToolsManager.problemPadAdd(padAddProblemReq)
}
override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
}
})
val latLon = LatLonPoint(CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude, CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude)
val q = RegeocodeQuery(latLon,200f, GeocodeSearch.AMAP)
geocodeSearch.getFromLocationAsyn(q)
}
//故障类
tvReportTypeFault.setOnClickListener {
@@ -197,6 +242,8 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
mWindowParams!!.y = yPosition
mWindowManager!!.addView(mFloatLayout, mWindowParams)
showOneCLickReportView()
//请求一键上报故障码
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,1,1,4,1)
}
}
@@ -237,4 +284,13 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
ToastUtils.showShort("故障原因上报失败$msg")
}
override fun getCategoriesSuccess(list: List<CategoryInfo>) {
super.getCategoriesSuccess(list)
//TODO
}
override fun getCategoriesError(msg: String) {
super.getCategoriesError(msg)
}
}

View File

@@ -37,14 +37,17 @@ import com.mogo.eagle.core.data.deva.report.CategoryInfo
import com.mogo.eagle.core.data.deva.report.TakeOverRecordInfo
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.takeover.CallerTakeOverManager
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.JsonParser
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.tts.base.SpeechUtils
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.workorder.adapter.OrderReasonAdapter
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlin.math.absoluteValue
@@ -95,6 +98,8 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
private lateinit var orderReasonAdapter: OrderReasonAdapter
private lateinit var mTakeOverRecordInfo: TakeOverRecordInfo
private var source: Int = 0 //操作源0:类型1:原因
init {
initFloatWindow()
}
@@ -137,16 +142,16 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
rvTakeOverList.layoutManager = linearLayoutManager
orderReasonAdapter = OrderReasonAdapter()
orderReasonAdapter.setListener(object: OrderReasonAdapter.ReasonSelectListener{
override fun onSelectReason(reason: String, mSource: Int) {
override fun onSelectReason(reason: CategoryInfo, mSource: Int) {
if(mSource == 0){
//类型
tbTakeOverType.textOn = reason
tbTakeOverType.textOff = reason
tbTakeOverType.textOn = reason.name
tbTakeOverType.textOff = reason.name
tbTakeOverType.performClick()
}else{
//原因
tbTakeOverReason.textOn = reason
tbTakeOverReason.textOff = reason
tbTakeOverReason.textOn = reason.name
tbTakeOverReason.textOff = reason.name
tbTakeOverReason.performClick()
}
}
@@ -173,21 +178,9 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
(rvTakeOverList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tbTakeOverType
tbTakeOverReason.visibility = View.INVISIBLE
val list = ArrayList<String>()
list.add("一级分类1")
list.add("一级分类2")
list.add("一级分类3")
list.add("一级分类4")
list.add("一级分类5")
list.add("一级分类6")
list.add("一级分类7")
list.add("一级分类8")
list.add("一级分类9")
list.add("一级分类10")
list.add("一级分类11")
list.add("一级分类12")
list.add("一级分类13")
orderReasonAdapter.setData(list,0)
source = 0
//获取故障二级分类即故障类型
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,2,1,1,0)
} else {
buttonView.setCompoundDrawables(null, null, iconDown, null)
//隐藏列表
@@ -202,21 +195,10 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
//展示列表
rvTakeOverList.visibility = View.VISIBLE
(rvTakeOverList.layoutParams as ConstraintLayout.LayoutParams).topToBottom = R.id.tbTakeOverReason
val list = ArrayList<String>()
list.add("二级分类1")
list.add("二级分类2")
list.add("二级分类3")
list.add("二级分类4")
list.add("二级分类5")
list.add("二级分类6")
list.add("二级分类7")
list.add("二级分类8")
list.add("二级分类9")
list.add("二级分类10")
list.add("二级分类11")
list.add("二级分类12")
list.add("二级分类13")
orderReasonAdapter.setData(list,1)
source = 1
//获取故障三级分类即故障原因
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,3,1,1,0)
} else {
buttonView.setCompoundDrawables(null, null, iconDown, null)
//隐藏列表
@@ -430,6 +412,11 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
override fun getCategoriesSuccess(list: List<CategoryInfo>) {
super.getCategoriesSuccess(list)
ThreadUtils.runOnUiThread {
if(list.isNotEmpty()){
orderReasonAdapter.setData(list,source)
}
}
}
override fun getCategoriesError(msg: String) {

View File

@@ -2,18 +2,25 @@ package com.zhjt.mogo_core_function_devatools.workorder
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.deva.report.PadAddProblemReq
import com.mogo.eagle.core.data.deva.report.PadProblemInfo
import com.mogo.eagle.core.data.deva.report.TakeOverRecordInfo
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.takeover.CallerTakeOverManager
import com.mogo.eagle.core.utilcode.kotlin.lifeCycleScope
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getYMDFormat
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.Utils
import com.zhjt.mogo_core_function_devatools.R
@@ -27,7 +34,6 @@ import kotlinx.android.synthetic.main.view_take_over_record.view.tvRecordNoData
import kotlinx.android.synthetic.main.view_take_over_record.view.tvTakeOverRecordDate
import kotlinx.android.synthetic.main.view_take_over_record.view.tvUpload
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
@@ -38,7 +44,7 @@ class TakeOverRecordView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsListener {
companion object {
const val TAG = "TakeOverRecordView"
@@ -62,6 +68,7 @@ class TakeOverRecordView @JvmOverloads constructor(
//关闭窗口
ivTakeOverRecordClose.setOnClickListener {
clickListener?.onClose()
CallerDevaToolsListenerManager.removeListener(TAG)
}
//接管记录日期
tvTakeOverRecordDate.text = TimeUtils.millis2String(System.currentTimeMillis(), getYMDFormat())
@@ -102,7 +109,25 @@ class TakeOverRecordView @JvmOverloads constructor(
//一键上传
tvUpload.setOnClickListener {
if(selectedUploadRecord.isEmpty()){
ToastUtils.showShort("请选择需要上传的接管记录")
}else{
val recordIterator = selectedUploadRecord.iterator()
val padProblemList= ArrayList<PadProblemInfo>()
while(recordIterator.hasNext()){
val uploadRecord = recordIterator.next()
uploadRecord.let {
val padProblemInfo = PadProblemInfo(it.address, emptyList(),
millis2String(it.faultStartTime),it.level1Id,it.level2Id,it.level3Id,
it.lineName,it.reportNote,1,
SharedPrefsMgr.getInstance().getString("och_account",""))
padProblemList.add(padProblemInfo)
}
}
val padAddProblemReq = PadAddProblemReq(padProblemList, AppConfigInfo.plateNumber)
CallerDevaToolsManager.problemPadAdd(padAddProblemReq)
}
}
//删除
tvDeleteSelect.setOnClickListener {
@@ -120,6 +145,7 @@ class TakeOverRecordView @JvmOverloads constructor(
}
//获取接管记录列表
refreshList()
CallerDevaToolsListenerManager.addListener(TAG,this)
}
/**
@@ -151,4 +177,14 @@ class TakeOverRecordView @JvmOverloads constructor(
fun onClose()
}
override fun problemPadAddSuccess() {
super.problemPadAddSuccess()
}
override fun problemPadAddError(msg: String) {
super.problemPadAddError(msg)
}
}

View File

@@ -40,7 +40,9 @@ interface WorkOrderApiService {
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("tenantId") tenantId: Long,
@Query("level") level: Int,
@Query("parentId") parentId: Int
@Query("parentId") parentId: Int,
@Query("type") type: Int,
@Query("upType") upType: Int
): Response<List<CategoryInfo>>
}

View File

@@ -82,9 +82,13 @@ class WorkOrderManager{
/**
* 获取报障、接管、一键上报配置
* @param tenantId 租户ID
* @param level 数据层级
* @param type 类型
* @param upType 一键上报的时候传1其他分类的时候可以不传
*/
fun getCategories(tenantId: Long, level: Int, parentId: Int){
workOrderNetWorkModel.getCategories(tenantId,level,parentId,
fun getCategories(tenantId: Long, level: Int, parentId: Int,type: Int,upType: Int){
workOrderNetWorkModel.getCategories(tenantId,level,parentId,type,upType,
onSuccess = {
CallerDevaToolsListenerManager.invokeGetCategoriesSuccess(it)
},

View File

@@ -61,13 +61,13 @@ class WorkOrderNetWorkModel {
/**
* 获取报障、接管、一键上报配置
*/
fun getCategories(tenantId: Long, level: Int, parentId: Int,
fun getCategories(tenantId: Long, level: Int, parentId: Int,type: Int,upType: Int,
onSuccess: ((List<CategoryInfo>) -> Unit),
onError: ((String) -> Unit)){
request<Response<List<CategoryInfo>>>{
loader{
apiResponseCall{
getNetWorkApi(getOchUrl()).getCategories(MoGoAiCloudClientConfig.getInstance().serviceAppId,tenantId, level, parentId)
getNetWorkApi(getOchUrl()).getCategories(MoGoAiCloudClientConfig.getInstance().serviceAppId,tenantId, level, parentId,type,upType)
}
}
onSuccess {

View File

@@ -5,6 +5,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.deva.report.CategoryInfo
import com.zhjt.mogo_core_function_devatools.R
/**
@@ -12,11 +13,11 @@ import com.zhjt.mogo_core_function_devatools.R
*/
class OrderReasonAdapter: RecyclerView.Adapter<OrderReasonAdapter.ReasonHolder>() {
private var data: List<String> ?= null
private var data: List<CategoryInfo> ?= null
private var selectListener: ReasonSelectListener ?= null
private var mSource: Int = 0 //适配器数据来源0:类型1:原因
fun setData(data: List<String>,source: Int){
fun setData(data: List<CategoryInfo>, source: Int){
this.data = data
mSource = source
notifyDataSetChanged()
@@ -31,7 +32,7 @@ class OrderReasonAdapter: RecyclerView.Adapter<OrderReasonAdapter.ReasonHolder>(
override fun onBindViewHolder(holder: ReasonHolder, position: Int) {
data?.let {
val reason = it[position]
holder.tvReason.text = reason
holder.tvReason.text = reason.name
holder.tvReason.setOnClickListener {
selectListener?.onSelectReason(reason,mSource)
}
@@ -50,7 +51,7 @@ class OrderReasonAdapter: RecyclerView.Adapter<OrderReasonAdapter.ReasonHolder>(
interface ReasonSelectListener{
//选择原因
fun onSelectReason(reason: String,mSource: Int)
fun onSelectReason(reason: CategoryInfo,mSource: Int)
}
}