CollectController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <?php
  2. /**
  3. * 汇总统计
  4. * @copyright 2021-浙江引擎力营销策划有限公司
  5. * @author Lc<sunshinecc1@163.com>
  6. * @since 2021-10-13
  7. */
  8. namespace App\Http\Controllers\Admin\Analyze;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Models\PrKeywordExtend;
  11. use App\Http\Models\Role;
  12. use App\Http\Models\Site;
  13. use App\Http\Models\SitesStatus;
  14. use App\Http\Models\User;
  15. use Illuminate\Database\Eloquent\Builder;
  16. use Illuminate\Http\Request;
  17. use Illuminate\Support\Facades\DB;
  18. use Illuminate\Contracts\View;
  19. use Illuminate\Http\JsonResponse;
  20. class CollectController extends Controller
  21. {
  22. /**
  23. * 404合集
  24. * @param Request $request
  25. * @return View\Factory|JsonResponse|View\View
  26. */
  27. public function collect(Request $request)
  28. {
  29. if (!$request->ajax()) {
  30. return view('admin/analyze/collect', [
  31. 'web' => Role::getUsers(Role::TYPE_WEB),
  32. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  33. 'optimizers_edit' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  34. ]);
  35. }
  36. $build = SitesStatus::query();
  37. $build = $this->inquire($request, $build);
  38. $cnTitleList = Site::query()->pluck('cn_title', 'id');
  39. $domainList = Site::query()->pluck('domain', 'id');
  40. $memoList = Site::query()->pluck('not_found_memo', 'id');
  41. $list = $build->with(['users'])
  42. ->where('status', 404)
  43. ->where('is_handle', 0)
  44. ->where('url', 'NOT LIKE', '%javascript:%')
  45. ->where('url', 'NOT LIKE', '%tel:%')
  46. ->where('url', 'NOT LIKE', '%mailto:%')
  47. ->where('url', 'NOT LIKE', '%$%')
  48. ->where('url', 'NOT LIKE', '%skype%')
  49. ->where('url', 'NOT LIKE', '%whatsapp%')
  50. ->selectRaw('count(*) as count,site_id')
  51. ->groupBy('site_id')
  52. ->paginate($request->input('pageSize') ?? 20);
  53. foreach ($list as $item) {
  54. $item->not_found = $memoList[$item->site_id] ?? '';
  55. $item->cn_title = $cnTitleList[$item->site_id] ?? '';
  56. $item->domain = $domainList[$item->site_id] ?? '';
  57. $item->web = $item->users->where('role_id', Role::TYPE_WEB)->first()->nickname ?? '';
  58. $item->optimization = $item->users->where('role_id', Role::TYPE_OPTIMIZER)->first()->nickname ?? '';
  59. $item->optimizationAe = $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->first()->nickname ?? '';
  60. }
  61. return response()->json([
  62. 'rows' => $list->items(),
  63. 'total' => $list->total()
  64. ]);
  65. }
  66. /**
  67. * 测速合集
  68. * @param Request $request
  69. * @return View\Factory|JsonResponse|\Illuminate\View\View
  70. */
  71. public function speedMeasurement(Request $request)
  72. {
  73. if (!$request->ajax()) {
  74. return view('admin/analyze/speed', [
  75. 'web' => Role::getUsers(Role::TYPE_WEB),
  76. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  77. 'optimizers_edit' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  78. ]);
  79. }
  80. $build = Site::query();
  81. $build = $this->inquire($request, $build, 'id');
  82. $siteList = $build->with(['users'])
  83. ->whereIn('status', [2, 3])
  84. ->select('id', 'old_id', 'domain', 'cn_title', 'speed_memo')
  85. ->whereNotNull('database')
  86. ->get();
  87. $pcSpeedMeasurement = [];
  88. $mobileSpeedMeasurement = [];
  89. $speedMeasurementList = DB::table('app_speed_measurement_cache')->get();
  90. foreach ($speedMeasurementList as $key => $value) {
  91. $array = json_decode($value->cache, true);
  92. $pcSpeedMeasurementResult = $array['pc'];
  93. $mobileSpeedMeasurementResult = $array['mobile'];
  94. $oldId = str_replace('cache:app/Http/Controllers/SpeedMeasurementController/index:', '', $value->key);
  95. $pcSpeedMeasurement[$oldId] = $pcSpeedMeasurementResult;
  96. $mobileSpeedMeasurement[$oldId] = $mobileSpeedMeasurementResult;
  97. }
  98. foreach ($siteList as $item) {
  99. $item->web = $item->users->where('role_id', Role::TYPE_WEB)->first()->nickname ?? '';
  100. $item->optimization = $item->users->where('role_id', Role::TYPE_OPTIMIZER)->first()->nickname ?? '';
  101. $item->optimizationAe = $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->first()->nickname ?? '';
  102. $item->pcSpeedMeasurement = $pcSpeedMeasurement[$item->old_id] ?? '';
  103. $item->mobileSpeedMeasurement = $mobileSpeedMeasurement[$item->old_id] ?? '';
  104. }
  105. foreach ($siteList as $key => $value) {
  106. if ($value->pcSpeedMeasurement > 79) {
  107. unset($siteList[$key]);
  108. }
  109. }
  110. $res = collect($siteList)->sortByDesc('pcSpeedMeasurement');
  111. $perPage = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
  112. $result = $this->paginateCollection($res, $perPage);
  113. return response()->json([
  114. 'rows' => $result->items(),
  115. 'total' => $result->total()
  116. ]);
  117. }
  118. /**
  119. * 查询
  120. * @param $request object
  121. * @param $build object
  122. * @param $siteFile string
  123. * @return mixed
  124. */
  125. private function inquire($request, $build, $siteFile = 'site_id')
  126. {
  127. $keyword = $request->input('keyword');
  128. if (!empty($keyword)) {
  129. $siteIds = Site::query()
  130. ->where('domain', 'like', '%' . $keyword . '%')
  131. ->orWhere('cn_title', 'like', '%' . $keyword . '%')
  132. ->pluck('id');
  133. $build->whereIn($siteFile, $siteIds);
  134. }
  135. $webId = $request->input('webId');
  136. if (!empty($webId)) {
  137. $userIds = User::query()->where('id', $webId)->pluck('id');
  138. $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
  139. $build->whereIn($siteFile, $siteIds);
  140. }
  141. $optimizerId = $request->input('optimizerId');
  142. if (!empty($optimizerId)) {
  143. $userIds = User::query()->where('id', $optimizerId)->pluck('id');
  144. $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
  145. $build->whereIn($siteFile, $siteIds);
  146. }
  147. $optimizersEditId = $request->input('optimizersEditId');
  148. if (!empty($optimizersEditId)) {
  149. $userIds = User::query()->where('id', $optimizersEditId)->pluck('id');
  150. $siteIds = DB::table('user_has_sites')->whereIn('user_id', $userIds)->pluck('site_id');
  151. $build->whereIn($siteFile, $siteIds);
  152. }
  153. return $build;
  154. }
  155. /**
  156. * 保存备注
  157. * @param Request $request
  158. * @return JsonResponse
  159. */
  160. public function saveMemo(Request $request)
  161. {
  162. $memo = $request->input('memo') ?? '';
  163. $type = $request->input('type') ?? 1;
  164. $siteId = $request->input('siteId');
  165. if (!empty($siteId)) {
  166. if ($type == 1) {
  167. Site::query()->where('id', $siteId)->update(['speed_memo' => $memo]);
  168. } elseif ($type == 2) {
  169. Site::query()->where('id', $siteId)->update(['not_found_memo' => $memo]);
  170. } else {
  171. Site::query()->where('id', $siteId)->update(['keyword_memo' => $memo]);
  172. }
  173. return response()->json(['message' => '操作成功']);
  174. }
  175. }
  176. /**
  177. * 关键词未拓展统计
  178. * @param Request $request
  179. * @return View\Factory|\Illuminate\View\View
  180. */
  181. public function keywordsExpand(Request $request)
  182. {
  183. if (!$request->ajax()) {
  184. return view('admin/analyze/keywords_expand', [
  185. 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
  186. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  187. 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
  188. 'optimizationEditingUser' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  189. ]);
  190. }
  191. $keyword = $request->input('keyword');
  192. $filterUserIds = [];
  193. $sellerId = $request->input('sellerId');
  194. $sellerId && $filterUserIds[] = $sellerId;
  195. $serverId = $request->input('serverId');
  196. $serverId && $filterUserIds[] = $serverId;
  197. $optimizerId = $request->input('optimizerId');
  198. $optimizerId && $filterUserIds[] = $optimizerId;
  199. $optimizationEditingUserId = $request->input('optimizationEditingUserId');
  200. $optimizationEditingUserId && $filterUserIds[] = $optimizationEditingUserId;
  201. $builder = Site::query()->with(['users']);
  202. if ($filterUserIds) {
  203. $builder->whereExists(function (\Illuminate\Database\Query\Builder $b) use ($filterUserIds) {
  204. $raw = sprintf('SUM(CASE WHEN user_id in (%s) then 1 ELSE 0 end) as total', implode(',', $filterUserIds));
  205. $b->select(DB::raw($raw))->from('user_has_sites')
  206. ->whereRaw(sprintf('user_has_sites.site_id=sites.id HAVING total=%s', count($filterUserIds)));
  207. });
  208. }
  209. $type = $request->input('type');
  210. //每个项目最新的一次的记录的id
  211. $maxIds = PrKeywordExtend::query()->selectRaw('max(id) as id_max,site_id')
  212. ->groupBy('site_id')
  213. ->pluck('id_max', 'site_id')->toArray();
  214. //全部拓展过
  215. $siteByKeyWordList = PrKeywordExtend::query()
  216. ->whereIn('id', $maxIds)
  217. ->pluck('ym', 'site_id')->toArray();
  218. $ids = array_keys($siteByKeyWordList);
  219. //3个月内没有拓展过
  220. if (empty($type)) {
  221. $list = PrKeywordExtend::query()->whereIn('id', $maxIds)->get();
  222. $ids = [];
  223. $date = date("Ym", strtotime("last day of -3 month", strtotime(date("Ym"))));
  224. foreach ($list as $value) {
  225. if ($value->ym <= $date) {
  226. $ids[] = $value->site_id;
  227. }
  228. }
  229. }
  230. //从未拓展过
  231. if ($type == 1) {
  232. $date = date("Y-m-d", strtotime("last day of -3 month", strtotime(date("Y-m-d"))));
  233. $id = Site::query()
  234. ->where('online_at', '<=', $date)
  235. ->whereIn('status', [2, 3])
  236. ->pluck('id')->toArray();
  237. $ids = [];
  238. foreach ($id as $value) {
  239. $result = PrKeywordExtend::query()->where('site_id', $value)->first();
  240. if (empty($result)) {
  241. $ids[] = $value;
  242. }
  243. }
  244. }
  245. $siteList = $builder
  246. ->select('id', 'old_id', 'cn_title', 'status', 'domain', 'expired_at', 'reach_at', 'keyword_goal', 'keyword_memo')
  247. ->whereIn('id', $ids)
  248. ->whereIn('status', [2, 3])
  249. ->where(function (Builder $builder) use ($keyword) {
  250. if ($keyword) {
  251. $builder->where('domain', 'like', '%' . $keyword . '%')
  252. ->orWhere('cn_title', 'like', '%' . $keyword . '%');
  253. }
  254. })->get();
  255. $oldIds = array_filter(array_column($siteList->toArray(), 'old_id'));
  256. $top10ListMap = DB::connection('rank')->table('project_keyword')
  257. ->whereIn('project_id', $oldIds)
  258. ->selectRaw('SUM(CASE WHEN google_rank <= 10 THEN 1 ELSE 0 END) as top10,project_id')
  259. ->groupBy('project_id')->get()->keyBy('project_id')->toArray();
  260. foreach ($siteList as $item) {
  261. $item->status = Site::STATUS_MAP[$item->status];
  262. $item->renewal_at = substr($item->renewal_at, 0, 10);
  263. $item->expired_at = substr($item->expired_at, 0, 10);
  264. $item->reach_at = substr($item->reach_at, 0, 10);
  265. $item->top10 = $item->old_id ? ($top10ListMap[$item->old_id]->top10 ?? '-') : '未关联'; //实际达标关键词
  266. $item->ym = $siteByKeyWordList[$item->id] ?? '';
  267. $item->optimizer = implode('-', $item->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('nickname')->toArray());
  268. $item->optimizerAe = implode('-', $item->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('nickname')->toArray());
  269. };
  270. $res = collect($siteList)->sortByDesc('ym');
  271. $perPage = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
  272. $result = $this->paginateCollection($res, $perPage);
  273. return response()->json([
  274. 'rows' => $result->items(),
  275. 'total' => $result->total()
  276. ]);
  277. }
  278. }