123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?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]);
- }
- }
- if($tags['uid'] ?? 0) {
- $sql->where('b.uid', $tags['uid']);
- }
- if($tags['video_watch'] ?? []) {
- $sql->whereRaw(sprintf("json_contains(a.video_watch, cast('[%s]' as json))",
- join(',', $tags['video_watch'])));
- }
- if($tags['video_charge'] ?? []) {
- $sql->whereRaw(sprintf("json_contains(a.video_charge, cast('[%s]' as json))",
- join(',', $tags['video_charge'])));
- }
- return $sql;
- }
- 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]]
- ];
- }
- }
|