diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index f823bf758a..0545c19350 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainLogParam +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean @@ -275,6 +276,10 @@ class DevaToolsProvider : IDevaToolsProvider { sceneManager.updateSceneTAG(sceneTag) } + override fun reportWorkOrder(view: View) { + BadCaseManager.reportWorkOrder(view) + } + override fun initBadCase(view: View) { BadCaseManager.initBadCase(view) } @@ -443,6 +448,13 @@ class DevaToolsProvider : IDevaToolsProvider { BindingCarManager.queryContainers(padSn, dockerVersion) } + /** + * 工单上报接口 + */ + override fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo) { + BindingCarManager.workOrderReport(workOrderReportInfo) + } + override fun queryAppUpgrade() { BindingCarManager.queryAppUpgrade() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 7628a110ae..030e2fe3ce 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -53,6 +53,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import com.zhjt.mogo_core_function_devatools.ext.enqueuePop +import com.zhjt.mogo_core_function_devatools.workorder.WorkOrderWindow import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass import java.io.File @@ -179,6 +180,36 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis } } + /** + * 开启工单上报弹窗 + */ + fun reportWorkOrder(view: View){ + val activity = view.context as? FragmentActivity + ?: throw IllegalStateException("please ensure context is FragmentActivity.") + view.setOnClickListener{ + if (ClickUtils.isFastClick()){ + if (NetworkUtils.isConnected()){ + if (BadCaseConfig.dockerVersion != null){ + //展示工单上报弹窗 + val workOrderWindow = WorkOrderWindow(activity) + workOrderWindow.setClickListener(object: WorkOrderWindow.ClickListener{ + override fun closeWindow() { + workOrderWindow.hideFloatWindow() + } + }) + workOrderWindow.showFloatWindow() + }else{ + ToastUtils.showShort("工控机连接状态异常") + } + }else{ + ToastUtils.showShort("网络异常,请检查网络") + } + }else{ + ToastUtils.showShort("请勿连续点击,稍后再试") + } + } + } + /** * 主动采集BadCase */ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt index dcaec72654..e448a75ea4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt @@ -19,10 +19,12 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo import com.zhjt.mogo_core_function_devatools.trace.TraceManager import com.zhjt.mogo_core_function_devatools.upgrade.IPCUpgradeManager.Companion.ipcUpgradeManager import com.zhjt.mogo_core_function_devatools.upgrade.ObuUpgradeAppNetWorkManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeAppNetWorkManager +import com.zhjt.mogo_core_function_devatools.workorder.WorkOrderManager.Companion.workOrderManager import mogo.telematics.pad.MessagePad /** @@ -58,11 +60,13 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener, IMoGoCloudListener { CallerAutopilotCarConfigListenerManager.addListener(TAG, this) CallerCloudListenerManager.addListener(TraceManager.TAG, this) ipcUpgradeManager.init(context) + workOrderManager.init(context) } fun onDestroy() { CallerAutopilotCarConfigListenerManager.removeListener(TAG) ipcUpgradeManager.destroy() + workOrderManager.destroy() } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { @@ -145,6 +149,13 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener, IMoGoCloudListener { ipcUpgradeManager.queryContainers(padSn, dockerVersion) } + /** + * 工单上报接口 + */ + fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo){ + workOrderManager.workOrderReport(workOrderReportInfo) + } + fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit) { BindingCarNetWorkManager.instance.modifyBindingCar( mAddress, diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderApiService.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderApiService.kt new file mode 100644 index 0000000000..b986614026 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderApiService.kt @@ -0,0 +1,18 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import com.mogo.eagle.core.data.Response +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +/** + * 工单上报接口 + */ +interface WorkOrderApiService { + + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("/api/v1/monitor/yk/manual/callback/?token=eapir6gqq6v9p2m82tzrnj") + suspend fun workOrderReport(@Body workOrderReportInfo: WorkOrderReportInfo): Response + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderHostConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderHostConst.kt new file mode 100644 index 0000000000..62054877a9 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderHostConst.kt @@ -0,0 +1,26 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import com.mogo.commons.debug.DebugConfig + +/** + * 工单上报域名管理 + */ +class WorkOrderHostConst { + + companion object{ + private const val HOST_DEV = "http://yw-egateway.zhidaoauto.com" + private const val HOST_RELEASE = "http://yw-egateway.zhidaoauto.com" + + fun getWorkOrderBaseUrl(): String{ + return when (DebugConfig.getNetMode()){ + DebugConfig.NET_MODE_DEV -> HOST_DEV + DebugConfig.NET_MODE_QA -> HOST_DEV + DebugConfig.NET_MODE_DEMO -> HOST_RELEASE + DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE + else -> HOST_RELEASE + } + } + + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt new file mode 100644 index 0000000000..bd871cbb5e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderManager.kt @@ -0,0 +1,45 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import android.content.Context +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager + +/** + * @author XuXinChao + * @description 人工报障及工单建议呈现 + * @since: 2024/4/11 + */ +class WorkOrderManager{ + + companion object{ + const val TAG = "WorkOrderManager" + val workOrderManager: WorkOrderManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){ + WorkOrderManager() + } + } + + private var mContext: Context? = null + private val workOrderNetWorkModel = WorkOrderNetWorkModel() + + fun init(context: Context){ + mContext = context + } + + /** + * 工单上报 + */ + fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo,){ + workOrderNetWorkModel.workOrderReport(workOrderReportInfo, + onSuccess = { + CallerDevaToolsListenerManager.invokeWorkOrderReportSuccess() + }, + onError = { + CallerDevaToolsListenerManager.invokeWorkOrderReportError() + } + ) + } + + fun destroy(){ + mContext = null + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderNetWorkModel.kt new file mode 100644 index 0000000000..1c7625cc03 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderNetWorkModel.kt @@ -0,0 +1,37 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import com.mogo.eagle.core.data.Response +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiResponseCall +import com.mogo.eagle.core.network.request +import com.zhjt.mogo_core_function_devatools.workorder.WorkOrderHostConst.Companion.getWorkOrderBaseUrl + +/** + * 工单上报 + */ +class WorkOrderNetWorkModel { + + private fun getNetWorkApi(baseUrl: String =getWorkOrderBaseUrl()): WorkOrderApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(WorkOrderApiService::class.java) + } + + fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo, + onSuccess: ((String) -> Unit), onError: ((String) -> Unit)){ + request>{ + loader{ + apiResponseCall{ + getNetWorkApi(getWorkOrderBaseUrl()).workOrderReport(workOrderReportInfo) + } + } + onSuccess{ + onSuccess.invoke("") + } + onError{ + onError.invoke("") + } + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderWindow.kt new file mode 100644 index 0000000000..2a62a89edc --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/WorkOrderWindow.kt @@ -0,0 +1,408 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.PixelFormat +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.DisplayMetrics +import android.util.Log +import android.view.Gravity +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.WindowManager +import android.view.animation.Animation +import android.view.animation.ScaleAnimation +import android.widget.ImageView +import android.widget.RadioGroup +import android.widget.TextView +import androidx.appcompat.widget.AppCompatEditText +import com.iflytek.cloud.ErrorCode +import com.iflytek.cloud.InitListener +import com.iflytek.cloud.RecognizerListener +import com.iflytek.cloud.RecognizerResult +import com.iflytek.cloud.SpeechError +import com.iflytek.cloud.SpeechRecognizer +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.deva.report.FaultDetailInfo +import com.mogo.eagle.core.data.deva.report.FaultInfo +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +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.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.JsonParser +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 kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.json.JSONException +import org.json.JSONObject +import kotlin.math.absoluteValue + +/** + * 工单上报弹窗 + */ +class WorkOrderWindow constructor(activity: Activity) : View.OnTouchListener, + IMoGoDevaToolsListener { + + companion object{ + const val TAG = "WorkOrderWindow" + } + + private var mActivity: Activity = activity + private var mWindowParams: WindowManager.LayoutParams? = null + private var mWindowManager: WindowManager? = null + + private lateinit var mFloatLayout: View + + private var clickListener: ClickListener? = null + + private var mInViewX = 0f + private var mInViewY = 0f + private var mInScreenX = 0f + private var mInScreenY = 0f + + // 语音听写对象 + private var mIat: SpeechRecognizer? = null + private var reasonDetail: String = "" //语音转写 + // 用HashMap存储听写结果 + private val mIatResults: HashMap = LinkedHashMap() + + private var workOrderType = "" //工单问题类型 + private var workOrderOccurrenceTime = System.currentTimeMillis() //故障发生时间 + var ret = 0 // 函数调用返回值 + private var audioStatus = false + + private lateinit var tvWorkOrderTime: TextView + private lateinit var rgType: RadioGroup + private lateinit var ivTimeReduce: ImageView + private lateinit var tvOccurrenceTime: TextView + private lateinit var ivTimeAdd: ImageView + private lateinit var etDescribeInput: AppCompatEditText + private lateinit var ivDescribeAudio: ImageView + private lateinit var tvWorkOrderReport: TextView + private lateinit var tvWorkOrderCancel: TextView + + init { + initFloatWindow() + } + + @SuppressLint("InflateParams") + private fun initFloatWindow(){ + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_work_order, null) as View + mFloatLayout.setOnTouchListener(this) + + // 初始化识别无UI识别对象 + // 使用SpeechRecognizer对象,可根据回调消息自定义界面; + mIat = SpeechRecognizer.createRecognizer(mActivity, mInitListener) + + tvWorkOrderTime = mFloatLayout.findViewById(R.id.tv_work_order_time) + rgType = mFloatLayout.findViewById(R.id.rg_type) + ivTimeReduce = mFloatLayout.findViewById(R.id.iv_time_reduce) + tvOccurrenceTime = mFloatLayout.findViewById(R.id.tv_occurrence_time) + ivTimeAdd = mFloatLayout.findViewById(R.id.iv_time_add) + etDescribeInput = mFloatLayout.findViewById(R.id.et_describe_input) + ivDescribeAudio = mFloatLayout.findViewById(R.id.iv_describe_audio) + tvWorkOrderReport = mFloatLayout.findViewById(R.id.tv_work_order_report) + tvWorkOrderCancel = mFloatLayout.findViewById(R.id.tv_work_order_cancel) + + initEvent() + + mWindowParams = WindowManager.LayoutParams() + mWindowManager = mActivity.windowManager + mWindowParams?.let { + it.format = PixelFormat.RGBA_8888 +// it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + it.gravity = Gravity.START or Gravity.TOP + it.width = 844 + it.height = 808 + it.alpha = 1.0f + } + } + + @OptIn(DelicateCoroutinesApi::class) + @SuppressLint("SetTextI18n") + private fun initEvent(){ + CallerDevaToolsListenerManager.addListener(TAG, this) + //弹窗展示时间 + tvWorkOrderTime.text = mActivity.resources.getString(R.string.work_order_time) + + millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat()) + + rgType.setOnCheckedChangeListener{_, checkedId -> + when(checkedId){ + R.id.rb_type_perception->{ + workOrderType = "感知" + } + R.id.rb_type_hardware->{ + workOrderType = "硬件" + } + R.id.rb_type_vehicle->{ + workOrderType = "原车" + } + R.id.rb_type_service->{ + workOrderType = "服务" + } + R.id.rb_type_other->{ + workOrderType = "其他" + } + } + } + //发生时间 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + ivTimeReduce.setOnClickListener { + workOrderOccurrenceTime -= 60000 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + ivTimeAdd.setOnClickListener { + if(workOrderOccurrenceTime + 60000 > System.currentTimeMillis()){ + ToastUtils.showShort("发生时间应在当前时间之前") + return@setOnClickListener + } + workOrderOccurrenceTime += 60000 + tvOccurrenceTime.text = millis2String(workOrderOccurrenceTime, TimeUtils.getHourMinFormat()) + } + etDescribeInput.requestFocus() +// val inputMethodManager = mActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager +// inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0) + + etDescribeInput.addTextChangedListener(object: TextWatcher{ + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + + //问题描述录音 + ivDescribeAudio.setOnClickListener { + audioStatus = !audioStatus + setAudio(audioStatus) + } + //上报 + tvWorkOrderReport.setOnClickListener { + //工单问题类型必选,没有选择,进行提示 + if(workOrderType.isEmpty()){ + ToastUtils.showShort("请选择问题类型") + return@setOnClickListener + } + if(etDescribeInput.text.toString().isEmpty()){ + ToastUtils.showShort("请填写问题描述") + return@setOnClickListener + } + GlobalScope.launch(Dispatchers.IO){ + val msgBoxList = CallerMsgBoxManager.queryFMInfoList(mActivity, + workOrderOccurrenceTime-120000,workOrderOccurrenceTime+120000) + val faultList = ArrayList() + msgBoxList?.forEach { msgBoxBean -> + val fmInfoMsg = msgBoxBean.bean as FMInfoMsg + fmInfoMsg.fmInfoList?.forEach { fault -> + val faultBean = FaultInfo(false,fault.faultId,fault.faultName, + fault.faultTime.toString(), FaultDetailInfo(fault.faultDesc)) + faultList.add(faultBean) + } + } + val workOrderReportInfo = WorkOrderReportInfo(workOrderType,workOrderOccurrenceTime.toString(), + etDescribeInput.text.toString(),CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude.toString(), + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude.toString(), + AppConfigInfo.plateNumber, SharedPrefsMgr.getInstance().getString("och_account","") , + BadCaseConfig.dockerVersion ?:"",faultList) + CallerDevaToolsManager.workOrderReport(workOrderReportInfo) + } + + + + + + } + //取消 + tvWorkOrderCancel.setOnClickListener { + clickListener?.closeWindow() + } + + } + + private fun setAudio(status: Boolean){ + if(status){ + //开始录音 + mIat?.let { + //清空之前的内容 + mIatResults.clear() + SpeechUtils.setParam(it) + // 不显示听写对话框 + ret = it.startListening(mRecognizerListener) + if (ret != ErrorCode.SUCCESS) { + ToastUtils.showShort("听写失败,错误码:$ret,请点击网址https://www.xfyun.cn/document/error-code查询解决方案") + } + } + //开始录音,展示放大缩小动效 + val scaleAnimation = ScaleAnimation( + 1.0f, 0.8f, 1.0f, 0.8f, + Animation.RELATIVE_TO_SELF, 0.8f, Animation.RELATIVE_TO_SELF, 0.8f + ) + scaleAnimation.duration = 1000 + scaleAnimation.repeatCount = -1 + ivDescribeAudio.startAnimation(scaleAnimation) + }else{ + //停止语音听写 + mIat?.stopListening() + //结束动画 + ivDescribeAudio.clearAnimation() + } + } + + /** + * 初始化监听器。 + */ + private val mInitListener = InitListener { code -> + if (code != ErrorCode.SUCCESS) { + ToastUtils.showShort("讯飞语音听写初始化失败,错误码:$code") + } + } + + /** + * 听写监听器。 + */ + private val mRecognizerListener: RecognizerListener = object : RecognizerListener{ + override fun onVolumeChanged(p0: Int, p1: ByteArray?) { + //showTip("当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + override fun onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + } + + override fun onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + } + + override fun onResult(results: RecognizerResult?, isLast: Boolean) { + results?.let { + printResult(it) + } + } + + override fun onError(p0: SpeechError?) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + } + + override fun onEvent(p0: Int, p1: Int, p2: Int, p3: Bundle?) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + + } + + /** + * 显示结果 + */ + private fun printResult(results: RecognizerResult) { + val text: String = JsonParser.parseIatResult(results.resultString) + var sn: String? = null + // 读取json结果中的sn字段 + try { + val resultJson = JSONObject(results.resultString) + sn = resultJson.optString("sn") + } catch (e: JSONException) { + e.printStackTrace() + } + mIatResults[sn!!] = text + val resultBuffer = java.lang.StringBuilder() + for (key in mIatResults.keys) { + resultBuffer.append(mIatResults[key]) + } + Log.i(TAG, "语音内容=$resultBuffer") + reasonDetail = resultBuffer.toString() + if(reasonDetail.isNotEmpty()){ + etDescribeInput.setText(reasonDetail) + } + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { + when (motionEvent?.action) { + MotionEvent.ACTION_DOWN -> { + // 获取相对View的坐标,即以此View左上角为原点 + mInViewX = motionEvent.x + mInViewY = motionEvent.y + // 获取相对屏幕的坐标,即以屏幕左上角为原点 + mInScreenX = motionEvent.rawX + mInScreenY = motionEvent.rawY + } + MotionEvent.ACTION_MOVE -> { + // 更新浮动窗口位置参数 + mInScreenX = motionEvent.rawX + mInScreenY = motionEvent.rawY + if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){ + return true + } + mWindowParams!!.x = (mInScreenX - mInViewX).toInt() + mWindowParams!!.y = (mInScreenY - mInViewY).toInt() + // 手指移动的时候更新小悬浮窗的位置 + mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) + } + } + return true + } + + fun showFloatWindow() { + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = metrics.widthPixels-890 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-1140 + mWindowManager!!.addView(mFloatLayout, mWindowParams) + + + } + } + + fun hideFloatWindow() { + if (mFloatLayout.parent != null){ + mWindowManager!!.removeView(mFloatLayout) + } + CallerDevaToolsListenerManager.removeListener(TAG) + } + + override fun workOrderReportSuccess() { + ToastUtils.showShort("工单上报成功") + hideFloatWindow() + } + + override fun workOrderReportError() { + ToastUtils.showShort("工单上报失败") + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun closeWindow() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png new file mode 100644 index 0000000000..eee3703f5c Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/bg_work_order_des_input.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_add.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_add.png new file mode 100644 index 0000000000..0813a2315c Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_add.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_audio.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_audio.png new file mode 100644 index 0000000000..391db11e68 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_audio.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_reduce.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_reduce.png new file mode 100644 index 0000000000..b7cc604c26 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_reduce.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_title.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_title.png new file mode 100644 index 0000000000..de313a3339 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_work_order_title.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml new file mode 100644 index 0000000000..bcb67b7556 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_select.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml new file mode 100644 index 0000000000..cb1fa5e3d6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/type_radio_button_unselect.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/work_order_type_radio_button.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/work_order_type_radio_button.xml new file mode 100644 index 0000000000..96ae36458b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/work_order_type_radio_button.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_work_order.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_work_order.xml new file mode 100644 index 0000000000..51f56b5532 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_work_order.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml index c29106e01a..4c1d9a6abd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml @@ -1,4 +1,18 @@ - + + 问题上报 + 问题类型 + 发生时间 + 问题描述 + 手动输入 + 上报 + 取消 + 时间: + 感知 + 硬件 + 原车 + 服务 + 其他 + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml index 9ea5908c93..a64bbda71e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/styles.xml @@ -16,5 +16,15 @@ @drawable/rv_scroll_bar_track + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/FaultInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/FaultInfo.kt new file mode 100644 index 0000000000..472f2777ef --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/FaultInfo.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.data.deva.report + +/** + * 故障内容实体类 + * @param isRecover 恢复逻辑,标记这条报警是恢复还是报警条目 + * @param faultId 故障Id + * @param faultName 故障名称 + * @param startTime 报警时间 + * @param detail 报警内容 + */ +data class FaultInfo(var isRecover: Boolean = false,var faultId: String,var faultName: String, + var startTime:String,var detail: FaultDetailInfo) + +/** + * 报警内容实体类 + * @param info 故障描述 + */ +data class FaultDetailInfo(var info: String) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/WorkOrderReportInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/WorkOrderReportInfo.kt new file mode 100644 index 0000000000..b3bbde9100 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/report/WorkOrderReportInfo.kt @@ -0,0 +1,17 @@ +package com.mogo.eagle.core.data.deva.report + +/** + * 人工报障上报实体类 + * @param type 问题类型:感知、硬件、原车、服务、其他 + * @param reportTime 上报时间 + * @param describe 上报描述 + * @param longitude 经度 + * @param latitude 纬度 + * @param plateNumber 车牌号实际上 就是cmdb中的sn + * @param phoneNumber 安全员联系方式 + * @param map map版本 + * @param faultList FM上报故障列表 + */ +data class WorkOrderReportInfo(var type: String,var reportTime: String,var describe: String, + var longitude: String,var latitude: String,var plateNumber: String, + var phoneNumber: String,var map: String,var faultList: ArrayList) \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index d211d737bd..a809c0c69e 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -8,6 +8,7 @@ import com.alibaba.android.arouter.facade.template.IProvider import com.mogo.eagle.core.data.EnvConfig import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.deva.chain.ChainLogParam +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean @@ -96,6 +97,8 @@ interface IDevaToolsProvider : IProvider { */ fun updateSceneTAG(sceneTag: MutableMap) + fun reportWorkOrder(view: View) + /** * 初始化BadCase入口 * @param view: BadCase入口视图 @@ -232,6 +235,11 @@ interface IDevaToolsProvider : IProvider { */ fun queryContainers(padSn: String, dockerVersion: String) + /** + * 工单上报接口 + */ + fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo) + /** * 查询app是否有更新 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt index 0162e6fcb3..e95e402167 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt @@ -51,6 +51,10 @@ interface IMoGoDevaToolsListener { } + fun workOrderReportSuccess(){} + + fun workOrderReportError(){} + fun mofangStatus(status:Boolean){ } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt index f96fcfffde..9d92707d20 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt @@ -64,6 +64,20 @@ object CallerDevaToolsListenerManager : CallerBase() { } } + fun invokeWorkOrderReportSuccess(){ + M_LISTENERS.forEach{ + val listener = it.value + listener.workOrderReportSuccess() + } + } + + fun invokeWorkOrderReportError(){ + M_LISTENERS.forEach{ + val listener = it.value + listener.workOrderReportError() + } + } + fun invokeMoFangStatus(status:Boolean){ M_LISTENERS.forEach { val listener = it.value diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index b8d30fed0c..0fc365fffd 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam +import com.mogo.eagle.core.data.deva.report.WorkOrderReportInfo import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.data.msgbox.MsgBoxBean @@ -128,6 +129,13 @@ object CallerDevaToolsManager { devaToolsProviderApi?.updateSceneTAG(sceneTag) } + /** + * 开启上报工单 + */ + fun reportWorkOrder(view: View){ + devaToolsProviderApi?.reportWorkOrder(view) + } + /** * 初始化BadCase相关配置 */ @@ -320,6 +328,13 @@ object CallerDevaToolsManager { devaToolsProviderApi?.queryContainers(padSn, dockerVersion) } + /** + * 工单上报接口 + */ + fun workOrderReport(workOrderReportInfo: WorkOrderReportInfo){ + devaToolsProviderApi?.workOrderReport(workOrderReportInfo) + } + fun dockerVersion(dockerVersion: String?){ devaToolsProviderApi?.dockerVersion(dockerVersion) } diff --git a/core/mogo-core-res/src/main/res/values/dimens.xml b/core/mogo-core-res/src/main/res/values/dimens.xml index eb82271a1e..14db571916 100644 --- a/core/mogo-core-res/src/main/res/values/dimens.xml +++ b/core/mogo-core-res/src/main/res/values/dimens.xml @@ -1057,6 +1057,8 @@ 23dp 24dp 25dp + 26dp + 27dp 28dp 30dp 32dp