更新
This commit is contained in:
361
app/Http/Controllers/System/Admin/Notification.php
Normal file
361
app/Http/Controllers/System/Admin/Notification.php
Normal file
@@ -0,0 +1,361 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use App\Services\System\NotificationService;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class Notification extends Controller
|
||||
{
|
||||
/**
|
||||
* @var NotificationService
|
||||
*/
|
||||
protected $notificationService;
|
||||
|
||||
/**
|
||||
* Notification constructor
|
||||
*/
|
||||
public function __construct(NotificationService $notificationService)
|
||||
{
|
||||
$this->notificationService = $notificationService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取通知列表
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$params = $request->all();
|
||||
|
||||
// 如果没有指定user_id,使用当前登录用户
|
||||
if (empty($params['user_id'])) {
|
||||
$params['user_id'] = auth('admin')->id();
|
||||
}
|
||||
|
||||
$result = $this->notificationService->getList($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未读通知
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function unread(Request $request): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$limit = $request->input('limit', 10);
|
||||
|
||||
$notifications = $this->notificationService->getUnreadNotifications($userId, $limit);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'list' => $notifications
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未读通知数量
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function unreadCount(): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$count = $this->notificationService->getUnreadCount($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取通知详情
|
||||
*
|
||||
* @param int $id
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function show(int $id): JsonResponse
|
||||
{
|
||||
$notification = $this->notificationService->getById($id);
|
||||
|
||||
if (!$notification) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => 'Notification not found',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
// 检查权限
|
||||
if ($notification->user_id !== auth('admin')->id()) {
|
||||
return response()->json([
|
||||
'code' => 403,
|
||||
'message' => 'Access denied',
|
||||
'data' => null
|
||||
], 403);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $notification
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记通知为已读
|
||||
*
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function markAsRead(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$result = $this->notificationService->markAsRead($id, $userId);
|
||||
|
||||
if (!$result) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => 'Notification not found or access denied',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notification marked as read',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量标记通知为已读
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function batchMarkAsRead(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer'
|
||||
]);
|
||||
|
||||
$userId = auth('admin')->id();
|
||||
$ids = $request->input('ids');
|
||||
|
||||
$count = $this->notificationService->batchMarkAsRead($ids, $userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notifications marked as read',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记所有通知为已读
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function markAllAsRead(): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$count = $this->notificationService->markAllAsRead($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'All notifications marked as read',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除通知
|
||||
*
|
||||
* @param int $id
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function destroy(int $id): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$result = $this->notificationService->delete($id, $userId);
|
||||
|
||||
if (!$result) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => 'Notification not found or access denied',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notification deleted',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除通知
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function batchDelete(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer'
|
||||
]);
|
||||
|
||||
$userId = auth('admin')->id();
|
||||
$ids = $request->input('ids');
|
||||
|
||||
$count = $this->notificationService->batchDelete($ids, $userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notifications deleted',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空已读通知
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function clearRead(): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$count = $this->notificationService->clearReadNotifications($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Read notifications cleared',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取通知统计
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function statistics(): JsonResponse
|
||||
{
|
||||
$userId = auth('admin')->id();
|
||||
$stats = $this->notificationService->getStatistics($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $stats
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送通知(管理员功能)
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function send(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_ids' => 'nullable|array',
|
||||
'user_ids.*' => 'integer',
|
||||
'title' => 'required|string|max:200',
|
||||
'content' => 'required|string',
|
||||
'type' => 'required|string|in:info,success,warning,error,task,system',
|
||||
'category' => 'nullable|string|in:system,task,message,reminder,announcement',
|
||||
'data' => 'nullable|array',
|
||||
'action_type' => 'nullable|string|in:link,modal,none',
|
||||
'action_data' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$userIds = $request->input('user_ids');
|
||||
$title = $request->input('title');
|
||||
$content = $request->input('content');
|
||||
$type = $request->input('type', 'info');
|
||||
$category = $request->input('category', 'system');
|
||||
$extraData = $request->input('data', []);
|
||||
|
||||
// 如果没有指定user_ids,则发送给所有用户
|
||||
if (empty($userIds)) {
|
||||
$result = $this->notificationService->broadcast(
|
||||
$title,
|
||||
$content,
|
||||
$type,
|
||||
$category,
|
||||
$extraData
|
||||
);
|
||||
} else {
|
||||
$result = $this->notificationService->sendToUsers(
|
||||
$userIds,
|
||||
$title,
|
||||
$content,
|
||||
$type,
|
||||
$category,
|
||||
$extraData
|
||||
);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notification sent successfully',
|
||||
'data' => [
|
||||
'count' => count($result)
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重试发送未发送的通知(管理员功能)
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function retryUnsent(Request $request): JsonResponse
|
||||
{
|
||||
$limit = $request->input('limit', 100);
|
||||
$count = $this->notificationService->retryUnsentNotifications($limit);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Unsent notifications retried',
|
||||
'data' => [
|
||||
'count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user