670 Commits

Author SHA1 Message Date
wangjia fcc254caff chore: release client-v1.1.17
Deploy Client / build-client-web (push) Successful in 53s
Deploy Client / build-windows (push) Successful in 2m9s
Deploy Client / build-macos (push) Failing after 1m58s
Deploy Client / build-android (push) Has been skipped
Deploy Client / build-ios (push) Has been skipped
Deploy Client / release-deploy-client (push) Has been skipped
client-v1.1.17
2026-08-31 12:08:49 +08:00
wangjia 7dceefc55e feat(client): 价签默认模板品名默认展示 + 二维码放大留小边框
- 默认模板改为代码只读基准:readLabelTemplates 加载时强制用
  builtinDefault() 覆盖 builtin-default 项,忽略存储里的旧脏几何
  (旧默认品名被关/旧 QR 坐标等一律自愈回代码基准)
- 二维码放大 x198/y44/尺寸96 → x192/y32/尺寸120,四周留 ~1mm 小边框
- 原型 label-template-editor.html 高级 QR 输入同步;golden 重生
- 新增存储测试钉死「内置默认永远回代码基准」

原型与代码同提交(design-first 双边一致)
2026-08-31 12:07:22 +08:00
wangjia ced71bd8a1 refactor(client): P3 PDF/Web 价签收口为「贴画布位图」+ 抽出单源渲染器
将标签「画布位图」渲染逻辑(renderLabelImage / renderLabelPngBytes + 文字/条码/
字号自适应辅助)抽到平台无关的 label_bitmap.dart,四条路径共用同一套几何:
桌面预览、桌面热敏 TSPL 光栅、桌面 PDF 回退、Web 打印。

- print_util_stub.dart:PDF 回退(printProductLabelImpl)非热敏时不再手搭 pw.* 组件
  树(忽略模板坐标),改贴整幅 renderLabelImage 位图铺满 40×20mm 页;删除仅供旧
  PDF 树使用的 _navy/_cream/_footnote/_ink 常量与 barcode 包导入。
- print_util_web.dart:HTML flex 布局换成单张 <img> 画布 PNG;renderLabelPreviewImpl
  由返回 null 改为走共享渲染器(Web 预览与桌面同源)。
- 效果:同一模板在热敏/PDF/Web 观感 100% 一致。条码/二维码随位图光栅化,扫码风险
  只在 ≥300dpi 办公机路径(热敏 203dpi 仍走原生 TSPL BARCODE/BITMAP,不受影响)。

零回归:label_render_golden 逐像素通过(抽出保持字节等价);flutter analyze 0
error/warning、362 测试全绿、check_ds_code --strict 0 违规。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-30 14:43:34 +08:00
wangjia 195b4d22e7 feat(client): 标签模板编辑器头部加「打印」按钮(重置与保存之间)
打印当前预览:复用出签弹窗 LabelPreviewDialog(选打印机/份数),传入正在
编辑的模板 _t 与示例数据。预览/打印共用 _sampleLabel() 抽出示例 LabelData。

L1 图标单源:新登记 i-printer(Lucide printer)到原型 icons.js + 官网
icons.njk 两端(check-l1-sync 同集要求),原型头部 use #i-printer。

design-first:原型 label-template-editor.html 同步加「打印」按钮 + printTpl()
占位,与真实屏同提交。smoke test 增头部「打印」按钮断言。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-30 12:08:17 +08:00
wangjia 7b3a0ecdeb feat(client): 标签模板编辑器 P2 · 编辑器屏+存储+打印联动(原型同提交)
设备管理「价签·编辑」进入独立编辑器屏 /devices/label-template:
- 左实时预览走真实 renderLabelPreview 渲染路径(示例数据, debounce 重渲)
- 右属性面板:多模板管理(编辑对象/打印默认分离)、显示字段手风琴、
  高级区域位置、打印参数
- 存 shop.custom_fields.label_templates + label_template_active(零后端改)
- Option A:同物理行两字段(编号+型号 / 版本+日期)共用字号·加粗·对齐,
  各自独立开关;仅品名支持自动字号;字体不做(热敏单色)
