From 38ca77161be73baabd5f1d9da4eb30a776339103 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Thu, 24 Aug 2023 20:33:51 +0800 Subject: [PATCH] =?UTF-8?q?[Taxi=E6=97=A0=E4=BA=BA=E5=8C=96]=20refactor:?= =?UTF-8?q?=20TaxiModel=20TaxiViewModel=20=E4=BC=98=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/taxi/bean/UnmannedTaskBean.kt | 67 +++- .../och/taxi/callback/ITaxiTaskCallback.kt | 14 + .../constant/TaxiCarServingStatusManager.kt | 48 +++ .../och/taxi/constant/TaxiUnmannedConst.kt | 13 +- .../taxi/constant/TaxtServingStatusManager.kt | 38 -- .../TaxiTaskWithOrderServiceManager.kt | 18 +- .../mogo/och/taxi/ui/base/TaxiPresenter.java | 6 +- .../taxi/ui/task/TaxiCurrentTaskFragment.kt | 3 +- .../taxi/ui/task/TaxiCurrentTaskViewModel.kt | 374 ++++-------------- .../mogo/och/taxi/ui/task/TaxiTaskModel.kt | 333 ++++++++++++---- 10 files changed, 490 insertions(+), 424 deletions(-) create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiCarServingStatusManager.kt delete mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt index 0fa7a3470a..0673676bb9 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/UnmannedTaskBean.kt @@ -46,8 +46,12 @@ data class OrderDetail( } data class Site( - var siteId: Long, var siteName: String, var gcjLat: Double, var gcjLon: Double, - var wgs84Lon: Double, var wgs84Lat: Double + var siteId: Long, + var siteName: String, + var gcjLat: Double, + var gcjLon: Double, + var wgs84Lon: Double, + var wgs84Lat: Double ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -67,12 +71,16 @@ data class Site( data class QueryCurrentTaskRespBean(var data: Result?) : BaseData() { data class Result( - var sn: String, var lineId: Long, var servingStatus: Int, - var currentStatus: Int, var taskType: Int, - var startSite: Site?, var endSite: Site?, + var sn: String, + var lineId: Long, + var servingStatus: Int, + var currentStatus: Int, + var taskType: Int, + var startSite: Site?, + var endSite: Site?, var order: OrderDetail? ) { - // servingStatus = 0 //暂停接单 = 1 //开始接单 + //servingStatus = 0 //暂停接单 = 1 //开始接单 //taskType = 1 //虚拟任务 = 2 //接驾任务 = 3 //送驾任务 //currentStatus 0:空闲 1:获取任务 2:开始任务 3:到达目的地 override fun equals(other: Any?): Boolean { @@ -119,6 +127,19 @@ data class QueryCurrentTaskRespBean(var data: Result?) : BaseData() { } return data.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code } + + /** + * with order.orderStatus == ArriveAtStart + */ + fun isOrderArriveAtStart(data: QueryCurrentTaskRespBean.Result?): Boolean { + if (data == null) { + return false + } + if (data.order == null) { + return false + } + return data.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtStart.code + } } } @@ -128,8 +149,11 @@ data class ArriveSiteReqBean(var sn: String, var siteId: Long) data class PrepareTaskReqBean(var sn: String, var siteId: Long) data class PrepareTaskRespBean(var data: Result?) : BaseData() { //taskType 1:虚拟任务 2:接驾任务3:送驾任务 data class Result( - var lineId: Long, var cityCode: Int, var taskType: Int, - var startSite: Site, var endSite: Site + var lineId: Long, + var cityCode: Int, + var taskType: Int, + var startSite: Site, + var endSite: Site ) } @@ -139,9 +163,14 @@ data class OrderCompletedReqBean(var sn: String, var orderNo: String) data class QueryCarOrderByNoReqBean(var sn: String, var orderNo: String) data class QueryCarOrderByNoRespBean(var data: Result) : BaseData() { data class Result( - var sn: String, var orderNo: String, var orderStatus: Int, - var bookingUserPhone: String, var businessType: String, - var mileage: Float, var duration: Float, var passengerSize: Int + var sn: String, + var orderNo: String, + var orderStatus: Int, + var bookingUserPhone: String, + var businessType: String, + var mileage: Float, + var duration: Float, + var passengerSize: Int ) } @@ -150,10 +179,18 @@ data class QueryCarOrderByNoRespBean(var data: Result) : BaseData() { */ data class TrajectoryListRespBean(var data: MutableList?) : BaseData() { data class Result( - var lineId: Long, var lineName: String, var csvFileUrl: String, var csvFileMd5: String, - var txtFileUrl: String, var txtFileMd5: String, var contrailSaveTime: Long, - var csvFileUrlDPQP: String, var csvFileMd5DPQP: String, var txtFileUrlDPQP: String, - var txtFileMd5DPQP: String, var contrailSaveTimeDPQP: Long + var lineId: Long, + var lineName: String, + var csvFileUrl: String, + var csvFileMd5: String, + var txtFileUrl: String, + var txtFileMd5: String, + var contrailSaveTime: Long, + var csvFileUrlDPQP: String, + var csvFileMd5DPQP: String, + var txtFileUrlDPQP: String, + var txtFileMd5DPQP: String, + var contrailSaveTimeDPQP: Long ) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt new file mode 100644 index 0000000000..ea36b2d54c --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskCallback.kt @@ -0,0 +1,14 @@ +package com.mogo.och.taxi.callback + +import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean +import com.mogo.och.taxi.bean.TrajectoryListRespBean + +interface ITaxiTaskCallback { + fun onTaskWithOrderDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) + fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long) + fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) + fun onOrderCancel() + fun onOrderArriveAtEnd(orderNo: String) + fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int) + fun onOrderJourneyCompleted() +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiCarServingStatusManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiCarServingStatusManager.kt new file mode 100644 index 0000000000..d90f12096f --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiCarServingStatusManager.kt @@ -0,0 +1,48 @@ +package com.mogo.och.taxi.constant + +/** + * 车当前的 接单 状态管理类 + */ +object TaxiCarServingStatusManager { + + /** + * 接单状态 + */ + private var currentCarServingStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None + + /** + * 是否可接单状态 + */ + @JvmStatic + fun isCarServingStatus(): Boolean { + if (currentCarServingStatus == TaxiOpenOrderStatusEnum.Ordering) { + return true + } + return false + } + + /** + * 设置当前的接单状态 + */ + @JvmStatic + fun setCarServingStatus(status: Int) { + when (status) { + 0 -> { + this.currentCarServingStatus = TaxiOpenOrderStatusEnum.UnOrdering + } + + 1 -> { + this.currentCarServingStatus = TaxiOpenOrderStatusEnum.Ordering + } + + else -> { + this.currentCarServingStatus = TaxiOpenOrderStatusEnum.None + } + } + } + + @JvmStatic + fun getCurrentCarServingStatus(): TaxiOpenOrderStatusEnum { + return currentCarServingStatus + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiUnmannedConst.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiUnmannedConst.kt index 05f225fa84..4d463a580c 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiUnmannedConst.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxiUnmannedConst.kt @@ -16,16 +16,20 @@ class TaxiUnmannedConst { // 上报心跳轮询ms const val LOOP_PERIOD_60S = 60 * 1000L + // 开始服务启动自动驾驶等待时间(埋点上传) const val LOOP_PERIOD_15S = 15 * 1000L + // 轮询查询进行中/待服务订单的间隔时间 2秒 const val LOOP_PERIOD_2S = 2 * 1000L + // 轮询查询新到预约单 1秒 const val LOOP_PERIOD_1S = 1 * 1000L const val LOOP_DELAY = 100L // 下发给MEC轨迹信息间隔时间 10秒 - const val LOOP_PERIOD_10S = 10 * 1000L + const val LOOP_PERIOD_10S = 10 * 1000L + // 尝试下发给MEC轨迹最多10次 const val LOOP_SEND_TRAJ_TIMES = 10 @@ -34,6 +38,7 @@ class TaxiUnmannedConst { //起点UUID const val TAXI_START_MAP_MAKER = "taxi_start_map_maker" + //终点UUID const val TAXI_END_MAP_MAKER = "taxi_end_map_maker" @@ -43,6 +48,7 @@ class TaxiUnmannedConst { // 埋点key:接管后点击'自动驾驶'按钮启动 const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_taxi_restart_autopilot" + // 埋点key:开始服务开启自动驾驶(成功/失败) const val EVENT_KEY_START_SERVICE = "event_key_och_taxi_start_service" const val EVENT_PARAM_SN = "sn" @@ -56,6 +62,7 @@ class TaxiUnmannedConst { const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因 const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false + // 埋点key:开启自动驾驶前已识别的异常,会导致无法开启自驾 const val EVENT_KEY_AP_UNABLE_START_REASON = "event_key_och_taxi_ap_unable_start_reason" const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason"; @@ -73,9 +80,9 @@ class TaxiUnmannedConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L - const val TIMER_PREPARE_TASK_INTERVAL = 120 * 1000L //120s再次获取任务 + const val TIMER_PREPARE_TASK_INTERVAL_120S = 120 * 1000L //120s再次获取任务 - const val COUNTDOWN_INTERVAL = 10 * 1000L // 自动启动自驾倒数计时 + const val START_AUTOPILOT_COUNTDOWN_INTERVAL = 10 * 1000L // 自动启动自驾倒数计时 const val START_AUTOPILOT_ANIMATION_INTERVAL = 12 * 1000L // 12s 开启自驾闪烁动画 diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt deleted file mode 100644 index 7a42236e8b..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.mogo.och.taxi.constant - -object TaxtServingStatusManager { - - /** - * 接单状态 - */ - private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None - - // region 是否可用接单 - @JvmStatic - fun isOpeningOrderStatus():Boolean{ - if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ - return true - } - return false - } - @JvmStatic - fun setOpenOrderStatus(status: Int) { - when (status) { - 0 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering - } - 1 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering - } - else -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.None - } - } - } - @JvmStatic - fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { - return openOrderStatus - } - - //endregion -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt index f09fadd936..c5a4d65552 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiTaskWithOrderServiceManager.kt @@ -8,7 +8,19 @@ import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl import com.mogo.och.common.module.biz.network.interceptor.transformTry -import com.mogo.och.taxi.bean.* +import com.mogo.och.taxi.bean.ArriveSiteReqBean +import com.mogo.och.taxi.bean.CancelOrderReqBean +import com.mogo.och.taxi.bean.JumpPassengerCheckReqBean +import com.mogo.och.taxi.bean.OrderCompletedReqBean +import com.mogo.och.taxi.bean.PrepareTaskReqBean +import com.mogo.och.taxi.bean.PrepareTaskRespBean +import com.mogo.och.taxi.bean.QueryCarOrderByNoReqBean +import com.mogo.och.taxi.bean.QueryCarOrderByNoRespBean +import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean +import com.mogo.och.taxi.bean.StartServiceReqBean +import com.mogo.och.taxi.bean.StartServiceRespBean +import com.mogo.och.taxi.bean.StartTaskReqBean +import com.mogo.och.taxi.bean.TrajectoryListRespBean /** * Created by pangfan on 2021/8/19 @@ -160,10 +172,10 @@ object TaxiTaskWithOrderServiceManager { } /** - * 批量获取轨迹信息 + * 批量查询轨迹信息 */ @JvmStatic - fun contrailList( + fun queryTrajectoryByLindIds( context: Context, linIds: Array, callback: OchCommonServiceCallback? ) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java index 314db45f7a..388eb365dc 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java @@ -19,7 +19,7 @@ import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.constant.TaxiUnmannedConst; -import com.mogo.och.taxi.constant.TaxtServingStatusManager; +import com.mogo.och.taxi.constant.TaxiCarServingStatusManager; import com.mogo.och.taxi.ui.task.TaxiTaskModel; /** @@ -180,7 +180,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS @Override public void loginSuccess(DriverStatusQueryRespBean data) { //设置 接单状态 - TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus); + TaxiCarServingStatusManager.setCarServingStatus(data.data.servingStatus); // 设置当前用户角色 String role = ""; @@ -191,7 +191,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } String finalRole = role; runOnUIThread(() -> { - mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole); + mView.updateOperationStatus(TaxiCarServingStatusManager.isCarServingStatus(), finalRole); }); if (!TaxiTaskModel.INSTANCE.checkCurrentTaskCondition()) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt index e311ee7280..767acbf4e7 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskFragment.kt @@ -37,7 +37,6 @@ import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_MAP_MAKER import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.TAXI_START_MAP_MAKER import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.TYPE_MARKER_TAXI_ORDER import com.mogo.och.taxi.ui.base.TaxiFragment -import com.mogo.och.taxi.ui.task.TaxiTaskModel import com.mogo.och.taxi.ui.unmanned.TaskWithOrderUIState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import com.mogo.och.taxi.utils.MapMakerManager @@ -706,7 +705,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } override fun onDestroy() { - mViewModel.startOrStopOrderLoop(false) + mViewModel.startOrStopCurrentTaskWithOrderLoop(false) super.onDestroy() } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt index 514f9f196e..da3f9dd823 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -1,18 +1,14 @@ package com.mogo.och.taxi.ui.task -import android.annotation.SuppressLint import android.content.Context import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -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.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.ToastUtilsOch @@ -20,43 +16,34 @@ import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.taxi.R import com.mogo.och.taxi.base.BaseViewModel import com.mogo.och.taxi.base.IUiIntent -import com.mogo.och.taxi.bean.TrajectoryListRespBean -import com.mogo.och.taxi.bean.PrepareTaskRespBean -import com.mogo.och.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.StartServiceRespBean +import com.mogo.och.taxi.bean.TrajectoryListRespBean +import com.mogo.och.taxi.callback.ITaxiTaskCallback import com.mogo.och.taxi.constant.TaskStatusEnum -import com.mogo.och.taxi.constant.TaskTypeEnum -import com.mogo.och.taxi.constant.TaxiOrderStatusEnum -import com.mogo.och.taxi.constant.TaxiUnmannedConst -import com.mogo.och.taxi.constant.TaxtServingStatusManager.isOpeningOrderStatus +import com.mogo.och.taxi.constant.TaxiCarServingStatusManager.isCarServingStatus import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.cancelOrder -import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.contrailList -import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager.queryCarOrderByOrderNo -import com.mogo.och.taxi.ui.task.TaxiTaskModel import com.mogo.och.taxi.ui.unmanned.TaskWithOrderUIState import com.mogo.och.taxi.ui.unmanned.UnmannedIntent import com.mogo.och.taxi.ui.unmanned.UnmannedState -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 +import com.mogo.och.taxi.utils.TaxiTrajectoryManager /** * @author: wangmingjun * @date: 2023/7/26 */ -class TaxiCurrentTaskViewModel : BaseViewModel() { +class TaxiCurrentTaskViewModel : BaseViewModel(), ITaxiTaskCallback { - private var mInAndWaitServiceDisposable: Disposable? = null //进行中、待服务订单列表轮询 private var mCurrentTaskAndOrder: QueryCurrentTaskRespBean.Result? = null - private val TAG = "TaxiUnmannedViewModel" + private val TAG = SceneConstant.M_TAXI + "_TaxiUnmannedViewModel" - @SuppressLint("StaticFieldLeak") private var mContext: Context = AbsMogoApplication.getApp().applicationContext + init { + TaxiTaskModel.setTaskCallback(this) + } + override fun initUiState(): UnmannedState { return UnmannedState(TaskWithOrderUIState.Init) } @@ -64,11 +51,11 @@ class TaxiCurrentTaskViewModel : BaseViewModel() override fun handleIntent(intent: IUiIntent) { when (intent) { is UnmannedIntent.StartTaskOrOrderLooper -> { //开始轮询 - startOrStopOrderLoop(true) + startOrStopCurrentTaskWithOrderLoop(true) } is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单 - updateCarStatus() + updateCarServingStatus() } is UnmannedIntent.JumpPassengerCheckDone -> { //手动点击跳过乘客验证 @@ -98,7 +85,9 @@ class TaxiCurrentTaskViewModel : BaseViewModel() private fun handleCancelOrder(cancelType: Int) { if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) { - cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo, cancelType, + cancelOrder(mContext, + mCurrentTaskAndOrder!!.order!!.orderNo, + cancelType, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess") @@ -107,7 +96,6 @@ class TaxiCurrentTaskViewModel : BaseViewModel() override fun onFail(code: Int, msg: String?) { d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg") } - }) } } @@ -115,30 +103,27 @@ class TaxiCurrentTaskViewModel : BaseViewModel() /** * 更新接单状态 */ - private fun updateCarStatus() { + private fun updateCarServingStatus() { if (!isLogin()) { TaxiTaskModel.loginService!!.queryLoginStatusByNet() return } - if (isOpeningOrderStatus()) {//接单状态下,去结束 - TaxiTaskWithOrderServiceManager.endService(mContext, + if (isCarServingStatus()) {//接单状态下,去结束 + TaxiTaskWithOrderServiceManager.endService( + mContext, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { TaxiTaskModel.loginService!!.queryLoginStatusByNet() //需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的 d(TAG, "set mUntruthSiteTask null") updateDriveToNearestStationTaskUI(null) - updateUntruthTask(null) + TaxiTaskModel.updateUntruthTask(null) - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null - && mCurrentTaskAndOrder!!.startSite != null - && mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code - ) { + if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null && mCurrentTaskAndOrder!!.startSite != null && mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code) { VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦") } else { VoiceNotice.showNotice("暂停接单啦") } - } override fun onError() { @@ -152,9 +137,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel() override fun onFail(code: Int, msg: String) { ToastUtilsOch.showWithCodeMessage(code, msg) } - }) - } else {//暂停接单状态下,去接单 TaxiTaskWithOrderServiceManager.startService(mContext, CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude, @@ -167,9 +150,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel() d(TAG, "data.data=" + GsonUtil.jsonFromObject(data.data)) if (mCurrentTaskAndOrder == null) return if (mCurrentTaskAndOrder!!.endSite != null) { - if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.CompleteTask.code - && mCurrentTaskAndOrder!!.order != null - ) { //有任务, 状态为3, 且有订单 + if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.CompleteTask.code && mCurrentTaskAndOrder!!.order != null) { //有任务, 状态为3, 且有订单 return } else if (mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code) { //有任务, 并且未执行完成 @@ -177,14 +158,13 @@ class TaxiCurrentTaskViewModel : BaseViewModel() } } updateDriveToNearestStationTaskUI(data.data) - updateUntruthTask(data.data) + TaxiTaskModel.updateUntruthTask(data.data) } override fun onFail(code: Int, msg: String?) { ToastUtilsOch.showWithCodeMessage( code, - "$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + - " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}" + "$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}" ) } @@ -231,13 +211,13 @@ class TaxiCurrentTaskViewModel : BaseViewModel() } } - private fun updateUntruthTask(result: StartServiceRespBean.Result?) { - TaxiTaskModel.updateUntruthTask(result) - } - private fun updateTaskAndOrderUi() { - d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi") - + d( + TAG, + "updateTaskAndOrderUi: mCurrentTaskAndOrder=${ + GsonUtil.getGson().toJson(mCurrentTaskAndOrder) + }" + ) sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( @@ -258,257 +238,67 @@ class TaxiCurrentTaskViewModel : BaseViewModel() } } - private fun updateNoTaskWithOrderUI() { - sendUiState { - copy( - taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( - null, - ) - ) - } - } - - fun startOrStopOrderLoop(start: Boolean) { - d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $start") - if (start) { - startInAndWaitCurrentTaskLoop() - } else { - stopInAndWaitCurrentTaskLoop() - } - } - - private fun queryCurrentTaskOnce() { - if (!LoginStatusManager.isLogin()) return // 未登陆则不去查询 - TaxiTaskWithOrderServiceManager.queryCurrentTask(AbsMogoApplication.getApp().applicationContext, - object : OchCommonServiceCallback { - override fun onSuccess(data: QueryCurrentTaskRespBean?) { - if (data === null) return - if (data.data === null) return - if (data.code != 0) return - - val result = data.data - - d(TAG, "queryCurrentTaskOnce = result = " + GsonUtil.jsonFromObject(result)) - - d( - TAG, - "queryCurrentTaskOnce = mCurrentTaskAndOrder = " + GsonUtil.jsonFromObject( - mCurrentTaskAndOrder - ) - ) - - - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null && - result != null && result.order == null - ) { - //本地根据订单 orderNo 去查询下(乘客取消订单) - d( - TAG, - "queryCurrentTaskOnce1 = result order is empty, query order by orderNo!" - ) - queryCurrentOrderStatusByNo(mCurrentTaskAndOrder!!.order!!.orderNo) - return - } - - //订单或者伪任务更新, 都去刷新下界面 - if (mCurrentTaskAndOrder == null || !mCurrentTaskAndOrder!!.equals(result)) { - d(TAG, "queryCurrentTaskOnce1 = mCurrentTaskAndOrder update ") - if (result == null) return - - if (result.endSite == null && result.order == null) { - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - TaxiTaskModel.updateCurrentTaskAndOrder(null) - } - - //当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行 - if (result.currentStatus == TaskStatusEnum.CompleteTask.code) { - if (result.order != null && result.order!!.orderStatus - == TaxiOrderStatusEnum.ArriveAtStart.code - ) { - pullTask(result.endSite!!.siteId) - d(TAG, "queryCurrentTaskOnce1 = pullTask") - - } else { - startPrepareTask120S(result.endSite!!.siteId) - d(TAG, "queryCurrentTaskOnce1 = startPrepareTask120S") - - } - } - - mCurrentTaskAndOrder = result - TaxiTaskModel.updateCurrentTaskAndOrder(result) - TaxiTaskModel.updateStation() - updateTaskAndOrderUi() - if (result.order != null && result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) { - d(TAG, "queryCurrentTaskOnce1 = ArriveAtEnd query mileage and duration") - queryCurrentOrderStatusByNo(result.order!!.orderNo) //查询全程里程和用时,更新 - } - - //根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合,没有送驾任务 - if (result.order != null && result.order!!.orderStatus <= TaxiOrderStatusEnum.OnTheWayToEnd.code) { - var lines = result.order!!.planningLines - lines = lines.plus(result.order!!.orderLine) - d(TAG, "queryCurrentTaskOnce1 = by lineIds query Contrails") - queryOrderPickUpContrails(lines) - } - - if (result.currentStatus <= TaskStatusEnum.StartTask.code) {//任务执行中, 去加载下轨迹 - d(TAG, "queryCurrentTaskOnce1 = by lineId query Contrail") - TaxiTaskModel.queryTaskContrail(Array(1) { result.lineId }) - } - - if (result.taskType <= TaskTypeEnum.ToOrderStartTask.code - && result.currentStatus == TaskStatusEnum.GetTask.code - ) {//自动去启动自驾 - if (!(result.order != null && result.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)) { - d(TAG, "queryCurrentTaskOnce1 = autoStartDriving") - TaxiTaskModel.autoStartDriving() - return - } - } - } - } - - override fun onFail(code: Int, msg: String?) { - d(TAG, "queryCurrentTaskOnce = $code, $msg") - } - - }) - } - - /** - * 查询送驾任务轨迹集合 - * 注: 运营单刚来的时候, 有可能还在运行一个演练任务, 要先跑完演练任务才跑运营单 - */ - private fun queryOrderPickUpContrails(planningLines: Array?) { - if (planningLines == null) return - contrailList(mContext, planningLines, - object : OchCommonServiceCallback { - override fun onSuccess(data: TrajectoryListRespBean?) { - if (data == null || data.code != 0) return - val contrails = data.data - if (mCurrentTaskAndOrder != null) { - TaxiTaskModel.updateOrderContrails(contrails) - } - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "queryOrderContrail code=$code,msg=$msg") - } - - }) - } - - private fun queryCurrentOrderStatusByNo(orderNo: String) { - queryCarOrderByOrderNo(mContext, orderNo, - object : OchCommonServiceCallback { - override fun onSuccess(data: QueryCarOrderByNoRespBean?) { - d( - SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo data = " + - GsonUtil.jsonFromObject(data) - ) - if (data == null || data.code != 0) return - if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code) { - VoiceNotice.showNotice("乘客已经取消") - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - //2020.8.23 到站后不再调用取消自驾. 原因是取消自驾,D档位会溜车 -// TaxiModel.cancelAutopilot() - return - } - if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) {//到站 - //结束导航 - updateOrderMileAndDur(data.data.mileage, data.data.duration.toInt()) - return - } - if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code) {//完成 - //获取新的任务 - if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null) { - startPrepareTask120S(mCurrentTaskAndOrder!!.endSite!!.siteId) - } - mCurrentTaskAndOrder = null - updateNoTaskWithOrderUI() - return - } - } - - override fun onFail(code: Int, msg: String?) { - d( - SceneConstant.M_TAXI + TAG, - "queryCurrentOrderStatusByNo() code=$code,msg=$msg" - ) - } - - }) - } - - private fun updateOrderMileAndDur(mileage: Float, duration: Int) { - d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi") - + private fun updateOrderTotalMileAndDurationUI(mileage: Float, duration: Int) { + d(TAG, "updateOrderTotalMileAndDurationUI") sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo( - mileage, - duration + mileage, duration ) ) } } - private fun startPrepareTask120S(siteId: Long) { - UiThreadHandler.postDelayed({ - pullTask(siteId) - }, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL) - } - - private fun pullTask(siteId: Long) { - TaxiTaskWithOrderServiceManager.prepareTask( - mContext, - siteId, - object : OchCommonServiceCallback { - override fun onSuccess(data: PrepareTaskRespBean?) { - d( - SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data) - + ", isOpeningOrderStatus = ${isOpeningOrderStatus()}" - ) - if (data?.data == null || data.code != 0) return - //去下载轨迹, 下发给工控机下载 - TaxiTaskModel.queryTaskContrail(Array(1) { data.data!!.lineId }) - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "$code $msg") - if (isLogin() && isOpeningOrderStatus()) { - startPrepareTask120S(siteId) //失败后30s再次调用获取下一任务 - } - } - - }) - } - - - private fun startInAndWaitCurrentTaskLoop() { - if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable!!.isDisposed) { - return - } - i(SceneConstant.M_TAXI + TAG, "startInAndWaitOrdersLoop()") - mInAndWaitServiceDisposable = Observable.interval( - TaxiUnmannedConst.LOOP_DELAY, - TaxiUnmannedConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS - ) - .map { aLong: Long -> aLong + 1 } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { queryCurrentTaskOnce() } - } - - private fun stopInAndWaitCurrentTaskLoop() { - if (mInAndWaitServiceDisposable != null) { - i(SceneConstant.M_TAXI + TAG, "stopInAndWaitOrdersLoop()") - mInAndWaitServiceDisposable!!.dispose() - mInAndWaitServiceDisposable = null + fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) { + d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start") + if (start) { + TaxiTaskModel.startQueryCurrentTaskWithOrderLoop() + } else { + TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop() } } + override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { + if (result === null) return + d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) + mCurrentTaskAndOrder = result + updateTaskAndOrderUi() + } + + override fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long) { + d(TAG, "onTaskCompleted: isOrderArrivedAtStart=$isOrderArrivedAtStart, siteId=$siteId") + if (isOrderArrivedAtStart) { + TaxiTaskModel.prepareNextTask(siteId) + } else { + TaxiTaskModel.startPrepareTask120S(siteId) + } + } + + override fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) { + TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() + } + + override fun onOrderCancel() { + VoiceNotice.showNotice("乘客已经取消") + mCurrentTaskAndOrder = null + updateTaskAndOrderUi() + } + + override fun onOrderArriveAtEnd(orderNo: String) { + TaxiTaskModel.queryOrderByOrderNo(orderNo) + } + + override fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int) { + //更新总全程信息(公里和分钟) + updateOrderTotalMileAndDurationUI(mileage, duration) + } + + override fun onOrderJourneyCompleted() { + //获取新的任务 + if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null) { + TaxiTaskModel.startPrepareTask120S(mCurrentTaskAndOrder!!.endSite!!.siteId) + } + mCurrentTaskAndOrder = null + updateTaskAndOrderUi() + } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt index 52729bcb36..57d972f299 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt @@ -7,6 +7,7 @@ import android.text.TextUtils import com.alibaba.android.arouter.launcher.ARouter import com.amap.api.maps.model.LatLng import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.mogo.commons.AbsMogoApplication import com.mogo.commons.module.intent.IMogoIntentListener import com.mogo.commons.module.intent.IntentManager import com.mogo.commons.module.status.IMogoStatusChangedListener @@ -40,6 +41,7 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager import com.mogo.och.common.module.biz.common.socketmessage.data.OCHOperationalMessage +import com.mogo.och.common.module.biz.constant.LoginStatusManager import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.network.OchCommonServiceCallback import com.mogo.och.common.module.biz.provider.LoginService @@ -54,6 +56,8 @@ import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.taxi.bean.OrderDetail +import com.mogo.och.taxi.bean.PrepareTaskRespBean +import com.mogo.och.taxi.bean.QueryCarOrderByNoRespBean import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.StartServiceRespBean import com.mogo.och.taxi.bean.TrajectoryListRespBean @@ -61,22 +65,30 @@ import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback import com.mogo.och.taxi.callback.ITaxiADASStatusCallback import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback +import com.mogo.och.taxi.callback.ITaxiTaskCallback import com.mogo.och.taxi.constant.TaskStatusEnum +import com.mogo.och.taxi.constant.TaskTypeEnum +import com.mogo.och.taxi.constant.TaxiCarServingStatusManager import com.mogo.och.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf import com.mogo.och.taxi.constant.TaxiUnmannedConst import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.BUSINESSTYPE -import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.COUNTDOWN_INTERVAL +import com.mogo.och.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_COUNTDOWN_INTERVAL import com.mogo.och.taxi.network.TaxiTaskWithOrderServiceManager import com.mogo.och.taxi.utils.RxJavaUtils import com.mogo.och.taxi.utils.TaxiAnalyticsManager import com.mogo.och.taxi.utils.TaxiTrajectoryManager import com.zhjt.service.chain.ChainLog +import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers import mogo.telematics.pad.MessagePad.ArrivalNotification import mogo.telematics.pad.MessagePad.GlobalPathResp import mogo_msg.MogoReportMsg.MogoReportMessage import system_master.SsmInfo import system_master.SystemStatusInfo +import java.util.concurrent.TimeUnit /** * @author: wangmingjun @@ -89,6 +101,8 @@ object TaxiTaskModel { private lateinit var mContext: Context + private var mQueryTaskWithOrderDisposable: Disposable? = null + var loginService: LoginService? = null //Model->Presenter:自动驾驶状态相关 @@ -102,6 +116,8 @@ object TaxiTaskModel { private var mAutopilotPlanningCallback: IOCHTaxiAutopilotPlanningCallback? = null + private var mTaxiTaskCallback: ITaxiTaskCallback? = null + //当前任务和订单 private var mCurrentTaskWithOrder: QueryCurrentTaskRespBean.Result? = null @@ -135,6 +151,10 @@ object TaxiTaskModel { mOrderStatusCallback = callback } + fun setTaskCallback(callback: ITaxiTaskCallback) { + mTaxiTaskCallback = callback + } + fun init(context: Context) { mContext = context.applicationContext loginService = @@ -485,7 +505,7 @@ object TaxiTaskModel { d(TAG, "submitArriveSite-onSuccess data=" + GsonUtil.jsonFromObject(data)) mDriveToNearestStationTask = null if (isArriveAtEndSite) { - cleanStation() + updateLocalCalculateStation() //到站后不再调用取消自驾. 原因是取消自驾,D档位会溜车 //cancelAutopilot() } @@ -508,6 +528,248 @@ object TaxiTaskModel { && mCurrentTaskWithOrder!!.endSite != null } + fun startQueryCurrentTaskWithOrderLoop() { + if (mQueryTaskWithOrderDisposable != null + && !mQueryTaskWithOrderDisposable!!.isDisposed + ) { + return + } + i(TAG, "startQueryCurrentTaskWithOrderLoop()") + mQueryTaskWithOrderDisposable = Observable.interval( + TaxiUnmannedConst.LOOP_DELAY, + TaxiUnmannedConst.LOOP_PERIOD_2S, + TimeUnit.MILLISECONDS + ) + .map { aLong: Long -> aLong + 1 } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { queryCurrentTaskOnce() } + } + + fun stopQueryCurrentTaskWithOrderLoop() { + if (mQueryTaskWithOrderDisposable != null) { + i(TAG, "stopQueryCurrentTaskWithOrderLoop()") + mQueryTaskWithOrderDisposable?.dispose() + mQueryTaskWithOrderDisposable = null + } + } + + /** + * 查询当前车辆的任务和对应绑定的订单 + */ + private fun queryCurrentTaskOnce() { + if (!LoginStatusManager.isLogin()) { + d(TAG, "queryCurrentTaskOnce: 当前为登陆,跳过本次查询") + return + } + + TaxiTaskWithOrderServiceManager.queryCurrentTask( + AbsMogoApplication.getApp().applicationContext, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryCurrentTaskRespBean?) { + if (data?.data == null) { + d( + TAG, + "queryCurrentTaskOnce onSuccess: data.code != 0 || data === null || data.data === null" + ) + return + } + val result: QueryCurrentTaskRespBean.Result = data.data!! + d( + TAG, + "queryCurrentTaskOnce onSuccess:result=${GsonUtil.jsonFromObject(result)}" + ) + d( + TAG, + "queryCurrentTaskOnce onSuccess:mCurrentTaskWithOrder=${ + GsonUtil.jsonFromObject(mCurrentTaskWithOrder) + }" + ) + + //本地根据订单 orderNo 去查询下(乘客取消订单) + if (mCurrentTaskWithOrder != null + && mCurrentTaskWithOrder?.order != null + && result != null && result.order == null + ) { + d( + TAG, + "queryCurrentTaskOnce: result order is empty, query order by orderNo!" + ) + queryOrderByOrderNo(mCurrentTaskWithOrder!!.order!!.orderNo) + return + } + + //订单或者伪任务更新, 都去刷新下界面 + if (mCurrentTaskWithOrder == null + || mCurrentTaskWithOrder!! != result + ) { + d(TAG, "queryCurrentTaskOnce: 更新本地数据") + if (result?.endSite == null && result?.order == null) { + mCurrentTaskWithOrder = null + } + + //当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行 + if (result?.currentStatus == TaskStatusEnum.CompleteTask.code) { + mTaxiTaskCallback?.onTaskCompleted( + QueryCurrentTaskRespBean.isOrderArriveAtStart( + result + ), + result.endSite!!.siteId + ) + } + + updateLocalCalculateStation() + + //达到终点后查询全程里程和用时 + if (QueryCurrentTaskRespBean.isOrderArriveAtEnd(result)) { + d(TAG, "queryCurrentTaskOnce ArriveAtEnd") + mTaxiTaskCallback?.onOrderArriveAtEnd(result.order!!.orderNo) + } + + //根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合, 没有送驾任务 + var linesIds = arrayListOf() + linesIds.add(result.lineId) + result.order?.also { + linesIds.addAll(it.planningLines) + linesIds.add(it.orderLine) + } + queryTaskTrajectoryByLineIds(linesIds.toTypedArray(), result.lineId) + + //自动去启动自驾 + if (result.currentStatus == TaskStatusEnum.GetTask.code && + result.taskType <= TaskTypeEnum.ToOrderStartTask.code + ) { + if (result.order == null || result.order!!.orderStatus < TaxiOrderStatusEnum.ArriveAtStart.code) { + d(TAG, "queryCurrentTaskOnce autoStartDriving") + autoStartDriving() + } + } + } + } + + override fun onFail(code: Int, msg: String?) { + d(TAG, "queryCurrentTaskOnce onFail: code=$code, msg=$msg") + } + }) + } + + fun updateLocalCalculateStation() { + if (mCurrentTaskWithOrder == null) return + if (mCurrentTaskWithOrder!!.startSite != null && mCurrentTaskWithOrder!!.endSite != null + && mCurrentTaskWithOrder!!.currentStatus <= TaskStatusEnum.StartTask.code + ) { + val curTaskAndOrder = getCurTaskAndOrder() ?: return + if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) { + val startStation = MogoLocation() + startStation.longitude = curTaskAndOrder.startSite!!.gcjLon + startStation.latitude = curTaskAndOrder.startSite!!.gcjLat + val endStation = MogoLocation() + endStation.longitude = curTaskAndOrder.endSite!!.gcjLon + endStation.latitude = curTaskAndOrder.endSite!!.gcjLat + setStationPoint(startStation, endStation, curTaskAndOrder.lineId) + } + } else { + setStationPoint(null, null, -1L) + } + } + + fun queryOrderByOrderNo(orderNo: String) { + TaxiTaskWithOrderServiceManager.queryCarOrderByOrderNo(mContext, orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryCarOrderByNoRespBean?) { + d(TAG, "queryOrderByOrderNo onSuccess: data=${GsonUtil.jsonFromObject(data)}") + if (data == null) return + when (data.data.orderStatus) { + TaxiOrderStatusEnum.Cancel.code -> { + mTaxiTaskCallback?.onOrderCancel() + //更新本地标志位 + mCurrentTaskWithOrder?.order = null + } + + TaxiOrderStatusEnum.ArriveAtEnd.code -> { + mTaxiTaskCallback?.onOrderTotalMileAndDurationChanged( + data.data.mileage, + data.data.duration.toInt() + ) + } + + TaxiOrderStatusEnum.JourneyCompleted.code -> { + mTaxiTaskCallback?.onOrderJourneyCompleted() + //更新本地标志位 + mCurrentTaskWithOrder?.order = null + } + } + } + + override fun onFail(code: Int, msg: String?) { + d( + TAG, + "queryOrderByOrderNo: code=$code,msg=$msg" + ) + } + }) + } + + fun prepareNextTask(siteId: Long) { + TaxiTaskWithOrderServiceManager.prepareTask( + mContext, + siteId, + object : OchCommonServiceCallback { + override fun onSuccess(data: PrepareTaskRespBean?) { + d( + TAG, + "prepareNextTask onSuccess:${GsonUtil.jsonFromObject(data)}, " + + "isCarServingStatus = ${TaxiCarServingStatusManager.isCarServingStatus()}" + ) + if (data?.data == null) return + //去下载轨迹, 下发给工控机下载 + queryTaskTrajectoryByLineIds( + Array(1) { data.data!!.lineId }, + data.data!!.lineId + ) + } + + override fun onFail(code: Int, msg: String?) { + d(TAG, "prepareNextTask onFail: code=$code ,msg=$msg") + if (LoginStatusManager.isLogin() && TaxiCarServingStatusManager.isCarServingStatus()) { + startPrepareTask120S(siteId) + } + } + }) + } + + fun startPrepareTask120S(siteId: Long) { + UiThreadHandler.postDelayed({ + prepareNextTask(siteId) + }, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL_120S) + } + + /** + * 查询当前任务的轨迹 + */ + fun queryTaskTrajectoryByLineIds(planningLineIds: Array, currentTaskLineId: Long) { + TaxiTaskWithOrderServiceManager.queryTrajectoryByLindIds( + mContext, + planningLineIds, + object : OchCommonServiceCallback { + override fun onSuccess(data: TrajectoryListRespBean?) { + d( + TAG, + "queryTaskTrajectoryByLineIds onSuccess: ${GsonUtil.jsonFromObject(data?.data)}" + ) + data?.data?.also { + mTaskTrajectoryList.addAll(it) + mCurrentTaskTrajectory = it.first { currentTaskLineId == it.lineId } + } + mTaxiTaskCallback?.onTaskTrajectoryDataChanged(data) + } + + override fun onFail(code: Int, msg: String?) { + d(TAG, "queryTaskTrajectoryByLineIds onFail: code=$code, msg=$msg") + } + }) + } + // 获取当前订单状态 fun getCurOrderStatus(): TaxiOrderStatusEnum? { if (mCurrentTaskWithOrder == null) TaxiOrderStatusEnum.None @@ -595,11 +857,6 @@ object TaxiTaskModel { updateAutopilotControlParameters(null) } - fun updateCurrentTaskAndOrder(result: QueryCurrentTaskRespBean.Result?) { - mCurrentTaskWithOrder = result - updateNativeCurrentOrder(result) - } - fun updateUntruthTask(untruthTask: StartServiceRespBean.Result?) { mDriveToNearestStationTask = untruthTask } @@ -854,31 +1111,6 @@ object TaxiTaskModel { } - /** - * 查询当前任务的轨迹 - */ - fun queryTaskContrail(planningLines: Array?) { - if (planningLines == null) return - TaxiTaskWithOrderServiceManager.contrailList( - mContext!!, planningLines, - object : OchCommonServiceCallback { - override fun onSuccess(data: TrajectoryListRespBean?) { - d( - SceneConstant.M_TAXI + TAG, - "queryTaskContrail: ${GsonUtil.jsonFromObject(data?.data)}" - ) - if (data == null || data.code != 0) return - mCurrentTaskTrajectory = data.data?.get(0) - - TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() - } - - override fun onFail(code: Int, msg: String?) { - d(SceneConstant.M_TAXI + TAG, "queryTaskContrail code=$code,msg=$msg") - } - }) - } - fun setArriveAtUntruthStation() { if (mDriveToNearestStationTask == null) { ToastUtils.showShort("无虚拟站点!") @@ -981,41 +1213,6 @@ object TaxiTaskModel { } } } - - fun updateStation() { - if (mCurrentTaskWithOrder == null) return - if (mCurrentTaskWithOrder!!.startSite != null && mCurrentTaskWithOrder!!.endSite != null - && mCurrentTaskWithOrder!!.currentStatus <= TaskStatusEnum.StartTask.code - ) { - setStation() - } else { - cleanStation() - } - } - - private fun setStation() { - val curTaskAndOrder = getCurTaskAndOrder() ?: return - if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) { - val startStation = MogoLocation() - startStation.longitude = curTaskAndOrder.startSite!!.gcjLon - startStation.latitude = curTaskAndOrder.startSite!!.gcjLat - val endStation = MogoLocation() - endStation.longitude = curTaskAndOrder.endSite!!.gcjLon - endStation.latitude = curTaskAndOrder.endSite!!.gcjLat - setStationPoint(startStation, endStation, curTaskAndOrder.lineId) - } - } - - private fun cleanStation() { - setStationPoint(null, null, -1L) - } - - fun updateOrderContrails(trajectoryList: MutableList?) { - if (trajectoryList == null) return - mTaskTrajectoryList.clear() - mTaskTrajectoryList.addAll(trajectoryList) - } - fun autoStartDriving() { //启动动画+文字 if (mControllerStatusCallback != null) { @@ -1026,6 +1223,6 @@ object TaxiTaskModel { toStartTask() //状态流转 startAutoPilot() //自驾开启 VoiceNotice.showNotice("车辆正在自动开启自动驾驶") - }, COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转 + }, START_AUTOPILOT_COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转 } } \ No newline at end of file