ForceSubscribeUserIService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. $useable_appdis = self::getOfficialAccount($distribution_channel_id);
  30. //没有可用的公众号
  31. if (empty($useable_appdis)) return ['is_subscribed' => true, 'appid' => '','name'=>''];
  32. $appids = collect($useable_appdis)->diff($subscribe_appdis)->toArray();
  33. if ($appids && isset($appids[0])) {
  34. return ['is_subscribed' => false, 'appid' => $appids[0],'name'=>self::$official_name[$appids[0]]];
  35. }
  36. return ['is_subscribed' => true, 'appid' => '','name'=>''];
  37. }
  38. //用户强关公众号
  39. public static function getUserSubscribes($uid)
  40. {
  41. return ForceSubscribeUsers::where('uid', $uid)->where('is_subscribed', 1)->select('appid', 'send_order_id')->get();
  42. }
  43. //可用公众号
  44. public static function getOfficialAccount($distribution_channel_id)
  45. {
  46. $result = OfficialAccount::where('distribution_channel_id', $distribution_channel_id)
  47. ->where('is_auth', 1)
  48. ->where('is_enabled', 1)
  49. ->where('subscribe_top_num', '>', 0)
  50. ->where('subscribe_day_maximum', '>', 0)
  51. ->orderBy('sort_no', 'desc')
  52. ->select('appid', 'subscribe_top_num', 'subscribe_day_maximum','nickname')
  53. ->get();
  54. if ($result->isEmpty()) return [];
  55. $data = [];
  56. foreach ($result as $value) {
  57. self::$official_name[$value->appid] = $value->nickname;
  58. $fans_stats = self::getOfficialAccountFanStats($value->appid);
  59. {
  60. $fans_stats['day_fans'] < $value->subscribe_day_maximum
  61. && $fans_stats['all_fans'] < $value->subscribe_top_num && array_push($data, $value->appid);
  62. }
  63. }
  64. return $data;
  65. }
  66. //粉丝数
  67. public static function getOfficialAccountFanStats($appid)
  68. {
  69. $total_fans_cancel_nums = (int)Redis::hget('day_appid_fans_nums_appid:cancel:' . $appid, 'total');
  70. $total_fan_info = Redis::hmget('day_appid_fans_nums_appid:add:' . $appid, ['total', date('Y-m-d')]);
  71. $total_fans_add_nums = $total_fan_info[0] ? $total_fan_info[0] : 0;
  72. $day_fans = $total_fan_info[1] ? $total_fan_info[1] : 0;
  73. $all_fans = $total_fans_add_nums - $total_fans_cancel_nums;
  74. return compact('day_fans', 'all_fans');
  75. }
  76. public static function getForceSubscribeByUidOpenid($uid) {
  77. $user_info = UserService::getById($uid);
  78. if($user_info) {
  79. $force_subs_info = ForceSubscribeUsers::join('users','users.id','=','force_subscribe_users.uid')
  80. ->select(['force_subscribe_users.uid','force_subscribe_users.subscribe_time',
  81. 'force_subscribe_users.created_at','users.openid','force_subscribe_users.is_subscribed'])
  82. ->where('users.openid',$user_info->openid)
  83. ->where('force_subscribe_users.is_subscribed',1)
  84. ->orderBy('force_subscribe_users.id','asc')
  85. ->first();
  86. return $force_subs_info;
  87. }
  88. return false;
  89. }
  90. }