[fea]
[离线流程]
This commit is contained in:
yangyakun
2024-12-23 19:10:04 +08:00
parent 4eccafe8d0
commit 455f699ba3
13 changed files with 180 additions and 94 deletions

View File

@@ -33,6 +33,7 @@
<color name="common_19FF7F">#19FF7F</color>
<color name="common_2EACFF">#2EACFF</color>
<color name="common_4D2EACFF">#4D2EACFF</color>
<color name="common_3B4577">#3B4577</color>
<color name="common_232A3F">#232A3F</color>

View File

@@ -21,7 +21,7 @@ data class LineDataBean(
* 线路名称
*/
@ColumnInfo(name = "line_name", typeAffinity = ColumnInfo.TEXT)
@SerializedName("name")
@SerializedName("name", alternate = ["lineName"])
var lineName: String? = null,
/**

View File

@@ -11,6 +11,7 @@ import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.CommonServiceImpl
import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics
import com.mogo.och.bridge.ui.autopilot.AutopilotState
import com.mogo.och.offline.model.LineModel
import com.mogo.och.offline.ui.bizswitch.SwitchBizView
import com.mogo.och.offline.ui.fragment.OfflineFragment
import com.mogo.och.offline.util.BusAnalyticsManager
@@ -37,12 +38,14 @@ class ShuttleDriverProvider : CommonServiceImpl() {
}
OchAutopilotAnalytics.ochEventKey = BusAnalyticsManager.getInstance()
OffLineTrajectoryManager.load()
LineModel.init()
return busFragment!!
}
override fun resetFragment() {
OchAutopilotAnalytics.ochEventKey = null
OffLineTrajectoryManager.release()
LineModel.release()
busFragment = null
}

View File

@@ -58,10 +58,10 @@ object LineModel {
private val context = AbsMogoApplication.getApp()
// 判断接口是否变化
private const val EXECUTABLECHANGEMD5 = "EXECUTABLECHANGEMD5"
private const val EXECUTABLECHANGEMD5 = "EXECUTABLECHANGEMD5_offline"
// 展示上一次刷新时间
const val EXECUTABLECHANGETIME = "executablechangetime"
const val EXECUTABLECHANGETIME = "executablechangetime_offLine"
var currentTask: TaskDataBean? = null
@@ -208,7 +208,7 @@ object LineModel {
fun commitSwitchLineId(task: TaskDataBean, line: LineDataBean) {
RxUtils.disposeSubscribe(startTaskDisposable)
line.getLineIdAndName { lineId, lineName ->
RepositoryManager.startTask(task.taskId?:0, lineId, lineName)
RepositoryManager.startTask(task, lineId, lineName)
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<Boolean> {

View File

@@ -15,6 +15,7 @@ import com.mogo.och.data.bean.SiteIntroduce
import com.mogo.och.data.db.bean.LineDataBean
import com.mogo.och.offline.model.LineModel
import com.mogo.och.offline.model.LineModel.currentTask
import com.mogo.och.offline.repository.db.bean.TaskDataBean
import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean
import com.mogo.och.offline.repository.db.repository.ContraiDb
import com.mogo.och.offline.repository.db.repository.LineDb
@@ -33,8 +34,8 @@ object RepositoryManager {
return LineDb.queryCanUseLineRx()
}
fun startTask(taskId:Long,lineId:Long,lineName:String): Observable<Boolean>? {
return TaskDb.startTask(taskId, lineId, lineName)
fun startTask(task: TaskDataBean, lineId:Long, lineName:String): Observable<Boolean>? {
return TaskDb.startTask(task, lineId, lineName)
}
fun queryCarExecutableTaskList(ochCommonServiceCallback: OchCommonServiceCallback<BindLineListResponse>) {

View File

@@ -129,11 +129,12 @@ data class TaskSiteDataBean(
/**
* 开始任务 并把第一站置为 2 当前站
*/
fun toTaskSiteDatas(querySites: List<SiteDataBean>, lineName: String): MutableList<TaskSiteDataBean> {
fun toTaskSiteDatas(querySites: List<SiteDataBean>,taskId:Long, lineName: String): MutableList<TaskSiteDataBean> {
val result = mutableListOf<TaskSiteDataBean>()
var temp: TaskSiteDataBean?
querySites.forEach {
temp = TaskSiteDataBean()
temp?.taskId = taskId
temp?.lineId = it.lineId
temp?.lineName = lineName
temp?.siteId = it.siteId

View File

@@ -19,7 +19,7 @@ object TaskDb : IDbRepository {
private var taskDataDao: TaskDataDao? = null
get() {
if(field==null){
if (field == null) {
field = MyDataBase.instance?.taskDataDao
register()
}
@@ -30,17 +30,17 @@ object TaskDb : IDbRepository {
taskDataDao = null
}
fun addOrUpdate(vararg lineDataBean: TaskDataBean){
fun addOrUpdate(vararg lineDataBean: TaskDataBean) {
// 从接口恢复数据
taskDataDao?.insert(*lineDataBean)
}
fun addOrUpdate(serverDateList: List<TaskDataBean>, lineId: Long?) {
val runable = object :Runnable {
val runable = object : Runnable {
override fun run() {
taskDataDao?.let { taskDataDao ->
val localTasks = taskDataDao.querySitesByLineId(lineId)
if(localTasks==null){
if (localTasks == null) {
taskDataDao.insert(*serverDateList.toTypedArray())
// TODO: Ui展示需要动态刷新UI去
return
@@ -61,11 +61,11 @@ object TaskDb : IDbRepository {
val needSaveTask = mutableListOf<TaskDataBean>()
// 删除任务
needMinusDatas.forEach {
if(it.status==TaskDataBean.useing||it.status==TaskDataBean.used){
if (it.status == TaskDataBean.useing || it.status == TaskDataBean.used) {
needSaveTask.add(it)
}
}
val failneedMinusDatas = needMinusDatas-needSaveTask
val failneedMinusDatas = needMinusDatas - needSaveTask
taskDataDao.delete(*failneedMinusDatas.toTypedArray())
}
}
@@ -75,49 +75,84 @@ object TaskDb : IDbRepository {
}
fun startTask(taskId: Long, lineId: Long,lineName:String): Observable<Boolean>? {
return Observable.just(taskId)
fun startTask(task: TaskDataBean, lineId: Long, lineName: String): Observable<Boolean>? {
return Observable.just(task)
.flatMap {
var updateCount:Int? = 0
var startTime = System.currentTimeMillis()
try {
// 更新task状态
taskDataDao?.queryTaskByTaskIdOne(taskId)?.let {
it.startTime = System.currentTimeMillis()
it.status = TaskDataBean.useing
// 更新任务状态
taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.useing,it.id)
OchChainLogManager.writeChainLogDb("开始任务", "变更线路:${lineId}_${lineName}_task:${taskId} 为正在使用的状态")
}
CallerLogger.d(TAG,"更新任务状态用时:${System.currentTimeMillis()-startTime}")
startTime = System.currentTimeMillis()
updateCount = TaskSiteDb.startTask(taskId, lineId, lineName)
OchChainLogManager.writeChainLogDb("开始任务", "把正在使用的数据更新到RunningTask表格一共${updateCount}行数据")
CallerLogger.d(TAG,"插入正在运行的线路用时:${System.currentTimeMillis()-startTime}")
} catch (e: Exception) {
if (e is DbException) {
println("数据不全")
// 恢复数据
taskDataDao?.queryTaskByTaskIdOne(taskId)?.let {
addOrUpdate(task)
val taskID = task.taskId?:0
var updateCount: Int? = 0
var startTime = System.currentTimeMillis()
try {
// 更新task状态
taskDataDao?.queryTaskByTaskIdOne(taskID)?.let {
it.startTime = System.currentTimeMillis()
it.status = TaskDataBean.unUse
it.status = TaskDataBean.useing
// 更新任务状态
taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.unUse,it.id)
OchChainLogManager.writeChainLogDb("开始任务", "异常情况${lineId}_${lineName}_task:${taskId} 为未使用的状态 原因:${e.message}")
taskDataDao?.updateStatus(
System.currentTimeMillis(),
TaskDataBean.useing,
it.id
)
OchChainLogManager.writeChainLogDb(
"开始任务",
"变更线路:${lineId}_${lineName}_task:${taskID} 为正在使用的状态"
)
}
CallerLogger.d(
TAG,
"更新任务状态用时:${System.currentTimeMillis() - startTime}"
)
startTime = System.currentTimeMillis()
updateCount = TaskSiteDb.startTask(taskID, lineId, lineName)
OchChainLogManager.writeChainLogDb(
"开始任务",
"把正在使用的数据更新到RunningTask表格一共${updateCount}行数据"
)
CallerLogger.d(
TAG,
"插入正在运行的线路用时:${System.currentTimeMillis() - startTime}"
)
} catch (e: Exception) {
if (e is DbException) {
println("数据不全")
// 恢复数据
taskDataDao?.queryTaskByTaskIdOne(task.taskId ?: 0)?.let {
it.startTime = System.currentTimeMillis()
it.status = TaskDataBean.unUse
// 更新任务状态
taskDataDao?.updateStatus(
System.currentTimeMillis(),
TaskDataBean.unUse,
it.id
)
OchChainLogManager.writeChainLogDb(
"开始任务",
"异常情况${lineId}_${lineName}_task:${taskID} 为未使用的状态 原因:${e.message}"
)
}
}
return@flatMap Observable.error(
DataException(
DataException.startTaskErrorCode,
e.message ?: ""
)
)
}
updateCount?.let {
if (it <= 0) {
// 插入失败
return@flatMap Observable.error(
DataException(
DataException.startTaskErrorCode,
"未插入数据"
)
)
} else {
// 开始任务成功
return@flatMap Observable.just(true)
}
}
return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,e.message?:""))
}
updateCount?.let {
if(it<=0){
// 插入失败
return@flatMap Observable.error(DataException(DataException.startTaskErrorCode,"未插入数据"))
}else{
// 开始任务成功
return@flatMap Observable.just(true)
}
}
}
}
@@ -143,35 +178,35 @@ object TaskDb : IDbRepository {
fun endTask(taskId: Long) {
BizLoopManager.runInIoThread{
BizLoopManager.runInIoThread {
taskDataDao?.endTask(taskId)
}
}
fun deleteObsoleteData(){
fun deleteObsoleteData() {
taskDataDao?.deleteObsoleteData()?.let {
OchChainLogManager.writeChainLogDb("删除临时数据","Task删除数量:${it}")
OchChainLogManager.writeChainLogDb("删除临时数据", "Task删除数量:${it}")
}
}
fun saveRunningInfo(lineId: Int, taskId: Int, taskTime: Long) {
val runningTask = taskDataDao?.queryTaskByTaskIdOne(taskId.toLong())
if (runningTask==null) {
if (runningTask == null) {
val taskDataBean = TaskDataBean()
taskDataBean.taskId = taskId.toLong()
taskDataBean.lineId = lineId.toLong()
taskDataBean.status = TaskDataBean.useing
taskDataDao?.insert(taskDataBean)
}else{
} else {
runningTask.status = TaskDataBean.useing
taskDataDao?.insert(runningTask)
}
}
fun endTaskByOther(taskId: Long) {
BizLoopManager.runInIoThread{
BizLoopManager.runInIoThread {
val taskInfo = taskDataDao?.queryTaskByTaskIdOne(taskId)
if(taskInfo!=null){
if (taskInfo != null) {
if (taskInfo.status == TaskDataBean.unUse) {
taskDataDao?.endTask(taskId)
}
@@ -185,7 +220,7 @@ object TaskDb : IDbRepository {
it.startTime = System.currentTimeMillis()
it.status = TaskDataBean.useing
// 更新任务状态
taskDataDao?.updateStatus(System.currentTimeMillis(),TaskDataBean.useing,it.id)
taskDataDao?.updateStatus(System.currentTimeMillis(), TaskDataBean.useing, it.id)
OchChainLogManager.writeChainLogDb("恢复任务", "线路任务改为正在执行的状态")
}
}

View File

@@ -45,6 +45,7 @@ object TaskSiteDb : IDbRepository {
startTime = System.currentTimeMillis()
val toTaskSiteDatas = TaskSiteDataBean.toTaskSiteDatas(
querySites,
taskId,
lineName
)
CallerLogger.d(TAG, "数据转换用时:${System.currentTimeMillis() - startTime}")

View File

@@ -1,36 +1,63 @@
package com.mogo.och.offline.repository.net.bean
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusStationBean
import java.util.*
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.data.bean.SiteIntroduce
import com.mogo.och.data.db.bean.ContrailDataBean
import com.mogo.och.data.db.bean.LineDataBean
import com.mogo.och.data.db.bean.SiteDataBean
import com.mogo.och.offline.repository.db.repository.ContraiDb
import com.mogo.och.offline.repository.db.repository.LineDb
import com.mogo.och.offline.repository.db.repository.SiteDb
/**
*
*/
data class BindLineListResponse(val data: List<Result>?) : BaseData(){
data class Result(
var line: LineInfo?,
var siteList: List<BusStationBean>?,//站点名称
val contrail: Contrail?,//站点名称
var line: LineDataBean?,
var siteList: List<SiteDataBean>?,//站点名称
val contrail: ContrailDataBean?,//站点名称
)
data class LineInfo(
val lineId:Long?,
var lineName:String?,
)
data class Contrail(
val csvFileUrl:String?,
val csvFileMd5:String?,
val txtFileUrl:String?,
val txtFileMd5:String?,
val contrailSaveTime:Long?,
)
companion object{
fun save2Db(data: BindLineListResponse) {
val lineList = mutableListOf<LineDataBean>()
val contrailList = mutableListOf<ContrailDataBean>()
val siteList = mutableListOf<SiteDataBean>()
data.data?.forEach { dataInfo->
var lineId:Long?=null
dataInfo.line?.let { lineInfo->
val tempLineInfo = LineDataBean()
lineId = lineInfo.lineId
tempLineInfo.lineId = lineInfo.lineId
tempLineInfo.lineName = lineInfo.lineName
tempLineInfo.endStationName = dataInfo.siteList?.last()?.name?:""
lineList.add(tempLineInfo)
}
dataInfo.contrail?.let { contrailInfo->
contrailInfo.lineId = lineId
contrailList.add(contrailInfo)
}
dataInfo.siteList?.let {siteListInfo->
siteListInfo.forEach {
it.lineId = lineId
val videoInfoList = mutableListOf<SiteIntroduce>()
it.videoList?.forEach { videoInfoIt->
videoInfoList.add(videoInfoIt)
}
if(videoInfoList.isNotEmpty()) {
it.videoListDB = GsonUtils.toJson(videoInfoList)
}
}
siteList.addAll(siteListInfo)
}
}
LineDb.checkAndUpdate(lineList)
ContraiDb.addOrUpdate(contrailList)
SiteDb.addOrUpdate(siteList)
}
}
}

View File

@@ -76,7 +76,7 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba
mAdapter.setOnLineItemClickListener(object : SwitchLineAdapter.LineItemClickListener{
override fun onItemClick(data: LineDataBean) {
CallerLogger.d(TAG,"选择线路 线路信息:${data}")
viewModel?.changeLineStart(data)
}
})
@@ -95,7 +95,6 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba
override fun reload() {
viewbizModel?.showSwitchLineInfo()
}
}
}
@@ -105,6 +104,7 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba
fun loadingDatas() {
CallerLogger.d(TAG,"加载线路去")
viewModel?.queryBusLines(true)
viewModel?.setRefreshTime()
}
override fun onAttachedToWindow() {
@@ -168,6 +168,9 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba
animator?.cancel()
}
},dex,UiThreadHandler.MODE.QUEUE,)
}
override fun showLoading() {
}

View File

@@ -1,14 +1,18 @@
package com.mogo.och.offline.ui.switchline
import androidx.lifecycle.ViewModel
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.data.db.bean.LineDataBean
import com.mogo.och.offline.callback.IBusLinesCallback
import com.mogo.och.offline.model.LineModel
import com.mogo.och.offline.model.LineModel.EXECUTABLECHANGETIME
import com.mogo.och.offline.repository.RepositoryManager
import com.mogo.och.offline.repository.db.bean.TaskDataBean
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -77,6 +81,28 @@ class SwtichLineModel : ViewModel(), IBusLinesCallback {
fun onBusLinesChange(data: MutableList<LineDataBean>?, show:Boolean)
fun refreshDate(formatLongToString: String?)
fun onBusLinesChangeFaile()
fun showLoading()
}
fun changeLineStart(checkTask:LineDataBean) {
if(checkTask==null){
ToastUtils.showShort("请重新选择线路")
return
}
val newTask = TaskDataBean()
newTask.taskId = System.currentTimeMillis()
newTask.lineId = checkTask.lineId
newTask.startTime = System.currentTimeMillis()
newTask.status = TaskDataBean.unUse
newTask.taskgetTime = System.currentTimeMillis()
LineModel.commitSwitchLineId(newTask,checkTask)
}
fun setRefreshTime() {
val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, -1)
if(lastUpdateTime>0){
this.onRefreshSuccess(lastUpdateTime)
}
}
override fun onRefreshSuccess(currentTimeStamp: Long) {

View File

@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:endColor="#CC0043FF"
android:startColor="#0028345E" />
<solid android:color="@color/common_4D2EACFF"/>
<corners android:radius="@dimen/dp_30" />
</shape>

View File

@@ -17,16 +17,6 @@
android:layout_marginStart="@dimen/dp_30"
android:layout_height="@dimen/dp_30"/>
<ImageView
android:id="@+id/switch_line_item_select_iv"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_32"
android:layout_marginEnd="@dimen/dp_30"
android:background="@drawable/offline_line_task_arrow"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/switch_line_name"
android:layout_width="0dp"
@@ -40,7 +30,7 @@
app:layout_constraintTop_toTopOf="@+id/aciv_line_point"
app:layout_constraintBottom_toBottomOf="@+id/aciv_line_point"
app:layout_constraintStart_toEndOf="@+id/aciv_line_point"
app:layout_constraintEnd_toStartOf="@+id/switch_line_item_select_iv"
app:layout_constraintEnd_toEndOf="parent"
tools:text="@string/offline_switch_line_item_line_name" />
<androidx.appcompat.widget.AppCompatTextView
@@ -57,6 +47,6 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/switch_line_name"
app:layout_constraintTop_toBottomOf="@+id/switch_line_name"
app:layout_constraintEnd_toStartOf="@+id/switch_line_item_select_iv"
app:layout_constraintEnd_toEndOf="parent"
tools:text="@string/offline_switch_line_endstation_name" />
</androidx.constraintlayout.widget.ConstraintLayout>