[Taxi无人化] refactor: viewModel / Model 优化;

This commit is contained in:
aibingbing
2023-08-24 12:42:43 +08:00
parent 0bc6b54f37
commit f25cff83d0
14 changed files with 989 additions and 944 deletions

View File

@@ -1,6 +1,7 @@
package com.mogo.och.taxi.bean
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
/**
* @author: wangmingjun
@@ -91,6 +92,34 @@ data class QueryCurrentTaskRespBean(var data: Result?) : BaseData() {
return true
}
}
companion object {
/**
* with order.orderStatus == OnTheWayToEnd
*/
fun isOrderOnTheWayToEnd(data: QueryCurrentTaskRespBean.Result?): Boolean {
if (data == null) {
return false
}
if (data.order == null) {
return false
}
return data.order!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
}
/**
* with order.orderStatus == ArriveAtEnd
*/
fun isOrderArriveAtEnd(data: QueryCurrentTaskRespBean.Result?): Boolean {
if (data == null) {
return false
}
if (data.order == null) {
return false
}
return data.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code
}
}
}
data class StartTaskReqBean(var sn: String, var lineId: Long)
@@ -116,8 +145,10 @@ data class QueryCarOrderByNoRespBean(var data: Result) : BaseData() {
)
}
data class ContrailListRespBean(var data: MutableList<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,

View File

@@ -13,7 +13,7 @@ import com.mogo.och.taxi.bean.*
/**
* Created by pangfan on 2021/8/19
*/
object CarServiceManager {
object TaxiTaskWithOrderServiceManager {
private var mOCHTaxiServiceApi: UnmannedTaskServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
@@ -154,7 +154,7 @@ object CarServiceManager {
callback: OchCommonServiceCallback<BaseData>?
) {
mOCHTaxiServiceApi.cancelOrder(
data = CancelOrderReqBean(MoGoAiCloudClientConfig.getInstance().sn, orderNo,cancelType)
data = CancelOrderReqBean(MoGoAiCloudClientConfig.getInstance().sn, orderNo, cancelType)
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "cancelOrder"))
}
@@ -165,9 +165,10 @@ object CarServiceManager {
@JvmStatic
fun contrailList(
context: Context, linIds: Array<Long>,
callback: OchCommonServiceCallback<ContrailListRespBean>?
callback: OchCommonServiceCallback<TrajectoryListRespBean>?
) {
mOCHTaxiServiceApi.contrailList(data = linIds
mOCHTaxiServiceApi.contrailList(
data = linIds
).transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "contrailList"))
}

View File

@@ -4,7 +4,7 @@ import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.taxi.bean.ArriveSiteReqBean
import com.mogo.och.taxi.bean.CancelOrderReqBean
import com.mogo.och.taxi.bean.ContrailListRespBean
import com.mogo.och.taxi.bean.TrajectoryListRespBean
import com.mogo.och.taxi.bean.JumpPassengerCheckReqBean
import com.mogo.och.taxi.bean.OrderCompletedReqBean
import com.mogo.och.taxi.bean.PrepareTaskReqBean
@@ -128,7 +128,7 @@ interface UnmannedTaskServiceApi {
@Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId,
@Header("ticket") ticket: String = MoGoAiCloudClientConfig.getInstance().token,
@Body data: Array<Long>
): Observable<ContrailListRespBean>
): Observable<TrajectoryListRespBean>
/**
* 司机手动点击跳过乘客验证

View File

@@ -16,9 +16,9 @@ import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.LoginService
import com.mogo.och.taxi.R
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.network.LoginBusImpl
import com.mogo.och.taxi.ui.personal.TaxiPersonalDialogFragment
import com.mogo.och.taxi.ui.task.TaxiTaskModel
import com.mogo.och.taxi.ui.task.TaxiTaskTabFragment
import com.mogo.och.taxi.utils.TPRouteDataTestUtils
import kotlinx.android.synthetic.main.taxi_base_fragment.module_mogo_och_operation_status
@@ -222,22 +222,22 @@ class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
*/
private fun initOrderDebugView() {
findViewById<View>(R.id.test_bar_to_virtual)?.setOnClickListener {
TaxiModel.setArriveAtUntruthStation()
TaxiTaskModel.setArriveAtUntruthStation()
}
findViewById<View>(R.id.test_bar_to_end)?.setOnClickListener {
TaxiModel.setArriveAtEndStation()
TaxiTaskModel.setArriveAtEndStation()
}
findViewById<View>(R.id.test_bar_start_service_confirm)?.setOnClickListener {
TaxiModel.toStartTask()
TaxiTaskModel.toStartTask()
}
findViewById<View>(R.id.test_bar_on_the_way_to_end)?.setOnClickListener {
if (!isStarting) {
mPresenter.startAutoPilot()
}
TaxiModel.setOnTheWayToEndStation()
TaxiTaskModel.setOnTheWayToEndStation()
}
findViewById<View>(R.id.test_bar_route)?.setOnClickListener { testRouteInfoUpload() }

View File

@@ -20,7 +20,7 @@ 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.model.TaxiModel;
import com.mogo.och.taxi.ui.task.TaxiTaskModel;
/**
* @author congtaowang
@@ -37,7 +37,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
public TaxiPresenter(TaxiFragment view) {
super(view);
TaxiModel.INSTANCE.init(AbsMogoApplication.getApp());
TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp());
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}
@@ -45,22 +45,22 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
releaseListeners();
TaxiModel.INSTANCE.release();
TaxiTaskModel.INSTANCE.release();
super.onDestroy(owner);
}
private void initListeners() {
TaxiModel.INSTANCE.setADASStatusCallback(this);
TaxiModel.INSTANCE.setControllerStatusCallback(this);
TaxiModel.INSTANCE.setOrderStatusCallback(this);
TaxiTaskModel.INSTANCE.setADASStatusCallback(this);
TaxiTaskModel.INSTANCE.setControllerStatusCallback(this);
TaxiTaskModel.INSTANCE.setOrderStatusCallback(this);
}
private void releaseListeners() {
TaxiModel.INSTANCE.setADASStatusCallback(null);
TaxiModel.INSTANCE.setControllerStatusCallback(null);
TaxiModel.INSTANCE.setOrderStatusCallback(null);
TaxiTaskModel.INSTANCE.setADASStatusCallback(null);
TaxiTaskModel.INSTANCE.setControllerStatusCallback(null);
TaxiTaskModel.INSTANCE.setOrderStatusCallback(null);
OCHAdasAbilityManager.getInstance().release();
TaxiModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
TaxiTaskModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
}
private void runOnUIThread(Runnable executor) {
@@ -78,22 +78,22 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
* 开启自动驾驶 自驾模式
*/
public void startAutoPilot() {
TaxiModel.INSTANCE.startAutoPilot();
TaxiTaskModel.INSTANCE.startAutoPilot();
}
// 获取当前订单状态
public TaxiOrderStatusEnum getCurOrderStatus() {
return TaxiModel.INSTANCE.getCurOrderStatus();
return TaxiTaskModel.INSTANCE.getCurOrderStatus();
}
// 登出
public void logout() {
TaxiModel.INSTANCE.logout();
TaxiTaskModel.INSTANCE.logout();
}
//导航去订单目的地
public void startNaviToEndStation(boolean isShow) {
TaxiModel.INSTANCE.startNaviToEndStation(isShow);
TaxiTaskModel.INSTANCE.startNaviToEndStation(isShow);
}
public void reportToEndDisAndTime(long lastSumLength, long duration) {//米/秒
@@ -194,7 +194,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole);
});
if (!TaxiModel.INSTANCE.checkCurrentTask()) {
if (!TaxiTaskModel.INSTANCE.checkCurrentTaskCondition()) {
mView.showDebugPanel();
}
}

