From b5cb91defdcdf8c81d00ce9c0ec3ce0385992c5c Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Tue, 23 Jun 2026 14:16:26 +0800 Subject: [PATCH] =?UTF-8?q?docs(chat):=20=E8=81=8A=E5=A4=A9=E3=80=8C?= =?UTF-8?q?=E5=B7=B2=E8=AF=BB=E3=80=8D=E6=98=AF=E5=89=8D=E7=AB=AF=E5=86=99?= =?UTF-8?q?=E6=AD=BB+=E6=8A=A2=E5=8D=95=E5=89=8D=E5=BA=94=E6=98=BE?= =?UTF-8?q?=E3=80=8C=E7=95=99=E8=A8=80=E3=80=8D=E6=BE=84=E6=B8=85(22=5F422?= =?UTF-8?q?3=20=C2=A710=20/=2022=5F4237=20H2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端 ChatMessageRespVO 无任何已读/送达字段(9字段已列全),14:05已读=前端硬拼,后端给不了 - 抢单前我方消息=留言(待房务接单),抢单后=已送达,别写死「已读」 - 留言→抢单后送达后端全包(bindHouseClaimer.rebindUnreadReceiver),测试时没抢单故正确未送达 - 房务管家抢单池门控保持不变,与定制师单向留言不冲突 - 标2项可选后端增强待wx定:真已读回执/抢单池留言计数预览 --- ...-在线态+抢单前发消息+claimerId-上线测试服-管理后台.md | 28 +++++++++++++++++++ ...订单详情抢单池_渲染缺口+抢单门控_房务前端.md | 1 + 2 files changed, 29 insertions(+) diff --git a/changelogs-v2/2026-06/22_4223_房务联系房务面板真实化-在线态+抢单前发消息+claimerId-上线测试服-管理后台.md b/changelogs-v2/2026-06/22_4223_房务联系房务面板真实化-在线态+抢单前发消息+claimerId-上线测试服-管理后台.md index 625f563..c60eec9 100644 --- a/changelogs-v2/2026-06/22_4223_房务联系房务面板真实化-在线态+抢单前发消息+claimerId-上线测试服-管理后台.md +++ b/changelogs-v2/2026-06/22_4223_房务联系房务面板真实化-在线态+抢单前发消息+claimerId-上线测试服-管理后台.md @@ -117,3 +117,31 @@ HOUSE 订单会话**只走 open-house**。通用 `/chat/open`(bizModule+peerAd ### 在线/离线态走 SSE(wx 2026-06-23 新要求 → 后端工单 **#4273**) - 现状:`peerOnline` 是**轮询字段**(Redis presence key TTL 45s + SSE 心跳续期),**在线态变更不推送**。 - wx 拍:改为 **SSE 实时推在线/离线**。已立后端工单 **#4273**(hl-user-service):SSE 连接建/断 → 标在线/离线 → 向会话对端推 `presence` 事件。**前端届时订阅 presence 事件、停 peerOnline 轮询**(保留字段做首屏兜底)。未落地前先用 peerOnline 轮询。 + +--- + +## 10.「已读」是前端写死的 bug + 抢单前应显「留言」(2026-06-23 wx 评审,🐛 前端改,后端无需动) + +**现象**(wx 评审,定制师侧「联系房务」面板):订单还在抢单池(无房务接单,对端显「待接单房务」),定制师发「你好 测试消息」,气泡下却显示 `14:05 **已读**`。**没有任何房务接单、对端是占位 0,谁来读?「已读」是错的。** + +**根因(已对 origin/dev-v3 核实)**:**后端从不返回任何「已读/送达」状态**。线程消息 VO 就 §9 Q2 那 9 个字段 `{messageId, senderAdminId, senderName, senderRole, msgType, priority, content, isMine, sentAt}`——**没有 `isRead`/`readAt`/`delivered`/`status`**。`14:05 已读`是**前端在「我方」(`isMine=true`) 气泡下无条件硬拼的**,后端给不了这个信号,所以它永远是假的。 + +**正确显示(前端按 claim 状态自行渲染,后端已有的字段够用)**: +| 我方消息所处状态 | 判据(前端已有) | 气泡下应显示 | +|---|---|---| +| **抢单前**(pending) | `claimerId == null`(或 open-house 返 `peerAdminId:0`/`peerName:null`) | 「**留言**」或「留言·待房务接单」——**不显已读** | +| **抢单后** | `claimerId` 有值、对端真实 | 「**已送达**」或**什么都不显**——**不显「已读」** | +| 对端发来的(`isMine=false`) | — | 不需要已读标 | + +> 一句话:**把写死的「已读」删掉**。抢单前我方消息本质是**留言**(标「留言」);抢单后后端保证已送达接单房务(可标「已送达」)。**后端无读回执,别再伪造「已读」。** + +**「留言→抢单后送达」后端全包,无需前端管(§4 重申 + 核实)**: +- 抢单前定制师发的消息 → 后端存进 pending 桶(收件方=占位 0,**不累加任何人未读、不推 SSE**),就是「留言」。 +- 房务**抢单**那一刻 → 后端 `bindHouseClaimer` 自动把这些 pending 留言**整批改判给抢到的房务** + 置未读 + SSE 通知。**这就是你说的「发的消息抢单后一起把消息发过去」,已经实现。** +- 所以你测试时「房务管家侧看不到留言」(Image #27) 是**对的**——那单**还在抢单池、没人抢**,留言正确地还压在 pending、尚未送达;**等真有房务点「抢这一单」,留言会连同未读角标一起送到 ta 那边**。 + +**房务管家侧(Image #27)抢单池显「抢单后可与定制师沟通」= 设计内门控**(见 `22_4237` item 1:房务未抢单时隐藏聊天入口)。**保持不变**,与上面定制师侧抢单前能留言不冲突——能抢单前**单向留言**的只有定制师;房务在抢单池里没接单、无身份,自然先不聊。抢单后双方正常互聊。 + +**两件待 wx 拍的「可选增强」(前端不必等,先按上表修假已读)**: +1. **真·已读回执**(抢单后对方真读了才显「已读」)——需后端把 per-message 已读态(基于会话成员 `lastReadMessageId` 水位)暴露进线程 VO,是独立后端工单。当前最小修 = 前端按上表把假已读改成「留言/已送达」即可。 +2. **抢单池给房务「该单有 N 条定制师留言」预览做诱饵**——需后端在抢单池 VO 补 pending 留言计数,独立后端工单。当前抢单后才送达可见。 diff --git a/changelogs-v2/2026-06/22_4237_房务管家订单详情抢单池_渲染缺口+抢单门控_房务前端.md b/changelogs-v2/2026-06/22_4237_房务管家订单详情抢单池_渲染缺口+抢单门控_房务前端.md index 504df32..91dd2f8 100644 --- a/changelogs-v2/2026-06/22_4237_房务管家订单详情抢单池_渲染缺口+抢单门控_房务前端.md +++ b/changelogs-v2/2026-06/22_4237_房务管家订单详情抢单池_渲染缺口+抢单门控_房务前端.md @@ -46,6 +46,7 @@ DAY2 俄式标准房 ×1 ¥280:candidates = [恩和瓦西里民宿, 呼伦贝 - 实测(抢单池单 `GET /admin/house/orders/{id}`):`houseStatus=PENDING_CLAIM, houseStatusLabel=待配房, currentStep=1, steps[0].completed=false`。 - **内部留言计数**:`tabCounts.messageCount` 由恒 0 改为计入定制师需求(=1)。实测 `messageCount=1`。 - **H 留言空态对齐(前端)**:既然口径是「定制师需求算 1 条留言」(messageCount=1),内部留言区**别再显「该订单暂无内部留言」**(与 count=1 自相矛盾,且该文案是前端写死,后端不返)。正确:把「定制师需求」当作**第 1 条留言**展示;真正空态只针对**抢单后**房务↔定制师聊天那部分——抢单前聊天关闭,可显「抢单后可与定制师沟通」之类引导而非笼统「暂无内部留言」。 +- **H2 抢单池「抢单后可与定制师沟通」门控保持不变(与定制师留言不冲突)**:定制师在抢单前可**单向留言**,这些留言由后端压在 pending、**房务抢单那刻自动整批送达抢到的人**(带未读角标 + SSE)。房务在抢单池里未接单、无身份,先不聊是对的;**抢单后**这些留言会出现在房务↔定制师聊天里。聊天气泡的「已读/留言/已送达」显示口径见 **`22_4223` §10**(后端无「已读」字段,抢单前我方消息标「留言」、抢单后标「已送达」,**别写死「已读」**)。 ## 6. 操作日志「操作人」别打整串 JSON,渲染 `operator.name`(前端 bug,可立即接)