liuzejian 1 rok pred
rodič
commit
58e879fd6b

+ 17 - 10
app/Console/Commands/ContentManage/ContentTest.php

@@ -6,6 +6,7 @@ use http\Exception\RuntimeException;
 use Illuminate\Console\Command;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Redis;
+use Modules\Audience\Services\UserGroupService;
 use Modules\Common\Errors\Errors;
 use Modules\Common\Exceptions\CommonBusinessException;
 
@@ -30,15 +31,21 @@ class ContentTest extends Command
      */
     public function handle(): void
     {
-       $result = DB::table('promotions')
-           ->where(['puid' => 0])
-           ->get();
-       foreach ($result as $item) {
-           DB::table('promotions')
-               ->where('id', $item->id)
-               ->update([
-                   'puid' => DB::table('users')->where('id', $item->uid)->value('pid')
-               ]);
-       }
+        $tags = [
+            'attention_hour' => '0-6',
+            'in_48_hour' => 1,
+            'interact_hour' => '0-6',
+            'last_watch_day' => '0-2',
+            'register_day' => '0-2',
+            'total_watch_day' => '0-2',
+            'charge_type' => 1,
+            'total_charge_money' => '1-1000',
+            'avg_charge_money' => '2-300',
+            'charge_num' => '1-1',
+            'remain_coin' => '0-1',
+            'last_charge_day' => '0-4',
+        ];
+
+        $sql = UserGroupService::getSQL($tags);
     }
 }

+ 2 - 1
app/Providers/AppServiceProvider.php

@@ -2,6 +2,7 @@
 
 namespace App\Providers;
 
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\ServiceProvider;
 
 class AppServiceProvider extends ServiceProvider
@@ -23,6 +24,6 @@ class AppServiceProvider extends ServiceProvider
      */
     public function boot()
     {
-        //
+
     }
 }

+ 133 - 0
modules/Audience/Services/UserGroupService.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace Modules\Audience\Services;
+
+use Illuminate\Support\Facades\DB;
+
+class UserGroupService
+{
+    public static function getSQL($tags) {
+        $now = time();
+        $sql = DB::table('user_some_info as a');
+        if(strlen($tags['attention_hour'] ?? '') || (1 == $tags['in_48_hour'] ?? 1) ||
+        strlen($tags['interact_hour'] ?? '') || $tags['gzh_appids'] ?? []) {
+            $sql->join('wechat_official_user_info as b', 'a.uid', '=', 'b.uid');
+            if(strlen($tags['attention_hour'] ?? '')) {
+                $filter = self::filterTime($tags['attention_hour'], 'hour');
+                foreach ($filter as $f) {
+                    $sql->where([
+                        ['b.subscribe_time', $f[0], $f[1]]
+                    ]);
+                }
+            }
+            if(1 == $tags['in_48_hour'] ?? 1) {
+                $filter = self::filterTime('0-48', 'hour');
+                foreach ($filter as $f) {
+                    $sql->where([
+                        ['b.subscribe_time', $f[0], $f[1]]
+                    ]);
+                }
+            }
+            if(strlen($tags['interact_hour'] ?? '')) {
+                $filter = self::filterTime($tags['interact_hour'], 'hour');
+                foreach ($filter as $f) {
+                    $sql->where([
+                        ['b.active_at', $f[0], $f[1]]
+                    ]);
+                }
+            }
+            if($tags['gzh_appids'] ?? []) {
+                $sql->whereIn('b.gzh_appid', $tags['gzh_appids']);
+            }
+        }
+
+        if(strlen($tags['last_watch_day'] ?? '')) {
+            $filter = self::filterTime($tags['last_watch_day'], 'day');
+            foreach ($filter as $f) {
+                $sql->where('a.last_watch_at', $f[0], $f[1]);
+            }
+        }
+
+        if(strlen($tags['register_day'] ?? '')) {
+            $filter = self::filterTime($tags['register_day'], 'day');
+            foreach ($filter as $f) {
+                $sql->where('a.register_at', $f[0], $f[1]);
+            }
+        }
+
+        if(strlen($tags['total_watch_day'] ?? '')) {
+            $filter = self::filterNum($tags['total_watch_day']);
+            foreach ($filter as $f) {
+                $sql->where('a.total_watch_day', $f[0], $f[1]);
+            }
+        }
+
+        if($tags['charge_type']){
+            switch ($tags['charge_type']) {
+                case 4:
+                    $sql->where('a.is_vip', 1)
+                        ->where('a.vip_end_at', '>=', $now);
+                    break;
+                default:
+                    $sql->where('a.charge_type', $tags['charge_type']);
+                    break;
+            }
+        }
+
+        if($tags['total_charge_money']) {
+            $filter = self::filterNum($tags['total_charge_money']);
+            foreach ($filter as $f) {
+                $sql->where('a.total_charge_money', $f[0], $f[1]);
+            }
+        }
+
+        if($tags['avg_charge_money']) {
+            $filter = self::filterNum($tags['avg_charge_money']);
+            foreach ($filter as $f) {
+                $sql->where('a.avg_charge_money', $f[0], $f[1]);
+            }
+        }
+        if($tags['charge_num']) {
+            $filter = self::filterNum($tags['charge_num']);
+            foreach ($filter as $f) {
+                $sql->where('a.charge_num', $f[0], $f[1]);
+            }
+        }
+        if($tags['remain_coin']) {
+            $filter = self::filterNum($tags['remain_coin']);
+            foreach ($filter as $f) {
+                $sql->where('a.remain_coin', $f[0], $f[1]);
+            }
+        }
+
+        if(strlen($tags['last_charge_day'] ?? '')) {
+             $filter = self::filterTime($tags['last_charge_day']);
+             foreach ($filter as $f) {
+                 $sql->where('a.last_charge_at', $f[0], $f[1]);
+             }
+        }
+        $res =  $sql->distinct()
+            ->select('a.uid', 'b.mp_openid')->get();
+    }
+
+
+    public static function filterTime($time, $type='day') {
+        $factor = 'hour' == $type ?  3600 :  24 * 3600;
+        $arr = explode('-', $time);
+        if(0 == $arr[1]) $arr[1] = PHP_INT_MAX;
+        $now = time();
+        return [
+            ['>=', $arr[0] * $factor + $now],
+            ['<=', $arr[1] * $factor + $now],
+        ];
+    }
+
+    public static function filterNum($numStr) {
+        $arr = explode('-', $numStr);
+        if(0 == $arr[1]) $arr[1] = PHP_INT_MAX;
+        return [
+            ['>=', $arr[0]],
+            ['<=', $arr[1]]
+        ];
+    }
+}

+ 31 - 0
tests/Audience/Services/UserGroupServiceTest.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace Tests\Audience\Services;
+
+use Illuminate\Support\Facades\DB;
+use Modules\Audience\Services\UserGroupService;
+use PHPUnit\Framework\TestCase;
+
+class UserGroupServiceTest extends \Tests\TestCase
+{
+
+    public function testGetSQL()
+    {
+        $tags = [
+//            'attention_hour' => '0-6',
+//            'in_48_hour' => 1,
+//            'interact_hour' => '0-6',
+            'last_watch_day' => '0-2',
+            'register_day' => '0-2',
+            'total_watch_day' => '0-2',
+            'charge_type' => 1,
+            'total_charge_money' => '1-1000',
+            'avg_charge_money' => '2-300',
+            'charge_num' => '1-1',
+            'remain_coin' => '0-1',
+            'last_charge_day' => '0-4',
+        ];
+
+        $sql = UserGroupService::getSQL($tags);
+    }
+}