View File

@@ -7,7 +7,7 @@ import android.view.View
import android.widget.LinearLayout
import com.mogo.eagle.core.network.utils.GsonUtil
import com.mogo.och.taxi.R
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.ui.task.TaxiTaskModel
import kotlinx.android.synthetic.main.taxi_debug_order.view.orderInfo
import kotlinx.android.synthetic.main.taxi_debug_order.view.orderToStartLines
import kotlinx.android.synthetic.main.taxi_debug_order.view.taskEndSite
@@ -39,8 +39,8 @@ class DebugView @JvmOverloads constructor(
}
fun toggleOrderDebugView() {
val data = TaxiModel.getCurTaskAndOrder()
val curContrail = TaxiModel.getCurTaskContrail()
val data = TaxiTaskModel.getCurTaskAndOrder()
val curContrail = TaxiTaskModel.getCurrentTaskTrajectory()
visibility =
if (visibility == View.VISIBLE)

View File

@@ -14,7 +14,7 @@ import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
import com.mogo.och.taxi.model.TaxiModel;
import com.mogo.och.taxi.ui.task.TaxiTaskModel;
import java.util.List;
@@ -30,7 +30,7 @@ public class RoutingNaviPresenter extends Presenter<TaxiRoutingNaviFragment> imp
public RoutingNaviPresenter(TaxiRoutingNaviFragment view) {
super(view);
TaxiModel.INSTANCE.init(AbsMogoApplication.getApp());
TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp());
initListeners();
}
@@ -46,7 +46,7 @@ public class RoutingNaviPresenter extends Presenter<TaxiRoutingNaviFragment> imp
}
private void initListeners() {
TaxiModel.INSTANCE.setMoGoAutopilotPlanningListener(this);
TaxiTaskModel.INSTANCE.setMoGoAutopilotPlanningListener(this);
}
private void runOnUIThread( Runnable executor ) {

View File

@@ -36,8 +36,8 @@ 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.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
@@ -128,7 +128,7 @@ class TaxiCurrentTaskFragment : BaseFragment(),
mCurrentTaskLayout.visibility = View.GONE
}
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
TaxiModel.clearCurrentOCHOrder()
TaxiTaskModel.clearCurrentOCHOrder()
}
}
@@ -159,26 +159,26 @@ class TaxiCurrentTaskFragment : BaseFragment(),
is TaskWithOrderUIState.Init -> {
}
is TaskWithOrderUIState.TaskWithOrder -> {
is TaskWithOrderUIState.TaskDriveToNearestStationTask -> {
mDriveToNearestStationTask = taskAndOrderUiState.driveToNearestStationTask
if (taskAndOrderUiState.driveToNearestStationTask != null) {
updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask)
} else {
initContainerView(false)
removeAllMapMarker()
}
}
is TaskWithOrderUIState.TaskWithOrder -> {
mCurrentTaskWithOrder = taskAndOrderUiState.taskWithOrder
if ((taskAndOrderUiState.driveToNearestStationTask == null
&& mCurrentTaskWithOrder != null
&& mCurrentTaskWithOrder!!.endSite == null)
|| mCurrentTaskWithOrder == null
) {
if (mCurrentTaskWithOrder == null) {
initContainerView(false)
removeAllMapMarker()
return@collect
}
if (taskAndOrderUiState.driveToNearestStationTask != null) {
updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask)
} else {
updateNextTaskFragment(taskAndOrderUiState.taskWithOrder)
updateViewByCurrentTaskWithOrder(taskAndOrderUiState.taskWithOrder)
}
updateNextTaskFragment(taskAndOrderUiState.taskWithOrder)
updateViewByCurrentTaskWithOrder(taskAndOrderUiState.taskWithOrder)
}
is TaskWithOrderUIState.UpdateTaskTripInfo -> {

View File

@@ -20,7 +20,7 @@ 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.ContrailListRespBean
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
@@ -29,13 +29,12 @@ 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
import com.mogo.och.taxi.constant.TaxtServingStatusManager.isOpeningOrderStatus
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.network.CarServiceManager
import com.mogo.och.taxi.network.CarServiceManager.cancelOrder
import com.mogo.och.taxi.network.CarServiceManager.contrailList
import com.mogo.och.taxi.network.CarServiceManager.queryCarOrderByOrderNo
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
@@ -49,28 +48,27 @@ import java.util.concurrent.TimeUnit
* @author: wangmingjun
* @date: 2023/7/26
*/
class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>() {
private var mInAndWaitServiceDisposable: Disposable? = null //进行中、待服务订单列表轮询
private var mCurrentTaskAndOrder: QueryCurrentTaskRespBean.Result? = null
private val TAG = "TaxiUnmannedViewModel"
@SuppressLint("StaticFieldLeak")
private var mContext : Context = AbsMogoApplication.getApp().applicationContext
private var mContext: Context = AbsMogoApplication.getApp().applicationContext
override fun initUiState(): UnmannedState {
return UnmannedState(TaskWithOrderUIState.Init)
}
override fun handleIntent(intent: IUiIntent) {
when(intent) {
when (intent) {
is UnmannedIntent.StartTaskOrOrderLooper -> { //开始轮询
startOrStopOrderLoop(true)
}
is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单
updateCarStatus()
updateCarStatus()
}
is UnmannedIntent.JumpPassengerCheckDone -> { //手动点击跳过乘客验证
@@ -82,9 +80,9 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
is UnmannedIntent.CloseOrderByDriver -> {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
val site = mCurrentTaskAndOrder!!.order!!.orderEndSite
TaxiModel.arriveSite(site!!.siteId, true)
TaxiTaskModel.submitArriveSite(site!!.siteId, true)
}
}
@@ -93,15 +91,15 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
is UnmannedIntent.StartTask -> {
TaxiModel.toStartTask()
TaxiTaskModel.toStartTask()
}
}
}
private fun handleCancelOrder(cancelType: Int) {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo,cancelType,
object : OchCommonServiceCallback<BaseData>{
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo, cancelType,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess")
}
@@ -119,24 +117,25 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
*/
private fun updateCarStatus() {
if (!isLogin()) {
TaxiModel.loginService!!.queryLoginStatusByNet()
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
return
}
if (isOpeningOrderStatus()){//接单状态下,去结束
CarServiceManager.endService(mContext,
if (isOpeningOrderStatus()) {//接单状态下,去结束
TaxiTaskWithOrderServiceManager.endService(mContext,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
TaxiModel.loginService!!.queryLoginStatusByNet()
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
//需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的
d(TAG, "set mUntruthSiteTask null")
updateUntruthTaskUI(null)
updateDriveToNearestStationTaskUI(null)
updateUntruthTask(null)
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null
&& mCurrentTaskAndOrder!!.startSite != null
&& mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code){
&& mCurrentTaskAndOrder!!.startSite != null
&& mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code
) {
VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦")
}else{
} else {
VoiceNotice.showNotice("暂停接单啦")
}
@@ -156,34 +155,37 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
})
}else{//暂停接单状态下,去接单
CarServiceManager.startService(mContext,
} else {//暂停接单状态下,去接单
TaxiTaskWithOrderServiceManager.startService(mContext,
CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude,
CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude,
object : OchCommonServiceCallback<StartServiceRespBean> {
override fun onSuccess(data: StartServiceRespBean?) {
if (data == null || data.code != 0) return
TaxiModel.loginService!!.queryLoginStatusByNet()
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
VoiceNotice.showNotice("开始接单啦")
d(TAG, "data.data="+GsonUtil.jsonFromObject(data.data))
d(TAG, "data.data=" + GsonUtil.jsonFromObject(data.data))
if (mCurrentTaskAndOrder == null) return
if (mCurrentTaskAndOrder!!.endSite != null){
if (mCurrentTaskAndOrder!!.endSite != null) {
if (mCurrentTaskAndOrder!!.currentStatus == TaskStatusEnum.CompleteTask.code
&& mCurrentTaskAndOrder!!.order != null){ //有任务, 状态为3, 且有订单
&& mCurrentTaskAndOrder!!.order != null
) { //有任务, 状态为3, 且有订单
return
}else if (mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code){
} else if (mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code) {
//有任务, 并且未执行完成
return
}
}
updateUntruthTaskUI(data.data)
updateDriveToNearestStationTaskUI(data.data)
updateUntruthTask(data.data)
}
override fun onFail(code: Int, msg: String?) {
ToastUtilsOch.showWithCodeMessage(code,
ToastUtilsOch.showWithCodeMessage(
code,
"$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" +
" curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}")
" curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}"
)
}
override fun onError() {
@@ -193,30 +195,31 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
ToastUtils.showShort(mContext.getString(R.string.request_error_tip))
}
}
})
}
}
private fun journeyCompleted() {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
CarServiceManager.orderCompleted(AbsMogoApplication.getApp().applicationContext,
mCurrentTaskAndOrder!!.order!!.orderNo,object : OchCommonServiceCallback<BaseData>{
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
TaxiTaskWithOrderServiceManager.orderCompleted(AbsMogoApplication.getApp().applicationContext,
mCurrentTaskAndOrder!!.order!!.orderNo,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "orderCompleted() = onSuccess")
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "orderCompleted() $code $msg")
d(SceneConstant.M_TAXI + TAG, "orderCompleted() $code $msg")
}
})
}
}
private fun jumpPassengerCheckDone() {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null){
CarServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext,
mCurrentTaskAndOrder!!.order!!.orderNo,object : OchCommonServiceCallback<BaseData>{
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
TaxiTaskWithOrderServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext,
mCurrentTaskAndOrder!!.order!!.orderNo,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "jumpPassengerCheckDone() = onSuccess")
}
@@ -229,7 +232,7 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
private fun updateUntruthTask(result: StartServiceRespBean.Result?) {
TaxiModel.updateUntruthTask(result)
TaxiTaskModel.updateUntruthTask(result)
}
private fun updateTaskAndOrderUi() {
@@ -237,29 +240,29 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
sendUiState {
copy(
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(mCurrentTaskAndOrder,
TaxiModel.getCurUntruthTask()
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(
mCurrentTaskAndOrder
)
)
}
}
private fun updateUntruthTaskUI(untruthTask: StartServiceRespBean.Result?) {
d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi")
private fun updateDriveToNearestStationTaskUI(driveToNearestStationTask: StartServiceRespBean.Result?) {
d(TAG, "updateDriveToNearestStationTaskUI = ${driveToNearestStationTask?.toString()}")
sendUiState {
copy(
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(mCurrentTaskAndOrder,
untruthTask)
taskWithOrderUIState = TaskWithOrderUIState.TaskDriveToNearestStationTask(
driveToNearestStationTask
)
)
}
}
private fun updateNoTaskAndOrderUi() {
private fun updateNoTaskWithOrderUI() {
sendUiState {
copy(
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(null,
TaxiModel.getCurUntruthTask()
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(
null,
)
)
}
@@ -274,9 +277,9 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
}
private fun queryCurrentTaskOnce(){
private fun queryCurrentTaskOnce() {
if (!LoginStatusManager.isLogin()) return // 未登陆则不去查询
CarServiceManager.queryCurrentTask(AbsMogoApplication.getApp().applicationContext,
TaxiTaskWithOrderServiceManager.queryCurrentTask(AbsMogoApplication.getApp().applicationContext,
object : OchCommonServiceCallback<QueryCurrentTaskRespBean> {
override fun onSuccess(data: QueryCurrentTaskRespBean?) {
if (data === null) return
@@ -287,69 +290,80 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
d(TAG, "queryCurrentTaskOnce = result = " + GsonUtil.jsonFromObject(result))
d(TAG, "queryCurrentTaskOnce = mCurrentTaskAndOrder = " + GsonUtil.jsonFromObject(mCurrentTaskAndOrder))
d(
TAG,
"queryCurrentTaskOnce = mCurrentTaskAndOrder = " + GsonUtil.jsonFromObject(
mCurrentTaskAndOrder
)
)
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order!= null &&
result != null && result.order == null) {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null &&
result != null && result.order == null
) {
//本地根据订单 orderNo 去查询下(乘客取消订单)
d(TAG, "queryCurrentTaskOnce1 = result order is empty, query order by 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 (mCurrentTaskAndOrder == null || !mCurrentTaskAndOrder!!.equals(result)) {
d(TAG, "queryCurrentTaskOnce1 = mCurrentTaskAndOrder update ")
if (result == null) return
if (result.endSite == null && result.order == null){
if (result.endSite == null && result.order == null) {
mCurrentTaskAndOrder = null
updateNoTaskAndOrderUi()
TaxiModel.updateCurrentTaskAndOrder(null)
updateNoTaskWithOrderUI()
TaxiTaskModel.updateCurrentTaskAndOrder(null)
}
//当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行
if (result.currentStatus == TaskStatusEnum.CompleteTask.code){
if (result.currentStatus == TaskStatusEnum.CompleteTask.code) {
if (result.order != null && result.order!!.orderStatus
== TaxiOrderStatusEnum.ArriveAtStart.code){
== TaxiOrderStatusEnum.ArriveAtStart.code
) {
pullTask(result.endSite!!.siteId)
d(TAG, "queryCurrentTaskOnce1 = pullTask" )
d(TAG, "queryCurrentTaskOnce1 = pullTask")
}else{
} else {
startPrepareTask120S(result.endSite!!.siteId)
d(TAG, "queryCurrentTaskOnce1 = startPrepareTask120S" )
d(TAG, "queryCurrentTaskOnce1 = startPrepareTask120S")
}
}
mCurrentTaskAndOrder = result
TaxiModel.updateCurrentTaskAndOrder(result)
TaxiModel.updateStation()
TaxiTaskModel.updateCurrentTaskAndOrder(result)
TaxiTaskModel.updateStation()
updateTaskAndOrderUi()
if (result.order != null && result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){
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){
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" )
d(TAG, "queryCurrentTaskOnce1 = by lineIds query Contrails")
queryOrderPickUpContrails(lines)
}
if (result.currentStatus <= TaskStatusEnum.StartTask.code){//任务执行中, 去加载下轨迹
d(TAG, "queryCurrentTaskOnce1 = by lineId query Contrail" )
TaxiModel.queryTaskContrail(Array(1) { result.lineId })
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" )
TaxiModel.autoStartDriving()
&& result.currentStatus == TaskStatusEnum.GetTask.code
) {//自动去启动自驾
if (!(result.order != null && result.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)) {
d(TAG, "queryCurrentTaskOnce1 = autoStartDriving")
TaxiTaskModel.autoStartDriving()
return
}
}
@@ -369,13 +383,13 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
*/
private fun queryOrderPickUpContrails(planningLines: Array<Long>?) {
if (planningLines == null) return
contrailList(mContext,planningLines,
object : OchCommonServiceCallback<ContrailListRespBean>{
override fun onSuccess(data: ContrailListRespBean?) {
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){
TaxiModel.updateOrderContrails(contrails)
if (mCurrentTaskAndOrder != null) {
TaxiTaskModel.updateOrderContrails(contrails)
}
}
@@ -387,38 +401,43 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
private fun queryCurrentOrderStatusByNo(orderNo: String) {
queryCarOrderByOrderNo(mContext,orderNo,
object : OchCommonServiceCallback<QueryCarOrderByNoRespBean>{
queryCarOrderByOrderNo(mContext, orderNo,
object : OchCommonServiceCallback<QueryCarOrderByNoRespBean> {
override fun onSuccess(data: QueryCarOrderByNoRespBean?) {
d(SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo data = " +
GsonUtil.jsonFromObject(data))
d(
SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo data = " +
GsonUtil.jsonFromObject(data)
)
if (data == null || data.code != 0) return
if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code){
if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.code) {
VoiceNotice.showNotice("乘客已经取消")
mCurrentTaskAndOrder = null
updateNoTaskAndOrderUi()
updateNoTaskWithOrderUI()
//2020.8.23 到站后不再调用取消自驾. 原因是取消自驾,D档位会溜车
// TaxiModel.cancelAutopilot()
return
}
if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code){//到站
if (data.data.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) {//到站
//结束导航
updateOrderMileAndDur(data.data.mileage,data.data.duration.toInt())
updateOrderMileAndDur(data.data.mileage, data.data.duration.toInt())
return
}
if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code){//完成
if (data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code) {//完成
//获取新的任务
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null){
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null) {
startPrepareTask120S(mCurrentTaskAndOrder!!.endSite!!.siteId)
}
mCurrentTaskAndOrder = null
updateNoTaskAndOrderUi()
updateNoTaskWithOrderUI()
return
}
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "queryCurrentOrderStatusByNo() code=$code,msg=$msg")
d(
SceneConstant.M_TAXI + TAG,
"queryCurrentOrderStatusByNo() code=$code,msg=$msg"
)
}
})
@@ -429,8 +448,10 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
sendUiState {
copy(
taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo(mileage,
duration)
taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripInfo(
mileage,
duration
)
)
}
}
@@ -442,21 +463,23 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
}
private fun pullTask(siteId: Long) {
CarServiceManager.prepareTask(
TaxiTaskWithOrderServiceManager.prepareTask(
mContext,
siteId,
object : OchCommonServiceCallback<PrepareTaskRespBean> {
override fun onSuccess(data: PrepareTaskRespBean?) {
d(SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data)
+ ", isOpeningOrderStatus = ${isOpeningOrderStatus()}")
d(
SceneConstant.M_TAXI + TAG, "prepareTask = " + GsonUtil.jsonFromObject(data)
+ ", isOpeningOrderStatus = ${isOpeningOrderStatus()}"
)
if (data?.data == null || data.code != 0) return
//去下载轨迹, 下发给工控机下载
TaxiModel.queryTaskContrail(Array(1) { data.data!!.lineId })
TaxiTaskModel.queryTaskContrail(Array(1) { data.data!!.lineId })
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "$code $msg")
if (isLogin() && isOpeningOrderStatus()){
if (isLogin() && isOpeningOrderStatus()) {
startPrepareTask120S(siteId) //失败后30s再次调用获取下一任务
}
}

View File

@@ -11,12 +11,17 @@ sealed class TaskWithOrderUIState {
object Init : TaskWithOrderUIState()
/**
* 演练任务接驾任务送驾任务
* 演练任务接驾任务送驾任务
*/
data class TaskWithOrder(
val taskWithOrder: QueryCurrentTaskRespBean.Result?,
val driveToNearestStationTask: StartServiceRespBean.Result?
val taskWithOrder: QueryCurrentTaskRespBean.Result?
) : TaskWithOrderUIState()
/**
* 特殊任务:人工驾驶去最近的站点任务
*/
data class TaskDriveToNearestStationTask(val driveToNearestStationTask: StartServiceRespBean.Result?) :
TaskWithOrderUIState()
data class UpdateTaskTripInfo(val mileage: Float, val duration: Int) : TaskWithOrderUIState()
}

View File

@@ -0,0 +1,54 @@
package com.mogo.och.taxi.utils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import io.reactivex.exceptions.UndeliverableException
import io.reactivex.functions.Consumer
import io.reactivex.plugins.RxJavaPlugins
import java.io.IOException
object RxJavaUtils {
fun setErrorHandler(tag: String) {
//2022.1.28
// 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
// The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
RxJavaPlugins.setErrorHandler(Consumer { e ->
var e = e
if (e is UndeliverableException) {
e = (e.cause)!!
CallerLogger.d(tag, "UndeliverableException")
}
if ((e is IOException)) { //
// fine, irrelevant network problem or API that throws on cancellation
CallerLogger.d(tag, "IOException")
return@Consumer
}
if (e is InterruptedException) {
// fine, some blocking code was interrupted by a dispose call
CallerLogger.d(tag, "InterruptedException")
return@Consumer
}
if ((e is NullPointerException) || (e is IllegalArgumentException)) {
// that's likely a bug in the application
CallerLogger.d(
tag,
"NullPointerException or IllegalArgumentException"
)
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(
Thread.currentThread(),
e
)
return@Consumer
}
if (e is IllegalStateException) {
// that's a bug in RxJava or in a custom operator
CallerLogger.d(tag, "IllegalStateException")
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(
Thread.currentThread(),
e
)
return@Consumer
}
CallerLogger.d(tag, "Undeliverable exception")
})
}
}

View File

@@ -1,7 +1,5 @@
package com.mogo.och.taxi.utils;
import com.mogo.och.taxi.model.TaxiModel;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

View File

@@ -6,13 +6,12 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.GsonUtils;
import com.mogo.och.taxi.bean.ContrailListRespBean;
import com.mogo.och.taxi.bean.TrajectoryListRespBean;
import com.mogo.och.taxi.bean.OrderDetail;
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean;
import com.mogo.och.taxi.bean.Site;
import com.mogo.och.taxi.constant.TaskStatusEnum;
import com.mogo.och.taxi.constant.TaxiUnmannedConst;
import com.mogo.och.taxi.model.TaxiModel;
import com.mogo.och.taxi.ui.task.TaxiTaskModel;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -67,7 +66,7 @@ public class TaxiTrajectoryManager {
* 同步订单信息
*/
public void syncTrajectoryInfo() {
QueryCurrentTaskRespBean.Result taskAndOrder = TaxiModel.INSTANCE.getCurTaskAndOrder();
QueryCurrentTaskRespBean.Result taskAndOrder = TaxiTaskModel.INSTANCE.getCurTaskAndOrder();
if (taskAndOrder == null || taskAndOrder.getCurrentStatus() >= TaskStatusEnum.StartTask.getCode()) {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() stop.");
stopTrajReqLoop();
@@ -116,7 +115,7 @@ public class TaxiTrajectoryManager {
}
private void setupAutoPilotLine() {
QueryCurrentTaskRespBean.Result taskAndOrder = TaxiModel.INSTANCE.getCurTaskAndOrder();
QueryCurrentTaskRespBean.Result taskAndOrder = TaxiTaskModel.INSTANCE.getCurTaskAndOrder();
if (taskAndOrder == null || taskAndOrder.getEndSite() == null) {
CallerLogger.INSTANCE.e(M_TAXI + TAG,
@@ -129,7 +128,7 @@ public class TaxiTrajectoryManager {
* 4、若不存在,说明当前的执行的任务是与订单无关的演练任务,通知下载加载当前任务的轨迹以及预加载订单轨迹集合的第一个
*/
final ContrailListRespBean.Result curTaskContrail = TaxiModel.INSTANCE.getCurTaskContrail();
final TrajectoryListRespBean.Result curTaskContrail = TaxiTaskModel.INSTANCE.getCurrentTaskTrajectory();
if (curTaskContrail == null) return;
long curLineId = taskAndOrder.getLineId();
@@ -157,8 +156,8 @@ public class TaxiTrajectoryManager {
}
final OrderDetail orderDetail = taskAndOrder.getOrder();
ContrailListRespBean.Result preloadContrail = null; //预加载的轨迹
final List<ContrailListRespBean.Result> orderContrails = TaxiModel.INSTANCE.getCurOrderContrails();
TrajectoryListRespBean.Result preloadContrail = null; //预加载的轨迹
final List<TrajectoryListRespBean.Result> orderContrails = TaxiTaskModel.INSTANCE.getCurrentOrderTrajectoryList();
if (orderDetail != null && orderContrails != null && orderContrails.size() != 0 ){
for (int i = 0; i< orderContrails.size() ; i++){