SendMessageJob.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. /*
  3. * This file is part of the Jiannei/lumen-api-starter.
  4. *
  5. * (c) Jiannei <longjian.huang@foxmail.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace App\Jobs\Base;
  11. use App\Jobs\Job;
  12. use App\Mail\NoticeMail;
  13. use App\Repositories\Enums\ModelStatusEnum;
  14. use App\Repositories\Models\Base\Admin;
  15. use App\Repositories\Models\Base\Message;
  16. use App\Repositories\Models\Base\UserMessage;
  17. use Carbon\Carbon;
  18. use Illuminate\Support\Facades\Mail;
  19. class SendMessageJob extends Job
  20. {
  21. private $send_tag;
  22. /**
  23. * Create a new job instance.
  24. */
  25. public function __construct($send_tag)
  26. {
  27. $this->send_tag = $send_tag;
  28. }
  29. /**
  30. * 确定任务应该超时的时间
  31. *
  32. * @return \DateTime
  33. */
  34. public function retryUntil()
  35. {
  36. return Carbon::now()->addHours(8);
  37. }
  38. /**
  39. * Execute the job.
  40. */
  41. public function handle()
  42. {
  43. $model = Message::query()->where('send_tag', $this->send_tag)->first();
  44. if (!$model) return true;
  45. if ($model->status == ModelStatusEnum::PAUSE) {
  46. $model->send_status = Message::SEND_STATUS_ERROR;
  47. $model->send_time = Carbon::now()->toDateTimeString();
  48. $model->result = [
  49. 'msg' => '任务已经暂停'
  50. ];
  51. $model->save();
  52. return true;
  53. }
  54. $model->send_status = Message::SEND_STATUS_EXECUTE;
  55. $model->send_time = Carbon::now()->toDateTimeString();
  56. $model->save();
  57. $users = Admin::query()->whereIn('id', array_column($model->users, 'id'))->where('status', ModelStatusEnum::OK)->select(['id', 'name', 'mobile', 'email'])->get();
  58. $sendTypes = $model->send_type;
  59. try {
  60. if (in_array(Message::SEND_TYPE_SITE, $sendTypes)) {
  61. //站内信
  62. $this->sendSiteMsg($model, $users);
  63. }
  64. if (in_array(Message::SEND_TYPE_MAIL, $sendTypes)) {
  65. //邮件
  66. $this->sendMailMsg($model, $users);
  67. }
  68. } catch (\Exception $exception) {
  69. $model->send_status = Message::SEND_STATUS_ERROR;
  70. $model->send_time = Carbon::now()->toDateTimeString();
  71. $model->result = [
  72. 'msg' => $exception->getMessage(),
  73. 'data' => $exception
  74. ];
  75. $model->save();
  76. return true;
  77. }
  78. $model->send_status = Message::SEND_STATUS_COMPLETE;
  79. $model->save();
  80. return true;
  81. }
  82. private function sendSiteMsg($model, $users = [])
  83. {
  84. foreach ($users as $user) {
  85. UserMessage::query()->create([
  86. 'user_id' => $user->id,
  87. 'user_type' => get_class($user),
  88. 'name' => $model['name'],
  89. 'body' => $model['body'],
  90. 'type' => $model['type'],
  91. 'source_type' => get_class($model),
  92. 'source_id' => $model['id'],
  93. ]);
  94. }
  95. }
  96. private function sendMailMsg($model, $users = [])
  97. {
  98. foreach ($users as $user) {
  99. if (!empty($user->email)) {
  100. Mail::to($user['email'])->send(new NoticeMail($model->title, $model->body));
  101. }
  102. }
  103. }
  104. }