123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- <?php
- /**
- * 汇总统计
- * @copyright 2021-浙江引擎力营销策划有限公司
- * @author Lc<sunshinecc1@163.com>
- * @since 2021-10-13
- */
- namespace App\Http\Controllers\Admin\Analyze;
- use App\Http\Controllers\Controller;
- use App\Http\Models\PrKeywordExtend;
- use App\Http\Models\Role;
- use App\Http\Models\Site;
- use App\Http\Models\SitesStatus;
- use App\Http\Models\User;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Contracts\View;
- use Illuminate\Http\JsonResponse;
- class CollectController extends Controller
- {
- /**
- * 404合集
- * @param Request $request
- * @return View\Factory|JsonResponse|View\View
- */
- public function collect(Request $request)
- {
- if (!$request->ajax()) {
- return view('admin/analyze/collect', [
- 'web' => Role::getUsers(Role::TYPE_WEB),
- 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
- 'optimizers_edit' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
- ]);
- }
- $build = SitesStatus::query();
- $build = $this->inquire($request, $build);
- $cnTitleList = Site::query()->pluck('cn_title', 'id');
- $domainList = Site::query()->pluck('domain', 'id');
- $memoList = Site::query()->pluck('not_found_memo', 'id');
- $list = $build->with(['users'])
- ->where('status', 404)
- ->where('is_handle', 0)
- ->where('url', 'NOT LIKE', '%javascript:%')
- ->where('url', 'NOT LIKE', '%tel:%')
- ->where('url', 'NOT LIKE', '%mailto:%')
- ->where('url', 'NOT LIKE', '%$%')
- ->where('url', 'NOT LIKE', '%skype%')
- ->where('url', 'NOT LIKE', '%whatsapp%')
- ->selectRaw('count(*) as count,site_id')
- ->groupBy('site_id')
- ->paginate($request->input('pageSize') ?? 20);
- foreach ($list as $item) {
- $item->not_found = $memoList[$item->site_id] ?? '';
- $item->cn_title = $cnTitleList[$item->site_id] ?? '';
- $item->domain = $domainList[$item->site_id] ?? '';
- $item->web = $item->users->where('role_id', Role::TYPE_WEB)->first()->nickname ?? '';
- $item->optimization = $item->users->where('role_id', Role::TYPE_OPTIMIZER)->first()->nickname ?? '';
- $item->optimizationAe = $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->first()->nickname ?? '';
- }
- return response()->json([
- 'rows' => $list->items(),
- 'total' => $list->total()
- ]);
- }
- /**
- * 测速合集
- * @param Request $request
- * @return View\Factory|JsonResponse|\Illuminate\View\View
- */
- public function speedMeasurement(Request $request)
- {
- if (!$request->ajax()) {
- return view('admin/analyze/speed', [
- 'web' => Role::getUsers(Role::TYPE_WEB),
- 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
- 'optimizers_edit' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
- ]);
- }
- $build = Site::query();
- $build = $this->inquire($request, $build, 'id');
- $siteList = $build->with(['users'])
- ->whereIn('status', [2, 3])
- ->select('id', 'old_id', 'domain', 'cn_title', 'speed_memo')
- ->whereNotNull('database')
- ->get();
- $pcSpeedMeasurement = [];
- $mobileSpeedMeasurement = [];
- $speedMeasurementList = DB::table('app_speed_measurement_cache')->get();
- foreach ($speedMeasurementList as $key => $value) {
- $array = json_decode($value->cache, true);
- $pcSpeedMeasurementResult = $array['pc'];
- $mobileSpeedMeasurementResult = $array['mobile'];
- $oldId = str_replace('cache:app/Http/Controllers/SpeedMeasurementController/index:', '', $value->key);
- $pcSpeedMeasurement[$oldId] = $pcSpeedMeasurementResult;
- $mobileSpeedMeasurement[$oldId] = $mobileSpeedMeasurementResult;
- }
- foreach ($siteList as $item) {
- $item->web = $item->users->where('role_id', Role::TYPE_WEB)->first()->nickname ?? '';
- $item->optimization = $item->users->where('role_id', Role::TYPE_OPTIMIZER)->first()->nickname ?? '';
- $item->optimizationAe = $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->first()->nickname ?? '';
- $item->pcSpeedMeasurement = $pcSpeedMeasurement[$item->old_id] ?? '';
- $item->mobileSpeedMeasurement = $mobileSpeedMeasurement[$item->old_id] ?? '';
- }
- foreach ($siteList as $key => $value) {
- if ($value->pcSpeedMeasurement > 79) {
- unset($siteList[$key]);
- }
- }
- $res = collect($siteList)->sortByDesc('pcSpeedMeasurement');
- $perPage = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
- $result = $this->paginateCollection($res, $perPage);
- return response()->json([
- 'rows' => $result->items(),
- 'total' => $result->total()
- ]);
- }
- /**
- * 查询
- * @param $request object
- * @param $build object
- * @param $siteFile string
- * @return mixed
- */
- private function inquire($request, $build, $siteFile = 'site_id')
- {
- $keyword = $request->input('keyword');
- if (!empty($keyword)) {
- $siteIds = Site::query()
- ->where('domain', 'like', '%' . $keyword . '%')
- ->orWhere('cn_title', 'like', '%' . $keyword . '%')
- ->pluck('id');
- $build->whereIn($siteFile, $siteIds);
- }
- $webId = $request->input('webId');
- if (!empty($webId)) {
- $userIds = User::query()->where('id', $webId)->pluck('id');
- $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
- $build->whereIn($siteFile, $siteIds);
- }
- $optimizerId = $request->input('optimizerId');
- if (!empty($optimizerId)) {
- $userIds = User::query()->where('id', $optimizerId)->pluck('id');
- $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
- $build->whereIn($siteFile, $siteIds);
- }
- $optimizersEditId = $request->input('optimizersEditId');
- if (!empty($optimizersEditId)) {
- $userIds = User::query()->where('id', $optimizersEditId)->pluck('id');
- $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
- $build->whereIn($siteFile, $siteIds);
- }
- return $build;
- }
- /**
- * 保存备注
- * @param Request $request
- * @return JsonResponse
- */
- public function saveMemo(Request $request)
- {
- $memo = $request->input('memo') ?? '';
- $type = $request->input('type') ?? 1;
- $siteId = $request->input('siteId');
- if (!empty($siteId)) {
- if ($type == 1) {
- Site::query()->where('id', $siteId)->update(['speed_memo' => $memo]);
- } elseif ($type == 2) {
- Site::query()->where('id', $siteId)->update(['not_found_memo' => $memo]);
- } else {
- Site::query()->where('id', $siteId)->update(['keyword_memo' => $memo]);
- }
- return response()->json(['message' => '操作成功']);
- }
- }
- /**
- * 关键词未拓展统计
- * @param Request $request
- * @return View\Factory|\Illuminate\View\View
- */
- public function keywordsExpand(Request $request)
- {
- if (!$request->ajax()) {
- return view('admin/analyze/keywords_expand', [
- 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
- 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
- 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
- 'optimizationEditingUser' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
- ]);
- }
- $keyword = $request->input('keyword');
- $filterUserIds = [];
- $sellerId = $request->input('sellerId');
- $sellerId && $filterUserIds[] = $sellerId;
- $serverId = $request->input('serverId');
- $serverId && $filterUserIds[] = $serverId;
- $optimizerId = $request->input('optimizerId');
- $optimizerId && $filterUserIds[] = $optimizerId;
- $optimizationEditingUserId = $request->input('optimizationEditingUserId');
- $optimizationEditingUserId && $filterUserIds[] = $optimizationEditingUserId;
- $builder = Site::query()->with(['users']);
- if ($filterUserIds) {
- $builder->whereExists(function (\Illuminate\Database\Query\Builder $b) use ($filterUserIds) {
- $raw = sprintf('SUM(CASE WHEN user_id in (%s) then 1 ELSE 0 end) as total', implode(',', $filterUserIds));
- $b->select(DB::raw($raw))->from('user_has_sites')
- ->whereRaw(sprintf('user_has_sites.site_id=sites.id HAVING total=%s', count($filterUserIds)));
- });
- }
- $type = $request->input('type');
- //每个项目最新的一次的记录的id
- $maxIds = PrKeywordExtend::query()->selectRaw('max(id) as id_max,site_id')
- ->groupBy('site_id')
- ->pluck('id_max', 'site_id')->toArray();
- //全部拓展过
- $siteByKeyWordList = PrKeywordExtend::query()
- ->whereIn('id', $maxIds)
- ->pluck('ym', 'site_id')->toArray();
- $ids = array_keys($siteByKeyWordList);
- //3个月内没有拓展过
- if (empty($type)) {
- $list = PrKeywordExtend::query()->whereIn('id', $maxIds)->get();
- $ids = [];
- $date = date("Ym", strtotime("last day of -3 month", strtotime(date("Ym"))));
- foreach ($list as $value) {
- if ($value->ym <= $date) {
- $ids[] = $value->site_id;
- }
- }
- }
- //从未拓展过
- if ($type == 1) {
- $date = date("Y-m-d", strtotime("last day of -3 month", strtotime(date("Y-m-d"))));
- $id = Site::query()
- ->where('online_at', '<=', $date)
- ->whereIn('status', [2, 3])
- ->pluck('id')->toArray();
- $ids = [];
- foreach ($id as $value) {
- $result = PrKeywordExtend::query()->where('site_id', $value)->first();
- if (empty($result)) {
- $ids[] = $value;
- }
- }
- }
- $siteList = $builder
- ->select('id', 'old_id', 'cn_title', 'status', 'domain', 'expired_at', 'reach_at', 'keyword_goal', 'keyword_memo')
- ->whereIn('id', $ids)
- ->whereIn('status', [2, 3])
- ->where(function (Builder $builder) use ($keyword) {
- if ($keyword) {
- $builder->where('domain', 'like', '%' . $keyword . '%')
- ->orWhere('cn_title', 'like', '%' . $keyword . '%');
- }
- })->get();
- $oldIds = array_filter(array_column($siteList->toArray(), 'old_id'));
- $top10ListMap = DB::connection('rank')->table('project_keyword')
- ->whereIn('project_id', $oldIds)
- ->selectRaw('SUM(CASE WHEN google_rank <= 10 THEN 1 ELSE 0 END) as top10,project_id')
- ->groupBy('project_id')->get()->keyBy('project_id')->toArray();
- foreach ($siteList as $item) {
- $item->status = Site::STATUS_MAP[$item->status];
- $item->renewal_at = substr($item->renewal_at, 0, 10);
- $item->expired_at = substr($item->expired_at, 0, 10);
- $item->reach_at = substr($item->reach_at, 0, 10);
- $item->top10 = $item->old_id ? ($top10ListMap[$item->old_id]->top10 ?? '-') : '未关联'; //实际达标关键词
- $item->ym = $siteByKeyWordList[$item->id] ?? '';
- $item->optimizer = implode('-', $item->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('nickname')->toArray());
- $item->optimizerAe = implode('-', $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('nickname')->toArray());
- };
- $res = collect($siteList)->sortByDesc('ym');
- $perPage = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
- $result = $this->paginateCollection($res, $perPage);
- return response()->json([
- 'rows' => $result->items(),
- 'total' => $result->total()
- ]);
- }
- }
|