浏览代码

user property

zz 6 年之前
父节点
当前提交
9d3d4f1a9f

+ 5 - 2
app/Console/Commands/BookSpider.php

@@ -47,7 +47,10 @@ class BookSpider extends Command
     private function cpc(){
         //32426552
 
-        $sql_format = "SELECT u.id,f.subscribe_time,u.openid,(SELECT ifnull(sum(price),0) from orders where uid = u.id and `status` = 'PAID' LIMIT 1)as amount  FROM users u
+        $sql_format = "SELECT u.id,f.created_at as subscribe_time,u.openid,
+(SELECT ifnull(sum(price),0) from orders where uid = u.id and `status` = 'PAID' LIMIT 1)as amount,
+(SELECT ifnull(sum(price),0) from orders where uid=u.id and `status` = 'PAID' and created_at <= DATE_ADD(f.created_at,INTERVAL 3 day)) as three_day_amount
+  FROM users u
 JOIN force_subscribe_users f on u.id = f.uid 
 WHERE u.openid in (SELECT openid from users WHERE  id = %s)";
         $all = 32427;
@@ -75,7 +78,7 @@ WHERE u.openid in (SELECT openid from users WHERE  id = %s)";
             if(time()-strtotime($v->subscribe_time) >= 86400*3){
                 array_push($subscribe_three_day_info,$v->amount);
             }else{
-                array_push($subscribe_no_three_day_info,$v->amount);
+                array_push($subscribe_no_three_day_info,$v->three_day_amount);
             }
         }
         $result = [

+ 17 - 1
app/Http/Controllers/Wap/Pay/OrdersController.php

@@ -2,11 +2,13 @@
 
 namespace App\Http\Controllers\Wap\Pay;
 
+use App\Admin\Models\User;
 use App\Modules\Book\Services\ChapterService;
 use App\Modules\OfficialAccount\Services\OfficialAccountService;
 use App\Modules\Subscribe\Services\OrderParamService;
 use App\Modules\Subscribe\Services\SubstituteOrderService;
 use App\Modules\User\Services\ReadRecordService;
+use App\Modules\User\Services\UserDivisionCpcPropertyService;
 use Illuminate\Routing\Controller;
 use App\Libs\Pay\WechatPay;
 use Illuminate\Http\Request;
@@ -872,7 +874,8 @@ class OrdersController extends Controller
                     'openid' => isset($uid) ? $uid : '0',// 没有openid,用uid写log
                 ];
                 UserService::PushUserActionToQueue($action_type, $distribution_channel_id, $param);
-
+                //用户属性
+                $this->userProperty($uid);
                 return true;
             } catch (\Exception $e) {
                 DB::rollback();
@@ -1018,6 +1021,7 @@ class OrdersController extends Controller
                     $this->successPayPushMsg($uid, $product, $order->id);
                     $this->orderStatistical($order);
                     DB::commit();
+                    $this->userProperty($uid);
                     //redis 删除未支付的uid
                     try {
                         $key = 'leyuee:to_send_not_pay_uid:distribution_channel_id:' . $distribution_channel_id;
@@ -1127,6 +1131,7 @@ class OrdersController extends Controller
                 $this->successPayPushMsg($uid, $product, $order->id);
                 $this->orderStatistical($order);
                 DB::commit();
+                $this->userProperty($uid);
                 //redis 删除未支付的uid
                 $key = 'leyuee:to_send_not_pay_uid:distribution_channel_id' . $distribution_channel_id;
                 Redis::hdel($key, $uid);
@@ -1258,6 +1263,8 @@ class OrdersController extends Controller
                     ];
                     UserService::PushUserActionToQueue($action_type, $distribution_channel_id, $param);
 
+                    $this->userProperty($uid);
+
                 }
             } else {
                 Log::info('wcback_palmpay_notify_sign_fail');
@@ -1687,4 +1694,13 @@ class OrdersController extends Controller
         }
         return 0;
     }
+
+    private function userProperty($uid){
+        try{
+            $userproperty = UserDivisionCpcPropertyService::getUserSubscribeAndChargeInfoByUid($uid);
+            if(!$userproperty) return ;
+            UserDivisionCpcPropertyService::createorUpdate($userproperty);
+        }catch (\Exception $e){}
+
+    }
 }

