docs(chat): 聊天「已读」是前端写死+抢单前应显「留言」澄清(22_4223 §10 / 22_4237 H2)
- 后端 ChatMessageRespVO 无任何已读/送达字段(9字段已列全),14:05已读=前端硬拼,后端给不了 - 抢单前我方消息=留言(待房务接单),抢单后=已送达,别写死「已读」 - 留言→抢单后送达后端全包(bindHouseClaimer.rebindUnreadReceiver),测试时没抢单故正确未送达 - 房务管家抢单池门控保持不变,与定制师单向留言不冲突 - 标2项可选后端增强待wx定:真已读回执/抢单池留言计数预览
这个提交包含在:
父节点
2a24c42ba5
当前提交
b5cb91defd
@ -117,3 +117,31 @@ HOUSE 订单会话**只走 open-house**。通用 `/chat/open`(bizModule+peerAd
|
|||||||
### 在线/离线态走 SSE(wx 2026-06-23 新要求 → 后端工单 **#4273**)
|
### 在线/离线态走 SSE(wx 2026-06-23 新要求 → 后端工单 **#4273**)
|
||||||
- 现状:`peerOnline` 是**轮询字段**(Redis presence key TTL 45s + SSE 心跳续期),**在线态变更不推送**。
|
- 现状:`peerOnline` 是**轮询字段**(Redis presence key TTL 45s + SSE 心跳续期),**在线态变更不推送**。
|
||||||
- wx 拍:改为 **SSE 实时推在线/离线**。已立后端工单 **#4273**(hl-user-service):SSE 连接建/断 → 标在线/离线 → 向会话对端推 `presence` 事件。**前端届时订阅 presence 事件、停 peerOnline 轮询**(保留字段做首屏兜底)。未落地前先用 peerOnline 轮询。
|
- 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 留言计数,独立后端工单。当前抢单后才送达可见。
|
||||||
|
|||||||
@ -46,6 +46,7 @@ DAY2 俄式标准房 ×1 ¥280:candidates = [恩和瓦西里民宿, 呼伦贝
|
|||||||
- 实测(抢单池单 `GET /admin/house/orders/{id}`):`houseStatus=PENDING_CLAIM, houseStatusLabel=待配房, currentStep=1, steps[0].completed=false`。
|
- 实测(抢单池单 `GET /admin/house/orders/{id}`):`houseStatus=PENDING_CLAIM, houseStatusLabel=待配房, currentStep=1, steps[0].completed=false`。
|
||||||
- **内部留言计数**:`tabCounts.messageCount` 由恒 0 改为计入定制师需求(=1)。实测 `messageCount=1`。
|
- **内部留言计数**:`tabCounts.messageCount` 由恒 0 改为计入定制师需求(=1)。实测 `messageCount=1`。
|
||||||
- **H 留言空态对齐(前端)**:既然口径是「定制师需求算 1 条留言」(messageCount=1),内部留言区**别再显「该订单暂无内部留言」**(与 count=1 自相矛盾,且该文案是前端写死,后端不返)。正确:把「定制师需求」当作**第 1 条留言**展示;真正空态只针对**抢单后**房务↔定制师聊天那部分——抢单前聊天关闭,可显「抢单后可与定制师沟通」之类引导而非笼统「暂无内部留言」。
|
- **H 留言空态对齐(前端)**:既然口径是「定制师需求算 1 条留言」(messageCount=1),内部留言区**别再显「该订单暂无内部留言」**(与 count=1 自相矛盾,且该文案是前端写死,后端不返)。正确:把「定制师需求」当作**第 1 条留言**展示;真正空态只针对**抢单后**房务↔定制师聊天那部分——抢单前聊天关闭,可显「抢单后可与定制师沟通」之类引导而非笼统「暂无内部留言」。
|
||||||
|
- **H2 抢单池「抢单后可与定制师沟通」门控保持不变(与定制师留言不冲突)**:定制师在抢单前可**单向留言**,这些留言由后端压在 pending、**房务抢单那刻自动整批送达抢到的人**(带未读角标 + SSE)。房务在抢单池里未接单、无身份,先不聊是对的;**抢单后**这些留言会出现在房务↔定制师聊天里。聊天气泡的「已读/留言/已送达」显示口径见 **`22_4223` §10**(后端无「已读」字段,抢单前我方消息标「留言」、抢单后标「已送达」,**别写死「已读」**)。
|
||||||
|
|
||||||
## 6. 操作日志「操作人」别打整串 JSON,渲染 `operator.name`(前端 bug,可立即接)
|
## 6. 操作日志「操作人」别打整串 JSON,渲染 `operator.name`(前端 bug,可立即接)
|
||||||
|
|
||||||
|
|||||||
正在加载...
x
在新工单中引用
屏蔽一个用户