[shuttle]
This commit is contained in:
yangyakun
2024-09-24 23:00:11 +08:00
parent d927a01ece
commit 22da0e6775
17 changed files with 536 additions and 317 deletions

View File

@@ -20,7 +20,7 @@ class OchCommonNet<T:BaseData>(val apiName:String, val writeLog:Boolean) : Funct
init {
CallerLogger.e("$flavorTag${OchCommonSubscribeImpl.TAG}", "$apiName: 去请求()")
CallerLogger.e("$flavorTag${TAG}", "$apiName: 去请求()")
if(writeLog) {
OchChainLogManager.writeChainLogNet(false,"接口:${apiName}", "去请求_${tag}")
}

View File

@@ -15,32 +15,23 @@ import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse
import com.mogo.och.weaknet.callback.IBusLinesCallback
import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean
import com.mogo.och.weaknet.repository.db.repository.ContraiDb
import com.mogo.och.weaknet.repository.db.repository.EventDb
import com.mogo.och.weaknet.repository.db.repository.LineDb
import com.mogo.och.weaknet.repository.db.repository.TaskDb
import com.mogo.och.weaknet.repository.db.repository.TaskSiteDb
import com.mogo.och.weaknet.repository.net.RepositoryManager
import com.mogo.och.weaknet.repository.net.exception.DataException
import com.mogo.och.weaknet.repository.net.impl.shuttlesaas.OrderServiceManager
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.net.UnknownHostException
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
@@ -284,164 +275,15 @@ object LineModel {
}
// 1、从别的数据库加载任务
// 2、本地没有从远端恢复任务
fun loadStartedTaskAndDefaultInfo() {
// 获取正在运行的任务
val runningTaskInfo = TaskDb.queryRunningTask()
if (runningTaskInfo.isNullOrEmpty()) {
// 本地没有进行中的任务
d(TAG,"没有查询到正在运行的任务")
loadServerRuningTask()
} else if (runningTaskInfo.size > 1) {
// 本地有多条正在进行的任务 需要check event
// 1 比对event表 1 清理错误数据 2 加载后台数据
selectRightData(runningTaskInfo)
} else {
// 只有一条进行中的任务
currentTask = runningTaskInfo.first()
// 恢复站点信息
currentTask?.taskId?.let {
// 获取正在进行中的具体信息
val runnintTaskAndSites = TaskSiteDb.queryRunningTask(it)
if(runnintTaskAndSites.isNullOrEmpty()||runnintTaskAndSites.size<2){
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:有任务:${runningTaskInfo} runningTask 表格没有对应的数据:${runnintTaskAndSites}")
return
}
val db2Beans = BusRoutesResponse.db2Beans(runnintTaskAndSites)
stationList = db2Beans.first
startStationIndex = db2Beans.second
stationList?.let {stationlist->
val startStation = stationlist[startStationIndex]
if (startStationIndex < stationlist.size-1) {
val endStation = stationlist[startStationIndex + 1]
LineManager.setStartAndEndStation(startStation,endStation)
}
}
}
// 设置自动驾驶信息
currentTask?.lineId?.let {
val contraiInfoTemp = ContraiDb.queryAutopilotInfoByLineid(it)
ContrailDataBean.save2Common(contraiInfoTemp)
}
mBusLinesCallbackMap.forEach { callback->
callback.value.onRunningTask()
}
fun haveRunningTask(){
mBusLinesCallbackMap.forEach { callback->
callback.value.onRunningTask()
}
}
private fun selectRightData(runningTaskInfo: List<TaskDataBean>) {
// 查找最新已经上报的任务
val sorted = runningTaskInfo.sortedBy {
it.startTime
fun haveNoRunningTask(){
mBusLinesCallbackMap.forEach { callback->
callback.value.onNoRunningTask()
}
val tempList = sorted.toMutableList()
val possible = tempList.removeFirst()
val queryLastData = EventDb.queryLastData()
if(queryLastData!=null){
if(possible.taskId==queryLastData.taskId){
// 最后一个事件和最新的task一直 恢复数据
tempList.forEach {
it.status = TaskDataBean.used
}
TaskDb.addOrUpdate(*tempList.toTypedArray())
loadStartedTaskAndDefaultInfo()
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:多个正在进行的任务 task:${runningTaskInfo} event:${queryLastData.taskId}有一个和event表对应使用相同的一个 另一个置为已使用")
return
}
}
// 全部置为已使用 通过接口恢复数据
runningTaskInfo.forEach {
it.status = TaskDataBean.used
}
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:多个正在进行的任务 task:${runningTaskInfo} 全部置为已使用 从后台加载正在使用的任务")
TaskDb.addOrUpdate(*runningTaskInfo.toTypedArray())
loadServerRuningTask()
}
private fun loadServerRuningTask() {
mContext?.let { contextit ->
OrderServiceManager.queryBusRoutes(contextit,object :OchCommonServiceCallback<BusRoutesResponse>{
override fun onSuccess(response: BusRoutesResponse?) {
if(response?.data == null){
mBusLinesCallbackMap.forEach { callback->
callback.value.onNoRunningTask()
}
}
response?.data?.let {
if (!it.sites.isNullOrEmpty()&&it.sites.size>1) {
val queryTaskById = TaskDb.queryTaskById(it.taskId.toLong())
if(queryTaskById==null||queryTaskById.status!=TaskDataBean.used) {
OchChainLogManager.writeChainLogDb(
"业务数据",
"本地没有正在运行的数据,服务器端有${it}"
)
LineDb.saveRunningInfo(
it.lineId,
it.name,
it.sites.last().name
)
TaskDb.saveRunningInfo(it.lineId, it.taskId, it.taskTime)
ContraiDb.saveRunningInfo(
it.lineId,
it.csvFileMd5,
it.csvFileUrl,
it.txtFileUrl,
it.txtFileMd5,
it.contrailSaveTime
)
BusRoutesResponse.bean2Db(
it.sites,
it.lineId.toLong(),
it.name,
it.taskId.toLong()
)
OrderModel.queryBusRoutes()
}else{
mBusLinesCallbackMap.forEach { callback->
callback.value.onNoRunningTask()
}
}
}
}
}
override fun onError() {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort(ResourcesUtils.getString(R.string.network_error_tip))
} else {
ToastUtils.showShort(ResourcesUtils.getString(R.string.request_error_tip))
}
}
override fun onFail(code: Int, msg: String?) {
if (!NetworkUtils.isConnected(mContext)) {
ToastUtils.showShort("网络异常,请稍后重试")
}else {
ToastUtils.showShort(msg)
}
}
})
}
}
// 滑动出发
fun leaveStation(): Observable<Boolean>? {
LineManager.getStations().first?.let {startStation->
startStation.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
startStation.isLeaving = true
currentTask?.let { task->
return RepositoryManager.leaveStation(
startStation.seq,
startStation.siteId.toLong(),
task.taskId?:0L,
task.lineId?:0L,
task.taskStartTime?:System.currentTimeMillis())
}
}
return null
}
fun leaveStationSuccess(){
@@ -452,48 +294,11 @@ object LineModel {
// 到站
fun arrivedStation() {
LineManager.getStations { start, end ->
// 开始站点leaving true->false drivingStatus 2->1
start.drivingStatus = TaskSiteDataBean.drivingStatusPassed
start.isLeaving = false
if(currentTask!=null&& currentTask!!.taskId!=null){
currentTask?.let { task->
if (task.taskId!=null&&task.lineId!=null) {
TaskSiteDb.updateDrivingStatusAndLeave(task.taskId!!,start.siteId.toLong(),TaskSiteDataBean.drivingStatusPassed,false)
// 设置到站任务
LineManager.getLineInfo { lineInfo ->
EventDb.saveEventTaskArriveSite(task.taskId!!,task.lineId!!,start.siteId.toLong(),start.seq,task.taskStartTime,lineInfo.lineName)
}
}
}
}else{
OchChainLogManager.writeChainLog("到站_数据更新_error","task:${currentTask}__taskId:${currentTask?.taskId}")
}
// 结束站点: drivingStatus 3-2
end.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
if(currentTask!=null&& currentTask!!.taskId!=null){
currentTask?.taskId?.let { taskId->
TaskSiteDb.updateDrivingStatus(taskId,end.siteId.toLong(),TaskSiteDataBean.drivingStatusCurrent)
}
}else{
OchChainLogManager.writeChainLog("到站_数据更新_error","task:${currentTask}__taskId:${currentTask?.taskId}")
}
val changeInfo =
"taskId:${currentTask?.taskId}--lineId:${currentTask?.lineId}--currentStationName:${start.name}--finalNextStationName:${end.name}"
OchChainLogManager.writeChainLog("到站", changeInfo)
}
stationList?.let {
startStationIndex+=1
mBusLinesCallbackMap.forEach {callback->
callback.value.onArriveStationSuccess()
}
val startStation = LineManager.getStations().second
if(startStationIndex+1< it.size){
val endStation = it[startStationIndex+1]
LineManager.setStartAndEndStation(startStation,endStation)
}
}
fun arrivedStationSuccess(){
mBusLinesCallbackMap.forEach {callback->
callback.value.onArriveStationSuccess()
}
}
@@ -514,24 +319,41 @@ object LineModel {
}
fun endTask() {
currentTask?.let {task->
if (task.taskId!=null&&task.lineId!=null) {
TaskDb.endTask(task.taskId!!)
LineManager.getLineInfo { lineInfo ->
EventDb.saveEventTaskEnd(task.taskId!!,task.lineId!!,task.taskStartTime,lineInfo.lineName)
}
}
}
val changeInfo = "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}"
OchChainLogManager.writeChainLog("结束任务", changeInfo)
currentTask?.let { task ->
RepositoryManager.endTask(task.taskId?:0L)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {
override fun onSubscribe(d: Disposable) {
d(TAG, "onSubscribe")
}
currentTask = null
LineManager.setLineInfo(null)
LineManager.setStartAndEndStation(null,null)
stationList = mutableListOf()
startStationIndex = 0
mBusLinesCallbackMap.forEach {
it.value.onCompleteTask()
override fun onError(e: Throwable) {
d(TAG, "onError${e.printStackTrace()}")
if (e is DataException) {
}
}
override fun onComplete() {
}
override fun onNext(data: Boolean) {
if (data) {
currentTask = null
LineManager.setLineInfo(null)
LineManager.setStartAndEndStation(null,null)
stationList = mutableListOf()
startStationIndex = 0
mBusLinesCallbackMap.forEach {
it.value.onCompleteTask()
}
val changeInfo = "taskId:${currentTask?.taskId}--lineInfo:${LineManager.lineInfos}"
OchChainLogManager.writeChainLog("结束任务", changeInfo)
}
}
})
}
}

View File

@@ -32,6 +32,8 @@ import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.constant.BusConst
import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean
import com.mogo.och.weaknet.repository.net.RepositoryManager
import com.mogo.och.weaknet.repository.net.exception.DataException
import com.mogo.och.weaknet.util.BusTrajectoryManager
import com.mogo.och.weaknet.util.ShuttleVoiceManager
@@ -140,18 +142,44 @@ object OrderModel {
@JvmStatic
fun queryBusRoutes() {
d(M_BUS + TAG, "查询小巴路线")
ThreadUtils.getIoPool().execute {
LineModel.loadStartedTaskAndDefaultInfo()
if(LineModel.stationList.isNullOrEmpty()){
d(M_BUS + TAG, "获取到小巴路线数据:空 ")
LineManager.setLineInfo(null)
updateBusStatus()
closeBeautificationMode()
removeTipRunnables()
}else{
updateBusStatus()
}
}
RepositoryManager.loadCurrentTaskInfo()
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {
override fun onSubscribe(d: Disposable) {
d(TAG, "onSubscribe")
}
override fun onError(e: Throwable) {
e.printStackTrace()
d(TAG, "onError${e.printStackTrace()}")
LineModel.haveNoRunningTask()
d(M_BUS + TAG, "获取到小巴路线数据:空 ")
LineManager.setLineInfo(null)
updateBusStatus()
closeBeautificationMode()
removeTipRunnables()
}
override fun onComplete() {
d(TAG, "onComplete")
}
override fun onNext(data: Boolean) {
if(data){
LineModel.haveRunningTask()
updateBusStatus()
}else{
LineModel.haveNoRunningTask()
d(M_BUS + TAG, "获取到小巴路线数据:空 ")
LineManager.setLineInfo(null)
updateBusStatus()
closeBeautificationMode()
removeTipRunnables()
}
}
})
}
/**
@@ -159,6 +187,9 @@ object OrderModel {
*/
@JvmStatic
fun completeTask() {
RepositoryManager
OCHThreadPoolManager.getsInstance().execute {
d(M_BUS + TAG, "结束当前路线abortTask")
@@ -215,37 +246,48 @@ object OrderModel {
return
}
LineModel.leaveStation()
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {
override fun onSubscribe(d: Disposable) {
d(TAG, "onSubscribe")
}
LineManager.getStations().first?.let {startStation->
startStation.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
startStation.isLeaving = true
LineModel.currentTask?.let { task->
RepositoryManager.leaveStation(
startStation.seq,
startStation.siteId.toLong(),
task.taskId?:0L,
task.lineId?:0L,
task.taskStartTime?:System.currentTimeMillis())
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {
override fun onSubscribe(d: Disposable) {
d(TAG, "onSubscribe")
}
override fun onError(e: Throwable) {
d(TAG, "onError${e.printStackTrace()}")
if (e is DataException) {
override fun onError(e: Throwable) {
d(TAG, "onError${e.printStackTrace()}")
if (e is DataException) {
}
}
}
}
override fun onComplete() {
d(TAG, "onComplete")
}
override fun onComplete() {
d(TAG, "onComplete")
}
override fun onNext(data: Boolean) {
if (data) {
LineModel.leaveStationSuccess()
isArrivedStation = false
onStartAutopilot()
override fun onNext(data: Boolean) {
if (data) {
LineModel.leaveStationSuccess()
isArrivedStation = false
onStartAutopilot()
ThirdDeviceData.leaveStation()
ThirdDeviceData.leaveStation()
updateBusStatus()
}
}
})
updateBusStatus()
}
}
})
}
}
}
@@ -371,9 +413,48 @@ object OrderModel {
isArrivedStation = true
isGoingToNextStation = false
ThirdDeviceData.arriveStation()
LineModel.arrivedStation()
updateBusStatus()
LineManager.getStations { start, end ->
start.drivingStatus = TaskSiteDataBean.drivingStatusPassed
start.isLeaving = false
end.drivingStatus = TaskSiteDataBean.drivingStatusCurrent
RepositoryManager.arriveStation(end.seq,end.siteId.toLong(), LineModel.currentTask?.taskId?:0L)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {
override fun onSubscribe(d: Disposable) {
d(TAG, "onSubscribe")
}
override fun onError(e: Throwable) {
d(TAG, "onError${e.printStackTrace()}")
if (e is DataException) {
}
}
override fun onComplete() {
ThirdDeviceData.arriveStation()
d(TAG, "arrivedStation onComplete")
LineModel.stationList?.let {
LineModel.startStationIndex +=1
val startStation = LineManager.getStations().second
if(LineModel.startStationIndex +1< it.size){
val endStation = it[LineModel.startStationIndex +1]
LineManager.setStartAndEndStation(startStation,endStation)
}
}
LineModel.arrivedStationSuccess()
updateBusStatus()
}
override fun onNext(data: Boolean) {
if (data) {
}
}
})
}
}
}

View File

@@ -30,4 +30,8 @@ interface TaskSiteDataDao {
@Query("DELETE FROM ${TaskSiteDataBean.usedTaskDataTable} WHERE event_save_time < :zeroTime")
fun deleteObsoleteData(zeroTime: Long = DateTimeUtil.getCurrentDateZero()):Int
// 根据taskId删除所属站点信息
@Query("DELETE FROM ${TaskSiteDataBean.usedTaskDataTable} WHERE task_id = :taskId")
fun deleteErrorDataByTaskId(taskId: Long)
}

View File

@@ -74,6 +74,10 @@ object TaskSiteDb {
return taskSiteDataDao?.queryRunningTask(taskId)
}
fun deleteErrorData(taskId: Long){
taskSiteDataDao?.deleteErrorDataByTaskId(taskId)
}
fun deleteObsoleteData(){
taskSiteDataDao?.deleteObsoleteData()?.let {
OchChainLogManager.writeChainLogDb("删除临时数据","rurnning Task删除数量:${it}")

View File

@@ -1,13 +1,13 @@
package com.mogo.och.weaknet.repository.net
import android.content.Context
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import io.reactivex.Observable
interface IRepository {
fun loadCurrentTaskInfo():Observable<Boolean>?
fun queryCanUseLine(): Observable<List<LineDataBean>?>?
fun queryCanUserTask(lineId:Long): Observable<List<TaskDataBean>?>?
@@ -15,4 +15,8 @@ interface IRepository {
fun startTask(taskId:Long,lineId:Long,taskTime:Long,lineName:String): Observable<Boolean>?
fun leaveStation(seq: Int, siteId: Long, taskId: Long, lineId: Long, taskStartTime:Long): Observable<Boolean>?
fun arriveStation( seq: Int, siteId: Long, taskId: Long): Observable<Boolean>?
fun endTask( taskId: Long): Observable<Boolean>?
}

View File

@@ -7,9 +7,7 @@ import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.net.impl.bus.BusRepository
import com.mogo.och.weaknet.repository.net.impl.bussaas.BusSaasRepository
import com.mogo.och.weaknet.repository.net.impl.shuttle.OrderServiceManager
import com.mogo.och.weaknet.repository.net.impl.shuttle.ShuttleRepository
import com.mogo.och.weaknet.repository.net.impl.shuttlesaas.ShuttleSaasRepository
import io.reactivex.Observable
object RepositoryManager {
@@ -33,6 +31,10 @@ object RepositoryManager {
}
}
fun loadCurrentTaskInfo():Observable<Boolean>?{
return repository.loadCurrentTaskInfo()
}
fun queryCanUseLine() : Observable<List<LineDataBean>?>? {
return repository.queryCanUseLine()
}
@@ -50,4 +52,13 @@ object RepositoryManager {
return repository.leaveStation(seq,siteId,taskId,lineId,taskStartTime)
}
fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable<Boolean>?{
return repository.arriveStation(seq,siteId,taskId)
}
fun endTask(taskId: Long): Observable<Boolean>?{
return repository.endTask(taskId)
}
}

View File

@@ -9,9 +9,9 @@ import com.mogo.och.common.module.utils.DateTimeUtil;
public class BusCloseTaskRequest {
private String sn;
private int taskId;
private long taskId;
private long writeVersion;
public BusCloseTaskRequest(int taskId) {
public BusCloseTaskRequest(long taskId) {
this.sn = SharedPrefsMgr.getInstance().getSn();
this.taskId = taskId;
this.writeVersion = DateTimeUtil.getCurrentTimeStamp();

View File

@@ -1,15 +1,9 @@
package com.mogo.och.weaknet.repository.net.impl.bus
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.net.IRepository
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse
import io.reactivex.Observable
class BusRepository: IRepository {
@@ -20,6 +14,10 @@ class BusRepository: IRepository {
}
override fun loadCurrentTaskInfo(): Observable<Boolean>? {
TODO("Not yet implemented")
}
override fun queryCanUseLine(): Observable<List<LineDataBean>?>? {
TODO("Not yet implemented")
}
@@ -47,5 +45,13 @@ class BusRepository: IRepository {
TODO("Not yet implemented")
}
override fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable<Boolean>? {
TODO("Not yet implemented")
}
override fun endTask(taskId: Long): Observable<Boolean>? {
TODO("Not yet implemented")
}
}

View File

@@ -2,7 +2,6 @@ package com.mogo.och.weaknet.repository.net.impl.bus
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.commons.storage.SharedPrefsMgr
@@ -16,7 +15,6 @@ import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusRoutePlanningUpdateReqBean
import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest
import com.mogo.och.weaknet.repository.net.bean.request.CarHeartbeatReqBean
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLineTaskResponse
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse
@@ -79,7 +77,7 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun abortTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
fun abortTask(context: Context, taskId: Long, callback: OchCommonServiceCallback<BaseData>?) {
M_SERVICE.abortTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
@@ -96,7 +94,7 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun endTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
fun endTask(context: Context, taskId: Long, callback: OchCommonServiceCallback<BaseData>?) {
M_SERVICE.endTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,

View File

@@ -1,15 +1,9 @@
package com.mogo.och.weaknet.repository.net.impl.bussaas
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.shuttle.weaknet.R
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.net.IRepository
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse
import io.reactivex.Observable
class BusSaasRepository: IRepository {
@@ -20,6 +14,10 @@ class BusSaasRepository: IRepository {
}
override fun loadCurrentTaskInfo(): Observable<Boolean>? {
TODO("Not yet implemented")
}
override fun queryCanUseLine(): Observable<List<LineDataBean>?>? {
TODO("Not yet implemented")
}
@@ -47,5 +45,13 @@ class BusSaasRepository: IRepository {
TODO("Not yet implemented")
}
override fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable<Boolean>? {
TODO("Not yet implemented")
}
override fun endTask(taskId: Long): Observable<Boolean>? {
TODO("Not yet implemented")
}
}

View File

@@ -2,7 +2,6 @@ package com.mogo.och.weaknet.repository.net.impl.bussaas
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.commons.storage.SharedPrefsMgr
@@ -15,7 +14,6 @@ import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusRoutePlanningUpdateReqBean
import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLineTaskResponse
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse
@@ -76,7 +74,7 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun abortTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
fun abortTask(context: Context, taskId: Long, callback: OchCommonServiceCallback<BaseData>?) {
M_SAAS_SERVICE.abortTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
@@ -95,7 +93,7 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun endTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
fun endTask(context: Context, taskId: Long, callback: OchCommonServiceCallback<BaseData>?) {
M_SAAS_SERVICE.endTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,

View File

@@ -11,15 +11,14 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.network.interceptor.transformIoTry
import com.mogo.och.common.module.network.interceptor.transformTry
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest
import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.bean.response.WriteOffCountResponse
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.net.bean.request.BusCloseTaskRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusResetDrivingLineRequest
import com.mogo.och.weaknet.repository.net.bean.request.BusUpdateSiteStatusRequest
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLineTaskResponse
import com.mogo.och.weaknet.repository.net.bean.response.BusQueryLinesResponse
import io.reactivex.Observable
@@ -40,15 +39,16 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun queryBusRoutes(context: Context, callback: OchCommonServiceCallback<BusRoutesResponse>?) {
//获取当前高德坐标
mService.queryBusRoutes(
fun queryBusRoutes(): Observable<BusRoutesResult>? {
return mService.queryBusRoutes(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
BusQueryLineStationsRequest()
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryBusRoutes"))
) .transformTry()
.flatMap(OchCommonNet("queryBusRoutes",false))
.flatMap {
Observable.just(it.data?: BusRoutesResult())
}
}
/**
@@ -79,7 +79,7 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun abortTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
fun abortTask(context: Context, taskId: Long, callback: OchCommonServiceCallback<BaseData>?) {
mService.abortTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
@@ -96,14 +96,16 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun endTask(context: Context, taskId: Int, callback: OchCommonServiceCallback<BaseData>?) {
mService.endTask(
fun endTask(taskId: Long): Observable<Boolean>? {
return mService.endTask(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
BusCloseTaskRequest(taskId)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "endTask"))
) .transformTry()
.flatMap(OchCommonNet("endTask",true))
.flatMap {
Observable.just(true)
}
}
/**
@@ -140,16 +142,18 @@ object OrderServiceManager {
*/
@JvmStatic
fun arriveSiteStation(
context: Context, seq: Int, siteId: Long, taskId: Long, writeVersion: Long,
callback: OchCommonServiceCallback<BaseData>?
) {
mService.arriveSiteStation(
seq: Int, siteId: Long, taskId: Long, writeVersion: Long,
): Observable<Boolean>? {
return mService.arriveSiteStation(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
BusUpdateSiteStatusRequest(taskId, siteId, seq, writeVersion)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "arriveSiteStation"))
.flatMap(OchCommonNet("arriveSiteStation",false))
.flatMap {
Observable.just(true)
}
}
@JvmStatic

View File

@@ -1,11 +1,77 @@
package com.mogo.och.weaknet.repository.net.impl.shuttle
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.data.bean.LineInfo
import com.mogo.och.weaknet.model.LineModel
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean
import com.mogo.och.weaknet.repository.net.IRepository
import io.reactivex.Observable
class ShuttleRepository: IRepository {
override fun loadCurrentTaskInfo(): Observable<Boolean>? {
return OrderServiceManager.queryBusRoutes()
?.flatMap { busRoutesResult ->
if (!busRoutesResult.sites.isNullOrEmpty() && busRoutesResult.sites.size > 1) {
OchChainLogManager.writeChainLogDb(
"业务数据",
"本地没有正在运行的数据,服务器端有${busRoutesResult}"
)
val result = mutableListOf<BusStationBean>()
var temp: BusStationBean? = null
var currentStationIndex = -1
var lineInfo:LineInfo?=null
busRoutesResult.sites.forEachIndexed { index, taskAndsite ->
temp = BusStationBean()
temp?.drivingStatus = (taskAndsite.drivingStatus ?: 0)
temp?.lat = (taskAndsite.lat ?: 0.0)
temp?.lon = (taskAndsite.lon ?: 0.0)
temp?.gcjLat = (taskAndsite.gcjLat ?: 0.0)
temp?.gcjLon = (taskAndsite.gcjLon ?: 0.0)
temp?.introduction = taskAndsite.introduction
temp?.isLeaving = taskAndsite.isLeaving
temp?.name = taskAndsite.name
temp?.nameKr = taskAndsite.nameKr
temp?.isPlayTts = java.lang.Boolean.TRUE == taskAndsite.isPlayTts
temp?.seq = (taskAndsite.seq ?: 0)
temp?.siteId = if (taskAndsite.siteId == null) 0 else taskAndsite.siteId!!.toInt()
result.add(temp!!)
// 正在进行中的任务
if (temp!!.drivingStatus == TaskSiteDataBean.drivingStatusCurrent) {
currentStationIndex = index
}
// 线路信息
if (lineInfo == null && busRoutesResult.name != null) {
lineInfo = LineInfo(busRoutesResult.lineId.toLong(), taskAndsite.name)
}
lineInfo?.multiMap?.put("taskInfo",LineModel.getTaskTime())
}
LineManager.setLineInfo(lineInfo)
val tempTask =TaskDataBean()
tempTask.taskId = busRoutesResult.taskId.toLong()
tempTask.taskStartTime = busRoutesResult.taskTime
tempTask.lineId = busRoutesResult.lineId.toLong()
LineModel.currentTask = tempTask
LineModel.stationList = result
LineModel.startStationIndex = currentStationIndex
LineModel.stationList?.let { stationlist->
val startStation = stationlist[LineModel.startStationIndex]
if (LineModel.startStationIndex < stationlist.size-1) {
val endStation = stationlist[LineModel.startStationIndex + 1]
LineManager.setStartAndEndStation(startStation,endStation)
}
}
return@flatMap Observable.just(true)
}
return@flatMap Observable.just(false)
}
}
override fun queryCanUseLine(): Observable<List<LineDataBean>?> {
return OrderServiceManager.queryBusLines()
@@ -29,4 +95,12 @@ class ShuttleRepository: IRepository {
return OrderServiceManager.leaveStation(seq,siteId,taskId,System.currentTimeMillis())
}
override fun arriveStation(seq: Int, siteId: Long, taskId: Long, ): Observable<Boolean>? {
return OrderServiceManager.arriveSiteStation(seq,siteId,taskId,System.currentTimeMillis())
}
override fun endTask(taskId: Long): Observable<Boolean>? {
return OrderServiceManager.endTask(taskId)
}
}

View File

@@ -6,14 +6,16 @@ import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.network.OchCommonNet
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.network.interceptor.transformIoTry
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest
import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse
import com.mogo.och.weaknet.bean.request.ShuttleEventRequest
import com.mogo.och.weaknet.bean.response.WriteOffCountResponse
import io.reactivex.Observable
/**
* @author: wangmingjun
@@ -32,15 +34,17 @@ object OrderServiceManager {
* @param callback
*/
@JvmStatic
fun queryBusRoutes(context: Context, callback: OchCommonServiceCallback<BusRoutesResponse>?) {
fun queryBusRoutes(): Observable<BusRoutesResult?>? {
//获取当前高德坐标
mService.queryBusRoutes(
return mService.queryBusRoutes(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
BusQueryLineStationsRequest()
)
.transformIoTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryBusRoutes"))
) .transformIoTry()
.flatMap(OchCommonNet("queryBusRoutes",false))
.flatMap {
Observable.just(it.data?:BusRoutesResult())
}
}
/**

View File

@@ -1,11 +1,17 @@
package com.mogo.och.weaknet.repository.net.impl.shuttlesaas
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.common.module.manager.autopilot.line.LineManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.weaknet.bean.response.BusRoutesResponse
import com.mogo.och.weaknet.model.LineModel
import com.mogo.och.weaknet.model.LineModel.currentTask
import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean
import com.mogo.och.weaknet.repository.db.bean.LineDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskDataBean
import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean
import com.mogo.och.weaknet.repository.db.repository.ContraiDb
import com.mogo.och.weaknet.repository.db.repository.EventDb
import com.mogo.och.weaknet.repository.db.repository.LineDb
import com.mogo.och.weaknet.repository.db.repository.TaskDb
@@ -14,6 +20,131 @@ import com.mogo.och.weaknet.repository.net.IRepository
import io.reactivex.Observable
class ShuttleSaasRepository : IRepository {
private val TAG = "ShuttleSaasRepository"
private val context = AbsMogoApplication.getApp()
override fun loadCurrentTaskInfo(): Observable<Boolean>? {
return Observable.just(123)
.flatMap {
// 获取正在运行的任务
val runningTaskInfo = TaskDb.queryRunningTask()
if (runningTaskInfo.isNullOrEmpty()) {
// 本地没有进行中的任务
CallerLogger.d(TAG, "没有查询到正在运行的任务")
return@flatMap loadServerRuningTask()
} else if (runningTaskInfo.size > 1) {
// 本地有多条正在进行的任务 需要check event
// 1 比对event表 1 清理错误数据 2 加载后台数据
return@flatMap selectRightData(runningTaskInfo)
} else {
// 只有一条进行中的任务
currentTask = runningTaskInfo.first()
// 恢复站点信息
currentTask?.taskId?.let {
// 获取正在进行中的具体信息
val runnintTaskAndSites = TaskSiteDb.queryRunningTask(it)
if(runnintTaskAndSites.isNullOrEmpty()||runnintTaskAndSites.size<2){
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:有任务:${runningTaskInfo} runningTask 表格没有对应的数据:${runnintTaskAndSites}")
TaskSiteDb.deleteErrorData(it)
return@flatMap loadServerRuningTask()
}
val db2Beans = BusRoutesResponse.db2Beans(runnintTaskAndSites)
LineModel.stationList = db2Beans.first
LineModel.startStationIndex = db2Beans.second
LineModel.stationList?.let { stationlist->
val startStation = stationlist[LineModel.startStationIndex]
if (LineModel.startStationIndex < stationlist.size-1) {
val endStation = stationlist[LineModel.startStationIndex + 1]
LineManager.setStartAndEndStation(startStation,endStation)
}
}
}
// 设置自动驾驶信息
currentTask?.lineId?.let {
val contraiInfoTemp = ContraiDb.queryAutopilotInfoByLineid(it)
ContrailDataBean.save2Common(contraiInfoTemp)
}
return@flatMap Observable.just(true)
}
}
}
private fun selectRightData(runningTaskInfo: List<TaskDataBean>):Observable<Boolean>? {
return Observable.just(123)
.flatMap {
// 查找最新已经上报的任务
val sorted = runningTaskInfo.sortedBy {
it.startTime
}
val tempList = sorted.toMutableList()
val possible = tempList.removeFirst()
val queryLastData = EventDb.queryLastData()
if(queryLastData!=null){
if(possible.taskId==queryLastData.taskId){
// 最后一个事件和最新的task一直 恢复数据
tempList.forEach {
it.status = TaskDataBean.used
}
TaskDb.addOrUpdate(*tempList.toTypedArray())
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:多个正在进行的任务 task:${runningTaskInfo} event:${queryLastData.taskId}有一个和event表对应使用相同的一个 另一个置为已使用")
return@flatMap loadServerRuningTask()
}
}
// 全部置为已使用 通过接口恢复数据
runningTaskInfo.forEach {
it.status = TaskDataBean.used
}
OchChainLogManager.writeChainLogDb("加载任务", "异常情况:多个正在进行的任务 task:${runningTaskInfo} 全部置为已使用 从后台加载正在使用的任务")
TaskDb.addOrUpdate(*runningTaskInfo.toTypedArray())
return@flatMap loadCurrentTaskInfo()
}
}
private fun loadServerRuningTask(): Observable<Boolean>? {
return OrderServiceManager.queryBusRoutes()?.flatMap {busRoutesResult->
if (!busRoutesResult.sites.isNullOrEmpty() && busRoutesResult.sites.size > 1) {
val queryTaskById = TaskDb.queryTaskById(busRoutesResult.taskId.toLong())
if (queryTaskById == null || queryTaskById.status != TaskDataBean.used) {
OchChainLogManager.writeChainLogDb(
"业务数据",
"本地没有正在运行的数据,服务器端有${busRoutesResult}"
)
LineDb.saveRunningInfo(
busRoutesResult.lineId,
busRoutesResult.name,
busRoutesResult.sites.last().name
)
TaskDb.saveRunningInfo(
busRoutesResult.lineId,
busRoutesResult.taskId,
busRoutesResult.taskTime
)
ContraiDb.saveRunningInfo(
busRoutesResult.lineId,
busRoutesResult.csvFileMd5,
busRoutesResult.csvFileUrl,
busRoutesResult.txtFileUrl,
busRoutesResult.txtFileMd5,
busRoutesResult.contrailSaveTime
)
BusRoutesResponse.bean2Db(
busRoutesResult.sites,
busRoutesResult.lineId.toLong(),
busRoutesResult.name,
busRoutesResult.taskId.toLong()
)
return@flatMap loadCurrentTaskInfo()
} else {
return@flatMap Observable.just(false)
}
}
return@flatMap Observable.just(false)
}
}
override fun queryCanUseLine(): Observable<List<LineDataBean>?>? {
return LineDb.queryCanUseLine()
@@ -66,4 +197,76 @@ class ShuttleSaasRepository : IRepository {
}
override fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable<Boolean>? {
// 开始站点leaving true->false drivingStatus 2->1
return Observable.just(taskId)
.flatMap {
LineManager.getStations { start, end ->
if (currentTask != null && currentTask!!.taskId != null) {
currentTask?.let { task ->
if (task.taskId != null && task.lineId != null) {
TaskSiteDb.updateDrivingStatusAndLeave(
task.taskId!!,
start.siteId.toLong(),
TaskSiteDataBean.drivingStatusPassed,
false
)
// 设置到站任务
LineManager.getLineInfo { lineInfo ->
EventDb.saveEventTaskArriveSite(
task.taskId!!,
task.lineId!!,
start.siteId.toLong(),
start.seq,
task.taskStartTime,
lineInfo.lineName
)
}
}
}
} else {
OchChainLogManager.writeChainLog(
"到站_数据更新_error",
"task:${currentTask}__taskId:${currentTask?.taskId}"
)
}
// 结束站点: drivingStatus 3-2
if (currentTask != null && currentTask!!.taskId != null) {
currentTask?.taskId?.let { taskId ->
TaskSiteDb.updateDrivingStatus(
taskId,
end.siteId.toLong(),
TaskSiteDataBean.drivingStatusCurrent
)
}
} else {
OchChainLogManager.writeChainLog(
"到站_数据更新_error",
"task:${currentTask}__taskId:${currentTask?.taskId}"
)
}
val changeInfo =
"taskId:${currentTask?.taskId}--lineId:${currentTask?.lineId}--currentStationName:${start.name}--finalNextStationName:${end.name}"
OchChainLogManager.writeChainLog("到站", changeInfo)
}
return@flatMap Observable.just(true)
}
}
override fun endTask(taskId: Long): Observable<Boolean>? {
return Observable.just(taskId).flatMap {
currentTask?.let {task->
if (task.taskId!=null&&task.lineId!=null) {
TaskDb.endTask(task.taskId!!)
LineManager.getLineInfo { lineInfo ->
EventDb.saveEventTaskEnd(task.taskId!!,task.lineId!!,task.taskStartTime,lineInfo.lineName)
}
}
}
return@flatMap Observable.just(true)
}
}
}

View File

@@ -109,9 +109,9 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback
override fun showRunningTaskInfo() {
LineManager.getLineInfo {lineInfo ->
bus_task_running_line_name.text = "班次:${lineInfo.lineName}"
bus_task_running_line_name.text = lineInfo.lineName
}
actv_running_task_time.text = LineModel.getTaskTime()
actv_running_task_time.text = "班次:${LineModel.getTaskTime()}"
LineModel.stationList?.takeIf { it.size>2 }?.let {
actv_running_task_last_station.text = "${it.last().name ?: ""}"
mAdapter.setDataList(it,LineModel.startStationIndex)