Commit Graph

418 Commits

Author SHA1 Message Date
wangjia c2f4b97423 fix(client): 状态下拉对照原型 .menu(白底圆角 + 选中蓝勾蓝字)
实现原是 Material 默认下拉(灰底 + 灰高亮块),改为对照原型 .menu/.menu-item:
白底圆角描边、选中项 lucide check 蓝勾 + 蓝字 fw600、去掉 initialValue 灰高亮。

注:此菜单样式多处复用(主题器/用户/列设置),下一步抽成 DsMenu 统一。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 22:58:08 +08:00
wangjia 0b19a99fda feat(client): KPI 图标改用 lucide(与原型同源图形库)
原型图标源自 lucide-static(icons.js)。引入 lucide_icons_flutter 包,
库存屏 KPI 图标改 LucideIcons.box/database/box/triangleAlert,与原型一模一样
(不再用 Material 凑近似)。golden_harness 加载 Lucide package 字体(family 带
packages/ 前缀),golden 正确渲染。flutter test 242 通过。

后续:侧栏/顶栏/状态栏图标也逐步换 lucide(对照 shell.js)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 22:56:10 +08:00
wangjia 00d9410bd3 fix(client): 补提交 ds_table.dart(库存屏依赖)+ 库存移动端 golden
ds_table.dart 在 ds 地基提交后新建、库存屏提交时漏 add,补回避免仓库缺文件。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 21:59:07 +08:00
wangjia 7b611211c5 refactor(client): 库存屏改用 ds 组件库重写(屏内零内联样式)
按「屏只组合组件、不写样式」用 widgets/ds/ 重写库存屏:
- KPI: KpiCard → DsKpi(4 卡,ic 右上 + mono 数字 + 缺货 accent)
- 表格: DataTableCard → DsTable(列头漏斗 header + 状态 DsBadge 圆点 + 库存 accent 染色 + 分页)
- 工具栏: TextField → DsSearchBox;状态内联 chip → DsChip;重置/导出 → DsButton
- _buildInventoryCell 改返回 Widget(供 DsRow.cells),状态走 _dsStatusBadge(DsBadge)
- 颜色全走 token(闸 0 违规),analyze 0 error,flutter test 242 通过

旧 DataTableCard/KpiCard/StatusPill 依赖仅剩未用的预警/流水 tab,下一步清理。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 21:58:00 +08:00
wangjia 9ce8934412 feat(client): ds 组件库地基(镜像 atoms.css 原子,屏重写前置)
按「先建单一组件源、屏只组合不重写样式」重立组件层:
- 新建 widgets/ds/:DsButton(.btn ghost/primary/danger/sm) · DsBadge(.badge+圆点) ·
  DsChip(.chip 状态筹码) · DsSearchBox(.searchbox) · DsKpi(.kpi 含 .ic 右上块+环比 .d)
- 每个组件一对一对照 atoms.css 尺寸/间距/圆角/字号,颜色/尺寸全引 token(0 硬编码,颜色闸过)
- 现有 KpiCard/StatusPill 等逐步迁入 ds/ 废弃

下一步:建 DsTable(表格+列头漏斗+分页+状态徽章用 DsBadge)→ 用 ds 组件重写库存屏。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 21:30:59 +08:00
wangjia 7623a4c702 fix(client): 真机字体改回系统默认(PingFang,对齐原型) + 原型去新增入库
- themes.dart 不再全局强制 NotoSansSC:真机用系统字体(macOS/iOS=PingFang SC,
  与原型 --font 一致),消除真机字体偏离原型;Noto 仅 golden 测试加载(CI 无中文字体)
