熟食结算整行三色状态卡实施计划
执行约束:当前工作区已有未提交的“先放后选”等改动。实施时只追加状态卡相关补丁,不清理、不还原、不暂存、不提交、不推送、不切换分支。
目标:隐藏“当前商品:xxx”,把称重状态改造成整行双层状态卡,并以蓝、橙、绿覆盖全部现有状态。
架构:保留状态机与业务渲染入口,新增纯展示映射类;Activity 只应用视觉结果,现有语音去重保持不变。
技术:Android XML、Java 8、Vector Drawable、JUnit 4、Gradle/AGP 4.2.1。
架构:保留状态机与业务渲染入口,新增纯展示映射类;Activity 只应用视觉结果,现有语音去重保持不变。
技术:Android XML、Java 8、Vector Drawable、JUnit 4、Gradle/AGP 4.2.1。
0. 文件结构
| 类型 | 文件与职责 |
|---|---|
| 新增 Java | CookedFoodStatusPresentation.java:主状态到辅助说明、三色 Tone 的纯展示映射。 |
| 新增测试 | CookedFoodStatusPresentationTest.java:覆盖 INFO、WARNING、SUCCESS 和未知状态回退。 |
| 新增资源 | 三套背景、三枚矢量图标、具名颜色、尺寸和辅助说明。 |
| 修改布局 | activity_cooked_food.xml:移除当前商品,加入整行状态卡。 |
| 修改页面 | CookedFoodActivity.java:移除当前商品引用并应用状态展示。 |
| 交付记录 | 创建同 basename 的 Markdown 与 HTML 变更记录。 |
任务清单
Task 1:建立工作区基线并锁定边界
- ☑ 记录分支、HEAD 和现有未提交文件。
- ☑ 阅读 Activity、布局和 strings 当前差异,不覆盖前一轮实现。
- ☑ 核对方案 B、三色语义和辅助说明不播报等设计约束。
Task 2:增加具名视觉资源和辅助文案
- ☑ 在
colors.xml增加蓝、橙、绿各四个具名颜色。 - ☑ 在
dimens.xml增加状态卡高度、边距、圆角、图标和字号。 - ☑ 在
strings.xml增加 13 条只用于展示的辅助说明。 - ☑ 运行
:app:processDebugResources,结果BUILD SUCCESSFUL。
Task 3:以 TDD 增加状态展示映射
- ☑ 先创建测试,覆盖两个蓝色状态、一个绿色状态、全部橙色状态和未知状态。
- ☑ 运行测试,确认因
CookedFoodStatusPresentation不存在而失败。 - ☑ 创建带职责注释的纯展示映射类,只输出 Tone 和辅助字符串资源。
- ☑ 重跑目标测试并确认通过。
READY_TO_PLACE / READY_TO_SELECT → INFO WAITING_REMOVE_ZERO → SUCCESS 其他等待、处理中、异常、未知状态 → WARNING
Task 4:增加背景和矢量图标
- ☑ 创建蓝、橙、绿三套浅底色圆角描边背景。
- ☑ 创建蓝色和绿色对勾、橙色感叹号 Vector Drawable。
- ☑ 不使用 Emoji、字体符号或 Java 硬编码颜色。
- ☑ 重新处理资源,确认 Shape 和 Vector 合法。
Task 5:把顶部布局改为整行状态卡
- ☑ 删除
cooked_food_selected_product_view。 - ☑ 加入铺满可用宽度、72dp 高的状态卡。
- ☑ 加入 36dp 图标、22sp 主提示和 15sp 辅助说明。
- ☑ 重量区定位到状态卡下方,重量、价格、归零和隐藏按钮内部结构保持不变。
- ☑ 运行资源构建。
Task 6:接入 Activity 并保持语音边界
- ☑ 删除
currentProductView字段、查找和赋值。 - ☑ 绑定状态卡、图标和辅助说明。
- ☑ 在
setCookedFoodStatus()中先应用展示,再执行原有语音去重。 - ☑ 根据 INFO、WARNING、SUCCESS 应用具名背景、图标和文字颜色。
- ☑ 删除确认无引用的“当前商品”字符串。
- ☑ 运行目标测试和 Java 编译。
statusView.setText(statusResId); applyStatusPresentation(CookedFoodStatusPresentation.forStatus(statusResId)); if (lastStatusResId == statusResId) return; // 后续沿用现有语音资源解析和播放。
Task 7:完整自动化验证与质量复核
- ☑ 运行
:app:testDebugUnitTest :app:assembleDebug。 - ☑ 确认旧当前商品 id、字段和字符串均无引用。
- ☑ 确认三个 Tone 均有实现和测试覆盖。
- ☑ 确认
resolveStatusVoice()与res/raw不因本次 UI 改造变化。 - ☑ 执行
git diff --check并记录 APK SHA-256。
Task 8:真机视觉与交互验收
- ☑ 执行设备连接预检:
adb devices未发现连接设备,未安装 APK。 - ☐ 留存蓝色可放置、橙色变化中、蓝色可选、绿色已入车和橙色归零中截图。
- ☐ 验证相同状态不重复播报,辅助说明不播报。
- ☐ 验证直接入车、Toast、购物车和用户主动归零没有回归。
- ☐ 验证长异常文案和实际字体缩放。
Task 9:同步变更记录和计划状态
- ☑ 创建
change_records/2026-09-20-cooked-food-full-width-status-card.md/.html。 - ☑ 记录文件、三色映射、语音边界、测试、APK 哈希和真机结论。
- ☑ 只勾选有新鲜证据支持的步骤;真机未完成时保持待验收。
- ☑ 验证 MD/HTML 配对和关键结论一致。
关键资源
| 语义 | 背景 | 强调色 | 标题 | 辅助说明 |
|---|---|---|---|---|
| INFO | #EAF5FF | #3197D6 | #246B9A | #5C7280 |
| WARNING | #FFF7E8 | #F5A12B | #A85B00 | #6F6252 |
| SUCCESS | #EDF9F0 | #38B862 | #287A43 | #5F7164 |
验证命令
JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew \ :app:testDebugUnitTest :app:assembleDebug --console=plain rg -n "cooked_food_current_product|currentProductView|cooked_food_selected_product_view" \ app/src/main/java app/src/main/res git diff --check shasum -a 256 app/build/outputs/apk/debug/app-debug.apk
完成判定
- 当前商品视图和引用全部移除。
- 所有状态唯一映射到蓝、橙、绿之一。
- 主提示、辅助说明、图标、背景和描边同步变化。
- 语音内容和触发边界不变。
- 全量测试、构建和静态检查通过。
- 变更记录已成对同步。
- 真机未验收时明确标为待验收,不宣称全面完成。