Files
dukang/.workbuddy/memory/2026-08-17.md
T
jacy 7dd5fdfb12
CI / verify (pull_request) Has been cancelled
优化门店端结算页面的UI
2026-08-17 23:43:45 +08:00

8.7 KiB
Raw Blame History

2026-08-17 工作日志

杜康好客 v3.4.18 门店体验与登录态优化(含 F 项)

已实现并发布

  • A mini-user 门店座机脱敏:改 apps/mini-user/src/lib/phone.tsmaskPhone 座机分支,中间四位 ****(保留区号+首2+末2)。
  • B 套餐详情图 1/5 计数 + 自动轮播:ProductCarousel.tsx detail 变体加 autoplay(3.5s) + 右下角 1/N 计数。
  • C 合伙人暂停禁止登录:auth.service.ts 三处非 ACTIVE 抛「该账号已暂停使用,请联系客服人员」;h5-partner/LoginPage.tsx 同步文案;复用 DISABLED 枚举,无迁移。
  • D 门店端提现/筛选栏留白对齐:h5-shop/styles.css--space-page
  • E 休息中核销→是否开启营业:PhoneRedeemPage/RedeemConfirmPage 弹「是否开启营业?」,确认调 PUT /shop/store/status 开张后继续。
  • F(本次新增) 门店套餐图片自适应完整显示:ProductCarousel 新增 imageFit="adaptive"mode="widthFix" + 按真实比例动态算 Swiper 高度),product-detail.css.detail-carousel-wrap--adaptive 覆盖固定 1:1 裁剪;仅 store-package-detail 使用。根因:原 .detail-carousel-wrap 固定 aspect-ratio:1 + overflow:hidden + aspectFill 裁掉非正方形图。

发布状态

  • 文档:杜康好客-v3.4.18-门店体验与登录态优化.md(含 A–F 范围、实现位置、验收清单)。
  • git:本地 dev_jacy 提交 v3.4.18 各功能 + F 修复;已 git push origin dev_jacy:main(干净快进 984dec7..18147e1)。
  • 生产部署:后台运行 deploy/deploy-prod.sh --host dukang-server/opt/dukang, main)。SSH 配置主机 dukang-server 即生产机;deploy.env 缺失,用 --host 覆盖。

注意

  • 本次 git 发布前曾遇 origin/main 比本地新、working tree 异常删除 503 文件(已 reset --hard HEAD 还原,提交完好);最终 fetch 后确认本地领先可快进,安全发布。
  • 四端 tsc 仅余项目既有环境类报错(CSS 导入/ImportMeta.env),本次改动文件无新增类型错误。

F 项方案 A 改写(22:18

  • 放弃手算高度逻辑(SelectorQuery + onLoad 测自然宽高),改用 swiper 原生 autoHeight:海报有多高轮播就有多高,无裁切。
  • ProductCarousel.tsx:删 wrapWidth/imgHeights/handleImageLoad/swiperStyleadaptive 模式加 autoHeight={isAdaptive}image 保持 mode="widthFix"
  • product-detail.css.detail-carousel-wrap--adaptive 覆盖(删 aspect-ratio:1/overflow:hidden),并给 .detail-carousel/.detail-carousel-item/.detail-carousel-image 在 adaptive 下 height:auto
  • 已提交 cd1e9aegit push origin dev_jacy:main(干净快进 18147e1..cd1e9ae)。
  • 重要:F 是原生微信小程序端改动,服务器部署只覆盖 H5-user 构建;真机小程序用户需经「微信开发者工具上传 + 微信审核」才能生效。

E 项缺陷修复(22:46 测试不通过)

  • 根因:门店非 OPEN 时,后端 redeem.service.ts:loadOpenStoreAccountpreviewRedeem/confirmRedeem 共用)抛「门店未营业」,导致 RedeemConfirmPagepreview 拉取失败 → preview 为 null → 「确认核销」按钮 disabled={!preview} → 点击不了 → 开张弹窗永远不触发。手机号路径因弹窗在「发送验证码」时触发故未暴露。
  • 修复RedeemConfirmPage 把 preview 拉取抽成 loadPreview();确认按钮改为 disabled={loading || (!preview && !storeClosed)}(闭店时仍可点→弹框);openStoreAndContinue 开张成功后 await loadPreview()doConfirm()
  • 弹窗文案对齐需求:「门店目前休息中无法核销,是否开启营业」(两页 modal title=门店休息中 / desc=该句;内联提示改为「门店目前休息中无法核销,开启营业后可继续」)。
  • 提交 3ac008agit push origin dev_jacy:main(快进 cd1e9ae..3ac008a),生产重新部署中(deploy-prod.sh --host dukang-server)。
  • 注意:后端 updateShopStatus 对 CLOSED(永久关闭) 门店拒绝开张(抛「门店已永久关闭...」),属预期;需求针对 闭店/休息中(PAUSED) 场景,OK。

