Files
VX5_KRO_GearPump/doc/2026-04-29_日期替代逻辑迁移与BarcodeEditor联动工作日报.md
T
2026-04-29 14:10:10 +08:00

199 lines
6.1 KiB
Markdown
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.
# 2026-04-29 日期替代逻辑迁移与 BarcodeEditor 联动工作日报
## 工作背景
- `DateReplaceEditor` 是从 `DateVarSet` 中拆分出来的“代替”选项卡编辑器。
- 当前 UI 已经拆分完成,但原先 `DateVarSet` 中“代替”页签对应的逻辑、默认数据、以及与 `BarcodeEditor` 的联动尚未完整迁移。
- 目标是让 `DateReplaceEditor`、`DateFormatEditor` 在 `BarcodeEditor` 中成对工作,并补齐默认替换列表初始化能力。
---
## 本次完成内容
### 1. 为 DateReplaceEditor 补齐替代页数据模型接口
在 `scene/DateReplaceEditor.h/.cpp` 中补充并实现:
- `DateItemModel DateReplaceEditor::dateModel()`
- `void DateReplaceEditor::setDateModel(const DateItemModel &model)`
实现效果:
- `dateModel()`:把当前编辑器中的替代数据回收成 `DateItemModel`
- `dataMap`
- `weeksMap`
- `hoursMap`
- `monthsMap`
- `daysMap`
- `yearsMap`
- `setDateModel()`:将 `DateItemModel` 回填到编辑器内部列表,并依据当前替代类型刷新界面显示。
这样 `DateReplaceEditor` 就具备了和外部视图模型双向交换数据的能力。
---
### 2. 复刻 DateVarSet 中“代替”页默认数据初始化逻辑
在 `DateReplaceEditor` 中补齐了与 `DateVarSet::initReplaceValue()` 对应的默认初始化逻辑,包含以下替代列表:
- `dataList`:`0-9`、`A-F`
- `weekList`:`MON-SUN`
- `monthList`:`01-12`
- `dayList`:`01-31`
- `hourList`:`00-23`
- `yearList/yearInitList`:从当前年份开始连续 16 年
同时实现/整理了以下行为:
- 根据替代类型切换不同分页展示:
- 数据
- 星期
- 月
- 年
- 日
- 时
- 分页上下翻页逻辑
- 每页 4 项内容展示
- `lineEdit_Replace1~4` 文本变化实时写回对应列表
- “预设值”按钮按类型写入对应替换映射
这部分逻辑与原 `DateVarSet` 的替代页行为保持一致。
---
### 3. 在 BarcodeEditor 中补充 DateReplaceEditor 的成对增删逻辑
在 `scene/BarcodeEditor.h/.cpp` 中新增并接入:
- 成员:`DateReplaceEditor *m_dateReplaceEditor = nullptr;`
- 构造函数中实例化 `m_dateReplaceEditor`
- 析构函数中移除对应 tab 并释放对象
联动行为实现如下:
#### 当内容模板包含 `{t}` 时
动态添加两个页签:
- `DateFormatEditor` -> 标题:`日期/时间`
- `DateReplaceEditor` -> 标题:`代替`
并设置尺寸与数据同步。
#### 当内容模板不包含 `{t}` 时
动态移除上述两个页签,确保 `DateFormatEditor` 与 `DateReplaceEditor` 成对出现、成对消失。
#### 在 `bindViewModel()` 中
- 将 `m_vm->dateViewModel()` 转成 `DateFormatEditorVM` 后回填给 `DateFormatEditor`
- 将 `m_vm->dateViewModel()` 直接回填给 `DateReplaceEditor`
从而保证条码编辑器在绑定数据后,两个日期相关页签都能正确显示已有配置。
---
### 4. 打通 BarcodeEditor 中“代替”页的数据回写
在 `BarcodeEditor` 的格式确认逻辑处理中,补充了 `DateReplaceEditor` 到 `BarcodeViewModel` 的数据回写:
- 从 `m_dateReplaceEditor->dateModel()` 取出当前替代配置
- 回写到 `m_vm->dateViewModel()` 的以下字段:
- `dataMap`
- `daysMap`
- `monthsMap`
- `yearsMap`
- `weeksMap`
- `hoursMap`
同时保留 `DateFormatEditor` 对以下日期字段的同步:
- `datetimePattern`
- `daysOffset`
- `monthsOffset`
这样 `BarcodeEditor` 内部对日期格式页和日期替代页的数据已经形成完整闭环。
> 备注:后续如果 `onBtnFormatClicked()` 的业务逻辑再次调整,需要确保上述日期格式和替代数据的回写逻辑继续保留。
---
### 5. 为 DateItemModel 增加默认替代数据构造函数
在 `scene/ViewModels.h` 中为 `DateItemModel` 增加:
- `static DateItemModel createDefaultReplaceModel()`
该函数用于统一构造默认“替代”数据,初始化内容如下:
- `dataMap`:`0-9/A-F`
- `monthsMap`:`01-12`
- `daysMap`:`01-31`
- `weeksMap`:`MON-SUN`
- `hoursMap`:`00-23`
- `yearsMap`:当前年份起连续 16 年,键和值均为年份文本
其默认规则严格参考 `DateVarSet::initReplaceValue()` 的实现,作为公共默认数据来源。
---
### 6. 在 BarcodeEditor 中接入默认替代列表初始化
在 `scene/BarcodeEditor.cpp` 中,使用 `DateItemModel::createDefaultReplaceModel()` 进行了两处接入:
#### 构造函数中
- 为新创建的 `m_vm` 直接设置默认 `dateViewModel`
- 再同步给 `m_dateReplaceEditor`
目的:
- 即便外部还未绑定真实数据,`DateReplaceEditor` 也能拥有完整默认替换列表,不会出现空白替代项。
#### `bindViewModel()` 中
- 对传入的 `dateViewModel` 做兜底检查
- 若以下任意替代字段为空,则仅补齐缺失字段,而不覆盖已有数据:
- `dataMap`
- `daysMap`
- `monthsMap`
- `yearsMap`
- `weeksMap`
- `hoursMap`
目的:
- 保证已有业务数据优先
- 缺失时自动回填默认替代列表
- 避免出现部分字段为空导致编辑器显示异常的问题
---
## 涉及文件
本次涉及的主要文件:
- `scene/DateReplaceEditor.h`
- `scene/DateReplaceEditor.cpp`
- `scene/BarcodeEditor.h`
- `scene/BarcodeEditor.cpp`
- `scene/ViewModels.h`
---
## 当前结果
目前已实现:
- `DateReplaceEditor` 具备独立替代逻辑与数据模型读写能力
- `DateReplaceEditor` 与 `DateFormatEditor` 在 `BarcodeEditor` 中成对出现/删除
- `BarcodeEditor` 可同步和回写替代数据
- `DateItemModel` 可统一生成默认替代列表
- `BarcodeEditor` 已接入默认替代列表初始化和缺失字段兜底
## 后续建议
- 在真正的“确定/保存”入口统一调用 `DateFormatEditor` 与 `DateReplaceEditor` 的回写逻辑,避免后续格式按钮语义变更带来数据遗漏。
- 若后续还有其他编辑器需要复用日期默认替代列表,统一使用 `DateItemModel::createDefaultReplaceModel()`,避免重复维护多份初始化代码。
- 后续如需联调,请先修复 Qt 工程生成链路(`qmake` / `ui_*.h` / includePath / Makefile)后再进行完整编译验证。