fix: 修复多图消息无法显示的三个根因

根因 1 — MessageItem.toEntity() id=0 主键碰撞:
  WS 拉取的每条消息均用 id=0 insertOrReplace,批量消息相互覆盖,
  DB 中只留最后一条。改为 id=messageId(服务端唯一 ID)。

根因 2 — SendMessageUseCase 乐观写入 id=0 碰撞:
  批量图片发送时所有乐观行共享 id=0,逐条覆盖。
  改用负微秒时间戳作为临时唯一 id,HTTP 确认后用真实 messageId 替换。

根因 3 — watchByChatId 无 ORDER BY:
  DB 消息顺序不确定,宫格分组算法依赖时间升序失败。
  在 MessageRepositoryImpl.watchByChatId 及 _buildDisplayItems 中
  分别按 sendTime ASC + chatIdx ASC 排序。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
pp-bot
2026-03-24 15:45:41 +09:00
parent 2354e92c64
commit 2eb2299709
5 changed files with 68 additions and 13 deletions

View File

@@ -42,8 +42,12 @@ class MessageItem {
atUsers: json['at_users'] as String?,
);
/// [id] 使用服务端 [messageId](必须 > 0作为主键确保多条消息在 DB 中唯一共存。
/// 若 messageId 为 0防御退化为负时间戳临时 ID。
Message toEntity() => Message(
id: 0,
id: messageId > 0
? messageId
: -(DateTime.now().microsecondsSinceEpoch),
messageId: messageId,
chatId: chatId,
chatIdx: chatIdx,

View File

@@ -35,7 +35,9 @@ class SendMessageResponse {
required int typ,
}) =>
Message(
id: 0,
id: messageId > 0
? messageId
: -(DateTime.now().microsecondsSinceEpoch),
messageId: messageId,
chatId: chatId,
chatIdx: chatIdx,