- 原型 inventory.html 同步去掉「新增入库」按钮,与代码保持一致

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 21:20:46 +08:00
wangjia 904bfbe67d feat(client): Phase 2 库存屏照原型重建(去tab/KPI货值/库存·成本价·单价列)
照原型 inventory.html 把库存屏从「3 tab」重排为单视图:
- 去 3 tab(库存查询/预警/流水)→ 单视图;预警并入 KPI 缺货卡点击筛选;流水移商品详情
- 头部:库存管理 + 共 N 个 SKU·数据实时 + 列设置/导出(盘点/新增入库去掉,走专门菜单)
- KPI 4 卡走全店汇总接口:SKU总数/库存货值(Σqty×进价)/在库数量/缺货预警(可点筛选)
- 表格 12 列:加 库存(低库存染色)/成本价(进价)/单价(售价);操作列只「查看详情」;状态圆点
- 仓库/备注默认隐藏;工具栏 搜索+状态筛选+重置
- 后端 GET /inventory/summary 全店汇总(守 shop_id);前端 model/repository/provider 配套
- golden_harness:monospace 指向 Noto(消等宽数字黑块,全 golden 受益);库存屏存量 grey 清零

后端编译/库存测试通过;前端 analyze 0 error,flutter test 242 通过;代码端颜色闸 0 违规。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 20:40:54 +08:00
wangjia 5e4cc668e5 feat(backend): 库存接口带出售价 sale_price(库存屏成本价/单价两列地基)
照原型库存表「成本价(进价)+单价(售价)」两列:
- 库存查询 SELECT 加 p.sale_price AS sale_price;成本价 unit_price 补 p.purchase_price 兜底
- inventoryRow 加 SalePrice;前端 Inventory model 加 salePrice
- 多租户隔离不变(baseWhere 仍 inv.shop_id);库存测试通过

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 19:56:27 +08:00
wangjia 23a583918d feat(tools): 代码端真相源闸 check_ds_code + 外壳硬编码颜色清零
把原型 check-ds 的「单一真源」纪律延伸到 Flutter 代码:
- client/tool/check_ds_code.mjs:扫 lib/(排除.g.dart) 硬编码 Color(0x..)/Colors.具名色,
  --strict/--changed 报错挡提交,合理特例须显式 // ds-ignore: 理由
- tokens.css(单源,client+原型同步) 加 chrome 前景色 --brand-dot/--on-accent/--on-accent-faint,
  codegen 进 AppChrome;外壳 14 处硬编码(白字/品牌点/grace橙)全部改走 token
- 外壳+3 新 widget 现 0 违规;全量存量 172→158(其余屏后续逐步清)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 19:14:47 +08:00
wangjia d85d68574d fix(client): 账号菜单弹按钮正上方不遮挡 + side-user hover 变色
对照原型修两点:
1. 菜单原先 over 盖住 side-user 按钮;改为按「菜单估高」把菜单完整弹到按钮上方
   留 8px 间隙,触发器始终可见(对齐原型)
2. side-user 抽成 _SideUserTile,加 hover 变色(t.sideHover,与左侧 nav 一致)
- user_menu_width_test 增断言:菜单末项底 ≤ 触发器顶(不遮挡)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 18:51:55 +08:00
wangjia 0ebf26c282 fix(client): 账号菜单改 showMenu 等宽触发器 + 向上弹(修菜单溢出盖内容)
上一版用 PopupMenuButton width:218 + offset:-12 反而把菜单外扩、右缘越过侧栏
盖住内容区。改为 GestureDetector + showMenu,菜单宽度 = 用户区实测宽度(自动与
侧栏内容等宽、绝不溢出),底部空间不足 showMenu 自动向上弹、不遮触发器。
加 user_menu_width_test:点开后断言菜单宽≈194、右缘≤218(弹出态回归)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 18:40:07 +08:00
wangjia 15d825125d feat(tools): fidelity 加分区域阈值(抓全屏百分比淹没的局部错位)
针对「顶栏右组错位全屏 diff 3.5% 没报红」的盲区:
- screens.mjs shell 加 zones(顶栏/侧栏/状态栏逻辑坐标 + 各自紧阈,顶栏收到 4%)
- fidelity.mjs:有 zones 时全屏仅参考,逐 zone 判定(按 dpr crop)
- skill diff.mjs 加 --crop 仅比矩形区域(全局工具,不在本 repo)
- 验证:错位版 golden 顶栏带 9.48% > 4% 报红;修正版 3.16% 通过

