From a0137d6979b8ac045c7ed51de4e6270940133636 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Fri, 8 May 2026 11:58:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(db):=20=E6=96=B0=E5=A2=9E=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE=E6=B8=85=E9=99=A4=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E7=89=A9=E7=90=86=E6=B8=85=E7=A9=BA=E5=85=A8=E9=83=A8?= =?UTF-8?q?=204=20=E5=BC=A0=E8=A1=A8=E5=B9=B6=E9=87=8D=E7=BD=AE=20SP=20?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 各 DAO 新增 deleteAll() 物理清空方法 - DbRepository 新增 clearAllTestData(),按顺序删除食材→菜品→调料→槽位 - DbViewModel 暴露 clearAllTestData(onDone) 供 UI 层调用 - SettingActivity 新增「测试数据清除」入口(隐藏,右上角图标触发显示) - 清除完成后重置 SpTool.cookMode=-1 和 SpTool.canteenId="0" Co-Authored-By: Claude Sonnet 4.6 --- .../com/shuwei/dish/match/db/DbRepository.kt | 11 +++++++ .../com/shuwei/dish/match/db/DbViewModel.kt | 11 +++++++ .../shuwei/dish/match/db/dao/CookFoodDao.kt | 4 +++ .../dish/match/db/dao/CookFoodGoodsDao.kt | 4 +++ .../shuwei/dish/match/db/dao/SeasoningDao.kt | 4 +++ .../dish/match/db/dao/SeasoningSlotDao.kt | 4 +++ .../shuwei/dish/match/ui/SettingActivity.kt | 23 +++++++++++++ app/src/main/res/layout/activity_setting.xml | 32 +++++++++++++++++++ 8 files changed, 93 insertions(+) diff --git a/app/src/main/java/com/shuwei/dish/match/db/DbRepository.kt b/app/src/main/java/com/shuwei/dish/match/db/DbRepository.kt index d68d977..4240d3c 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/DbRepository.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/DbRepository.kt @@ -222,6 +222,17 @@ class DbRepository { suspend fun countSlotAll() = withContext(Dispatchers.IO) { db.seasoningSlotDao().countSlotAll() } + + /** + * 物理清空全部 4 张表的测试数据 + * 清除顺序:先删子表(食材),再删主表(菜品),最后删配置表(调料、槽位) + */ + suspend fun clearAllTestData() = withContext(Dispatchers.IO) { + db.cookFoodGoodsDao().deleteAll() + db.cookFoodDao().deleteAll() + db.seasoningDao().deleteAll() + db.seasoningSlotDao().deleteAll() + } } // //class SeasoningRepository(val seasoningDao: SeasoningDao) { diff --git a/app/src/main/java/com/shuwei/dish/match/db/DbViewModel.kt b/app/src/main/java/com/shuwei/dish/match/db/DbViewModel.kt index 42a0151..e864cb8 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/DbViewModel.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/DbViewModel.kt @@ -239,6 +239,17 @@ class DbViewModel : ViewModel() { // ---- 数据库调试查看 ---- + /** + * 物理清空全部 4 张表的测试数据,完成后通过回调通知 UI + * @param onDone 清除完成后在主线程执行的回调 + */ + fun clearAllTestData(onDone: () -> Unit) { + viewModelScope.launch { + rep.clearAllTestData() + onDone() + } + } + companion object { /** 每页加载条数 */ const val DB_INSPECT_PAGE_SIZE = 50 diff --git a/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodDao.kt b/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodDao.kt index 84c8a6e..d1c4286 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodDao.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodDao.kt @@ -40,4 +40,8 @@ interface CookFoodDao { /** 统计菜品记录总数,showDel=true 时包含已删除记录 */ @Query("SELECT COUNT(*) FROM dm_cook_food WHERE (:showDel = 1 OR isDel = 0)") suspend fun countCookFoodAll(showDel: Int): Int + + /** 物理清空全表,用于清除测试数据 */ + @Query("DELETE FROM dm_cook_food") + suspend fun deleteAll() } diff --git a/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodGoodsDao.kt b/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodGoodsDao.kt index 7ae95f7..21222ce 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodGoodsDao.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/dao/CookFoodGoodsDao.kt @@ -40,4 +40,8 @@ interface CookFoodGoodsDao { /** 统计食材记录总数,showDel=true 时包含已删除记录 */ @Query("SELECT COUNT(*) FROM dm_cook_food_goods WHERE (:showDel = 1 OR isDel = 0)") suspend fun countCookFoodGoodsAll(showDel: Int): Int + + /** 物理清空全表,用于清除测试数据 */ + @Query("DELETE FROM dm_cook_food_goods") + suspend fun deleteAll() } diff --git a/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningDao.kt b/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningDao.kt index 4f2ee2e..df98acc 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningDao.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningDao.kt @@ -53,4 +53,8 @@ interface SeasoningDao { /** 统计调料记录总数,showDel=true 时包含已删除记录 */ @Query("SELECT COUNT(*) FROM dm_seasoning WHERE (:showDel = 1 OR isDel = 0)") suspend fun countSeasoningAll(showDel: Int): Int + + /** 物理清空全表,用于清除测试数据(比 clearAllSeasoning 的逻辑删除更彻底) */ + @Query("DELETE FROM dm_seasoning") + suspend fun deleteAll() } diff --git a/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningSlotDao.kt b/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningSlotDao.kt index 5a052e4..512be8d 100644 --- a/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningSlotDao.kt +++ b/app/src/main/java/com/shuwei/dish/match/db/dao/SeasoningSlotDao.kt @@ -60,4 +60,8 @@ interface SeasoningSlotDao { */ @Query("DELETE FROM dm_seasoning_slot WHERE deviceId = :deviceId") suspend fun deleteAllByDeviceId(deviceId: String) + + /** 物理清空全表,用于清除测试数据 */ + @Query("DELETE FROM dm_seasoning_slot") + suspend fun deleteAll() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt index 1ad21c8..9093248 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt @@ -16,6 +16,7 @@ import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.startActivity +import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.visible /** @@ -48,6 +49,7 @@ class SettingActivity : BaseActivity() { it.clickWithDebounce { binding.llDbInspect.visible() binding.llScaleObserve.visible() + binding.llClearTestData.visible() } }) @@ -83,6 +85,27 @@ class SettingActivity : BaseActivity() { binding.llScaleObserve.clickWithDebounce { startActivity() } + binding.llClearTestData.clickWithDebounce { + showClearTestDataDialog() + } + } + + /** + * 弹出清除测试数据的二次确认弹窗 + */ + private fun showClearTestDataDialog() { + CommonDialog(this) + .setTitle("测试数据清除") + .setContent("将物理删除全部 4 张表数据(菜品、食材、调料、槽位),此操作不可恢复,同时重置菜品模式和食堂id,确认继续?") + .setNegativeButton("取消") + .setPositiveButton("确认清除") { + appViewModel.clearAllTestData { + SpTool.cookMode = -1 + SpTool.canteenId = "0" + toast("测试数据已清除") + } + } + .show() } private fun openCollectPage() { diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 1f457fc..c422f81 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -173,6 +173,38 @@ tools:ignore="ContentDescription" /> + + + + + + +