feat: refactor multi-code boxing UI with compact v2 layout
Merge box number and paichan info into a single header bar, compress list rows to 40px with left color bars, fix bottom operation area (scan/submit/finish) above status bar, and shrink notification bars and status bar for more list space. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
191
docs/多码凑箱UI布局优化PRD.md
Normal file
191
docs/多码凑箱UI布局优化PRD.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# PRD · 多码凑箱页面布局优化
|
||||
|
||||
**模块**:装箱编号 > 多码凑箱模式(BoxingMode.multiCode)
|
||||
**文件**:`lib/pages/boxing_page.dart`(主要影响 `_buildManyToOneBody` 及相关子方法)
|
||||
**版本**:v2
|
||||
**状态**:待评审
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与目标
|
||||
|
||||
多码凑箱页面在手持 PDA / 手机屏幕(宽度约 375–390px)上使用时,原版布局存在以下问题:
|
||||
|
||||
- **垂直空间浪费**:AppBar、箱号区、排产信息区各自独占一行,三块合计高度约 140px,挤压了中间列表区的可视行数。
|
||||
- **操作区随列表滚动**:扫码区和提交区位于列表下方,装入项目多时需要下拉才能看到操作控件,增加操作摩擦。
|
||||
- **信息层次不清晰**:删除确认使用弹窗,打断了列表的整体感知;通知条与内容区边界不明确。
|
||||
|
||||
**优化目标**:在同一屏内展示更多已装入项目,同时保持操作控件始终可见,整体界面整洁、层次分明。
|
||||
|
||||
---
|
||||
|
||||
## 2. 改动总览
|
||||
|
||||
| 区域 | 原版高度(估算) | v2 高度(估算) | 节省 |
|
||||
|------|--------------|--------------|------|
|
||||
| AppBar | ~52px | 44px | 8px |
|
||||
| 箱号区 + 排产信息区 | ~80px(两行) | 48px(合并一行) | 32px |
|
||||
| 列表每行 | ~48–52px | 40px | 8–12px/行 |
|
||||
| 通知条(每条) | ~36px | 30px | 6px |
|
||||
| 状态栏 | ~38px | 28px | 10px |
|
||||
|
||||
三项以上改动叠加后,典型场景下可多显示 **1–2 条**已装入记录,且操作底栏固定可见。
|
||||
|
||||
---
|
||||
|
||||
## 3. 详细改动说明
|
||||
|
||||
### 3.1 AppBar(`_buildAppBar`)
|
||||
|
||||
**原版**:高度约 52px,标题与模式切换按钮分布松散,模式徽章内边距较大。
|
||||
|
||||
**v2**:
|
||||
- 高度收紧至 **44px**(Material 标准最小可触高度)。
|
||||
- 标题(`装箱编号`)与模式徽章(`⇄ 多码凑箱 P2`)左右对齐,中间用弹性空白(`Spacer`)分隔。
|
||||
- 模式徽章内边距从 `6px 10px` 收窄至 `3px 9px`,字号保持 `11px`,快捷键角标用半透明背景小标签呈现。
|
||||
|
||||
---
|
||||
|
||||
### 3.2 箱号区 + 排产信息区 → 合并为 `header-bar`(`_buildManyToOneBoxNoPanel`)
|
||||
|
||||
**原版**:箱号输入框(22px 标签 + 44px 输入框)与排产信息行(排产号、已有箱数、最大箱号、详情按钮)分两个独立区块,共约 80px。
|
||||
|
||||
**v2**:合并为单行 `header-bar`,高度约 **48px**,布局如下:
|
||||
|
||||
```
|
||||
[ 箱号 ██ 1 ██ ] │ W00009 已有 1 箱 · 最大箱号 1 详情
|
||||
```
|
||||
|
||||
- 箱号输入框:宽 52px,高 32px,字号 18px 加粗,左侧配 `11px` 灰色小标签"箱号"。
|
||||
- 竖向分隔线将箱号区与排产信息区视觉隔开。
|
||||
- 排产号(`13px` 加粗)+ 统计信息(`11px` 灰色)两行叠放,`flex: 1` 撑满中间。
|
||||
- `详情` 链接按钮右对齐,无数据时置灰。
|
||||
|
||||
**影响代码**:`_buildManyToOneBoxNoPanel()`、相关 `_boxNoController` 绑定逻辑不变,仅 UI 结构调整。
|
||||
|
||||
---
|
||||
|
||||
### 3.3 已装入列表(`_buildManyToOnePackedList`)
|
||||
|
||||
**原版**:每行 `packed-item` 高度约 48–52px,内含 `8px 8px` 内边距,信息横排一行。
|
||||
|
||||
**v2**:每行高度压缩至 **40px**,采用左侧色条 + 两行叠放的结构:
|
||||
|
||||
```
|
||||
序号 ▌ 26BW0011 80 / 80 ✏️ 🗑
|
||||
▌ WO-2026-001
|
||||
```
|
||||
|
||||
- **左侧色条**(宽 3px,高 26px,圆角):正常 = 绿色,编辑中 = 琥珀色,删除确认 = 红色。用色条替代原版整行背景色染色,减少视觉干扰。
|
||||
- **序号列**(宽 14px):灰色小字,方便操作者快速定位。
|
||||
- **主信息列**:总排号 `12px` 加粗(上行)+ 工单号 `11px` 灰色(下行),`overflow: ellipsis` 防止溢出。
|
||||
- **数量列**:`12px` 加粗绿色,格式 `已装 / 总量`。
|
||||
- **操作按钮**:✏️(编辑)/ 🗑(删除),触摸区域 28×28px,悬停背景 `#eeeeee`。
|
||||
|
||||
**编辑态**:数量文字替换为 52px 宽输入框,操作按钮变为 ✓(保存)/ ✕(取消)。
|
||||
|
||||
**删除确认态**:废弃弹窗方案,改为**行内展开次级条**(高度约 26px),与触发行紧邻,包含`删除` / `取消` 两个小按钮。行背景变淡红,色条变红,视觉上整体标记该条目处于危险操作中。
|
||||
|
||||
**列表头**(sticky):高度约 30px,`已装入本箱` 左对齐,`N 项` 蓝色右对齐,固定在列表顶部,滚动时不消失。
|
||||
|
||||
---
|
||||
|
||||
### 3.4 底部操作区固定化(`_buildManyToOneScanArea` + `_buildManyToOneSubmitArea`)
|
||||
|
||||
**原版**:扫码区、数量输入、确认按钮、完成本箱按钮位于列表下方,随列表内容延伸,装入项目多时操作区不可见。
|
||||
|
||||
**v2**:底部操作区改为**固定底栏(不参与滚动)**,从上至下分三行:
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────┐
|
||||
│ [✓ 26BW0014 · WO-004 · 50件] │ 扫码条 ~38px
|
||||
│ 数量 [ 50 ] [确认] │ 提交行 ~48px
|
||||
│ [ 完成本箱 ] │ 完成行 ~50px
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**扫码条**:
|
||||
- 等待状态:灰色背景,`📷 请扫描执行卡二维码`,文字灰色。
|
||||
- 已扫码状态:浅绿背景,`✓ 总排号 · 工单号 · N件`,文字绿色,绿色边框。
|
||||
|
||||
**提交行**:
|
||||
- `数量` 标签(`11px`)+ 输入框(`flex:1`,高 34px)+ 确认按钮(高 34px,`padding 0 18px`)。
|
||||
- 未扫码时:输入框禁用,确认按钮灰色不可点。
|
||||
- 已扫码时:输入框激活,确认按钮蓝色可点。
|
||||
|
||||
**完成本箱行**:
|
||||
- 全宽描边按钮(高 36px,圆角 8px),有已装入项时激活,否则灰色。
|
||||
|
||||
---
|
||||
|
||||
### 3.5 通知条(Alert Bars)
|
||||
|
||||
**原版**:每条高度约 36px,字号 13px,内边距 `8px 16px`。
|
||||
|
||||
**v2**:
|
||||
- 高度压缩至约 **30px**,内边距 `6px 12px`,字号 `12px`。
|
||||
- 多条通知可叠加显示(同步条 + 警告条并存,场景6)。
|
||||
- 各通知类型颜色语义不变:橙(同步中)/ 琥珀(警告)/ 蓝(信息)/ 黄(重复箱号)。
|
||||
- 同步条保留旋转动画小图标(`12px`,`0.7s` 线性)。
|
||||
|
||||
---
|
||||
|
||||
### 3.6 状态栏(`StatusBar`)
|
||||
|
||||
**原版**:高度约 38px,背景 `#f0f0f0`,内边距 `12px 16px`。
|
||||
|
||||
**v2**:
|
||||
- 高度压缩至约 **28px**,内边距 `6px 12px`。
|
||||
- 状态点直径从 8px 缩至 7px,文字从 14px 缩至 12px。
|
||||
- 颜色语义不变(蓝/绿/橙/红/琥珀)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 整体布局结构(v2)
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────┐ 44px
|
||||
│ 装箱编号 [⇄ 多码凑箱 P2] │ AppBar
|
||||
├──────────────────────────────────────────┤
|
||||
│ [通知条,可叠加,每条 ~30px] │ 可选
|
||||
├──────────────────────────────────────────┤ 48px
|
||||
│ 箱号 [ 1 ] │ W00009 已有1箱·最大箱1 详情│ header-bar
|
||||
├──────────────────────────────────────────┤
|
||||
│ 已装入本箱(sticky) 3 项 │ ~30px
|
||||
│ 1 ▌ 26BW0011 WO-001 80/80 ✏️ 🗑 │ 40px
|
||||
│ 2 ▌ 26BW0012 WO-002 60/60 ✏️ 🗑 │ 40px
|
||||
│ 3 ▌ 26BW0013 WO-003 40/40 ✏️ 🗑 │ 40px ← 可滚动
|
||||
│ ... │
|
||||
├──────────────────────────────────────────┤
|
||||
│ [✓ 26BW0014 · WO-004 · 50件] │ ~38px 固定
|
||||
│ 数量 [ 50 ] [确认] │ ~48px 固定
|
||||
│ [ 完成本箱 ] │ ~50px 固定
|
||||
├──────────────────────────────────────────┤ 28px
|
||||
│ ● 装箱成功,请继续扫码 │ 状态栏
|
||||
└──────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 影响范围
|
||||
|
||||
| 方法/组件 | 改动类型 |
|
||||
|-----------|---------|
|
||||
| `_buildManyToOneBody()` | 结构重组(列表区 + 固定底栏) |
|
||||
| `_buildManyToOneBoxNoPanel()` | 重写(合并为 header-bar) |
|
||||
| `_buildManyToOnePackedList()` | 重写(行高、色条、内联删除确认) |
|
||||
| `_buildManyToOneScanArea()` | 移入固定底栏,样式调整 |
|
||||
| `_buildManyToOneSubmitArea()` | 移入固定底栏,高度调整 |
|
||||
| `_buildAppBar()` 多码分支 | 高度和内边距调整 |
|
||||
| `StatusBar` widget | 尺寸参数调整 |
|
||||
| Alert bar 区域 | 内边距和字号调整 |
|
||||
|
||||
业务逻辑(`decideMultiCodePaichanContext`、`_applyAutoFill`、`_onSubmitSuccess`、`_finishManyToOneBox` 等)**不受影响**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 不在本次范围内
|
||||
|
||||
- 单码装箱模式(`BoxingMode.single`)的布局不做调整。
|
||||
- 字体、主题色、品牌色系不做变更。
|
||||
- 横屏/平板适配留作后续专项。
|
||||
Reference in New Issue
Block a user