request->param('page', 1); $limit = $this->request->param('limit', 10); $accountId = $this->getUserInfo('s2_accountId'); if (empty($accountId)) { return ResponseHelper::error('请先登录'); } $friends = Db::table('s2_wechat_friend') ->where(['accountId' => $accountId, 'isDeleted' => 0]) ->column('id,nickname,avatar'); // 构建好友子查询 $friendSubQuery = Db::table('s2_wechat_friend') ->where(['accountId' => $accountId, 'isDeleted' => 0]) ->field('id') ->buildSql(); // 使用 UNION 合并群聊和好友消息,然后统一排序和分页 $unionQuery = " (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime, 2 as msgType, wc.nickname, wc.chatroomAvatar as avatar FROM s2_wechat_chatroom wc LEFT JOIN s2_wechat_message m ON wc.id = m.wechatChatroomId WHERE wc.accountId = {$accountId} AND m.type = 2 AND wc.isDeleted = 0 GROUP BY m.wechatChatroomId) UNION ALL (SELECT m.id, m.content, m.wechatFriendId, m.wechatChatroomId, m.createTime, m.wechatTime, 1 as msgType, 1 as nickname, 1 avatar FROM s2_wechat_message m WHERE m.type = 1 AND m.wechatFriendId IN {$friendSubQuery} GROUP BY m.wechatFriendId) ORDER BY createTime DESC LIMIT " . (($page - 1) * $limit) . ", {$limit} "; $list = Db::query($unionQuery); // 批量统计未读数量(isRead=0),按好友/群聊分别聚合 $friendIds = []; $chatroomIds = []; foreach ($list as $row) { if (!empty($row['wechatFriendId'])) { $friendIds[] = $row['wechatFriendId']; } if (!empty($row['wechatChatroomId'])) { $chatroomIds[] = $row['wechatChatroomId']; } } $friendIds = array_values(array_unique(array_filter($friendIds))); $chatroomIds = array_values(array_unique(array_filter($chatroomIds))); $friendUnreadMap = []; if (!empty($friendIds)) { $friendUnreadMap = Db::table('s2_wechat_message') ->where(['isRead' => 0]) ->whereIn('wechatFriendId', $friendIds) ->group('wechatFriendId') ->column('COUNT(*) AS cnt', 'wechatFriendId'); } $chatroomUnreadMap = []; if (!empty($chatroomIds)) { $chatroomUnreadMap = Db::table('s2_wechat_message') ->where(['isRead' => 0]) ->whereIn('wechatChatroomId', $chatroomIds) ->group('wechatChatroomId') ->column('COUNT(*) AS cnt', 'wechatChatroomId'); } foreach ($list as $k => &$v) { $createTime = !empty($v['createTime']) ? date('Y-m-d H:i:s', $v['createTime']) : ''; $wechatTime = !empty($v['wechatTime']) ? date('Y-m-d H:i:s', $v['wechatTime']) : ''; $vunreadCount = 0; if (!empty($v['wechatFriendId'])) { $v['nickname'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['nickname'] : ''; $v['avatar'] = !empty($friends[$v['wechatFriendId']]) ? $friends[$v['wechatFriendId']]['avatar'] : ''; $vunreadCount = isset($friendUnreadMap[$v['wechatFriendId']]) ? (int)$friendUnreadMap[$v['wechatFriendId']] : 0; } if (!empty($v['wechatChatroomId'])) { $vunreadCount = isset($chatroomUnreadMap[$v['wechatChatroomId']]) ? (int)$chatroomUnreadMap[$v['wechatChatroomId']] : 0; } $v['id'] = !empty($v['wechatFriendId']) ? $v['wechatFriendId'] : $v['wechatChatroomId']; $v['config'] = [ 'vunreadCount' => $vunreadCount, 'chat' => true, 'msgTime' => $v['wechatTime'], ]; $v['createTime'] = $createTime; $v['wechatTime'] = $wechatTime; unset($v['wechatFriendId'],$v['wechatChatroomId']); } unset($v); return ResponseHelper::success($list); } public function readMessage() { $wechatFriendId = $this->request->param('wechatFriendId', ''); $wechatChatroomId = $this->request->param('wechatChatroomId', ''); $accountId = $this->getUserInfo('s2_accountId'); if (empty($accountId)) { return ResponseHelper::error('请先登录'); } if (empty($wechatChatroomId) && empty($wechatFriendId)) { return ResponseHelper::error('参数缺失'); } $where = []; if (!empty($wechatChatroomId)) { $where[] = ['wechatChatroomId', '=', $wechatChatroomId]; } if (!empty($wechatFriendId)) { $where[] = ['wechatFriendId', '=', $wechatFriendId]; } Db::table('s2_wechat_message')->where($where)->update(['isRead' => 1]); return ResponseHelper::success([]); } public function details() { $wechatFriendId = $this->request->param('wechatFriendId', ''); $wechatChatroomId = $this->request->param('wechatChatroomId', ''); $wechatAccountId = $this->request->param('wechatAccountId', ''); $page = $this->request->param('page', 1); $limit = $this->request->param('limit', 10); $from = $this->request->param('From', ''); $to = $this->request->param('To', ''); $olderData = $this->request->param('olderData', false); $accountId = $this->getUserInfo('s2_accountId'); if (empty($accountId)) { return ResponseHelper::error('请先登录'); } if (empty($wechatChatroomId) && empty($wechatFriendId)) { return ResponseHelper::error('参数缺失'); } $where = []; if (!empty($wechatChatroomId)) { $where[] = ['wechatChatroomId', '=', $wechatChatroomId]; } if (!empty($wechatFriendId)) { $where[] = ['wechatFriendId', '=', $wechatFriendId]; } if (!empty($From) && !empty($To)) { $where[] = ['wechatTime', 'between', [$from, $to]]; } $total = Db::table('s2_wechat_message')->where($where)->count(); $list = Db::table('s2_wechat_message')->where($where)->page($page, $limit)->order('id DESC')->select(); foreach ($list as $k => &$v) { $v['wechatTime'] = !empty($v['wechatTime']) ? date('Y-m-d H:i:s', $v['wechatTime']) : ''; } return ResponseHelper::success(['total' => $total, 'list' => $list]); } }