scanPostConcernQueueJob.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: dingran
  5. * Date: 2018/7/6
  6. * Time: 下午3:24
  7. */
  8. namespace app\Jobs;
  9. use app\common\models\Member;
  10. use app\common\models\MemberShopInfo;
  11. use Illuminate\Bus\Queueable;
  12. use Illuminate\Contracts\Queue\ShouldQueue;
  13. use Illuminate\Queue\InteractsWithQueue;
  14. use Illuminate\Queue\SerializesModels;
  15. use Yunshop\Commission\models\Agents;
  16. use Yunshop\Poster\models\Poster;
  17. use Yunshop\Poster\models\PosterQrcode;
  18. use Yunshop\Poster\models\Qrcode;
  19. class scanPostConcernQueueJob implements ShouldQueue
  20. {
  21. use InteractsWithQueue, Queueable, SerializesModels;
  22. /**
  23. * 处理事件
  24. *
  25. * @var
  26. */
  27. protected $postProcessor;
  28. /**
  29. * 当前公众号
  30. *
  31. * @var
  32. */
  33. protected $uniacid;
  34. /**
  35. * 扫码关注者
  36. *
  37. * @var
  38. */
  39. protected $from;
  40. /**
  41. * 海报用户
  42. *
  43. * @var
  44. */
  45. protected $to;
  46. /**
  47. * 海报消息
  48. *
  49. * @var
  50. */
  51. protected $msg;
  52. /**
  53. * Create a new job instance.
  54. *
  55. * @return void
  56. */
  57. public function __construct($uniacid, $postProcessor)
  58. {
  59. $this->uniacid = $uniacid;
  60. $this->postProcessor = $postProcessor;
  61. $this->msg = $this->postProcessor->message;
  62. $this->from = $this->postProcessor->message['fromusername'];
  63. $this->to = $this->postProcessor->message['eventkey'];
  64. }
  65. /**
  66. * Execute the job.
  67. *
  68. * @return void
  69. */
  70. public function handle()
  71. {
  72. \Log::debug('-------scan poster from-----', [$this->from]);
  73. \Log::debug('-------scan poster to-------', [$this->to]);
  74. //$from关注者用户是否存在,存在验证上线
  75. $from_member_model = MemberShopInfo::getMemberShopInfoByOpenid($this->from);
  76. if (!is_null($from_member_model)) {
  77. //\Log::debug('--------poster member is not null------');
  78. $from_member_id = $from_member_model->member_id;
  79. $from_parent_id = $from_member_model->parent_id;
  80. //\Log::debug('------poster from member id----', [$from_member_id]);
  81. //\Log::debug('------poster from parent id----', [$from_parent_id]);
  82. //$to海报用户信息
  83. $qrcodeId = $this->getPosterForUser($this->msg);
  84. //\Log::debug('------poster qrcodeId-----', [$qrcodeId]);
  85. $to_member_id = PosterQrcode::getRecommenderIdByQrcodeId($qrcodeId);
  86. //\Log::debug('------poster to_member_id-----', [$to_member_id]);
  87. $posterId = PosterQrcode::getPosterIdByQrcodeId($qrcodeId);
  88. $poster = Poster::getPosterById($posterId);
  89. if ($poster->auto_sub == 0) {
  90. \Log::debug('-------------未开启了海报的"扫码关注成为下线"------------');
  91. return;
  92. }
  93. if (!empty($to_member_id)
  94. && date('Ymd') == $from_member_model->created_at->format('Ymd')
  95. && $from_member_id != $to_member_id
  96. && 0 == $from_parent_id
  97. ) {
  98. //$from->parent_id 是否为0,是0改为$to->uid
  99. $from_member_model->parent_id = $to_member_id;
  100. //\Log::debug('------poster modify parent_id----');
  101. $from_member_model->save();
  102. //分销-会员关系链
  103. Member::createRealtion($from_member_id, $to_member_id);
  104. //更新分销商
  105. $this->updateAgent($from_member_id);
  106. }
  107. } else {
  108. \Log::debug('-----poster member is null by openid-----', [$this->from]);
  109. }
  110. }
  111. private function getPosterForUser($msg)
  112. {
  113. $msgEvent = strtolower($msg['event']);
  114. $msgEventKey = strtolower($msg['eventkey']);
  115. if ($msgEvent == 'scan') {
  116. $scene = $msgEventKey;
  117. } else {
  118. //如果用户之前未关注,进行关注后推送的 Event 是 "subscribe",
  119. //推送的 EventKey 是以 "qrscene_" 为前缀,后面跟着二维码的参数值.
  120. //因为需求中提到存在这种情况 -- "尽管之前已经关注,但还不是商城的会员",
  121. //所以这里并不根据 Event 类型来判别是否是会员, 只是识别出二维码的特征值(场景值/场景字符串), 用于定位二维码 ID
  122. $scene = substr($msgEventKey, strpos($msgEventKey, '_') + 1);
  123. }
  124. if (is_int($scene) && ($scene != 0)) { //临时二维码
  125. $sceneId = $scene;
  126. $qrcode = Qrcode::getQrcodeBySceneId($sceneId);
  127. } else { //永久二维码
  128. $sceneStr = $scene;
  129. $qrcode = Qrcode::getForeverQrcodeBySceneStr($sceneStr);
  130. }
  131. return $qrcode->id;
  132. }
  133. private function updateAgent($from_member_id)
  134. {
  135. $from_member = MemberShopInfo::getMemberShopInfo($from_member_id);
  136. $agent = Agents::getAgentByMemberId($from_member_id)->first();
  137. if (!is_null($agent) && (0 == $agent->parent_id || $agent->parent_id != $from_member->parent_id)) {
  138. $agent->parent_id = $from_member->parent_id;
  139. $agent->parent = $from_member->relation;
  140. $agent->save();
  141. //\Log::debug('------poster modify agent----');
  142. }
  143. }
  144. }