diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 7d4aea0c7..ab9a31945 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -1033,8 +1033,9 @@ class DialogController extends AbstractController * * @apiParam {Number} dialog_id 会话ID * @apiParam {String} type 类型 - * - read - * - unread + * - read: 已读 + * - unread: 未读 + * @apiParam {Number} [after_msg_id] 仅标记已读指定之后(含)的消息 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -1045,6 +1046,7 @@ class DialogController extends AbstractController $user = User::auth(); $dialogId = intval(Request::input('dialog_id')); $type = Request::input('type'); + $afterMsgId = intval(Request::input('after_msg_id')); $dialogUser = WebSocketDialogUser::whereUserid($user->userid)->whereDialogId($dialogId)->first(); if (!$dialogUser) { return Base::retError("会话不存在"); @@ -1054,27 +1056,31 @@ class DialogController extends AbstractController ]; switch ($type) { case 'read': + $data['mark_unread'] = 0; $data['unread'] = 0; - $data['first_umid'] = 0; - WebSocketDialogMsgRead::whereUserid($user->userid) - ->whereReadAt(null) - ->whereDialogId($dialogId) - ->chunkById(100, function ($list) { - WebSocketDialogMsgRead::onlyMarkRead($list); - }); - $dialogUser->mark_unread = 0; - $dialogUser->save(); + $data['mention'] = 0; + $builder = WebSocketDialogMsgRead::whereUserid($user->userid)->whereReadAt(null)->whereDialogId($dialogId); + if ($afterMsgId > 0) { + $unBuilder = $builder->clone()->where('msg_id', '<', $afterMsgId); + $data['unread'] = $unBuilder->count(); + $data['mention'] = $data['unread'] > 0 ? $unBuilder->whereMention(1)->count() : 0; + $builder->where('msg_id', '>=', $afterMsgId); + } + $builder->chunkById(100, function ($list) { + WebSocketDialogMsgRead::onlyMarkRead($list); + }); + $data['position_msgs'] = WebSocketDialog::find($dialogId)?->getPositionMsgs($user->userid) ?: []; break; case 'unread': - $dialogUser->mark_unread = 1; - $dialogUser->save(); + $data['mark_unread'] = 1; break; default: return Base::retError("参数错误"); } - $data['mark_unread'] = $dialogUser->mark_unread; + $dialogUser->mark_unread = $data['mark_unread']; + $dialogUser->save(); return Base::retSuccess("success", $data); } diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 8b8ceab51..382d49865 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -76,16 +76,16 @@ class WebSocketDialog extends AbstractModel // 最后消息 $this->last_msg = WebSocketDialogMsg::whereDialogId($this->id)->orderByDesc('id')->first(); // 未读信息 - $unreadBuilder = WebSocketDialogMsgRead::whereDialogId($this->id)->whereUserid($userid)->whereReadAt(null); - $this->unread = $unreadBuilder->count(); + $unBuilder = WebSocketDialogMsgRead::whereDialogId($this->id)->whereUserid($userid)->whereReadAt(null); + $this->unread = $unBuilder->count(); $this->mention = 0; $this->last_umid = 0; - $this->first_umid = 0; // 第一条未读消息 + $this->position_msgs = []; if ($this->unread > 0) { - $this->mention = $unreadBuilder->clone()->whereMention(1)->count(); - $this->last_umid = intval($unreadBuilder->clone()->orderByDesc('msg_id')->value('msg_id')); + $this->mention = $unBuilder->clone()->whereMention(1)->count(); + $this->last_umid = intval($unBuilder->clone()->orderByDesc('msg_id')->value('msg_id')); if ($hasData === true) { - $this->first_umid = intval($unreadBuilder->clone()->orderBy('msg_id')->value('msg_id')); + $this->position_msgs = $this->getPositionMsgs($userid); } } $this->mark_unread = $this->mark_unread ?? $dialogUserFun('mark_unread'); @@ -156,6 +156,34 @@ class WebSocketDialog extends AbstractModel return $this; } + /** + * 获取定位消息 + * @param $userid + * @return array[] + */ + public function getPositionMsgs($userid) + { + $builder = WebSocketDialogMsgRead::whereDialogId($this->id)->whereUserid($userid)->whereReadAt(null); + $array = []; + // @我的消息 + $mention_id = intval($builder->clone()->whereMention(1)->orderByDesc('msg_id')->value('msg_id')); + if ($mention_id > 0) { + $array[] = [ + 'msg_id' => $mention_id, + 'label' => Base::Lang('@我的消息'), + ]; + } + // 最早一条未读消息 + $first_id = intval($builder->clone()->orderBy('msg_id')->value('msg_id')); + if ($first_id > 0) { + $array[] = [ + 'msg_id' => $first_id, + 'label' => 'unread' + ]; + } + return $array; + } + /** * 加入聊天室 * @param int|array $userid 加入的会员ID或会员ID组 diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 1f5636971..74c7bdd3a 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -99,10 +99,11 @@ -