- 打印联动:LabelPreviewDialog 改 ConsumerStatefulWidget, 未显式传模板时
  自动取本店 active 模板→所有打印入口(商品详情/出入库列表/编辑抽屉)一致生效

守护:
- 默认输出逐像素零变化由 label_render_golden_test 守(改内置默认常量才触发)
- 存储读写由 label_template_storage_test 单测守(纯内存, 不触真实库)
- 编辑器挂载由 label_template_editor_smoke_test 守
- 本屏不入自动 fidelity/golden 闸(左预览 Picture.toImage 需 runAsync,
  pumpAndSettle 骨架驱动不了), 原因+替代守法记入 CONTRACT 块4

design-first:原型 label-template-editor.html 去字体选择器、加 Option A 配对
镜像, 与真实屏同提交。真机热敏打印坐标/条码可扫须用户在打印机验收。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-30 09:56:23 +08:00
wangjia 27c5f94329 feat(design): 价签模板编辑器原型(P1),已过审
新增 design/prototype/screens/label-template-editor.html:左实时预览价签 +
右属性面板(模板下拉/显示字段手风琴含每行字体·字号·加粗·对齐/高级区域位置
数字精调/打印参数)。1 期决策:栅格流布局不做拖拽、字段样式内嵌每行、字体仅
系统+内置思源黑体、编辑对象与打印默认对象分离(打印默认徽标+底部提示)。
index.html 登记 kit 卡,devices.html 价签卡编辑入口指向本屏。

check-ds 12 道全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-29 23:19:04 +08:00
wangjia eedcd9a385 refactor(client): 价签渲染器改栅格流布局(computeLayout),隐藏字段邻居回收空间
标签版式从绝对坐标改为「栅格流/自动回流」:LabelTemplate.computeLayout()
解析存储坐标为流式绝对几何(LabelLayout),三条回流规则——条码隐藏文字区向下
延伸、二维码隐藏文字区向右延伸、抬头隐藏整体上移;打印安全地板钳制
(kMinQrSize=80/kMinBarcodeH=20)。画布位图与热敏 TSPL 两条渲染路径改为只读
computeLayout(),不再直读 tpl.header/qr/barcode/textStack。

全字段显示时回流均为 no-op,默认模板逐像素等于重构前基准——
label_render_golden_test 零 diff 守护。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-29 23:18:55 +08:00
wangjia d67295234e refactor(client): 抽声明式 LabelTemplate 单源,价签渲染改读模型(P0)
价签版式原 100% 硬编码在四条渲染路径。引入 label_template.dart
声明式模型(纸张/打印/抬头/文字栈/QR/条码),builtinDefault() 逐值冻结
重构前常量;画布渲染器 _renderLabelBitmap 与热敏 _printFlatLabelThermal
改为纯读模型,坐标统一到画布权威。facade/web stub 加 template 可选参
(null→默认,现有调用点行为不变)。

