Files
m-stecmd/app/src/main/kotlin/com/stec/cmd/FeatureMount.kt
阿猫 b8e4c24fd2 task(03452fc3-d6cb-4549-b79d-7d389c7e5e8e): Add M6 stats & upload module (2.13/2.10/2.11/2.12 + queue retransmit)
补偿提交:commitOnArchive 连续第四轮未落盘(M3/M4/M5 同款故障),由主控在子会话工作树补交。

M6 统计与数据上传模块交付:
- M6-02 (2.10) 项目监测计划统计列表(完成度进度条+百分比 Chip)
- M6-03 (2.11) / M6-04 (2.12) 测组统计与监测点统计两层下钻
- M6-01 (2.13) SAF 选原始文件 multipart 直传 AnalysisMonitorData + 解析结果反馈
- 上传队列补传闭环 UploadQueueSyncer(应用启动 + ConnectivityManager VALIDATED
  onAvailable 双触发,Mutex 串行,成功 SUCCESS/失败回退 PENDING 记 retry)
- Tab.STATS 业务化:挂载 StatsWorkspaceFragment,删除占位 StatsFragment
- 新增 StatApi/UploadApi/StatModels + StatRepository/UploadRepository
- 单测 StatsModelsTest/UploadPayloadWrapTest;静态核查 7 项 + 生产网关负向契约 4 端点
2026-09-04 02:59:47 +08:00

48 lines
2.0 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.stec.cmd
import com.stec.cmd.feature.collect.CollectWorkspaceFragment
import com.stec.cmd.feature.home.ProjectWorkspaceFragment
import com.stec.cmd.feature.mine.MineFragment
import com.stec.cmd.feature.stats.StatsWorkspaceFragment
import com.stec.cmd.feature.task.TaskWorkspaceFragment
/**
* 底部导航 5 Tab 与业务模块(功能明细表编号)的挂载点注册中心。
*
* S1+ 挂载业务页面的方式:把对应 [MountItem.fragmentClass] 从占位 Fragment
* 换成业务 Fragment 即可导航壳MainActivity零改动新增 Tab 时扩展 [Tab]。
* 挂载映射依据《安卓客户端功能明细表》:
* 首页=M2、任务=M3、采集=M4+M5、统计=M6、我的=M1。
*/
object FeatureMount {
/** 底部导航 TabitemId 与 res/menu/bottom_nav_menu.xml 一一对应)。 */
enum class Tab(val itemId: Int, val labelRes: Int) {
HOME(R.id.nav_home, R.string.tab_home),
TASK(R.id.nav_task, R.string.tab_task),
COLLECT(R.id.nav_collect, R.string.tab_collect),
STATS(R.id.nav_stats, R.string.tab_stats),
MINE(R.id.nav_mine, R.string.tab_mine),
}
/** 单个 Tab 的挂载项。 */
data class MountItem(
val tab: Tab,
val fragmentClass: Class<out androidx.fragment.app.Fragment>,
val moduleTag: String,
)
/** 挂载注册表S1+ 替换 fragmentClass 即完成业务页挂载。 */
val mounts: List<MountItem> = listOf(
MountItem(Tab.HOME, ProjectWorkspaceFragment::class.java, "M2 项目工作台"),
MountItem(Tab.TASK, TaskWorkspaceFragment::class.java, "M3 任务管理"),
MountItem(Tab.COLLECT, CollectWorkspaceFragment::class.java, "M4+M5 数据采集"),
MountItem(Tab.STATS, StatsWorkspaceFragment::class.java, "M6 统计与上传"),
MountItem(Tab.MINE, MineFragment::class.java, "M1 我的"),
)
/** 按 menu itemId 取挂载项;未知 id 返回 null容错。 */
fun byItemId(itemId: Int): MountItem? =
mounts.firstOrNull { it.tab.itemId == itemId }
}