E 项方案二次修正(23:00 用户纠正:前置到点击扫码)

  • 用户新要求:门店 PAUSED 时,点击「扫码核销」按钮那一刻就弹窗,而不是扫完码进确认页才弹。
  • 改动apps/h5-shop/src/pages/HomePage.tsx(门店端首页)。
    • 复用 dashboard 已加载的 statusdash?.store?.statusL384 status = String(store?.status||''))。
    • handleScan() 开头:if (status !== 'OPEN') { setShowOpenModal(true); return; } —— 不进入 isWechatEnv/scanQrCode 流程。
    • 新增 openStoreAndContinue()PUT /shop/store/status {OPEN},成功后 loadDashboard() 刷新状态(开关/扫码按钮同步),用户可再次点击扫码。
    • 弹窗复用全局 .shop-redeem-modal 样式(与确认页一致),文案「门店目前休息中无法核销,是否开启营业?」。
    • RedeemConfirmPage 的弹窗保留为带码直入确认页的兜底。
  • 提交 c0d04eegit push origin dev_jacy:main(快进 3ac008a..c0d04ee),生产重新部署中(deploy-prod.sh --host dukang-server)。文档 E 节已同步更新方案描述。

C 项缺陷修复(合伙人端 DISABLED 仍登录 - 微信路径)

  • 现象:手机号(短信)路径已正确拦截(login 前先 POST /partner/auth/phone/check 校验非 ACTIVE 即拒),但微信 OAuth 路径报错被吞 → 用户无任何提示。
  • 根因apps/h5-partner/src/contexts/PartnerSessionContext.tsx L118 catch { stripOAuthParamsFromLocation(); } 把微信回调里 processPartnerWechatOAuthCallback 抛出的「该账号已暂停使用」错误吞掉。
  • 修复catch (e) { stripOAuthParamsFromLocation(); toastError(e); }toastError@/lib/toast 引入),让微信登录被暂停时同样弹「该账号已暂停使用,请联系客服人员」。
  • 提交 5ca9aa0git push origin dev_jacy:main(快进 c0d04ee..5ca9aa0)。
  • 生产部署完成(deploy-prod.sh --host dukang-server, 38s):dukang-api 200、各 h5/partner 服务 online。mini-user(h5) 健康检查 FAIL 与本次无关(非 v3.4.18 改动范围,本次改 native 小程序 + h5-shop + h5-partner)。
  • 验收状态A/B/C/D/E/F 全部提交并发布生产;C 项的短信 + 微信两条路径拦截逻辑均已落地,建议真机/微信环境复测一次确认 toast 文案展示。

C 项双拦截增强(23:37 用户要求“两个都要拦”)

  • 澄清:city 合伙人有两个独立状态字段,别混:
    • partner_account.statusAccountStatus: ACTIVE/DISABLED= 登录账号启用态,feature 原拦截查的就是它(子账号自身)。
    • partner_account.bindingStatusCityPartnerStatus: ACTIVE/PAUSED= 城市合伙人绑定态,主账号为准;子账号取父主账号的此字段。
  • 需求:子账号 status=DISABLED 与 主账号 bindingStatus=PAUSED 都要拦
  • 实现auth.service.ts 新增统一闸门 assertPartnerAccountActive(account)(L313),同时拦上述两种;替换三处旧校验:assertPartnerAccountByPhone(L334) / loginPartner(L1086) / loginPartnerWechat(L1748)。
    • 自身非 ACTIVE → 「该账号已暂停使用,请联系客服人员」
    • 主账号 bindingStatus 非 ACTIVE → 「该合伙人合作已暂停,请联系客服人员」
  • 文档杜康好客-v3.4.18-...md C 节重写为双拦截;顶部范围表 + 验收清单同步。
  • 提交 48d6900git push origin dev_jacy:main(快进 5ca9aa0..48d6900),生产部署完成(task I2mWSU, 37s):commit=48d6900、api 200、各服务 online。
  • 生产实测双拦截均生效
    • status=DISABLED(id=7 临时翻转→测试→已还原 ACTIVE):phone/check 返回 400「该账号已暂停使用,请联系客服人员」;还原后 201 ok:true。
    • bindingStatus=PAUSED18049821889 等 3 个主账号):phone/check 返回 400「该合伙人合作已暂停,请联系客服人员」(修复前为 200 ok:true)。
    • 库内 status!=ACTIVE 数量=0binding_status!=ACTIVE 数量=3(均为主账号 PAUSED)。
  • 遗留未提交文件(非本次改动,需用户决策)
    • apps/h5-shop/src/styles.cssshop-records-status-chipspadding:0padding-bottom:10pxD 项后续微调,未提交)。
    • apps/mini-user/src/styles/product-detail.css:工作区版本把方案Aaspect-ratio:auto/height:auto)改回固定 4:3aspect-ratio:1.33/height:100%),与已上线方案A矛盾,疑似另一轮实验性改动。已与用户确认前暂不提交