+ 19 - 0
app/Http/Controllers/Wap/Web/WelcomeController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers\Wap\Web;
 
 use App\Admin\Models\Product;
+use App\Jobs\SendStatisticsList;
 use App\Jobs\SendTexts;
 use App\Modules\Activity\Services\ActivitySwitchService;
 use App\Modules\Channel\Services\ChannelActivitiesService;
@@ -143,6 +144,9 @@ class WelcomeController extends BaseController
         //突出包年的充值页面
         $outstanding_year_order = $this->outstandingYearOrder();
         $pdd_ad = $this->pddAd();
+
+        //用户分割
+        $this->userPproperty($user->openid);
         $options = json_encode([
             'distribution_channel_id' => (int)$this->distribution_channel_id,
             'send_order_id' => $send_order_id,
@@ -2020,4 +2024,19 @@ class WelcomeController extends BaseController
             $url = env('CREATE_PAY_URL') . '?' . http_build_query($param);
         return view('pay.order.vernalEquinoxActivity', ['url' => $url, 'code' => 0, 'type' => $type, 'img' => $img]);
     }
+
+
+    private function userPproperty($openid){
+        try {
+            $send_data = array(
+                'type' => 'visit',
+                'data' => ['openid'=>$openid,'uid'=>$this->uid]
+            );
+            $send = new SendStatisticsList($send_data);
+            $job = ($send)->onConnection('rabbitmq')->delay(0)->onQueue('send_statistics_list');
+            dispatch($job);
+        } catch (\Exception $e) {
+            Log::info($e);
+        }
+    }
 }

+ 12 - 0
app/Http/Middleware/ReadOauth.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Middleware;
 
+use App\Jobs\SendStatisticsList;
 use App\Modules\Book\Services\BookConfigService;
 use App\Modules\Channel\Models\YqMoveChannel;
 use App\Modules\Channel\Services\ChannelService;
@@ -378,6 +379,17 @@ class ReadOauth
             'last_interactive_time' => date('Y-m-d H:i:s')
         ]);
 
+        try {
+            $send_data = array(
+                'type' => 'subscribe',
+                'data' => ['openid'=>'','uid'=>$uid]
+            );
+            $send = new SendStatisticsList($send_data);
+            $job = ($send)->onConnection('rabbitmq')->delay(0)->onQueue('send_statistics_list');
+            dispatch($job);
+        } catch (\Exception $e) {
+            Log::info($e);
+        }
         return true;
     }
 

+ 28 - 1
app/Jobs/SendStatisticsList.php

@@ -5,6 +5,7 @@ namespace App\Jobs;
 use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
 use App\Modules\OfficialAccount\Models\OfficialAccount;
 use App\Modules\Statistic\Models\SendOrderBreadevenStat;
+use App\Modules\User\Services\UserDivisionCpcPropertyService;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Queue\SerializesModels;
@@ -34,7 +35,12 @@ class SendStatisticsList extends Job implements ShouldQueue
     {
         if($this->data['type'] == 'order_info'){
             $this->orderInfo($this->data['data']);
-        }else{
+        }elseif($this->data['type'] == 'visit'){
+            $this->visit($this->data['openid']);
+        }elseif($this->data['type'] == 'subscribe'){
+            $this->subscribe($this->data['uid']);
+        }
+        else{
             $this->subscribe_info($this->data['data']);
         }
 
@@ -193,6 +199,27 @@ class SendStatisticsList extends Job implements ShouldQueue
     }
 
 