新增 label_render_golden 零回归基准:默认模板渲染与重构前逐像素零 diff。
附评审通过的设计文档 label-template-editor.html(5 项决策)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-29 00:00:13 +08:00
wangjia df242dd703 chore: release client-v1.1.16
Deploy Client / build-client-web (push) Successful in 1m0s
Deploy Client / build-macos (push) Successful in 2m58s
Deploy Client / build-android (push) Successful in 1m18s
Deploy Client / build-ios (push) Successful in 3m22s
Deploy Client / build-windows (push) Successful in 2m8s
Deploy Client / release-deploy-client (push) Successful in 3m5s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.16
2026-08-28 20:02:17 +08:00
wangjia 6610d629ce fix(client): 修复 Windows 标签打印中文空白(NotoSansSC family 改用静态字体)
可变字体 NotoSansSC.ttf 的 fvar 轴在 Windows dart:ui(Skia) 下解析失败致标签 canvas 文字全空白(macOS CoreText 正常);family 重指静态 NotoSansSC-Regular.ttf。可变版文件保留(golden_harness/tools 仍按路径加载)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 19:32:33 +08:00
wangjia 4ed2c612a9 chore: release client-v1.1.15
Deploy Client / build-windows (push) Successful in 2m1s
Deploy Client / build-client-web (push) Successful in 1m3s
Deploy Client / build-macos (push) Successful in 2m41s
Deploy Client / build-android (push) Successful in 1m41s
Deploy Client / build-ios (push) Successful in 3m35s
Deploy Client / release-deploy-client (push) Successful in 3m31s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.15
2026-08-28 17:31:04 +08:00
wangjia 78e6a4c192 fix(client): 热敏打印价签中文字体清晰化(NotoSansSC+4x超采样+覆盖率投票二值化,字号上调)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 17:31:00 +08:00
wangjia 801b8528ec feat(client): 库存规格/系列筛选改可搜索单选下拉、仓库单选,修复下拉过宽过高溢出
原型与代码同提交(design-first):下拉宽度锚定触发器宽 max(宽,220)、列表 264 封顶超出滚动、底部计数常驻。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 17:30:55 +08:00
wangjia a1a3118c88 fix(ci): download_release_assets 改用 browser_download_url + 下载后大小校验
Forgejo 的 /releases/{id}/assets/{asset_id} API 端点返回 JSON 元数据(约245字节)
而非二进制,导致下载到坏 web.tar.gz、部署时 tar 报 Unrecognized archive format。
改用 asset.browser_download_url(http→https 跟随重定向 + token)拉真正的文件,
并在下载后校验字节数与声明 size 一致,不符即当场失败。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 12:48:17 +08:00
wangjia 2797c998f8 fix(ci): 发版 create_release/upload_asset 改幂等,重跑不再 409 崩
根因:release-client.sh 建 Release 非幂等——首跑已建好 Release+传齐产物但
deploy 未跑完时,retry 再 POST 同 tag 的 Release,Forgejo 回 409
("Release is has no Tag"),整个 release-deploy 在部署前就硬失败,发版卡死。

- create_release:撞 409 时改为按 tag 取回既有 Release 复用其 id 继续。
- upload_asset:同名 asset 已存在时先删旧再重传,避免重名 409。

重跑发版从此安全;免重编上线用 Manual Deploy(manual.yml)拉既有 Release 产物部署。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 12:21:06 +08:00
wangjia 90e6b25cec chore: release client-v1.1.14
Deploy Client / build-windows (push) Successful in 1m56s
Deploy Client / build-client-web (push) Successful in 5m0s
Deploy Client / build-macos (push) Successful in 7m24s
Deploy Client / build-android (push) Successful in 1m28s
Deploy Client / build-ios (push) Successful in 6m13s
Deploy Client / release-deploy-client (push) Failing after 42s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.14
2026-08-28 02:31:29 +08:00
wangjia 1655769827 chore(client): AppConfig 默认连生产 jiu.51yanmei.com
BASE_URL/PUBLIC_URL/ABOUT_URL 默认值改为线上,flutter run 不带
--dart-define 即连生产;需本地后端时显式 --dart-define 覆盖。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 02:28:56 +08:00
wangjia 46302d9e4a feat(client): 标签名下改两配对行居中(编号+度数/规格+日期)
保留深蓝表头+Code128 条码+位图字体+二维码外壳;品名与副字段
水平居中,行1=编号值+度数、行2=规格+日期,去掉「编号」前缀。
覆盖 canvas 预览/热敏栅格/PDF/web 四条渲染路径 + 原型 devices.html。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 02:28:51 +08:00
wangjia d299d4b0b0 fix(client): 删除价签底部米色页脚,二维码/条码放大填满纸面
原型与热敏/PDF/Web 三路渲染同步去掉标签底部那条印着「40×20mm」的
米色横条(打印时深色字会印到纸上,属冗余),主体直抵纸底:

- 原型 devices.html:删 .lbl-ftr CSS+DOM,.lbl-mid flex:1 自动填充
- Canvas 预览:删米色页脚绘制块+cFoot 常量,bodyBot 145→160
- 热敏 TSPL 原生:qrW/qrH 104→118、qrX 208→194、qrY 28→33,
  条码 kBarH 28→34、kBarY 102→118
