task(740424d0-c60b-47bd-a601-ded7a24bf7a6): Add M5 survey point data module (2.9/2.14/2.15 + manual entry)

补偿提交:commitOnArchive 连续第三轮未落盘(M3/M4 同款故障),由主控在子会话工作树直接补交。

M5 采集·测点数据模块四功能点:
- M5-01 (2.9) PointApi/PointModels/PointRepository 归一提取 + SurveyGroupPointSource
  平台测点选择器(pointId 贯通 payload)+ 测组监测点列表页(TaskDetail 入口)
- M5-02 (2.14) + M5-03 (2.15) 采集页上下文信息卡(并发拉取、失败降级不阻塞)
- M5-04 手动录入:buildManual 同构 payload 入同一条 Room 上传队列
  (entrySource=MANUAL),复核确认 + 已入队反馈
- upload_queue entry_source 列迁移 v1→v2(ALTER TABLE 非破坏迁移)
This commit is contained in:
阿猫
2026-09-04 02:26:32 +08:00
parent 3cb82169b6
commit 65a693052e
25 changed files with 1839 additions and 34 deletions

View File

@@ -14,7 +14,7 @@ import androidx.room.RoomDatabase
entities = [
UploadQueueEntity::class,
],
version = 1,
version = 2,
exportSchema = false,
)
abstract class AppDatabase : RoomDatabase() {

View File

@@ -2,6 +2,8 @@ package com.stec.cmd.core.database
import android.content.Context
import androidx.room.Room
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -14,6 +16,15 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
object DatabaseModule {
/** v1→v2upload_queue 加 entry_source 列M5-04 手动录入来源标识),保数据非破坏迁移。 */
private val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"ALTER TABLE upload_queue ADD COLUMN entry_source TEXT NOT NULL DEFAULT 'BLE'",
)
}
}
@Provides
@Singleton
fun provideAppDatabase(
@@ -22,7 +33,7 @@ object DatabaseModule {
context,
AppDatabase::class.java,
AppDatabase.DATABASE_NAME,
).build()
).addMigrations(MIGRATION_1_2).build()
@Provides
@Singleton

View File

@@ -49,6 +49,10 @@ data class UploadQueueEntity(
/** 上传成功时间epoch 毫秒),未上传为 null。 */
@ColumnInfo(name = "uploaded_at")
val uploadedAt: Long? = null,
/** 入队来源BLE 蓝牙采集 / MANUAL 手动录入(见 [UploadEntrySource]M5-04。 */
@ColumnInfo(name = "entry_source", defaultValue = UploadEntrySource.BLE)
val entrySource: String = UploadEntrySource.BLE,
)
/** 队列状态常量S0 用 Int 避免 Room TypeConverter 样板S1 可按需替换为枚举)。 */
@@ -65,3 +69,12 @@ object UploadStatus {
/** 失败待重试。 */
const val FAILED = 3
}
/** 入队来源常量M5-04手动录入与蓝牙采集共用一条队列来源字段区分。 */
object UploadEntrySource {
/** 蓝牙采集M4 动线,历史数据缺省值)。 */
const val BLE = "BLE"
/** 手动录入/补录M5-04无法蓝牙采集时人工录入。 */
const val MANUAL = "MANUAL"
}