代码提交
This commit is contained in:
@@ -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]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user