From 772ec472d821c8cffcae78c64b2ceffcb5b543e9 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 8 Nov 2024 10:30:28 +0800 Subject: [PATCH] =?UTF-8?q?[6.7.2]=20[fix]=20[site=20add=20=E3=80=81=20del?= =?UTF-8?q?ete=20or=20update]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/shuttle/driver_weaknet/build.gradle | 4 + .../repository/db/bean/SiteDataBean.kt | 18 +++++ .../weaknet/repository/db/dao/SiteDataDao.kt | 5 ++ .../repository/db/repository/SiteDb.kt | 72 ++++++++++++++---- .../mogo/och/common/module/ExampleUnitTest.kt | 74 +++++++++++++++++++ 5 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt diff --git a/OCH/shuttle/driver_weaknet/build.gradle b/OCH/shuttle/driver_weaknet/build.gradle index 3f2bd62161..efe2c8b90d 100644 --- a/OCH/shuttle/driver_weaknet/build.gradle +++ b/OCH/shuttle/driver_weaknet/build.gradle @@ -49,6 +49,10 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) + + testImplementation 'junit:junit:4.12' + testImplementation project(path: ':OCH:shuttle:driver_weaknet') + implementation rootProject.ext.dependencies.kotlinstdlib implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/SiteDataBean.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/SiteDataBean.kt index 5675520c9c..6ffbbd4de1 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/SiteDataBean.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/SiteDataBean.kt @@ -99,5 +99,23 @@ data class SiteDataBean( return "SiteDataBean(siteId=$siteId, lineId=$lineId, name=$name, nameKr=$nameKr, seq=$seq, gcjLon=$gcjLon, gcjLat=$gcjLat, lon=$lon, lat=$lat, introduction=$introduction, isPlayTts=$isPlayTts, videoList=$videoListDB)" } + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as SiteDataBean + + if (siteId != other.siteId) return false + if (lineId != other.lineId) return false + + return true + } + + override fun hashCode(): Int { + var result = siteId?.hashCode() ?: 0 + result = 31 * result + (lineId?.hashCode() ?: 0) + return result + } + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt index 736aea9fdb..76005efb7f 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt @@ -25,6 +25,11 @@ interface SiteDataDao { @Query("SELECT * FROM ${SiteDataBean.siteDataTable} WHERE md5 = :md5") fun querySitesByMd5(md5:String): List? + //查询线路对应的轨迹信息 + @Query("SELECT * FROM ${SiteDataBean.siteDataTable}") + fun queryAllSites(): List? + + @Query("SELECT * FROM ${SiteDataBean.siteDataTable} WHERE line_id = :lineId and site_id = :siteId") fun querySitesByLineIdAndSiteId(lineId: Long,siteId:Long):List? diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt index 7c5367ba20..7fea6ce643 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt @@ -25,25 +25,65 @@ object SiteDb: IDbRepository { siteDataDao = null } - fun addOrUpdate(siteDateList: List) { - val runnable = Runnable { - siteDataDao?.let { siteDataDao -> - siteDateList.forEach { - val md5Source = it.toString() - val md5Hex = DigestUtils.md5Hex(md5Source) - val queryContrailByMd5 = siteDataDao.querySitesByMd5(md5Hex) - if (queryContrailByMd5.isNullOrEmpty()) {// 没有值或者值有变化 - val needUpdate = - siteDataDao.querySiteByLineIdAndSiteId(it.lineId!!, it.siteId!!) - it.md5 = md5Hex - if (needUpdate != null) { - it.id = needUpdate.id - } - siteDataDao.insert(it) + fun addOrUpdate(serverDataList: List) { + val runnable = object :Runnable { + override fun run() { + siteDataDao?.let { siteDataDao -> + val localAllSites = siteDataDao.queryAllSites() + if (localAllSites.isNullOrEmpty()) { + siteDataDao.insert(*serverDataList.toTypedArray()) + return } + // 后台新增数据 + val needAddDatas = serverDataList-localAllSites + // 后台没有本地数据库有的未分配线路 + val needMinusDatas = localAllSites - serverDataList + + if (needAddDatas.isNotEmpty()) { + // 新增线路 + needAddDatas.forEach { + val md5Source = it.toString() + val md5Hex = DigestUtils.md5Hex(md5Source) + it.md5 = md5Hex + } + siteDataDao.insert(*needAddDatas.toTypedArray()) + } + + if (needMinusDatas.isNotEmpty()) { + // 删除线路 + siteDataDao.deleteById(*needMinusDatas.toTypedArray()) + } + + // 交集 服务器端 + val needUpdateByMd5 = serverDataList-needAddDatas + // 交集 本地数据库 + val oldDataList = localAllSites-needMinusDatas + + needUpdateByMd5.forEach { + val md5Source = it.toString() + val md5Hex = DigestUtils.md5Hex(md5Source) + val oldList = + oldDataList.filter { local -> local.siteId == it.siteId && local.lineId == it.lineId } + if(oldList.isNotEmpty()){ + oldList.forEachIndexed { index, siteDataBean -> + if(index==0){ + if(siteDataBean.md5==md5Hex){ + // 数据没有变化 + }else{ + it.id = siteDataBean.id + it.md5 = md5Hex + siteDataDao.insert(it) + } + }else{ + siteDataDao.deleteById(siteDataBean) + } + } + } + } + checkData() } - checkData() } + } BizLoopManager.runInIoThread(runnable) } diff --git a/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt new file mode 100644 index 0000000000..0f0d3d5be4 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -0,0 +1,74 @@ +package com.mogo.och.common.module + +import com.mogo.eagle.core.network.utils.digest.DigestUtils +import com.mogo.och.weaknet.repository.db.bean.SiteDataBean +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + + val serverDataList = mutableListOf() + serverDataList.add(SiteDataBean(siteId = 1, lineId = 1, name = "北京站1")) + serverDataList.add(SiteDataBean(siteId = 2, lineId = 1, name = "北京站2")) + serverDataList.add(SiteDataBean(siteId = 3, lineId = 1, name = "北京站3")) + val localAllSites = mutableListOf() + localAllSites.add(SiteDataBean(siteId = 1, lineId = 1, name = "北京站1")) + localAllSites.add(SiteDataBean(siteId = 2, lineId = 1, name = "北京站2")) + localAllSites.add(SiteDataBean(siteId = 3, lineId = 1, name = "北京站3")) + + // 后台新增数据 + val needAddDatas = serverDataList - localAllSites + // 后台没有本地数据库有的未分配线路 + val needMinusDatas = localAllSites - serverDataList + + if (needAddDatas.isNotEmpty()) { + // 新增线路 + println("需要新增站点$needAddDatas") + } + + if (needMinusDatas.isNotEmpty()) { + // 删除线路 + println("需要删除站点$needMinusDatas") + } + + // 交集 服务器端 + val needUpdateByMd5 = serverDataList - needAddDatas + val oldDataList = localAllSites - needMinusDatas + + needUpdateByMd5.forEach { + val md5Source = it.toString() + val md5Hex = DigestUtils.md5Hex(md5Source) + val oldList = + oldDataList.filter { local -> local.siteId == it.siteId && local.lineId == it.lineId } + if (oldList.isNotEmpty()) { + oldList.forEachIndexed { index, siteDataBean -> + if (index == 0) { + if (siteDataBean.md5 == md5Hex) { + // 数据没有变化 + } else { + it.id = siteDataBean.id + it.md5 = md5Hex + println("需要更新的站点:old:${siteDataBean}\n new:${it}") + } + } else { + println("多余数据需要删除:${siteDataBean}") + } + } + } + } + + } + + @Test + fun testData() { + + } + + +} \ No newline at end of file