[Taxi无人化] refactor: TaxiModel TaxiViewModel 优化;
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 开启自驾闪烁动画
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>?
|
||||
) {
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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 onSuccess:result=${GsonUtil.jsonFromObject(result)}"
|
||||
)
|
||||
d(
|
||||
TAG,
|
||||
"queryCurrentTaskOnce onSuccess:mCurrentTaskWithOrder=${
|
||||
GsonUtil.jsonFromObject(mCurrentTaskWithOrder)
|
||||
}"
|
||||
)
|
||||
|
||||
//本地根据订单 orderNo 去查询下(乘客取消订单)
|
||||
if (mCurrentTaskWithOrder != null
|
||||
&& mCurrentTaskWithOrder?.order != null
|
||||
&& result != null && result.order == null
|
||||
) {
|
||||
d(
|
||||
TAG,
|
||||
"queryCurrentTaskOnce: result order is empty, query order by orderNo!"
|
||||
)
|
||||
queryOrderByOrderNo(mCurrentTaskWithOrder!!.order!!.orderNo)
|
||||
return
|
||||
}
|
||||
|
||||
//订单或者伪任务更新, 都去刷新下界面
|
||||
if (mCurrentTaskWithOrder == null
|
||||
|| mCurrentTaskWithOrder!! != result
|
||||
) {
|
||||
d(TAG, "queryCurrentTaskOnce: 更新本地数据")
|
||||
if (result?.endSite == null && result?.order == null) {
|
||||
mCurrentTaskWithOrder = null
|
||||
}
|
||||
|
||||
//当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行
|
||||
if (result?.currentStatus == TaskStatusEnum.CompleteTask.code) {
|
||||
mTaxiTaskCallback?.onTaskCompleted(
|
||||
QueryCurrentTaskRespBean.isOrderArriveAtStart(
|
||||
result
|
||||
),
|
||||
result.endSite!!.siteId
|
||||
)
|
||||
}
|
||||
|
||||
updateLocalCalculateStation()
|
||||
|
||||
//达到终点后查询全程里程和用时
|
||||
if (QueryCurrentTaskRespBean.isOrderArriveAtEnd(result)) {
|
||||
d(TAG, "queryCurrentTaskOnce ArriveAtEnd")
|
||||
mTaxiTaskCallback?.onOrderArriveAtEnd(result.order!!.orderNo)
|
||||
}
|
||||
|
||||
//根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合, 没有送驾任务
|
||||
var linesIds = arrayListOf<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后开启自驾, 状态流转
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user