[fea]
[班车同步和上报逻辑]
This commit is contained in:
yangyakun
2024-12-13 16:31:47 +08:00
parent 098b47246b
commit a476cb2722
15 changed files with 994 additions and 31 deletions

View File

@@ -1,7 +1,9 @@
package com.mogo.och.weaknet.bean.request
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.network.utils.digest.DigestUtils
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.och.common.module.biz.login.LoginStatusManager
import com.mogo.och.bridge.device.checkvin.CheckVinManager
import com.mogo.och.weaknet.repository.db.bean.EventDataBean
@@ -20,9 +22,15 @@ data class ShuttleEventRequest(val requestId: String, val sn: String,val vin:Str
val eventList4Request = mutableListOf<Event>()
var tempEvent: Event?=null
waitUpdateEvent?.forEach {
tempEvent = Event(it.eventType,
EventData(it.taskId,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId)
)
tempEvent = if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
Event(it.eventType,
EventData(0,it.taskId,it.taskDate,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId)
)
}else{
Event(it.eventType,
EventData(it.taskId,0,it.taskDate,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId)
)
}
eventList4Request.add(tempEvent!!)
}
@@ -46,6 +54,8 @@ open class EventDataBase(val msgtype:String,var businessTime: Long?)
data class EventData(
var taskId: Long?,
var detailId: Long?,
var taskDate: Long?,
var businessTimeout: Long?,
var writeVersion: Long?,
var siteId: Long?,

View File

@@ -160,7 +160,7 @@ object LineModel {
)
val startTime = System.currentTimeMillis()
CarExecutableTaskResponse.save2Db(data)
d(TAG,"更新数据耗时${System.currentTimeMillis()-startTime}___${Thread.currentThread().name}")
d(TAG,"更新数据耗时${System.currentTimeMillis()-startTime}")
RxUtils.createSubscribe(800) {
// 等待写入数据库
mBusLinesCallbackMap.forEach { callback ->
@@ -211,7 +211,7 @@ object LineModel {
fun commitSwitchLineId(task: TaskDataBean, line: LineDataBean) {
RxUtils.disposeSubscribe(startTaskDisposable)
line.getLineIdAndName { lineId, lineName ->
task.getLineIdAndName { taskId, taskTime ->
task.getLineIdAndName { taskId, taskTime,taskDate ->
RepositoryManager.startTask(taskId, lineId, taskTime, lineName)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
@@ -247,7 +247,7 @@ object LineModel {
override fun onNext(data: Boolean) {
d(TAG, "commitSwitchLineId onNext ${data}")
if (data) {
EventDb.saveEventTaskStart(taskId, lineId, taskTime, lineName)
EventDb.saveEventTaskStart(taskId, lineId, taskTime, lineName,taskDate)
OrderModel.queryBusRoutes()
BizLoopManager.runInIoThread{
val querySiteByLineId = SiteDb.querySiteByLineId(lineId)

View File

@@ -266,7 +266,9 @@ object OrderModel {
startStation.siteId.toLong(),
task.taskId?:0L,
task.lineId?:0L,
task.taskStartTime?:System.currentTimeMillis())
task.taskStartTime?:System.currentTimeMillis(),
task.taskDate?:0L
)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {

View File

@@ -39,6 +39,9 @@ object RepositoryManager {
if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
field = WeaknetRepository()
CallerLogger.d(TAG,"saas shuttle 支持db")
}else if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
field = WeaknetRepository()
CallerLogger.d(TAG,"saas scheduled 支持db")
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
field = WeaknetRepository()
CallerLogger.d(TAG,"saas bus 支持db")
@@ -76,7 +79,10 @@ object RepositoryManager {
if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
field = WriteOffCacheRepository()
CallerLogger.d(TAG,"saas shuttle 核销缓存")
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
}else if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
field = WriteOffCacheRepository()
CallerLogger.d(TAG,"saas sceduletd 核销缓存")
}else if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
field = WriteOffCacheRepository()
CallerLogger.d(TAG,"saas bus 核销缓存")
}
@@ -116,9 +122,10 @@ object RepositoryManager {
return lineRepository?.startTask(taskId,lineId,taskTime,lineName)
}
fun leaveStation(seq: Int, siteId: Long, taskId: Long, lineId: Long, taskStartTime:Long
fun leaveStation(
seq: Int, siteId: Long, taskId: Long, lineId: Long, taskStartTime: Long, taskDate: Long
): Observable<Boolean>?{
return lineRepository?.leaveStation(seq,siteId,taskId,lineId,taskStartTime)
return lineRepository?.leaveStation(seq,siteId,taskId,lineId,taskStartTime,taskDate)
}
fun arriveStation(seq: Int, siteId: Long, taskId: Long): Observable<Boolean>?{

View File

@@ -33,7 +33,7 @@ import java.io.File
//entities指定该数据库有哪些表多张表就逗号分隔
//version指定数据库版本号升级时需要用到
//数据库继承自RoomDatabase
@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class, WriteOffDataBean::class], version = 5)
@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class, WriteOffDataBean::class], version = 6)
abstract class MyDataBase : RoomDatabase() {
override fun getOpenHelper(): SupportSQLiteOpenHelper {
@@ -88,6 +88,13 @@ abstract class MyDataBase : RoomDatabase() {
}
}
private val MIGRATION_5_6 = object : Migration(5, 6) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE ${EventDataBean.evnetDataTable} ADD COLUMN taskDate INTEGER")
}
}
fun getDBName():MyDataBase{
val roomName = when (ProjectUtils.getProjectType()) {
Project.SAAS -> {
@@ -95,6 +102,8 @@ abstract class MyDataBase : RoomDatabase() {
"shuttle_db"
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
"saas_bus_db"
}else if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
"saas_scheduled_db"
}else{
FunctionBuildConfig.appIdentityMode
}
@@ -131,6 +140,7 @@ abstract class MyDataBase : RoomDatabase() {
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.fallbackToDestructiveMigration()
.build()
}

View File

@@ -19,11 +19,18 @@ data class EventDataBean(
var eventType: String? = null,
/**
* 任务id
* 任务id、模板id
*/
@ColumnInfo(name = "lineId", typeAffinity = ColumnInfo.INTEGER)
var lineId: Long? = null,
/**
* 模板发生日期
*/
@ColumnInfo(name = "taskDate", typeAffinity = ColumnInfo.INTEGER)
var taskDate: Long? = null,
/**
* 任务id
*/

View File

@@ -16,7 +16,7 @@ data class TaskDataBean(
* 任务id
*/
@ColumnInfo(name = "task_id", typeAffinity = ColumnInfo.INTEGER, index = true)
@SerializedName("id")
@SerializedName("id", alternate = ["detailId"])
var taskId: Long? = null,
/**
@@ -87,10 +87,12 @@ data class TaskDataBean(
return result
}
fun getLineIdAndName(function: (lineId:Long,lineName:Long) -> Unit) {
taskId?.let {id->
taskStartTime?.let {time->
function(id,time)
fun getLineIdAndName(function: (taskId: Long, taskTime: Long , taskDate:Long) -> Unit) {
taskId?.let { id ->
taskStartTime?.let { time ->
taskDate?.let { date ->
function(id, time, date)
}
}
}
}

View File

@@ -29,11 +29,12 @@ object EventDb: IDbRepository {
eventDataDao = null
}
fun saveEventTaskStart(taskId: Long, lineId: Long, taskStartTime: Long, name: String) {
fun saveEventTaskStart(taskId: Long, lineId: Long, taskStartTime: Long, name: String,taskDate:Long) {
val event = EventDataBean()
event.eventType = EventDataBean.TaskStart
event.lineId = lineId
event.taskId = taskId
event.taskDate = taskDate
event.lineName = name
event.taskStartTime = taskStartTime
event.businessTime = DateTimeUtil.getCurrentTimeStamp()
@@ -54,7 +55,8 @@ object EventDb: IDbRepository {
siteId: Long,
seq: Int,
taskStartTime: Long?,
lineName: String
lineName: String,
taskDate: Long?
) {
val event = EventDataBean()
event.eventType = EventDataBean.TaskArriveSite
@@ -62,6 +64,7 @@ object EventDb: IDbRepository {
event.taskStartTime = taskStartTime
event.lineName = lineName
event.taskId = taskId
event.taskDate = taskDate
event.businessTime = DateTimeUtil.getCurrentTimeStamp()
event.writeVersion = DateTimeUtil.getCurrentTimeStamp()
event.siteId = siteId
@@ -80,12 +83,13 @@ object EventDb: IDbRepository {
siteId: Long,
seq: Int,
taskStartTime: Long?,
lineName: String
lineName: String,
taskDate: Long
) {
val event = EventDataBean()
event.eventType = EventDataBean.TaskLeaveSite
event.lineId = lineId
event.taskId = taskId
event.taskDate = taskDate
event.taskStartTime = taskStartTime
event.lineName = lineName
event.businessTime = DateTimeUtil.getCurrentTimeStamp()
@@ -100,11 +104,18 @@ object EventDb: IDbRepository {
}
}
fun saveEventTaskEnd(taskId: Long, lineId: Long, taskStartTime: Long?, lineName: String) {
fun saveEventTaskEnd(
taskId: Long,
lineId: Long,
taskStartTime: Long?,
lineName: String,
taskDate: Long
) {
val event = EventDataBean()
event.eventType = EventDataBean.TaskEnd
event.lineId = lineId
event.taskId = taskId
event.taskDate = taskDate
event.lineName = lineName
event.taskStartTime = taskStartTime
event.businessTime = DateTimeUtil.getCurrentTimeStamp()

View File

@@ -19,7 +19,14 @@ interface ILineRepository {
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 leaveStation(
seq: Int,
siteId: Long,
taskId: Long,
lineId: Long,
taskStartTime: Long,
taskDate: Long
): Observable<Boolean>?
fun arriveStation( seq: Int, siteId: Long, taskId: Long): Observable<Boolean>?

View File

@@ -157,7 +157,8 @@ class NormalRepository: ILineRepository {
siteId: Long,
taskId: Long,
lineId: Long,
taskStartTime: Long
taskStartTime: Long,
taskDate: Long
): Observable<Boolean>? {
return normalLineInterface?.leaveStation(seq, siteId, taskId, System.currentTimeMillis())
}

View File

@@ -32,6 +32,7 @@ import com.mogo.och.weaknet.repository.net.exception.NetException
import com.mogo.och.weaknet.repository.net.NetInterface
import com.mogo.och.weaknet.repository.net.project.dali.shuttle.DaliShuttleServiceManager
import com.mogo.och.weaknet.repository.net.project.saas.bus.SaasBusServiceManager
import com.mogo.och.weaknet.repository.net.project.saas.scheduled.SaasScheduledServiceManager
import com.mogo.och.weaknet.repository.net.project.saas.shuttle.SaasShuttleServiceManager
import io.reactivex.Observable
@@ -46,6 +47,8 @@ class WeaknetRepository : ILineRepository {
Project.SAAS -> {
if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
field = SaasShuttleServiceManager
}else if(AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode)) {
field = SaasScheduledServiceManager
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
field = SaasBusServiceManager
}
@@ -220,7 +223,14 @@ class WeaknetRepository : ILineRepository {
return TaskDb.startTask(taskId, lineId, lineName)
}
override fun leaveStation(seq: Int, siteId: Long, taskId: Long, lineId: Long, taskStartTime:Long): Observable<Boolean>? {
override fun leaveStation(
seq: Int,
siteId: Long,
taskId: Long,
lineId: Long,
taskStartTime: Long,
taskDate: Long
): Observable<Boolean>? {
return Observable.just(taskId)
.flatMap {
//开始站点: leaving false->true
@@ -239,7 +249,8 @@ class WeaknetRepository : ILineRepository {
it.siteId.toLong(),
it.seq,
taskStartTime,
lineInfo.lineName
lineInfo.lineName,
taskDate
)
}
@@ -278,7 +289,8 @@ class WeaknetRepository : ILineRepository {
end.siteId.toLong(),
end.seq,
task.taskStartTime,
lineInfo.lineName
lineInfo.lineName,
task.taskDate
)
}
}
@@ -323,7 +335,7 @@ class WeaknetRepository : ILineRepository {
if (task.taskId!=null&&task.lineId!=null) {
TaskDb.endTask(task.taskId!!)
LineManager.getLineInfo { lineInfo ->
EventDb.saveEventTaskEnd(task.taskId!!,task.lineId!!,task.taskStartTime,lineInfo.lineName)
EventDb.saveEventTaskEnd(task.taskId!!,task.lineId!!,task.taskStartTime,lineInfo.lineName,task.taskDate?:0L)
}
}
}

View File

@@ -0,0 +1,69 @@
package com.mogo.och.weaknet.repository.net.project.saas.scheduled;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest;
import com.mogo.och.weaknet.bean.request.ShuttleEventRequest;
import com.mogo.och.weaknet.bean.response.BusRoutesResponse;
import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse;
import com.mogo.och.weaknet.bean.response.WriteOffCountResponse;
import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest;
import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean;
import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* 小巴车相关接口
*
* @author tongchenfei
* <p>
* wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
*/
public interface ISaasScheduledApiService {
/**
* 查询当前运行任务
*
* @param request 请求参数
* @return 接口返回数据
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/och-shuttle-cabin/api/business/v1/driver/lineDataWithDriver/query" )
Observable<BusRoutesResponse> queryBusRoutes(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request);
/**
* 查询当前站点核销的人数
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST("/och-vehicle/api/car/v2/task/site/writeOffCount")
Observable<WriteOffCountResponse> writeOffCount(@Header ("appId") String appId, @Header("ticket") String ticket, @Body WriteOffCountReqBean writeOffCountReqBean);
/**
* 同步核销接口
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
@POST("/och-vehicle/api/car/v2/device/writeOff")
Observable<PassengerWriteOffResponse> saaswriteOffTicket(@Header ("appId") String appId, @Header("ticket") String ticket, @Body PassengerWriteOffRequest request);
/**
* 同步 线路、站点、任务、自驾轨迹信息
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET("/och-vehicle/cabin/queryCarExecutableTaskList")
Observable<CarExecutableTaskResponse> queryCarExecutableTaskList(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
/**
* 上传 开始线路 滑动出发 到站 完成线路 各个任务到服务器端
*/
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/och-vehicle/cabin/reportCabinEvent" )
Observable<BaseData> reportCabinEvent(@Header ("appId") String appId, @Header("ticket") String ticket, @Body ShuttleEventRequest request);
}

View File

@@ -0,0 +1,81 @@
package com.mogo.och.weaknet.repository.net.project.saas.scheduled
import android.content.Context
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
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.manager.cache.OchSPManager
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.request.ShuttleEventRequest
import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse
import com.mogo.och.weaknet.repository.net.NetInterface
import io.reactivex.Observable
/**
* @author: wangmingjun
* @date: 2021/10/20
*/
object SaasScheduledServiceManager: NetInterface {
private val mService: ISaasScheduledApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getShuttleUrl()).create(
ISaasScheduledApiService::class.java
)
/**
* 查询小巴车当前任务
*/
override fun queryBusRoutes(): Observable<BusRoutesResult?>? {
//获取当前高德坐标
return mService.queryBusRoutes(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
BusQueryLineStationsRequest()
) .transformIoTry()
.flatMap(OchCommonNet("queryBusRoutes",false))
.flatMap {
Observable.just(it.data?:BusRoutesResult())
}
}
/**
* 同步 线路、站点、任务、自驾轨迹信息
*/
override fun queryCarExecutableTaskList(
context: Context,
callback: OchCommonServiceCallback<CarExecutableTaskResponse>?
) {
mService.queryCarExecutableTaskList(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
OchSPManager.getSn()
)
.transformIoTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryCarExecutableTaskList"))
}
/**
* 上传 开始线路 滑动出发 到站 完成线路 各个任务到服务器端
*/
override fun reportCabinEvent(
context: Context,
data: ShuttleEventRequest,
callback: OchCommonServiceCallback<BaseData>?,
) {
mService.reportCabinEvent(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
SharedPrefsMgr.getInstance().token,
data,
)
.subscribe(OchCommonSubscribeImpl(context, callback, "reportCabinEvent"))
}
}

View File

@@ -1,7 +1,6 @@
package com.mogo.och.weaknet.repository.writeoff.impl
import android.content.Context
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.env.Project
import com.mogo.commons.env.ProjectUtils
import com.mogo.eagle.core.data.config.FunctionBuildConfig
@@ -25,7 +24,7 @@ import com.mogo.och.weaknet.repository.net.exception.NetException
import com.mogo.och.weaknet.repository.net.NetInterface
import com.mogo.och.weaknet.repository.net.bean.response.PassengerWriteOffResponse
import com.mogo.och.weaknet.repository.net.project.saas.bus.SaasBusServiceManager
import com.mogo.och.weaknet.repository.net.project.saas.shuttle.SaasShuttleServiceManager
import com.mogo.och.weaknet.repository.net.project.saas.scheduled.SaasScheduledServiceManager
import com.mogo.och.weaknet.repository.writeoff.IWriteOffRepository
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -40,7 +39,7 @@ class WriteOffCacheRepository : IWriteOffRepository {
when (ProjectUtils.getProjectType()) {
Project.SAAS -> {
if(AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
field = SaasShuttleServiceManager
field = SaasScheduledServiceManager
}else if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
field = SaasBusServiceManager
}