ForceSubscribeUserIService.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: z-yang
  5. * Date: 2019/3/26
  6. * Time: 15:09
  7. */
  8. namespace App\Modules\User\Services;
  9. use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
  10. use App\Modules\OfficialAccount\Models\OfficialAccount;
  11. use Redis;
  12. class ForceSubscribeUserIService
  13. {
  14. private static $official_name = [];
  15. public static function subscribes($uid, $distribution_channel_id, $send_order_id)
  16. {
  17. $subscribe_info = self::getUserSubscribes($uid);
  18. //没关注
  19. if ($subscribe_info->isNotEmpty() &&
  20. $subscribe_info->search(
  21. function ($item, $k) use ($send_order_id) {
  22. return $item->send_order_id == $send_order_id;
  23. }
  24. ) !== false
  25. ) {
  26. return ['is_subscribed' => true, 'appid' => '','name'=>''];
  27. }
  28. $subscribe_appdis = $subscribe_info->pluck('appid')->all();
  29. //echo '$subscribe_appdis' . PHP_EOL;
  30. //print_r($subscribe_appdis);
  31. $useable_appdis = self::getOfficialAccount($distribution_channel_id);
  32. //echo '$useable_appdis' . PHP_EOL;
  33. //print_r($useable_appdis);
  34. //没有可用的公众号
  35. if (empty($useable_appdis)) return ['is_subscribed' => true, 'appid' => '','name'=>''];
  36. //echo '2222222222222222222222' . PHP_EOL;
  37. $appids = collect($useable_appdis)->diff($subscribe_appdis)->toArray();
  38. if ($appids) {
  39. //echo '33333333333333333333' . PHP_EOL;
  40. return ['is_subscribed' => false, 'appid' => $appids[0],'name'=>self::$official_name[$appids[0]]];
  41. }
  42. return ['is_subscribed' => true, 'appid' => '','name'=>''];
  43. }
  44. //用户强关公众号
  45. public static function getUserSubscribes($uid)
  46. {
  47. return ForceSubscribeUsers::where('uid', $uid)->where('is_subscribed', 1)->select('appid', 'send_order_id')->get();
  48. }
  49. //可用公众号
  50. public static function getOfficialAccount($distribution_channel_id)
  51. {
  52. $result = OfficialAccount::where('distribution_channel_id', $distribution_channel_id)
  53. ->where('is_auth', 1)
  54. ->where('is_enabled', 1)
  55. ->where('subscribe_top_num', '>', 0)
  56. ->where('subscribe_day_maximum', '>', 0)
  57. ->orderBy('sort_no', 'desc')
  58. ->select('appid', 'subscribe_top_num', 'subscribe_day_maximum','nickname')
  59. ->get();
  60. if ($result->isEmpty()) return [];
  61. $data = [];
  62. foreach ($result as $value) {
  63. self::$official_name[$value->appid] = $value->nickname;
  64. $fans_stats = self::getOfficialAccountFanStats($value->appid);
  65. {
  66. $fans_stats['day_fans'] < $value->subscribe_day_maximum
  67. && $fans_stats['all_fans'] < $value->subscribe_top_num && array_push($data, $value->appid);
  68. }
  69. }
  70. return $data;
  71. }
  72. //粉丝数
  73. public static function getOfficialAccountFanStats($appid)
  74. {
  75. $total_fans_cancel_nums = (int)Redis::hget('day_appid_fans_nums_appid:cancel:' . $appid, 'total');
  76. $total_fan_info = Redis::hmget('day_appid_fans_nums_appid:add:' . $appid, ['total', date('Y-m-d')]);
  77. $total_fans_add_nums = $total_fan_info[0] ? $total_fan_info[0] : 0;
  78. $day_fans = $total_fan_info[1] ? $total_fan_info[1] : 0;
  79. $all_fans = $total_fans_add_nums - $total_fans_cancel_nums;
  80. return compact('day_fans', 'all_fans');
  81. }
  82. }