[Taxi无人化] refactor: 命名 & 层级 & TaskModel & TaskViewModel & Fragment;

This commit is contained in:
aibingbing
2023-08-25 17:31:35 +08:00
committed by zhongchao
parent ec0bb3c6db
commit 3cf7e35b57
16 changed files with 358 additions and 496 deletions

View File

@@ -6,7 +6,6 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@@ -20,21 +19,9 @@ abstract class BaseViewModel<UiState : IUiState, UiIntent : IUiIntent> : ViewMod
private val _uiStateFlow = MutableStateFlow(initUiState())
val uiStateFlow: StateFlow<UiState> = _uiStateFlow
protected abstract fun initUiState(): UiState
protected fun sendUiState(copy: UiState.() -> UiState){
_uiStateFlow.update { copy(_uiStateFlow.value) }
}
private val _uiIntentFlow: Channel<UiIntent> = Channel()
val uiIntentFlow: Flow<UiIntent> = _uiIntentFlow.receiveAsFlow()
fun sendUiIntent(uiIntent: UiIntent){
viewModelScope.launch {
_uiIntentFlow.send(uiIntent)
}
}
init {
viewModelScope.launch {
uiIntentFlow.collect {
@@ -43,5 +30,17 @@ abstract class BaseViewModel<UiState : IUiState, UiIntent : IUiIntent> : ViewMod
}
}
protected abstract fun initUiState(): UiState
protected fun sendUiState(copy: UiState.() -> UiState) {
_uiStateFlow.update { copy(_uiStateFlow.value) }
}
fun sendUiIntent(uiIntent: UiIntent) {
viewModelScope.launch {
_uiIntentFlow.send(uiIntent)
}
}
protected abstract fun handleIntent(intent: IUiIntent)
}

View File

