feat(client): 价签默认模板品名默认展示 + 二维码放大留小边框

- 默认模板改为代码只读基准:readLabelTemplates 加载时强制用
  builtinDefault() 覆盖 builtin-default 项,忽略存储里的旧脏几何
  (旧默认品名被关/旧 QR 坐标等一律自愈回代码基准)
- 二维码放大 x198/y44/尺寸96 → x192/y32/尺寸120,四周留 ~1mm 小边框
- 原型 label-template-editor.html 高级 QR 输入同步;golden 重生
- 新增存储测试钉死「内置默认永远回代码基准」

原型与代码同提交(design-first 双边一致)
This commit is contained in:
wangjia
2026-08-31 12:07:22 +08:00
parent ced71bd8a1
commit 7dceefc55e
8 changed files with 312 additions and 54 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

@@ -47,5 +47,69 @@ void main() {
expect(list.map((t) => t.id), ['builtin-default', 'tpl-2']);
expect(list[1].name, '双语抬头');
});
test('老店铺旧默认 QR 加载时自动升级为居中坐标', () {
final def = LabelTemplate.builtinDefault();
// 构造两个历史默认签名的模板(贴头顶版 + 中间偏上版)
final legacyA = def.copyWith(id: 'tpl-legacy-a', name: '旧模板A');
legacyA.qr
..x = 178
..y = 25
..size = 134;
final legacyB = def.copyWith(id: 'tpl-legacy-b', name: '旧模板B');
legacyB.qr
..x = 190
..y = 34
..size = 116;
final cf = <String, dynamic>{
'label_templates': [legacyA.toJson(), legacyB.toJson()],
};
final list = readLabelTemplates(cf);
for (final t in list) {
expect(t.qr.x, def.qr.x, reason: '${t.name} QR.x 应升级到新默认');
expect(t.qr.y, def.qr.y, reason: '${t.name} QR.y 应升级到新默认');
expect(t.qr.size, def.qr.size, reason: '${t.name} QR.size 应升级到新默认');
}
});
test('内置默认模板永远回代码基准:存储里被改脏也覆盖回 builtinDefault', () {
final def = LabelTemplate.builtinDefault();
// 模拟老库存的 builtin-default:品名被关、QR 乱改、字号乱改
final stale = def.copyWith();
stale.textStack.name.show = false;
stale.qr
..x = 10
..y = 10
..size = 200;
stale.textStack.subLines[0].fontSize = 99;
final cf = <String, dynamic>{
'label_templates': [stale.toJson()],
};
final t =
readLabelTemplates(cf).firstWhere((x) => x.id == 'builtin-default');
expect(t.textStack.name.show, isTrue, reason: '品名默认必须展示');
expect(t.qr.x, def.qr.x);
expect(t.qr.y, def.qr.y);
expect(t.qr.size, def.qr.size);
expect(t.textStack.subLines[0].fontSize, def.textStack.subLines[0].fontSize);
});
test('用户自定义过的 QR 不匹配旧签名,加载时保持不动', () {
final custom = LabelTemplate.builtinDefault().copyWith(
id: 'tpl-custom',
name: '自定义位置',
);
custom.qr
..x = 210
..y = 60
..size = 80; // 与任一历史默认都不同
final cf = <String, dynamic>{
'label_templates': [custom.toJson()],
};
final t = readLabelTemplates(cf).first;
expect(t.qr.x, 210);
expect(t.qr.y, 60);
expect(t.qr.size, 80);
});
});
}