仍存盲区:弹出态(用户菜单/dropdown/dialog)不进静态 golden,需单独补浮层 golden。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 18:21:15 +08:00
wangjia f9668848b6 fix(client): 外壳两处对齐修正(顶栏右组靠右 + 用户菜单与侧栏等宽)
- 顶栏:左组(品牌+门店)改 Expanded 占满,主题器+通知铃挤到最右;
  原 Flexible(flex1) 与 Spacer(flex1) 平分剩余空间导致右组浮在中右
- 侧栏底部用户菜单:constraints 固定 218 宽 + offset 左对齐侧栏左缘,与侧栏等宽
- 状态栏操作员显示 realName(王经理)而非 username

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 18:13:16 +08:00
wangjia 1b43dfc75d refactor(client): Phase 1 照原型重建 app 外壳(顶栏两级品牌 + 主题器 + 通知铃 + 分组侧栏 + 状态栏)
照 shell.js/statusbar.js/atoms.css 把外壳从「旧单品牌+换色」彻底重建为原型样式:
- 顶栏:岩美酒库(线描山形 mark CustomPaint,软件品牌) │分隔│ 鼎晟酒行(门店字标+店名);
  右侧 ThemePickerPill(主题器,从系统设置迁来,A/B/C 切换) + NotificationBell(通知)
- 侧栏(218w):分组 单据/经营/系统(nav-label) + nav(active 高亮) + 底部 side-user(头像/姓名/店·角色→菜单)
- 状态栏:AppStatusBar(原型 .statusbar,AppChrome 主题无关色):店号/操作员/登录/当前(走字) · 连接/版本/授权
- 保留全部既有行为:更新/强制更新/授权横幅与弹窗、离线横幅、心跳、apiMessage、窄屏 Drawer
- 新增 widgets/theme_picker_pill.dart · notification_bell.dart · app_status_bar.dart
- golden:加载真实 MaterialIcons 字体(消图标豆腐块,全 golden 受益);
  app_shell golden 用 9 分支+冻结时钟(可测试缝)确定化,对齐原型数据(鼎晟酒行/王经理/库存激活)
- fidelity:外壳 vs 原型 diff 3.5% ≤ 阈,montage 目检 chrome 与原型一致

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 18:02:38 +08:00
wangjia ffc71c8894 feat(tools): Phase 0.3 ds-compare 注册表驱动(每屏+外壳都跟原型比)
- 抽出 tools/screens.mjs 屏注册表单一真源,fidelity 与 ds-compare 共用
- ds-compare 改为遍历注册表(含 shell 外壳项),默认全屏×三主题产并排目检图;
  保留 --html/--prefix 临时单屏;统一注入 NotoSansSC 与 golden 同字体
- 满足规则2:每一屏 + 外壳都需跟原型对比

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 17:47:07 +08:00
wangjia d3fab1857d feat(client): Phase 0.4 codegen 补主题无关 chrome 色(AppChrome)
外壳要用的状态栏/品牌/遮罩/Toast 色在 tokens.css :root,固定不随 A/B/C 主题切换,
原先没进 Dart token。扩展 gen_tokens.mjs 从 :root 生成 AppChrome 常量类
(statusbar-* / brand-* / scrim / hero-glass / toast-bg),外壳直接引用、禁硬编码。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 17:45:31 +08:00
wangjia 059122a5dc feat(tools): Phase 0.2 fidelity 保真闸(Flutter golden vs 原型,替掉 golden 自比)
- tools/fidelity.mjs:逐屏注册表 → 注入统一字体截原型基准 → 与 Flutter golden
  pixelmatch diff,超逐屏校准阈值即红。这才是真·跟原型比的保真证据。
- design-distill skill shoot-prototype.mjs 加 --inject-css(注入字体覆盖 --font)
- 验证:inventory 当前屏 vs 原型 diff=28.4% > 阈,立刻抓到「缺整个外壳」——
  正是旧 golden 自比(永远 0%)发现不了的结构性差异
