feat(borrow): 全局提醒支持双向 —— 发起方也能收到「转交被拒绝」

提醒组件从单向(待我接收)扩展为双向,一次轮询同时取回两类:

  ① 转交被拒绝 —— 我发起、对方拒收,物品责任仍在我手上
  ② 待我接收   —— 别人转给我、等我确认

弹窗(沿用中央 Modal + 遮罩,不进则已、进则打断):
  标题「转交被拒绝」,列出被拒物品(物料名 + 单号 + 接收人,超过 5 笔折叠计数),
  按钮【去处理】(跳借还记录) /【知道了】。

★ 优先级:拒绝提醒优先于待接收提醒,且**一次只弹一个弹窗**。
  前者是「责任已回到你手上」的状态变更,后者是「等你确认」的待办;
  本次弹了拒绝就直接 return,待接收那条留给下一轮(此时拒绝已 ack),
  避免两个 Modal 叠加打扰。

★ 两条退出路径都算「已知悉」并 ack —— 否则每次登录都会再弹同一条,
  从提醒退化成骚扰。ack 失败不阻断,下一轮还会再提醒(宁可多提醒一次,
  也不能漏)。

防叠加沿用上一轮的模块标志 + DOM 探测,标题白名单扩为两个。

顺带:流转明细时间线为转交节点补状态标签(已拒绝/待接收),被拒的转交
不再与成功的长得一模一样。

验证(node 复刻判定链)
  既有拒绝、又有 2 件待接收 → 弹[转交被拒绝];确认后 ack;
  下一轮 → 弹[待办通知] count=2;再轮询 → 不弹(未变)。
  拒绝优先、不叠加、ack 后待接收提醒正常补上。
This commit is contained in:
yueli
2026-09-17 10:44:07 +08:00
parent f24797ff1f
commit f4f887c2b4
3 changed files with 105 additions and 30 deletions

View File

@ -309,9 +309,14 @@ export function rejectBorrowTransfer(transferId: number, reason?: string) {
}
/**
* 待我接收的转交数量 —— 全局待办强提醒用(初始化 + 轮询)。
* 极轻量,只做一次 count。
* @returns { count }
* 全局待办强提醒的轮询数据源(初始化 + 轮询)。
*
* ★ 一次请求返回两类信息,避免前端多打一个请求:
* count —— 待**我接收**的转交数量
* rejects —— **我发起、被对方拒绝、尚未告知我**的转交
* (被拒时物品责任仍在我手上,不告知就会误以为已交接出去)
*
* @returns { count, rejects: [{ id, borrow_no, sku, material_name, to_user_name, remark, ... }] }
*/
export function getPendingTransferCount() {
return request({
@ -320,6 +325,18 @@ export function getPendingTransferCount() {
})
}
/**
* 确认已知悉「转交被拒绝」—— 写 reject_seen_at,之后不再提醒。
* @param ids 留空表示该用户全部待告知的拒绝
*/
export function ackTransferRejects(ids?: number[]) {
return request({
url: '/v1/transactions/borrow/transfer/reject-ack',
method: 'post',
data: { ids }
})
}
/**
* 整单流转时间线(**borrow_no** 维度):借出 → 转交(可多次) → 归还 → 报废
*