2020-11-04 11:57:16 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
2020-11-04 16:47:17 +08:00
|
|
|
|
namespace App\Service;
|
2020-11-04 11:57:16 +08:00
|
|
|
|
|
2021-05-21 22:56:42 +08:00
|
|
|
|
use App\Cache\ServerRunID;
|
2021-07-01 23:10:18 +08:00
|
|
|
|
use App\Constants\FileMediaType;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
use App\Constants\TalkMsgType;
|
|
|
|
|
use App\Constants\TalkType;
|
2021-05-20 22:23:48 +08:00
|
|
|
|
use Exception;
|
|
|
|
|
use App\Model\User;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
use App\Model\TalkList;
|
2021-05-20 22:23:48 +08:00
|
|
|
|
use App\Model\UsersFriend;
|
|
|
|
|
use App\Model\Group\Group;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
use App\Model\Chat\TalkRecords;
|
|
|
|
|
use App\Model\Chat\TalkRecordsCode;
|
|
|
|
|
use App\Model\Chat\TalkRecordsFile;
|
|
|
|
|
use App\Model\Chat\TalkRecordsForward;
|
|
|
|
|
use App\Model\Chat\TalkRecordsInvite;
|
2020-11-09 22:59:25 +08:00
|
|
|
|
use App\Traits\PagingTrait;
|
|
|
|
|
use Hyperf\DbConnection\Db;
|
2021-05-20 22:23:48 +08:00
|
|
|
|
use App\Cache\FriendRemark;
|
|
|
|
|
use App\Cache\LastMessage;
|
|
|
|
|
use App\Cache\UnreadTalk;
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2020-11-04 11:57:16 +08:00
|
|
|
|
class TalkService extends BaseService
|
|
|
|
|
{
|
2020-11-09 22:59:25 +08:00
|
|
|
|
use PagingTrait;
|
|
|
|
|
|
2021-07-06 23:32:14 +08:00
|
|
|
|
/**
|
|
|
|
|
* 获取好友备注
|
|
|
|
|
*
|
|
|
|
|
* @param int $user_id 用户ID
|
|
|
|
|
* @param int $friend_id 好友ID
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function getFriendRemark(int $user_id, int $friend_id)
|
|
|
|
|
{
|
|
|
|
|
$remark = FriendRemark::getInstance()->read($user_id, $friend_id);
|
|
|
|
|
if ($remark) return $remark;
|
|
|
|
|
|
|
|
|
|
$remark = UsersFriend::where('user_id', $user_id)->where('friend_id', $friend_id)->value('remark');
|
|
|
|
|
if ($remark) FriendRemark::getInstance()->save($user_id, $friend_id, $remark);
|
|
|
|
|
|
|
|
|
|
return (string)$remark;
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-09 22:59:25 +08:00
|
|
|
|
/**
|
|
|
|
|
* 获取用户的聊天列表
|
|
|
|
|
*
|
|
|
|
|
* @param int $user_id 用户ID
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function talks(int $user_id)
|
|
|
|
|
{
|
|
|
|
|
$filed = [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'list.id', 'list.talk_type', 'list.receiver_id', 'list.updated_at', 'list.is_disturb', 'list.is_top',
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'users.avatar as user_avatar', 'users.nickname',
|
|
|
|
|
'group.group_name', 'group.avatar as group_avatar'
|
|
|
|
|
];
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rows = TalkList::from('talk_list as list')
|
|
|
|
|
->leftJoin('users', function ($join) {
|
|
|
|
|
$join->on('users.id', '=', 'list.receiver_id')->where('list.talk_type', '=', TalkType::PRIVATE_CHAT);
|
|
|
|
|
})
|
|
|
|
|
->leftJoin('group', function ($join) {
|
|
|
|
|
$join->on('group.id', '=', 'list.receiver_id')->where('list.talk_type', '=', TalkType::GROUP_CHAT);
|
|
|
|
|
})
|
|
|
|
|
->where('list.user_id', $user_id)
|
|
|
|
|
->where('list.is_delete', 0)
|
|
|
|
|
->orderBy('list.updated_at', 'desc')
|
2020-11-09 22:59:25 +08:00
|
|
|
|
->get($filed)
|
|
|
|
|
->toArray();
|
|
|
|
|
|
2021-03-25 17:32:36 +08:00
|
|
|
|
if (!$rows) return [];
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
2020-11-29 14:44:11 +08:00
|
|
|
|
$socketFDService = make(SocketClientService::class);
|
2021-05-21 22:56:42 +08:00
|
|
|
|
$runIdAll = ServerRunID::getInstance()->getServerRunIdAll();
|
2020-11-22 23:10:00 +08:00
|
|
|
|
|
2021-04-22 16:14:34 +08:00
|
|
|
|
return array_map(function ($item) use ($user_id, $socketFDService, $runIdAll) {
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$data['id'] = $item['id'];
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$data['talk_type'] = $item['talk_type'];
|
|
|
|
|
$data['receiver_id'] = $item['receiver_id'];
|
|
|
|
|
$data['avatar'] = ''; // 默认头像
|
|
|
|
|
$data['name'] = ''; // 对方昵称/群名称
|
|
|
|
|
$data['remark_name'] = ''; // 好友备注
|
|
|
|
|
$data['unread_num'] = 0; // 未读消息
|
|
|
|
|
$data['is_online'] = false; // 是否在线
|
|
|
|
|
$data['is_top'] = $item['is_top'];
|
|
|
|
|
$data['is_disturb'] = $item['is_disturb'];
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$data['msg_text'] = '......';
|
2021-07-06 23:32:14 +08:00
|
|
|
|
$data['updated_at'] = $item['updated_at'] ?: '2020-01-01 00:00:00';
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($item['talk_type'] == TalkType::PRIVATE_CHAT) {
|
2021-07-06 23:32:14 +08:00
|
|
|
|
$data['name'] = $item['nickname'];
|
|
|
|
|
$data['avatar'] = $item['user_avatar'];
|
|
|
|
|
$data['unread_num'] = UnreadTalk::getInstance()->read($item['receiver_id'], $user_id);
|
|
|
|
|
$data['is_online'] = $socketFDService->isOnlineAll($item['receiver_id'], $runIdAll);
|
|
|
|
|
$data['remark_name'] = $this->getFriendRemark($user_id, (int)$item['receiver_id']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
} else {
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$data['name'] = strval($item['group_name']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$data['avatar'] = $item['group_avatar'];
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$records = LastMessage::getInstance()->read($data['talk_type'], $user_id, $data['receiver_id']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if ($records) {
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$data['msg_text'] = $records['text'];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$data['updated_at'] = $records['created_at'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
|
}, $rows);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步未读的消息到数据库中
|
|
|
|
|
*
|
|
|
|
|
* @param int $user_id 用户ID
|
2021-04-20 16:30:57 +08:00
|
|
|
|
* @param $data
|
2020-11-09 22:59:25 +08:00
|
|
|
|
*/
|
|
|
|
|
public function updateUnreadTalkList(int $user_id, $data)
|
|
|
|
|
{
|
|
|
|
|
foreach ($data as $friend_id => $num) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
TalkList::updateOrCreate([
|
|
|
|
|
'talk_type' => TalkType::PRIVATE_CHAT,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'receiver_id' => $friend_id,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
], [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'is_delete' => 0,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
|
'updated_at' => date('Y-m-d H:i:s')
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理聊天记录信息
|
|
|
|
|
*
|
|
|
|
|
* @param array $rows 聊天记录
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function handleChatRecords(array $rows)
|
|
|
|
|
{
|
2020-12-01 13:54:40 +08:00
|
|
|
|
if (empty($rows)) return [];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
$files = $codes = $forwards = $invites = [];
|
|
|
|
|
foreach ($rows as $value) {
|
|
|
|
|
switch ($value['msg_type']) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::FILE_MESSAGE:
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$files[] = $value['id'];
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::GROUP_INVITE_MESSAGE:
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$invites[] = $value['id'];
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::FORWARD_MESSAGE:
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$forwards[] = $value['id'];
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::CODE_MESSAGE:
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$codes[] = $value['id'];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查询聊天文件信息
|
|
|
|
|
if ($files) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$files = TalkRecordsFile::whereIn('record_id', $files)->get(['id', 'record_id', 'user_id', 'file_source', 'file_type', 'save_type', 'original_name', 'file_suffix', 'file_size', 'save_dir'])->keyBy('record_id')->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查询群聊邀请信息
|
|
|
|
|
if ($invites) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$invites = TalkRecordsInvite::whereIn('record_id', $invites)->get(['record_id', 'type', 'operate_user_id', 'user_ids'])->keyBy('record_id')->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查询代码块消息
|
|
|
|
|
if ($codes) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$codes = TalkRecordsCode::whereIn('record_id', $codes)->get(['record_id', 'code_lang', 'code'])->keyBy('record_id')->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查询消息转发信息
|
|
|
|
|
if ($forwards) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$forwards = TalkRecordsForward::whereIn('record_id', $forwards)->get(['record_id', 'records_id', 'text'])->keyBy('record_id')->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($rows as $k => $row) {
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$rows[$k]['file'] = [];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$rows[$k]['code_block'] = [];
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$rows[$k]['forward'] = [];
|
|
|
|
|
$rows[$k]['invite'] = [];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
switch ($row['msg_type']) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::FILE_MESSAGE:// 文件消息
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$rows[$k]['file'] = $files[$row['id']] ?? [];
|
|
|
|
|
if ($rows[$k]['file']) {
|
|
|
|
|
$rows[$k]['file']['file_url'] = get_media_url($rows[$k]['file']['save_dir']);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
|
|
|
|
|
case TalkMsgType::FORWARD_MESSAGE:// 会话记录消息
|
|
|
|
|
if (isset($forwards[$row['id']])) {
|
|
|
|
|
$rows[$k]['forward'] = [
|
|
|
|
|
'num' => substr_count($forwards[$row['id']]['records_id'], ',') + 1,
|
|
|
|
|
'list' => json_decode($forwards[$row['id']]['text'], true) ?? []
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case TalkMsgType::CODE_MESSAGE:// 代码块消息
|
|
|
|
|
$rows[$k]['code_block'] = $codes[$row['id']] ?? [];
|
|
|
|
|
if ($rows[$k]['code_block']) {
|
|
|
|
|
$rows[$k]['code_block']['code'] = htmlspecialchars_decode($rows[$k]['code_block']['code']);
|
|
|
|
|
unset($rows[$k]['code_block']['record_id']);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case TalkMsgType::GROUP_INVITE_MESSAGE:// 入群消息/退群消息
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if (isset($invites[$row['id']])) {
|
|
|
|
|
$rows[$k]['invite'] = [
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'type' => $invites[$row['id']]['type'],
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'operate_user' => [
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'id' => $invites[$row['id']]['operate_user_id'],
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'nickname' => User::where('id', $invites[$row['id']]['operate_user_id'])->value('nickname')
|
|
|
|
|
],
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'users' => []
|
2020-11-09 22:59:25 +08:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if ($rows[$k]['invite']['type'] == 1 || $rows[$k]['invite']['type'] == 3) {
|
2020-12-01 13:54:40 +08:00
|
|
|
|
$rows[$k]['invite']['users'] = User::select('id', 'nickname')->whereIn('id', parse_ids($invites[$row['id']]['user_ids']))->get()->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
} else {
|
|
|
|
|
$rows[$k]['invite']['users'] = $rows[$k]['invite']['operate_user'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unset($files, $codes, $forwards, $invites);
|
|
|
|
|
return $rows;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询对话页面的历史聊天记录
|
|
|
|
|
*
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param int $user_id 用户ID
|
|
|
|
|
* @param int $receiver_id 接收者ID(好友ID或群ID)
|
|
|
|
|
* @param int $talk_type 对话类型[1:好友消息;2:群聊消息;]
|
|
|
|
|
* @param int $record_id 上一次查询的聊天记录ID
|
|
|
|
|
* @param int $limit 查询数据长度
|
|
|
|
|
* @param array $msg_type 消息类型
|
2020-12-03 11:57:46 +08:00
|
|
|
|
* @return array
|
2020-11-09 22:59:25 +08:00
|
|
|
|
*/
|
2021-07-05 21:52:44 +08:00
|
|
|
|
public function getChatRecords(int $user_id, int $receiver_id, int $talk_type, int $record_id, $limit = 30, $msg_type = [])
|
2020-11-09 22:59:25 +08:00
|
|
|
|
{
|
|
|
|
|
$fields = [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'talk_records.id',
|
|
|
|
|
'talk_records.talk_type',
|
|
|
|
|
'talk_records.msg_type',
|
|
|
|
|
'talk_records.user_id',
|
|
|
|
|
'talk_records.receiver_id',
|
|
|
|
|
'talk_records.is_revoke',
|
|
|
|
|
'talk_records.content',
|
|
|
|
|
'talk_records.created_at',
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'users.nickname',
|
|
|
|
|
'users.avatar as avatar',
|
|
|
|
|
];
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj = TalkRecords::select($fields);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->leftJoin('users', 'users.id', '=', 'talk_records.user_id');
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if ($record_id) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->where('talk_records.id', '<', $record_id);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($talk_type == TalkType::PRIVATE_CHAT) {
|
|
|
|
|
$rowsSqlObj->where(function ($query) use ($user_id, $receiver_id) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$query->where([
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['talk_records.user_id', '=', $user_id],
|
|
|
|
|
['talk_records.receiver_id', '=', $receiver_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
])->orWhere([
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['talk_records.user_id', '=', $receiver_id],
|
|
|
|
|
['talk_records.receiver_id', '=', $user_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
} else {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->where('talk_records.receiver_id', $receiver_id);
|
|
|
|
|
$rowsSqlObj->where('talk_records.talk_type', $talk_type);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($msg_type) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->whereIn('talk_records.msg_type', $msg_type);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//过滤用户删除记录
|
|
|
|
|
$rowsSqlObj->whereNotExists(function ($query) use ($user_id) {
|
|
|
|
|
$prefix = config('databases.default.prefix');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$query->select(Db::raw(1))->from('talk_records_delete');
|
|
|
|
|
$query->whereRaw("{$prefix}talk_records_delete.record_id = {$prefix}talk_records.id and {$prefix}talk_records_delete.user_id = {$user_id}");
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$query->limit(1);
|
|
|
|
|
});
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
return $this->handleChatRecords(
|
|
|
|
|
$rowsSqlObj->orderBy('talk_records.id', 'desc')->limit($limit)->get()->toArray()
|
|
|
|
|
);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取转发会话记录信息
|
|
|
|
|
*
|
2021-04-20 16:30:57 +08:00
|
|
|
|
* @param int $user_id 用户ID
|
2020-11-09 22:59:25 +08:00
|
|
|
|
* @param int $record_id 聊天记录ID
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function getForwardRecords(int $user_id, int $record_id)
|
|
|
|
|
{
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$result = TalkRecords::where('id', $record_id)->first([
|
|
|
|
|
'id', 'talk_type', 'msg_type', 'user_id', 'receiver_id', 'content', 'is_revoke', 'created_at'
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
|
|
|
|
|
2021-04-22 16:54:01 +08:00
|
|
|
|
// 判断是否有权限查看
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($result->talk_type == TalkType::PRIVATE_CHAT && ($result->user_id != $user_id && $result->receiver_id != $user_id)) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [];
|
2021-07-05 21:52:44 +08:00
|
|
|
|
} else if ($result->talk_type == TalkType::GROUP_CHAT && !Group::isMember($result->receiver_id, $user_id)) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$forward = TalkRecordsForward::where('record_id', $record_id)->first();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
$fields = [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'talk_records.id',
|
|
|
|
|
'talk_records.talk_type',
|
|
|
|
|
'talk_records.msg_type',
|
|
|
|
|
'talk_records.user_id',
|
|
|
|
|
'talk_records.receiver_id',
|
|
|
|
|
'talk_records.is_revoke',
|
|
|
|
|
'talk_records.content',
|
|
|
|
|
'talk_records.created_at',
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'users.nickname',
|
|
|
|
|
'users.avatar as avatar',
|
|
|
|
|
];
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj = TalkRecords::select($fields);
|
|
|
|
|
$rowsSqlObj->leftJoin('users', 'users.id', '=', 'talk_records.user_id');
|
|
|
|
|
$rowsSqlObj->whereIn('talk_records.id', explode(',', $forward->records_id));
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
return $this->handleChatRecords($rowsSqlObj->get()->toArray());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量删除聊天消息
|
|
|
|
|
*
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param int $user_id 用户ID
|
|
|
|
|
* @param int $talk_type 对话类型[1:好友消息;2:群聊消息;]
|
|
|
|
|
* @param int $receiver_id 好友ID或者群聊ID
|
|
|
|
|
* @param array $record_ids 聊天记录ID
|
2020-11-09 22:59:25 +08:00
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
2021-07-05 21:52:44 +08:00
|
|
|
|
public function removeRecords(int $user_id, int $talk_type, int $receiver_id, array $record_ids)
|
2020-11-09 22:59:25 +08:00
|
|
|
|
{
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($talk_type == TalkType::PRIVATE_CHAT) {// 私聊信息
|
|
|
|
|
$ids = TalkRecords::whereIn('id', $record_ids)->where(function ($query) use ($user_id, $receiver_id) {
|
|
|
|
|
$query->where([['user_id', '=', $user_id], ['receiver_id', '=', $receiver_id]])
|
|
|
|
|
->orWhere([['user_id', '=', $receiver_id], ['receiver_id', '=', $user_id]]);
|
|
|
|
|
})->where('talk_type', $talk_type)->pluck('id');
|
2021-04-22 16:54:01 +08:00
|
|
|
|
} else {// 群聊信息
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$ids = TalkRecords::whereIn('id', $record_ids)->where('talk_type', TalkType::GROUP_CHAT)->pluck('id');
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判断要删除的消息在数据库中是否存在
|
|
|
|
|
if (count($ids) != count($record_ids)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 判读是否属于群消息并且判断是否是群成员
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($talk_type == TalkType::GROUP_CHAT && !Group::isMember($receiver_id, $user_id)) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$data = array_map(function ($record_id) use ($user_id) {
|
|
|
|
|
return [
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'record_id' => $record_id,
|
|
|
|
|
'user_id' => $user_id,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
|
];
|
|
|
|
|
}, $ids->toArray());
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
return Db::table('talk_records_delete')->insert($data);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 撤回单条聊天消息
|
|
|
|
|
*
|
2021-04-20 16:30:57 +08:00
|
|
|
|
* @param int $user_id 用户ID
|
2020-11-09 22:59:25 +08:00
|
|
|
|
* @param int $record_id 聊天记录ID
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public function revokeRecord(int $user_id, int $record_id)
|
|
|
|
|
{
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$result = TalkRecords::where('id', $record_id)->first(['id', 'talk_type', 'user_id', 'receiver_id', 'created_at']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if (!$result) return [false, '消息记录不存在'];
|
|
|
|
|
|
2021-04-22 16:54:01 +08:00
|
|
|
|
// 判断是否在两分钟之内撤回消息,超过2分钟不能撤回消息
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if ((time() - strtotime($result->created_at) > 120)) {
|
|
|
|
|
return [false, '已超过有效的撤回时间', []];
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($result->talk_type == TalkType::PRIVATE_CHAT) {
|
|
|
|
|
if ($result->user_id != $user_id && $result->receiver_id != $user_id) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [false, '非法操作', []];
|
|
|
|
|
}
|
2021-07-05 21:52:44 +08:00
|
|
|
|
} else if ($result->talk_type == TalkType::GROUP_CHAT) {
|
|
|
|
|
if (!Group::isMember($result->receiver_id, $user_id)) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [false, '非法操作', []];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$result->is_revoke = 1;
|
|
|
|
|
$result->save();
|
|
|
|
|
|
|
|
|
|
return [true, '消息已撤回', $result->toArray()];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 转发消息(单条转发)
|
|
|
|
|
*
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param int $user_id 转发的用户ID
|
|
|
|
|
* @param int $record_id 转发消息的记录ID
|
|
|
|
|
* @param array $receiver_ids 接受者数组 例如:[['talk_type' => 1,'id' => 3045]...] 二维数组
|
2020-11-09 22:59:25 +08:00
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2021-07-05 21:52:44 +08:00
|
|
|
|
public function forwardRecords(int $user_id, int $record_id, array $receiver_ids)
|
2020-11-09 22:59:25 +08:00
|
|
|
|
{
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$msgTypeArray = [
|
|
|
|
|
TalkMsgType::TEXT_MESSAGE,
|
|
|
|
|
TalkMsgType::FILE_MESSAGE,
|
|
|
|
|
TalkMsgType::CODE_MESSAGE
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
$result = TalkRecords::where('id', $record_id)->whereIn('msg_type', $msgTypeArray)->first();
|
|
|
|
|
if (!$result) return [];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
// 根据消息类型判断用户是否有转发权限
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($result->talk_type == TalkType::PRIVATE_CHAT) {
|
|
|
|
|
if ($result->user_id != $user_id && $result->receiver_id != $user_id) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [];
|
|
|
|
|
}
|
2021-07-05 21:52:44 +08:00
|
|
|
|
} else if ($result->talk_type == TalkType::GROUP_CHAT) {
|
|
|
|
|
if (!Group::isMember($result->receiver_id, $user_id)) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$fileInfo = $codeBlock = null;
|
|
|
|
|
if ($result->msg_type == TalkMsgType::FILE_MESSAGE) {
|
|
|
|
|
$fileInfo = TalkRecordsFile::where('record_id', $record_id)->first();
|
|
|
|
|
} else if ($result->msg_type == TalkMsgType::CODE_MESSAGE) {
|
|
|
|
|
$codeBlock = TalkRecordsCode::where('record_id', $record_id)->first();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$insRecordIds = [];
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
foreach ($receiver_ids as $item) {
|
|
|
|
|
$res = TalkRecords::create([
|
|
|
|
|
'talk_type' => $item['talk_type'],
|
|
|
|
|
'msg_type' => $result->msg_type,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'receiver_id' => $item['id'],
|
|
|
|
|
'content' => $result->content,
|
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
|
'updated_at' => date('Y-m-d H:i:s'),
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (!$res) {
|
|
|
|
|
throw new Exception('插入消息记录失败');
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$insRecordIds[] = [
|
|
|
|
|
'record_id' => $res->id,
|
|
|
|
|
'receiver_id' => $res->receiver_id,
|
|
|
|
|
'talk_type' => $res->talk_type
|
|
|
|
|
];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($result->msg_type == TalkMsgType::FILE_MESSAGE) {
|
|
|
|
|
if (!TalkRecordsFile::create([
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'record_id' => $res->id,
|
|
|
|
|
'user_id' => $fileInfo->user_id,
|
|
|
|
|
'file_source' => $fileInfo->file_source,
|
|
|
|
|
'file_type' => $fileInfo->file_type,
|
|
|
|
|
'save_type' => $fileInfo->save_type,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'original_name' => $fileInfo->original_name,
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'file_suffix' => $fileInfo->file_suffix,
|
|
|
|
|
'file_size' => $fileInfo->file_size,
|
|
|
|
|
'save_dir' => $fileInfo->save_dir,
|
|
|
|
|
'created_at' => date('Y-m-d H:i:s')
|
2020-11-09 22:59:25 +08:00
|
|
|
|
])) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入文件消息记录失败');
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
2021-07-05 21:52:44 +08:00
|
|
|
|
} else if ($result->msg_type == TalkMsgType::CODE_MESSAGE) {
|
|
|
|
|
if (!TalkRecordsCode::create([
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'record_id' => $res->id,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'code_lang' => $codeBlock->code_lang,
|
|
|
|
|
'code' => $codeBlock->code,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'created_at' => date('Y-m-d H:i:s')
|
|
|
|
|
])) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入代码消息记录失败');
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
Db::rollBack();
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insRecordIds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 转发消息(多条合并转发)
|
|
|
|
|
*
|
2021-04-20 16:30:57 +08:00
|
|
|
|
* @param int $user_id 转发的用户ID
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param int $receiver_id 当前转发消息的所属者(好友ID或者群聊ID)
|
|
|
|
|
* @param int $talk_type 消息来源 1:好友消息 2:群聊消息
|
2020-11-09 22:59:25 +08:00
|
|
|
|
* @param array $records_ids 转发消息的记录ID
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param array $receive_ids 接受者数组 例如:[['talk_type' => 1,'id' => 3045]...] 二维数组
|
|
|
|
|
* @return array
|
2020-11-09 22:59:25 +08:00
|
|
|
|
*/
|
2021-07-05 21:52:44 +08:00
|
|
|
|
public function mergeForwardRecords(int $user_id, int $receiver_id, int $talk_type, array $records_ids, array $receive_ids)
|
2020-11-09 22:59:25 +08:00
|
|
|
|
{
|
|
|
|
|
// 支持转发的消息类型
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$msg_type = [
|
|
|
|
|
TalkMsgType::TEXT_MESSAGE,
|
|
|
|
|
TalkMsgType::FILE_MESSAGE,
|
|
|
|
|
TalkMsgType::CODE_MESSAGE
|
|
|
|
|
];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$sqlObj = TalkRecords::whereIn('id', $records_ids);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if ($talk_type == TalkType::PRIVATE_CHAT) {
|
|
|
|
|
if (!UsersFriend::isFriend($user_id, $receiver_id)) return [];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$sqlObj = $sqlObj->where(function ($query) use ($user_id, $receiver_id) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$query->where([
|
|
|
|
|
['user_id', '=', $user_id],
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['receiver_id', '=', $receiver_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
])->orWhere([
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['user_id', '=', $receiver_id],
|
|
|
|
|
['receiver_id', '=', $user_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
2021-07-05 21:52:44 +08:00
|
|
|
|
})->whereIn('msg_type', $msg_type)->where('talk_type', $talk_type)->where('is_revoke', 0);
|
|
|
|
|
} else {
|
|
|
|
|
if (!Group::isMember($receiver_id, $user_id)) return [];
|
|
|
|
|
|
|
|
|
|
$sqlObj = $sqlObj->where('receiver_id', $receiver_id)->whereIn('msg_type', $msg_type)->where('talk_type', TalkType::GROUP_CHAT)->where('is_revoke', 0);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$result = $sqlObj->get();
|
|
|
|
|
|
2021-04-22 16:14:34 +08:00
|
|
|
|
// 判断消息记录是否存在
|
2020-11-09 22:59:25 +08:00
|
|
|
|
if (count($result) != count($records_ids)) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rows = TalkRecords::leftJoin('users', 'users.id', '=', 'talk_records.user_id')
|
|
|
|
|
->whereIn('talk_records.id', array_slice($records_ids, 0, 3))
|
|
|
|
|
->get(['talk_records.msg_type', 'talk_records.content', 'users.nickname']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
|
|
|
|
$jsonText = [];
|
|
|
|
|
foreach ($rows as $row) {
|
2020-12-02 17:15:32 +08:00
|
|
|
|
switch ($row->msg_type) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::TEXT_MESSAGE:
|
2020-12-02 17:15:32 +08:00
|
|
|
|
$jsonText[] = [
|
|
|
|
|
'nickname' => $row->nickname,
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'text' => mb_substr(str_replace(PHP_EOL, "", $row->content), 0, 30)
|
2020-12-02 17:15:32 +08:00
|
|
|
|
];
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::FILE_MESSAGE:
|
2020-12-02 17:15:32 +08:00
|
|
|
|
$jsonText[] = [
|
|
|
|
|
'nickname' => $row->nickname,
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'text' => '【文件消息】'
|
2020-12-02 17:15:32 +08:00
|
|
|
|
];
|
|
|
|
|
break;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
case TalkMsgType::CODE_MESSAGE:
|
2020-12-02 17:15:32 +08:00
|
|
|
|
$jsonText[] = [
|
|
|
|
|
'nickname' => $row->nickname,
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'text' => '【代码消息】'
|
2020-12-02 17:15:32 +08:00
|
|
|
|
];
|
|
|
|
|
break;
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$insRecordIds = [];
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
|
|
|
|
foreach ($receive_ids as $item) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$res = TalkRecords::create([
|
|
|
|
|
'talk_type' => $item['talk_type'],
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'receiver_id' => $item['id'],
|
|
|
|
|
'msg_type' => TalkMsgType::FORWARD_MESSAGE,
|
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
|
'updated_at' => date('Y-m-d H:i:s'),
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (!$res) {
|
|
|
|
|
throw new Exception('插入消息失败');
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-21 22:47:21 +08:00
|
|
|
|
$insRecordIds[] = [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'record_id' => $res->id,
|
|
|
|
|
'receiver_id' => $res->receiver_id,
|
|
|
|
|
'talk_type' => $res->talk_type
|
2020-11-21 22:47:21 +08:00
|
|
|
|
];
|
2020-11-09 22:59:25 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if (!TalkRecordsForward::create([
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'record_id' => $res->id,
|
|
|
|
|
'user_id' => $user_id,
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'records_id' => implode(',', $records_ids),
|
2021-04-20 16:30:57 +08:00
|
|
|
|
'text' => json_encode($jsonText),
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'created_at' => date('Y-m-d H:i:s'),
|
|
|
|
|
])) {
|
|
|
|
|
throw new Exception('插入转发消息失败');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
Db::rollBack();
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insRecordIds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 关键词搜索聊天记录
|
|
|
|
|
*
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* @param int $user_id 用户ID
|
|
|
|
|
* @param int $receiver_id 接收者ID
|
|
|
|
|
* @param int $talk_type 对话类型[1:私信;2:群聊;]
|
|
|
|
|
* @param int $page 当前查询分页
|
|
|
|
|
* @param int $page_size 分页大小
|
|
|
|
|
* @param array $params 查询参数
|
2021-04-22 16:14:34 +08:00
|
|
|
|
* @return array
|
2020-11-09 22:59:25 +08:00
|
|
|
|
*/
|
2021-07-05 21:52:44 +08:00
|
|
|
|
public function searchRecords(int $user_id, int $receiver_id, int $talk_type, int $page, int $page_size, array $params)
|
2020-11-09 22:59:25 +08:00
|
|
|
|
{
|
|
|
|
|
$fields = [
|
2021-07-05 21:52:44 +08:00
|
|
|
|
'talk_records.id',
|
|
|
|
|
'talk_records.talk_type',
|
|
|
|
|
'talk_records.msg_type',
|
|
|
|
|
'talk_records.user_id',
|
|
|
|
|
'talk_records.receiver_id',
|
|
|
|
|
'talk_records.content',
|
|
|
|
|
'talk_records.is_revoke',
|
|
|
|
|
'talk_records.created_at',
|
2020-11-09 22:59:25 +08:00
|
|
|
|
'users.nickname',
|
|
|
|
|
'users.avatar as avatar',
|
|
|
|
|
];
|
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj = TalkRecords::select($fields)->leftJoin('users', 'users.id', '=', 'talk_records.user_id');
|
|
|
|
|
if ($talk_type == 1) {
|
|
|
|
|
$rowsSqlObj->where(function ($query) use ($user_id, $receiver_id) {
|
2020-11-09 22:59:25 +08:00
|
|
|
|
$query->where([
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['talk_records.user_id', '=', $user_id],
|
|
|
|
|
['talk_records.receiver_id', '=', $receiver_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
])->orWhere([
|
2021-07-05 21:52:44 +08:00
|
|
|
|
['talk_records.user_id', '=', $receiver_id],
|
|
|
|
|
['talk_records.receiver_id', '=', $user_id]
|
2020-11-09 22:59:25 +08:00
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
} else {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->where('talk_records.receiver_id', $receiver_id);
|
|
|
|
|
$rowsSqlObj->where('talk_records.talk_type', $talk_type);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isset($params['keywords'])) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->where('talk_records.content', 'like', "%{$params['keywords']}%");
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isset($params['date'])) {
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rowsSqlObj->whereDate('talk_records.created_at', $params['date']);
|
2020-11-09 22:59:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$count = $rowsSqlObj->count();
|
|
|
|
|
if ($count == 0) {
|
|
|
|
|
return $this->getPagingRows([], 0, $page, $page_size);
|
|
|
|
|
}
|
2020-11-04 11:57:16 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$rows = $rowsSqlObj->orderBy('talk_records.id', 'desc')->forPage($page, $page_size)->get()->toArray();
|
2020-11-09 22:59:25 +08:00
|
|
|
|
return $this->getPagingRows($this->handleChatRecords($rows), $count, $page, $page_size);
|
|
|
|
|
}
|
2020-11-21 19:53:01 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建图片消息
|
|
|
|
|
*
|
2021-07-01 23:10:18 +08:00
|
|
|
|
* @param array $message
|
|
|
|
|
* @param array $fileInfo
|
2020-12-02 15:14:29 +08:00
|
|
|
|
* @return bool|int
|
2020-11-21 19:53:01 +08:00
|
|
|
|
*/
|
2021-07-01 23:10:18 +08:00
|
|
|
|
public function createImgMessage(array $message, array $fileInfo)
|
2020-11-21 19:53:01 +08:00
|
|
|
|
{
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
|
|
|
|
$message['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$insert = TalkRecords::create($message);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
|
|
|
|
|
if (!$insert) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$fileInfo['record_id'] = $insert->id;
|
2021-07-01 23:10:18 +08:00
|
|
|
|
$fileInfo['file_type'] = FileMediaType::getMediaType($fileInfo['file_suffix']);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
$fileInfo['created_at'] = date('Y-m-d H:i:s');
|
2021-07-01 23:10:18 +08:00
|
|
|
|
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if (!TalkRecordsFile::create($fileInfo)) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录(文件消息)失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
2020-12-03 11:57:46 +08:00
|
|
|
|
} catch (Exception $e) {
|
2020-11-21 19:53:01 +08:00
|
|
|
|
Db::rollBack();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insert->id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建代码块消息
|
|
|
|
|
*
|
|
|
|
|
* @param array $message
|
|
|
|
|
* @param array $codeBlock
|
2020-12-02 15:14:29 +08:00
|
|
|
|
* @return bool|int
|
2020-11-21 19:53:01 +08:00
|
|
|
|
*/
|
|
|
|
|
public function createCodeMessage(array $message, array $codeBlock)
|
|
|
|
|
{
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
|
|
|
|
$message['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$insert = TalkRecords::create($message);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
if (!$insert) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$codeBlock['record_id'] = $insert->id;
|
2020-11-21 19:53:01 +08:00
|
|
|
|
$codeBlock['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if (!TalkRecordsCode::create($codeBlock)) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录(代码消息)失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
2020-12-03 11:57:46 +08:00
|
|
|
|
} catch (Exception $e) {
|
2020-11-21 19:53:01 +08:00
|
|
|
|
Db::rollBack();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insert->id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建代码块消息
|
|
|
|
|
*
|
|
|
|
|
* @param array $message
|
|
|
|
|
* @param array $emoticon
|
2020-12-02 15:14:29 +08:00
|
|
|
|
* @return bool|int
|
2020-11-21 19:53:01 +08:00
|
|
|
|
*/
|
|
|
|
|
public function createEmoticonMessage(array $message, array $emoticon)
|
|
|
|
|
{
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
|
|
|
|
$message['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$insert = TalkRecords::create($message);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
if (!$insert) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$emoticon['record_id'] = $insert->id;
|
2020-11-21 19:53:01 +08:00
|
|
|
|
$emoticon['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if (!TalkRecordsFile::create($emoticon)) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录(代码消息)失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
2020-12-03 11:57:46 +08:00
|
|
|
|
} catch (Exception $e) {
|
2020-11-21 19:53:01 +08:00
|
|
|
|
Db::rollBack();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insert->id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2021-07-05 21:52:44 +08:00
|
|
|
|
* 创建文件消息
|
2020-11-21 19:53:01 +08:00
|
|
|
|
*
|
|
|
|
|
* @param array $message
|
|
|
|
|
* @param array $emoticon
|
2020-12-02 15:14:29 +08:00
|
|
|
|
* @return bool|int
|
2020-11-21 19:53:01 +08:00
|
|
|
|
*/
|
|
|
|
|
public function createFileMessage(array $message, array $emoticon)
|
|
|
|
|
{
|
|
|
|
|
Db::beginTransaction();
|
|
|
|
|
try {
|
|
|
|
|
$message['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$insert = TalkRecords::create($message);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
if (!$insert) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-25 17:32:36 +08:00
|
|
|
|
$emoticon['record_id'] = $insert->id;
|
2021-07-05 21:52:44 +08:00
|
|
|
|
$emoticon['file_type'] = FileMediaType::getMediaType($emoticon['file_suffix']);
|
2020-11-21 19:53:01 +08:00
|
|
|
|
$emoticon['created_at'] = date('Y-m-d H:i:s');
|
2021-07-05 21:52:44 +08:00
|
|
|
|
if (!TalkRecordsFile::create($emoticon)) {
|
2020-12-03 11:57:46 +08:00
|
|
|
|
throw new Exception('插入聊天记录(代码消息)失败...');
|
2020-11-21 19:53:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Db::commit();
|
2020-12-03 11:57:46 +08:00
|
|
|
|
} catch (Exception $e) {
|
2020-11-21 19:53:01 +08:00
|
|
|
|
Db::rollBack();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $insert->id;
|
|
|
|
|
}
|
2020-11-04 11:57:16 +08:00
|
|
|
|
}
|