- 原型基准入库 client/test/golden/proto/;差异图 design/_fidelity/ 进 gitignore

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 17:43:18 +08:00
wangjia 55c23e869e refactor(client): Phase 0.1 统一中文字体地基(golden 消豆腐块,可与原型保真比对)
- 打包 Noto Sans SC(pubspec fonts:),ThemeData.fontFamily 全平台统一
- golden_harness 用 FontLoader 注入 ttf + withGoldenFont,golden 渲染真实中文
- 修复 data_table_card 根因:DefaultTextStyle → .merge(替换式会吞掉继承字体,
  导致所有表格屏表头/单元格渲染豆腐块);顺手 hover 硬编码色 → context.tokens.rowHover
- 全部 golden 用新字体重生成;test/golden/failures/ 加入 gitignore

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 17:39:23 +08:00
wangjia e0a3081d9f test(client): 更新登录 golden(注册链接改应用内「立即注册」)
登录页注册入口文案/行为变更(前往官网→应用内 /register)后重生基准。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 16:36:24 +08:00
wangjia d9f0d3feca feat(client): 应用内注册新门店(两栏品牌页 + 表单)
- 新增 RegisterScreen(左品牌面板 3 步引导 + 右表单:门店名/电话/地址/
  管理员/账号/密码/确认 + 同意条款),还原原型两栏设计,全 token 化
- AuthRepository.register → POST /api/v1/register(后端已有),成功弹门店编号
  引导去登录
- 路由加 /register(公开路由);登录页「前往官网注册」→ 应用内「立即注册」
- 整屏 golden ×三主题入回归闸
(购买流/通知中心按指示暂不做)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 16:34:48 +08:00
wangjia 36f2fe1526 feat(client): 基础数据加商品档案全量表 + 原型 5 tab 置前
非破坏式向原型靠拢:
- 新增「商品档案」tab(productListProvider 全量商品表:商品 name+code/系列/规格/
  分类/单位/默认成本价/查看,行点进详情),原型头牌功能(此前基础数据页只管字典)
- tab 重排:原型 5 个(商品档案/商品介绍/系列/规格/香型)置前;描述文档→商品介绍
- 保留 商品名称/产地/保质期/储存/仓库 字典 tab 在后(不删管理入口、不孤立数据)
整屏 golden ×三主题入回归闸。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 16:22:47 +08:00
wangjia 8e01e7afe7 feat(client): 商品详情加价格历史卡(接 /products/:id/price-history)
repo.getPriceHistory → 详情异步加载,新增价格历史卡:date + 进价,按相邻点
算涨跌(绿涨/红跌箭头)。至此商品详情 100% 对齐原型富数据版
(KPI + 各仓库分布 + 价格历史 + 近期流水)。golden 三主题已含该卡。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 16:09:43 +08:00
wangjia deb5e503f6 feat(backend): 商品价格历史接口(从入库单价派生)
GET /products/:id/price-history:从已审核入库单明细 unit_price 按 order_date
倒序派生进价变更点,去相邻重复价,守多租户 shop_id(零额外表)。
新增测试 PriceHistory(含草稿排除 + 倒序断言)。go build/vet/test 全过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 16:06:56 +08:00
wangjia 38e2ea1c6c feat(client): 商品基础数据加香型字典 tab(接后端 categories CRUD)
新增 ProductCategoryOption 模型 + repo(list/create/update/deleteCategory)+
provider(productCategoryListProvider),基础数据页加「香型」tab(增删改查、
搜索、导出,仅名称字段)。接通后端 /product-options/categories。
(原型 5-tab 整合是更大 IA 任务,本次先把香型管理补齐可用。)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 15:42:23 +08:00
wangjia 355ac0ebc3 feat(client): 商品详情升级富数据版(KPI + 仓库分布 + 流水)
接后端新能力:listInventory 加 productId 透传;详情异步拉本商品库存+流水(失败
静默不阻塞主数据),渲染原型富数据三件套:
- 3 KPI 卡(当前库存 / 库存货值=库存×进价 / 近30天出库=出库流水30天聚合)
- 各仓库库存分布(按仓库分组 数量+货值)
- 近期流水(StatusPill 入/出 + 增减量,最近 8 条)
价格历史待后端第二步。整屏 golden ×三主题入回归闸。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 15:34:57 +08:00
wangjia 90ab22bf0e feat(backend): 库存按商品过滤 + 香型(分类)字典 CRUD
商品域富数据/重组所需后端:
- GET /inventory 加 product_id 过滤 → 解锁商品详情「当前库存/货值/各仓库分布」
  (配合已支持 product_id 的 /inventory/logs,详情可拼出大半富数据)
