|
|
@@ -1,4 +1,5 @@
|
|
|
<?php
|
|
|
+
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
namespace SixShop\Message\Model;
|
|
|
@@ -23,27 +24,27 @@ class PrivateMessageModel
|
|
|
public function getList(array $params = [], int $page = 1, int $limit = 10)
|
|
|
{
|
|
|
$query = PrivateMessageEntity::where('1=1');
|
|
|
-
|
|
|
+
|
|
|
// 发送者ID筛选
|
|
|
if (!empty($params['from_user_id'])) {
|
|
|
$query->where('from_user_id', $params['from_user_id']);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 接收者ID筛选
|
|
|
if (!empty($params['to_user_id'])) {
|
|
|
$query->where('to_user_id', $params['to_user_id']);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 是否已读筛选
|
|
|
if (isset($params['is_read']) && $params['is_read'] !== '') {
|
|
|
$query->where('is_read', $params['is_read']);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 内容搜索
|
|
|
if (!empty($params['content'])) {
|
|
|
$query->where('content', 'like', '%' . $params['content'] . '%');
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 时间范围筛选
|
|
|
if (!empty($params['start_time'])) {
|
|
|
$query->where('create_time', '>=', strtotime($params['start_time']));
|
|
|
@@ -51,16 +52,16 @@ class PrivateMessageModel
|
|
|
if (!empty($params['end_time'])) {
|
|
|
$query->where('create_time', '<=', strtotime($params['end_time']));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 获取总数
|
|
|
$total = $query->count();
|
|
|
-
|
|
|
+
|
|
|
// 获取分页数据
|
|
|
$list = $query->order('id', 'desc')
|
|
|
->page($page, $limit)
|
|
|
->select()
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
return [
|
|
|
'list' => $list,
|
|
|
'total' => $total,
|
|
|
@@ -68,7 +69,7 @@ class PrivateMessageModel
|
|
|
'limit' => $limit,
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取用户私信列表
|
|
|
*
|
|
|
@@ -84,7 +85,7 @@ class PrivateMessageModel
|
|
|
$query->where('to_user_id', $userId)
|
|
|
->whereOr('from_user_id', $userId);
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
// 对话用户ID筛选
|
|
|
if (!empty($params['partner_id'])) {
|
|
|
$partnerId = $params['partner_id'];
|
|
|
@@ -98,26 +99,26 @@ class PrivateMessageModel
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 是否已读筛选
|
|
|
if (isset($params['is_read']) && $params['is_read'] !== '') {
|
|
|
$query->where('is_read', $params['is_read']);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 获取总数
|
|
|
$total = $query->count();
|
|
|
-
|
|
|
+
|
|
|
// 获取分页数据
|
|
|
$list = $query->order('id', 'desc')
|
|
|
->page($page, $limit)
|
|
|
->select()
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
// 获取未读数量
|
|
|
$unreadCount = PrivateMessageEntity::where('to_user_id', $userId)
|
|
|
->where('is_read', 0)
|
|
|
->count();
|
|
|
-
|
|
|
+
|
|
|
return [
|
|
|
'list' => $list,
|
|
|
'total' => $total,
|
|
|
@@ -126,7 +127,7 @@ class PrivateMessageModel
|
|
|
'limit' => $limit,
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取用户的对话列表
|
|
|
*
|
|
|
@@ -150,36 +151,36 @@ class PrivateMessageModel
|
|
|
GROUP BY partner_id
|
|
|
ORDER BY last_message_id DESC
|
|
|
LIMIT " . (($page - 1) * $limit) . ", {$limit}";
|
|
|
-
|
|
|
+
|
|
|
$conversations = Db::query($rawSql);
|
|
|
-
|
|
|
+
|
|
|
// 获取总数
|
|
|
$totalSql = "SELECT COUNT(DISTINCT CASE WHEN from_user_id = {$userId} THEN to_user_id ELSE from_user_id END) AS total
|
|
|
FROM cy_message_privates
|
|
|
WHERE (from_user_id = {$userId} OR to_user_id = {$userId})
|
|
|
AND delete_time IS NULL";
|
|
|
-
|
|
|
+
|
|
|
$totalResult = Db::query($totalSql);
|
|
|
$total = $totalResult[0]['total'] ?? 0;
|
|
|
-
|
|
|
+
|
|
|
// 获取每个对话的最后一条消息
|
|
|
$result = [];
|
|
|
foreach ($conversations as $conversation) {
|
|
|
$partnerId = $conversation['partner_id'];
|
|
|
$lastMessageId = $conversation['last_message_id'];
|
|
|
-
|
|
|
+
|
|
|
// 获取最后一条消息
|
|
|
$lastMessage = PrivateMessageEntity::find($lastMessageId);
|
|
|
if (!$lastMessage) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 获取未读消息数量
|
|
|
$unreadCount = PrivateMessageEntity::where('from_user_id', $partnerId)
|
|
|
->where('to_user_id', $userId)
|
|
|
->where('is_read', 0)
|
|
|
->count();
|
|
|
-
|
|
|
+
|
|
|
// 获取对话用户信息
|
|
|
$partnerInfo = null;
|
|
|
if ($partnerId > 0) {
|
|
|
@@ -194,7 +195,7 @@ class PrivateMessageModel
|
|
|
'avatar' => '/static/images/system-avatar.png',
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
$result[] = [
|
|
|
'partner_id' => $partnerId,
|
|
|
'partner_info' => $partnerInfo,
|
|
|
@@ -202,7 +203,7 @@ class PrivateMessageModel
|
|
|
'unread_count' => $unreadCount,
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return [
|
|
|
'list' => $result,
|
|
|
'total' => $total,
|
|
|
@@ -210,7 +211,7 @@ class PrivateMessageModel
|
|
|
'limit' => $limit,
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取两个用户之间的对话消息
|
|
|
*
|
|
|
@@ -231,16 +232,16 @@ class PrivateMessageModel
|
|
|
->where('to_user_id', $userId);
|
|
|
});
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
// 获取总数
|
|
|
$total = $query->count();
|
|
|
-
|
|
|
+
|
|
|
// 获取分页数据
|
|
|
$list = $query->order('id', 'desc')
|
|
|
->page($page, $limit)
|
|
|
->select()
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
// 自动标记接收的消息为已读
|
|
|
PrivateMessageEntity::where('from_user_id', $partnerId)
|
|
|
->where('to_user_id', $userId)
|
|
|
@@ -249,7 +250,7 @@ class PrivateMessageModel
|
|
|
'is_read' => 1,
|
|
|
'read_time' => time(),
|
|
|
]);
|
|
|
-
|
|
|
+
|
|
|
return [
|
|
|
'list' => $list,
|
|
|
'total' => $total,
|
|
|
@@ -257,7 +258,7 @@ class PrivateMessageModel
|
|
|
'limit' => $limit,
|
|
|
];
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取单个私信详情
|
|
|
*
|
|
|
@@ -268,7 +269,7 @@ class PrivateMessageModel
|
|
|
{
|
|
|
return PrivateMessageEntity::find($id);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 发送私信
|
|
|
*
|
|
|
@@ -282,14 +283,14 @@ class PrivateMessageModel
|
|
|
if ($toUserId <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 检查接收者的消息设置
|
|
|
$setting = MessageSettingEntity::where('user_id', $toUserId)->find();
|
|
|
if ($setting && !$setting->isNotifyEnabled(5)) {
|
|
|
// 用户已关闭私信
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
$entity = new PrivateMessageEntity();
|
|
|
$entity->from_user_id = $fromUserId;
|
|
|
$entity->to_user_id = $toUserId;
|
|
|
@@ -297,10 +298,10 @@ class PrivateMessageModel
|
|
|
$entity->is_read = 0;
|
|
|
$entity->read_time = 0;
|
|
|
$entity->save();
|
|
|
-
|
|
|
+
|
|
|
return $entity->id;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 发送系统私信
|
|
|
*
|
|
|
@@ -312,7 +313,7 @@ class PrivateMessageModel
|
|
|
{
|
|
|
return $this->send(0, $toUserId, $content);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 标记私信为已读
|
|
|
*
|
|
|
@@ -326,10 +327,10 @@ class PrivateMessageModel
|
|
|
if (!$entity || $entity->to_user_id != $userId) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return $entity->markAsRead()->save();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 批量标记私信为已读
|
|
|
*
|
|
|
@@ -342,7 +343,7 @@ class PrivateMessageModel
|
|
|
if (empty($ids) || $userId <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return PrivateMessageEntity::where('id', 'in', $ids)
|
|
|
->where('to_user_id', $userId)
|
|
|
->where('is_read', 0)
|
|
|
@@ -351,7 +352,7 @@ class PrivateMessageModel
|
|
|
'read_time' => time(),
|
|
|
]);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 标记与指定用户的所有私信为已读
|
|
|
*
|
|
|
@@ -364,7 +365,7 @@ class PrivateMessageModel
|
|
|
if ($userId <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return PrivateMessageEntity::where('from_user_id', $partnerId)
|
|
|
->where('to_user_id', $userId)
|
|
|
->where('is_read', 0)
|
|
|
@@ -373,7 +374,7 @@ class PrivateMessageModel
|
|
|
'read_time' => time(),
|
|
|
]);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 删除私信
|
|
|
*
|
|
|
@@ -387,10 +388,10 @@ class PrivateMessageModel
|
|
|
if (!$entity || ($entity->from_user_id != $userId && $entity->to_user_id != $userId)) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return $entity->delete();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 批量删除私信
|
|
|
*
|
|
|
@@ -403,7 +404,7 @@ class PrivateMessageModel
|
|
|
if (empty($ids) || $userId <= 0) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return PrivateMessageEntity::where('id', 'in', $ids)
|
|
|
->where(function ($query) use ($userId) {
|
|
|
$query->where('from_user_id', $userId)
|
|
|
@@ -411,7 +412,7 @@ class PrivateMessageModel
|
|
|
})
|
|
|
->delete();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 删除与指定用户的所有对话
|
|
|
*
|
|
|
@@ -424,7 +425,7 @@ class PrivateMessageModel
|
|
|
if ($userId <= 0 || $partnerId < 0) {
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return PrivateMessageEntity::where(function ($query) use ($userId, $partnerId) {
|
|
|
$query->where(function ($query) use ($userId, $partnerId) {
|
|
|
$query->where('from_user_id', $userId)
|
|
|
@@ -435,7 +436,7 @@ class PrivateMessageModel
|
|
|
});
|
|
|
})->delete();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取用户未读私信数量
|
|
|
*
|
|
|
@@ -447,7 +448,7 @@ class PrivateMessageModel
|
|
|
if ($userId <= 0) {
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return PrivateMessageEntity::where('to_user_id', $userId)
|
|
|
->where('is_read', 0)
|
|
|
->count();
|