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