- 新增 /product-options/categories 香型字典 CRUD(ProductCategory 模型已存在,
  补管理接口)→ 商品列表 5-tab 重组的最后一块字典
均守多租户 shop_id;新增 3 个测试(FilterByProduct/CategoryCRUD/CategoryIsolation)。
go build/vet/test 全过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 15:07:49 +08:00
wangjia 1b8bf596c5 test(client): app 外壳(顶栏/侧栏/状态栏)整壳 golden ×三主题
外壳 chrome 是最显眼的主题面,但各屏 golden 都不含它。本 golden 用
MaterialApp.router + StatefulNavigationShell 渲染整壳(覆盖 auth/shop/license/
update/connectivity/heartbeat,跳过联网首检与心跳避免 Timer 泄漏),锁住
顶栏+侧栏+状态栏随 A/B/C 换色入回归闸。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 14:38:55 +08:00
wangjia f47f6edcd3 feat(client): 入库/出库录单表单(旗舰屏)斑马行 token 化 + 整屏 golden
录单明细网格斑马行 Colors.white/FFFAFAFA → surface/bg(修暗色破绽,两表单
现 0 硬编码色残留);入库+出库录单表单整屏 golden ×三主题(桌面+移动)入回归闸,
锁住 单据信息卡 + 可编辑明细网格 + 底栏。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 14:33:46 +08:00
wangjia b10b450db0 docs(design): CONTRACT 全量清扫收尾状态(登录/盘点/商品/公开页/Web)
记录:登录+盘点 token 化;商品列表/详情 token 净(富数据待后端);
公开页有意独立设计保持现状;Web 营销站 color.css 已对齐品牌。
应用内注册/购买流归 Phase 6 新建功能,非既有屏重建范围。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 14:06:02 +08:00
wangjia d3134f633d feat(client): 登录屏离线提示条 token 化 + 整屏 golden ×三主题
服务器不可达提示条 FFF8E1/F57F17/5D4037 → warnBg/warn;
品牌 hero + 表单整屏 golden 入回归闸(覆盖联网首检避免 Timer 泄漏)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 14:02:58 +08:00
wangjia abd1058bcb refactor(client): 盘点屏斑马行 token 化(修暗色破绽)
盘点明细行无差异时的斑马底 Colors.white/FFFAFAFA → surface/bg,
深色主题 B 下不再泛白。该屏现 0 硬编码色残留。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:59:38 +08:00
wangjia c746c5071a docs(design): CONTRACT 记录入/出库/财务/设备/设置/关于 验收行
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:49:08 +08:00
wangjia 85052fd8f7 test(client): 关于我们整屏 golden ×三主题(桌面+移动)
该屏正文已全 token 化,加 golden 锁住版本/帮助/关于卡片随主题换色入回归闸
(覆盖更新检查器避免后台 Timer 泄漏)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:48:40 +08:00
wangjia a8f5364aea feat(client): 系统设置角色徽章 → StatusPill + 系统参数 Tab golden
- _RoleBadge(超管/管理员/操作员/只读)硬编码 FCE4EC/E3F2FD/E8F5E9/F5F5F5
  → StatusPill(danger/primary/success/muted + 对应软底,走 token)
- 系统参数 Tab golden ×三主题:锁住外观主题选择器三色板微缩预览 + 参数卡
- 残留 0xFF0F3057 为品牌标识色(--brand-deep,主题无关),保留

