| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | <?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 uJOIN 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_amountFROM users uJOIN 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 uJOIN 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')                ]            );        }    }}
 |