ForceSubscribeUserIService.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. public static function subscribes($uid,$distribution_channel_id,$send_order_id){
  15. $subscribe_info = self::getUserSubscribes($uid);
  16. //没关注
  17. if(!$subscribe_info->isNotEmpty() &&
  18. $subscribe_info->search(function ($item,$k)use ($send_order_id) { return $item->send_order_id == $send_order_id;}) )
  19. return ['is_subscribed'=>true,'appid'=>''];
  20. $subscribe_appdis = $subscribe_info->pluck('appid')->all();
  21. $useable_appdis = self::getOfficialAccount($distribution_channel_id);
  22. //没有可用的公众号
  23. if(empty($useable_appdis)) return ['is_subscribed'=>true,'appid'=>''];
  24. $appids = collect($useable_appdis)->diff($subscribe_appdis)->toArray();
  25. if($appids){
  26. return ['is_subscribed'=>false,'appid'=>$appids[0]];
  27. }
  28. return ['is_subscribed'=>true,'appid'=>''];
  29. }
  30. //用户强关公众号
  31. public static function getUserSubscribes($uid){
  32. return ForceSubscribeUsers::where('uid',$uid)->where('is_subscribed',1)->select('appid','send_order_id')->get();
  33. }
  34. //可用公众号
  35. public static function getOfficialAccount($distribution_channel_id){
  36. $result = OfficialAccount::where('distribution_channel_id',$distribution_channel_id)
  37. ->where('is_auth',1)
  38. ->where('is_enabled',1)
  39. ->where('subscribe_top_num','>',0)
  40. ->where('subscribe_day_maximum','>',0)
  41. ->orderBy('sort_no', 'desc')
  42. ->select('appid','subscribe_top_num','subscribe_day_maximum')
  43. ->get();
  44. if($result->isEmpty()) return [];
  45. $data = [];
  46. foreach ($result as $value){
  47. $fans_stats = self::getOfficialAccountFanStats($value->appid);
  48. {
  49. $fans_stats['day_fans'] < $value->subscribe_day_maximum
  50. && $fans_stats['all_fans'] < $value->subscribe_top_num && array_push($data,$value->appid);
  51. }
  52. }
  53. return $data;
  54. }
  55. //粉丝数
  56. public static function getOfficialAccountFanStats($appid){
  57. $total_fans_cancel_nums = (int)Redis::hget('day_appid_fans_nums_appid:cancel:' . $appid, 'total');
  58. $total_fan_info = Redis::hmget('day_appid_fans_nums_appid:add:' . $appid,['total',date('Y-m-d')]);
  59. $total_fans_add_nums = $total_fan_info[0]?$total_fan_info[0]:0;
  60. $day_fans = $total_fan_info[1]?$total_fan_info[1]:0;
  61. $all_fans = $total_fans_add_nums - $total_fans_cancel_nums;
  62. return compact('day_fans','all_fans');
  63. }
  64. }