+    private function subscribe($uid){
+        UserDivisionCpcPropertyService::afterForceSubscribe($uid);
+    }
+
+    private function visit($openid){
+        $user = UserDivisionCpcPropertyService::userLevel($openid);
+        if(!$user){
+            return ;
+        }
+        if($user->type != 'NEW'){
+            return ;
+        }
+
+        $level = UserDivisionCpcPropertyService::getUserSubscribeAndChargeInfoByOpenid($openid);
+        if(!$level) return ;
+
+        if($level['type'] == $user->type) return ;
+
+        UserDivisionCpcPropertyService::update($openid,$level['property'],$level['type']);
+    }
+
     private function getDateRes($date,$distribution_channel_id,$official_account_id){
         return SendOrderBreadevenStat::where('date',$date)
             ->where('distribution_channel_id',$distribution_channel_id)

+ 11 - 0
app/Modules/User/Models/UserDivisionCpcProperty.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Modules\User\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class UserDivisionCpcProperty extends Model
+{
+    protected $table = 'user_division_cpc_property';
+    protected $fillable = ['openid','property','is_enable','type','earliest_subscribe_time'];
+}

+ 207 - 0
app/Modules/User/Services/UserDivisionCpcPropertyService.php

@@ -0,0 +1,207 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: z-yang
+ * Date: 2019/4/26
+ * Time: 10:14
+ */
+
+namespace App\Modules\User\Services;
+
+use App\Modules\User\Models\UserDivisionCpcProperty;
+use DB;
+
+class UserDivisionCpcPropertyService
+{
+
+    public static function userLevel($openid){
+        return UserDivisionCpcProperty::where('openid',$openid)->where('is_enable',1)->select('property','earliest_subscribe_time')->first();
+    }
+
+    public static function getUserSubscribeAndChargeInfoByUid($uid){
+        $sql_format = "SELECT u.id,f.created_at as subscribe_time,u.openid,
+(SELECT ifnull(sum(price),0) from orders where uid = u.id and `status` = 'PAID' LIMIT 1)as amount,
+(SELECT ifnull(sum(price),0) from orders where uid=u.id and `status` = 'PAID' and created_at <= DATE_ADD(f.created_at,INTERVAL 3 day)) as three_day_amount
+  FROM users u
+JOIN force_subscribe_users f on u.id = f.uid 
+WHERE u.openid in (SELECT openid from users WHERE  id = %s)";
+        $result = DB::select(sprintf($sql_format,$uid));
+        if($result){
+            return self::level($result);
+        }
+        return [];
+    }
+
+    public static function getUserSubscribeAndChargeInfoByOpenid($openid){
+        $sql_format = "SELECT u.id,f.created_at as subscribe_time,u.openid,
+(SELECT ifnull(sum(price),0) from orders where uid = u.id and `status` = 'PAID' LIMIT 1)as amount,
+  (SELECT ifnull(sum(price),0) from orders where uid=u.id and `status` = 'PAID' and created_at <= DATE_ADD(f.created_at,INTERVAL 3 day)) as three_day_amount
+FROM users u
+JOIN force_subscribe_users f on u.id = f.uid 
+WHERE u.openid ='%s'";
+        $result = DB::select(sprintf($sql_format,$openid));
+        if($result){
+            return self::level($result);
+        }
+        return [];
+    }
+
+    private static function level($res){
+        $earliest_subscribe_time = $res[0]->subscribe_time;
+        $subscribe_three_day_info = [];
+        $subscribe_no_three_day_info = [];
+        foreach ($res as $v){
+            (strtotime($v->subscribe_time) < strtotime($earliest_subscribe_time)) && $earliest_subscribe_time = $v->subscribe_time;
+            if(time()-strtotime($v->subscribe_time) >= 86400*3){
+                array_push($subscribe_three_day_info,$v->amount);
+            }else{
+                array_push($subscribe_no_three_day_info,$v->three_day_amount);
+            }
+        }
+        $result = [
+            'earliest_subscribe_time'=>$earliest_subscribe_time,
+            'property'=>'',
+            'type'=>'',
+            'openid'=> $res[0]->openid
+        ];
+        if($subscribe_three_day_info){
+            //存量用户
+            $result['type'] = 'CUILIANG';
+            $amount = round(array_sum($subscribe_three_day_info)/count($subscribe_three_day_info),2);
+            if($amount>15){
+                $result['property'] = 'high';
+            }elseif($amount >2){
+                $result['property'] = 'medium';
+            } elseif($amount >0){
+                $result['property'] = 'low';
+            } else{
+                $result['property'] = 'none';
+            }
+        }else{
+            //新用户
+            $result['type'] = 'NEW';
+            if($subscribe_no_three_day_info)
+                $amount = max($subscribe_no_three_day_info);
+            else
+                $amount = 0;
+            if($amount>50){
+                $result['property'] = 'high';
+            }elseif($amount >2){
+                $result['property'] = 'medium';
+            } elseif($amount >0){
+                $result['property'] = 'low';
+            } else{
+                $result['property'] = 'none';
+            }
+        }
+
+        return $result;
+    }
+
+    public static function update($openid,$property='',$type=''){
+        if(empty($property) && empty($type)) return ;
+        $update_info = [];
+        $property && $update_info['property'] = $property;
+        $type && $update_info['type'] = $type;
+
+        UserDivisionCpcProperty::where('openid',$openid)->where('is_enable',1)->update($update_info);
+    }
+    public static function createorUpdate($data){
+        $old = UserDivisionCpcProperty::where('openid',$data['openid'])->where('is_enable',1)->first();
+        if(!$old){
+            UserDivisionCpcProperty::create([
+                'openid'=>$data['openid'] ,
+                'property'=>$data['property'] ,
+                'is_enable'=>1 ,
+                'type'=>$data['type'] ,
+                'earliest_subscribe_time'=>$data['earliest_subscribe_time']
+            ]);
+        }else{
+            $old->property = $data['property'];
+            $old->type = $data['type'];
+            $old->save();
+        }
+    }
+
+    public static function afterForceSubscribe($uid){
+
+        $sql_format = "SELECT u.id,f.created_at as subscribe_time,u.openid,
+(SELECT ifnull(sum(price),0) from orders where uid = u.id and `status` = 'PAID' LIMIT 1)as amount,
+(SELECT ifnull(sum(price),0) from orders where uid=u.id and `status` = 'PAID' and created_at <= DATE_ADD(f.created_at,INTERVAL 3 day)) as three_day_amount
+  FROM users u
+JOIN force_subscribe_users f on u.id = f.uid 
+WHERE u.openid in (SELECT openid from users WHERE  id = %s)";
+        $res = DB::select(sprintf($sql_format,$uid));
+        if(!$res) return ;
+        //判断用户属性
+        $earliest_subscribe_time = $res[0]->subscribe_time;
+        $subscribe_total_info = [];
+        $subscribe_no_three_day_info = [];
+        foreach ($res as $v){
+            (strtotime($v->subscribe_time) < strtotime($earliest_subscribe_time)) && $earliest_subscribe_time = $v->subscribe_time;
+            if(time()-strtotime($v->subscribe_time) >= 86400*3){
+                array_push($subscribe_total_info,$v->amount);
+            }else{
+                array_push($subscribe_no_three_day_info,$v->three_day_amount);
+            }
+        }
+        $result = [
+            'earliest_subscribe_time'=>$earliest_subscribe_time,
+            'property'=>'',
+            'type'=>'',
+            'openid'=> $res[0]->openid
+        ];
+        if($subscribe_total_info){
+            //存量用户
+            $result['type'] = 'CUILIANG';
+            $amount = round(array_sum($subscribe_total_info)/count($subscribe_total_info),2);
+            if($amount>15){
+                $result['property'] = 'high';
+            }elseif($amount >2){
+                $result['property'] = 'medium';
+            } elseif($amount >0){
+                $result['property'] = 'low';
+            } else{
+                $result['property'] = 'none';
+            }
+        }else{
+            //新用户
+            $result['type'] = 'NEW';
+            if($subscribe_no_three_day_info)
+                $amount = max($subscribe_no_three_day_info);
+            else
+                $amount = 0;
+            if($amount>50){
+                $result['property'] = 'high';
+            }elseif($amount >2){
+                $result['property'] = 'medium';
+            } elseif($amount >0){
+                $result['property'] = 'low';
+            } else{
+                $result['property'] = 'none';
+            }
+        }
+        //保存或者创建用户属性
+
+        $old = DB::table('user_division_cpc_property')->where('openid',$result['openid'])->where('is_enable',1)->first();
+        if(!$old){
+            UserDivisionCpcProperty::create([
+                'openid'=>$result['openid'] ,
+                'property'=>$result['property'] ,
+                'is_enable'=>1 ,
+                'type'=>$result['type'] ,
+                'earliest_subscribe_time'=>$result['earliest_subscribe_time'],
+                'updated_at'=>date('Y-m-d H:i:s'),
+                'created_at'=>date('Y-m-d H:i:s')
+            ]);
+        }else{
+            DB::table('user_division_cpc_property')->where('openid',$result['openid'])->where('is_enable',1)->update(
+                [
+                    'type'=>$result['type'] ,
+                    'property'=>$result['property'] ,
+                    'updated_at'=>date('Y-m-d H:i:s')
+                ]
+            );
+        }
+    }
+}