- PDF:删 footerH 常量+页脚 Container,Expanded 主体撑满
- Web:删 .ftr CSS+div,.middle flex:1 填充

门禁:analyze 0 error / test 356 通过 / DS 原型 12 道 / L1 同源 / 颜色单源 全绿

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-28 00:15:21 +08:00
wangjia 848a9ee2c6 ci(deploy-client): iOS 上传加超时看门狗 + iOS 失败不阻断发版
Deploy Client / build-windows (push) Successful in 3m58s
Deploy Client / build-client-web (push) Successful in 6m17s
Deploy Client / build-macos (push) Successful in 13m39s
Deploy Client / build-android (push) Successful in 7m17s
Deploy Client / build-ios (push) Successful in 6m42s
Deploy Client / release-deploy-client (push) Successful in 11m50s
1.1.13 发版事故复盘:build-ios 的 altool 上传静默卡死数分钟无输出,超
runner 僵尸超时被 SIGKILL 判失败(软失败 else 分支没机会跑);且 build-ios
被 release-deploy 硬 needs → 连带 web/mac/win/android 整体没部署。

- compile-ios.sh: altool 上传套后台看门狗(本机无 timeout/coreutils),超
  420s 先 TERM 再 KILL,保证永远在僵尸窗口内干净收尾,失败只告警不阻断。
- deploy-client.yml: build-ios 加 continue-on-error;release-deploy 改
  if: always() 只校验 4 个真实平台成功即部署,iOS 真正不阻塞。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.13
2026-08-27 22:41:28 +08:00
wangjia 7025ccd1b5 chore: release client-v1.1.13
Deploy Client / build-windows (push) Successful in 4m43s
Deploy Client / build-client-web (push) Successful in 6m22s
Deploy Client / build-macos (push) Successful in 7m36s
Deploy Client / build-android (push) Successful in 7m54s
Deploy Client / build-ios (push) Failing after 13m2s
Deploy Client / release-deploy-client (push) Has been skipped
扫码出库免回车(120ms 防抖自动加入明细)+ 热敏标签重写为光栅化,
消除字体重叠/与预览失真/底部重复店名(原型+画布+PDF+Web 同步)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-27 21:48:47 +08:00
wangjia c3a127485f chore: release client-v1.1.12
Deploy Client / build-client-web (push) Successful in 5m19s
Deploy Client / build-macos (push) Successful in 7m36s
Deploy Client / build-android (push) Successful in 6m18s
Deploy Client / build-ios (push) Successful in 6m2s
Deploy Client / build-windows (push) Successful in 5m27s
Deploy Client / release-deploy-client (push) Successful in 10m49s
价签标签两栏布局改版 + 生产日期修复 + 模板预览接真实渲染 +
Windows/macOS 应用内更新进度条修复。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.12 winstage-v1.1.12
2026-08-27 17:52:03 +08:00
wangjia eb7b0edc96 chore: release client-v1.1.11
Deploy Client / build-windows (push) Successful in 54s
Deploy Client / build-client-web (push) Successful in 5m43s
Deploy Client / build-macos (push) Successful in 7m19s
Deploy Client / build-android (push) Successful in 7m10s
Deploy Client / build-ios (push) Successful in 6m14s
Deploy Client / release-deploy-client (push) Successful in 13m3s
修复 Windows 版因构建流程缺陷未包含扫码出库功能(github-mode winstage
校验缺失所致,本版已由 fetch-windows-staged.sh 的 client/ 子树 SHA 校验兜底)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
client-v1.1.11
2026-08-26 16:40:09 +08:00
wangjia 6d64a9bfbf fix(devops): 发版加版本一致性硬校验,杜绝错版 Windows 包/错版部署
根因:github 模式的 windows 构建按版本名(winstage-vX)拉包,不校验提交,
winstage tag 可能打在错误提交上 → 发出「版本号对但代码错版」的包
(client-v1.1.10 缺扫码功能事故)。