@@ -1,4 +1,5 @@
package com.mogo.och.taxi.base
import androidx.annotation.Keep
/**

View File

@@ -0,0 +1,21 @@
package com.mogo.och.taxi.callback
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean
import com.mogo.och.taxi.bean.StartServiceRespBean
interface ITaxiCarServiceCallback {
fun onCarEndServiceSuccess(
driveToNearestStationTask: StartServiceRespBean.Result?,
currentTaskWithOrder: QueryCurrentTaskRespBean.Result?
)
fun onCarEndServiceFailed(code: Int, msg: String)
fun onCarEndServiceError()
fun onCarStartServiceSuccess(
driveToNearestStationTask: StartServiceRespBean.Result?,
currentTaskWithOrder: QueryCurrentTaskRespBean.Result?
)
fun onCarStartServiceFailed(code: Int, msg: String)
fun onCarStartServiceError()
}

View File

@@ -3,7 +3,7 @@ package com.mogo.och.taxi.callback
import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean
import com.mogo.och.taxi.bean.TrajectoryListRespBean
interface ITaxiTaskCallback {
interface ITaxiTaskWithOrderCallback {
fun onTaskWithOrderDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?)
fun onTaskCompleted(isOrderArrivedAtStart: Boolean, siteId: Long)
fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?)
@@ -11,4 +11,5 @@ interface ITaxiTaskCallback {
fun onOrderArriveAtEnd(orderNo: String)
fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int)
fun onOrderJourneyCompleted()
fun onStartAutopilot()
}

View File

@@ -9,13 +9,13 @@ import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean
import com.mogo.och.common.module.biz.network.LoginDefaultManage
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
class LoginBusImpl: LoginDefaultManage {
class TaxiDriverLoginImpl : LoginDefaultManage {
override fun getPhoneCode(
context: Context, phone: String?,
callback: OchCommonServiceCallback<BaseData>?
) {
OchCommonServiceManager.getPhoneCode(context,phone,callback)
TaxiDriverLoginServiceManager.getPhoneCode(context, phone, callback)
}
override fun gotoLoginBycode(
@@ -25,7 +25,7 @@ class LoginBusImpl: LoginDefaultManage {
location4Login: TaxiLoginReqBean.Location4Login?,
callback: OchCommonServiceCallback<TaxiLoginRespBean>?
) {
OchCommonServiceManager.gotoLoginBycode(context,phone,code,location4Login,callback)
TaxiDriverLoginServiceManager.gotoLoginBycode(context, phone, code, location4Login, callback)
}
override fun logout(
@@ -33,15 +33,13 @@ class LoginBusImpl: LoginDefaultManage {
location4Login: TaxiLogoutReqBean.Location4Login?,
callback: OchCommonServiceCallback<BaseData>?
) {
OchCommonServiceManager.logout(context,location4Login,callback)
TaxiDriverLoginServiceManager.logout(context, location4Login, callback)
}
override fun queryDriverServiceStatus(
context: Context,
callback: OchCommonServiceCallback<DriverStatusQueryRespBean>?
) {
OchCommonServiceManager.queryDriverServiceStatus(context,callback)
TaxiDriverLoginServiceManager.queryDriverServiceStatus(context, callback)
}
}

View File

@@ -1,10 +1,9 @@
package com.mogo.och.taxi.network;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean;
import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean;
import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
import com.mogo.och.taxi.bean.UnmannedLoginReqBean;
import com.mogo.och.taxi.bean.UnmannedLogoutReqBean;
@@ -18,28 +17,30 @@ import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
*
* <p>
* 网约车-出租车接口定义
*/
interface OchLoginServiceApi {
interface TaxiDriverLoginServiceApi {
/**
* 获取手机验证码
*
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/och-taxi-cabin/api/sms/v1/sendSms" )
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-taxi-cabin/api/sms/v1/sendSms")
Observable<DriverStatusQueryRespBean> getPhoneCode(@Header("appId") String appId
, @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data);
/**
* 通过验证码登录
*
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/och-taxi-cabin/api/flow/v1/startOperation" )
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-taxi-cabin/api/flow/v1/startOperation")
Observable<TaxiLoginRespBean> gotoLoginBycode4Taxi(@Header("appId") String appId
, @Header("ticket") String ticket, @Body UnmannedLoginReqBean data);
@@ -49,16 +50,17 @@ interface OchLoginServiceApi {
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-taxi-cabin/api/flow/v1/endOperation")
Observable<BaseData> logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket,
@Body UnmannedLogoutReqBean data);
@Body UnmannedLogoutReqBean data);
/**
* 接单状态和登录状态查询 出租车司机端小巴车司机端小巴车乘客端
*
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/och-taxi-cabin/api/business/v1/loginStatus")
Observable<DriverStatusQueryRespBean> queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId
@Headers({"Content-type:application/json;charset=UTF-8"})
@GET("/och-taxi-cabin/api/business/v1/loginStatus")
Observable<DriverStatusQueryRespBean> queryDriverServiceStatusAndLoginStatus(@Header("appId") String appId
, @Header("ticket") String ticket, @Query("sn") String sn);
}

View File

@@ -24,13 +24,13 @@ import com.mogo.och.taxi.bean.UnmannedLogoutReqBean
/**
* Created by pangfan on 2021/8/19
*/
object OchCommonServiceManager {
object TaxiDriverLoginServiceManager {
private const val TAG = "OchCommonServiceManager"
private val mOCHTaxiServiceApi: OchLoginServiceApi =
private val mOCHTaxiServiceApi: TaxiDriverLoginServiceApi =
MoGoRetrofitFactory.getInstance(getBaseUrl()).create(
OchLoginServiceApi::class.java
TaxiDriverLoginServiceApi::class.java
)
/**

View File

@@ -27,7 +27,7 @@ import retrofit2.http.Query
* @author: wangmingjun
* @date: 2023/7/26
*/
interface UnmannedTaskServiceApi {
interface TaxiTaskWithOrderServiceApi {
/**
* 开始接单

View File

@@ -27,9 +27,9 @@ import com.mogo.och.taxi.bean.TrajectoryListRespBean
*/
object TaxiTaskWithOrderServiceManager {
private var mOCHTaxiServiceApi: UnmannedTaskServiceApi =
private var mOCHTaxiServiceApi: TaxiTaskWithOrderServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
UnmannedTaskServiceApi::class.java
TaxiTaskWithOrderServiceApi::class.java
)
/**

View File

@@ -12,11 +12,13 @@ import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
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.network.LoginBusImpl
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.network.TaxiDriverLoginImpl
import com.mogo.och.taxi.ui.personal.TaxiPersonalDialogFragment
import com.mogo.och.taxi.ui.task.TaxiTaskModel
import com.mogo.och.taxi.ui.task.TaxiTaskTabFragment
@@ -85,7 +87,7 @@ class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
loginService =
ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService
if (loginService != null) {
loginService!!.registerFragment(this, presenter, LoginBusImpl())
loginService!!.registerFragment(this, presenter, TaxiDriverLoginImpl())
}
}
@@ -230,7 +232,19 @@ class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
}
findViewById<View>(R.id.test_bar_start_service_confirm)?.setOnClickListener {
TaxiTaskModel.toStartTask()
if (!TaxiTaskModel.checkCurrentTaskCondition()) {
ToastUtils.showShort("无任务!")
return@setOnClickListener
}
//当前订单状态若为20 , 则使用的lineId为订单信息的
TaxiTaskModel.getCurTaskAndOrder()?.let {
TaxiTaskModel.startTask(
if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)
it.order!!.orderLine
else
it.lineId
)
}
}
findViewById<View>(R.id.test_bar_on_the_way_to_end)?.setOnClickListener {

View File

@@ -37,7 +37,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
public TaxiPresenter(TaxiFragment view) {
super(view);
TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp());
TaxiTaskModel.INSTANCE.init();
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}

View File

@@ -21,7 +21,7 @@ import java.util.List;
/**
* @author congtaowang
* @since 2021/1/18
*
* <p>
* 描述
*/
public class RoutingNaviPresenter extends Presenter<TaxiRoutingNaviFragment> implements IOCHTaxiAutopilotPlanningCallback {
@@ -30,31 +30,31 @@ public class RoutingNaviPresenter extends Presenter<TaxiRoutingNaviFragment> imp
public RoutingNaviPresenter(TaxiRoutingNaviFragment view) {
super(view);
TaxiTaskModel.INSTANCE.init(AbsMogoApplication.getApp());
TaxiTaskModel.INSTANCE.init();
initListeners();
}
@Override
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
CallerLogger.d( M_TAXI + TAG, " onCreate" );
public void onCreate(@NonNull LifecycleOwner owner) {
super.onCreate(owner);
CallerLogger.d(M_TAXI + TAG, " onCreate");
}
@Override
public void onDestroy( @NonNull LifecycleOwner owner ) {
super.onDestroy( owner );
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
}
private void initListeners() {
TaxiTaskModel.INSTANCE.setMoGoAutopilotPlanningListener(this);
}
private void runOnUIThread( Runnable executor ) {
if ( executor == null ) {
private void runOnUIThread(Runnable executor) {
if (executor == null) {
return;
}
if ( Looper.myLooper() != Looper.getMainLooper() ) {
UiThreadHandler.post( executor );
if (Looper.myLooper() != Looper.getMainLooper()) {
UiThreadHandler.post(executor);
} else {
executor.run();
}
@@ -62,11 +62,11 @@ public class RoutingNaviPresenter extends Presenter<TaxiRoutingNaviFragment> imp
@Override
public void setLineMarker(LatLng startStation, LatLng endStation) {
runOnUIThread(() -> mView.setLineMarker(startStation,endStation));
runOnUIThread(() -> mView.setLineMarker(startStation, endStation));
}
@Override
public void routeResult(List<LatLng> routeArrivied, List<LatLng> routeArriving, MogoLocation location) {
mView.routeResult(routeArrivied,routeArriving,location);
mView.routeResult(routeArrivied, routeArriving, location);
}
}

View File

@@ -149,7 +149,7 @@ class TaxiCurrentTaskFragment : BaseFragment(),
}
private fun initViewModelObserver() {
mViewModel.sendUiIntent(UnmannedIntent.StartTaskOrOrderLooper)
mViewModel.sendUiIntent(UnmannedIntent.StartTaskWithOrderLooper)
//监听返回的数据状态
lifecycleScope.launchWhenStarted {
@@ -245,7 +245,7 @@ class TaxiCurrentTaskFragment : BaseFragment(),
}
fun onCarTakeOrderStatusChanged() {
mViewModel.sendUiIntent(UnmannedIntent.StartOrPauseTakeOrder)
mViewModel.sendUiIntent(UnmannedIntent.StartOrEndTakeOrder)
}
private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) {
@@ -559,7 +559,7 @@ class TaxiCurrentTaskFragment : BaseFragment(),
if (mCurrentTaskWithOrder == null || mCurrentTaskWithOrder!!.order == null) return
val order = mCurrentTaskWithOrder!!.order
if (TaxiOrderStatusEnum.ArriveAtStart.code == order!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证
mViewModel.sendUiIntent(UnmannedIntent.JumpPassengerCheckDone)
mViewModel.sendUiIntent(UnmannedIntent.JumpPassengerCheck)
} else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) {
mViewModel.sendUiIntent(UnmannedIntent.StartTask)
} else if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) { //点击了完成服务,结束订单并更新订单信息

View File

@@ -1,61 +1,48 @@
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
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.ITaxiCarServiceCallback
import com.mogo.och.taxi.callback.ITaxiTaskWithOrderCallback
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.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>(),
ITaxiTaskWithOrderCallback, ITaxiCarServiceCallback {
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.setTaskWithOrderCallback(this)
TaxiTaskModel.setCarServiceCallback(this)
}
override fun initUiState(): UnmannedState {
return UnmannedState(TaskWithOrderUIState.Init)
@@ -63,16 +50,16 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>()
override fun handleIntent(intent: IUiIntent) {
when (intent) {
is UnmannedIntent.StartTaskOrOrderLooper -> { //开始轮询
startOrStopOrderLoop(true)
is UnmannedIntent.StartTaskWithOrderLooper -> { //开始轮询
startOrStopCurrentTaskWithOrderLoop(true)
}
is UnmannedIntent.StartOrPauseTakeOrder -> {//开始、暂停接单
updateCarStatus()
is UnmannedIntent.StartOrEndTakeOrder -> {//开始、暂停接单
TaxiTaskModel.updateCarServingStatus()
}
is UnmannedIntent.JumpPassengerCheckDone -> { //手动点击跳过乘客验证
jumpPassengerCheckDone()
is UnmannedIntent.JumpPassengerCheck -> { //手动点击跳过乘客验证
jumpPassengerCheck()
}
is UnmannedIntent.JourneyCompleted -> { //点击服务完成
@@ -80,168 +67,113 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, UnmannedIntent>()
}
is UnmannedIntent.CloseOrderByDriver -> {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
val site = mCurrentTaskAndOrder!!.order!!.orderEndSite
TaxiTaskModel.submitArriveSite(site!!.siteId, true)
}
closeOrderByDriver()
}
is UnmannedIntent.CancelOrder -> {// 取消订单, 暂未加取消类型和原因
handleCancelOrder(intent.type)
cancelOrder(intent.type)
}
is UnmannedIntent.StartTask -> {
TaxiTaskModel.toStartTask()
startTask()
}
}
}
private fun handleCancelOrder(cancelType: Int) {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
cancelOrder(mContext, mCurrentTaskAndOrder!!.order!!.orderNo, cancelType,
fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) {
d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start")
if (start) {
TaxiTaskModel.startQueryCurrentTaskWithOrderLoop()
} else {
TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop()
}
}
private fun cancelOrder(cancelType: Int) {
val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder()
currentTaskWithOrder?.order?.also {
cancelOrder(AbsMogoApplication.getApp().applicationContext,
it.orderNo,
cancelType,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() = onSuccess")
d(TAG, "handleCancelOrder() = onSuccess")
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "handleCancelOrder() $code $msg")
d(TAG, "handleCancelOrder() $code $msg")
}
})
}
}
/**
* 更新接单状态
*/
private fun updateCarStatus() {
if (!isLogin()) {
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
return
}
if (isOpeningOrderStatus()) {//接单状态下,去结束
TaxiTaskWithOrderServiceManager.endService(mContext,
private fun jumpPassengerCheck() {
val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder()
currentTaskWithOrder?.order?.also {
TaxiTaskWithOrderServiceManager.jumpPassengerCheck(AbsMogoApplication.getApp().applicationContext,
it.orderNo,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
//需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的
d(TAG, "set mUntruthSiteTask null")
updateDriveToNearestStationTaskUI(null)
updateUntruthTask(null)
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.endSite != null
&& mCurrentTaskAndOrder!!.startSite != null
&& mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code
) {
VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦")
} else {
VoiceNotice.showNotice("暂停接单啦")
}
}
override fun onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip))
}
}
override fun onFail(code: Int, msg: String) {
ToastUtilsOch.showWithCodeMessage(code, msg)
}
})
} 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
TaxiTaskModel.loginService!!.queryLoginStatusByNet()
VoiceNotice.showNotice("开始接单啦")
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, 且有订单
return
} else if (mCurrentTaskAndOrder!!.currentStatus < TaskStatusEnum.CompleteTask.code) {
//有任务, 并且未执行完成
return
}
}
updateDriveToNearestStationTaskUI(data.data)
updateUntruthTask(data.data)
d(TAG, "jumpPassengerCheck onSuccess:")
}
override fun onFail(code: Int, msg: String?) {
ToastUtilsOch.showWithCodeMessage(
code,
"$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" +
" curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}"
)
}
override fun onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(mContext.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(mContext.getString(R.string.request_error_tip))
}
d(TAG, "jumpPassengerCheck onFail: code=$code, msg=$msg")
}
})
}
}
private fun journeyCompleted() {
if (mCurrentTaskAndOrder != null && mCurrentTaskAndOrder!!.order != null) {
val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder()
currentTaskWithOrder?.order?.also {
TaxiTaskWithOrderServiceManager.orderCompleted(AbsMogoApplication.getApp().applicationContext,
mCurrentTaskAndOrder!!.order!!.orderNo,
it.orderNo,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(SceneConstant.M_TAXI + TAG, "orderCompleted() = onSuccess")
d(TAG, "journeyCompleted onSuccess")
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "orderCompleted() $code $msg")
d(TAG, "journeyCompleted onFail: code=$code, msg=$msg")
}
})
}
}
private fun jumpPassengerCheckDone() {
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")
}
override fun onFail(code: Int, msg: String?) {
d(SceneConstant.M_TAXI + TAG, "jumpPassengerCheckDone() $code $msg")
}
})
private fun closeOrderByDriver() {
val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder()
currentTaskWithOrder?.order?.orderEndSite?.also {
TaxiTaskModel.submitArriveSite(it.siteId, true)
}
}
private fun updateUntruthTask(result: StartServiceRespBean.Result?) {
TaxiTaskModel.updateUntruthTask(result)
private fun startTask() {
if (!TaxiTaskModel.checkCurrentTaskCondition()) {
ToastUtils.showShort("无任务!")
return
}
//当前订单状态若为20 , 则使用的lineId为订单信息的
TaxiTaskModel.getCurTaskAndOrder()?.let {
TaxiTaskModel.startTask(
if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)
it.order!!.orderLine
else
it.lineId
)
}
}
private fun updateTaskAndOrderUi() {
d(TAG, "queryCurrentTaskOnce = updateTaskAndOrderUi")
private fun updateTaskAndOrderUi(currentTaskWithOrder: QueryCurrentTaskRespBean.Result?) {
d(
TAG, "updateTaskAndOrderUi: currentTaskWithOrder=${
GsonUtil.getGson().toJson(currentTaskWithOrder)
}"
)
sendUiState {
copy(
taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder(
mCurrentTaskAndOrder
currentTaskWithOrder
)
)
}
@@ -258,257 +190,123 @@ 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) {
override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) {
d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result))
result?.also {
updateTaskAndOrderUi(result)
}
}
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("乘客已经取消")
updateTaskAndOrderUi(null)
}
override fun onOrderArriveAtEnd(orderNo: String) {
TaxiTaskModel.queryOrderByOrderNo(orderNo)
}
override fun onOrderTotalMileAndDurationChanged(mileage: Float, duration: Int) {
//更新总全程信息(公里和分钟)
updateOrderTotalMileAndDurationUI(mileage, duration)
}
override fun onOrderJourneyCompleted() {
updateTaskAndOrderUi(null)
//获取新的任务
val currentTaskWithOrder = TaxiTaskModel.getCurTaskAndOrder()
currentTaskWithOrder?.endSite?.also {
TaxiTaskModel.startPrepareTask120S(it.siteId)
}
}
override fun onStartAutopilot() {
UiThreadHandler.postDelayed({
pullTask(siteId)
}, TaxiUnmannedConst.TIMER_PREPARE_TASK_INTERVAL)
startTask() //状态流转
TaxiTaskModel.startAutoPilot() //自驾开启
VoiceNotice.showNotice("车辆正在自动开启自动驾驶")
}, TaxiUnmannedConst.START_AUTOPILOT_COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转
}
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
override fun onCarEndServiceSuccess(
driveToNearestStationTask: StartServiceRespBean.Result?,
currentTaskWithOrder: QueryCurrentTaskRespBean.Result?
) {
if (currentTaskWithOrder?.endSite != null && currentTaskWithOrder.startSite != null && currentTaskWithOrder.currentStatus < TaskStatusEnum.CompleteTask.code) {
VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦")
} else {
VoiceNotice.showNotice("暂停接单啦")
}
i(SceneConstant.M_TAXI + TAG, "startInAndWaitOrdersLoop()")
mInAndWaitServiceDisposable = Observable.interval(
TaxiUnmannedConst.LOOP_DELAY,
TaxiUnmannedConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS
updateDriveToNearestStationTaskUI(driveToNearestStationTask)
}
override fun onCarEndServiceFailed(code: Int, msg: String) {
ToastUtilsOch.showWithCodeMessage(code, msg)
}
override fun onCarEndServiceError() {
val context = AbsMogoApplication.getApp().applicationContext
if (!NetworkUtils.isConnected(context)) {
ToastUtils.showShort(context.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(context.getString(R.string.request_error_tip))
}
}
override fun onCarStartServiceSuccess(
driveToNearestStationTask: StartServiceRespBean.Result?,
currentTaskWithOrder: QueryCurrentTaskRespBean.Result?
) {
VoiceNotice.showNotice("开始接单啦")
currentTaskWithOrder?.apply {
if (endSite != null) {
when {
currentStatus == TaskStatusEnum.CompleteTask.code && order != null -> return
currentStatus < TaskStatusEnum.CompleteTask.code -> return
}
}
}
updateDriveToNearestStationTaskUI(driveToNearestStationTask)
}
override fun onCarStartServiceFailed(code: Int, msg: String) {
ToastUtilsOch.showWithCodeMessage(
code,
"$msg curLatitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude}" + " curLongitude = ${CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude}"
)
.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
override fun onCarStartServiceError() {
val context = AbsMogoApplication.getApp().applicationContext
if (!NetworkUtils.isConnected(context)) {
ToastUtils.showShort(context.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(context.getString(R.string.request_error_tip))
}
}
}

View File

@@ -1,6 +1,5 @@
package com.mogo.och.taxi.ui.task
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.text.TextUtils
@@ -54,7 +53,6 @@ import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceM
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint
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
@@ -63,9 +61,10 @@ import com.mogo.och.taxi.bean.StartServiceRespBean
import com.mogo.och.taxi.bean.TrajectoryListRespBean
import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback
import com.mogo.och.taxi.callback.ITaxiCarServiceCallback
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.callback.ITaxiTaskWithOrderCallback
import com.mogo.och.taxi.constant.TaskStatusEnum
import com.mogo.och.taxi.constant.TaskTypeEnum
import com.mogo.och.taxi.constant.TaxiCarServingStatusManager
@@ -73,7 +72,6 @@ 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.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
@@ -94,12 +92,11 @@ import java.util.concurrent.TimeUnit
* @author: wangmingjun
* @date: 2023/7/25
*/
@SuppressLint("StaticFieldLeak")
object TaxiTaskModel {
private val TAG = SceneConstant.M_TAXI + TaxiTaskModel::class.java.simpleName
private lateinit var mContext: Context
private val mContext: Context
get() = AbsMogoApplication.getApp().applicationContext
private var mQueryTaskWithOrderDisposable: Disposable? = null
@@ -116,7 +113,9 @@ object TaxiTaskModel {
private var mAutopilotPlanningCallback: IOCHTaxiAutopilotPlanningCallback? = null
private var mTaxiTaskCallback: ITaxiTaskCallback? = null
private var mTaxiTaskWithOrderCallback: ITaxiTaskWithOrderCallback? = null
private var mTaxiCarServiceCallback: ITaxiCarServiceCallback? = null
//当前任务和订单
private var mCurrentTaskWithOrder: QueryCurrentTaskRespBean.Result? = null
@@ -151,12 +150,15 @@ object TaxiTaskModel {
mOrderStatusCallback = callback
}
fun setTaskCallback(callback: ITaxiTaskCallback) {
mTaxiTaskCallback = callback
fun setTaskWithOrderCallback(callback: ITaxiTaskWithOrderCallback) {
mTaxiTaskWithOrderCallback = callback
}
fun init(context: Context) {
mContext = context.applicationContext
fun setCarServiceCallback(callback: ITaxiCarServiceCallback) {
mTaxiCarServiceCallback = callback
}
fun init() {
loginService =
ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService
initListeners()
@@ -341,7 +343,8 @@ object TaxiTaskModel {
}
if (checkCurrentTaskCondition()
&& mCurrentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code) {
&& mCurrentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code
) {
// judgeTaskStartStation(mogoLocation)
judgeTaskEndSiteStation(mogoLocation)
}
@@ -613,7 +616,7 @@ object TaxiTaskModel {
//当前任务完成且订单状态到达乘客上车点, 则立马去拉取任务 不再等30s,否则送驾任务要等30s后才能去执行
if (result?.currentStatus == TaskStatusEnum.CompleteTask.code) {
mTaxiTaskCallback?.onTaskCompleted(
mTaxiTaskWithOrderCallback?.onTaskCompleted(
QueryCurrentTaskRespBean.isOrderArriveAtStart(
result
),
@@ -626,7 +629,7 @@ object TaxiTaskModel {
//达到终点后查询全程里程和用时
if (QueryCurrentTaskRespBean.isOrderArriveAtEnd(result)) {
d(TAG, "queryCurrentTaskOnce ArriveAtEnd")
mTaxiTaskCallback?.onOrderArriveAtEnd(result.order!!.orderNo)
mTaxiTaskWithOrderCallback?.onOrderArriveAtEnd(result.order!!.orderNo)
}
//根据lineId集合去查轨迹集合, 返回的只是接驾任务的line集合, 没有送驾任务
@@ -644,11 +647,13 @@ object TaxiTaskModel {
) {
if (result.order == null || result.order!!.orderStatus < TaxiOrderStatusEnum.ArriveAtStart.code) {
d(TAG, "queryCurrentTaskOnce autoStartDriving")
autoStartDriving()
//启动动画+文字
mControllerStatusCallback?.startOpenAutopilotNonManual()
mTaxiTaskWithOrderCallback?.onStartAutopilot()
}
}
mTaxiTaskCallback?.onTaskWithOrderDataChanged(mCurrentTaskWithOrder)
mTaxiTaskWithOrderCallback?.onTaskWithOrderDataChanged(mCurrentTaskWithOrder)
}
}
@@ -686,22 +691,22 @@ object TaxiTaskModel {
if (data == null) return
when (data.data.orderStatus) {
TaxiOrderStatusEnum.Cancel.code -> {
mTaxiTaskCallback?.onOrderCancel()
//更新本地标志位
mCurrentTaskWithOrder?.order = null
mTaxiTaskWithOrderCallback?.onOrderCancel()
}
TaxiOrderStatusEnum.ArriveAtEnd.code -> {
mTaxiTaskCallback?.onOrderTotalMileAndDurationChanged(
mTaxiTaskWithOrderCallback?.onOrderTotalMileAndDurationChanged(
data.data.mileage,
data.data.duration.toInt()
)
}
TaxiOrderStatusEnum.JourneyCompleted.code -> {
mTaxiTaskCallback?.onOrderJourneyCompleted()
//更新本地标志位
mCurrentTaskWithOrder?.order = null
mTaxiTaskWithOrderCallback?.onOrderJourneyCompleted()
}
}
}
@@ -766,7 +771,7 @@ object TaxiTaskModel {
mTaskTrajectoryList.addAll(it)
mCurrentTaskTrajectory = it.first { currentTaskLineId == it.lineId }
}
mTaxiTaskCallback?.onTaskTrajectoryDataChanged(data)
mTaxiTaskWithOrderCallback?.onTaskTrajectoryDataChanged(data)
}
override fun onFail(code: Int, msg: String?) {
@@ -775,6 +780,61 @@ object TaxiTaskModel {
})
}
fun updateCarServingStatus() {
if (!LoginStatusManager.isLogin()) {
loginService?.queryLoginStatusByNet()
return
}
if (TaxiCarServingStatusManager.isCarServingStatus()) {//接单状态下,去结束
TaxiTaskWithOrderServiceManager.endService(
mContext,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
loginService?.queryLoginStatusByNet()
//需要将虚拟任务停掉, 虚拟任务会再开始接单后获取新的
mDriveToNearestStationTask = null
mTaxiCarServiceCallback?.onCarEndServiceSuccess(
mDriveToNearestStationTask,
mCurrentTaskWithOrder
)
}
override fun onError() {
mTaxiCarServiceCallback?.onCarEndServiceError()
}
override fun onFail(code: Int, msg: String) {
mTaxiCarServiceCallback?.onCarEndServiceFailed(code, msg)
}
})
} else {
//暂停接单状态下,去接单
TaxiTaskWithOrderServiceManager.startService(mContext,
CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().latitude,
CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().longitude,
object : OchCommonServiceCallback<StartServiceRespBean> {
override fun onSuccess(data: StartServiceRespBean?) {
if (data == null) return
d(TAG, "data.data=" + GsonUtil.jsonFromObject(data.data))
loginService?.queryLoginStatusByNet()
mDriveToNearestStationTask = data.data
mTaxiCarServiceCallback?.onCarStartServiceSuccess(
mDriveToNearestStationTask,
mCurrentTaskWithOrder
)
}
override fun onFail(code: Int, msg: String) {
mTaxiCarServiceCallback?.onCarStartServiceFailed(code, msg)
}
override fun onError() {
mTaxiCarServiceCallback?.onCarStartServiceError()
}
})
}
}
// 获取当前订单状态
fun getCurOrderStatus(): TaxiOrderStatusEnum? {
if (mCurrentTaskWithOrder == null) TaxiOrderStatusEnum.None
@@ -1058,19 +1118,18 @@ object TaxiTaskModel {
}
}
private fun startTask(lineId: Long) {
fun startTask(lineId: Long) {
TaxiTaskWithOrderServiceManager.startTask(
mContext,
lineId,
object : OchCommonServiceCallback<BaseData> {
override fun onSuccess(data: BaseData?) {
d(TAG, GsonUtil.jsonFromObject(data))
d(TAG, "startTask onSuccess: data=${GsonUtil.jsonFromObject(data)}")
}
override fun onFail(code: Int, msg: String?) {
d(TAG, "$code $msg")
d(TAG, "startTask onFail: code=$code, msg=$msg")
}
})
}
@@ -1133,23 +1192,6 @@ object TaxiTaskModel {
autopilotArriveAtStation()
}
fun toStartTask() {
if (!checkCurrentTaskCondition()) {
ToastUtils.showShort("无任务!")
return
}
//当前订单状态若为20 , 则使用的lineId为订单信息的
mCurrentTaskWithOrder?.let {
startTask(
if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code)
it.order!!.orderLine
else
it.lineId
)
}
}
/**
* 测试开启自动驾驶
*/
@@ -1160,7 +1202,6 @@ object TaxiTaskModel {
startAutoPilot()
}
/**
* 设置路径规划起终点
*/
@@ -1218,17 +1259,4 @@ object TaxiTaskModel {
}
}
}
fun autoStartDriving() {
//启动动画+文字
if (mControllerStatusCallback != null) {
mControllerStatusCallback!!.startOpenAutopilotNonManual()
}
UiThreadHandler.postDelayed({
toStartTask() //状态流转
startAutoPilot() //自驾开启
VoiceNotice.showNotice("车辆正在自动开启自动驾驶")
}, START_AUTOPILOT_COUNTDOWN_INTERVAL) // 10s后开启自驾, 状态流转
}
}

View File

@@ -9,9 +9,9 @@ import com.mogo.och.taxi.base.IUiIntent
sealed class UnmannedIntent: IUiIntent{
//开始接单 、 暂停接单
object StartOrPauseTakeOrder : UnmannedIntent()
object StartOrEndTakeOrder : UnmannedIntent()
object StartTaskOrOrderLooper : UnmannedIntent()
object StartTaskWithOrderLooper : UnmannedIntent()
//取消订单
class CancelOrder(val type: Int) : UnmannedIntent()
@@ -22,7 +22,7 @@ sealed class UnmannedIntent: IUiIntent{
object JourneyCompleted: UnmannedIntent()
//跳过乘客验证
object JumpPassengerCheckDone : UnmannedIntent()
object JumpPassengerCheck : UnmannedIntent()
//司机端手动结束订单
object CloseOrderByDriver : UnmannedIntent()