diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 96e194b4f..9ce2a944b 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -3582,6 +3582,8 @@ class DialogController extends AbstractController return Base::retError('当前对话不支持'); } // + $previousSessionId = intval($dialog->session_id); + // $session = WebSocketDialogSession::whereDialogId($dialog->id)->whereTitle('')->first(); if ($session) { $dialog->session_id = $session->id; @@ -3596,6 +3598,8 @@ class DialogController extends AbstractController $dialog->session_id = $session->id; $dialog->save(); // + WebSocketDialogMsgRead::markSessionMessagesAsRead($dialog->id, $previousSessionId); + // return Base::retSuccess('success', $session); } diff --git a/app/Models/WebSocketDialogMsgRead.php b/app/Models/WebSocketDialogMsgRead.php index 151c3f8a0..b89e68ea4 100644 --- a/app/Models/WebSocketDialogMsgRead.php +++ b/app/Models/WebSocketDialogMsgRead.php @@ -121,4 +121,30 @@ class WebSocketDialogMsgRead extends AbstractModel DB::update($sql, $bindings); } } + + /** + * 标记指定会话的历史消息为已读 + * @param int $dialogId + * @param int $sessionId + * @param int $chunkSize + * @return void + */ + public static function markSessionMessagesAsRead(int $dialogId, int $sessionId, int $chunkSize = 100): void + { + if ($dialogId <= 0 || $sessionId <= 0) { + return; + } + + self::whereDialogId($dialogId) + ->whereNull('read_at') + ->whereIn('msg_id', function ($query) use ($dialogId, $sessionId) { + $query->select('id') + ->from((new WebSocketDialogMsg())->getTable()) + ->where('dialog_id', $dialogId) + ->where('session_id', $sessionId); + }) + ->chunkById($chunkSize, function ($list) { + self::onlyMarkRead($list); + }); + } }