[Taxi无人化] refactor: TaxiModel TaxiViewModel 优化;

This commit is contained in:
aibingbing
2023-08-24 20:33:51 +08:00
committed by zhongchao
parent b45b6447ba
commit 38ca77161b
10 changed files with 490 additions and 424 deletions

View File

@@ -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<Result>?) : 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
)
}

View File

@@ -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()
}

View File

@@ -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
}
}

View File

@@ -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 开启自驾闪烁动画

View File

@@ -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
}

View File

@@ -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<Long>,
callback: OchCommonServiceCallback<TrajectoryListRespBean>?
) {

View File

@@ -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<TaxiFragment> 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<TaxiFragment> implements ITaxiADASS
}
String finalRole = role;
runOnUIThread(() -> {
mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole);
mView.updateOperationStatus(TaxiCarServingStatusManager.isCarServingStatus(), finalRole);
});
if (!TaxiTaskModel.INSTANCE.checkCurrentTaskCondition()) {

View File

@@ -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()
}
}

View File

@@ -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<UnmannedState, UnmannedIntent>() {
class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(), 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<UnmannedState, UnmannedIntent>()
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<UnmannedState, UnmannedIntent>()
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<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess")
@@ -107,7 +96,6 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>()
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg")
}
})
}
}
@@ -115,30 +103,27 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>()
/**
* 更新接单状态
*/
private fun updateCarStatus() {
private fun updateCarServingStatus() {
if (!isLogin()) {
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
return
}
if (isOpeningOrderStatus()) {//接单状态下,去结束
TaxiTaskWithOrderServiceManager.endService(mContext,
if (isCarServingStatus()) {//接单状态下,去结束
TaxiTaskWithOrderServiceManager.endService(
mContext,
object : OchCommonServiceCallback<BaseData> {
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<UnmannedState, UnmannedIntent>()
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<UnmannedState, UnmannedIntent>()
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<UnmannedState, UnmannedIntent>()
}
}
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<UnmannedState, UnmannedIntent>()
}
}
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<UnmannedState, UnmannedIntent>()
}
}
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<QueryCurrentTaskRespBean> {
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<Long>?) {
if (planningLines == null) return
contrailList(mContext, planningLines,
object : OchCommonServiceCallback<TrajectoryListRespBean> {
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<QueryCarOrderByNoRespBean> {
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<PrepareTaskRespBean> {
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<Long> { 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()
}
}

View File

@@ -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<Long> { 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<QueryCurrentTaskRespBean> {
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 onSuccessresult=${GsonUtil.jsonFromObject(result)}"
)
d(
TAG,
"queryCurrentTaskOnce onSuccessmCurrentTaskWithOrder=${
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<Long>()
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<QueryCarOrderByNoRespBean> {
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<PrepareTaskRespBean> {
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<Long>, currentTaskLineId: Long) {
TaxiTaskWithOrderServiceManager.queryTrajectoryByLindIds(
mContext,
planningLineIds,
object : OchCommonServiceCallback<TrajectoryListRespBean> {
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<Long>?) {
if (planningLines == null) return
TaxiTaskWithOrderServiceManager.contrailList(
mContext!!, planningLines,
object : OchCommonServiceCallback<TrajectoryListRespBean> {
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<TrajectoryListRespBean.Result>?) {
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后开启自驾, 状态流转
}
}