From db8dd83c305daed18d8d9ff0e456265d42b3e004 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Thu, 2 Mar 2023 19:52:24 +0800 Subject: [PATCH] =?UTF-8?q?[charter=20m1]=20=E8=BD=A8=E8=BF=B9=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/charter/bean/QueryRoutesResponse.kt | 3 + .../CharterAnalyticsManager.java | 2 +- .../CharterSendTripInfoManager.kt | 2 +- .../manager/CharterTrajectoryManager.kt | 210 ++++++++++++++++++ .../mogo/och/charter/model/DriverM1Model.kt | 18 +- .../charter/presenter/DriverM1Presenter.kt | 16 +- .../res/drawable-xhdpi/icon_ai_collect.png | Bin 0 -> 7627 bytes .../main/res/drawable-xhdpi/icon_bad_case.png | Bin 0 -> 7039 bytes .../main/res/layout/charter_base_fragment.xml | 4 +- 9 files changed, 243 insertions(+), 12 deletions(-) rename OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/{ => manager}/CharterAnalyticsManager.java (99%) rename OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/{ => manager}/CharterSendTripInfoManager.kt (97%) create mode 100644 OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt create mode 100755 OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_ai_collect.png create mode 100755 OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_bad_case.png diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryRoutesResponse.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryRoutesResponse.kt index 551982e8f0..beefc3e293 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryRoutesResponse.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/bean/QueryRoutesResponse.kt @@ -9,6 +9,9 @@ import com.mogo.eagle.core.data.BaseData data class QueryRoutesResponse(var data: Result) : BaseData(){ data class Result( + + + var csvFileUrl : String = "" , var csvFileMd5 : String = "" ,//轨迹文件md5,默认“” diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterAnalyticsManager.java b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java similarity index 99% rename from OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterAnalyticsManager.java rename to OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java index 79cc939b0c..a3e54cc950 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterAnalyticsManager.java +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java @@ -1,4 +1,4 @@ -package com.magic.mogo.och.charter; +package com.magic.mogo.och.charter.manager; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterSendTripInfoManager.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterSendTripInfoManager.kt similarity index 97% rename from OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterSendTripInfoManager.kt rename to OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterSendTripInfoManager.kt index d347679366..a3efae98a1 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/CharterSendTripInfoManager.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterSendTripInfoManager.kt @@ -1,4 +1,4 @@ -package com.magic.mogo.och.charter +package com.magic.mogo.och.charter.manager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt new file mode 100644 index 0000000000..241d2edda3 --- /dev/null +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterTrajectoryManager.kt @@ -0,0 +1,210 @@ +package com.magic.mogo.och.charter.manager + +import com.magic.mogo.och.charter.constant.CharterConst +import com.magic.mogo.och.charter.model.DriverM1Model.Companion.get +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendTrajectoryDownloadReq +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.zhidao.socket.utils.LoginStatusUtil +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.functions.Function +import io.reactivex.schedulers.Schedulers +import mogo_msg.MogoReportMsg.MogoReportMessage +import java.util.concurrent.TimeUnit + +/** + * Bus轨迹管理:给MEC下发用于轨迹下载的信息 + * Created on 2022/6/23 + */ +object CharterTrajectoryManager { + + private const val TAG = "CharterTrajectoryManager" + private var mAutoPilotLine: AutoPilotLine? = null + private var mLineId = 0 + private var mSendReqDisposable: Disposable? = null + + /** + * 同步Bus路线信息 + */ + fun syncTrajectoryInfo(lineId: Int) { + mLineId = lineId + val routesResult = get().getBusRoutesResult() + if (LoginStatusUtil.isLogin() && routesResult != null) { + d(SceneConstant.M_CHARTER_D + TAG, "syncTrajectoryInfo() start.") + startTrajReqLoop() + } else { + // 无路线信息or当前未在始发站 + d(SceneConstant.M_CHARTER_D + TAG, "syncTrajectoryInfo() stop.") + stopTrajReqLoop() + } + } + + /** + * 接口MEC反馈的常规信息(MAP v2.5.0新增轨迹相关信息) + * @param guardianInfo + */ + fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { + if (guardianInfo == null || !guardianInfo.hasCode()) return + if ("ISYS_INIT_TRAJECTORY_START" == guardianInfo.code) { + // 1. 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发) + d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() 轨迹开始下载") + // ToastUtils.showShort("轨迹开始下载"); + stopTrajReqLoop() + } else if ("ISYS_INIT_TRAJECTORY_SUCCESS" == guardianInfo.code) { + // 2. 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发) + d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() 轨迹下载成功") + // ToastUtils.showShort("轨迹下载成功"); + stopTrajReqLoop() + } else if ("ISYS_INIT_TRAJECTORY_FAILURE" == guardianInfo.code) { + // 3. 轨迹管理_轨迹下载失败,本地无对应轨迹 + d( + SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() " + + "轨迹下载失败,本地无对应轨迹" + ) + // ToastUtils.showShort("轨迹下载失败,本地无对应轨迹"); + } else if ("ISYS_INIT_TRAJECTORY_WARNING" == guardianInfo.code) { + // 4. 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功 + d( + SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() " + + "轨迹下载失败,本地有对应轨迹,认为成功" + ) + // ToastUtils.showShort("轨迹下载失败,本地有对应轨迹,认为成功"); + } else if ("ISYS_INIT_TRAJECTORY_TIMEOUT" == guardianInfo.code) { + // 5. 轨迹管理_轨迹下载超时 + d(SceneConstant.M_CHARTER_D + TAG, "onAutopilotGuardian() 轨迹下载超时") + // ToastUtils.showShort("轨迹下载超时"); + } + } + + private fun setupAutoPilotLine() { + val routesResult = get().getBusRoutesResult() + if (routesResult == null) { + e( + SceneConstant.M_CHARTER_D + TAG, + "setupAutoPilotLine(): routesResult is null." + ) + return + } else { + if (mAutoPilotLine == null) { + mAutoPilotLine = AutoPilotLine( + mLineId.toLong(), + routesResult.csvFileUrl, routesResult.csvFileMd5, + routesResult.txtFileUrl, routesResult.txtFileMd5, + routesResult.contrailSaveTime, routesResult.carModel, + routesResult.csvFileUrlDPQP, routesResult.csvFileMd5DPQP, + routesResult.txtFileUrlDPQP, routesResult.txtFileMd5DPQP, + routesResult.contrailSaveTimeDPQP + ) + } else { + mAutoPilotLine!!.lineId = mLineId.toLong() + mAutoPilotLine!!.trajUrl = routesResult.csvFileUrl + mAutoPilotLine!!.trajMd5 = routesResult.csvFileMd5 + mAutoPilotLine!!.stopUrl = routesResult.txtFileUrl + mAutoPilotLine!!.stopMd5 = routesResult.txtFileMd5 + mAutoPilotLine!!.timestamp = routesResult.contrailSaveTime + mAutoPilotLine!!.vehicleModel = routesResult.carModel + mAutoPilotLine!!.trajUrl_dpqp = routesResult.csvFileUrlDPQP + mAutoPilotLine!!.trajMd5_dpqp = routesResult.csvFileMd5DPQP + mAutoPilotLine!!.stopUrl_dpqp = routesResult.txtFileUrlDPQP + mAutoPilotLine!!.stopMd5_dpqp = routesResult.txtFileMd5DPQP + mAutoPilotLine!!.timestamp_dpqp = routesResult.contrailSaveTimeDPQP + } + } + } + + private fun clearAutoPilotLine() { + if (mAutoPilotLine == null) return + mAutoPilotLine!!.lineId = -1 + mAutoPilotLine!!.trajUrl = "" + mAutoPilotLine!!.trajMd5 = "" + mAutoPilotLine!!.stopUrl = "" + mAutoPilotLine!!.stopMd5 = "" + mAutoPilotLine!!.timestamp = 0 + mAutoPilotLine!!.vehicleModel = "" + mAutoPilotLine!!.trajUrl_dpqp = "" + mAutoPilotLine!!.trajMd5_dpqp = "" + mAutoPilotLine!!.stopUrl_dpqp = "" + mAutoPilotLine!!.stopMd5_dpqp = "" + mAutoPilotLine!!.timestamp_dpqp = 0 + } + + private fun startTrajReqLoop() { + if (mSendReqDisposable != null && !mSendReqDisposable!!.isDisposed) { + return + } + d(SceneConstant.M_CHARTER_D + TAG, "startTrajReqLoop()") + setupAutoPilotLine() + mSendReqDisposable = Observable.interval( + CharterConst.LOOP_DELAY, + CharterConst.LOOP_PERIOD_10S, TimeUnit.MILLISECONDS + ) + .map(Function { aLong: Long -> aLong + 1 }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { aLong: Long -> + if (aLong > CharterConst.LOOP_SEND_TRAJ_TIMES) { + stopTrajReqLoop() + return@subscribe + } + d( + SceneConstant.M_CHARTER_D + TAG, + "loop sendTrajectoryReq: $aLong" + ) + sendTrajectoryReq() + } + } + + fun stopTrajReqLoop() { + if (mSendReqDisposable != null) { + d(SceneConstant.M_CHARTER_D + TAG, "stopTrajReqLoop()") + mSendReqDisposable!!.dispose() + mSendReqDisposable = null + clearAutoPilotLine() + } + } + + private fun sendTrajectoryReq() { + if (mAutoPilotLine == null) { + e(SceneConstant.M_CHARTER_D + TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!") + return + } + + // TODO: 2022/6/24 + // test1 +// mAutoPilotLine.setLineId(148); +// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/e27c20c2da32481021d934c3ef084536/traj_148.csv"); +// mAutoPilotLine.setTrajMd5("e27c20c2da32481021d934c3ef084536"); +// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/6224c9dd2c0e2bd990c6482c0464de45/stop_148.txt"); +// mAutoPilotLine.setStopMd5("6224c9dd2c0e2bd990c6482c0464de45"); +// mAutoPilotLine.setTimestamp(1654596000000L); //20220607 18:00 +// mAutoPilotLine.setVehicleModel("红旗H9"); + + // test2 +// mAutoPilotLine.setLineId(148); +// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/8654497cf918be461a59c7ad8e22920d/traj_148.csv"); +// mAutoPilotLine.setTrajMd5("8654497cf918be461a59c7ad8e22920d"); +// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/1bb098b244922649bf3e7bada0d3950f/stop_148.txt"); +// mAutoPilotLine.setStopMd5("1bb098b244922649bf3e7bada0d3950f"); +// mAutoPilotLine.setTimestamp(1654761600000L); //20220609 16:00 +// mAutoPilotLine.setVehicleModel("红旗H9"); + sendTrajectoryDownloadReq(mAutoPilotLine!!) + d( + SceneConstant.M_CHARTER_D + TAG, + "sendTrajectoryReq(): " + + GsonUtils.toJson(mAutoPilotLine) + ) + } + + init { + mAutoPilotLine = AutoPilotLine( + -1, + "", "", "", "", 0, "", + "", "", "", "", 0 + ) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 159e276423..6b036fe6e1 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -6,11 +6,11 @@ import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.utils.TextUtils import com.amap.api.maps.model.LatLng import com.elegant.network.utils.GsonUtil -import com.magic.mogo.och.charter.CharterAnalyticsManager -import com.magic.mogo.och.charter.CharterSendTripInfoManager -import com.magic.mogo.och.charter.CharterSendTripInfoManager.ARRIVE_STATION -import com.magic.mogo.och.charter.CharterSendTripInfoManager.END_TRIP -import com.magic.mogo.och.charter.CharterSendTripInfoManager.START_TRIP +import com.magic.mogo.och.charter.manager.CharterAnalyticsManager +import com.magic.mogo.och.charter.manager.CharterSendTripInfoManager +import com.magic.mogo.och.charter.manager.CharterSendTripInfoManager.ARRIVE_STATION +import com.magic.mogo.och.charter.manager.CharterSendTripInfoManager.END_TRIP +import com.magic.mogo.och.charter.manager.CharterSendTripInfoManager.START_TRIP import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.bean.CheckOrderCountDownResponse import com.magic.mogo.och.charter.bean.QueryBusinessStatusResponse @@ -20,6 +20,7 @@ import com.magic.mogo.och.charter.callback.ChangeDestCallback import com.magic.mogo.och.charter.callback.DriverM1OrderCallback import com.magic.mogo.och.charter.callback.IDriverM1ControllerStatusCallback import com.magic.mogo.och.charter.constant.CharterConst +import com.magic.mogo.och.charter.manager.CharterTrajectoryManager import com.magic.mogo.och.charter.net.DriverM1ServiceManager import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.commons.module.intent.IMogoIntentListener @@ -701,6 +702,7 @@ class DriverM1Model { d(SceneConstant.M_CHARTER_D + TAG, "checkoutContrail-==" + GsonUtils.toJson(data.data)) mCurrentRoute = data.data + CharterTrajectoryManager.syncTrajectoryInfo(mCurrentOrder?.lineId!!) } override fun onFail(code: Int, msg: String?) { @@ -714,4 +716,10 @@ class DriverM1Model { if (isArrivedStation) return onArriveAt() } + + fun getBusRoutesResult(): QueryRoutesResponse.Result?{ + if (mCurrentOrder == null) return null + + return mCurrentRoute + } } \ No newline at end of file diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt index 1393aaf830..cf23dc8ca3 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt @@ -1,13 +1,13 @@ package com.magic.mogo.och.charter.presenter import androidx.lifecycle.LifecycleOwner -import com.magic.mogo.och.charter.CharterAnalyticsManager import com.magic.mogo.och.charter.R import com.magic.mogo.och.charter.bean.QueryCurrentOrderResponse import com.magic.mogo.och.charter.callback.ChangeDestCallback import com.magic.mogo.och.charter.callback.DriverM1OrderCallback import com.magic.mogo.och.charter.callback.IDriverM1ControllerStatusCallback import com.magic.mogo.och.charter.fragment.DriverM1Fragment +import com.magic.mogo.och.charter.manager.CharterTrajectoryManager import com.magic.mogo.och.charter.model.DriverM1Model import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo @@ -19,10 +19,12 @@ import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean import com.mogo.och.common.module.biz.callback.ILoginCallback import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.OPERATION_ROAD_SIDE_TYPE +import com.mogo.och.common.module.biz.constant.LoginStatusManager import com.mogo.och.common.module.biz.constant.LoginStatusManager.isLogin import com.mogo.och.common.module.manager.OCHPlanningStopSideStatusManager import com.mogo.och.common.module.utils.DateTimeUtil import mogo.telematics.pad.MessagePad +import mogo_msg.MogoReportMsg /** * @author: wangmingjun @@ -66,8 +68,12 @@ class DriverM1Presenter(view: DriverM1Fragment?) : override fun loginSuccess(data: DriverStatusQueryRespBean?) { d(SceneConstant.M_BUS + TAG, " loginStatus =" + isLogin()) - // 查询服务状态 - DriverM1Model.get().queryCurrentServiceStatus() + if(isLogin()){ + // 查询服务状态 + DriverM1Model.get().queryCurrentServiceStatus() + }else{ + CharterTrajectoryManager.stopTrajReqLoop() + } } override fun loginFail(isLogin: Boolean) { @@ -119,6 +125,10 @@ class DriverM1Presenter(view: DriverM1Fragment?) : ,context.getString(R.string.last_5_minutes)) } + override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { + CharterTrajectoryManager.onAutopilotGuardian(guardianInfo) + } + override fun onAutopilotArriveAtStation(arrivalNotification: MessagePad.ArrivalNotification?) { DriverM1Model.get().onAutopilotArriveAtStation() } diff --git a/OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_ai_collect.png b/OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_ai_collect.png new file mode 100755 index 0000000000000000000000000000000000000000..6da7b81fe4bd078bc5026bfced41ba306b6f30d0 GIT binary patch literal 7627 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_bad_case.png b/OCH/mogo-och-charter/src/main/res/drawable-xhdpi/icon_bad_case.png new file mode 100755 index 0000000000000000000000000000000000000000..22f88301f979cdec76a499f0a717df7cb7d4aad4 GIT binary patch literal 7039 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml b/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml index 9d79f5934a..f9d1e84554 100644 --- a/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml +++ b/OCH/mogo-och-charter/src/main/res/layout/charter_base_fragment.xml @@ -273,7 +273,7 @@ android:layout_height="@dimen/dp_80" android:layout_centerInParent="true" android:layout_gravity="center" - android:src="@drawable/bad_case_selector" /> + android:src="@drawable/icon_bad_case" /> + android:src="@drawable/icon_ai_collect" />