diff --git a/Server/application/chukebao/controller/MessageController.php b/Server/application/chukebao/controller/MessageController.php index 6d7de2a6..2898bb6d 100644 --- a/Server/application/chukebao/controller/MessageController.php +++ b/Server/application/chukebao/controller/MessageController.php @@ -8,67 +8,102 @@ use think\Db; class MessageController extends BaseController { - public function getList(){ + public function getList() + { $page = $this->request->param('page', 1); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', 10); $accountId = $this->getUserInfo('s2_accountId'); - if (empty($accountId)){ + if (empty($accountId)) { return ResponseHelper::error('请先登录'); } - $chatroomList = Db::table('s2_wechat_chatroom')->alias('wc') - ->join(['s2_wechat_message' => 'm'], 'wc.id = m.wechatChatroomId', 'LEFT') - ->where(['wc.accountId' => $accountId,'m.type' => 2,' wc.isDeleted' => 0]) - ->order('m.id desc') - ->group('m.wechatChatroomId') - ->page($page, $limit) - ->select(); - $friendIds = Db::table('s2_wechat_friend') - ->where(['accountId' => $accountId,' isDeleted' => 0]) - ->group('id') - ->column('id'); - $friendList = Db::table('s2_wechat_message') - ->where(['type' => 1]) - ->whereIn('wechatFriendId',$friendIds) - ->order('id desc') - ->group('wechatFriendId') - ->page($page, $limit) - ->select(); - - $list = array_merge($chatroomList,$friendList); - - // 按createTime字段从大到小排序 - usort($list, function($a, $b) { - return $b['createTime'] <=> $a['createTime']; - }); + $friends = Db::table('s2_wechat_friend') + ->where(['accountId' => $accountId, 'isDeleted' => 0]) + ->column('id,nickname,avatar'); - foreach ($list as $k=>&$v){ - $v['createTime'] = !empty($v['createTime']) ? date('Y-m-d H:i:s',$v['createTime']) : ''; - $v['wechatTime'] = !empty($v['wechatTime']) ? date('Y-m-d H:i:s',$v['wechatTime']) : ''; + // 构建好友子查询 + $friendSubQuery = Db::table('s2_wechat_friend') + ->where(['accountId' => $accountId, 'isDeleted' => 0]) + ->field('id') + ->buildSql(); - if (!empty($v['wechatFriendId'])){ - $friend = Db::table('s2_wechat_friend') - ->where(['id'=>$v['wechatFriendId']]) - ->field('id,nickname,avatar') - ->find(); - $v['msgInfo'] = $friend; - $v['unreadCount'] = Db::table('s2_wechat_message') - ->where(['wechatFriendId' => $v['wechatFriendId'],'isRead' => 0]) - ->count(); + // 使用 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'])){ - $chatroom = Db::table('s2_wechat_chatroom') - ->where(['id'=>$v['wechatChatroomId']]) - ->field('id,nickname,chatroomAvatar as avatar') - ->find(); - $v['msgInfo'] = $chatroom; - $v['unreadCount'] = Db::table('s2_wechat_message') - ->where(['wechatChatroomId' => $v['wechatChatroomId'],'isRead' => 0]) - ->count(); + 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); @@ -76,24 +111,25 @@ class MessageController extends BaseController } - public function readMessage(){ + public function readMessage() + { $wechatFriendId = $this->request->param('wechatFriendId', ''); - $wechatChatroomId = $this->request->param('wechatChatroomId', ''); + $wechatChatroomId = $this->request->param('wechatChatroomId', ''); $accountId = $this->getUserInfo('s2_accountId'); - if (empty($accountId)){ + if (empty($accountId)) { return ResponseHelper::error('请先登录'); } - if (empty($wechatChatroomId) && empty($wechatFriendId)){ + if (empty($wechatChatroomId) && empty($wechatFriendId)) { return ResponseHelper::error('参数缺失'); } $where = []; - if (!empty($wechatChatroomId)){ - $where[] = ['wechatChatroomId','=',$wechatChatroomId]; + if (!empty($wechatChatroomId)) { + $where[] = ['wechatChatroomId', '=', $wechatChatroomId]; } - if (!empty($wechatFriendId)){ - $where[] = ['wechatFriendId','=',$wechatFriendId]; + if (!empty($wechatFriendId)) { + $where[] = ['wechatFriendId', '=', $wechatFriendId]; } Db::table('s2_wechat_message')->where($where)->update(['isRead' => 1]); @@ -101,49 +137,47 @@ class MessageController extends BaseController } - - - public function details(){ + 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); + $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)){ + if (empty($accountId)) { return ResponseHelper::error('请先登录'); } - if (empty($wechatChatroomId) && empty($wechatFriendId)){ + if (empty($wechatChatroomId) && empty($wechatFriendId)) { return ResponseHelper::error('参数缺失'); } $where = []; - if (!empty($wechatChatroomId)){ - $where[] = ['wechatChatroomId','=',$wechatChatroomId]; + if (!empty($wechatChatroomId)) { + $where[] = ['wechatChatroomId', '=', $wechatChatroomId]; } - if (!empty($wechatFriendId)){ - $where[] = ['wechatFriendId','=',$wechatFriendId]; + if (!empty($wechatFriendId)) { + $where[] = ['wechatFriendId', '=', $wechatFriendId]; } - if (!empty($From) && !empty($To)){ - $where[] = ['wechatTime','between',[$from,$to]]; + 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(); + $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']) : ''; + 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]); + return ResponseHelper::success(['total' => $total, 'list' => $list]); } diff --git a/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php b/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php index 39ca9149..8499c6e6 100644 --- a/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php +++ b/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php @@ -22,19 +22,19 @@ class GetChatroomListV1Controller extends BaseController $keyword = $this->request->param('keyword', ''); try { - /*$companyId = (int)$this->getUserInfo('companyId'); + $companyId = (int)$this->getUserInfo('companyId'); $wechatIds = Db::name('device')->alias('d') // 仅关联每个设备在 device_wechat_login 中的最新一条记录 ->join('(SELECT MAX(id) AS id, deviceId FROM ck_device_wechat_login WHERE companyId='.$companyId.' GROUP BY deviceId) dwl_max','dwl_max.deviceId = d.id') ->join('device_wechat_login dwl','dwl.id = dwl_max.id') ->where(['d.companyId' => $companyId,'d.deleteTime' => 0]) - ->column('dwl.wechatId');*/ + ->column('dwl.wechatId'); - $wechatIds = Db::name('device')->alias('d') + /* $wechatIds = Db::name('device')->alias('d') ->join('device_wechat_login dwl','dwl.deviceId=d.id AND dwl.companyId='.$this->getUserInfo('companyId')) ->where(['d.companyId' => $this->getUserInfo('companyId'),'d.deleteTime' => 0]) - ->column('dwl.wechatId'); + ->column('dwl.wechatId');*/ $where = []; diff --git a/Server/application/cunkebao/controller/friend/GetFriendListV1Controller.php b/Server/application/cunkebao/controller/friend/GetFriendListV1Controller.php index 3222d7db..dc7a525f 100644 --- a/Server/application/cunkebao/controller/friend/GetFriendListV1Controller.php +++ b/Server/application/cunkebao/controller/friend/GetFriendListV1Controller.php @@ -42,16 +42,20 @@ class GetFriendListV1Controller extends BaseController $where[] = ['nickname|alias|wechatId','like','%'.$keyword.'%']; } - $wechatIds = Db::name('device')->alias('d') + /* $wechatIds = Db::name('device')->alias('d') ->join('device_wechat_login dwl','dwl.deviceId=d.id AND dwl.companyId='.$this->getUserInfo('companyId')) - ->where(['d.companyId' => $this->getUserInfo('companyId'),'d.deleteTime' => 0])->group('dwl.deviceId')->order('dwl.id desc'); + ->where(['d.companyId' => $this->getUserInfo('companyId'),'d.deleteTime' => 0]) + ->group('dwl.deviceId') + ->order('dwl.id desc');*/ - /*$wechatIds = Db::name('device')->alias('d') + $companyId = $this->getUserInfo('companyId'); + + $wechatIds = Db::name('device')->alias('d') // 仅关联每个设备在 device_wechat_login 中的最新一条记录 ->join('(SELECT MAX(id) AS id, deviceId FROM ck_device_wechat_login WHERE companyId='.$companyId.' GROUP BY deviceId) dwl_max','dwl_max.deviceId = d.id') ->join('device_wechat_login dwl','dwl.id = dwl_max.id') - ->where(['d.companyId' => $companyId,'d.deleteTime' => 0]);*/ + ->where(['d.companyId' => $companyId,'d.deleteTime' => 0]); if (!empty($deviceIds)){ @@ -59,7 +63,6 @@ class GetFriendListV1Controller extends BaseController } $wechatIds = $wechatIds->column('dwl.wechatId'); - $where[] = ['ownerWechatId','in',$wechatIds]; $data = Db::table('s2_wechat_friend')