Commit Graph

2 Commits

Author SHA1 Message Date
b53e22f536 style(borrow): 待办提醒改为中央强弹窗(Modal + 遮罩)
背景
----
右上角 ElNotification 在仓库作业现场视觉提示太弱,极易被操作员忽略,
待接收的物品就一直在系统里悬着。

改动
----
ElNotification -> ElMessageBox.confirm:
· 屏幕正中 + 灰色半透明遮罩,强制打断注意力;
· 标题「待办通知:借库转交」,内容「您有 X 件物品等待接收确认,请及时处理。」;
· 按钮【去处理】/【稍后处理】;前者 router.push('/operation/records'),
  后者仅收起弹窗,不阻断当前工作;
· closeOnClickModal=false(点遮罩不关,避免误触即消失),
  但保留 showClose 与 Esc —— 强提醒不等于关不掉,用户始终有明确退出路径。

★ 防叠加(两道,模块级标志 + DOM 探测)
  reminderOpen 用**模块级**变量而非组件级:即便组件被重复挂载
  (HMR、多 Layout 实例)也能保证同一时刻只有一个提醒弹窗。
  另按标题探测屏幕上是否已有同名弹窗,覆盖标志失效的极端情况。

★ 一处必须修正的时序隐患:记录时机
  原逻辑是「先写 sessionStorage 已提醒数量,再弹窗」。加了并发防护后,
  弹窗可能被跳过(已有弹窗在屏),而数量却已记下 —— 数量不变 → 下次不再弹,
  **这条提醒被永久吞掉**。
  现改为「先弹,弹成功了才记账」:showReminder() 返回是否真的弹出,
  没弹出就不记账,留给下一轮轮询重试。

验证(node 复刻判定链,全场景通过)
  3 → 弹;仍 3 → 不弹;弹窗开着时变 4 → 不弹且不记账 →
  收起后轮询 4 → 弹;归零 → 清记录;新来 2 → 弹。
  弹窗序列 [3,4,2],无重复、无叠加;同一轮内并发两次 check 只弹一次。
2026-09-17 10:40:00 +08:00
2c732a9a3a feat(borrow): 全局待办强提醒(接收人不再处于盲区)
新增无渲染组件 PendingTransferNotifier,挂在 Layout(路由切换常驻、且只在
已登录区域渲染,天然保证「有 token 才查」)。

UI
----
ElNotification,type=warning、duration=0(不自动关闭,须用户处理或手动点掉):
  标题:待办通知:借库转交
  内容:您有 X 件物品等待接收确认,请及时处理。【去处理 >】
点击【去处理】关闭通知并 router.push('/operation/records')(借还记录页)。
message 用 VNode 构造而非 dangerouslyUseHTMLString —— 不必把数量拼进 HTML 字符串。

防骚扰(两道)
----
· 会话级去重:sessionStorage 记「上次已提醒过的数量」,只有数量**变化**才再弹。
  用 sessionStorage 而非 Pinia —— 前者跨刷新存活,后者会重置,刷新即轰炸。
· 数量归零时清掉记录,下次新转交能重新提醒。

★ 加了 2 分钟低频轮询(超出需求所写,但需求目标需要它):
  需求只要求「初始化时查一次」,而 SPA 只在首次进入时初始化 —— 已打开页面的
  用户永远收不到提醒,与「第一时间响应」的目标相悖。有去重逻辑兜底,
  轮询不会造成重复打扰。不需要的话删掉定时器即可。

错误一律静默:提醒是锦上添花,不能因接口抖动弹错误框刷屏。

验证:去重状态机用 node 复刻验证 —— 3→2→1 各弹一次,刷新与轮询均不重复,
归零后再来新转交能重新提醒。
2026-09-17 10:30:13 +08:00