analyze 0 error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:43:50 +08:00
wangjia 2d28b067d8 feat(client): 设备管理屏在线状态徽章 → StatusPill + golden
onlineBadge(在线/离线 圆点文字)→ StatusPill(圆点软底 pill,
success/okSoft 与 muted/infoSoft);整屏 golden ×三主题(桌面+移动)入回归闸。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:41:07 +08:00
wangjia ae447f61e3 feat(client): 财务屏设计语言重建(KpiCard + StatusPill 徽章 + token 清扫)
- 3 张汇总卡 _SummaryCard → KpiCard(合计/未结清/已结清,info/warn/ok)
- _StatusBadge / _TypeBadge → StatusPill(结清状态 + 应收/应付/收款/付款,
  硬编码 E3F2FD/FFEBEE/E8F5E9/FFF3E0/F5F5F5 全清,走 token)
- _OfflineBanner 离线条 FFF8E1/F57F17 → warnBg/warn
- 整屏 golden ×三主题(桌面+移动)入回归闸;该屏 0 硬编码色残留

analyze 0 error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:38:41 +08:00
wangjia 539852c7b3 feat(client): 出库列表设计语言重建(副标 + 共享 StatusPill + golden)
副标「共 N 笔出库单」+ 详情弹窗斑马行 token 化;复用已升级的共享
StatusBadge→StatusPill;整屏 golden ×三主题(桌面+移动)入回归闸。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:32:28 +08:00
wangjia 99a2b533e6 feat(client): 入库列表 + 共享订单状态徽章设计语言重建
- StatusBadge → StatusPill(草稿/待审核/已审核/已拒绝 圆点软底,色走 token:
  infoSoft/warnBg/successBg/dangerBg)——入库/出库列表共享,一处升级两屏受益
- 入库列表副标「共 N 笔入库单」+ 详情弹窗斑马行/灰字 token 化(修暗色破绽)
- 整屏 golden ×三主题(桌面+移动)入回归闸

analyze 0 error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:29:56 +08:00
wangjia 7f92a51055 docs(design): CONTRACT 加往来单位验收行 + 记录富数据缺口策略
往来单位桌面/移动验收勾全;记录「原型富数据 vs 现有后端」缺口与
本阶段「设计语言升级、富数据留二期」策略。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:05:47 +08:00
wangjia f994fbd031 feat(client): 往来单位屏设计语言重建(副标/状态徽章/两行名称/响应式 toolbar)
- 副标「共 N 个供应商/客户」(还原 .head .sub)
- 状态 → StatusPill(启用绿/停用灰,新 _PartnerStatusPill),桌面+移动一致
- 编码+名称合并两行(name 加粗 + code 等宽 muted)
- toolbar 响应式(窄屏搜索独占一行 + 操作行)+ token 间距,修预存窄屏溢出
- 整屏 golden ×三主题(桌面+移动)入回归闸
暂缓(数据缺口/有意偏差):应收/应付列(Partner 模型无该字段)、
类型 chips(现保留 供应商/客户 两 Tab)。

analyze 0 error · flutter test +181(往来桌面/移动各 3 golden)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 13:05:12 +08:00
wangjia 8410f942f2 docs(design): CONTRACT 库存列表桌面+移动验收勾全(首屏闭环)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 12:11:35 +08:00
wangjia 1632f5f1d9 feat(client): 库存列表收尾——副标/toolbar 间距/移动端 golden
- 副标(还原原型 .head .sub):KPI 上方「共 N 个商品 · 数据实时」(千分位)
- toolbar 间距 token 化:搜索框对齐原型 240,间隔走 AppDims.sp2/sp3
- 移动端 golden:窄屏(390)卡片流路径 ×三主题入回归闸
- 顺带修 DataTableCard 分页条窄屏横向溢出(mobile 隐藏每页选择器,
  golden 闸抓出的预存 bug)

analyze 0 error · flutter test +175(库存桌面/移动各 3 golden 全过)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 12:11:17 +08:00
wangjia e1a4fec22b chore: 设计系统闸改本地 pre-commit(撤 CI)
撤 .gitea/workflows/ds-gate.yml,改本地钩子:
- scripts/hooks/pre-commit:提交动了 .superpowers/prototype/ 才跑 check-ds.mjs
  (12 道),违规即 exit 1 阻止;--no-verify 可跳过。
