DistCustomMessage.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace App\Distributor\Repositories;
  3. use App\Models\DistMessage as DistMessageModel;
  4. use Dcat\Admin\Grid;
  5. use Dcat\Admin\Repositories\Repository;
  6. use Illuminate\Pagination\LengthAwarePaginator;
  7. class DistCustomMessage extends Repository
  8. {
  9. protected $eloquentClass = DistMessageModel::class;
  10. /**
  11. * 定义主键字段名称
  12. *
  13. * @return string
  14. */
  15. public function getPrimaryKeyColumn()
  16. {
  17. return 'id';
  18. }
  19. /**
  20. * 重写 get 方法
  21. *
  22. * @param Grid\Model $model
  23. * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Collection|array
  24. */
  25. public function get(Grid\Model $model)
  26. {
  27. // 当前页数
  28. $currentPage = $model->getCurrentPage();
  29. // 每页显示行数
  30. $perPage = $model->getPerPage();
  31. // 获取排序字段
  32. [$orderColumn, $orderType] = $model->getSort();
  33. // 获取当前登录用户的 ID
  34. $userId = getDistributorId();
  35. // 使用 getMessagesForUser 方法获取消息列表
  36. $messages = $this->getMessagesForUser($userId);
  37. // 获取总记录数
  38. $total = $messages->count();
  39. // 分页数据
  40. $data = $messages->slice(($currentPage - 1) * $perPage, $perPage)->values();
  41. foreach ($data as $value) {
  42. $value['created_at']=$value['created_at']->toDateTimeString();
  43. $data_out[]=$value;
  44. }
  45. return $model->makePaginator(
  46. $total, // 传入总记录数
  47. $data_out
  48. );
  49. }
  50. /**
  51. * 获取最近 N 条消息
  52. *
  53. * @param int $limit
  54. * @return \Illuminate\Support\Collection
  55. */
  56. public function getRecentMessages($limit = 10)
  57. {
  58. // 获取当前登录用户的 ID
  59. $userId = getDistributorId();
  60. // 使用 getMessagesForUser 方法获取消息列表
  61. $messages = $this->getMessagesForUser($userId);
  62. // 获取最近 N 条消息
  63. $recentMessages = $messages->take($limit);
  64. return $recentMessages;
  65. }
  66. public function getMessagesForUser($userId)
  67. {
  68. //$userId=str($userId);
  69. return DistMessageModel::where('target_type', 'all')
  70. ->orWhere(function ($query) use ($userId) {
  71. $query->where('target_type', 'users')
  72. ->whereJsonContains('target_ids', str($userId));
  73. })
  74. ->with(['readStatuses' => function ($query) use ($userId) {
  75. $query->where('user_id', $userId);
  76. }])
  77. ->orderBy('created_at', 'desc')
  78. ->get()
  79. ->map(function ($message) use ($userId) {
  80. $isRead = $message->readStatuses->isNotEmpty() && $message->readStatuses->first()->is_read;
  81. if(!$isRead)
  82. {
  83. $isRead=0;
  84. }
  85. return [
  86. 'id' => $message->id,
  87. 'title' => $message->title,
  88. 'content' => $message->content,
  89. 'sender_id' => $message->sender_id,
  90. 'created_at' => $message->created_at,
  91. 'is_read' => $isRead,
  92. ];
  93. });
  94. }
  95. /**
  96. * 判断用户是否有权限查看指定 ID 的消息
  97. *
  98. * @param int $messageId
  99. * @return bool
  100. */
  101. public static function canViewMessage($messageId)
  102. {
  103. // 获取当前登录用户的 ID
  104. $userId = getDistributorId();
  105. // 检查消息是否存在且属于当前用户
  106. $message = DistMessageModel::where('id', $messageId)
  107. ->where(function ($query) use ($userId) {
  108. $query->where('target_type', 'all')
  109. ->orWhere(function ($query) use ($userId) {
  110. $query->where('target_type', 'users')
  111. ->whereJsonContains('target_ids', str($userId));
  112. });
  113. })
  114. ->first();
  115. return $message !== null;
  116. }
  117. }