Commit Graph

552 Commits

Author SHA1 Message Date
wangjia 47d6490bf2 feat(backend): 公开页对齐设计系统真源 + 三主题支持
- 弃用手编宣纸黄配色,变量名与色值逐字取自 prototype/tokens.css
- 支持 a 经典蓝浅 / b 琥珀深 / c 酒窖暖浅 三主题:默认 a,
  首访跟随系统深色自动切 b,右上 ◐ 钮循环切换并记忆(localStorage)
- 结构保留:画框图集+印章、全屏灯箱、分节卡、页脚署名/ICP

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:48:10 +08:00
wangjia 8000f00e9e feat(backend): 商品公开页图集升级——滑动指示点 + 点击全屏灯箱
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:41:24 +08:00
wangjia d8f7fd903e fix(backend): 公开页页脚合一行——技术支持:岩美科技 · 京ICP备2026039814号
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:37:58 +08:00
wangjia db9afb952c fix(backend): 商品公开页移除「在 App 中查看」链接
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:35:44 +08:00
wangjia f3efda3691 fix(backend): 公开页去平台背书措辞——页脚改 Powered by 岩美科技
题签只留「岩美酒库」,页脚「正品溯源」改为中性技术署名;
正品类表述仅保留在商品介绍等门店内容语境中。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:29:19 +08:00
wangjia d19e88e3f4 feat(backend): 公开页视觉改版——酒背标美学 + 页脚品牌链接/ICP + 图片区常驻
- 宣纸暖白底 × 宋体衬线题名 × 酒红「正品」印章,信息行点线引导(酒单式)
- 图片区永远存在:无图时显示酒瓶线稿占位「实物图整理中」
- 页脚:岩美酒库链接(jiu.51yanmei.com)+ 京ICP备2026039814号(链工信部)
- 仍零 JS、零外部资源,整页 ~9KB;入场动效纯 CSS,reduced-motion 降级

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:27:17 +08:00
wangjia dbea2dc11a chore: release server-v1.1.8
Design Source Checks / design-source (push) Successful in 17s
Deploy Server / release-deploy-server (push) Successful in 56s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
server-v1.1.8
2026-07-07 11:06:52 +08:00
wangjia 58a0bbca1b docs: 公开页提速设计方案(压缩A′ + 公开页去Flutter化)+ 登记索引
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:02:21 +08:00
wangjia 451947c8d1 devops: nginx 运行时 gzip + /app 协商缓存 + /shop SSR 页边缘闸
- gzip on(js/wasm/json/css,图片刻意不压):Web 版首包 12.5MB → ~4.4MB
- /app/ 加 Cache-Control no-cache(etag 304 协商,产物无 hash 不做长缓存)
- 新增 /shop/ location:与 shops API 同参数(jiu_shoplist 2r/s + UA 拦截 + limit_conn 10)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:02:21 +08:00
wangjia 9ea38a9b56 feat(backend): 公开页 SSR 化——商品页/店铺页后端直出,顾客动线零 Flutter
- /product/:public_id 从「Flutter 壳注入 OG」改为 go:embed 模板直出轻量页
  (~5KB vs 12.5MB 首包,3Mbps 带宽下 30s → <0.5s),OG 分享卡片行为不变