- scripts/hooks/install.sh:每台机器跑一次,装 worktree-aware shim 到 git hooks。
原型仍入库(上一提交),仅执行处从 CI 移到本地。已测:违规阻止/无关跳过均正确。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 11:33:12 +08:00
wangjia f5bdc3aaea ci: 原型设计系统守门闸入库 + 挂 CI(check-ds.mjs · 12 道)
.superpowers/prototype/(设计像素真源 + check-ds.mjs)移出 gitignore 入库
(brainstorm/sdd 仍忽略);新增 .gitea/workflows/ds-gate.yml:改原型即跑
node check-ds.mjs(颜色/排版/层级/圆角/字体/图标走单一真源、组件登记未 fork、
断点规范,12 道全过才放行)。runs-on mac(已有 node)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 11:24:55 +08:00
wangjia db9bd15ace docs(design): CONTRACT 记录验收双闸就位 + 库存列表验收状态
块4 改为双闸(保真 ds-compare 目检 / 回归 golden 自比),登记基建就位与
库存列表当前进度(KPI/徽章/列已还原,header/toolbar 待收尾)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 11:10:43 +08:00
wangjia 019d73cfc5 build(tools): ds-compare.mjs 还原保真目检编排 + gitignore 对比图
一键流程:对某屏按 A/B/C 截原型基准 + 与 Flutter golden 用 montage 并排
→ design/_compare/<prefix>_<theme>.png 人工目检。封装 design-distill skill 的
shoot-prototype + montage。对比图可重生,已 gitignore。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 11:10:12 +08:00
wangjia af1ed9aeff test(client): 整屏 golden 还原闸 + 可复用 golden 骨架(基建)
test/support/golden_harness.dart:pumpGolden(viewport=physical÷dpr/给足高度/
provider 覆盖)+ goldenAcrossThemes(A/B/C 三主题组)。
test/golden/inventory_list_golden_test.dart:库存列表整屏 × 三主题 golden
(fake AsyncNotifier 喂 canned 数据 + isReadonly 覆盖 + SP mock),入库作回归闸。
保真目检:shoot 原型 + montage 与 goldens 并排(见 design-distill flutter-golden.md)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 11:08:44 +08:00
wangjia a719840ede feat(client): 库存表列按原型重排 + 商品列 name/code 合并两行
列序照原型:商品(name+code 两行) · 规格 · 系列 · 批次 · 单价 · 生产日期 ·
入库时间 · 供应商 · 仓库 · 备注 · 状态 · 操作。遵项目铁律跳过「库存数量/成本价」
(装箱数脏数据 + 进价敏感),仓库/备注保留为可隐藏列。新增 _productCell
(name 加粗可点进详情 + code 等宽 muted,fsXs 走 AppDims)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 10:05:00 +08:00
wangjia 8cfcb190b9 test(client): KPI 卡三主题 golden(design-distill 阶段4 Flutter 侧首个还原闸)
test/theme/kpi_card_golden_test.dart:4 张 KPI 卡 × A/B/C 三主题 golden,
产出 goldens/kpi_strip_{a,b,c}.png。验证 KpiCard 还原原型 .kpi 结构/色调
(icon 芯片 info/blue/warn/alert 分档着色、alert 值取 accent、软底随主题换)。
更新基准:flutter test --update-goldens test/theme/kpi_card_golden_test.dart

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 07:01:19 +08:00
wangjia 60483ae483 feat(client): 库存列表 KPI 卡 + 状态徽章按原型重建(阶段3 首切)
新增可复用 widgets/kpi_card.dart:KpiCard(还原原型 .kpi/.ic,6 档色调
info/ok/blue/alert/warn/danger,token+AppDims 驱动)+ StatusPill(.badge
圆点软底)。库存查询页 3 张旧 _SummaryCard → 4 张 KPI 卡(商品总数/在库数量/
库存预警/缺货,商品总数可点清筛选)。状态徽章 正常/库存不足→在售/预警,
硬编码 FFEBEE/FFF3E0/E8F5E9 → dangerBg/warnBg/okSoft;出入库方向徽章同迁。
该屏 0 硬编码色残留,三主题随 token 换色。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSKEiHsvauyxYUW2itzUXX
2026-06-25 06:56:45 +08:00