BookUpdatePush.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: z-yang
  5. * Date: 2020/9/16
  6. * Time: 17:58
  7. */
  8. namespace App\Console\Commands\SmartPush;
  9. use App\Jobs\SendTexts;
  10. use App\Modules\User\Services\ReadRecordService;
  11. use DB;
  12. use Redis;
  13. use Hashids;
  14. use Illuminate\Console\Command;
  15. class BookUpdatePush extends Command
  16. {
  17. const BOOK_LAST_UPDATE_INFO = 'book:last_update'; //list
  18. const BOOK_LAST_UPDATE_INFO_STATUS = 'book:last_update_status';
  19. const CUSTOM_CATEGORY = 'book_update_push';
  20. /**
  21. * The name and signature of the console command.
  22. *
  23. * @var string
  24. */
  25. protected $signature = 'SmartPush:BookUpdatePush';
  26. /**
  27. * The console command description.
  28. *
  29. * @var string
  30. */
  31. protected $description = '图书更新推送';
  32. /**
  33. * Create a new command instance.
  34. *
  35. * @return void
  36. */
  37. private $switch = [];
  38. private $default_status;
  39. public function __construct()
  40. {
  41. parent::__construct();
  42. }
  43. /**
  44. * Execute the console command.
  45. *
  46. * @return mixed
  47. */
  48. public function handle()
  49. {
  50. $this->start();
  51. }
  52. private function start(){
  53. /*$info = DB::connection('api_mysql')->table('custom_msg_switchs')->where('custom_category',self::CUSTOM_CATEGORY)->first();
  54. if(!$info) return ;
  55. $this->default_status = $info->default_switch_status;*/
  56. $this->default_status = 0;
  57. $update_status = Redis::get(self::BOOK_LAST_UPDATE_INFO_STATUS);
  58. if($update_status == '1'){
  59. Redis::set(self::BOOK_LAST_UPDATE_INFO_STATUS,2);
  60. $this->getBookAndSend();
  61. }
  62. }
  63. private function getBookAndSend(){
  64. $length = Redis::llen(self::BOOK_LAST_UPDATE_INFO);
  65. if($length <= 0) return [];
  66. $count = ceil($length/100);
  67. for ($i=0;$i <$count;$i++){
  68. $start = $i*100;
  69. $end = $start+99;
  70. $result = Redis::Lrange(self::BOOK_LAST_UPDATE_INFO,$start,$end);
  71. foreach ($result as $item){
  72. $record = json_decode($item,1);
  73. $bid = $record['bid'];
  74. $book_name = $record['book_name'];
  75. $chapter_name = $record['chapter_name'];
  76. $this->sendByBook($bid,$book_name,$chapter_name);
  77. }
  78. }
  79. Redis::del(self::BOOK_LAST_UPDATE_INFO);
  80. }
  81. private function sendByBook($bid,$book_name,$chapter_name){
  82. $user_list = $this->userList($bid);
  83. if(!$user_list) return ;
  84. foreach ($user_list as $uid){
  85. $user_force_subscribe_info = $this->userPushInfo($uid);
  86. if(!$user_force_subscribe_info) continue;
  87. $cid_time = ReadRecordService::getRecordByUidBid($uid,$bid);
  88. if(!$cid_time) continue;
  89. list($cid,$time) = explode('_',$cid_time);
  90. if(!$cid) continue;
  91. $link = 'https://site'.encodeDistributionChannelId($user_force_subscribe_info['distribution_channel_id']).'.zhuishuyun.com/reader?bid='.Hashids::encode($bid).'&cid='.$cid.'&fromtype=book_update_push';
  92. $content_fromat = "小说更新提醒\r\n\r\n<a href='%s'>《%s》已更新到《%s》</a>\r\n\r\n精彩内容不容错过~\r\n";
  93. $content = sprintf($content_fromat,$link,$book_name,$chapter_name);
  94. $data = [
  95. 'openid'=>$user_force_subscribe_info['openid'],
  96. 'appid'=>$user_force_subscribe_info['appid'],
  97. 'type'=>'one_task',
  98. 'task_id'=>1,
  99. 'send_time'=>date('Y-m-d H:i:s'),
  100. 'content'=>$content
  101. ];
  102. $send_data=array(
  103. 'send_time'=>date("Y-m-d H:i:s"),
  104. 'data' => $data
  105. );
  106. $job = (new SendTexts($send_data))->onConnection('rabbitmq')->delay(0)->onQueue('send_texts_list');
  107. dispatch($job);
  108. }
  109. }
  110. private function userPushInfo($uid){
  111. $user_force_subscribe_info = DB::connection('api_mysql')->table('temp_force_subscribe_users')
  112. ->select('distribution_channel_id','openid','appid')
  113. ->where('uid',$uid)
  114. ->where('is_subscribed',1)
  115. ->where('last_interactive_time','>',date('Y-m-d H:i:s',time()-86400*2))
  116. ->first();
  117. if(!$user_force_subscribe_info) return [];
  118. if(!$this->switchStatus($user_force_subscribe_info->distribution_channel_id)) return [];
  119. return [
  120. 'distribution_channel_id'=>$user_force_subscribe_info->distribution_channel_id,
  121. 'openid'=> $user_force_subscribe_info->openid,
  122. 'appid'=>$user_force_subscribe_info->appid
  123. ];
  124. }
  125. private function userList($bid){
  126. // [8426169,14128];
  127. return DB::connection('api_mysql')->table('user_last_chapter_order')->where('bid',$bid)->select('uid')->pluck('uid');
  128. }
  129. private function switchStatus($distribution_channel_id){
  130. return false;
  131. if(isset($this->switch[$distribution_channel_id])){
  132. return $this->switch[$distribution_channel_id] == 1;
  133. }
  134. $switch = DB::connection('api_mysql')->table('custom_msg_switchs_msgs')
  135. ->where('distribution_channel_id',$distribution_channel_id)
  136. ->where('custom_category',self::CUSTOM_CATEGORY)
  137. ->select('status')
  138. ->first();
  139. if($switch){
  140. $this->switch[$distribution_channel_id] = $switch->status;
  141. }else{
  142. $this->switch[$distribution_channel_id] = $this->default_status;
  143. }
  144. return $this->switch[$distribution_channel_id] == 1;
  145. }
  146. }