- 新增 /shop/:shop_code 店铺公开页短链:搜索(?q=)+分页(?page=),商品卡互跳
- 数据装配与公开 API 共用(loadPublicProduct / queryShopProducts),口径零漂移
- 图片异步拉取:首图 decoding=async、其余 loading=lazy
- 设计:docs/design/public-page-speedup.html

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-07 11:02:10 +08:00
wangjia 656a7459d8 chore: release client-v1.1.5
Design Source Checks / design-source (push) Successful in 16s
Deploy Client / build-client-web (push) Successful in 52s
Deploy Client / build-windows (push) Successful in 2m9s
Deploy Client / build-macos (push) Successful in 3m0s
Deploy Client / build-android (push) Successful in 1m47s
Deploy Client / build-ios (push) Successful in 3m23s
Deploy Client / release-deploy-client (push) Successful in 1m38s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
client-v1.1.5
2026-07-06 08:34:08 +08:00
wangjia 31bf645c30 chore: release server-v1.1.7
Design Source Checks / design-source (push) Successful in 16s
Deploy Server / release-deploy-server (push) Successful in 1m3s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
server-v1.1.7
2026-07-06 08:33:17 +08:00
wangjia 3573f015c3 fix(client): 出入库录单 golden 随日期漂移——表单支持钉死单据日期
根因:表单 _orderDate 默认 DateTime.now(),golden 07-04 录制后每天必挂
(整屏 diff 只有日期格一个数字)。表单加 initialDate 测试注入口,
golden 测试钉死 2026-07-04,基准图零重录、永不随日期漂移。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-06 08:11:26 +08:00
wangjia d9f1f6956e feat(client): 库存卡片显示单价(进价)+ 成本按角色隐藏
- 手机库存卡副行追加进价(编号 · 规格 · ¥xxx),仅管理员可见
- 宽屏成本价/总价列、货值 KPI、商品抽屉成本行对非管理员隐藏(isAdminProvider)
- m-inventory 原型同步 + 移动 golden ×6 重录(管理员形态基准)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-06 08:11:15 +08:00
wangjia 75d0accb14 feat(backend): 库存成本仅管理员可见——List 抹空 unit_price、Summary 抹零货值
与出库 stripStockOutCost 同口径:operator/readonly 服务端兜底抹除,
防抓包看到成本;sale_price 与数量等字段不受影响。CLAUDE.md 口径同步。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
2026-07-06 08:11:05 +08:00
wangjia 3fc0ca5f0c chore: release server-v1.1.6
Design Source Checks / design-source (push) Successful in 16s
Deploy Server / release-deploy-server (push) Successful in 58s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
server-v1.1.6
2026-07-05 10:44:40 +08:00
wangjia 4966892030 docs: DDoS/爬取洪峰应急 runbook + 安全三件套 plan 阅读版(todo #1)
拍板:不预购高防/CDN,接受极端容量攻击黑洞期风险;应急走 runbook
(判定→CC 处置→高防/CDN 切换→黑洞预案,DNS TTL 平时保持 ≤600s)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:42:23 +08:00
wangjia a49a962161 devops: 边缘层加固——nginx limit_conn/UA 拦截/防盗链/下载限速 + jiu_redis 容器(todo #1/#2/#3)
nginx:店铺列表专属 2r/s zone、公开路径 limit_conn、抓取库/空 UA 403(OG 页
不拦空 UA 防误杀社交爬虫)、/images 防盗链(none 放行微信 webview)、
/downloads 限并发+限速。compose 新增 jiu_redis(64mb noeviction 无持久化,
仅回环);env 模板加 REDIS_ADDR。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:42:23 +08:00
wangjia 290054dc8c feat(backend): 公开接口反爬轻量版——per-IP 日配额 + 列表收紧(todo #3)
DailyQuota 二级闸(单品 1000/日、店铺列表 300/日,0=关;出错放行不误伤);
店铺列表 page_size 上限 50→20(客户端固定传 20 无破坏);公开响应敏感字段
(cost/purchase_price/profit)零暴露回归测试。
明确不做:签名链接(QR 已印刷+UUIDv4 不可枚举)、滑块(杀零门槛分享)、登录墙。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:42:23 +08:00
wangjia 3c687e5e0b feat(backend): 限流/登录失败锁状态外置 Redis(todo #2)
新包 internal/ratelimit:内存/redis(GCRA+Lua) 双实现 + 出错逐调用降级内存
(fail-open 到内存不 fail-closed)。REDIS_ADDR 空=内存模式,行为与既往一致;
配置后跨重启保状态、支持多实例。miniredis 全覆盖测试,零真实外部依赖。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:42:23 +08:00
wangjia e850a1987c chore(client): 客服邮箱全局统一为 support@51yanmei.com(单源 store_compliance)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 09:19:32 +08:00
wangjia fd45bece17 fix(scripts): local_test.sh 变量后紧跟全角括号致 unbound variable,加花括号
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 09:07:50 +08:00
wangjia b740cc6edf feat(client): iOS 上架合规——首启隐私同意弹窗 + 注销账号入口
个保法/审核 5.1.1:移动端首启全屏隐私同意(链接隐私政策/用户协议,
同意持久化;不同意 Android 退出、iOS 留提示);我的页 iOS 形态新增
「注销账号」(sheet 说明 + 预填 mailto 至 support@51yanmei.com)。
关于页隐私政策/服务条款链接已有,桌面/Web 零改动。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 08:56:26 +08:00
wangjia dddf402d92 feat(client): iOS App Store 合规——授权页隐藏外部购买 UI,补中性联系客服卡
苹果 3.1.1:iOS 包不渲染在线购买卡与套餐价格链接;兑换券保留(3.1.3(b)),
新增「联系客服」卡(mailto:support@51yanmei.com,无购买引导字样)。
其余平台零改动;开关 hideExternalPurchaseUi 供设备上限弹窗等复用。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 07:27:31 +08:00
wangjia faaeee0bfe feat(docs): 收银台原型(扫码/手机拉起/三态)+ 客服邮箱切换 support@51yanmei.com
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 06:49:23 +08:00
wangjia 6e10048e60 chore: release client-v1.1.4
Design Source Checks / design-source (push) Successful in 18s
Deploy Client / build-client-web (push) Successful in 51s
Deploy Client / build-windows (push) Successful in 2m7s
Deploy Client / build-macos (push) Successful in 2m43s
Deploy Client / build-android (push) Successful in 1m46s
Deploy Client / build-ios (push) Successful in 3m9s
Deploy Client / release-deploy-client (push) Successful in 1m32s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
client-v1.1.4
2026-07-05 01:13:19 +08:00
wangjia 533f36da00 chore: release client-v1.2.0
Design Source Checks / design-source (push) Successful in 20s
Deploy Client / build-client-web (push) Successful in 54s
Deploy Client / build-windows (push) Successful in 2m8s
Deploy Client / build-macos (push) Successful in 2m41s
Deploy Client / build-android (push) Waiting to run
Deploy Client / build-ios (push) Blocked by required conditions
Deploy Client / release-deploy-client (push) Blocked by required conditions
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 01:08:59 +08:00
wangjia c49ee3b1df feat(client): 库存抽屉打印标签 + 修本地构建版本号不对
- 商品编辑抽屉头部「预览」旁加「打印标签」(同入库管理:QR+品牌型号版本+
  门店信息 → LabelPreviewDialog;移动端无打印不渲染)
- 修版本号 bug:appVersionProvider/更新检查改为优先 APP_VERSION dart-define
  (本地与 iOS 手工构建不改 pubspec,PackageInfo 恒为旧值 1.0.52,App 内
  显示错且误弹更新横幅);版本比较容忍 -dev/+build 后缀(每段取前导数字)
- local_test.sh:版本标记 -dev(如 v1.1.4-dev)明确区分本地包;新增 --ios
  模式(开发签名构建 + devicectl 装 USB iPhone),双端同一版本注入链路

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 23:57:37 +08:00
wangjia c9217601a1 feat(client): 全列表下拉刷新 + 库存移动工具行移除
- DsTable 窄屏卡片流支持 onRefresh(RefreshIndicator,空态也可下拉)——
  等价桌面工具栏「刷新」;库存/入库/出库/往来/财务流水/用户/基础数据
  全 tab 接线(基础数据下拉一并重拉五个 tab 数据源)
- 库存移动端「盘点/表格视图/导出/列设置/刷新」工具行移除(2026-07-04
  拍板:刷新改下拉手势、盘点入口在「我的」、其余桌面专属),
  库存移动 golden 随更新

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 23:52:06 +08:00
wangjia 99ceaa87bb fix(client): 通知铃菜单贴顶栏弹出(收回 40px 悬空偏移,修手机端漂移)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 23:05:34 +08:00
wangjia 86611dc9ee feat(client): 在线购买完成后选择页默认落到 高级版·年付
支付成功即把套餐 tab 置为高级版、周期置为年付(特惠单同时本地置灰
「已享受」)——继续购买/复购时直接主推年付高级档

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 22:46:36 +08:00
wangjia 59d56d7e30 chore: release site-v1.1.5
Design Source Checks / design-source (push) Successful in 17s
Deploy Site / release-deploy-site (push) Successful in 27s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
site-v1.1.5
2026-07-04 22:00:49 +08:00
wangjia c6d95edf12 chore: release server-v1.1.5
Deploy Server / release-deploy-server (push) Successful in 54s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
server-v1.1.5
2026-07-04 22:00:49 +08:00
wangjia a773a33779 feat: App→网页免登录(一次性换票 SSO)——移动/桌面点链接直达已登录官网
- backend:POST /auth/web-ticket(需登录,签 60s 单次票据,每用户限频)+
  POST /auth/web-ticket/exchange(公开,原子即焚兑换正常登录态,响应同
  /auth/login 另带 shop_code);web_tickets 新表 + user_sessions.kind 列
  (sso 会话:web 平台、refresh 12h 硬到期、不占设备并发配额、设备管理可见
  可踢);清理任务顺带清过期票据;schema.sql/AutoMigrate/testutil 同步
- web:/sso 落地页——兑票写入与 Web 版共享的 localStorage 后跳 redirect;
  redirect 白名单只收本站相对路径(防 open redirect),票据即时从地址栏抹除
- client:launchAuthedWebPath(ref, path) 封装(签票→拼 /sso URL→launchUrl,
  失败降级未登录直开;桌面/移动同一套);授权面板「查看套餐价格」接入

test(backend): web_ticket_test 三用例(兑换+续期/单次即焚/过期拒绝/
sso 不占配额双向验证)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 21:30:08 +08:00
wangjia 11413df3db fix(client): 底部 sheet 打开时横滑改为关 sheet,不再切 tab
- showMSheet 登记「打开中 sheet」关闭器栈(任何方式关闭都注销)
- 壳层横滑手势先查栈:有 sheet 开着 → 从左往右滑关顶层 sheet,
  任何方向都不切 tab / 不退二级屏;无 sheet 才走原 tab 切换/返回逻辑

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 20:55:31 +08:00
wangjia f9d5bc79c7 fix(client): 关于页「检查更新」按钮与反馈按钮同规格对齐(38h 通栏)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 20:48:15 +08:00
wangjia 02cffcb9ba feat(client): 切页滑动过渡 + 二级屏返回手势方向修正 + 授权三格横排
- 窄屏切页加方向感知滑入过渡(240ms easeOutCubic + 渐显):tab 间按左右
  次序、进二级屏从右滑入、返回从左滑入;桌面无动画。控制器在 initState
  创建(惰性 late 到 dispose 才求值会在已卸载树上找 Ticker 崩溃)
- 二级屏返回手势方向修正:从左往右滑=退出(iOS 返回习惯),向左滑无响应
- 授权信息三格(状态/到期日/剩余天数)窄屏改横排:间距收窄 + FittedBox
  缩放值文本防溢出,桌面不变

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 20:39:31 +08:00
wangjia 9efd1177b7 feat(client): 移动端横滑手势——tab 根左右滑切 tab、二级屏左滑退出
- tab 根(库存/入库/出库/财务/我的):左滑下一个 tab、右滑上一个(不循环)
- 二级屏:左滑返回(同顶栏返回箭头语义),右滑无响应
- 仅窄屏生效;内容区横向滚动(分段 tab/表格横滚)在手势竞技场优先,不冲突

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 20:31:33 +08:00
wangjia 980e38e020 feat(client): 库存/出入库移动卡片与详情 sheet 逐一对齐原型结构
- 新增 MCard(原型 .m-card 双栏:mc-main 标题+副行 mono | mc-right 徽章行+
  金额 mono | › | mc-foot ⓘ脚注)+ DsIconBadge(.badge.ico 22px 纯图标)/
  DsTextIconBadge(.badge.bi 图标+文字) + statusToneOf 状态词配色表——
  替换原 MobileListCard「标签:值」布局与各屏本地 _icoBadge/_statusColors
- 出入库卡:单号 + 供应商/客户·N 项 + 状态/退单/待定价图标徽章 + 合计金额 +
  日期·经手人·审核 脚注;库存卡:品名 + 编码·规格 + 状态徽章 + 数量(缺货红/
  预警黄);移动卡不再有行内操作(对齐原型,操作统一在详情 sheet;打标签=
  打印,移动端裁剪)
- DsTable 窄屏卡片流去外层大卡容器(卡直接铺页面底色,对齐原型 m-scroll)——
  往来/基础数据等全部卡片流屏同步受益
- 出入库详情窄屏改 sheet 专属布局(原型 openOrder):drow 字段行 + 明细
  pe-card(头行 图标+「明细 · N 项」+ 行=品名+系列·×数量 | 金额/待定价徽章)+
  合计 drow + 等分按钮行(无组标签);桌面右滑抽屉布局不变
- 相关移动 golden 全量重生成(出入库/库存/往来/基础数据 ×3 主题),
  桌面 golden 零漂移;283 测试全绿

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:30:40 +08:00
wangjia 145bf06ff8 devops: production.env 同步通道修复——render-env 切 ali + 发版漂移告警
2026-07-04 二维码 IP 事故复盘:env 不随发版同步(by design,密钥走
render-env 手动通道),但 render-env 还停在 EC2 时代且割接后没跑过,
线上 env 的 STORAGE_*/CORS 一直是割接临时 IP。三处修复:

- deploy/render-env.sh:目标改 ssh 别名 ali(可 JIU_DEPLOY_SSH 覆盖)、
  SECRET_KEYS 补 PAY_SECRET(旧模板缺此行,直接 deploy 会删掉线上支付
  密钥)、健康检查改 :8081、覆盖前先备份线上 env
- deploy/production.env.template:SERVER_PORT 8080→8081(对齐 ali nginx
  反代口径)、补 PAY_SECRET 占位
- scripts/ci/deploy-server.sh(ali 分支):部署后比对模板与线上 env 的
  非密钥项,漂移只告警不覆盖——手改线上配置不再长期无人发现

线上 env 已手工修正(STORAGE_BASE_URL/STORAGE_PUBLIC_URL/SERVER_CORS_ORIGIN
→ https://jiu.51yanmei.com,退役 LICENSE_* 三行清除,改前有备份)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 19:20:53 +08:00
wangjia cd477ce81a fix(client): 抽屉内操作不再收抽屉(原地刷新)+ 日期输入框垂直居中
- 出入库详情抽屉:通过/拒绝/撤回/提交/结清/退单/确认定价/打印 全部不收抽屉,
  操作完成后原地重拉单据刷新内容(StatefulBuilder+refresh);仅 遮罩/X/
  修改·删除(离开语义)关闭——对齐拍板「点抽屉外才收回」
- 往来抽屉「编辑」、财务往来抽屉「登记收款/付款」(完成后流水原地刷新)、
  商品编辑抽屉「保存」同规则;「取消」保持关闭语义
- 日期组件输入框 forceStrutHeight 锁行盒:修等宽字体 ascent/descent 不对称
  导致的文字垂直偏移

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 18:09:21 +08:00
wangjia fb236018f3 refactor(client): 日期选择统一为扁平组件——输入框+滚轮同宽居中入面板,桌面/移动全覆盖
- wheel_date_picker.dart 重构为统一组件:单日期 showDsDateDropdown(面板=
  可输入框+三列滚轮+今天/确定)、范围 showDateRangeDropdown(起始|结束双窗格
  并排+共用底栏);桌面锚定下拉(透明遮罩不冻结窗口)、窄屏底部 sheet 同内容
  (范围纵排)——同一套窗格两端复用
- 扁平化:输入框与滚轮同宽 248、文字水平垂直居中(mono)、去掉全部阴影/立体
  效果(滚轮外框仅 1px 边框,中心高亮带去描边)
- DsDateCell(录单日期格)与 DatePickerField(登记收支)改为触发器:点选/
  回车打开统一面板,键入在面板内完成;出库工具栏时间 chip 补切到新组件
- 旧 showWheelDatePicker/showWheelDateRange 两步弹窗删除;组件测试改写为
  新契约(触发器+面板键入+词法归一),表单 golden 随形态更新

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 17:49:17 +08:00
wangjia 06dc68245a feat(client): 日期范围改锚定下拉——起止并排双滚轮 + 可键入,不再冻结窗口
- 新增 showDateRangeDropdown:锚定触发控件下方(透明遮罩点外关闭,形态同
  DsMenu 下拉),起始/结束两列并排,各带可输入框(键入/回车/失焦归一
  yyyy-MM-dd)与滚轮,输入↔滚轮双向联动;共用底栏显示当前范围 + 确定,
  起止倒置自动交换;窄屏回落既有两步滚轮弹窗
- WheelDatePanel 加 showFooter/onChanged(滚动即回调),供范围面板复用
- 出入库列表 6 处调用切换:工具栏时间 chip「自定义…」、桌面详搜弹窗、
  窄屏详搜 sheet 的日期区间字段均锚定在各自控件下方

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 17:29:21 +08:00
wangjia 0425939d7e feat(client): 录单日期格支持直接键入(DsDateCell 可输入 + 滚轮并存)
- DsDateCell 由纯点选改为可键入:支持 2024 / 2024-5-12 / 20240512 等,
  失焦或回车归一为 yyyy-MM-dd;回车提交并推进下一格(键盘流保留 Tab/Esc);
  日历图标仍打开滚轮面板,滚轮确定回填输入框
- 归一词法抽为共享 normalizeYmd(core/utils/date_util.dart),
  DatePickerField 改为复用同一实现(登记收支等处词法一致)
- 出入库表单 golden 基准随日期格形态更新(桌面+移动 ×3 主题)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 17:20:03 +08:00
wangjia 6d58ace4a7 chore: release server-v1.1.4
Design Source Checks / design-source (push) Successful in 16s
Deploy Server / release-deploy-server (push) Successful in 55s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
server-v1.1.4
2026-07-04 14:02:29 +08:00
wangjia c9e3664d68 fix(backend): 登录设备配额三修复——过期会话不占坑/同设备重登不叠加/配额跟套餐档位
S003 线上登录锁死根因修复:
- 活跃会话统计排除 refresh 已过期的行(此前过期未清理的会话把配额占满,
  正常用户被锁在门外,需等 cleanup retention 天后才释放)
- 同 shop+user+device_id 重登先吊销旧会话(reason=relogin),重装/重复登录
  不再叠占配额
- effectiveTotalQuota 接线套餐档位:session_policy 运维覆盖 > 有效授权
  max_devices(标准 2/高级 5,floor 2 兜底 trial=1)> 全局默认 5(无有效授权)

test(backend): session_quota_test.go 五用例覆盖三分支 + policy 优先级 + trial 兜底

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 13:46:59 +08:00
wangjia 5b9262a166 docs(design): 移动端落地收尾——CONTRACT 台账入表 + 实现计划 HTML 阅读版登记
- CONTRACT 块4:移动壳/我的/授权/盘点入验收表(同步·golden);通知两屏登记二期、
  建单两屏登记拍板不落地;「移动愿景原型」小节改记 2026-07-04 已落地;
  授权面板代码先行行更新为公共 license_panel.dart
- docs/plans/mobile-screens-implementation.html:实现计划阅读版(Stage0/四包/合流验收),
  登记 docs/index.html「实现计划」分类

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 12:23:27 +08:00
wangjia 9445042cb4 feat(client): 设置/用户/设备/关于窄屏对齐移动原型(hub 形态/卡片流/sheet/无打印)
- 系统设置窄屏改 hub 三组(门店/偏好/数据):门店信息/编号规则/默认仓库走
  底部 sheet,主题外观接 showThemeSheet,?tab= 深链窄屏忽略;桌面 subnav 不动
- 用户管理窄屏:m-section + 头像卡片流 + 角色图标徽章 + FAB 新增;
  点卡开详情 sheet(drow + 重置密码/启停/编辑),表单复用为 sheet 形态
- 设备管理窄屏:会话卡流(本机标注/在线图标徽章)+ 外设卡流(mc-foot 脚注),
  「+ 添加设备」在区块标题行右侧(m-pill 选择 sheet),打印模板窄屏不渲染
- 关于我们窄屏:品牌 hero + hub 链接组 + 产品信息 drow 卡 + 时间线 pill 标签
  + 意见反馈 sheet(类型 pill/描述/联系方式);授权信息不显示(已迁 /me/license)
- golden:四屏窄屏基准独立成 *_mobile_golden_test.dart(390×844 @2x 三主题),
  桌面 golden 零漂移

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 12:19:15 +08:00
wangjia dde87a32b6 feat(client): 库存/盘点/财务窄屏对齐移动原型(KPI 网格/卡片流/图标徽章/sheet)
- 库存列表:窄屏隐藏页内大标题头;KPI 2×2 MKpiGrid(缺货卡 warn+点击筛选);
  MSearchRow(详搜钮开筛选 sheet:状态/规格/系列);卡片徽章换图标变体
- 库存盘点:窄屏卡片流(单号/范围·项数/进行中徽章带图标/差异/日期)+
  详情 sheet(drow 键值行)+ 底部操作条;DateTime.now→appNow 可注入时钟
- 财务:窄屏隐藏大标题头;KPI 2×2(收入 up 绿/支出 down 红/应收 warn);
  DsSeg 应收/应付/流水三分段 + 卡片流(类型徽章带图标、金额正负色)
- golden:新增 m_inventory / m_inventory_check / m_finance 三屏×三主题
  (390×844@2x);重生成既有 inventory_list_mobile / finance_mobile 基准
  (桌面 golden 零改动)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 12:18:17 +08:00
wangjia ff7b4194ec feat(client): 出入库列表窄屏对齐移动原型(KPI 筛选/搜索行/状态与详搜 sheet/图标徽章)
- 窄屏隐藏页内大标题头与新增/导出/打印入口(移动端无建单与打印——拍板)
- KPI 改 MKpiGrid 2×2:待审核/草稿卡可点切换状态筛选(再点取消,selected 联动)
- 工具栏改 MSearchRow:搜索(provider 内置防抖)+ 纯文字状态钮 + 图标详搜钮
- 状态筛选/详细搜索改 showMSheet 底部 sheet(详搜字段与桌面完全同集,重置/应用在 actions)
- 卡片流徽章换图标变体(含派生态待定价/部分退单/已退单)+ › 箭头,行内操作收进详情 sheet
- 确认进价/确认售价窄屏走 showMSheet;窄屏详情操作组不出打印
- 新增 390×844 三主题 golden(m_stock_in_list/m_stock_out_list);重生成既有 390×1300 移动 golden 基准(桌面 golden 零漂移)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 12:17:31 +08:00