| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 | <?phpnamespace App\Http\Controllers\Admin;use App\Http\Logics\Admin\SocialLogic;use App\Http\Models\HootsuiteHistory;use App\Http\Models\HootsuiteUser;use App\Http\Models\PrSocial;use App\Http\Models\Site;use App\Http\Models\Social;use Facebook\Facebook;use GuzzleHttp\Client;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Log;use Laravel\Socialite\Facades\Socialite;class SocialStatisticsController extends Controller{    public function socialStatistics($siteId)    {        $site = Site::query()->where('id', $siteId)->first();        $startDate = HootsuiteHistory::query()->where('site_id', $siteId)->orderBy('publish_at')->value('publish_at') ?? date('Y-m-01 00:00:00', strtotime('first day of -1 month'));        $ym = date('Y-m-01 00:00:00', strtotime($startDate));        $ym2 = date('Y-m-t 23:59:59', strtotime('first day of -1 month'));        $this->getSitePublishStatus($siteId, $ym, $ym2);        $date1 = date('Y-m', strtotime('first day of -3 month'));        $date2 = date('Y-m', strtotime('first day of -2 month'));        $date3 = date('Y-m', strtotime('first day of -1 month'));        $twitterCountList = $this->getTwitterCountList($siteId, $ym, $ym2, $date1, $date2, $date3);        $facebookCountList = $this->getFacebookCountList($siteId, $ym, $ym2, $date1, $date2, $date3);        $linkedInCountList = $this->getLinkedInCountList($siteId, $ym, $ym2, $date1, $date2, $date3);        $pinCountList = $this->getPinCountList($siteId, $ym, $ym2, $date1, $date2, $date3);        $instagramCountList = $this->getInstagramCount($siteId, $ym, $ym2, $date1, $date2, $date3);        $youtubeCountList = $this->getYoutubeCountList($siteId, $ym, $ym2, $date1, $date2, $date3);        $dataList = [            [                'type' => 'twitter',                'data' => [                    'data_list' => $twitterCountList,                    'hide' => 0,                ]            ],            [                'type' => 'facebook',                'data' => [                    'data_list' => $facebookCountList,                    'hide' => 0,                ]            ],            [                'type' => 'linkedIn',                'data' => [                    'data_list' => $linkedInCountList,                    'hide' => 0,                ]            ],            [                'type' => 'pin',                'data' => [                    'data_list' => $pinCountList,                    'hide' => 0,                ]            ],            [                'type' => 'ins',                'data' => [                    'data_list' => $instagramCountList,                    'hide' => 0,                ]            ],            [                'type' => 'youtube',                'data' => [                    'data_list' => $youtubeCountList,                    'hide' => 0,                ]            ],        ];        $lastMonth = date('Ym', strtotime('first day of -1 month'));        foreach ($dataList as $item) {            if (PrSocial::query()->where(['site_id' => $site->id, 'ym' => $lastMonth])->where(['type' => $item['type']])->exists()) {                PrSocial::query()->where(['site_id' => $site->id, 'ym' => $lastMonth])->where(['type' => $item['type']])->update([                    'data_list' => json_encode($item['data']['data_list']),                    'hide' => $item['data']['hide'],                ]);            } else {                PrSocial::query()->create([                    'ym' => $lastMonth,                    'type' => $item['type'],                    'site_id' => $site->id,                    'old_id' => $site->old_id,                    'data_list' => $item['data']['data_list'],                    'hide' => $item['data']['hide']                ]);            }        }        $this->saveNextSocial($site, $dataList);        return response()->json(['message' => '操作成功']);    }    public function getSitePublishStatus($siteId, $ym, $ym2)    {        $list = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->select('id', 'site_id', 'url', 'publish_at', 'social_ids')            ->whereBetween('publish_at', [$ym, [$ym2]])            ->get();        foreach ($list as $key => $value) {            $socialIdList = json_decode($value->social_ids);            if (empty($socialIdList)) {                $twitter = strstr($value->url, 'twitter');                if (!empty($twitter)) {                    $value->is_twitter = 1;                }                $facebook = strstr($value->url, 'facebook');                if (!empty($facebook)) {                    $value->is_facebook = 1;                }                $linkEdin = strstr($value->url, 'linkedin');                if (!empty($linkEdin)) {                    $value->is_linkedIn = 1;                }                $pin = strstr($value->url, 'pin');                if (!empty($pin)) {                    $value->is_pin = 1;                }                $youtube = strstr($value->url, 'youtube');                if (!empty($youtube)) {                    $value->is_youtube = 1;                }                $instagram = strstr($value->url, 'instagram');                if (!empty($instagram)) {                    $value->is_instagram = 1;                }            } else {                $result = $this->getSocialId($value->site_id, $socialIdList);                foreach ($result as $kk => $vv) {                    if ($vv == 'TWITTER') {                        $value->is_twitter = 1;                    }                    if ($vv == 'FACEBOOKPAGE') {                        $value->is_facebook = 1;                    }                    if ($vv == 'LINKEDINCOMPANY') {                        $value->is_linkedIn = 1;                    }                    if ($vv == 'PINTEREST') {                        $value->is_pin = 1;                    }                }            }            $update = [];            if (!empty($value->is_twitter)) {                $update['is_twitter'] = $value->is_twitter ?? 0;            }            if (!empty($value->is_facebook)) {                $update['is_facebook'] = $value->is_facebook ?? 0;            }            if (!empty($value->is_linkedIn)) {                $update['is_linkedIn'] = $value->is_linkedIn ?? 0;            }            if (!empty($value->is_pin)) {                $update['is_pin'] = $value->is_pin ?? 0;            }            if (!empty($value->is_youtube)) {                $update['is_youtube'] = $value->is_youtube ?? 0;            }            if (!empty($value->is_instagram)) {                $update['is_instagram'] = $value->is_instagram ?? 0;            }            if (!empty($update)) {                DB::table('hootsuite_history')->where('id', $value->id)->update($update);            }        }    }    public function getSocialId($siteId, $socialIdsList)    {        $array = [];        $hootSuiteUser = HootsuiteUser::query()->where(['site_id' => $siteId])->first();        $socialProfiles = $hootSuiteUser->social_profiles ?? [];        foreach ($socialProfiles as $key => $value) {            foreach ($socialIdsList as $kk => $vv) {                if ($value['id'] == $vv) {                    $array[] = $value['type'];                }            }        }        return $array;    }    public function getTwitterCountList($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list1 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_twitter', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as twitter_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $twitterCount = [null, null, null];        if (empty($list1)) {            return $twitterCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list1 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->twitter_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $twitterCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $twitterCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $twitterCount[0] = $value['sum'];            }        }        return $twitterCount;    }    public function getFacebookCountList($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list2 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_facebook', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as facebook_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $facebookCount = [null, null, null];        if (empty($list2)) {            return $facebookCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list2 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->facebook_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $facebookCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $facebookCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $facebookCount[0] = $value['sum'];            }        }        return $facebookCount;    }    public function getLinkedInCountList($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list3 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_linkedIn', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as linkedIn_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $linkedInCount = [null, null, null];        if (empty($list3)) {            return $linkedInCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list3 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->linkedIn_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $linkedInCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $linkedInCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $linkedInCount[0] = $value['sum'];            }        }        return $linkedInCount;    }    public function getPinCountList($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list4 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_pin', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as pin_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $pinCount = [null, null, null];        if (empty($list4)) {            return $pinCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list4 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->pin_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $pinCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $pinCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $pinCount[0] = $value['sum'];            }        }        return $pinCount;    }    public function getYoutubeCountList($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list5 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_youtube', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as youtube_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $youtubeCount = [null, null, null];        if (empty($list5)) {            return $youtubeCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list5 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->youtube_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $youtubeCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $youtubeCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $youtubeCount[0] = $value['sum'];            }        }        return $youtubeCount;    }    public function getInstagramCount($siteId, $ym, $ym2, $date1, $date2, $date3)    {        $list6 = DB::table('hootsuite_history')            ->where('site_id', $siteId)            ->where('is_instagram', 1)            ->whereBetween('publish_at', [$ym, $ym2])            ->selectRaw('DATE_FORMAT(publish_at,"%Y-%m") as date, count(*) as instagram_count,site_id')            ->groupBy('date', 'site_id')->get()->toArray();        $instagramCount = [null, null, null];        if (empty($list6)) {            return $instagramCount;        }        $dateList = $this->getDateList($ym);        foreach ($dateList as $key => $value) {            $sum = 0;            foreach ($list6 as $kk => $vv) {                if (strtotime($value['date']) >= strtotime($vv->date)) {                    $sum += $vv->instagram_count;                }                $dateList[$key]['sum'] = $sum;            }        }        foreach ($dateList as $key => $value) {            if ($value['date'] == $date1) {                $instagramCount[2] = $value['sum'];            }            if ($value['date'] == $date2) {                $instagramCount[1] = $value['sum'];            }            if ($value['date'] == $date3) {                $instagramCount[0] = $value['sum'];            }        }        return $instagramCount;    }    //提前保存下个月的    private function saveNextSocial($site, $dataList)    {        $ym = date('Ym');        foreach ($dataList as $item) {            $data = PrSocial::query()->where(['site_id' => $site->id, 'ym' => $ym, 'type' => $item['type']])->first();            $item['data']['data_list'][0] = null;            if ($data) {                $data->data_list = $item['data']['data_list'];                $data->hide = $item['data']['hide'];                $data->save();            } else {                PrSocial::query()->create([                    'ym' => $ym,                    'type' => $item['type'],                    'site_id' => $site->id,                    'old_id' => $site->old_id,                    'data_list' => $item['data']['data_list'],                    'hide' => $item['data']['hide']                ]);            }        }    }    public function getDateList($ym)    {        $startTime = strtotime(date("Y-m", strtotime("-1 months", strtotime($ym))));        $endTime = strtotime(date('Y-m', strtotime("first day of -1 month")));        $dateList = [];        $i = 0;        while ($startTime < $endTime) {            $startTime = strtotime('+1 Month', $startTime);            $i++;            $dateList[$i]['date'] = date('Y-m', $startTime);        }        return $dateList;    }}
 |