- fetch-windows-staged.sh:比对发版提交与 winstage 提交的 client/ 子树 SHA,
  不一致硬失败并提示从发版提交重建 winstage。
- deploy-client.sh:发版前校验 version.yaml + web version.json 版本==tag,
  发版后实测线上 /version==tag(重试5次),任一不符即部署失败。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
winstage-v1.1.11
2026-08-26 16:14:07 +08:00
wangjia fc15a34a77 fix(ci): deploy-client 推 ali 改用 rsync --partial+重试替代 scp
client-v1.1.10 run #362 的 Deploy → Ali 失败:安装包(android 83M 等)经 frp/
pangolin 隧道 scp 传到一半连接 reset,scp 无续传→整个 job 挂 14min。改为:
- 新增 push_file():rsync -av --partial --timeout=120 + 重试 5 次,断点续传;
- version.yaml 用 push_file(必达,失败即 set -e 中止);
- web 目录 rsync 加 --partial+重试 3 次,失败即中止(不切不完整目录);
- 三个安装包用 push_file,5 次仍失败仅告警不阻断 web/version 切换。
本机手动补发 1.1.10 时正是用 rsync --partial 续传成功补上 android apk。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-26 02:43:33 +08:00
wangjia 7d0595105f fix(ci): version.yaml 的 build_number 改用版本号公式派生
旧法读仓库 backend/config/version.yaml 的 build_number 再 +1,但 CI 与
local-release 部署时都不回写仓库那份,它永远冻结 → 每次发版都算出同一个值
(1.1.9 / 1.1.10 线上 build_number 均为 5)。改用 major*10000+minor*100+patch
(与 pubspec CFBundleVersion 同源、天然单调),无状态依赖,CI 与本机结果一致。
自更新按版本字符串判断,build_number 仅展示,历史 5 无害。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-26 01:56:17 +08:00
wangjia 70f003cb1a ci: iOS TestFlight 上传失败不再阻断发版
Deploy Client / build-client-web (push) Successful in 57s
Deploy Client / build-windows (push) Successful in 35s
Deploy Client / build-macos (push) Successful in 8m23s
Deploy Client / build-android (push) Successful in 7m40s
Deploy Client / build-ios (push) Successful in 7m54s
Deploy Client / release-deploy-client (push) Failing after 14m32s
altool 上传易抖(重复 build 号/ASC 临时错误),不应拖住 web/mac/win/android。
IPA 仍产出,上传失败仅告警,可稍后手动补传。对齐 CLAUDE.md「iOS 不阻塞」。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
winstage-v1.1.10 client-v1.1.10
2026-08-25 20:38:00 +08:00
wangjia e4ba3e310e chore: release client-v1.1.10
Deploy Client / build-client-web (push) Successful in 54s
Deploy Client / build-windows (push) Failing after 3m2s
Deploy Client / build-macos (push) Successful in 2m32s
Deploy Client / build-android (push) Successful in 1m34s
Deploy Client / build-ios (push) Failing after 13m35s
Deploy Client / release-deploy-client (push) Has been skipped
- 扫码出库(扫码枪扫二维码,明细自动 +1)
- 只读模式下允许激活兑换券(自救出口)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-25 19:29:33 +08:00
wangjia 8fb81cc571 fix(client): 只读模式下允许激活兑换券(自救出口)
授权到期进入 readonly/locked 相位后,「兑换续期」按钮被全局
WriteGuard 误锁(置灰/隐藏),用户无法激活新授权码自救。后端
/license/* 本就豁免 LicenseGuard,去掉该按钮外层 WriteGuard 包裹;
role=readonly 仍由后端 ReadOnly() 403 兜底。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-25 19:11:26 +08:00
wangjia 22047b725c feat(client): 扫码出库(扫码枪扫二维码,明细自动 +1)
出库单新建页桌面端加「扫码枪扫码」框:扫商品二维码 URL → 取其中
的 ?code= → 本地整仓索引精确命中 → 明细自动新增/累加数量(每扫
+1)。本地未命中(大仓库存超前端加载上限 1000)时走服务端按编码
精确查兜底,复用现有库存搜索接口,无需新后端接口。

- 前端 stock_out_form_screen:扫码框 + _onScan + _codeIndex +
  parseScanCode + 服务端兜底 + 300ms 防抖 + 提示音;桌面专属,
  窄屏隐藏。
- 后端 product.go:二维码 URL 路径 /app/product/ → /product/
  统一到 SSR 公开页路由。
- 原型 stock-in.js/html:出库明细头同步加扫码框(design-first)。
- 测试 parse_scan_code_test(8 例)+ 出库表单桌面 golden 重生成。
- 设计/实现计划文档 docs/design/scan-stock-out-*。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bupi8Kdqkfx2N5acFsHTx5
2026-08-25 19:11:15 +08:00
wangjia b5715aec8d feat(release): 本地发版脚本 local-release.sh(绕过不稳的 CI 隧道)
在本机完成整套客户端发版:本地代码、本地编译签名、二进制暂存 dist/、直接
部署 ali(+iOS TestFlight)。取代 deploy-client.yml 在 mac-runner→NAS gitea
隧道反复 git checkout 失败的问题。

- 阶段:web/macos(Developer ID+公证+staple)/android(rbw keystore)/
  ios(app-store)/windows(拉 GitHub 云构建)/deploy(version.yaml+scp ali)/testflight
- 密钥全走本机(钥匙串+rbw+~/.appstoreconnect+ssh 别名 ali),不用 CI 的 base64→临时 keychain
- --only 可选阶段;敏感临时物(keystore/key.properties)mktemp+trap 清理,不入库
- 实测:1.1.9 --only web,macos,android,windows,deploy 全过,已上线 ali

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 10:51:12 +08:00
wangjia bec45c282f fix(ios): 改用自动签名,修复 archive/export 证书-profile 不配对
本机 login keychain 的 Apple Distribution 证书(2027 有效)与项目里写死的
手动 profile "Jiu App Store"(用另一张/旧证书签发)不配对,archive/export 报
"Provisioning profile doesn't include signing certificate"。

- project.pbxproj:Runner Release 配置 Manual → Automatic(删写死的
  PROVISIONING_PROFILE_SPECIFIER + Apple Distribution identity),与项目其它
  配置、local_test.sh --ios 一致,由 Xcode 现场配对当前证书。
- compile-ios.sh:ExportOptions signingStyle manual → automatic,去掉手动
  profile 发现逻辑(不再依赖会漂移的手动材料)。

验证:本机 sh scripts/ci/compile-ios.sh client-v1.1.9 → 构建 岩美酒库.ipa →
altool 上传成功(build 10109 已上 TestFlight,Delivery UUID 4bda0191)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 10:25:49 +08:00
wangjia dccf3610b5 fix(ci): iOS 改用本机 login keychain 证书+本地 profile+本地 .p8 签名
CI iOS 报 'No valid code signing certificates':原 IOS_DIST_CERT_P12_BASE64 secret
里的证书过期。改用本机 login keychain 的有效 Apple Distribution 证书(到2027-07)
+ 自动发现的 App Store profile + 本机 .p8,不再依赖 base64 secret。
team/key-id 带默认,issuer 走 gitea secret APPSTORE_API_ISSUER_ID(已设)。
本地实测:过了证书+profile 检查、进入 archive(签名修复生效),后续 iOS 平台组件另议。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-20 09:26:49 +08:00
wangjia cac84b4388 ci: 删除 checks.yml(每次 push 占 runner)+ deploy-client 恢复 tag 触发
Deploy Client / build-client-web (push) Successful in 11m29s
Deploy Client / build-macos (push) Successful in 13m15s
Deploy Client / build-android (push) Successful in 9m1s
Deploy Client / build-windows (push) Successful in 7m17s
Deploy Client / build-ios (push) Failing after 4m10s
Deploy Client / release-deploy-client (push) Has been skipped
- 删 checks.yml:design-source 检查每次 push 都跑、占唯一 mac-runner、与发版抢资源;
  golden/ds 闸改本地跑(flutter test test/golden/)。需要时可从 git 恢复。
- deploy-client 恢复 push tags 自动触发(之前误删),保留 Windows 单节点改动。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
client-v1.1.9
2026-07-18 20:02:30 +08:00
wangjia 3d1402bec8 ci(deploy-client): 改手动触发(去 tag 自动) + Windows 合并为单节点
Design Source Checks / design-source (push) Successful in 4m35s
- 去掉 push tags 自动触发,只留 workflow_dispatch(打 tag 只作标记,发版手动 Run workflow)
  ——弱网+gitea tag 事件飘忽下反复出重复 run/卡死,改手动可控
- build-windows + build-windows-ci 合并为单个 build-windows(runs-on 表达式选 runner +
  step if 决定家里现编/mac 拉 github),DAG 只显示一个节点

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 19:53:17 +08:00
wangjia f9ba81ae43 fix(golden): 冻结应用时钟消除时间依赖非确定性(product_detail/license/inventory_check)
golden 失败根因:商品详情屏用实时 DateTime.now() 算「近30天出库」,随真实时间推移
6月流水掉出30天窗口→渲染变化→对不上。license/inventory_check 同理(剩余天数/盘点日期)。
修复:
- product_detail_screen: DateTime.now() → appNow()(可注入时钟)
- golden_harness: 所有 golden 渲染前冻结 appClock=2026-07-01 + tearDown 复位(ds-flow 钉死动态值)
- 重录 license_mobile / m_inventory_check 6 张 golden;product_detail 冻结后自动匹配无需改图
本地 flutter test test/golden/ 全 120 通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 19:53:17 +08:00
wangjia 067f21c273 release: 触发 client-v1.1.9 发版(稳定网络重发 #2)
Design Source Checks / design-source (push) Failing after 8m48s
Deploy Client / build-client-web (push) Failing after 4m30s
Deploy Client / build-macos (push) Has been skipped
Deploy Client / build-android (push) Has been skipped
Deploy Client / build-ios (push) Has been skipped
Deploy Client / build-windows-ci (push) Successful in 7m29s
Deploy Client / build-windows (push) Has been cancelled
Deploy Client / release-deploy-client (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 19:18:45 +08:00
wangjia aa4a3951f7 release: 触发 client-v1.1.9 发版(WiFi 稳定网络重发)
Design Source Checks / design-source (push) Failing after 1m59s
Deploy Client / build-client-web (push) Failing after 15m28s
Deploy Client / build-macos (push) Has been skipped
Deploy Client / build-android (push) Has been skipped
Deploy Client / build-ios (push) Has been skipped
Deploy Client / build-windows-ci (push) Failing after 1s
Deploy Client / build-windows (push) Has been cancelled
Deploy Client / release-deploy-client (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 10:41:15 +08:00
wangjia 5eec510f1e ci(windows): NAS 暂存设 continue-on-error(发版已从 GitHub 拉,NAS 仅最佳努力记录)
Design Source Checks / design-source (push) Failing after 4m4s
Deploy Client / build-client-web (push) Successful in 5m3s
Deploy Client / build-windows-ci (push) Successful in 4m57s
Deploy Client / build-macos (push) Failing after 4m38s
Deploy Client / build-android (push) Has been skipped
Deploy Client / build-ios (push) Has been skipped
Deploy Client / build-windows (push) Has been cancelled
Deploy Client / release-deploy-client (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 09:38:03 +08:00
wangjia 161dee17b1 ci(windows): 加 permissions contents:write——GITHUB_TOKEN 默认只读建不了 Release(403)
Design Source Checks / design-source (push) Failing after 5m48s
Deploy Client / build-macos (push) Successful in 8m50s
Deploy Client / build-client-web (push) Successful in 13m39s
Deploy Client / build-windows-ci (push) Successful in 4m34s
Deploy Client / build-android (push) Successful in 11m59s
Deploy Client / build-ios (push) Failing after 2m43s
Deploy Client / build-windows (push) Has been cancelled
Deploy Client / release-deploy-client (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 09:21:49 +08:00
wangjia c8eabe0596 ci(windows): Windows 包发版改从 GitHub Release 拉取(免 frps)
Design Source Checks / design-source (push) Failing after 5m2s
mac-runner off-LAN 时,从 NAS 经 ali frps 下载 26MB 太慢/易断(实测 ~220KB/s 且中途断)。
改为:windows.yml 额外发布到 GitHub Release winstage-v<版本>;deploy-client 的
build-windows-ci 从 github.com 拉(不过 frps)+ 重试断点续传 + 完整性校验。
需 gitea 密钥 GH_TOKEN(已设)。NAS 暂存保留作记录。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 09:13:50 +08:00
wangjia 03772542d2 docs(changelog): 1.1.9 发版说明
Design Source Checks / design-source (push) Failing after 11m21s
Deploy Client / build-client-web (push) Successful in 7m49s
Deploy Client / build-windows-ci (push) Failing after 5m10s
Deploy Client / build-macos (push) Successful in 12m17s
Deploy Client / build-ios (push) Has been cancelled
Deploy Client / build-windows (push) Has been cancelled
Deploy Client / release-deploy-client (push) Has been cancelled
Deploy Client / build-android (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
winstage-v1.1.9
2026-07-18 08:16:55 +08:00
wangjia 5cf8958313 feat(prototype): 登记支付状态图标 待支付/已支付/已关闭
Design Source Checks / design-source (push) Has been cancelled
ds-flow 原型单源:BADGE_ICON 补三个支付状态图标,先登记再供页面使用。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 07:53:53 +08:00
wangjia f6e326794e fix(backend): 出入库列表 Preload(Items) 供手机端卡片显示品项数
List 之前未 preload items,手机端 MCard sub 行拿不到 items.length。
入库进价对 operator 本就可见(客户端无条件展示+待定价逻辑依赖 costPrice),
故 stock_in 不加脱敏;stock_out 侧成本敏感,List 已有 stripStockOutCost 兜底,安全。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 07:53:53 +08:00
wangjia fcd8733679 fix(ci): fetch 用 browser_download_url 下载(assets API 返回元数据非二进制)+ 大小校验
Design Source Checks / design-source (push) Has been cancelled
测试发现 Gitea /releases/{id}/assets/{id} 端点返回附件元数据 JSON(260B)而非二进制。
改用 browser_download_url 直链下载,并加 <1MB 拒绝发版的完整性校验。
端到端验证:winstage-v9.9.9 → 拉到完整 25M PE32 安装器;版本不匹配硬失败。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
winstage-v1.0.52
2026-07-18 07:30:38 +08:00
wangjia 0a54ded445 ci(windows): GitHub 云构建 Windows 安装器暂存 NAS + 发版可选来源(home/github)
家里 Windows runner 关机时的备用构建源。
- windows.yml: 构建 Inno 安装器(复用 compile-windows.sh)→ 暂存 NAS gitea winstage-v<版本>
- deploy-client.yml: build-windows 加 home/github 开关(参数 windows_source 优先,变量 WINDOWS_SOURCE 兜底),新增 build-windows-ci 从 NAS 按版本拉取
- stage/fetch 脚本: 版本强匹配,拉不到硬失败

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-18 07:08:48 +08:00
wangjia fd654f21ac ci(windows): 构建注入生产后端 BASE_URL/PUBLIC_URL=https://jiu.51yanmei.com(原默认 localhost 连不上后端) 2026-07-16 04:03:13 +08:00
wangjia 32416e6983 ci: GitHub Actions windows-latest 构建 jiu client(flutter build windows + 打包 artifact) 2026-07-16 02:58:08 +08:00
wangjia 905e0700da docs: iOS 上架 runbook 补 ASC 商店文案备稿(副标题/描述/关键词/URL)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:54:03 +08:00
wangjia 1167a01c6a docs: iOS App Store 上架流程 runbook(备案-2A/保留 iPad/S003 演示门店已拍板)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:49:57 +08:00