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 0e72b048dc..972c8a0329 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 @@ -7,6 +7,7 @@ import android.os.Build import android.os.Bundle import android.view.View import androidx.annotation.RequiresApi +import androidx.core.content.ContextCompat import androidx.core.text.HtmlCompat import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -15,17 +16,15 @@ import com.mogo.commons.mvp.BaseFragment import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 +import com.mogo.eagle.core.function.main.MainMoGoApplication 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.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI -import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.map.ICommonNaviChangedCallback -import com.mogo.och.common.module.utils.DateTimeUtil -import com.mogo.och.common.module.utils.NumberFormatUtil import com.mogo.och.common.module.wigets.OCHCommitDialog import com.mogo.och.taxi.R import com.mogo.och.taxi.bean.OrderDetail @@ -37,16 +36,16 @@ import com.mogo.och.taxi.constant.TaxiOrderStatusEnum 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.model.TaxiModel -import com.mogo.och.taxi.ui.TaxiOrderCancelDialog import com.mogo.och.taxi.ui.base.TaxiFragment -import com.mogo.och.taxi.ui.unmanned.TaskAndOrderUiState +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 +import com.mogo.och.taxi.utils.TaskUtils import kotlinx.android.synthetic.main.task_fragment_current.cancelOrder import kotlinx.android.synthetic.main.task_fragment_current.endPoint import kotlinx.android.synthetic.main.task_fragment_current.endStationName -import kotlinx.android.synthetic.main.task_fragment_current.mBeingOrderLayout +import kotlinx.android.synthetic.main.task_fragment_current.mCurrentTaskLayout import kotlinx.android.synthetic.main.task_fragment_current.naviToEnd import kotlinx.android.synthetic.main.task_fragment_current.naviToStart import kotlinx.android.synthetic.main.task_fragment_current.noTaskData @@ -59,9 +58,6 @@ import kotlinx.android.synthetic.main.task_fragment_current.taskStatus import kotlinx.android.synthetic.main.task_fragment_current.taskTypeTv import kotlinx.android.synthetic.main.taxi_no_data_common_view.noOrderDataTv import kotlinx.coroutines.flow.map -import java.util.Calendar -import kotlin.math.ceil -import kotlin.math.roundToInt /** * @author: wangmingjun @@ -94,7 +90,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), } override fun getTagName(): String { - return "TaxiCurrentTaskFragment" + return this.javaClass.simpleName } override fun onCreate(savedInstanceState: Bundle?) { @@ -115,7 +111,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), /** * 是否有正在进行的订单,进行UI显示 * - * @param being + * @param hasCurrentTask */ private fun initContainerView(hasCurrentTask: Boolean) { d( @@ -125,14 +121,14 @@ class TaxiCurrentTaskFragment : BaseFragment(), try { if (hasCurrentTask) { noTaskData.visibility = View.GONE - mBeingOrderLayout.visibility = View.VISIBLE + mCurrentTaskLayout.visibility = View.VISIBLE } else { noTaskData.visibility = View.VISIBLE noOrderDataTv.text = "暂无进行中订单" - mBeingOrderLayout.visibility = View.GONE + mCurrentTaskLayout.visibility = View.GONE } } catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况 - TaxiModel.clearCurrentOCHOrder() + TaxiTaskModel.clearCurrentOCHOrder() } } @@ -157,37 +153,42 @@ class TaxiCurrentTaskFragment : BaseFragment(), //监听返回的数据状态 lifecycleScope.launchWhenStarted { - mViewModel.uiStateFlow.map { it.taskAndOrderUiState }.collect { taskAndOrderUiState -> + mViewModel.uiStateFlow.map { it.taskWithOrderUIState }.collect { taskAndOrderUiState -> d(TAG, "uiStateFlow-initViewModelObserver: $taskAndOrderUiState") when (taskAndOrderUiState) { - is TaskAndOrderUiState.INIT -> { + is TaskWithOrderUIState.Init -> { } - is TaskAndOrderUiState.TASKANDORDER -> { - mDriveToNearestStationTask = taskAndOrderUiState.untruthTask - mCurrentTaskWithOrder = taskAndOrderUiState.taskAndOrder + is TaskWithOrderUIState.TaskDriveToNearestStationTask -> { + mDriveToNearestStationTask = taskAndOrderUiState.driveToNearestStationTask + if (taskAndOrderUiState.driveToNearestStationTask != null) { + updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask) + } else { + initContainerView(false) + removeAllMapMarker() + } + } - if ((taskAndOrderUiState.untruthTask == null - && mCurrentTaskWithOrder != null - && mCurrentTaskWithOrder!!.endSite == null) - || mCurrentTaskWithOrder == null - ) { + is TaskWithOrderUIState.TaskWithOrder -> { + mCurrentTaskWithOrder = taskAndOrderUiState.taskWithOrder + + //如果在前往标定站点, 显示标定站点 + if (mDriveToNearestStationTask != null){ + return@collect + } + + if (mCurrentTaskWithOrder == null) { initContainerView(false) removeAllMapMarker() return@collect } - - if (taskAndOrderUiState.untruthTask != null) { - updateDriveToNearestStationTaskView(taskAndOrderUiState.untruthTask) - } else { - updateNextTaskFragment(taskAndOrderUiState.taskAndOrder) - updateCurrentTaskAndOrderStatusChanged(taskAndOrderUiState.taskAndOrder) - } + updateNextTaskFragment(taskAndOrderUiState.taskWithOrder) + updateViewByCurrentTaskWithOrder(taskAndOrderUiState.taskWithOrder) } - is TaskAndOrderUiState.UPDATEORDERMILEANDDUR -> { + is TaskWithOrderUIState.UpdateTaskTripInfo -> { taskOtherInfo.text = - QueryCurrentTaskRespBean.Result.getCurrentTaskTotalAndDurationHtml( + TaskUtils.getCurrentTaskTotalAndDurationHtml( taskAndOrderUiState.mileage, taskAndOrderUiState.duration ) @@ -197,10 +198,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - private fun updateDriveToNearestStationTaskView(driveToNearestStationTask: StartServiceRespBean.Result?) { + private fun updateViewByDriveToNearestStationTask(driveToNearestStationTask: StartServiceRespBean.Result?) { if (driveToNearestStationTask == null) return initContainerView(true) - // DriverToNearestStationTask 更新 + // DriverToNearestStationTask 任务更新 taskStatus.visibility = View.VISIBLE taskTypeTv.visibility = View.GONE cancelOrder.visibility = View.GONE @@ -243,8 +244,8 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - fun onOperationStatusChanged() { - mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseReceivingOrder) + fun onCarTakeOrderStatusChanged() { + mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseTakeOrder) } private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) { @@ -271,10 +272,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } /** - * 任务和订单信息 + * 更新当前任务和订单信息 */ @SuppressLint("SetTextI18n", "UseCompatLoadingForDrawables") - fun updateCurrentTaskAndOrderStatusChanged(taskAndOrder: QueryCurrentTaskRespBean.Result?) { + fun updateViewByCurrentTaskWithOrder(taskAndOrder: QueryCurrentTaskRespBean.Result?) { if (taskAndOrder == null) return if ((taskAndOrder.endSite == null || taskAndOrder.currentStatus == TaskStatusEnum.CompleteTask.code) && taskAndOrder.order == null @@ -292,15 +293,39 @@ class TaxiCurrentTaskFragment : BaseFragment(), * 当前任务是接驾任务,显示订单状态+运营单 订单显示在进行中, 任务不再显示 */ val taskType = taskAndOrder.taskType // 任务类型 - val order = taskAndOrder.order // 订单 - val startSite = taskAndOrder.startSite //进行的任务 - val endSite = taskAndOrder.endSite //进行的任务 - val currentStatus = taskAndOrder.currentStatus // 任务的状态 - - updateUIShowStatus(taskType, currentStatus, order) + val order = taskAndOrder.order // 订单信息 + val startSite = taskAndOrder.startSite // 起点 + val endSite = taskAndOrder.endSite // 终点 + val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 when (taskType) { + TaskTypeEnum.None.code -> { + if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { + handleOrderView(order) + } + } + TaskTypeEnum.VirtualTask.code -> { //演练任务 + cancelOrder.visibility = View.GONE + orderPhoneAndNum.visibility = View.GONE + taskClickBtn.visibility = View.GONE + + naviToStart.visibility = View.GONE + taskTypeTv.visibility = View.VISIBLE + naviToEnd.visibility = + if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE + taskOtherInfo.visibility = + if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE + } + + TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 接驾任务 或 送驾任务 + order.also { + handleOrderView(it) + } + } + } + + when (taskType) { TaskTypeEnum.VirtualTask.code -> {// 演练任务 if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { updateOrderUI(order) @@ -330,7 +355,6 @@ class TaxiCurrentTaskFragment : BaseFragment(), } updateMapMarkers() - updateRemainDistanceAndTime(false) } @@ -393,14 +417,18 @@ class TaxiCurrentTaskFragment : BaseFragment(), } else { d( M_TAXI + TAG, - "CurrentTaskAndOrder == " + GsonUtil.jsonFromObject(mCurrentTaskWithOrder) + "CurrentTaskWithOrder == " + GsonUtil.jsonFromObject(mCurrentTaskWithOrder) ) } } private fun updateOrderUI(order: OrderDetail) { taskTypeTv.text = resources.getString(R.string.task_order) - taskTypeTv.background = resources.getDrawable(R.drawable.task_order_type_btn_bg, null) + taskTypeTv.background = + ContextCompat.getDrawable( + MainMoGoApplication.getApp().applicationContext, + R.drawable.task_order_type_btn_bg + ) orderPhoneAndNum.text = HtmlCompat.fromHtml( " " + order.bookingUserPhone + "" + " | " + @@ -413,24 +441,25 @@ class TaxiCurrentTaskFragment : BaseFragment(), when (order.orderStatus) { TaxiOrderStatusEnum.None.code -> { //无 initContainerView(false) + removeAllMapMarker() } TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 taskStatus.text = resources.getString(R.string.task_start_end_site) updateStartAndEndStationPointByStatus(true) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_server_end), Color.parseColor("#FFFFFF"), Color.parseColor("#FF1D5EF3"), true ) - hideNavi() + hideNaviBtns() } TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 taskStatus.text = resources.getString(R.string.task_start_end_site) updateStartAndEndStationPointByStatus(true) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_close), Color.parseColor("#FFFFFF"), Color.parseColor("#FF1D5EF3"), @@ -439,10 +468,10 @@ class TaxiCurrentTaskFragment : BaseFragment(), } TaxiOrderStatusEnum.UserArriveAtStart.code, TaxiOrderStatusEnum.ArriveAtStart.code -> { - //乘客到达上车点,验证成功 ; 到达乘客上车点 - updateStartAndEndStationPointByStatus(false) + //乘客到达上车点, 验证成功 ; 到达乘客上车点 taskStatus.text = resources.getString(R.string.arrived_start_site) - updateOrderBottomBtn( + updateStartAndEndStationPointByStatus(false) + updateTaskContainerBottomBtn( if (order.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) getString(R.string.module_och_taxi_order_server_start) else getString(R.string.module_och_taxi_order_server_start_wait_check), @@ -450,14 +479,14 @@ class TaxiCurrentTaskFragment : BaseFragment(), Color.parseColor("#FF1D5EF3"), true ) - updateOtherInfo() - hideNavi() + hideNaviBtns() + taskOtherInfo.text = TaskUtils.getWaitTimeHtml() } TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 taskStatus.text = resources.getString(R.string.task_start_start_site) updateStartAndEndStationPointByStatus(false) - updateOrderBottomBtn( + updateTaskContainerBottomBtn( getString(R.string.module_och_taxi_order_server_start), Color.parseColor("#4DFFFFFF"), Color.parseColor("#4D1D5EF3"), @@ -467,60 +496,6 @@ class TaxiCurrentTaskFragment : BaseFragment(), } } - private fun updateOtherInfo() { - val currentCale = DateTimeUtils.getCurrentDateTime() - val currentDay = - DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd) - - currentCale.add(Calendar.MINUTE, 10) - val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.yyyy_MM_dd - ) - ) { - ("免费等待至 " - + "" + DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.HH_mm - ) + "") - } else { - ("免费等待至" - + "" + DateTimeUtil.formatCalendarToString( - currentCale, - DateTimeUtil.MM_dd_HH_mm - ) + "") - } - taskOtherInfo.text = HtmlCompat.fromHtml(strHtml13, HtmlCompat.FROM_HTML_MODE_LEGACY) - } - - private fun updateUIShowStatus(taskType: Int, currentStatus: Int, order: OrderDetail?) { - when (taskType) { - TaskTypeEnum.None.code -> { - if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { - handleOrderView(order) - } - } - - TaskTypeEnum.VirtualTask.code -> { //演练任务 - cancelOrder.visibility = View.GONE - orderPhoneAndNum.visibility = View.GONE - taskClickBtn.visibility = View.GONE -// currentStatus 0:空闲 1:获取任务 2:开始任务 3:到达目的地 - naviToStart.visibility = View.GONE - taskTypeTv.visibility = View.VISIBLE - naviToEnd.visibility = - if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE - taskOtherInfo.visibility = - if (currentStatus == TaskStatusEnum.GetTask.code) View.GONE else View.VISIBLE - } - - TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 运营单(接驾任务、送驾任务) - if (order == null) return - handleOrderView(order) - } - } - } - private fun handleOrderView(order: OrderDetail?) { if (order == null) return cancelOrder.visibility = View.VISIBLE @@ -541,13 +516,12 @@ class TaxiCurrentTaskFragment : BaseFragment(), } - private fun hideNavi() { + private fun hideNaviBtns() { naviToStart.visibility = View.GONE naviToEnd.visibility = View.GONE AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() mTaxiFragment?.showAmapNaviToStationFragment(false) mTaxiFragment?.showRoutingToStationFragment(false) - requireParentFragment() } private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) { @@ -567,40 +541,18 @@ class TaxiCurrentTaskFragment : BaseFragment(), /** * 剩余里程和剩余时间 - * @param meters m + * @param meters 米 * @param timeInSecond 秒 */ - fun updateDistanceAndTime(meters: Long, timeInSecond: Long) { -// CallerLogger.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond); + fun updateCurrentTaskTripInfo(meters: Long, timeInSecond: Long) { if (mCurrentTaskWithOrder == null) return if (mCurrentTaskWithOrder!!.endSite == null && mDriveToNearestStationTask == null) return - - var dis = "0" - var disUnit = "公里" - if (meters > 0) { - if (meters / 1000 < 1) { - disUnit = "米" - dis = meters.toFloat().roundToInt().toString() - } else { - disUnit = "公里" - dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) - } - } - val min = ceil(timeInSecond.toDouble() / 60f).toInt() - val strHtml2 = - ("里程 " + "" + dis + "" + " " + disUnit + "" - + ",剩余 " + "" + min + "" + " 分钟") - - taskOtherInfo.text = HtmlCompat.fromHtml(strHtml2, HtmlCompat.FROM_HTML_MODE_LEGACY) + taskOtherInfo.text = TaskUtils.getCurrentTaskTripHtml(meters, timeInSecond) } -// private fun speekVoice200mTipsOnce() { -// showNotice(resources.getString(R.string.module_och_taxi_order_arrive_end_200m_tip)) -// } - override fun onDestroyView() { - super.onDestroyView() AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + super.onDestroyView() } private fun startOrEndService() { @@ -654,8 +606,8 @@ class TaxiCurrentTaskFragment : BaseFragment(), activity?.also { TaxiOrderCancelDialog( it, mCurrentTaskWithOrder!!.order!!.orderStatus - ) { - mViewModel.sendUiIntent(UnmannedIntent.CancelOrder(it)) + ) {type -> + mViewModel.sendUiIntent(UnmannedIntent.CancelOrder(type)) }.show() } } @@ -676,7 +628,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), @RequiresApi(Build.VERSION_CODES.N) override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) { - updateDistanceAndTime(meters.toLong(), timeInSecond) + updateCurrentTaskTripInfo(meters.toLong(), timeInSecond) } override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) { @@ -709,7 +661,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), }, 3000) } - fun onNaviToEndAmap(isShow: Boolean) { + fun onNaviToEndStationByAmap(isShow: Boolean) { if (mCurrentTaskWithOrder == null) return mTaxiFragment?.showAmapNaviToStationFragment( @@ -744,7 +696,7 @@ class TaxiCurrentTaskFragment : BaseFragment(), MapMakerManager.removeAllMapMarkerByOwner(TYPE_MARKER_TAXI_ORDER) } - private fun updateOrderBottomBtn( + private fun updateTaskContainerBottomBtn( txt: String?, txtColorId: Int, bgColorId: Int, 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 ccb58525a6..ea3c90e398 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,14 +1,18 @@ 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 @@ -16,34 +20,43 @@ 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.TaxiCarServingStatusManager.isCarServingStatus +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.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 com.mogo.och.taxi.utils.TaxiTrajectoryManager +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 /** * @author: wangmingjun * @date: 2023/7/26 */ -class TaxiCurrentTaskViewModel : BaseViewModel(), ITaxiTaskCallback { +class TaxiCurrentTaskViewModel : BaseViewModel() { + private var mInAndWaitServiceDisposable: Disposable? = null //进行中、待服务订单列表轮询 private var mCurrentTaskAndOrder: QueryCurrentTaskRespBean.Result? = null - private val TAG = SceneConstant.M_TAXI + "TaxiUnmannedViewModel" + private val TAG = "TaxiUnmannedViewModel" + @SuppressLint("StaticFieldLeak") private var mContext: Context = AbsMogoApplication.getApp().applicationContext - init { - TaxiTaskModel.setTaskCallback(this) - } - override fun initUiState(): UnmannedState { return UnmannedState(TaskWithOrderUIState.Init) } @@ -51,11 +64,11 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), override fun handleIntent(intent: IUiIntent) { when (intent) { is UnmannedIntent.StartTaskOrOrderLooper -> { //开始轮询 - startOrStopCurrentTaskWithOrderLoop(true) + startOrStopOrderLoop(true) } is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单 - updateCarServingStatus() + updateCarStatus() } is UnmannedIntent.JumpPassengerCheckDone -> { //手动点击跳过乘客验证 @@ -85,9 +98,7 @@ 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") @@ -96,6 +107,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), override fun onFail(code: Int, msg: String?) { d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg") } + }) } } @@ -103,27 +115,30 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), /** * 更新接单状态 */ - private fun updateCarServingStatus() { + private fun updateCarStatus() { if (!isLogin()) { TaxiTaskModel.loginService!!.queryLoginStatusByNet() return } - if (isCarServingStatus()) {//接单状态下,去结束 - TaxiTaskWithOrderServiceManager.endService( - mContext, + if (isOpeningOrderStatus()) {//接单状态下,去结束 + TaxiTaskWithOrderServiceManager.endService(mContext, object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { TaxiTaskModel.loginService!!.queryLoginStatusByNet() //需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的 d(TAG, "set mUntruthSiteTask null") updateDriveToNearestStationTaskUI(null) - TaxiTaskModel.updateUntruthTask(null) + 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() { @@ -137,7 +152,9 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), override fun onFail(code: Int, msg: String) { ToastUtilsOch.showWithCodeMessage(code, msg) } + }) + } else {//暂停接单状态下,去接单 TaxiTaskWithOrderServiceManager.startService(mContext, CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude, @@ -150,7 +167,9 @@ 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) { //有任务, 并且未执行完成 @@ -158,13 +177,14 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } } updateDriveToNearestStationTaskUI(data.data) - TaxiTaskModel.updateUntruthTask(data.data) + 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}" ) } @@ -211,13 +231,13 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } } + private fun updateUntruthTask(result: StartServiceRespBean.Result?) { + TaxiTaskModel.updateUntruthTask(result) + } + private fun updateTaskAndOrderUi() { - d( - TAG, - "updateTaskAndOrderUi: mCurrentTaskAndOrder=${ - GsonUtil.getGson().toJson(mCurrentTaskAndOrder) - }" - ) + d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi") + sendUiState { copy( taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( @@ -238,67 +258,257 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } } - private fun updateOrderTotalMileAndDurationUI(mileage: Float, duration: Int) { - d(TAG, "updateOrderTotalMileAndDurationUI") + private fun updateNoTaskWithOrderUI() { sendUiState { copy( - taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo( - mileage, duration + taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( + null ) ) } } - fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) { - d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start") + fun startOrStopOrderLoop(start: Boolean) { + d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $start") if (start) { - TaxiTaskModel.startQueryCurrentTaskWithOrderLoop() + startInAndWaitCurrentTaskLoop() } else { - TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop() + stopInAndWaitCurrentTaskLoop() } } - override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { - if (result === null) return - d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) - mCurrentTaskAndOrder = result - updateTaskAndOrderUi() + 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") + } + + }) } - override fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long) { - d(TAG, "onTaskCompleted: isOrderArrivedAtStart=$isOrderArrivedAtStart, siteId=$siteId") - if (isOrderArrivedAtStart) { - TaxiTaskModel.prepareNextTask(siteId) - } else { - TaxiTaskModel.startPrepareTask120S(siteId) + /** + * 查询送驾任务轨迹集合 + * 注: 运营单刚来的时候, 有可能还在运行一个演练任务, 要先跑完演练任务才跑运营单 + */ + 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") + + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo( + mileage, + duration + ) + ) } } - override fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) { - TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() + private fun startPrepareTask120S(siteId: Long) { + UiThreadHandler.postDelayed({ + pullTask(siteId) + }, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL) } - override fun onOrderCancel() { - VoiceNotice.showNotice("乘客已经取消") - mCurrentTaskAndOrder = null - updateTaskAndOrderUi() + 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再次调用获取下一任务 + } + } + + }) } - 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) + private fun startInAndWaitCurrentTaskLoop() { + if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable!!.isDisposed) { + return } - mCurrentTaskAndOrder = null - updateTaskAndOrderUi() + 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 + } + } + } \ No newline at end of file