[Taxi无人化] refactor: 命名 & 层级 & TaskModel & TaskViewModel & Fragment;
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import androidx.annotation.Keep
|
||||
|
||||
/**
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
|
||||
/**
|
||||
@@ -27,7 +27,7 @@ import retrofit2.http.Query
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
interface UnmannedTaskServiceApi {
|
||||
interface TaxiTaskWithOrderServiceApi {
|
||||
|
||||
/**
|
||||
* 开始接单
|
||||
@@ -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
|
||||
)
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) { //点击了完成服务,结束订单并更新订单信息
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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后开启自驾, 状态流转
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user